/* * S_SHELL.C * * DNET (c)Copyright 1988, Matthew Dillon, All Rights Reserved. * * SHELL SERVER. THIS REQUIRES MY PIPE DEVICE TO WORK!!!!!!!!!! * * Use DSOC on the UNIX end (DSOC 8193) * * Only one connection accepted at a time in this baby. * HUGE CLUDGE!!! */ #include #include int Enable_Abort; char Buf[4096]; typedef struct Process PROC; extern struct MsgPort *DListen(); extern PROC *FindTask(); _main() { struct MsgPort *port; PROC *proc = FindTask(NULL); long chan; long mask, rmask; long len, n; char nl, co; int fd; long namei = (long)proc; APTR oldwptr; Enable_Abort = 0; port = DListen(8196); WaitPort(&proc->pr_MsgPort); ReplyMsg(GetMsg(&proc->pr_MsgPort)); if (!port) exit(1); mask = SIGBREAKF_CTRL_C|(1 << port->mp_SigBit); oldwptr = proc->pr_WindowPtr; proc->pr_WindowPtr = (APTR)-1; for (;;) { rmask = Wait(mask); if (rmask & SIGBREAKF_CTRL_C) break; if (chan = DAccept(port)) { long fh; long mask; long fhmask, smask; short sig; char pname[16]; char buf[64]; sprintf(pname, "%08lx", namei++); sprintf(buf, "newcli nil: pipe:%s/t", pname); Execute(buf, NULL, NULL); sig = AllocSignal(-1); fhmask = 1 << sig; smask = 1 << ((struct MsgPort *)chan)->mp_SigBit; sprintf(buf, "pipe:%s/tns%ld", pname, sig); fh = Open(buf, 1006); if (fh) { char notdone = 1; DWrite(chan, "Amiga CLI running\n", 20); while (notdone) { char buf[256]; int n; mask = Wait(fhmask | smask | SIGBREAKF_CTRL_C); while ((n = Read(fh, buf, 256)) > 0) { DWrite(chan, buf, n); } if (n < 0) notdone = 0; while ((n = DNRead(chan, buf, 256)) > 0) { DWrite(chan, buf, n); Write(fh, buf, n); } if (n < 0) notdone = 0; } Write(fh, "ENDCLI\n", 7); Write(fh, "ENDCLI\n", 7); Close(fh); } DClose(chan); FreeSignal(sig); puts("DONE"); } } proc->pr_WindowPtr = oldwptr; DUnListen(port); }