xref: /plan9-contrib/sys/src/ape/lib/ap/plan9/9iounit.c (revision ec59a3ddbfceee0efe34584c2c9981a5e5ff1ec4)
1 #include "lib.h"
2 #include <string.h>
3 #include <stdlib.h>
4 #include <fmt.h>
5 #include "sys9.h"
6 #include "dir.h"
7 
8 /*
9  * Format:
10   3 r  M    4 (0000000000457def 11 00)   8192      512 /rc/lib/rcmain
11  */
12 
13 static int
14 getfields(char *str, char **args, int max, int mflag)
15 {
16 	char r;
17 	int nr, intok, narg;
18 
19 	if(max <= 0)
20 		return 0;
21 
22 	narg = 0;
23 	args[narg] = str;
24 	if(!mflag)
25 		narg++;
26 	intok = 0;
27 	for(;;) {
28 		r = *str++;
29 		if(r == 0)
30 			break;
31 		if(r == ' ' || r == '\t'){
32 			if(narg >= max)
33 				break;
34 			*str = 0;
35 			intok = 0;
36 			args[narg] = str + nr;
37 			if(!mflag)
38 				narg++;
39 		} else {
40 			if(!intok && mflag)
41 				narg++;
42 			intok = 1;
43 		}
44 	}
45 	return narg;
46 }
47 int
48 _IOUNIT(int fd)
49 {
50 	int i, cfd;
51 	char buf[128], *args[10];
52 
53 	snprint(buf, sizeof buf, "#d/%dctl", fd);
54 	cfd = _OPEN(buf, OREAD);
55 	if(cfd < 0)
56 		return 0;
57 	i = _READ(cfd, buf, sizeof buf-1);
58 	_CLOSE(cfd);
59 	if(i <= 0)
60 		return 0;
61 	buf[i] = '\0';
62 	if(getfields(buf, args, 10, 1) != 10)
63 		return 0;
64 	return atoi(args[7]);
65 }
66