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