xref: /plan9-contrib/sys/src/ape/lib/ap/plan9/9iounit.c (revision 781103c4074deb8af160e8a0da2742ba6b29dc2b)
1711d1557SDavid du Colombier #include "lib.h"
2711d1557SDavid du Colombier #include <string.h>
3711d1557SDavid du Colombier #include <stdlib.h>
4711d1557SDavid du Colombier #include <fmt.h>
5711d1557SDavid du Colombier #include "sys9.h"
6711d1557SDavid du Colombier #include "dir.h"
7711d1557SDavid du Colombier 
8711d1557SDavid du Colombier /*
9711d1557SDavid du Colombier  * Format:
10711d1557SDavid du Colombier   3 r  M    4 (0000000000457def 11 00)   8192      512 /rc/lib/rcmain
11711d1557SDavid du Colombier  */
12711d1557SDavid du Colombier 
13711d1557SDavid du Colombier static int
getfields(char * str,char ** args,int max,int mflag)14711d1557SDavid du Colombier getfields(char *str, char **args, int max, int mflag)
15711d1557SDavid du Colombier {
16711d1557SDavid du Colombier 	char r;
17711d1557SDavid du Colombier 	int nr, intok, narg;
18711d1557SDavid du Colombier 
19711d1557SDavid du Colombier 	if(max <= 0)
20711d1557SDavid du Colombier 		return 0;
21711d1557SDavid du Colombier 
22711d1557SDavid du Colombier 	narg = 0;
23711d1557SDavid du Colombier 	args[narg] = str;
24711d1557SDavid du Colombier 	if(!mflag)
25711d1557SDavid du Colombier 		narg++;
26711d1557SDavid du Colombier 	intok = 0;
27711d1557SDavid du Colombier 	for(;;) {
28*781103c4SDavid du Colombier 		nr = 1;			/* utf bytes in this rune */
29711d1557SDavid du Colombier 		r = *str++;
30711d1557SDavid du Colombier 		if(r == 0)
31711d1557SDavid du Colombier 			break;
32711d1557SDavid du Colombier 		if(r == ' ' || r == '\t'){
33711d1557SDavid du Colombier 			if(narg >= max)
34711d1557SDavid du Colombier 				break;
35711d1557SDavid du Colombier 			*str = 0;
36711d1557SDavid du Colombier 			intok = 0;
37711d1557SDavid du Colombier 			args[narg] = str + nr;
38711d1557SDavid du Colombier 			if(!mflag)
39711d1557SDavid du Colombier 				narg++;
40711d1557SDavid du Colombier 		} else {
41711d1557SDavid du Colombier 			if(!intok && mflag)
42711d1557SDavid du Colombier 				narg++;
43711d1557SDavid du Colombier 			intok = 1;
44711d1557SDavid du Colombier 		}
45711d1557SDavid du Colombier 	}
46711d1557SDavid du Colombier 	return narg;
47711d1557SDavid du Colombier }
48711d1557SDavid du Colombier int
_IOUNIT(int fd)49711d1557SDavid du Colombier _IOUNIT(int fd)
50711d1557SDavid du Colombier {
51711d1557SDavid du Colombier 	int i, cfd;
52711d1557SDavid du Colombier 	char buf[128], *args[10];
53711d1557SDavid du Colombier 
54711d1557SDavid du Colombier 	snprint(buf, sizeof buf, "#d/%dctl", fd);
55711d1557SDavid du Colombier 	cfd = _OPEN(buf, OREAD);
56711d1557SDavid du Colombier 	if(cfd < 0)
57711d1557SDavid du Colombier 		return 0;
58711d1557SDavid du Colombier 	i = _READ(cfd, buf, sizeof buf-1);
59711d1557SDavid du Colombier 	_CLOSE(cfd);
60711d1557SDavid du Colombier 	if(i <= 0)
61711d1557SDavid du Colombier 		return 0;
62711d1557SDavid du Colombier 	buf[i] = '\0';
63711d1557SDavid du Colombier 	if(getfields(buf, args, 10, 1) != 10)
64711d1557SDavid du Colombier 		return 0;
65711d1557SDavid du Colombier 	return atoi(args[7]);
66711d1557SDavid du Colombier }
67