diff options
-rw-r--r-- | Modules/grpmodule.c | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/Modules/grpmodule.c b/Modules/grpmodule.c new file mode 100644 index 0000000..edb50cf --- /dev/null +++ b/Modules/grpmodule.c @@ -0,0 +1,118 @@ +/*********************************************************** +Copyright 1991, 1992, 1993, 1994 by Stichting Mathematisch Centrum, +Amsterdam, The Netherlands. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the names of Stichting Mathematisch +Centrum or CWI not be used in advertising or publicity pertaining to +distribution of the software without specific, written prior permission. + +STICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO +THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE +FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT +OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +******************************************************************/ + +/* UNIX group file access module */ + +#include "allobjects.h" +#include "modsupport.h" + +#include <sys/types.h> +#include <grp.h> + +static object *mkgrent(p) + struct group *p; +{ + object *v, *w; + char **member; + if ((w = newlistobject(0)) == NULL) { + return NULL; + } + for (member = p->gr_mem; *member != NULL; member++) { + object *x = newstringobject(*member); + if (x == NULL || addlistitem(w, x) != 0) { + XDECREF(x); + DECREF(w); + return NULL; + } + } + v = mkvalue("(sslO)", + p->gr_name, + p->gr_passwd, + (long)p->gr_gid, + w); + DECREF(w); + return v; +} + +static object *grp_getgrgid(self, args) + object *self, *args; +{ + int gid; + struct group *p; + if (!getintarg(args, &gid)) + return NULL; + if ((p = getgrgid(gid)) == NULL) { + err_setstr(KeyError, "getgrgid(): gid not found"); + return NULL; + } + return mkgrent(p); +} + +static object *grp_getgrnam(self, args) + object *self, *args; +{ + char *name; + struct group *p; + if (!getstrarg(args, &name)) + return NULL; + if ((p = getgrnam(name)) == NULL) { + err_setstr(KeyError, "getgrnam(): name not found"); + return NULL; + } + return mkgrent(p); +} + +static object *grp_getgrall(self, args) + object *self, *args; +{ + object *d; + struct group *p; + if (!getnoarg(args)) + return NULL; + if ((d = newlistobject(0)) == NULL) + return NULL; + setgrent(); + while ((p = getgrent()) != NULL) { + object *v = mkgrent(p); + if (v == NULL || addlistitem(d, v) != 0) { + XDECREF(v); + DECREF(d); + return NULL; + } + } + return d; +} + +static struct methodlist grp_methods[] = { + {"getgrgid", grp_getgrgid}, + {"getgrnam", grp_getgrnam}, + {"getgrall", grp_getgrall}, + {NULL, NULL} /* sentinel */ +}; + +void +initgrp() +{ + initmodule("grp", grp_methods); +} |