xref: /plan9/sys/src/cmd/disk/kfscmd.c (revision 9a747e4fd48b9f4522c70c07e8f882a15030f964)
13e12c5d1SDavid du Colombier #include <u.h>
23e12c5d1SDavid du Colombier #include <libc.h>
33e12c5d1SDavid du Colombier 
4219b2ee8SDavid du Colombier void
main(int argc,char * argv[])5219b2ee8SDavid du Colombier main(int argc, char *argv[])
6219b2ee8SDavid du Colombier {
7219b2ee8SDavid du Colombier 	char *name, buf[4*1024];
83e12c5d1SDavid du Colombier 	int fd, n, i, errs;
93e12c5d1SDavid du Colombier 
103e12c5d1SDavid du Colombier 	name = 0;
113e12c5d1SDavid du Colombier 	ARGBEGIN{
123e12c5d1SDavid du Colombier 	case 'n':
133e12c5d1SDavid du Colombier 		name = ARGF();
143e12c5d1SDavid du Colombier 		break;
153e12c5d1SDavid du Colombier 	default:
163e12c5d1SDavid du Colombier 		fprint(2, "usage: kfscmd [-n server] commands\n");
173e12c5d1SDavid du Colombier 		exits("usage");
183e12c5d1SDavid du Colombier 	}ARGEND
193e12c5d1SDavid du Colombier 
203e12c5d1SDavid du Colombier 	if(name)
21*9a747e4fSDavid du Colombier 		snprint(buf, sizeof buf, "/srv/kfs.%s.cmd", name);
223e12c5d1SDavid du Colombier 	else
233e12c5d1SDavid du Colombier 		strcpy(buf, "/srv/kfs.cmd");
243e12c5d1SDavid du Colombier 	fd = open(buf, ORDWR);
25219b2ee8SDavid du Colombier 	if(fd < 0){
26219b2ee8SDavid du Colombier 		fprint(2, "kfscmd: can't open commands file\n");
27219b2ee8SDavid du Colombier 		exits("commands file");
28219b2ee8SDavid du Colombier 	}
29219b2ee8SDavid du Colombier 
303e12c5d1SDavid du Colombier 	errs = 0;
313e12c5d1SDavid du Colombier 	for(i = 0; i < argc; i++){
323e12c5d1SDavid du Colombier 		if(write(fd, argv[i], strlen(argv[i])) != strlen(argv[i])){
333e12c5d1SDavid du Colombier 			fprint(2, "%s: error writing %s: %r", argv0, argv[i]);
343e12c5d1SDavid du Colombier 			errs++;
353e12c5d1SDavid du Colombier 			continue;
363e12c5d1SDavid du Colombier 		}
373e12c5d1SDavid du Colombier 		for(;;){
383e12c5d1SDavid du Colombier 			n = read(fd, buf, sizeof buf - 1);
393e12c5d1SDavid du Colombier 			if(n < 0){
403e12c5d1SDavid du Colombier 				fprint(2, "%s: error executing %s: %r", argv0, argv[i]);
413e12c5d1SDavid du Colombier 				errs++;
423e12c5d1SDavid du Colombier 				break;
433e12c5d1SDavid du Colombier 			}
443e12c5d1SDavid du Colombier 			buf[n] = '\0';
453e12c5d1SDavid du Colombier 			if(strcmp(buf, "done") == 0 || strcmp(buf, "success") == 0)
463e12c5d1SDavid du Colombier 				break;
473e12c5d1SDavid du Colombier 			if(strcmp(buf, "unknown command") == 0){
483e12c5d1SDavid du Colombier 				errs++;
493e12c5d1SDavid du Colombier 				print("kfscmd: command %s not recognized\n", argv[i]);
503e12c5d1SDavid du Colombier 				break;
513e12c5d1SDavid du Colombier 			}
523e12c5d1SDavid du Colombier 			write(1, buf, n);
533e12c5d1SDavid du Colombier 		}
543e12c5d1SDavid du Colombier 	}
553e12c5d1SDavid du Colombier 	exits(errs ? "errors" : 0);
563e12c5d1SDavid du Colombier }
57