summaryrefslogtreecommitdiff
path: root/utils/acid/os-Nt.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/acid/os-Nt.c')
-rw-r--r--utils/acid/os-Nt.c198
1 files changed, 198 insertions, 0 deletions
diff --git a/utils/acid/os-Nt.c b/utils/acid/os-Nt.c
new file mode 100644
index 00000000..5966d718
--- /dev/null
+++ b/utils/acid/os-Nt.c
@@ -0,0 +1,198 @@
+/*
+ * Windows Nt
+ */
+
+#include <lib9.h>
+#include <bio.h>
+#include <ctype.h>
+#include "mach.h"
+#define Extern extern
+#include "acid.h"
+#include <signal.h>
+
+#include <windows.h>
+
+#define MAXBUFSIZ 16640 /* 2 STYX messages plus headers */
+#define NT_DEBUG
+int nt_debug = 0;
+
+int
+opentty(char *tty, int baud)
+{
+ HANDLE comport;
+ DCB dcb;
+ COMMTIMEOUTS timeouts;
+
+ comport = CreateFile(tty, GENERIC_READ|GENERIC_WRITE,
+ 0, 0, OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL, 0);
+ if (comport == INVALID_HANDLE_VALUE) {
+ werrstr("could not create port %s", tty);
+ return -1;
+ }
+
+ if (SetupComm(comport, MAXBUFSIZ, MAXBUFSIZ) != TRUE) {
+ werrstr("could not set up %s Comm port", tty);
+ CloseHandle(comport);
+ return -1;
+ }
+
+ if (GetCommState(comport, &dcb) != TRUE) {
+ werrstr("could not get %s comstate", tty);
+ CloseHandle(comport);
+ return -1;
+ }
+
+ if (baud == 0) {
+ dcb.BaudRate = 19200;
+ } else {
+ dcb.BaudRate = baud;
+ }
+ dcb.ByteSize = 8;
+ dcb.fParity = 0;
+ dcb.Parity = NOPARITY;
+ dcb.StopBits = ONESTOPBIT;
+ dcb.fInX = 0;
+ dcb.fOutX = 0;
+ dcb.fAbortOnError = 1;
+
+ if (SetCommState(comport, &dcb) != TRUE) {
+ werrstr("could not set %s comstate", tty);
+ CloseHandle(comport);
+ return -1;
+ }
+
+ timeouts.ReadIntervalTimeout = 2;
+ /* char time in milliseconds, at 19.2K char time is .4 ms */
+ timeouts.ReadTotalTimeoutMultiplier = 0; /* was 100; */
+ timeouts.ReadTotalTimeoutConstant = 200; /* was 500; */
+ timeouts.WriteTotalTimeoutMultiplier = 0; /* was 10; */
+ timeouts.WriteTotalTimeoutConstant = 400; /* was 20; */
+
+ SetCommTimeouts(comport, &timeouts);
+
+ EscapeCommFunction(comport, SETDTR);
+
+ return (int) comport;
+}
+
+int
+remote_read(int fd, char *buf, int bytes)
+{
+ DWORD numread = 0;
+ BOOL rtn;
+
+#ifdef NT_DEBUG
+ if (nt_debug) {
+ print("NT:rread fd %x bytes: %d", fd, bytes);
+ }
+#endif
+ rtn = ReadFile((HANDLE) fd, buf, bytes, &numread, 0);
+#ifdef NT_DEBUG
+ if (nt_debug) {
+ print(" numread: %d rtn: %x\n", numread, rtn);
+ if (numread) {
+ char *cp;
+ int i;
+
+ cp = (char *) buf;
+ for (i=0; i < numread; i++) {
+ print(" %2.2x", *cp++);
+ }
+ print("\n");
+ }
+ }
+#endif
+ if (!rtn)
+ return -1;
+ else
+ return numread;
+}
+
+int
+remote_write(int fd, char *buf, int bytes)
+{
+ DWORD numwrt = 0;
+ BOOL rtn;
+ char *cp;
+ int i;
+
+#ifdef NT_DEBUG
+ if (nt_debug) {
+ print("NT:rwrite fd %x bytes: %d", fd, bytes);
+ print("\n");
+ cp = (char *) buf;
+ for (i=0; i < bytes; i++) {
+ print(" %2.2x", *cp++);
+ }
+ print("\n");
+ }
+#endif
+ while (bytes > 0) {
+ rtn = WriteFile((HANDLE) fd, buf, bytes, &numwrt, 0);
+ if (!rtn) {
+ break;
+ }
+ buf += numwrt;
+ bytes -= numwrt;
+ }
+ return numwrt;
+}
+
+void
+detach(void)
+{
+ /* ??? */
+}
+
+char *
+waitfor(int pid)
+{
+ fprint(2, "wait unimplemented");
+ return 0;
+}
+
+int
+fork(void)
+{
+ fprint(2, "fork unimplemented");
+ return -1;
+}
+
+char *
+runcmd(char *cmd)
+{
+ fprint(2, "runcmd unimplemented");
+ return 0;
+}
+
+void (*notefunc)(int);
+
+os_notify(void (*func)(int))
+{
+ notefunc = func;
+ signal(SIGINT, func);
+ return 0;
+}
+
+void
+catcher(int sig)
+{
+ if (sig == SIGINT) {
+ gotint = 1;
+ signal(SIGINT, notefunc);
+ }
+}
+
+void
+setup_os_notify(void)
+{
+ os_notify(catcher);
+}
+
+int
+nproc(char **argv)
+{
+ fprint(2, "nproc not implemented\n");
+ return -1;
+}