]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libc/9sys/dirread.c
audiohda: fix syntax error
[plan9front.git] / sys / src / libc / 9sys / dirread.c
1 #include <u.h>
2 #include <libc.h>
3 #include <fcall.h>
4
5 static
6 long
7 dirpackage(uchar *buf, long ts, Dir **d)
8 {
9         char *s;
10         long i, n, nn, m;
11
12         /*
13          * first find number of all stats, check they look like stats, & size all associated strings
14          */
15         n = 0;
16         for(i = 0; i < ts; i += m){
17                 if(i+BIT16SZ >= ts)
18                         return -1;
19                 m = BIT16SZ + GBIT16(&buf[i]);
20                 if(i+m > ts || statcheck(&buf[i], m) < 0)
21                         return -1;
22                 n++;
23         }
24
25         *d = malloc(n * sizeof(Dir) + ts);
26         if(*d == nil)
27                 return -1;
28
29         /*
30          * then convert all buffers
31          */
32         s = (char*)*d + n * sizeof(Dir);
33         nn = 0;
34         for(i = 0; i < ts; i += m){
35                 m = BIT16SZ + GBIT16(&buf[i]);
36                 if(i+m > ts || nn >= n || convM2D(&buf[i], m, *d + nn, s) != m){
37                         free(*d);
38                         *d = nil;
39                         return -1;
40                 }
41                 nn++;
42                 s += m;
43         }
44
45         return nn;
46 }
47
48 long
49 dirread(int fd, Dir **d)
50 {
51         uchar *buf;
52         long ts;
53
54         *d = nil;
55         buf = malloc(DIRMAX);
56         if(buf == nil)
57                 return -1;
58         ts = read(fd, buf, DIRMAX);
59         if(ts > 0)
60                 ts = dirpackage(buf, ts, d);
61         free(buf);
62         return ts;
63 }
64
65 long
66 dirreadall(int fd, Dir **d)
67 {
68         uchar *buf, *nbuf;
69         long n, ts;
70
71         *d = nil;
72         buf = nil;
73         ts = 0;
74         for(;;){
75                 nbuf = realloc(buf, ts+DIRMAX);
76                 if(nbuf == nil){
77                         free(buf);
78                         return -1;
79                 }
80                 buf = nbuf;
81                 n = read(fd, buf+ts, DIRMAX);
82                 if(n <= 0)
83                         break;
84                 ts += n;
85         }
86         if(ts > 0)
87                 ts = dirpackage(buf, ts, d);
88         free(buf);
89         if(ts == 0 && n < 0)
90                 return -1;
91         return ts;
92 }