xref: /plan9/sys/src/libsunrpc/authunix.c (revision 34e0422554c8e8bef66509534d2c44f4660bf678)
1*34e04225SDavid du Colombier #include <u.h>
2*34e04225SDavid du Colombier #include <libc.h>
3*34e04225SDavid du Colombier #include <thread.h>
4*34e04225SDavid du Colombier #include <sunrpc.h>
5*34e04225SDavid du Colombier 
6*34e04225SDavid du Colombier uint
sunAuthUnixSize(SunAuthUnix * x)7*34e04225SDavid du Colombier sunAuthUnixSize(SunAuthUnix *x)
8*34e04225SDavid du Colombier {
9*34e04225SDavid du Colombier 	return 4 + sunStringSize(x->sysname) + 4 + 4 + 4 + 4*x->ng;
10*34e04225SDavid du Colombier }
11*34e04225SDavid du Colombier int
sunAuthUnixUnpack(uchar * a,uchar * ea,uchar ** pa,SunAuthUnix * x)12*34e04225SDavid du Colombier sunAuthUnixUnpack(uchar *a, uchar *ea, uchar **pa, SunAuthUnix *x)
13*34e04225SDavid du Colombier {
14*34e04225SDavid du Colombier 	int i;
15*34e04225SDavid du Colombier 
16*34e04225SDavid du Colombier 	if(sunUint32Unpack(a, ea, &a, &x->stamp) < 0) goto Err;
17*34e04225SDavid du Colombier 	if(sunStringUnpack(a, ea, &a, &x->sysname, 256) < 0) goto Err;
18*34e04225SDavid du Colombier 	if(sunUint32Unpack(a, ea, &a, &x->uid) < 0) goto Err;
19*34e04225SDavid du Colombier 	if(sunUint32Unpack(a, ea, &a, &x->gid) < 0) goto Err;
20*34e04225SDavid du Colombier 	if(sunUint32Unpack(a, ea, &a, &x->ng) < 0 || x->ng > nelem(x->g)) goto Err;
21*34e04225SDavid du Colombier 	for(i=0; i<x->ng; i++)
22*34e04225SDavid du Colombier 		if(sunUint32Unpack(a, ea, &a, &x->g[i]) < 0) goto Err;
23*34e04225SDavid du Colombier 
24*34e04225SDavid du Colombier 	*pa = a;
25*34e04225SDavid du Colombier 	return 0;
26*34e04225SDavid du Colombier 
27*34e04225SDavid du Colombier Err:
28*34e04225SDavid du Colombier 	*pa = ea;
29*34e04225SDavid du Colombier 	return -1;
30*34e04225SDavid du Colombier }
31*34e04225SDavid du Colombier int
sunAuthUnixPack(uchar * a,uchar * ea,uchar ** pa,SunAuthUnix * x)32*34e04225SDavid du Colombier sunAuthUnixPack(uchar *a, uchar *ea, uchar **pa, SunAuthUnix *x)
33*34e04225SDavid du Colombier {
34*34e04225SDavid du Colombier 	int i;
35*34e04225SDavid du Colombier 
36*34e04225SDavid du Colombier 	if(sunUint32Pack(a, ea, &a, &x->stamp) < 0) goto Err;
37*34e04225SDavid du Colombier 	if(sunStringPack(a, ea, &a, &x->sysname, 256) < 0) goto Err;
38*34e04225SDavid du Colombier 	if(sunUint32Pack(a, ea, &a, &x->uid) < 0) goto Err;
39*34e04225SDavid du Colombier 	if(sunUint32Pack(a, ea, &a, &x->gid) < 0) goto Err;
40*34e04225SDavid du Colombier 	if(sunUint32Pack(a, ea, &a, &x->ng) < 0 || x->ng > nelem(x->g)) goto Err;
41*34e04225SDavid du Colombier 	for(i=0; i<x->ng; i++)
42*34e04225SDavid du Colombier 		if(sunUint32Pack(a, ea, &a, &x->g[i]) < 0) goto Err;
43*34e04225SDavid du Colombier 
44*34e04225SDavid du Colombier 	*pa = a;
45*34e04225SDavid du Colombier 	return 0;
46*34e04225SDavid du Colombier 
47*34e04225SDavid du Colombier Err:
48*34e04225SDavid du Colombier 	*pa = ea;
49*34e04225SDavid du Colombier 	return -1;
50*34e04225SDavid du Colombier }
51*34e04225SDavid du Colombier void
sunAuthUnixPrint(Fmt * fmt,SunAuthUnix * x)52*34e04225SDavid du Colombier sunAuthUnixPrint(Fmt *fmt, SunAuthUnix *x)
53*34e04225SDavid du Colombier {
54*34e04225SDavid du Colombier 	int i;
55*34e04225SDavid du Colombier 	fmtprint(fmt, "unix %.8lux %s %lud %lud (", (ulong)x->stamp,
56*34e04225SDavid du Colombier 		x->sysname, (ulong)x->uid, (ulong)x->gid);
57*34e04225SDavid du Colombier 	for(i=0; i<x->ng; i++)
58*34e04225SDavid du Colombier 		fmtprint(fmt, "%s%lud", i ? " ":"", (ulong)x->g[i]);
59*34e04225SDavid du Colombier 	fmtprint(fmt, ")");
60*34e04225SDavid du Colombier }
61