# /* Unix command for system running under Ersatz-11 PDP-11 simulator to * set the console switch register on the simulator; works with DOS * device device driver. * * The -d flag prints debugging info. */ /* DOS device information */ #include "/usr/sys/dos.h" struct hsterrs { int ds_errno; char *ds_errstr; }; int *herrtbl[] { RC_NXM, "Bus timeout", RC_NOT, "File or directory does not exist", RC_INVH, "Invalid handle", RC_INSM, "Insufficient memory", RC_PERM, "Permission denied", RC_FEX, "File exists", RC_CROSS, "Cross-device link", RC_INV, "Invalid command or argument", RC_TOO, "Too many open files", RC_NOSPC, "No space left on device", RC_RDEAD, "Resource deadlock would occur", 0, 0 }; struct sargs { char op; char mode; char *nm; int len; } sargs; #define DOSMAXFL 256 /* Maximum file name length */ /* Unix stuff */ extern int errno; extern char *sys_errlist[]; /* Command */ #define SSLEN 11 /* sizeof ("set switch ") */ int dosdev; char ssbuf[DOSMAXFL] "set switch "; int dflg; /* Debugging */ /* */ main(argc, argv) char **argv; { register char *ifp, *ofp; register int i; char *arg, *octval; int vlen, sval; if (argc < 2) { printf("setcsw {-d} \n"); exit(1); } argv++; for (argc--; (argc > 0); argc--) { arg = *argv; if (*arg++ != '-') break; argv++; switch (*arg) { case 'd': dflg++; break; default: printf("Bad flag: %c", *arg); exit(1); } } dosdev = open("/dev/dos", 0); if (dosdev < 0) serror("Cannot open DOS device"); if (dflg) printf("dosdev file %d\n", dosdev); octval = *argv++; vlen = strlen(octval); ifp = octval; ofp = &ssbuf[SSLEN]; for (i = 0; (i <= vlen); i++) *ofp++ = *ifp++; sargs.op = DC_HOST; sargs.nm = &ssbuf[0]; sargs.len = (vlen + SSLEN); if (dflg) printf("'%s' %d\n", sargs.nm, sargs.len); sval = stty(dosdev, &sargs); if (sval < 0) hsterr("Can't set switch register on emulator"); close(dosdev); exit(0); } hsterr(errstr) char *errstr; { register struct hsterrs *dp; int gval, hstrc; printf("%s\n", errstr); gval = gtty(dosdev, &sargs); if (gval < 0) serror("Can't retrieve host error code"); hstrc = sargs.op; for (dp = &herrtbl[0]; (dp->ds_errno != 0); dp++) if (dp->ds_errno == hstrc) break; if (dp->ds_errno == 0) printf("Unknown host error %d\n", hstrc); else printf("Host error: %s\n", dp->ds_errstr); serror("Unix error"); } serror(errstr) char *errstr; { char *s; if (errstr != 0) printf("%s: ", errstr); s = sys_errlist[errno]; printf("%s\n", s); exit(1); }