/* UNIX shadow password file access module *//* A lot of code has been taken from pwdmodule.c *//* For info also see http://www.unixpapa.com/incnote/passwd.html */#include "Python.h"#include "structseq.h"#include <sys/types.h>#ifdef HAVE_SHADOW_H#include <shadow.h>#endifPyDoc_STRVAR(spwd__doc__,"This module provides access to the Unix shadow password database.\n\It is available on various Unix versions.\n\\n\Shadow password database entries are reported as 9-tuples of type struct_spwd,\n\containing the following items from the password database (see `<shadow.h>'):\n\sp_namp, sp_pwdp, sp_lstchg, sp_min, sp_max, sp_warn, sp_inact, sp_expire, sp_flag.\n\The sp_namp and sp_pwdp are strings, the rest are integers.\n\An exception is raised if the entry asked for cannot be found.\n\You have to be root to be able to use this module.");#if defined(HAVE_GETSPNAM) || defined(HAVE_GETSPENT)static PyStructSequence_Field struct_spwd_type_fields[] = {{"sp_nam", "login name"},{"sp_pwd", "encrypted password"},{"sp_lstchg", "date of last change"},{"sp_min", "min #days between changes"},{"sp_max", "max #days between changes"},{"sp_warn", "#days before pw expires to warn user about it"},{"sp_inact", "#days after pw expires until account is blocked"},{"sp_expire", "#days since 1970年01月01日 until account is disabled"},{"sp_flag", "reserved"},{0}};PyDoc_STRVAR(struct_spwd__doc__,"spwd.struct_spwd: Results from getsp*() routines.\n\n\This object may be accessed either as a 9-tuple of\n\(sp_nam,sp_pwd,sp_lstchg,sp_min,sp_max,sp_warn,sp_inact,sp_expire,sp_flag)\n\or via the object attributes as named in the above tuple.");static PyStructSequence_Desc struct_spwd_type_desc = {"spwd.struct_spwd",struct_spwd__doc__,struct_spwd_type_fields,9,};static int initialized;static PyTypeObject StructSpwdType;static voidsets(PyObject *v, int i, char* val){if (val)PyStructSequence_SET_ITEM(v, i, PyString_FromString(val));else {PyStructSequence_SET_ITEM(v, i, Py_None);Py_INCREF(Py_None);}}static PyObject *mkspent(struct spwd *p){int setIndex = 0;PyObject *v = PyStructSequence_New(&StructSpwdType);if (v == NULL)return NULL;#define SETI(i,val) PyStructSequence_SET_ITEM(v, i, PyInt_FromLong((long) val))#define SETS(i,val) sets(v, i, val)SETS(setIndex++, p->sp_namp);SETS(setIndex++, p->sp_pwdp);SETI(setIndex++, p->sp_lstchg);SETI(setIndex++, p->sp_min);SETI(setIndex++, p->sp_max);SETI(setIndex++, p->sp_warn);SETI(setIndex++, p->sp_inact);SETI(setIndex++, p->sp_expire);SETI(setIndex++, p->sp_flag);#undef SETS#undef SETIif (PyErr_Occurred()) {Py_DECREF(v);return NULL;}return v;}#endif /* HAVE_GETSPNAM || HAVE_GETSPENT */#ifdef HAVE_GETSPNAMPyDoc_STRVAR(spwd_getspnam__doc__,"getspnam(name) -> (sp_namp, sp_pwdp, sp_lstchg, sp_min, sp_max,\n\sp_warn, sp_inact, sp_expire, sp_flag)\n\Return the shadow password database entry for the given user name.\n\See spwd.__doc__ for more on shadow password database entries.");static PyObject* spwd_getspnam(PyObject *self, PyObject *args){char *name;struct spwd *p;if (!PyArg_ParseTuple(args, "s:getspnam", &name))return NULL;if ((p = getspnam(name)) == NULL) {PyErr_SetString(PyExc_KeyError, "getspnam(): name not found");return NULL;}return mkspent(p);}#endif /* HAVE_GETSPNAM */#ifdef HAVE_GETSPENTPyDoc_STRVAR(spwd_getspall__doc__,"getspall() -> list_of_entries\n\Return a list of all available shadow password database entries, \in arbitrary order.\n\See spwd.__doc__ for more on shadow password database entries.");static PyObject *spwd_getspall(PyObject *self, PyObject *args){PyObject *d;struct spwd *p;if ((d = PyList_New(0)) == NULL)return NULL;setspent();while ((p = getspent()) != NULL) {PyObject *v = mkspent(p);if (v == NULL || PyList_Append(d, v) != 0) {Py_XDECREF(v);Py_DECREF(d);endspent();return NULL;}Py_DECREF(v);}endspent();return d;}#endif /* HAVE_GETSPENT */static PyMethodDef spwd_methods[] = {#ifdef HAVE_GETSPNAM{"getspnam", spwd_getspnam, METH_VARARGS, spwd_getspnam__doc__},#endif#ifdef HAVE_GETSPENT{"getspall", spwd_getspall, METH_NOARGS, spwd_getspall__doc__},#endif{NULL, NULL} /* sentinel */};PyMODINIT_FUNCinitspwd(void){PyObject *m;m=Py_InitModule3("spwd", spwd_methods, spwd__doc__);if (m == NULL)return;if (!initialized)PyStructSequence_InitType(&StructSpwdType,&struct_spwd_type_desc);Py_INCREF((PyObject *) &StructSpwdType);PyModule_AddObject(m, "struct_spwd", (PyObject *) &StructSpwdType);initialized = 1;}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。