Blame


1 551445b9 2004-04-21 devnull #include <u.h>
2 551445b9 2004-04-21 devnull #include <libc.h>
3 551445b9 2004-04-21 devnull #include <thread.h>
4 551445b9 2004-04-21 devnull #include <sunrpc.h>
5 551445b9 2004-04-21 devnull
6 551445b9 2004-04-21 devnull /*
7 551445b9 2004-04-21 devnull * RPC protocol constants
8 551445b9 2004-04-21 devnull */
9 551445b9 2004-04-21 devnull enum
10 551445b9 2004-04-21 devnull {
11 551445b9 2004-04-21 devnull RpcVersion = 2,
12 551445b9 2004-04-21 devnull
13 551445b9 2004-04-21 devnull /* msg type */
14 551445b9 2004-04-21 devnull MsgCall = 0,
15 551445b9 2004-04-21 devnull MsgReply = 1,
16 551445b9 2004-04-21 devnull
17 551445b9 2004-04-21 devnull /* reply stat */
18 551445b9 2004-04-21 devnull MsgAccepted = 0,
19 551445b9 2004-04-21 devnull MsgDenied = 1,
20 551445b9 2004-04-21 devnull
21 551445b9 2004-04-21 devnull /* accept stat */
22 551445b9 2004-04-21 devnull MsgSuccess = 0,
23 551445b9 2004-04-21 devnull MsgProgUnavail = 1,
24 551445b9 2004-04-21 devnull MsgProgMismatch = 2,
25 551445b9 2004-04-21 devnull MsgProcUnavail = 3,
26 551445b9 2004-04-21 devnull MsgGarbageArgs = 4,
27 551445b9 2004-04-21 devnull MsgSystemErr = 5,
28 551445b9 2004-04-21 devnull
29 551445b9 2004-04-21 devnull /* reject stat */
30 551445b9 2004-04-21 devnull MsgRpcMismatch = 0,
31 551445b9 2004-04-21 devnull MsgAuthError = 1,
32 551445b9 2004-04-21 devnull
33 551445b9 2004-04-21 devnull /* msg auth xxx */
34 551445b9 2004-04-21 devnull MsgAuthOk = 0,
35 551445b9 2004-04-21 devnull MsgAuthBadCred = 1,
36 551445b9 2004-04-21 devnull MsgAuthRejectedCred = 2,
37 551445b9 2004-04-21 devnull MsgAuthBadVerf = 3,
38 551445b9 2004-04-21 devnull MsgAuthRejectedVerf = 4,
39 551445b9 2004-04-21 devnull MsgAuthTooWeak = 5,
40 551445b9 2004-04-21 devnull MsgAuthInvalidResp = 6,
41 cbeb0b26 2006-04-01 devnull MsgAuthFailed = 7
42 551445b9 2004-04-21 devnull };
43 551445b9 2004-04-21 devnull
44 551445b9 2004-04-21 devnull SunStatus
45 551445b9 2004-04-21 devnull sunrpcpack(uchar *a, uchar *ea, uchar **pa, SunRpc *rpc)
46 551445b9 2004-04-21 devnull {
47 551445b9 2004-04-21 devnull u32int x;
48 551445b9 2004-04-21 devnull
49 551445b9 2004-04-21 devnull if(sunuint32pack(a, ea, &a, &rpc->xid) < 0)
50 551445b9 2004-04-21 devnull goto Err;
51 551445b9 2004-04-21 devnull if(rpc->iscall){
52 551445b9 2004-04-21 devnull if(sunuint32pack(a, ea, &a, (x=MsgCall, &x)) < 0
53 551445b9 2004-04-21 devnull || sunuint32pack(a, ea, &a, (x=RpcVersion, &x)) < 0
54 551445b9 2004-04-21 devnull || sunuint32pack(a, ea, &a, &rpc->prog) < 0
55 551445b9 2004-04-21 devnull || sunuint32pack(a, ea, &a, &rpc->vers) < 0
56 551445b9 2004-04-21 devnull || sunuint32pack(a, ea, &a, &rpc->proc) < 0
57 551445b9 2004-04-21 devnull || sunauthinfopack(a, ea, &a, &rpc->cred) < 0
58 551445b9 2004-04-21 devnull || sunauthinfopack(a, ea, &a, &rpc->verf) < 0
59 551445b9 2004-04-21 devnull || sunfixedopaquepack(a, ea, &a, rpc->data, rpc->ndata) < 0)
60 551445b9 2004-04-21 devnull goto Err;
61 551445b9 2004-04-21 devnull }else{
62 551445b9 2004-04-21 devnull if(sunuint32pack(a, ea, &a, (x=MsgReply, &x)) < 0)
63 551445b9 2004-04-21 devnull goto Err;
64 551445b9 2004-04-21 devnull switch(rpc->status&0xF0000){
65 551445b9 2004-04-21 devnull case 0:
66 551445b9 2004-04-21 devnull case SunAcceptError:
67 551445b9 2004-04-21 devnull if(sunuint32pack(a, ea, &a, (x=MsgAccepted, &x)) < 0
68 551445b9 2004-04-21 devnull || sunauthinfopack(a, ea, &a, &rpc->verf) < 0)
69 551445b9 2004-04-21 devnull goto Err;
70 551445b9 2004-04-21 devnull break;
71 4c06b8ee 2005-05-19 devnull case SunAuthError:
72 4c06b8ee 2005-05-19 devnull if(sunuint32pack(a, ea, &a, (x=MsgDenied, &x)) < 0
73 4c06b8ee 2005-05-19 devnull || sunuint32pack(a, ea, &a, (x=MsgAuthError, &x)) < 0)
74 4c06b8ee 2005-05-19 devnull goto Err;
75 4c06b8ee 2005-05-19 devnull break;
76 551445b9 2004-04-21 devnull default:
77 551445b9 2004-04-21 devnull if(sunuint32pack(a, ea, &a, (x=MsgDenied, &x)) < 0)
78 551445b9 2004-04-21 devnull goto Err;
79 551445b9 2004-04-21 devnull break;
80 551445b9 2004-04-21 devnull }
81 fa325e9b 2020-01-10 cross
82 551445b9 2004-04-21 devnull switch(rpc->status){
83 551445b9 2004-04-21 devnull case SunSuccess:
84 551445b9 2004-04-21 devnull if(sunuint32pack(a, ea, &a, (x=MsgSuccess, &x)) < 0
85 551445b9 2004-04-21 devnull || sunfixedopaquepack(a, ea, &a, rpc->data, rpc->ndata) < 0)
86 551445b9 2004-04-21 devnull goto Err;
87 551445b9 2004-04-21 devnull break;
88 551445b9 2004-04-21 devnull case SunRpcMismatch:
89 551445b9 2004-04-21 devnull case SunProgMismatch:
90 551445b9 2004-04-21 devnull if(sunuint32pack(a, ea, &a, (x=rpc->status&0xFFFF, &x)) < 0
91 551445b9 2004-04-21 devnull || sunuint32pack(a, ea, &a, &rpc->low) < 0
92 551445b9 2004-04-21 devnull || sunuint32pack(a, ea, &a, &rpc->high) < 0)
93 551445b9 2004-04-21 devnull goto Err;
94 551445b9 2004-04-21 devnull break;
95 551445b9 2004-04-21 devnull default:
96 551445b9 2004-04-21 devnull if(sunuint32pack(a, ea, &a, (x=rpc->status&0xFFFF, &x)) < 0)
97 551445b9 2004-04-21 devnull goto Err;
98 4c06b8ee 2005-05-19 devnull
99 551445b9 2004-04-21 devnull break;
100 551445b9 2004-04-21 devnull }
101 551445b9 2004-04-21 devnull }
102 551445b9 2004-04-21 devnull *pa = a;
103 551445b9 2004-04-21 devnull return SunSuccess;
104 551445b9 2004-04-21 devnull
105 551445b9 2004-04-21 devnull Err:
106 551445b9 2004-04-21 devnull *pa = ea;
107 551445b9 2004-04-21 devnull return SunGarbageArgs;
108 551445b9 2004-04-21 devnull }
109 551445b9 2004-04-21 devnull
110 551445b9 2004-04-21 devnull uint
111 551445b9 2004-04-21 devnull sunrpcsize(SunRpc *rpc)
112 551445b9 2004-04-21 devnull {
113 551445b9 2004-04-21 devnull uint a;
114 551445b9 2004-04-21 devnull
115 551445b9 2004-04-21 devnull a = 4;
116 551445b9 2004-04-21 devnull if(rpc->iscall){
117 551445b9 2004-04-21 devnull a += 5*4;
118 551445b9 2004-04-21 devnull a += sunauthinfosize(&rpc->cred);
119 551445b9 2004-04-21 devnull a += sunauthinfosize(&rpc->verf);
120 551445b9 2004-04-21 devnull a += sunfixedopaquesize(rpc->ndata);
121 551445b9 2004-04-21 devnull }else{
122 551445b9 2004-04-21 devnull a += 4;
123 551445b9 2004-04-21 devnull switch(rpc->status&0xF0000){
124 551445b9 2004-04-21 devnull case 0:
125 551445b9 2004-04-21 devnull case SunAcceptError:
126 551445b9 2004-04-21 devnull a += 4+sunauthinfosize(&rpc->verf);
127 4c06b8ee 2005-05-19 devnull break;
128 4c06b8ee 2005-05-19 devnull case SunAuthError:
129 4c06b8ee 2005-05-19 devnull a += 4+4;
130 551445b9 2004-04-21 devnull break;
131 551445b9 2004-04-21 devnull default:
132 551445b9 2004-04-21 devnull a += 4;
133 551445b9 2004-04-21 devnull break;
134 551445b9 2004-04-21 devnull }
135 551445b9 2004-04-21 devnull
136 551445b9 2004-04-21 devnull switch(rpc->status){
137 551445b9 2004-04-21 devnull case SunSuccess:
138 551445b9 2004-04-21 devnull a += 4+sunfixedopaquesize(rpc->ndata);
139 551445b9 2004-04-21 devnull break;
140 551445b9 2004-04-21 devnull case SunRpcMismatch:
141 551445b9 2004-04-21 devnull case SunProgMismatch:
142 551445b9 2004-04-21 devnull a += 3*4;
143 886a6f6c 2006-05-04 devnull break;
144 551445b9 2004-04-21 devnull default:
145 551445b9 2004-04-21 devnull a += 4;
146 551445b9 2004-04-21 devnull }
147 551445b9 2004-04-21 devnull }
148 551445b9 2004-04-21 devnull return a;
149 551445b9 2004-04-21 devnull }
150 551445b9 2004-04-21 devnull
151 551445b9 2004-04-21 devnull SunStatus
152 551445b9 2004-04-21 devnull sunrpcunpack(uchar *a, uchar *ea, uchar **pa, SunRpc *rpc)
153 551445b9 2004-04-21 devnull {
154 551445b9 2004-04-21 devnull u32int x;
155 551445b9 2004-04-21 devnull
156 551445b9 2004-04-21 devnull memset(rpc, 0, sizeof *rpc);
157 551445b9 2004-04-21 devnull if(sunuint32unpack(a, ea, &a, &rpc->xid) < 0
158 551445b9 2004-04-21 devnull || sunuint32unpack(a, ea, &a, &x) < 0)
159 551445b9 2004-04-21 devnull goto Err;
160 551445b9 2004-04-21 devnull
161 551445b9 2004-04-21 devnull switch(x){
162 551445b9 2004-04-21 devnull default:
163 551445b9 2004-04-21 devnull goto Err;
164 551445b9 2004-04-21 devnull case MsgCall:
165 551445b9 2004-04-21 devnull rpc->iscall = 1;
166 551445b9 2004-04-21 devnull if(sunuint32unpack(a, ea, &a, &x) < 0 || x != RpcVersion
167 551445b9 2004-04-21 devnull || sunuint32unpack(a, ea, &a, &rpc->prog) < 0
168 551445b9 2004-04-21 devnull || sunuint32unpack(a, ea, &a, &rpc->vers) < 0
169 551445b9 2004-04-21 devnull || sunuint32unpack(a, ea, &a, &rpc->proc) < 0
170 551445b9 2004-04-21 devnull || sunauthinfounpack(a, ea, &a, &rpc->cred) < 0
171 551445b9 2004-04-21 devnull || sunauthinfounpack(a, ea, &a, &rpc->verf) < 0)
172 551445b9 2004-04-21 devnull goto Err;
173 551445b9 2004-04-21 devnull rpc->ndata = ea-a;
174 551445b9 2004-04-21 devnull rpc->data = a;
175 551445b9 2004-04-21 devnull a = ea;
176 551445b9 2004-04-21 devnull break;
177 551445b9 2004-04-21 devnull
178 551445b9 2004-04-21 devnull case MsgReply:
179 551445b9 2004-04-21 devnull rpc->iscall = 0;
180 551445b9 2004-04-21 devnull if(sunuint32unpack(a, ea, &a, &x) < 0)
181 551445b9 2004-04-21 devnull goto Err;
182 4c06b8ee 2005-05-19 devnull fprint(2, "x %x\n", x);
183 551445b9 2004-04-21 devnull switch(x){
184 551445b9 2004-04-21 devnull default:
185 551445b9 2004-04-21 devnull goto Err;
186 551445b9 2004-04-21 devnull case MsgAccepted:
187 551445b9 2004-04-21 devnull if(sunauthinfounpack(a, ea, &a, &rpc->verf) < 0
188 551445b9 2004-04-21 devnull || sunuint32unpack(a, ea, &a, &x) < 0)
189 551445b9 2004-04-21 devnull goto Err;
190 551445b9 2004-04-21 devnull switch(x){
191 551445b9 2004-04-21 devnull case MsgSuccess:
192 551445b9 2004-04-21 devnull rpc->status = SunSuccess;
193 551445b9 2004-04-21 devnull rpc->ndata = ea-a;
194 551445b9 2004-04-21 devnull rpc->data = a;
195 551445b9 2004-04-21 devnull a = ea;
196 551445b9 2004-04-21 devnull break;
197 551445b9 2004-04-21 devnull case MsgProgUnavail:
198 551445b9 2004-04-21 devnull case MsgProcUnavail:
199 551445b9 2004-04-21 devnull case MsgGarbageArgs:
200 551445b9 2004-04-21 devnull case MsgSystemErr:
201 551445b9 2004-04-21 devnull rpc->status = SunAcceptError | x;
202 551445b9 2004-04-21 devnull break;
203 551445b9 2004-04-21 devnull case MsgProgMismatch:
204 551445b9 2004-04-21 devnull rpc->status = SunAcceptError | x;
205 551445b9 2004-04-21 devnull if(sunuint32unpack(a, ea, &a, &rpc->low) < 0
206 551445b9 2004-04-21 devnull || sunuint32unpack(a, ea, &a, &rpc->high) < 0)
207 551445b9 2004-04-21 devnull goto Err;
208 551445b9 2004-04-21 devnull break;
209 551445b9 2004-04-21 devnull }
210 551445b9 2004-04-21 devnull break;
211 551445b9 2004-04-21 devnull case MsgDenied:
212 551445b9 2004-04-21 devnull if(sunuint32unpack(a, ea, &a, &x) < 0)
213 551445b9 2004-04-21 devnull goto Err;
214 4c06b8ee 2005-05-19 devnull fprint(2, "xx %ux\n", x);
215 551445b9 2004-04-21 devnull switch(x){
216 551445b9 2004-04-21 devnull default:
217 551445b9 2004-04-21 devnull goto Err;
218 551445b9 2004-04-21 devnull case MsgAuthError:
219 551445b9 2004-04-21 devnull if(sunuint32unpack(a, ea, &a, &x) < 0)
220 551445b9 2004-04-21 devnull goto Err;
221 551445b9 2004-04-21 devnull rpc->status = SunAuthError | x;
222 551445b9 2004-04-21 devnull break;
223 551445b9 2004-04-21 devnull case MsgRpcMismatch:
224 551445b9 2004-04-21 devnull rpc->status = SunRejectError | x;
225 551445b9 2004-04-21 devnull if(sunuint32unpack(a, ea, &a, &rpc->low) < 0
226 551445b9 2004-04-21 devnull || sunuint32unpack(a, ea, &a, &rpc->high) < 0)
227 551445b9 2004-04-21 devnull goto Err;
228 551445b9 2004-04-21 devnull break;
229 551445b9 2004-04-21 devnull }
230 551445b9 2004-04-21 devnull break;
231 551445b9 2004-04-21 devnull }
232 551445b9 2004-04-21 devnull }
233 551445b9 2004-04-21 devnull *pa = a;
234 551445b9 2004-04-21 devnull return SunSuccess;
235 551445b9 2004-04-21 devnull
236 551445b9 2004-04-21 devnull Err:
237 551445b9 2004-04-21 devnull *pa = ea;
238 551445b9 2004-04-21 devnull return SunGarbageArgs;
239 551445b9 2004-04-21 devnull }
240 551445b9 2004-04-21 devnull
241 551445b9 2004-04-21 devnull void
242 551445b9 2004-04-21 devnull sunrpcprint(Fmt *fmt, SunRpc *rpc)
243 551445b9 2004-04-21 devnull {
244 551445b9 2004-04-21 devnull fmtprint(fmt, "xid=%#ux", rpc->xid);
245 551445b9 2004-04-21 devnull if(rpc->iscall){
246 551445b9 2004-04-21 devnull fmtprint(fmt, " prog %#ux vers %#ux proc %#ux [", rpc->prog, rpc->vers, rpc->proc);
247 551445b9 2004-04-21 devnull sunauthinfoprint(fmt, &rpc->cred);
248 551445b9 2004-04-21 devnull fmtprint(fmt, "] [");
249 551445b9 2004-04-21 devnull sunauthinfoprint(fmt, &rpc->verf);
250 551445b9 2004-04-21 devnull fmtprint(fmt, "]");
251 551445b9 2004-04-21 devnull }else{
252 551445b9 2004-04-21 devnull fmtprint(fmt, " status %#ux [", rpc->status);
253 551445b9 2004-04-21 devnull sunauthinfoprint(fmt, &rpc->verf);
254 551445b9 2004-04-21 devnull fmtprint(fmt, "] low %#ux high %#ux", rpc->low, rpc->high);
255 551445b9 2004-04-21 devnull }
256 551445b9 2004-04-21 devnull }
257 551445b9 2004-04-21 devnull
258 551445b9 2004-04-21 devnull void
259 551445b9 2004-04-21 devnull sunauthinfoprint(Fmt *fmt, SunAuthInfo *ai)
260 551445b9 2004-04-21 devnull {
261 551445b9 2004-04-21 devnull switch(ai->flavor){
262 551445b9 2004-04-21 devnull case SunAuthNone:
263 551445b9 2004-04-21 devnull fmtprint(fmt, "none");
264 551445b9 2004-04-21 devnull break;
265 551445b9 2004-04-21 devnull case SunAuthShort:
266 551445b9 2004-04-21 devnull fmtprint(fmt, "short");
267 551445b9 2004-04-21 devnull break;
268 551445b9 2004-04-21 devnull case SunAuthSys:
269 551445b9 2004-04-21 devnull fmtprint(fmt, "sys");
270 551445b9 2004-04-21 devnull break;
271 551445b9 2004-04-21 devnull default:
272 551445b9 2004-04-21 devnull fmtprint(fmt, "%#ux", ai->flavor);
273 551445b9 2004-04-21 devnull break;
274 551445b9 2004-04-21 devnull }
275 cbeb0b26 2006-04-01 devnull /* if(ai->ndata) */
276 cbeb0b26 2006-04-01 devnull /* fmtprint(fmt, " %.*H", ai->ndata, ai->data); */
277 551445b9 2004-04-21 devnull }
278 551445b9 2004-04-21 devnull
279 551445b9 2004-04-21 devnull uint
280 551445b9 2004-04-21 devnull sunauthinfosize(SunAuthInfo *ai)
281 551445b9 2004-04-21 devnull {
282 551445b9 2004-04-21 devnull return 4 + sunvaropaquesize(ai->ndata);
283 551445b9 2004-04-21 devnull }
284 551445b9 2004-04-21 devnull
285 551445b9 2004-04-21 devnull int
286 551445b9 2004-04-21 devnull sunauthinfopack(uchar *a, uchar *ea, uchar **pa, SunAuthInfo *ai)
287 551445b9 2004-04-21 devnull {
288 551445b9 2004-04-21 devnull if(sunuint32pack(a, ea, &a, &ai->flavor) < 0
289 551445b9 2004-04-21 devnull || sunvaropaquepack(a, ea, &a, &ai->data, &ai->ndata, 400) < 0)
290 551445b9 2004-04-21 devnull goto Err;
291 551445b9 2004-04-21 devnull *pa = a;
292 551445b9 2004-04-21 devnull return 0;
293 551445b9 2004-04-21 devnull
294 551445b9 2004-04-21 devnull Err:
295 551445b9 2004-04-21 devnull *pa = ea;
296 551445b9 2004-04-21 devnull return -1;
297 551445b9 2004-04-21 devnull }
298 551445b9 2004-04-21 devnull
299 551445b9 2004-04-21 devnull int
300 551445b9 2004-04-21 devnull sunauthinfounpack(uchar *a, uchar *ea, uchar **pa, SunAuthInfo *ai)
301 551445b9 2004-04-21 devnull {
302 551445b9 2004-04-21 devnull if(sunuint32unpack(a, ea, &a, &ai->flavor) < 0
303 551445b9 2004-04-21 devnull || sunvaropaqueunpack(a, ea, &a, &ai->data, &ai->ndata, 400) < 0)
304 551445b9 2004-04-21 devnull goto Err;
305 551445b9 2004-04-21 devnull *pa = a;
306 551445b9 2004-04-21 devnull return 0;
307 551445b9 2004-04-21 devnull
308 551445b9 2004-04-21 devnull Err:
309 551445b9 2004-04-21 devnull *pa = ea;
310 551445b9 2004-04-21 devnull return -1;
311 551445b9 2004-04-21 devnull }
312 551445b9 2004-04-21 devnull
313 551445b9 2004-04-21 devnull int
314 551445b9 2004-04-21 devnull sunenumpack(uchar *a, uchar *ea, uchar **pa, int *e)
315 551445b9 2004-04-21 devnull {
316 551445b9 2004-04-21 devnull u32int x;
317 551445b9 2004-04-21 devnull
318 551445b9 2004-04-21 devnull x = *e;
319 551445b9 2004-04-21 devnull return sunuint32pack(a, ea, pa, &x);
320 551445b9 2004-04-21 devnull }
321 551445b9 2004-04-21 devnull
322 551445b9 2004-04-21 devnull int
323 551445b9 2004-04-21 devnull sunuint1pack(uchar *a, uchar *ea, uchar **pa, u1int *u)
324 551445b9 2004-04-21 devnull {
325 551445b9 2004-04-21 devnull u32int x;
326 551445b9 2004-04-21 devnull
327 551445b9 2004-04-21 devnull x = *u;
328 551445b9 2004-04-21 devnull return sunuint32pack(a, ea, pa, &x);
329 551445b9 2004-04-21 devnull }
330 551445b9 2004-04-21 devnull
331 551445b9 2004-04-21 devnull int
332 551445b9 2004-04-21 devnull sunuint32pack(uchar *a, uchar *ea, uchar **pa, u32int *u)
333 551445b9 2004-04-21 devnull {
334 551445b9 2004-04-21 devnull u32int x;
335 551445b9 2004-04-21 devnull
336 551445b9 2004-04-21 devnull if(ea-a < 4)
337 551445b9 2004-04-21 devnull goto Err;
338 551445b9 2004-04-21 devnull
339 551445b9 2004-04-21 devnull x = *u;
340 551445b9 2004-04-21 devnull *a++ = x>>24;
341 551445b9 2004-04-21 devnull *a++ = x>>16;
342 551445b9 2004-04-21 devnull *a++ = x>>8;
343 551445b9 2004-04-21 devnull *a++ = x;
344 551445b9 2004-04-21 devnull *pa = a;
345 551445b9 2004-04-21 devnull return 0;
346 551445b9 2004-04-21 devnull
347 551445b9 2004-04-21 devnull Err:
348 551445b9 2004-04-21 devnull *pa = ea;
349 551445b9 2004-04-21 devnull return -1;
350 551445b9 2004-04-21 devnull }
351 551445b9 2004-04-21 devnull
352 551445b9 2004-04-21 devnull int
353 551445b9 2004-04-21 devnull sunenumunpack(uchar *a, uchar *ea, uchar **pa, int *e)
354 551445b9 2004-04-21 devnull {
355 551445b9 2004-04-21 devnull u32int x;
356 551445b9 2004-04-21 devnull if(sunuint32unpack(a, ea, pa, &x) < 0)
357 551445b9 2004-04-21 devnull return -1;
358 551445b9 2004-04-21 devnull *e = x;
359 551445b9 2004-04-21 devnull return 0;
360 551445b9 2004-04-21 devnull }
361 551445b9 2004-04-21 devnull
362 551445b9 2004-04-21 devnull int
363 551445b9 2004-04-21 devnull sunuint1unpack(uchar *a, uchar *ea, uchar **pa, u1int *u)
364 551445b9 2004-04-21 devnull {
365 551445b9 2004-04-21 devnull u32int x;
366 551445b9 2004-04-21 devnull if(sunuint32unpack(a, ea, pa, &x) < 0 || (x!=0 && x!=1)){
367 551445b9 2004-04-21 devnull *pa = ea;
368 551445b9 2004-04-21 devnull return -1;
369 551445b9 2004-04-21 devnull }
370 551445b9 2004-04-21 devnull *u = x;
371 551445b9 2004-04-21 devnull return 0;
372 551445b9 2004-04-21 devnull }
373 551445b9 2004-04-21 devnull
374 551445b9 2004-04-21 devnull int
375 551445b9 2004-04-21 devnull sunuint32unpack(uchar *a, uchar *ea, uchar **pa, u32int *u)
376 551445b9 2004-04-21 devnull {
377 551445b9 2004-04-21 devnull u32int x;
378 551445b9 2004-04-21 devnull
379 551445b9 2004-04-21 devnull if(ea-a < 4)
380 551445b9 2004-04-21 devnull goto Err;
381 551445b9 2004-04-21 devnull x = *a++ << 24;
382 551445b9 2004-04-21 devnull x |= *a++ << 16;
383 551445b9 2004-04-21 devnull x |= *a++ << 8;
384 551445b9 2004-04-21 devnull x |= *a++;
385 551445b9 2004-04-21 devnull *pa = a;
386 551445b9 2004-04-21 devnull *u = x;
387 551445b9 2004-04-21 devnull return 0;
388 551445b9 2004-04-21 devnull
389 551445b9 2004-04-21 devnull Err:
390 551445b9 2004-04-21 devnull *pa = ea;
391 551445b9 2004-04-21 devnull return -1;
392 551445b9 2004-04-21 devnull }
393 551445b9 2004-04-21 devnull
394 551445b9 2004-04-21 devnull int
395 551445b9 2004-04-21 devnull sunuint64unpack(uchar *a, uchar *ea, uchar **pa, u64int *u)
396 551445b9 2004-04-21 devnull {
397 551445b9 2004-04-21 devnull u32int x, y;
398 551445b9 2004-04-21 devnull
399 551445b9 2004-04-21 devnull if(sunuint32unpack(a, ea, &a, &x) < 0
400 551445b9 2004-04-21 devnull || sunuint32unpack(a, ea, &a, &y) < 0)
401 551445b9 2004-04-21 devnull goto Err;
402 551445b9 2004-04-21 devnull *u = ((uvlong)x<<32) | y;
403 551445b9 2004-04-21 devnull *pa = a;
404 551445b9 2004-04-21 devnull return 0;
405 551445b9 2004-04-21 devnull Err:
406 551445b9 2004-04-21 devnull *pa = ea;
407 551445b9 2004-04-21 devnull return -1;
408 551445b9 2004-04-21 devnull }
409 551445b9 2004-04-21 devnull
410 551445b9 2004-04-21 devnull int
411 551445b9 2004-04-21 devnull sunuint64pack(uchar *a, uchar *ea, uchar **pa, u64int *u)
412 551445b9 2004-04-21 devnull {
413 551445b9 2004-04-21 devnull u32int x, y;
414 551445b9 2004-04-21 devnull
415 551445b9 2004-04-21 devnull x = *u >> 32;
416 551445b9 2004-04-21 devnull y = *u;
417 551445b9 2004-04-21 devnull if(sunuint32pack(a, ea, &a, &x) < 0
418 551445b9 2004-04-21 devnull || sunuint32pack(a, ea, &a, &y) < 0)
419 551445b9 2004-04-21 devnull goto Err;
420 551445b9 2004-04-21 devnull *pa = a;
421 551445b9 2004-04-21 devnull return 0;
422 551445b9 2004-04-21 devnull Err:
423 551445b9 2004-04-21 devnull *pa = ea;
424 551445b9 2004-04-21 devnull return -1;
425 551445b9 2004-04-21 devnull }
426 551445b9 2004-04-21 devnull
427 551445b9 2004-04-21 devnull uint
428 551445b9 2004-04-21 devnull sunstringsize(char *s)
429 551445b9 2004-04-21 devnull {
430 551445b9 2004-04-21 devnull return (4+strlen(s)+3) & ~3;
431 551445b9 2004-04-21 devnull }
432 551445b9 2004-04-21 devnull
433 551445b9 2004-04-21 devnull int
434 551445b9 2004-04-21 devnull sunstringunpack(uchar *a, uchar *ea, uchar **pa, char **s, u32int max)
435 551445b9 2004-04-21 devnull {
436 551445b9 2004-04-21 devnull uchar *dat;
437 551445b9 2004-04-21 devnull u32int n;
438 551445b9 2004-04-21 devnull
439 551445b9 2004-04-21 devnull if(sunvaropaqueunpack(a, ea, pa, &dat, &n, max) < 0)
440 551445b9 2004-04-21 devnull goto Err;
441 551445b9 2004-04-21 devnull /* slide string down over length to make room for NUL */
442 1e22e8e4 2006-05-04 devnull dat--;
443 1e22e8e4 2006-05-04 devnull memmove(dat, dat+1, n);
444 1e22e8e4 2006-05-04 devnull dat[n] = 0;
445 1e22e8e4 2006-05-04 devnull *s = (char*)dat;
446 551445b9 2004-04-21 devnull return 0;
447 551445b9 2004-04-21 devnull Err:
448 551445b9 2004-04-21 devnull return -1;
449 551445b9 2004-04-21 devnull }
450 551445b9 2004-04-21 devnull
451 551445b9 2004-04-21 devnull int
452 551445b9 2004-04-21 devnull sunstringpack(uchar *a, uchar *ea, uchar **pa, char **s, u32int max)
453 551445b9 2004-04-21 devnull {
454 551445b9 2004-04-21 devnull u32int n;
455 551445b9 2004-04-21 devnull
456 551445b9 2004-04-21 devnull n = strlen(*s);
457 551445b9 2004-04-21 devnull return sunvaropaquepack(a, ea, pa, (uchar**)s, &n, max);
458 551445b9 2004-04-21 devnull }
459 551445b9 2004-04-21 devnull
460 551445b9 2004-04-21 devnull uint
461 551445b9 2004-04-21 devnull sunvaropaquesize(u32int n)
462 551445b9 2004-04-21 devnull {
463 551445b9 2004-04-21 devnull return (4+n+3) & ~3;
464 551445b9 2004-04-21 devnull }
465 551445b9 2004-04-21 devnull
466 551445b9 2004-04-21 devnull int
467 551445b9 2004-04-21 devnull sunvaropaquepack(uchar *a, uchar *ea, uchar **pa, uchar **dat, u32int *ndat, u32int max)
468 551445b9 2004-04-21 devnull {
469 551445b9 2004-04-21 devnull if(*ndat > max || sunuint32pack(a, ea, &a, ndat) < 0
470 551445b9 2004-04-21 devnull || sunfixedopaquepack(a, ea, &a, *dat, *ndat) < 0)
471 551445b9 2004-04-21 devnull goto Err;
472 551445b9 2004-04-21 devnull *pa = a;
473 551445b9 2004-04-21 devnull return 0;
474 551445b9 2004-04-21 devnull
475 551445b9 2004-04-21 devnull Err:
476 551445b9 2004-04-21 devnull *pa = ea;
477 551445b9 2004-04-21 devnull return -1;
478 551445b9 2004-04-21 devnull }
479 551445b9 2004-04-21 devnull
480 551445b9 2004-04-21 devnull int
481 551445b9 2004-04-21 devnull sunvaropaqueunpack(uchar *a, uchar *ea, uchar **pa, uchar **dat, u32int *ndat, u32int max)
482 551445b9 2004-04-21 devnull {
483 551445b9 2004-04-21 devnull if(sunuint32unpack(a, ea, &a, ndat) < 0
484 551445b9 2004-04-21 devnull || *ndat > max)
485 551445b9 2004-04-21 devnull goto Err;
486 551445b9 2004-04-21 devnull *dat = a;
487 551445b9 2004-04-21 devnull a += (*ndat+3)&~3;
488 551445b9 2004-04-21 devnull if(a > ea)
489 551445b9 2004-04-21 devnull goto Err;
490 551445b9 2004-04-21 devnull *pa = a;
491 551445b9 2004-04-21 devnull return 0;
492 551445b9 2004-04-21 devnull
493 551445b9 2004-04-21 devnull Err:
494 551445b9 2004-04-21 devnull *pa = ea;
495 551445b9 2004-04-21 devnull return -1;
496 551445b9 2004-04-21 devnull }
497 551445b9 2004-04-21 devnull
498 551445b9 2004-04-21 devnull uint
499 551445b9 2004-04-21 devnull sunfixedopaquesize(u32int n)
500 551445b9 2004-04-21 devnull {
501 551445b9 2004-04-21 devnull return (n+3) & ~3;
502 551445b9 2004-04-21 devnull }
503 551445b9 2004-04-21 devnull
504 551445b9 2004-04-21 devnull int
505 551445b9 2004-04-21 devnull sunfixedopaquepack(uchar *a, uchar *ea, uchar **pa, uchar *dat, u32int n)
506 551445b9 2004-04-21 devnull {
507 551445b9 2004-04-21 devnull uint nn;
508 551445b9 2004-04-21 devnull
509 551445b9 2004-04-21 devnull nn = (n+3)&~3;
510 551445b9 2004-04-21 devnull if(a+nn > ea)
511 551445b9 2004-04-21 devnull goto Err;
512 551445b9 2004-04-21 devnull memmove(a, dat, n);
513 551445b9 2004-04-21 devnull if(nn > n)
514 551445b9 2004-04-21 devnull memset(a+n, 0, nn-n);
515 551445b9 2004-04-21 devnull a += nn;
516 551445b9 2004-04-21 devnull *pa = a;
517 551445b9 2004-04-21 devnull return 0;
518 551445b9 2004-04-21 devnull
519 551445b9 2004-04-21 devnull Err:
520 551445b9 2004-04-21 devnull *pa = ea;
521 551445b9 2004-04-21 devnull return -1;
522 551445b9 2004-04-21 devnull }
523 551445b9 2004-04-21 devnull
524 551445b9 2004-04-21 devnull int
525 551445b9 2004-04-21 devnull sunfixedopaqueunpack(uchar *a, uchar *ea, uchar **pa, uchar *dat, u32int n)
526 551445b9 2004-04-21 devnull {
527 551445b9 2004-04-21 devnull uint nn;
528 551445b9 2004-04-21 devnull
529 551445b9 2004-04-21 devnull nn = (n+3)&~3;
530 551445b9 2004-04-21 devnull if(a+nn > ea)
531 551445b9 2004-04-21 devnull goto Err;
532 551445b9 2004-04-21 devnull memmove(dat, a, n);
533 551445b9 2004-04-21 devnull a += nn;
534 551445b9 2004-04-21 devnull *pa = a;
535 551445b9 2004-04-21 devnull return 0;
536 551445b9 2004-04-21 devnull
537 551445b9 2004-04-21 devnull Err:
538 551445b9 2004-04-21 devnull *pa = ea;
539 551445b9 2004-04-21 devnull return -1;
540 551445b9 2004-04-21 devnull }