]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Initial revision
authorGuido van Rossum <guido@python.org>
Wed, 10 Apr 1991 19:48:25 +0000 (19:48 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 10 Apr 1991 19:48:25 +0000 (19:48 +0000)
Modules/pwdmodule.c [new file with mode: 0644]

diff --git a/Modules/pwdmodule.c b/Modules/pwdmodule.c
new file mode 100644 (file)
index 0000000..d8efca8
--- /dev/null
@@ -0,0 +1,222 @@
+/***********************************************************
+Copyright 1991 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.
+
+******************************************************************/
+
+/* Passwd/group file access module */
+
+#include "allobjects.h"
+#include "modsupport.h"
+
+#include <sys/types.h>
+#include <pwd.h>
+#include <grp.h>
+
+
+/* Module pwd */
+
+
+static object *mkpwent(p)
+       struct passwd *p;
+{
+       object *v;
+       if ((v = newtupleobject(7)) == NULL)
+               return NULL;
+#define ISET(i, member) settupleitem(v, i, newintobject((long)p->member))
+#define SSET(i, member) settupleitem(v, i, newstringobject(p->member))
+       SSET(0, pw_name);
+       SSET(1, pw_passwd);
+       ISET(2, pw_uid);
+       ISET(3, pw_gid);
+       SSET(4, pw_gecos);
+       SSET(5, pw_dir);
+       SSET(6, pw_shell);
+#undef SSET
+#undef ISET
+       if (err_occurred()) {
+               DECREF(v);
+               return NULL;
+       }
+       return v;
+}
+
+static object *pwd_getpwuid(self, args)
+       object *self, *args;
+{
+       int uid;
+       struct passwd *p;
+       if (!getintarg(args, &uid))
+               return NULL;
+       if ((p = getpwuid(uid)) == NULL) {
+               err_setstr(RuntimeError, "getpwuid(): uid not found");
+               return NULL;
+       }
+       return mkpwent(p);
+}
+
+static object *pwd_getpwnam(self, args)
+       object *self, *args;
+{
+       object *name;
+       struct passwd *p;
+       if (!getstrarg(args, &name))
+               return NULL;
+       if ((p = getpwnam(getstringvalue(name))) == NULL) {
+               err_setstr(RuntimeError, "getpwnam(): name not found");
+               return NULL;
+       }
+       return mkpwent(p);
+}
+
+static object *pwd_getpwall(self, args)
+       object *self, *args;
+{
+       object *d;
+       struct passwd *p;
+       if (!getnoarg(args))
+               return NULL;
+       if ((d = newlistobject(0)) == NULL)
+               return NULL;
+       setpwent();
+       while ((p = getpwent()) != NULL) {
+               object *v = mkpwent(p);
+               if (v == NULL || addlistitem(d, v) != 0) {
+                       XDECREF(v);
+                       DECREF(d);
+                       return NULL;
+               }
+       }
+       return d;
+}
+
+static struct methodlist pwd_methods[] = {
+       {"getpwuid",    pwd_getpwuid},
+       {"getpwnam",    pwd_getpwnam},
+       {"getpwall",    pwd_getpwall},
+       {NULL,          NULL}           /* sentinel */
+};
+
+void
+initpwd()
+{
+       initmodule("pwd", pwd_methods);
+}
+
+
+/* Module grp */
+
+
+static object *mkgrent(p)
+       struct group *p;
+{
+       object *v, *w;
+       char **member;
+       if ((v = newtupleobject(4)) == NULL)
+               return NULL;
+#define ISET(i, member) settupleitem(v, i, newintobject((long)p->member))
+#define SSET(i, member) settupleitem(v, i, newstringobject(p->member))
+       SSET(0, gr_name);
+       SSET(1, gr_passwd);
+       ISET(2, gr_gid);
+#undef SSET
+#undef ISET
+       if (err_occurred()) {
+               DECREF(v);
+               return NULL;
+       }
+       if ((w = newlistobject(0)) == NULL) {
+               DECREF(v);
+               return NULL;
+       }
+       (void) settupleitem(v, 3, w); /* Cannot fail; eats refcnt */
+       for (member = p->gr_mem; *member != NULL; member++) {
+               object *x = newstringobject(*member);
+               if (x == NULL || addlistitem(w, x) != 0) {
+                       XDECREF(x);
+                       DECREF(v);
+                       return NULL;
+               }
+       }
+       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(RuntimeError, "getgrgid(): gid not found");
+               return NULL;
+       }
+       return mkgrent(p);
+}
+
+static object *grp_getgrnam(self, args)
+       object *self, *args;
+{
+       object *name;
+       struct group *p;
+       if (!getstrarg(args, &name))
+               return NULL;
+       if ((p = getgrnam(getstringvalue(name))) == NULL) {
+               err_setstr(RuntimeError, "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);
+}