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