X-Git-Url: https://git.distorted.org.uk/~mdw/become/blobdiff_plain/d8cd61fef9f23963bba7a4e2ea460e8edaffaeeb..af4f4d6a77aceba8e2d6f58d15e894df320e7c24:/src/userdb.c diff --git a/src/userdb.c b/src/userdb.c index eb963d0..cf63d9e 100644 --- a/src/userdb.c +++ b/src/userdb.c @@ -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 --------------------------------------------------* @@ -26,29 +26,6 @@ * 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 --- */ @@ -65,22 +42,21 @@ #include -#ifdef HAVE_YP -# include -# include -# include -#endif - #include #include #include +/* --- mLib headers --- */ + +#include +#include +#include + /* --- 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);