terom@21: #include terom@21: terom@21: #include terom@21: terom@21: #include terom@21: terom@21: PyObject *parse (PyObject *self, PyObject *args) { terom@21: char *bytes; terom@21: size_t size; terom@21: terom@21: struct utmp *item; terom@21: terom@21: /* not unicode */ terom@21: if (!PyArg_ParseTuple(args, "t#", &bytes, &size)) terom@21: return NULL; terom@21: terom@21: if (size != sizeof(struct utmp)) { terom@21: PyErr_SetString(PyExc_ValueError, "given buffer is of the wrong length"); terom@21: return NULL; terom@21: } terom@21: terom@21: item = (struct utmp *) bytes; terom@21: terom@21: /* parse utmp from bytes to result */ terom@21: return Py_BuildValue("hIs#s#s#s#(hh)i(ii)s#", terom@21: item->ut_type, item->ut_pid, terom@21: item->ut_line, sizeof(item->ut_line), terom@21: item->ut_id, sizeof(item->ut_id), terom@21: item->ut_user, sizeof(item->ut_user), terom@21: item->ut_host, sizeof(item->ut_host), terom@21: item->ut_exit.e_termination, item->ut_exit.e_exit, terom@21: item->ut_session, terom@21: item->ut_tv.tv_sec, item->ut_tv.tv_usec, terom@21: item->ut_addr_v6, sizeof(item->ut_addr_v6) terom@21: ); terom@21: } terom@21: terom@21: PyObject *size (PyObject *self, PyObject *args) { terom@21: /* return the size of an UTMP struct */ terom@21: terom@21: if (!PyArg_ParseTuple(args, "")) terom@21: return NULL; terom@21: terom@21: return PyInt_FromSsize_t(sizeof(struct utmp)); terom@21: } terom@21: terom@21: static PyMethodDef module_methods[] = { terom@21: {"parse", parse, METH_VARARGS, "parse a utmp struct from a byte string"}, terom@21: {"size", size, METH_VARARGS, "return the size of an utmp record in bytes"}, terom@21: {NULL} terom@21: }; terom@21: terom@21: PyMODINIT_FUNC init_utmp(void) { terom@21: PyObject *m; terom@21: terom@21: m = Py_InitModule3("_utmp", module_methods, "utmp struct parsing"); terom@21: }