fixbot/_utmp.c
author Tero Marttila <terom@fixme.fi>
Fri, 05 Feb 2010 22:20:59 +0200
changeset 59 43806d334fb4
parent 21 aa6df8f9c44a
permissions -rw-r--r--
prepend source name to output type
#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");
}