#include #include #include #include "dat.h" #include "fns.h" /* Provide access to pipe(3) files for persistent buffered multiplexed i/o */ /* Can be used to provide similar functionality to gnu screen for persistent rc sessions */ /* The 'io' wrapper script is usually used rather than calling iosrv directly */ void main(int argc, char *argv[]) { if(argc < 2){ print("USAGE: iosrv [-dhprsv] [-t sleeptime] srvname\n"); exits(nil); } char tmpstr[SMBUF]; char noram; char nosrv; ulong mode; mode = 0777L; sleepdefault = 10; noram = 'n'; nosrv = 'n'; nohold = 'n'; verbosity = DOWN; paranoia = DOWN; masterswitch = GO; for(int i = 0; i < HUBNUM; i++){ hubmon[i] = STOP; } memset(extrafds, 0, (2048 * sizeof(int))); fdcounter = 0; print("Starting iosrv-"); ARGBEGIN { case 'h': nohold = 'y'; break; case 'p': paranoia = UP; break; case 'r': noram = 'y'; break; case 's': nosrv = 'y'; break; case 't': sprint(tmpstr, ARGF()); if(isdigit(*tmpstr)){ sleepdefault = atoi(ARGF()); } else { print("-t needs numeric parameter to set default sleeptime in milliseconds\n"); } break; case 'v': verbosity = UP; break; default: print(" badflag('%c')", ARGC()); } ARGEND /* create a /srv of a ramfs that we will use to provide pipe (3) files to clients for input and output */ /* we always make one file descriptor for control input on fdctl */ srvname = *argv; snprint(dirname, SMBUF, "/tmp/%s", srvname); if(create(dirname, OREAD, DMDIR | mode) <0){ sysfatal("couldnt create tmp dir %s\n", dirname); } if(noram != 'y'){ if((rfork(RFPROC|RFMEM|RFNOWAIT|RFNOTEG)) == 0){ print("-using ramfs for temp files-"); execl("/bin/ramfs", "ramfs", "-m", dirname, nil); } sleep(500); } sprint(tmpstr, "%s/ctl", dirname); fdctl = mkrdfd(tmpstr); sprint(tmpstr, "%s/ctl/data", dirname); extrafds[fdcounter++] = open(tmpstr, OWRITE); if(nosrv != 'y'){ print("-starting srvfs at /srv/%s-", srvname); if((rfork(RFPROC|RFMEM|RFNOWAIT|RFNOTEG)) == 0){ execl("/bin/srvfs", "srvfs", srvname, dirname, 0); } sleep(500); } /* The ctlsrv listens on a separate file descriptor for control messages */ /* It parses them, and dispatches them to the Hubs and/or creates additional procs as needed */ if(rfork(RFPROC|RFMEM|RFNOWAIT|RFNOTEG) == 0){ ctlsrv(fdctl); exits(nil); } /* We exit but backgrounded processes will be printing output on /fd/1 by default */ /* the wrapper scripts will generally either redirect this elsewhere or attach to the ctl fd */ print("\nrforked everything, main exiting.\n"); exits(nil); }