authunix.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /*
  2. * This file is part of the UCB release of Plan 9. It is subject to the license
  3. * terms in the LICENSE file found in the top-level directory of this
  4. * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No
  5. * part of the UCB release of Plan 9, including this file, may be copied,
  6. * modified, propagated, or distributed except according to the terms contained
  7. * in the LICENSE file.
  8. */
  9. #include <u.h>
  10. #include <libc.h>
  11. #include <thread.h>
  12. #include <sunrpc.h>
  13. uint
  14. sunAuthUnixSize(SunAuthUnix *x)
  15. {
  16. return 4 + sunStringSize(x->sysname) + 4 + 4 + 4 + 4*x->ng;
  17. }
  18. int
  19. sunAuthUnixUnpack(uint8_t *a, uint8_t *ea, uint8_t **pa, SunAuthUnix *x)
  20. {
  21. int i;
  22. if(sunUint32Unpack(a, ea, &a, &x->stamp) < 0) goto Err;
  23. if(sunStringUnpack(a, ea, &a, &x->sysname, 256) < 0) goto Err;
  24. if(sunUint32Unpack(a, ea, &a, &x->uid) < 0) goto Err;
  25. if(sunUint32Unpack(a, ea, &a, &x->gid) < 0) goto Err;
  26. if(sunUint32Unpack(a, ea, &a, &x->ng) < 0 || x->ng > nelem(x->g)) goto Err;
  27. for(i=0; i<x->ng; i++)
  28. if(sunUint32Unpack(a, ea, &a, &x->g[i]) < 0) goto Err;
  29. *pa = a;
  30. return 0;
  31. Err:
  32. *pa = ea;
  33. return -1;
  34. }
  35. int
  36. sunAuthUnixPack(uint8_t *a, uint8_t *ea, uint8_t **pa, SunAuthUnix *x)
  37. {
  38. int i;
  39. if(sunUint32Pack(a, ea, &a, &x->stamp) < 0) goto Err;
  40. if(sunStringPack(a, ea, &a, &x->sysname, 256) < 0) goto Err;
  41. if(sunUint32Pack(a, ea, &a, &x->uid) < 0) goto Err;
  42. if(sunUint32Pack(a, ea, &a, &x->gid) < 0) goto Err;
  43. if(sunUint32Pack(a, ea, &a, &x->ng) < 0 || x->ng > nelem(x->g)) goto Err;
  44. for(i=0; i<x->ng; i++)
  45. if(sunUint32Pack(a, ea, &a, &x->g[i]) < 0) goto Err;
  46. *pa = a;
  47. return 0;
  48. Err:
  49. *pa = ea;
  50. return -1;
  51. }
  52. void
  53. sunAuthUnixPrint(Fmt *fmt, SunAuthUnix *x)
  54. {
  55. int i;
  56. fmtprint(fmt, "unix %.8lux %s %lud %lud (", (uint32_t)x->stamp,
  57. x->sysname, (uint32_t)x->uid, (uint32_t)x->gid);
  58. for(i=0; i<x->ng; i++)
  59. fmtprint(fmt, "%s%lud", i ? " ":"", (uint32_t)x->g[i]);
  60. fmtprint(fmt, ")");
  61. }