group.c 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. #include "logfsos.h"
  2. #include "logfs.h"
  3. #include "local.h"
  4. enum {
  5. GROUPMOD = 127
  6. };
  7. static int
  8. groupcompare(void *a, void *b)
  9. {
  10. Group *g = a;
  11. char *uid = b;
  12. return g->uid == uid;
  13. }
  14. static int
  15. unamecompare(void *a, void *b)
  16. {
  17. Uname *u = a;
  18. char *uname = b;
  19. return u->uname == uname;
  20. }
  21. static int
  22. groupallocsize(void *key)
  23. {
  24. USED(key);
  25. return sizeof(Group);
  26. }
  27. static int
  28. unameallocsize(void *key)
  29. {
  30. USED(key);
  31. return sizeof(Uname);
  32. }
  33. char *
  34. logfsgroupmapnew(GroupMap **groupmapp, UnameMap **unamemapp)
  35. {
  36. char *errmsg;
  37. errmsg = logfsmapnew(GROUPMOD, logfshashulong, groupcompare, groupallocsize, nil, groupmapp);
  38. if(errmsg)
  39. return errmsg;
  40. errmsg = logfsmapnew(GROUPMOD, logfshashulong, unamecompare, unameallocsize, nil, unamemapp);
  41. if(errmsg)
  42. logfsmapfree(groupmapp);
  43. return errmsg;
  44. }
  45. char *
  46. logfsgroupmapnewentry(GroupMap *gm, UnameMap *um, char *uid, char *uname, Group **groupp, Uname **unamep)
  47. {
  48. char *errmsg;
  49. errmsg = logfsmapnewentry(gm, uid, groupp);
  50. if(errmsg)
  51. return errmsg;
  52. if(*groupp == nil)
  53. return "uid already exists";
  54. (*groupp)->uid = uid;
  55. errmsg = logfsgroupsetnew(&(*groupp)->members);
  56. if(errmsg) {
  57. logfsmapdeleteentry(gm, uid);
  58. return errmsg;
  59. }
  60. errmsg = logfsmapnewentry(um, uname, unamep);
  61. if(errmsg == nil && *unamep == nil)
  62. errmsg = "uname already exists";
  63. if(errmsg) {
  64. logfsgroupsetfree(&(*groupp)->members);
  65. logfsmapdeleteentry(gm, uid);
  66. return errmsg;
  67. }
  68. (*groupp)->uname = uname;
  69. (*unamep)->uname = uname;
  70. (*unamep)->g = *groupp;
  71. return nil;
  72. }
  73. char *
  74. logfsgroupmapfinduname(GroupMap *m, char *uid)
  75. {
  76. Group *g;
  77. g = logfsgroupmapfindentry(m, uid);
  78. if(g)
  79. return g->uname;
  80. return nil;
  81. }
  82. char *
  83. logfsunamemapfinduid(UnameMap *m, char *uname)
  84. {
  85. Uname *u;
  86. u = logfsunamemapfindentry(m, uname);
  87. if(u)
  88. return u->g->uid;
  89. return nil;
  90. }