blob: eac1b9987ff7807682f03885619f8562b73dcc50 [file] [log] [blame]
Guido van Rossum20882d51994-06-23 11:15:44 +00001/***********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossum20882d51994-06-23 11:15:44 +00004
5 All Rights Reserved
6
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007Copyright (c) 2000, BeOpen.com.
8Copyright (c) 1995-2000, Corporation for National Research Initiatives.
9Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
10All rights reserved.
Guido van Rossum20882d51994-06-23 11:15:44 +000011
Guido van Rossumfd71b9e2000-06-30 23:50:40 +000012See the file "Misc/COPYRIGHT" for information on usage and
13redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossum20882d51994-06-23 11:15:44 +000014
15******************************************************************/
16
17/* UNIX group file access module */
18
Roger E. Masseb2b44e51996-12-18 19:37:32 +000019#include "Python.h"
Guido van Rossum20882d51994-06-23 11:15:44 +000020
21#include <sys/types.h>
22#include <grp.h>
23
Roger E. Masseb2b44e51996-12-18 19:37:32 +000024static PyObject *mkgrent(p)
Guido van Rossum20882d51994-06-23 11:15:44 +000025 struct group *p;
26{
Roger E. Masseb2b44e51996-12-18 19:37:32 +000027 PyObject *v, *w;
Guido van Rossum20882d51994-06-23 11:15:44 +000028 char **member;
Roger E. Masseb2b44e51996-12-18 19:37:32 +000029 if ((w = PyList_New(0)) == NULL) {
Guido van Rossum20882d51994-06-23 11:15:44 +000030 return NULL;
31 }
32 for (member = p->gr_mem; *member != NULL; member++) {
Roger E. Masseb2b44e51996-12-18 19:37:32 +000033 PyObject *x = PyString_FromString(*member);
34 if (x == NULL || PyList_Append(w, x) != 0) {
35 Py_XDECREF(x);
36 Py_DECREF(w);
Guido van Rossum20882d51994-06-23 11:15:44 +000037 return NULL;
38 }
Barry Warsaw4bc9d391997-01-09 22:22:05 +000039 Py_DECREF(x);
Guido van Rossum20882d51994-06-23 11:15:44 +000040 }
Roger E. Masseb2b44e51996-12-18 19:37:32 +000041 v = Py_BuildValue("(sslO)",
Guido van Rossum20882d51994-06-23 11:15:44 +000042 p->gr_name,
43 p->gr_passwd,
Guido van Rossum03e8ffa1995-02-07 15:38:56 +000044#if defined(NeXT) && defined(_POSIX_SOURCE) && defined(__LITTLE_ENDIAN__)
45/* Correct a bug present on Intel machines in NextStep 3.2 and 3.3;
46 for later versions you may have to remove this */
47 (long)p->gr_short_pad, /* ugh-NeXT broke the padding */
48#else
Guido van Rossum20882d51994-06-23 11:15:44 +000049 (long)p->gr_gid,
Guido van Rossum03e8ffa1995-02-07 15:38:56 +000050#endif
Guido van Rossum20882d51994-06-23 11:15:44 +000051 w);
Roger E. Masseb2b44e51996-12-18 19:37:32 +000052 Py_DECREF(w);
Guido van Rossum20882d51994-06-23 11:15:44 +000053 return v;
54}
55
Roger E. Masseb2b44e51996-12-18 19:37:32 +000056static PyObject *grp_getgrgid(self, args)
57 PyObject *self, *args;
Guido van Rossum20882d51994-06-23 11:15:44 +000058{
59 int gid;
60 struct group *p;
Roger E. Masseec0b4af1996-12-18 20:07:39 +000061 if (!PyArg_Parse((args),"i",(&gid)))
Guido van Rossum20882d51994-06-23 11:15:44 +000062 return NULL;
63 if ((p = getgrgid(gid)) == NULL) {
Roger E. Masseb2b44e51996-12-18 19:37:32 +000064 PyErr_SetString(PyExc_KeyError, "getgrgid(): gid not found");
Guido van Rossum20882d51994-06-23 11:15:44 +000065 return NULL;
66 }
67 return mkgrent(p);
68}
69
Roger E. Masseb2b44e51996-12-18 19:37:32 +000070static PyObject *grp_getgrnam(self, args)
71 PyObject *self, *args;
Guido van Rossum20882d51994-06-23 11:15:44 +000072{
73 char *name;
74 struct group *p;
Roger E. Masseec0b4af1996-12-18 20:07:39 +000075 if (!PyArg_Parse((args),"s",(&name)))
Guido van Rossum20882d51994-06-23 11:15:44 +000076 return NULL;
77 if ((p = getgrnam(name)) == NULL) {
Roger E. Masseb2b44e51996-12-18 19:37:32 +000078 PyErr_SetString(PyExc_KeyError, "getgrnam(): name not found");
Guido van Rossum20882d51994-06-23 11:15:44 +000079 return NULL;
80 }
81 return mkgrent(p);
82}
83
Roger E. Masseb2b44e51996-12-18 19:37:32 +000084static PyObject *grp_getgrall(self, args)
85 PyObject *self, *args;
Guido van Rossum20882d51994-06-23 11:15:44 +000086{
Roger E. Masseb2b44e51996-12-18 19:37:32 +000087 PyObject *d;
Guido van Rossum20882d51994-06-23 11:15:44 +000088 struct group *p;
Roger E. Masseb2b44e51996-12-18 19:37:32 +000089 if (!PyArg_NoArgs(args))
Guido van Rossum20882d51994-06-23 11:15:44 +000090 return NULL;
Roger E. Masseb2b44e51996-12-18 19:37:32 +000091 if ((d = PyList_New(0)) == NULL)
Guido van Rossum20882d51994-06-23 11:15:44 +000092 return NULL;
93 setgrent();
94 while ((p = getgrent()) != NULL) {
Roger E. Masseb2b44e51996-12-18 19:37:32 +000095 PyObject *v = mkgrent(p);
96 if (v == NULL || PyList_Append(d, v) != 0) {
97 Py_XDECREF(v);
98 Py_DECREF(d);
Guido van Rossum20882d51994-06-23 11:15:44 +000099 return NULL;
100 }
Barry Warsaw4bc9d391997-01-09 22:22:05 +0000101 Py_DECREF(v);
Guido van Rossum20882d51994-06-23 11:15:44 +0000102 }
103 return d;
104}
105
Roger E. Masseb2b44e51996-12-18 19:37:32 +0000106static PyMethodDef grp_methods[] = {
Guido van Rossum20882d51994-06-23 11:15:44 +0000107 {"getgrgid", grp_getgrgid},
108 {"getgrnam", grp_getgrnam},
109 {"getgrall", grp_getgrall},
110 {NULL, NULL} /* sentinel */
111};
112
Guido van Rossum3886bb61998-12-04 18:50:17 +0000113DL_EXPORT(void)
Guido van Rossum20882d51994-06-23 11:15:44 +0000114initgrp()
115{
Roger E. Masseb2b44e51996-12-18 19:37:32 +0000116 Py_InitModule("grp", grp_methods);
Guido van Rossum20882d51994-06-23 11:15:44 +0000117}