xref: /plan9/sys/src/cmd/disk/kfscmd.c (revision 219b2ee8daee37f4aad58d63f21287faa8e4ffdc)
1 #include <u.h>
2 #include <libc.h>
3 
4 void
5 main(int argc, char *argv[])
6 {
7 	char *name, buf[4*1024];
8 	int fd, n, i, errs;
9 
10 	name = 0;
11 	ARGBEGIN{
12 	case 'n':
13 		name = ARGF();
14 		if(strlen(name) >= NAMELEN){
15 			fprint(2, "kfscmd: server name too long\n");
16 			exits("bad server");
17 		}
18 		break;
19 	default:
20 		fprint(2, "usage: kfscmd [-n server] commands\n");
21 		exits("usage");
22 	}ARGEND
23 
24 	if(name)
25 		sprint(buf, "/srv/kfs.%s.cmd", name);
26 	else
27 		strcpy(buf, "/srv/kfs.cmd");
28 	fd = open(buf, ORDWR);
29 	if(fd < 0){
30 		fprint(2, "kfscmd: can't open commands file\n");
31 		exits("commands file");
32 	}
33 
34 	errs = 0;
35 	for(i = 0; i < argc; i++){
36 		if(write(fd, argv[i], strlen(argv[i])) != strlen(argv[i])){
37 			fprint(2, "%s: error writing %s: %r", argv0, argv[i]);
38 			errs++;
39 			continue;
40 		}
41 		for(;;){
42 			n = read(fd, buf, sizeof buf - 1);
43 			if(n < 0){
44 				fprint(2, "%s: error executing %s: %r", argv0, argv[i]);
45 				errs++;
46 				break;
47 			}
48 			buf[n] = '\0';
49 			if(strcmp(buf, "done") == 0 || strcmp(buf, "success") == 0)
50 				break;
51 			if(strcmp(buf, "unknown command") == 0){
52 				errs++;
53 				print("kfscmd: command %s not recognized\n", argv[i]);
54 				break;
55 			}
56 			write(1, buf, n);
57 		}
58 	}
59 	exits(errs ? "errors" : 0);
60 }
61