3 #define SHORT(x) r->x = (p[1] | (p[0]<<8)); p += 2
4 #define LONG(x) r->x = (p[3] | (p[2]<<8) |\
5 (p[1]<<16) | (p[0]<<24)); p += 4
6 #define SKIPLONG p += 4
7 #define PTR(x, n) r->x = (void *)(p); p += ROUNDUP(n)
10 rpcM2S(void *ap, Rpccall *r, int n)
16 /* copy IPv4 header fields from Udphdr */
18 p = &up->raddr[IPaddrlen - IPv4addrlen];
21 p = &up->laddr[IPaddrlen - IPv4addrlen];
24 /* ignore up->ifcaddr */
41 PTR(cred.data, r->cred.count);
44 PTR(verf.data, r->verf.count);
46 k = n - (p - (uchar *)ap);
57 PTR(averf.data, r->averf.count);
61 k = n - (p - (uchar *)ap);
92 auth2unix(Auth *arg, Authunix *r)
97 if(arg->flavor != AUTH_UNIX)
102 PTR(mach.s, r->mach.n);
107 for(i=0; i<n && i < nelem(r->gids); i++){
113 return arg->count - (p - (uchar *)arg->data);
117 string2S(void *arg, String *r)
125 /* must NUL terminate */
128 panic("malloc(%ld) failed in string2S\n", r->n+1);
129 memmove(s, r->s, r->n);
133 return p - (uchar *)arg;
140 #define SHORT(x) p[1] = r->x; p[0] = r->x>>8; p += 2
141 #define LONG(x) p[3] = r->x; p[2] = r->x>>8; p[1] = r->x>>16; p[0] = r->x>>24; p += 4
143 #define PTR(x,n) memmove(p, r->x, n); p += ROUNDUP(n)
146 rpcS2M(Rpccall *r, int ndata, void *ap)
151 /* copy header fields to Udphdr */
153 memmove(up->raddr, v4prefix, IPaddrlen);
154 p = &up->raddr[IPaddrlen - IPv4addrlen];
157 memmove(up->laddr, v4prefix, IPaddrlen);
158 p = &up->laddr[IPaddrlen - IPv4addrlen];
161 memmove(up->ifcaddr, IPnoaddr, sizeof up->ifcaddr);
176 PTR(cred.data, r->cred.count);
179 PTR(verf.data, r->verf.count);
188 PTR(averf.data, r->averf.count);
215 return p - (uchar *)ap;
222 #define LONG(m, x) fprint(fd, "%s = %ld\n", m, r->x)
224 #define PTR(m, count) fprint(fd, "%s [%ld]\n", m, count)
227 rpcprint(int fd, Rpccall *r)
229 fprint(fd, "%s: host = %I, port = %ld\n",
230 argv0, r->host, r->port);
232 LONG("mtype", mtype);
235 LONG("rpcvers", rpcvers);
239 LONG("cred.flavor", cred.flavor);
240 PTR("cred.data", r->cred.count);
241 LONG("verf.flavor", verf.flavor);
242 PTR("verf.data", r->verf.count);
243 fprint(fd, "args...\n");
249 LONG("averf.flavor", averf.flavor);
250 PTR("averf.data", r->averf.count);
251 LONG("astat", astat);
254 fprint(fd, "results...\n");
258 LONG("phigh", phigh);
263 LONG("rstat", rstat);
267 LONG("rhigh", rhigh);
270 LONG("authstat", authstat);
284 if(auth2unix(ap, &au) != 0){
285 chat("auth flavor=%ld, count=%ld",
286 ap->flavor, ap->count);
287 for(i=0; i<ap->count; i++)
288 chat(" %.2ux", ((uchar *)ap->data)[i]);
290 chat("auth: %ld %.*s u=%ld g=%ld",
291 au.stamp, utfnlen(au.mach.s, au.mach.n), au.mach.s, au.uid, au.gid);
292 for(i=0; i<au.gidlen; i++)
293 chat(", %ld", au.gids[i]);
299 garbage(Rpccall *reply, char *msg)
301 chat("%s\n", msg ? msg : "garbage");
302 reply->astat = GARBAGE_ARGS;
307 error(Rpccall *reply, int errno)
309 uchar *dataptr = reply->results;
311 chat("error %d\n", errno);
313 return dataptr - (uchar *)reply->results;