blob: 00d8af3b03217033eabe15196200173d70c8091a [file] [log] [blame]
Guido van Rossum20882d51994-06-23 11:15:44 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossum20882d51994-06-23 11:15:44 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossum20882d51994-06-23 11:15:44 +00009******************************************************************/
10
11/* UNIX group file access module */
12
Roger E. Masseb2b44e51996-12-18 19:37:32 +000013#include "Python.h"
Guido van Rossum20882d51994-06-23 11:15:44 +000014
15#include <sys/types.h>
16#include <grp.h>
17
Roger E. Masseb2b44e51996-12-18 19:37:32 +000018static PyObject *mkgrent(p)
Guido van Rossum20882d51994-06-23 11:15:44 +000019 struct group *p;
20{
Roger E. Masseb2b44e51996-12-18 19:37:32 +000021 PyObject *v, *w;
Guido van Rossum20882d51994-06-23 11:15:44 +000022 char **member;
Roger E. Masseb2b44e51996-12-18 19:37:32 +000023 if ((w = PyList_New(0)) == NULL) {
Guido van Rossum20882d51994-06-23 11:15:44 +000024 return NULL;
25 }
26 for (member = p->gr_mem; *member != NULL; member++) {
Roger E. Masseb2b44e51996-12-18 19:37:32 +000027 PyObject *x = PyString_FromString(*member);
28 if (x == NULL || PyList_Append(w, x) != 0) {
29 Py_XDECREF(x);
30 Py_DECREF(w);
Guido van Rossum20882d51994-06-23 11:15:44 +000031 return NULL;
32 }
Barry Warsaw4bc9d391997-01-09 22:22:05 +000033 Py_DECREF(x);
Guido van Rossum20882d51994-06-23 11:15:44 +000034 }
Roger E. Masseb2b44e51996-12-18 19:37:32 +000035 v = Py_BuildValue("(sslO)",
Guido van Rossum20882d51994-06-23 11:15:44 +000036 p->gr_name,
37 p->gr_passwd,
Guido van Rossum03e8ffa1995-02-07 15:38:56 +000038#if defined(NeXT) && defined(_POSIX_SOURCE) && defined(__LITTLE_ENDIAN__)
39/* Correct a bug present on Intel machines in NextStep 3.2 and 3.3;
40 for later versions you may have to remove this */
41 (long)p->gr_short_pad, /* ugh-NeXT broke the padding */
42#else
Guido van Rossum20882d51994-06-23 11:15:44 +000043 (long)p->gr_gid,
Guido van Rossum03e8ffa1995-02-07 15:38:56 +000044#endif
Guido van Rossum20882d51994-06-23 11:15:44 +000045 w);
Roger E. Masseb2b44e51996-12-18 19:37:32 +000046 Py_DECREF(w);
Guido van Rossum20882d51994-06-23 11:15:44 +000047 return v;
48}
49
Roger E. Masseb2b44e51996-12-18 19:37:32 +000050static PyObject *grp_getgrgid(self, args)
51 PyObject *self, *args;
Guido van Rossum20882d51994-06-23 11:15:44 +000052{
53 int gid;
54 struct group *p;
Roger E. Masseec0b4af1996-12-18 20:07:39 +000055 if (!PyArg_Parse((args),"i",(&gid)))
Guido van Rossum20882d51994-06-23 11:15:44 +000056 return NULL;
57 if ((p = getgrgid(gid)) == NULL) {
Roger E. Masseb2b44e51996-12-18 19:37:32 +000058 PyErr_SetString(PyExc_KeyError, "getgrgid(): gid not found");
Guido van Rossum20882d51994-06-23 11:15:44 +000059 return NULL;
60 }
61 return mkgrent(p);
62}
63
Roger E. Masseb2b44e51996-12-18 19:37:32 +000064static PyObject *grp_getgrnam(self, args)
65 PyObject *self, *args;
Guido van Rossum20882d51994-06-23 11:15:44 +000066{
67 char *name;
68 struct group *p;
Roger E. Masseec0b4af1996-12-18 20:07:39 +000069 if (!PyArg_Parse((args),"s",(&name)))
Guido van Rossum20882d51994-06-23 11:15:44 +000070 return NULL;
71 if ((p = getgrnam(name)) == NULL) {
Roger E. Masseb2b44e51996-12-18 19:37:32 +000072 PyErr_SetString(PyExc_KeyError, "getgrnam(): name not found");
Guido van Rossum20882d51994-06-23 11:15:44 +000073 return NULL;
74 }
75 return mkgrent(p);
76}
77
Roger E. Masseb2b44e51996-12-18 19:37:32 +000078static PyObject *grp_getgrall(self, args)
79 PyObject *self, *args;
Guido van Rossum20882d51994-06-23 11:15:44 +000080{
Roger E. Masseb2b44e51996-12-18 19:37:32 +000081 PyObject *d;
Guido van Rossum20882d51994-06-23 11:15:44 +000082 struct group *p;
Roger E. Masseb2b44e51996-12-18 19:37:32 +000083 if (!PyArg_NoArgs(args))
Guido van Rossum20882d51994-06-23 11:15:44 +000084 return NULL;
Roger E. Masseb2b44e51996-12-18 19:37:32 +000085 if ((d = PyList_New(0)) == NULL)
Guido van Rossum20882d51994-06-23 11:15:44 +000086 return NULL;
87 setgrent();
88 while ((p = getgrent()) != NULL) {
Roger E. Masseb2b44e51996-12-18 19:37:32 +000089 PyObject *v = mkgrent(p);
90 if (v == NULL || PyList_Append(d, v) != 0) {
91 Py_XDECREF(v);
92 Py_DECREF(d);
Guido van Rossum20882d51994-06-23 11:15:44 +000093 return NULL;
94 }
Barry Warsaw4bc9d391997-01-09 22:22:05 +000095 Py_DECREF(v);
Guido van Rossum20882d51994-06-23 11:15:44 +000096 }
97 return d;
98}
99
Roger E. Masseb2b44e51996-12-18 19:37:32 +0000100static PyMethodDef grp_methods[] = {
Guido van Rossum20882d51994-06-23 11:15:44 +0000101 {"getgrgid", grp_getgrgid},
102 {"getgrnam", grp_getgrnam},
103 {"getgrall", grp_getgrall},
104 {NULL, NULL} /* sentinel */
105};
106
Guido van Rossum3886bb61998-12-04 18:50:17 +0000107DL_EXPORT(void)
Guido van Rossum20882d51994-06-23 11:15:44 +0000108initgrp()
109{
Roger E. Masseb2b44e51996-12-18 19:37:32 +0000110 Py_InitModule("grp", grp_methods);
Guido van Rossum20882d51994-06-23 11:15:44 +0000111}