Expunge revision histories in files.
[become] / src / userdb.c
index eb963d0..cf63d9e 100644 (file)
@@ -1,10 +1,10 @@
 /* -*-c-*-
  *
- * $Id: userdb.c,v 1.5 1997/09/17 10:24:08 mdw Exp $
+ * $Id: userdb.c,v 1.11 2004/04/08 01:36:20 mdw Exp $
  *
  * User database management
  *
- * (c) 1997 EBI
+ * (c) 1998 EBI
  */
 
 /*----- Licensing notice --------------------------------------------------*
  * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-/*----- Revision history --------------------------------------------------*
- *
- * $Log: userdb.c,v $
- * Revision 1.5  1997/09/17 10:24:08  mdw
- * Use `uid_t' instead of `int' for uids and gids.  Not quite sure why I
- * didn't do this before.
- *
- * Revision 1.4  1997/08/20  16:24:58  mdw
- * Patch memory leak.  Rename `userdb_reinit' to `userdb_end' for more
- * sensible restart.
- *
- * Revision 1.3  1997/08/07 09:44:29  mdw
- * Read NIS-based passwords from the YP server directly, rather than using
- * `popen(ypcat)', which is probably both slower and less secure.
- *
- * Revision 1.2  1997/08/04 10:24:26  mdw
- * Sources placed under CVS control.
- *
- * Revision 1.1  1997/07/21  13:47:43  mdw
- * Initial revision
- *
- */
-
 /*----- Header files ------------------------------------------------------*/
 
 /* --- ANSI headers --- */
 
 #include <sys/types.h>
 
-#ifdef HAVE_YP
-#  include <rpc/rpc.h>
-#  include <rpcsvc/ypclnt.h>
-#  include <rpcsvc/yp_prot.h>
-#endif
-
 #include <grp.h>
 #include <pwd.h>
 #include <unistd.h>
 
+/* --- mLib headers --- */
+
+#include <mLib/alloc.h>
+#include <mLib/sym.h>
+#include <mLib/trace.h>
+
 /* --- Local headers --- */
 
 #include "become.h"
-#include "sym.h"
 #include "userdb.h"
-#include "utils.h"
+#include "ypstuff.h"
 
 /*----- Type definitions --------------------------------------------------*/
 
@@ -126,8 +102,8 @@ static sym_iter userdb__groupi;             /* Iterator for groups */
 
 static void userdb__createMap(userdb__map *m)
 {
-  sym_createTable(&m->nmap);
-  sym_createTable(&m->idmap);
+  sym_create(&m->nmap);
+  sym_create(&m->idmap);
   m->list = 0;
 }
 
@@ -212,8 +188,8 @@ static void userdb__clearMap(userdb__map *m, void (*freerec)(void *rec))
 {
   userdb__node *n, *t;
 
-  sym_destroyTable(&m->nmap);
-  sym_destroyTable(&m->idmap);
+  sym_destroy(&m->nmap);
+  sym_destroy(&m->idmap);
 
   for (n = m->list; n; n = t) {
     t = n->next;
@@ -233,7 +209,7 @@ static void userdb__clearMap(userdb__map *m, void (*freerec)(void *rec))
  * Use:                Writes a user's informationt to a stream.
  */
 
-#ifdef TRACING
+#ifndef NTRACE
 
 static void userdb__dumpUser(const struct passwd *pw)
 {
@@ -247,6 +223,39 @@ static void userdb__dumpUser(const struct passwd *pw)
 
 #endif
 
+/* --- @userdb__split@ --- *
+ *
+ * Arguments:  @char *p@ = pointer to string
+ *             @char **v@ = pointer to vector to fill in
+ *             @int sz@ = maximum number of fields to split
+ *
+ * Returns:    Number of fields extracted.
+ *
+ * Use:                Splits a string into fields at colon characters.
+ */
+
+static int userdb__split(char *p, char **v, int sz)
+{
+  int count = 0;
+
+  *v++ = p; sz--; count++;
+  if (!sz)
+    goto done;
+  while (*p) {
+    if (*p++ == ':') {
+      p[-1] = 0;
+      *v++ = p; sz--; count++;
+      if (!sz)
+       goto done;
+    }
+  }
+  while (sz--)
+    *v++ = 0;
+
+done:
+  return (count);
+}
+
 /* --- @userdb_copyUser@ --- *
  *
  * Arguments:  @struct passwd *pw@ = pointer to block to copy
@@ -292,30 +301,21 @@ struct passwd *userdb_copyUser(struct passwd *pw)
 static struct passwd *userdb__buildUser(char *s)
 {
   struct passwd *pw = xmalloc(sizeof(*pw));
+  char *v[7];
 
-  s = strtok(s, ":"); if (!s) goto tidy_0; pw->pw_name = xstrdup(s);
-  s = strtok(0, ":"); if (!s) goto tidy_1; pw->pw_passwd = xstrdup(s);
-  s = strtok(0, ":"); if (!s) goto tidy_2; pw->pw_uid = (uid_t)atol(s);
-  s = strtok(0, ":"); if (!s) goto tidy_2; pw->pw_gid = (gid_t)atol(s);
-  s = strtok(0, ":"); if (!s) goto tidy_2; pw->pw_gecos = xstrdup(s);
-  s = strtok(0, ":"); if (!s) goto tidy_3; pw->pw_dir = xstrdup(s);
-  s = strtok(0, ":"); if (!s) goto tidy_4; pw->pw_shell = xstrdup(s);
-  return (pw);
-
-  /* --- Error handling --- */
-
-tidy_4:
-  free(pw->pw_dir);
-tidy_3:
-  free(pw->pw_gecos);
-tidy_2:
-  free(pw->pw_passwd);
-tidy_1:
-  free(pw->pw_name);
-tidy_0:
-  free(pw);
+  if (userdb__split(s, v, 7) < 7) {
+    free(pw);
+    return (0);
+  }
 
-  return (0);
+  pw->pw_name = xstrdup(v[0]);
+  pw->pw_passwd = xstrdup(v[1]);
+  pw->pw_uid = (uid_t)atol(v[2]);
+  pw->pw_gid = (gid_t)atol(v[3]);
+  pw->pw_gecos = xstrdup(v[4]);
+  pw->pw_dir = xstrdup(v[5]);
+  pw->pw_shell = xstrdup(v[6]);
+  return (pw);
 }
 
 /* --- @userdb_freeUser@ --- *
@@ -353,7 +353,7 @@ void userdb_freeUser(void *rec)
  * Use:                Writes a group's information to a stream.
  */
 
-#ifdef TRACING
+#ifndef NTRACE
 
 static void userdb__dumpGroup(const struct group *gr)
 {
@@ -416,55 +416,46 @@ struct group *userdb_copyGroup(struct group *gr)
 static struct group *userdb__buildGroup(char *s)
 {
   struct group *gr = xmalloc(sizeof(*gr));
-  char *p;
+  char *v[4];
   int i;
 
   /* --- Do the easy bits --- */
 
-  s = strtok(s, ":"); if (!s) goto tidy_0; gr->gr_name = xstrdup(s);
-  s = strtok(0, ":"); if (!s) goto tidy_1; gr->gr_passwd = xstrdup(s);
-  s = strtok(0, ":"); if (!s) goto tidy_2; gr->gr_gid = (gid_t)atol(s);
-
-  /* --- Find the start of the member list --- */
-
-  s = strtok(0, "");
-  if (!s)
-    goto tidy_2;
+  if (userdb__split(s, v, 4) < 3) {
+    free(gr);
+    return (0);
+  }
+  gr->gr_name = xstrdup(v[0]);
+  gr->gr_passwd = xstrdup(v[1]);
+  gr->gr_gid = (gid_t)atol(v[2]);
 
   /* --- Count the number of members --- */
 
-  p = s;
+  s = v[3];
   i = 0;
-  for (;;) {
-    i++;
-    if ((p = strpbrk(p, ",")) == 0)
-      break;
-    p++;
+  if (s && s[0]) {
+    for (;;) {
+      i++;
+      if ((s = strpbrk(s, ",")) == 0)
+       break;
+      s++;
+    }
   }
 
   /* --- Allocate the block and fill it --- */
 
   gr->gr_mem = xmalloc((i + 1) * sizeof(char *));
   i = 0;
-  s = strtok(s, ",");
-  do {
-    gr->gr_mem[i++] = xstrdup(s);
-    s = strtok(0, ",");
-  } while (s);
+  if (v[3]) {
+    s = strtok(v[3], ",");
+    while (s) {
+      gr->gr_mem[i++] = xstrdup(s);
+      s = strtok(0, ",");
+    }
+  }
   gr->gr_mem[i] = 0;
 
   return (gr);
-
-  /* --- Various tidying-up things --- */
-
-tidy_2:
-  free(gr->gr_passwd);
-tidy_1:
-  free(gr->gr_name);
-tidy_0:
-  free(gr);
-
-  return (0);
 }
 
 /* --- @userdb_freeGroup@ --- *
@@ -524,7 +515,7 @@ void userdb_iterateUsers(void)
 { userdb_iterateUsers_r(&userdb__useri); }
 
 void userdb_iterateUsers_r(userdb_iter *i)
-{ sym_createIter(i, &userdb__users.nmap); }
+{ sym_mkiter(i, &userdb__users.nmap); }
 
 /* --- @userdb_nextUser@, @userdb_nextUser_r@ --- *
  *
@@ -573,7 +564,7 @@ void userdb_iterateGroups(void)
 { userdb_iterateGroups_r(&userdb__groupi); }
 
 void userdb_iterateGroups_r(userdb_iter *i)
-{ sym_createIter(i, &userdb__groups.nmap); }
+{ sym_mkiter(i, &userdb__groups.nmap); }
 
 /* --- @userdb_nextGroup@, @userdb_nextGroup_r@ --- *
  *
@@ -680,12 +671,10 @@ static int userdb__foreachGroup(int st, char *k, int ksz,
 
 void userdb_yp(void)
 {
-  char *ypdom;
-
   /* --- Bind to a server --- */
 
-  if (yp_get_default_domain(&ypdom) ||
-      yp_bind(ypdom))
+  ypstuff_bind();
+  if (!yp_domain)
     return;
 
   T( trace(TRACE_DEBUG, "debug: adding NIS users"); )
@@ -694,17 +683,15 @@ void userdb_yp(void)
 
   {
     static struct ypall_callback ucb = { userdb__foreachUser, 0 };
-    yp_all(ypdom, "passwd.byuid", &ucb);
+    yp_all(yp_domain, "passwd.byuid", &ucb);
   }
 
   /* --- Fetch the groups map --- */
 
   {
     static struct ypall_callback gcb = { userdb__foreachGroup, 0 };
-    yp_all(ypdom, "group.bygid", &gcb);
+    yp_all(yp_domain, "group.bygid", &gcb);
   }
-
-  yp_unbind(ypdom);
 }
 
 #else
@@ -813,20 +800,21 @@ void dumpit(const char *msg)
 int main(void)
 {
   ego("userdb-test");
-/*   traceon(stdout, TRACE_ALL); */
+  trace_on(stdout, TRACE_ALL);
   userdb_init();
   userdb_local();
   userdb_yp();
-  printf("loaded (%lu)\n", track_memused());
+  dumpit("spong");
+/*  printf("loaded (%lu)\n", track_memused()); */
   getchar();
   for (;;) {
     userdb_end();
-    printf("cleared (%lu)\n", track_memused());
+/*    printf("cleared (%lu)\n", track_memused()); */
 /*    track_memlist(); */
     userdb_init();
     userdb_local();
     userdb_yp();
-    printf("reloaded (%lu)\n", track_memused());
+/*    printf("reloaded (%lu)\n", track_memused()); */
     getchar();
   }
   return (0);