summaryrefslogtreecommitdiff
path: root/common
diff options
context:
space:
mode:
authorSebastien Martini <seb@dbzteam.org>2011-01-28 13:47:00 +0100
committerSebastien Martini <seb@dbzteam.org>2011-01-28 13:47:00 +0100
commitfec920a2146f78802f1a28a7f4c47f5c97426a7e (patch)
treee21371bc6c78a81ba7e39636d7cd69b32994deca /common
parent2900ceda692f590b17a193d1bd97e507abfdc10d (diff)
downloadpyinotify-fec920a2146f78802f1a28a7f4c47f5c97426a7e.tar.gz
Added C-coded inotify syscalls interface.
- If compile_ext_mod is set to True in setup.py, this extension is explicitly compiled. - If compile_ext_mod is set to False in setup.py (default), this extension is compiled only if no inotify support has been found from ctypes. - Replaced exception type UnsupportedLibcVersionError by InotifyBindingNotFoundError. WatchManager.__init__() may raise this exception on error. - SysCtlINotify (class providing access to inotify /proc variables) is not instanciated (therefore not available) when the C extension is used. It is only available from ctypes.
Diffstat (limited to 'common')
-rw-r--r--common/inotify_syscalls.c193
1 files changed, 193 insertions, 0 deletions
diff --git a/common/inotify_syscalls.c b/common/inotify_syscalls.c
new file mode 100644
index 0000000..a4c45f8
--- /dev/null
+++ b/common/inotify_syscalls.c
@@ -0,0 +1,193 @@
+/*
+ inotify_syscalls.c - native binding to inotify's syscalls
+ Copyright (c) 2005-2011 Sebastien Martini <seb@dbzteam.org>
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in
+ all copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+ THE SOFTWARE.
+*/
+#include <Python.h>
+#include <sys/syscall.h>
+
+#if defined(__i386__)
+# define __NR_inotify_init 291
+# define __NR_inotify_add_watch 292
+# define __NR_inotify_rm_watch 293
+#elif defined(__x86_64__)
+# define __NR_inotify_init 253
+# define __NR_inotify_add_watch 254
+# define __NR_inotify_rm_watch 255
+#elif (defined(__powerpc__) || defined(__powerpc64__))
+# define __NR_inotify_init 275
+# define __NR_inotify_add_watch 276
+# define __NR_inotify_rm_watch 277
+#elif defined (__ia64__)
+# define __NR_inotify_init 1277
+# define __NR_inotify_add_watch 1278
+# define __NR_inotify_rm_watch 1279
+#elif defined (__s390__)
+# define __NR_inotify_init 284
+# define __NR_inotify_add_watch 285
+# define __NR_inotify_rm_watch 286
+#elif defined (__alpha__)
+# define __NR_inotify_init 444
+# define __NR_inotify_add_watch 445
+# define __NR_inotify_rm_watch 446
+#elif defined (__sparc__) || defined (__sparc64__)
+# define __NR_inotify_init 151
+# define __NR_inotify_add_watch 152
+# define __NR_inotify_rm_watch 156
+#elif defined (__arm__)
+# define __NR_inotify_init 316
+# define __NR_inotify_add_watch 317
+# define __NR_inotify_rm_watch 318
+#elif defined (__sh__)
+# define __NR_inotify_init 290
+# define __NR_inotify_add_watch 291
+# define __NR_inotify_rm_watch 292
+#elif defined (__sh64__)
+# define __NR_inotify_init 318
+# define __NR_inotify_add_watch 319
+# define __NR_inotify_rm_watch 320
+#elif defined (__hppa__)
+# define __NR_inotify_init 269
+# define __NR_inotify_add_watch 270
+# define __NR_inotify_rm_watch 271
+#elif defined (__mips__)
+# define _MIPS_SIM_ABI32 1
+# define _MIPS_SIM_NABI32 2
+# define _MIPS_SIM_ABI64 3
+# if _MIPS_SIM == _MIPS_SIM_ABI32
+# define __NR_Linux 4000
+# define __NR_inotify_init (__NR_Linux + 284)
+# define __NR_inotify_add_watch (__NR_Linux + 285)
+# define __NR_inotify_rm_watch (__NR_Linux + 286)
+# endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */
+# if _MIPS_SIM == _MIPS_SIM_ABI64
+# define __NR_Linux 5000
+# define __NR_inotify_init (__NR_Linux + 243)
+# define __NR_inotify_add_watch (__NR_Linux + 244)
+# define __NR_inotify_rm_watch (__NR_Linux + 245)
+# endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */
+# if _MIPS_SIM == _MIPS_SIM_NABI32
+# define __NR_Linux 6000
+# define __NR_inotify_init (__NR_Linux + 247)
+# define __NR_inotify_add_watch (__NR_Linux + 248)
+# define __NR_inotify_rm_watch (__NR_Linux + 249)
+# endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */
+#elif defined (__frv__)
+# define __NR_inotify_init 291
+# define __NR_inotify_add_watch 292
+# define __NR_inotify_rm_watch 293
+#elif defined (__parisc__)
+# define __NR_Linux 0
+# define __NR_inotify_init (__NR_Linux + 269)
+# define __NR_inotify_add_watch (__NR_Linux + 270)
+# define __NR_inotify_rm_watch (__NR_Linux + 271)
+#elif defined (__mc68000__)
+# define __NR_inotify_init 284
+# define __NR_inotify_add_watch 285
+# define __NR_inotify_rm_watch 286
+#else
+# error "Unsupported architecture!"
+#endif
+
+
+static PyObject* inotify_init(PyObject* self, PyObject* args) {
+ int result = -1;
+
+ if (!PyArg_ParseTuple(args, ""))
+ return NULL;
+
+ result = syscall(__NR_inotify_init);
+ if (result == -1) {
+ PyErr_SetFromErrno(PyExc_IOError);
+ return NULL;
+ }
+
+ return Py_BuildValue("i", result);
+}
+
+static PyObject* inotify_add_watch(PyObject* self, PyObject* args) {
+ int fd = -1;
+ char* name = NULL;
+ unsigned int mask = 0;
+ int result = -1;
+
+ if(!PyArg_ParseTuple(args, "isI", &fd, &name, &mask))
+ return NULL;
+
+ result = syscall(__NR_inotify_add_watch, fd, name, mask);
+ if (result == -1) {
+ PyErr_SetFromErrno(PyExc_IOError);
+ return NULL;
+ }
+
+ return Py_BuildValue("i", result);
+}
+
+static PyObject* inotify_rm_watch(PyObject* self, PyObject* args) {
+ int fd = -1;
+ unsigned int wd = 0;
+ int result = -1;
+
+ if(!PyArg_ParseTuple(args, "iI", &fd, &wd))
+ return NULL;
+
+ result = syscall(__NR_inotify_rm_watch, fd, wd);
+ if (result == -1) {
+ PyErr_SetFromErrno(PyExc_IOError);
+ return NULL;
+ }
+
+ return Py_BuildValue("i", result);
+}
+
+static PyMethodDef inotify_syscalls_functions[] = {
+ {"inotify_init", inotify_init, METH_VARARGS, "inotify initialization"},
+ {"inotify_add_watch", inotify_add_watch, METH_VARARGS, "Add a new watch"},
+ {"inotify_rm_watch", inotify_rm_watch, METH_VARARGS, "Remove a watch"},
+ {0}
+};
+
+/* python 2 */
+#if PY_VERSION_HEX < 0x03000000
+
+void initinotify_syscalls(void) {
+ Py_InitModule3("inotify_syscalls", inotify_syscalls_functions,
+ "module inotify_syscalls");
+}
+
+#else /* python 3 */
+
+static struct PyModuleDef inotify_syscallsmodule = {
+ {}, /* m_base */
+ "inotify_syscalls", /* m_name */
+ "module inotify_syscalls", /* m_doc */
+ 0, /* m_size */
+ inotify_syscalls_functions, /* m_methods */
+ 0, /* m_reload */
+ 0, /* m_traverse */
+ 0, /* m_clear */
+ 0, /* m_free */
+};
+
+PyObject* PyInit_inotify_syscalls(void) {
+ return PyModule_Create(&inotify_syscallsmodule);
+}
+
+#endif /* PY_VERSION_HEX */