rminnichmerge57758a716 years agoHistory
138 lines · 3.1 KB · C
RawDownload
 /* 8c pxcpu.c &&8l -o pxcpu pxcpu.8 &&cp pxcpu $home/bin/386 &&mount -nc /srv/csrv /n/csrv && xsdo   &&9fs tcp!10.12.0.72!5670 && xcdo  ./pxcpu */#include <u.h>#include <libc.h>#include <bio.h> void reader(void*); voidusage(char *me){	fprint(2, "%s: usage\n", me);	exits("usage");}char *mnt;char *childmnt;char sess[64]; voidmain(int argc, char **argv){	char *prog;	Biobuf *in,*out, *stdout;;	int pid;	int n, i, nres;	int cfd, *resfdctl, nfdctl, fd;	char fdfile[512];	char buf[8192];	int qidpath;	char *s, *line;	char *a[4], *b[2];	 	mnt = "/n/csrv/local";	childmnt = "";	ARGBEGIN{	}ARGEND	if(argc != 0)		usage(argv[0]); 	snprint(fdfile, 512, "%s/clone", mnt);	cfd = open(fdfile, ORDWR);	n = read(cfd, sess, 64);	if(n < 0)		sysfatal("couldn't read ctl: %r");	sess[n]=0;	/* sess stores session ID */	in = Bopen("/fd/0", OREAD);	if(in == nil)		sysfatal("couldn't open stdin: %r");		/* Read first line */	line = Brdstr(in, '\n', '\n');	if(line == nil)		sysfatal("eof");	n = tokenize(line, a, 4);	if(n != 2)		sysfatal("two fields in a res");	/* assumed to be res */	if(strcmp("res", a[0]) != 0)		sysfatal("need to res in the beginning");	fprint(cfd, "%s %s", a[0], a[1]);	nres = atoi(a[1]);	if(nres <= 0)		sysfatal("need >0 res");		/* opening ctl files of all childeren */	resfdctl = malloc(nres*sizeof(int));	for(i = 0; i < nres; i++){		snprint(fdfile, 512, "%s/%s/%d/ctl", mnt, sess, i); /*		snprint(fdfile, 512, "%s//%d/ctl", mnt,  i); */		resfdctl[i]=open(fdfile, ORDWR);		if(resfdctl[i] < 0)			sysfatal("couldn't open part of res: %s %s %d %r", mnt, sess, i);	} 	/* read remaining lines */	while((line = Brdstr(in, '\n', '\n')) != nil){		n = getfields(line, a, 4, 1, "\t\r\n ");			/* if splice */		if(strcmp("splice", a[0]) == 0){			/* splice sources_subsesssion_id destination_subsession_id */			if(n != 3)				sysfatal("splice has 2 args");			i = atoi(a[2]);			if(i < 0 || nres <= i)				sysfatal("bad splice out res");			fprint(resfdctl[i], "splice /csrv/local/%s/%s/stdio", sess, a[1]);		}else if(strcmp("exec", a[0]) == 0){			if(n < 3)				sysfatal("exec needs >3 args");			i = atoi(a[1]);			if(i < 0 || nres <= i)				sysfatal("bad splice out res");			if(strcmp("filt", a[1]) == 0){				/* exec filt cmd dest_subsession args ===> exec xirf/self session_id  */ 				i = atoi(a[3]);				fprint(resfdctl[i], "exec %s %s %s", a[2], sess, a[3]);			}else if(n == 4)				fprint(resfdctl[i], "exec %s %s", a[2], a[3]);			else				fprint(resfdctl[i], "exec %s", a[2]);		}else if(strcmp("end", a[0]) == 0){			if(n != 2)				sysfatal("end needs 1 arg");			snprint(fdfile, 512, "%s/%s/%s/stdio", mnt, sess, a[1]);			print("reading from %s\n", fdfile);			fd = open(fdfile, OREAD);			if(fd < 0)				sysfatal("couldn't open: %s %r", fdfile);		}else			sysfatal("invalid command string");	}	stdout = Bopen("/fd/1", OWRITE);	if(stdout == nil)		sysfatal("couldn't open stdout");	print("reading\n");	while((n = read(fd, buf, 8192)) > 0){		print("read n %d %.*s\n", n, n, buf);		write(1, buf, n);		Bflush(stdout);	}	Bterm(in);	exits(0);}