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