pwdmodule.c 3.04 KB
Newer Older
Guido van Rossum's avatar
Guido van Rossum committed
1

2
/* UNIX password file access module */
Guido van Rossum's avatar
Guido van Rossum committed
3

Barry Warsaw's avatar
Barry Warsaw committed
4
#include "Python.h"
Guido van Rossum's avatar
Guido van Rossum committed
5 6 7 8

#include <sys/types.h>
#include <pwd.h>

9 10 11 12 13 14 15 16 17 18 19
static char pwd__doc__ [] = "\
This module provides access to the Unix password database.\n\
It is available on all Unix versions.\n\
\n\
Password database entries are reported as 7-tuples containing the following\n\
items from the password database (see `<pwd.h>'), in order:\n\
pw_name, pw_passwd, pw_uid, pw_gid, pw_gecos, pw_dir, pw_shell.\n\
The uid and gid items are integers, all others are strings. An\n\
exception is raised if the entry asked for cannot be found.";

      
Barry Warsaw's avatar
Barry Warsaw committed
20
static PyObject *
Peter Schneider-Kamp's avatar
Peter Schneider-Kamp committed
21
mkpwent(struct passwd *p)
Guido van Rossum's avatar
Guido van Rossum committed
22
{
Barry Warsaw's avatar
Barry Warsaw committed
23 24 25 26
	return Py_BuildValue(
		"(ssllsss)",
		p->pw_name,
		p->pw_passwd,
27 28 29
#if defined(NeXT) && defined(_POSIX_SOURCE) && defined(__LITTLE_ENDIAN__)
/* Correct a bug present on Intel machines in NextStep 3.2 and 3.3;
   for later versions you may have to remove this */
Barry Warsaw's avatar
Barry Warsaw committed
30 31
		(long)p->pw_short_pad1,	     /* ugh-NeXT broke the padding */
		(long)p->pw_short_pad2,
32
#else
Barry Warsaw's avatar
Barry Warsaw committed
33 34
		(long)p->pw_uid,
		(long)p->pw_gid,
35
#endif
Barry Warsaw's avatar
Barry Warsaw committed
36 37 38
		p->pw_gecos,
		p->pw_dir,
		p->pw_shell);
Guido van Rossum's avatar
Guido van Rossum committed
39 40
}

41 42 43 44 45
static char pwd_getpwuid__doc__[] = "\
getpwuid(uid) -> entry\n\
Return the password database entry for the given numeric user ID.\n\
See pwd.__doc__ for more on password database entries.";

Barry Warsaw's avatar
Barry Warsaw committed
46
static PyObject *
Peter Schneider-Kamp's avatar
Peter Schneider-Kamp committed
47
pwd_getpwuid(PyObject *self, PyObject *args)
Guido van Rossum's avatar
Guido van Rossum committed
48 49 50
{
	int uid;
	struct passwd *p;
Barry Warsaw's avatar
Barry Warsaw committed
51
	if (!PyArg_Parse(args, "i", &uid))
Guido van Rossum's avatar
Guido van Rossum committed
52 53
		return NULL;
	if ((p = getpwuid(uid)) == NULL) {
Barry Warsaw's avatar
Barry Warsaw committed
54
		PyErr_SetString(PyExc_KeyError, "getpwuid(): uid not found");
Guido van Rossum's avatar
Guido van Rossum committed
55 56 57 58 59
		return NULL;
	}
	return mkpwent(p);
}

60 61 62 63 64
static char pwd_getpwnam__doc__[] = "\
getpwnam(name) -> entry\n\
Return the password database entry for the given user name.\n\
See pwd.__doc__ for more on password database entries.";

Barry Warsaw's avatar
Barry Warsaw committed
65
static PyObject *
Peter Schneider-Kamp's avatar
Peter Schneider-Kamp committed
66
pwd_getpwnam(PyObject *self, PyObject *args)
Guido van Rossum's avatar
Guido van Rossum committed
67
{
68
	char *name;
Guido van Rossum's avatar
Guido van Rossum committed
69
	struct passwd *p;
Barry Warsaw's avatar
Barry Warsaw committed
70
	if (!PyArg_Parse(args, "s", &name))
Guido van Rossum's avatar
Guido van Rossum committed
71
		return NULL;
72
	if ((p = getpwnam(name)) == NULL) {
Barry Warsaw's avatar
Barry Warsaw committed
73
		PyErr_SetString(PyExc_KeyError, "getpwnam(): name not found");
Guido van Rossum's avatar
Guido van Rossum committed
74 75 76 77 78
		return NULL;
	}
	return mkpwent(p);
}

79
#ifdef HAVE_GETPWENT
80 81 82 83 84 85
static char pwd_getpwall__doc__[] = "\
getpwall() -> list_of_entries\n\
Return a list of all available password database entries, \
in arbitrary order.\n\
See pwd.__doc__ for more on password database entries.";

Barry Warsaw's avatar
Barry Warsaw committed
86
static PyObject *
Peter Schneider-Kamp's avatar
Peter Schneider-Kamp committed
87
pwd_getpwall(PyObject *self, PyObject *args)
Guido van Rossum's avatar
Guido van Rossum committed
88
{
Barry Warsaw's avatar
Barry Warsaw committed
89
	PyObject *d;
Guido van Rossum's avatar
Guido van Rossum committed
90
	struct passwd *p;
Barry Warsaw's avatar
Barry Warsaw committed
91
	if (!PyArg_NoArgs(args))
Guido van Rossum's avatar
Guido van Rossum committed
92
		return NULL;
Barry Warsaw's avatar
Barry Warsaw committed
93
	if ((d = PyList_New(0)) == NULL)
Guido van Rossum's avatar
Guido van Rossum committed
94 95 96
		return NULL;
	setpwent();
	while ((p = getpwent()) != NULL) {
Barry Warsaw's avatar
Barry Warsaw committed
97 98 99 100
		PyObject *v = mkpwent(p);
		if (v == NULL || PyList_Append(d, v) != 0) {
			Py_XDECREF(v);
			Py_DECREF(d);
Guido van Rossum's avatar
Guido van Rossum committed
101 102
			return NULL;
		}
103
		Py_DECREF(v);
Guido van Rossum's avatar
Guido van Rossum committed
104 105 106
	}
	return d;
}
107
#endif
Guido van Rossum's avatar
Guido van Rossum committed
108

Barry Warsaw's avatar
Barry Warsaw committed
109
static PyMethodDef pwd_methods[] = {
110 111
	{"getpwuid",	pwd_getpwuid, METH_OLDARGS, pwd_getpwuid__doc__},
	{"getpwnam",	pwd_getpwnam, METH_OLDARGS, pwd_getpwnam__doc__},
112
#ifdef HAVE_GETPWENT
113
	{"getpwall",	pwd_getpwall, METH_OLDARGS, pwd_getpwall__doc__},
114
#endif
Guido van Rossum's avatar
Guido van Rossum committed
115 116 117
	{NULL,		NULL}		/* sentinel */
};

118
DL_EXPORT(void)
119
initpwd(void)
Guido van Rossum's avatar
Guido van Rossum committed
120
{
121 122
	Py_InitModule4("pwd", pwd_methods, pwd__doc__,
                       (PyObject *)NULL, PYTHON_API_VERSION);
Guido van Rossum's avatar
Guido van Rossum committed
123
}