/* Unix SMB/CIFS implementation. Python wrapper for reading smb.conf files Copyright (C) Jelmer Vernooij 2007 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 2 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., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "includes.h" #include "Python.h" #include "param/param.h" staticforward PyTypeObject param_ParamFileType; typedef struct { PyObject_HEAD struct param_context *param_ctx; } param_ParamFileObject; static param_ParamFileObject *py_param_init(void) { param_ParamFileObject *param; param = PyObject_New(param_ParamFileObject, ¶m_ParamFileType); param->param_ctx = param_init(NULL); return param; } static PyObject *py_param_load(PyObject *self, PyObject *args) { char *filename = NULL; param_ParamFileObject *param; if (!PyArg_ParseTuple(args, "|s:new", &filename)) return NULL; param = py_param_init(); if (filename != NULL) { int ret = param_read(param->param_ctx, filename); if (ret == -1) { PyErr_SetString(PyExc_TypeError, "reading file failed"); return NULL; } } return (PyObject *)param; } static void param_dealloc(PyObject* self) { PyObject_Del(self); } static PyObject *py_param_get(PyObject *_self, PyObject *args) { struct param_opt *param; const char *section_name = NULL, *param_name = NULL; param_ParamFileObject *self = (param_ParamFileObject *)_self; if (!PyArg_ParseTuple(args, (char *)"s|s", ¶m_name, §ion_name)) return NULL; param = param_get(self->param_ctx, section_name, param_name); if (param == NULL) return Py_None; return PyString_FromString(param->value); } static PyObject *py_param_set(PyObject *_self, PyObject *args) { param_ParamFileObject *self = (param_ParamFileObject *)_self; const char *section_name = NULL, *param_name = NULL, *param_value = NULL; if (!PyArg_ParseTuple(args, "ss|s", ¶m_name, ¶m_value, §ion_name)) return NULL; if (section_name == NULL) section_name = GLOBAL_NAME; if (param_set_string(self->param_ctx, section_name, param_name, param_value) != 0) { PyErr_SetString(PyExc_TypeError, "setting variable failed"); return NULL; } return Py_None; } static PyObject *py_param_save(PyObject *_self, PyObject *args) { param_ParamFileObject *self = (param_ParamFileObject *)_self; const char *filename = NULL; if (!PyArg_ParseTuple(args, "s", &filename)) return NULL; if (param_write(self->param_ctx, filename) != 0) { PyErr_SetString(PyExc_TypeError, "unable to save"); return NULL; } return Py_None; } static PyObject *py_param_use(PyObject *_self, PyObject *args) { param_ParamFileObject *self = (param_ParamFileObject *)_self; if (!PyArg_ParseTuple(args, "")) return NULL; if (param_use(global_loadparm, self->param_ctx) != 0) { PyErr_SetString(PyExc_TypeError, "unable to use"); return NULL; } return Py_None; } static PyMethodDef param_methods[] = { {"get", (PyCFunction)py_param_get, METH_VARARGS, "Get a parameter."}, {"set", (PyCFunction)py_param_set, METH_VARARGS, "Set a parameter."}, {"save", (PyCFunction)py_param_save, METH_VARARGS, "Save file" }, {"use", (PyCFunction)py_param_use, METH_VARARGS, "Use param file" }, {NULL, NULL, 0, NULL} }; static PyObject * param_getattr(PyTypeObject *obj, char *name) { return Py_FindMethod(param_methods, (PyObject *)obj, name); } static PyTypeObject param_ParamFileType = { PyObject_HEAD_INIT(NULL) 0, .tp_name = "ParamFile", .tp_basicsize = sizeof(param_ParamFileObject), .tp_dealloc = param_dealloc, .tp_getattr = param_getattr, }; static PyMethodDef methods[] = { { "ParamFile", (PyCFunction)py_param_load, METH_VARARGS, NULL}, { NULL, NULL } }; PyDoc_STRVAR(param_doc, "Simple wrappers around the smb.conf parsers"); PyMODINIT_FUNC initparam(void) { PyObject *mod = Py_InitModule3("param", methods, param_doc); if (mod == NULL) return; PyModule_AddObject(mod, "configfile", PyString_FromString(lp_configfile(global_loadparm))); }