From 68662e5bcc03a60c600e0f75afcbd14d34fc9abe Mon Sep 17 00:00:00 2001 From: Doug MacEachern Date: Sun, 9 Sep 2007 17:12:03 +0000 Subject: [PATCH] start python bindings --- bindings/python/_sigar.c | 161 +++++++++++++++++++++++++++++++++++++++ bindings/python/setup.py | 17 +++++ 2 files changed, 178 insertions(+) create mode 100644 bindings/python/_sigar.c create mode 100644 bindings/python/setup.py diff --git a/bindings/python/_sigar.c b/bindings/python/_sigar.c new file mode 100644 index 00000000..5b19c839 --- /dev/null +++ b/bindings/python/_sigar.c @@ -0,0 +1,161 @@ +/* + * Copyright (C) [2004, 2005, 2006], Hyperic, Inc. + * This file is part of SIGAR. + * + * SIGAR is free software; you can redistribute it and/or modify + * it under the terms version 2 of the GNU General Public License as + * published by the Free Software Foundation. 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 + * USA. + */ + +#include +#include "sigar.h" +#include "sigar_fileinfo.h" +#include "sigar_format.h" + +#define PySigarString_FromNetAddr(a) pysigar_net_address_to_string(&a) + +#define PySigarInt_FromChar(c) PyInt_FromLong((int)c) + +#define PySigar_ParsePID \ + if (!PyArg_ParseTuple(args, "i", &pid)) return NULL + +#define PySigar_ParseName \ + if (!PyArg_ParseTuple(args, "s", &name, &name_len)) return NULL + +#define PySIGAR_OBJ ((PySigarObject *)self) + +#define PySIGAR ((sigar_t *)PySIGAR_OBJ->ptr) + +#define PySigar_new(t) PyType_GenericAlloc(&t, 0) + +#define PySigar_TPFLAGS Py_TPFLAGS_DEFAULT + +#define PySigar_AddType(name, t) \ + if (PyType_Ready(&t) == 0) { \ + Py_INCREF(&t); \ + PyModule_AddObject(module, name, (PyObject *)&t); \ + } + +#define PySigar_Croak() PyErr_SetString(PyExc_ValueError, sigar_strerror(sigar, status)) + +typedef struct { + PyObject_HEAD + void *ptr; +} PySigarObject; + +static PyTypeObject pysigar_PySigarType; + +static void pysigar_free(PyObject *self) +{ + if (PySIGAR_OBJ->ptr) { + if (self->ob_type == &pysigar_PySigarType) { + sigar_close(PySIGAR); + } + else { + free(PySIGAR_OBJ->ptr); + } + PySIGAR_OBJ->ptr = NULL; + } + + self->ob_type->tp_free((PyObject *)self); +} + +static PyObject *pysigar_net_address_to_string(sigar_net_address_t *address) +{ + char addr_str[SIGAR_INET6_ADDRSTRLEN]; + sigar_net_address_to_string(NULL, address, addr_str); + return PyString_FromString(addr_str); +} + +#include "_sigar_generated.c" + +static PyObject *pysigar_open(PyObject *pyself, PyObject *args) +{ + PyObject *self = PySigar_new(pysigar_PySigarType); + sigar_open((sigar_t **)&PySIGAR_OBJ->ptr); + return self; +} + +static PyObject *pysigar_close(PyObject *self, PyObject *args) +{ + if (PySIGAR_OBJ->ptr) { + sigar_close(PySIGAR); + PySIGAR_OBJ->ptr = NULL; + } + + Py_INCREF(Py_None); + return Py_None; +} + +static PyMethodDef pysigar_methods[] = { + { "close", pysigar_close, METH_NOARGS, NULL }, + PY_SIGAR_METHODS + {NULL} +}; + +static PyTypeObject pysigar_PySigarType = { + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "Sigar", /*tp_name*/ + sizeof(PySigarObject), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + pysigar_free, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash */ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + PySigar_TPFLAGS, /*tp_flags*/ + 0, /*tp_doc*/ + 0, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + pysigar_methods, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + 0 /*tp_new*/ +}; + +static PyMethodDef pysigar_module_methods[] = { + { "open", pysigar_open, METH_NOARGS, NULL }, + {NULL} +}; + +PyMODINIT_FUNC +init_sigar(void) +{ + PyObject *module = + Py_InitModule("_sigar", pysigar_module_methods); + + PySigar_AddType("Sigar", pysigar_PySigarType); + + PY_SIGAR_ADD_TYPES; +} diff --git a/bindings/python/setup.py b/bindings/python/setup.py new file mode 100644 index 00000000..95df0aa2 --- /dev/null +++ b/bindings/python/setup.py @@ -0,0 +1,17 @@ +#!/usr/bin/env python + +from distutils.core import setup, Extension + +_sigar = Extension( + "_sigar", + ["_sigar.c"], + include_dirs = ['../java/sigar-bin/include'], + extra_compile_args = ['-Wall'], + libraries=['sigar-universal-macosx'], + library_dirs=['../java/sigar-bin/lib'], + extra_link_args=[], + define_macros=[], + undef_macros=[]) + +setup(name="pysigar", version="0.1", + ext_modules=[_sigar])