Introduction
Introduction Statistics Contact Development Disclaimer Help
convD2M.c - 9base - revived minimalist port of Plan 9 userland to Unix
git clone git://git.suckless.org/9base
Log
Files
Refs
README
LICENSE
---
convD2M.c (1927B)
---
1 #include <u.h>
2 #include <libc.h>
3 #include <fcall.h>
4
5 uint
6 sizeD2Mu(Dir *d, int dotu)
7 {
8 char *sv[5];
9 int i, ns, nstr, fixlen;
10
11 sv[0] = d->name;
12 sv[1] = d->uid;
13 sv[2] = d->gid;
14 sv[3] = d->muid;
15
16 fixlen = STATFIXLEN;
17 nstr = 4;
18 if(dotu){
19 fixlen = STATFIXLENU;
20 sv[4] = d->ext;
21 nstr = 5;
22 }
23
24 ns = 0;
25 for(i = 0; i < nstr; i++)
26 if(sv[i])
27 ns += strlen(sv[i]);
28
29 return fixlen + ns;
30 }
31
32 uint
33 sizeD2M(Dir *d)
34 {
35 return sizeD2Mu(d, 0);
36 }
37
38 uint
39 convD2Mu(Dir *d, uchar *buf, uint nbuf, int dotu)
40 {
41 uchar *p, *ebuf;
42 char *sv[5];
43 int i, ns, nsv[5], ss, nstr, fixlen;
44
45 if(nbuf < BIT16SZ)
46 return 0;
47
48 p = buf;
49 ebuf = buf + nbuf;
50
51 sv[0] = d->name;
52 sv[1] = d->uid;
53 sv[2] = d->gid;
54 sv[3] = d->muid;
55
56 fixlen = STATFIXLEN;
57 nstr = 4;
58 if(dotu){
59 fixlen = STATFIXLENU;
60 sv[4] = d->ext;
61 nstr = 5;
62 }
63
64 ns = 0;
65 for(i = 0; i < nstr; i++){
66 if(sv[i])
67 nsv[i] = strlen(sv[i]);
68 else
69 nsv[i] = 0;
70 ns += nsv[i];
71 }
72
73 ss = fixlen + ns;
74
75 /* set size befor erroring, so user can know how much is needed …
76 /* note that length excludes count field itself */
77 PBIT16(p, ss-BIT16SZ);
78 p += BIT16SZ;
79
80 if(ss > nbuf)
81 return BIT16SZ;
82
83 PBIT16(p, d->type);
84 p += BIT16SZ;
85 PBIT32(p, d->dev);
86 p += BIT32SZ;
87 PBIT8(p, d->qid.type);
88 p += BIT8SZ;
89 PBIT32(p, d->qid.vers);
90 p += BIT32SZ;
91 PBIT64(p, d->qid.path);
92 p += BIT64SZ;
93 PBIT32(p, d->mode);
94 p += BIT32SZ;
95 PBIT32(p, d->atime);
96 p += BIT32SZ;
97 PBIT32(p, d->mtime);
98 p += BIT32SZ;
99 PBIT64(p, d->length);
100 p += BIT64SZ;
101
102 for(i = 0; i < nstr; i++){
103 ns = nsv[i];
104 if(p + ns + BIT16SZ > ebuf)
105 return 0;
106 PBIT16(p, ns);
107 p += BIT16SZ;
108 if(ns)
109 memmove(p, sv[i], ns);
110 p += ns;
111 }
112
113 if(dotu){
114 PBIT32(p, d->uidnum);
115 p += BIT32SZ;
116 PBIT32(p, d->gidnum);
117 p += BIT32SZ;
118 PBIT32(p, d->muidnum);
119 p += BIT32SZ;
120 }
121
122 if(ss != p - buf)
123 return 0;
124
125 return p - buf;
126 }
127
128 uint
129 convD2M(Dir *d, uchar *buf, uint nbuf)
130 {
131 return convD2Mu(d, buf, nbuf, 0);
132 }
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.