From db9fc04e3542ff3475f0caecbfe0409c0aa63f8c Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Thu, 29 Dec 2011 13:06:22 +0000 Subject: add C extension module for system calls Python doesn't provide Snarfed from Obnam. --- _summainmodule.c | 166 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 166 insertions(+) create mode 100644 _summainmodule.c diff --git a/_summainmodule.c b/_summainmodule.c new file mode 100644 index 0000000..4184ef0 --- /dev/null +++ b/_summainmodule.c @@ -0,0 +1,166 @@ +/* + * _summainmodule.c -- Python extensions for Summain + * + * Copyright (C) 2008, 2009 Lars Wirzenius + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + + +#include + + +#ifndef _XOPEN_SOURCE +#define _XOPEN_SOURCE 600 +#endif +#define _POSIX_C_SOURCE 200809L +#include +#include +#include +#include +#include +#include +#include +#include + + +static PyObject * +lstat_wrapper(PyObject *self, PyObject *args) +{ + int ret; + const char *filename; + struct stat st = {0}; + + if (!PyArg_ParseTuple(args, "s", &filename)) + return NULL; + + ret = lstat(filename, &st); + if (ret == -1) + ret = errno; + return Py_BuildValue("iLLLLLLLLLLLLLLLL", + ret, + (long long) st.st_dev, + (long long) st.st_ino, + (long long) st.st_mode, + (long long) st.st_nlink, + (long long) st.st_uid, + (long long) st.st_gid, + (long long) st.st_rdev, + (long long) st.st_size, + (long long) st.st_blksize, + (long long) st.st_blocks, + (long long) st.st_atim.tv_sec, + (long long) st.st_atim.tv_nsec, + (long long) st.st_mtim.tv_sec, + (long long) st.st_mtim.tv_nsec, + (long long) st.st_ctim.tv_sec, + (long long) st.st_ctim.tv_nsec); +} + + +static PyObject * +llistxattr_wrapper(PyObject *self, PyObject *args) +{ + const char *filename; + size_t bufsize; + PyObject *o; + + if (!PyArg_ParseTuple(args, "s", &filename)) + return NULL; + + bufsize = 0; + o = NULL; + do { + bufsize += 1024; + char *buf = malloc(bufsize); + ssize_t n = llistxattr(filename, buf, bufsize); + + if (n >= 0) + o = Py_BuildValue("s#", buf, (int) n); + else if (n == -1 && errno != ERANGE) + o = Py_BuildValue("i", errno); + free(buf); + } while (o == NULL); + + return o; +} + + +static PyObject * +lgetxattr_wrapper(PyObject *self, PyObject *args) +{ + const char *filename; + const char *attrname; + size_t bufsize; + PyObject *o; + + if (!PyArg_ParseTuple(args, "ss", &filename, &attrname)) + return NULL; + + bufsize = 0; + o = NULL; + do { + bufsize += 1024; + char *buf = malloc(bufsize); + ssize_t n = lgetxattr(filename, attrname, buf, bufsize); + + if (n > 0) + o = Py_BuildValue("s#", buf, (int) n); + else if (n == -1 && errno != ERANGE) + o = Py_BuildValue("i", errno); + free(buf); + } while (o == NULL); + + return o; +} + + +static PyObject * +lsetxattr_wrapper(PyObject *self, PyObject *args) +{ + const char *filename; + const char *name; + const char *value; + int size; + int ret; + + if (!PyArg_ParseTuple(args, "sss#", &filename, &name, &value, &size)) + return NULL; + + ret = lsetxattr(filename, name, value, size, 0); + if (ret == -1) + ret = errno; + return Py_BuildValue("i", ret); +} + + +static PyMethodDef methods[] = { + {"lstat", lstat_wrapper, METH_VARARGS, + "lstat(2) wrapper; arg is filename, returns tuple."}, + {"llistxattr", llistxattr_wrapper, METH_VARARGS, + "llistxattr(2) wrapper; arg is filename, returns tuple."}, + {"lgetxattr", lgetxattr_wrapper, METH_VARARGS, + "lgetxattr(2) wrapper; arg is filename, returns tuple."}, + {"lsetxattr", lsetxattr_wrapper, METH_VARARGS, + "lsetxattr(2) wrapper; arg is filename, returns errno."}, + {NULL, NULL, 0, NULL} /* Sentinel */ +}; + + +PyMODINIT_FUNC +init_summain(void) +{ + (void) Py_InitModule("_summain", methods); +} -- cgit v1.2.1