Mercurial > public > mercurial-scm > hg
diff hgext/inotify/linux/_inotify.c @ 10282:08a0f04b56bd
many, many trivial check-code fixups
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Mon, 25 Jan 2010 00:05:27 -0600 |
parents | 25e572394f5c |
children | 36a6aeb679da |
line wrap: on
line diff
--- a/hgext/inotify/linux/_inotify.c Mon Jan 25 00:05:22 2010 -0600 +++ b/hgext/inotify/linux/_inotify.c Mon Jan 25 00:05:27 2010 -0600 @@ -17,298 +17,298 @@ static PyObject *init(PyObject *self, PyObject *args) { - PyObject *ret = NULL; - int fd = -1; + PyObject *ret = NULL; + int fd = -1; - if (!PyArg_ParseTuple(args, ":init")) - goto bail; + if (!PyArg_ParseTuple(args, ":init")) + goto bail; - Py_BEGIN_ALLOW_THREADS - fd = inotify_init(); - Py_END_ALLOW_THREADS + Py_BEGIN_ALLOW_THREADS; + fd = inotify_init(); + Py_END_ALLOW_THREADS; - if (fd == -1) { - PyErr_SetFromErrno(PyExc_OSError); - goto bail; - } + if (fd == -1) { + PyErr_SetFromErrno(PyExc_OSError); + goto bail; + } - ret = PyInt_FromLong(fd); - if (ret == NULL) - goto bail; + ret = PyInt_FromLong(fd); + if (ret == NULL) + goto bail; - goto done; + goto done; bail: - if (fd != -1) - close(fd); + if (fd != -1) + close(fd); - Py_CLEAR(ret); + Py_CLEAR(ret); done: - return ret; + return ret; } PyDoc_STRVAR( - init_doc, - "init() -> fd\n" - "\n" - "Initialise an inotify instance.\n" - "Return a file descriptor associated with a new inotify event queue."); + init_doc, + "init() -> fd\n" + "\n" + "Initialise an inotify instance.\n" + "Return a file descriptor associated with a new inotify event queue."); static PyObject *add_watch(PyObject *self, PyObject *args) { - PyObject *ret = NULL; - uint32_t mask; - int wd = -1; - char *path; - int fd; + PyObject *ret = NULL; + uint32_t mask; + int wd = -1; + char *path; + int fd; - if (!PyArg_ParseTuple(args, "isI:add_watch", &fd, &path, &mask)) - goto bail; + if (!PyArg_ParseTuple(args, "isI:add_watch", &fd, &path, &mask)) + goto bail; - Py_BEGIN_ALLOW_THREADS - wd = inotify_add_watch(fd, path, mask); - Py_END_ALLOW_THREADS + Py_BEGIN_ALLOW_THREADS; + wd = inotify_add_watch(fd, path, mask); + Py_END_ALLOW_THREADS; - if (wd == -1) { - PyErr_SetFromErrnoWithFilename(PyExc_OSError, path); - goto bail; - } + if (wd == -1) { + PyErr_SetFromErrnoWithFilename(PyExc_OSError, path); + goto bail; + } - ret = PyInt_FromLong(wd); - if (ret == NULL) - goto bail; + ret = PyInt_FromLong(wd); + if (ret == NULL) + goto bail; - goto done; + goto done; bail: - if (wd != -1) - inotify_rm_watch(fd, wd); + if (wd != -1) + inotify_rm_watch(fd, wd); - Py_CLEAR(ret); + Py_CLEAR(ret); done: - return ret; + return ret; } PyDoc_STRVAR( - add_watch_doc, - "add_watch(fd, path, mask) -> wd\n" - "\n" - "Add a watch to an inotify instance, or modify an existing watch.\n" - "\n" - " fd: file descriptor returned by init()\n" - " path: path to watch\n" - " mask: mask of events to watch for\n" - "\n" - "Return a unique numeric watch descriptor for the inotify instance\n" - "mapped by the file descriptor."); + add_watch_doc, + "add_watch(fd, path, mask) -> wd\n" + "\n" + "Add a watch to an inotify instance, or modify an existing watch.\n" + "\n" + " fd: file descriptor returned by init()\n" + " path: path to watch\n" + " mask: mask of events to watch for\n" + "\n" + "Return a unique numeric watch descriptor for the inotify instance\n" + "mapped by the file descriptor."); static PyObject *remove_watch(PyObject *self, PyObject *args) { - uint32_t wd; - int fd; - int r; + uint32_t wd; + int fd; + int r; - if (!PyArg_ParseTuple(args, "iI:remove_watch", &fd, &wd)) - return NULL; + if (!PyArg_ParseTuple(args, "iI:remove_watch", &fd, &wd)) + return NULL; - Py_BEGIN_ALLOW_THREADS - r = inotify_rm_watch(fd, wd); - Py_END_ALLOW_THREADS + Py_BEGIN_ALLOW_THREADS; + r = inotify_rm_watch(fd, wd); + Py_END_ALLOW_THREADS; - if (r == -1) { - PyErr_SetFromErrno(PyExc_OSError); - return NULL; - } + if (r == -1) { + PyErr_SetFromErrno(PyExc_OSError); + return NULL; + } - Py_INCREF(Py_None); - return Py_None; + Py_INCREF(Py_None); + return Py_None; } PyDoc_STRVAR( - remove_watch_doc, - "remove_watch(fd, wd)\n" - "\n" - " fd: file descriptor returned by init()\n" - " wd: watch descriptor returned by add_watch()\n" - "\n" - "Remove a watch associated with the watch descriptor wd from the\n" - "inotify instance associated with the file descriptor fd.\n" - "\n" - "Removing a watch causes an IN_IGNORED event to be generated for this\n" - "watch descriptor."); + remove_watch_doc, + "remove_watch(fd, wd)\n" + "\n" + " fd: file descriptor returned by init()\n" + " wd: watch descriptor returned by add_watch()\n" + "\n" + "Remove a watch associated with the watch descriptor wd from the\n" + "inotify instance associated with the file descriptor fd.\n" + "\n" + "Removing a watch causes an IN_IGNORED event to be generated for this\n" + "watch descriptor."); #define bit_name(x) {x, #x} static struct { - int bit; - const char *name; - PyObject *pyname; + int bit; + const char *name; + PyObject *pyname; } bit_names[] = { - bit_name(IN_ACCESS), - bit_name(IN_MODIFY), - bit_name(IN_ATTRIB), - bit_name(IN_CLOSE_WRITE), - bit_name(IN_CLOSE_NOWRITE), - bit_name(IN_OPEN), - bit_name(IN_MOVED_FROM), - bit_name(IN_MOVED_TO), - bit_name(IN_CREATE), - bit_name(IN_DELETE), - bit_name(IN_DELETE_SELF), - bit_name(IN_MOVE_SELF), - bit_name(IN_UNMOUNT), - bit_name(IN_Q_OVERFLOW), - bit_name(IN_IGNORED), - bit_name(IN_ONLYDIR), - bit_name(IN_DONT_FOLLOW), - bit_name(IN_MASK_ADD), - bit_name(IN_ISDIR), - bit_name(IN_ONESHOT), - {0} + bit_name(IN_ACCESS), + bit_name(IN_MODIFY), + bit_name(IN_ATTRIB), + bit_name(IN_CLOSE_WRITE), + bit_name(IN_CLOSE_NOWRITE), + bit_name(IN_OPEN), + bit_name(IN_MOVED_FROM), + bit_name(IN_MOVED_TO), + bit_name(IN_CREATE), + bit_name(IN_DELETE), + bit_name(IN_DELETE_SELF), + bit_name(IN_MOVE_SELF), + bit_name(IN_UNMOUNT), + bit_name(IN_Q_OVERFLOW), + bit_name(IN_IGNORED), + bit_name(IN_ONLYDIR), + bit_name(IN_DONT_FOLLOW), + bit_name(IN_MASK_ADD), + bit_name(IN_ISDIR), + bit_name(IN_ONESHOT), + {0} }; static PyObject *decode_mask(int mask) { - PyObject *ret = PyList_New(0); - int i; + PyObject *ret = PyList_New(0); + int i; - if (ret == NULL) - goto bail; + if (ret == NULL) + goto bail; - for (i = 0; bit_names[i].bit; i++) { - if (mask & bit_names[i].bit) { - if (bit_names[i].pyname == NULL) { - bit_names[i].pyname = PyString_FromString(bit_names[i].name); - if (bit_names[i].pyname == NULL) - goto bail; - } - Py_INCREF(bit_names[i].pyname); - if (PyList_Append(ret, bit_names[i].pyname) == -1) - goto bail; + for (i = 0; bit_names[i].bit; i++) { + if (mask & bit_names[i].bit) { + if (bit_names[i].pyname == NULL) { + bit_names[i].pyname = PyString_FromString(bit_names[i].name); + if (bit_names[i].pyname == NULL) + goto bail; + } + Py_INCREF(bit_names[i].pyname); + if (PyList_Append(ret, bit_names[i].pyname) == -1) + goto bail; + } } - } - goto done; + goto done; bail: - Py_CLEAR(ret); + Py_CLEAR(ret); done: - return ret; + return ret; } static PyObject *pydecode_mask(PyObject *self, PyObject *args) { - int mask; + int mask; - if (!PyArg_ParseTuple(args, "i:decode_mask", &mask)) - return NULL; + if (!PyArg_ParseTuple(args, "i:decode_mask", &mask)) + return NULL; - return decode_mask(mask); + return decode_mask(mask); } PyDoc_STRVAR( - decode_mask_doc, - "decode_mask(mask) -> list_of_strings\n" - "\n" - "Decode an inotify mask value into a list of strings that give the\n" - "name of each bit set in the mask."); + decode_mask_doc, + "decode_mask(mask) -> list_of_strings\n" + "\n" + "Decode an inotify mask value into a list of strings that give the\n" + "name of each bit set in the mask."); static char doc[] = "Low-level inotify interface wrappers."; static void define_const(PyObject *dict, const char *name, uint32_t val) { - PyObject *pyval = PyInt_FromLong(val); - PyObject *pyname = PyString_FromString(name); + PyObject *pyval = PyInt_FromLong(val); + PyObject *pyname = PyString_FromString(name); - if (!pyname || !pyval) - goto bail; + if (!pyname || !pyval) + goto bail; - PyDict_SetItem(dict, pyname, pyval); + PyDict_SetItem(dict, pyname, pyval); bail: - Py_XDECREF(pyname); - Py_XDECREF(pyval); + Py_XDECREF(pyname); + Py_XDECREF(pyval); } static void define_consts(PyObject *dict) { - define_const(dict, "IN_ACCESS", IN_ACCESS); - define_const(dict, "IN_MODIFY", IN_MODIFY); - define_const(dict, "IN_ATTRIB", IN_ATTRIB); - define_const(dict, "IN_CLOSE_WRITE", IN_CLOSE_WRITE); - define_const(dict, "IN_CLOSE_NOWRITE", IN_CLOSE_NOWRITE); - define_const(dict, "IN_OPEN", IN_OPEN); - define_const(dict, "IN_MOVED_FROM", IN_MOVED_FROM); - define_const(dict, "IN_MOVED_TO", IN_MOVED_TO); + define_const(dict, "IN_ACCESS", IN_ACCESS); + define_const(dict, "IN_MODIFY", IN_MODIFY); + define_const(dict, "IN_ATTRIB", IN_ATTRIB); + define_const(dict, "IN_CLOSE_WRITE", IN_CLOSE_WRITE); + define_const(dict, "IN_CLOSE_NOWRITE", IN_CLOSE_NOWRITE); + define_const(dict, "IN_OPEN", IN_OPEN); + define_const(dict, "IN_MOVED_FROM", IN_MOVED_FROM); + define_const(dict, "IN_MOVED_TO", IN_MOVED_TO); - define_const(dict, "IN_CLOSE", IN_CLOSE); - define_const(dict, "IN_MOVE", IN_MOVE); + define_const(dict, "IN_CLOSE", IN_CLOSE); + define_const(dict, "IN_MOVE", IN_MOVE); - define_const(dict, "IN_CREATE", IN_CREATE); - define_const(dict, "IN_DELETE", IN_DELETE); - define_const(dict, "IN_DELETE_SELF", IN_DELETE_SELF); - define_const(dict, "IN_MOVE_SELF", IN_MOVE_SELF); - define_const(dict, "IN_UNMOUNT", IN_UNMOUNT); - define_const(dict, "IN_Q_OVERFLOW", IN_Q_OVERFLOW); - define_const(dict, "IN_IGNORED", IN_IGNORED); + define_const(dict, "IN_CREATE", IN_CREATE); + define_const(dict, "IN_DELETE", IN_DELETE); + define_const(dict, "IN_DELETE_SELF", IN_DELETE_SELF); + define_const(dict, "IN_MOVE_SELF", IN_MOVE_SELF); + define_const(dict, "IN_UNMOUNT", IN_UNMOUNT); + define_const(dict, "IN_Q_OVERFLOW", IN_Q_OVERFLOW); + define_const(dict, "IN_IGNORED", IN_IGNORED); - define_const(dict, "IN_ONLYDIR", IN_ONLYDIR); - define_const(dict, "IN_DONT_FOLLOW", IN_DONT_FOLLOW); - define_const(dict, "IN_MASK_ADD", IN_MASK_ADD); - define_const(dict, "IN_ISDIR", IN_ISDIR); - define_const(dict, "IN_ONESHOT", IN_ONESHOT); - define_const(dict, "IN_ALL_EVENTS", IN_ALL_EVENTS); + define_const(dict, "IN_ONLYDIR", IN_ONLYDIR); + define_const(dict, "IN_DONT_FOLLOW", IN_DONT_FOLLOW); + define_const(dict, "IN_MASK_ADD", IN_MASK_ADD); + define_const(dict, "IN_ISDIR", IN_ISDIR); + define_const(dict, "IN_ONESHOT", IN_ONESHOT); + define_const(dict, "IN_ALL_EVENTS", IN_ALL_EVENTS); } struct event { - PyObject_HEAD - PyObject *wd; - PyObject *mask; - PyObject *cookie; - PyObject *name; + PyObject_HEAD + PyObject *wd; + PyObject *mask; + PyObject *cookie; + PyObject *name; }; static PyObject *event_wd(PyObject *self, void *x) { - struct event *evt = (struct event *) self; - Py_INCREF(evt->wd); - return evt->wd; + struct event *evt = (struct event *)self; + Py_INCREF(evt->wd); + return evt->wd; } static PyObject *event_mask(PyObject *self, void *x) { - struct event *evt = (struct event *) self; - Py_INCREF(evt->mask); - return evt->mask; + struct event *evt = (struct event *)self; + Py_INCREF(evt->mask); + return evt->mask; } static PyObject *event_cookie(PyObject *self, void *x) { - struct event *evt = (struct event *) self; - Py_INCREF(evt->cookie); - return evt->cookie; + struct event *evt = (struct event *)self; + Py_INCREF(evt->cookie); + return evt->cookie; } static PyObject *event_name(PyObject *self, void *x) { - struct event *evt = (struct event *) self; - Py_INCREF(evt->name); - return evt->name; + struct event *evt = (struct event *)self; + Py_INCREF(evt->name); + return evt->name; } static struct PyGetSetDef event_getsets[] = { - {"wd", event_wd, NULL, - "watch descriptor"}, - {"mask", event_mask, NULL, - "event mask"}, - {"cookie", event_cookie, NULL, - "rename cookie, if rename-related event"}, - {"name", event_name, NULL, - "file name"}, - {NULL} + {"wd", event_wd, NULL, + "watch descriptor"}, + {"mask", event_mask, NULL, + "event mask"}, + {"cookie", event_cookie, NULL, + "rename cookie, if rename-related event"}, + {"name", event_name, NULL, + "file name"}, + {NULL} }; PyDoc_STRVAR( @@ -317,284 +317,285 @@ static PyObject *event_new(PyTypeObject *t, PyObject *a, PyObject *k) { - return (*t->tp_alloc)(t, 0); + return (*t->tp_alloc)(t, 0); } static void event_dealloc(struct event *evt) { - Py_XDECREF(evt->wd); - Py_XDECREF(evt->mask); - Py_XDECREF(evt->cookie); - Py_XDECREF(evt->name); + Py_XDECREF(evt->wd); + Py_XDECREF(evt->mask); + Py_XDECREF(evt->cookie); + Py_XDECREF(evt->name); - (*evt->ob_type->tp_free)(evt); + (*evt->ob_type->tp_free)(evt); } static PyObject *event_repr(struct event *evt) { - int wd = PyInt_AsLong(evt->wd); - int cookie = evt->cookie == Py_None ? -1 : PyInt_AsLong(evt->cookie); - PyObject *ret = NULL, *pymasks = NULL, *pymask = NULL; - PyObject *join = NULL; - char *maskstr; + int wd = PyInt_AsLong(evt->wd); + int cookie = evt->cookie == Py_None ? -1 : PyInt_AsLong(evt->cookie); + PyObject *ret = NULL, *pymasks = NULL, *pymask = NULL; + PyObject *join = NULL; + char *maskstr; - join = PyString_FromString("|"); - if (join == NULL) - goto bail; + join = PyString_FromString("|"); + if (join == NULL) + goto bail; - pymasks = decode_mask(PyInt_AsLong(evt->mask)); - if (pymasks == NULL) - goto bail; + pymasks = decode_mask(PyInt_AsLong(evt->mask)); + if (pymasks == NULL) + goto bail; - pymask = _PyString_Join(join, pymasks); - if (pymask == NULL) - goto bail; + pymask = _PyString_Join(join, pymasks); + if (pymask == NULL) + goto bail; - maskstr = PyString_AsString(pymask); + maskstr = PyString_AsString(pymask); + + if (evt->name != Py_None) { + PyObject *pyname = PyString_Repr(evt->name, 1); + char *name = pyname ? PyString_AsString(pyname) : "???"; - if (evt->name != Py_None) { - PyObject *pyname = PyString_Repr(evt->name, 1); - char *name = pyname ? PyString_AsString(pyname) : "???"; - - if (cookie == -1) - ret = PyString_FromFormat("event(wd=%d, mask=%s, name=%s)", - wd, maskstr, name); - else - ret = PyString_FromFormat("event(wd=%d, mask=%s, " - "cookie=0x%x, name=%s)", - wd, maskstr, cookie, name); + if (cookie == -1) + ret = PyString_FromFormat( + "event(wd=%d, mask=%s, name=%s)", + wd, maskstr, name); + else + ret = PyString_FromFormat("event(wd=%d, mask=%s, " + "cookie=0x%x, name=%s)", + wd, maskstr, cookie, name); - Py_XDECREF(pyname); - } else { - if (cookie == -1) - ret = PyString_FromFormat("event(wd=%d, mask=%s)", - wd, maskstr); - else { - ret = PyString_FromFormat("event(wd=%d, mask=%s, cookie=0x%x)", - wd, maskstr, cookie); + Py_XDECREF(pyname); + } else { + if (cookie == -1) + ret = PyString_FromFormat("event(wd=%d, mask=%s)", + wd, maskstr); + else { + ret = PyString_FromFormat( + "event(wd=%d, mask=%s, cookie=0x%x)", + wd, maskstr, cookie); + } } - } - goto done; + goto done; bail: - Py_CLEAR(ret); + Py_CLEAR(ret); done: - Py_XDECREF(pymask); - Py_XDECREF(pymasks); - Py_XDECREF(join); + Py_XDECREF(pymask); + Py_XDECREF(pymasks); + Py_XDECREF(join); - return ret; + return ret; } static PyTypeObject event_type = { - PyObject_HEAD_INIT(NULL) - 0, /*ob_size*/ - "_inotify.event", /*tp_name*/ - sizeof(struct event), /*tp_basicsize*/ - 0, /*tp_itemsize*/ - (destructor)event_dealloc, /*tp_dealloc*/ - 0, /*tp_print*/ - 0, /*tp_getattr*/ - 0, /*tp_setattr*/ - 0, /*tp_compare*/ - (reprfunc)event_repr, /*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*/ - Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ - event_doc, /* tp_doc */ - 0, /* tp_traverse */ - 0, /* tp_clear */ - 0, /* tp_richcompare */ - 0, /* tp_weaklistoffset */ - 0, /* tp_iter */ - 0, /* tp_iternext */ - 0, /* tp_methods */ - 0, /* tp_members */ - event_getsets, /* 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 */ - event_new, /* tp_new */ + PyObject_HEAD_INIT(NULL) + 0, /*ob_size*/ + "_inotify.event", /*tp_name*/ + sizeof(struct event), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + (destructor)event_dealloc, /*tp_dealloc*/ + 0, /*tp_print*/ + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + 0, /*tp_compare*/ + (reprfunc)event_repr, /*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*/ + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/ + event_doc, /* tp_doc */ + 0, /* tp_traverse */ + 0, /* tp_clear */ + 0, /* tp_richcompare */ + 0, /* tp_weaklistoffset */ + 0, /* tp_iter */ + 0, /* tp_iternext */ + 0, /* tp_methods */ + 0, /* tp_members */ + event_getsets, /* 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 */ + event_new, /* tp_new */ }; PyObject *read_events(PyObject *self, PyObject *args) { - PyObject *ctor_args = NULL; - PyObject *pybufsize = NULL; - PyObject *ret = NULL; - int bufsize = 65536; - char *buf = NULL; - int nread, pos; - int fd; + PyObject *ctor_args = NULL; + PyObject *pybufsize = NULL; + PyObject *ret = NULL; + int bufsize = 65536; + char *buf = NULL; + int nread, pos; + int fd; + + if (!PyArg_ParseTuple(args, "i|O:read", &fd, &pybufsize)) + goto bail; - if (!PyArg_ParseTuple(args, "i|O:read", &fd, &pybufsize)) - goto bail; + if (pybufsize && pybufsize != Py_None) + bufsize = PyInt_AsLong(pybufsize); - if (pybufsize && pybufsize != Py_None) - bufsize = PyInt_AsLong(pybufsize); + ret = PyList_New(0); + if (ret == NULL) + goto bail; - ret = PyList_New(0); - if (ret == NULL) - goto bail; + if (bufsize <= 0) { + int r; - if (bufsize <= 0) { - int r; + Py_BEGIN_ALLOW_THREADS; + r = ioctl(fd, FIONREAD, &bufsize); + Py_END_ALLOW_THREADS; - Py_BEGIN_ALLOW_THREADS - r = ioctl(fd, FIONREAD, &bufsize); - Py_END_ALLOW_THREADS - - if (r == -1) { - PyErr_SetFromErrno(PyExc_OSError); - goto bail; + if (r == -1) { + PyErr_SetFromErrno(PyExc_OSError); + goto bail; + } + if (bufsize == 0) + goto done; } - if (bufsize == 0) - goto done; - } - else { - static long name_max; - static long name_fd = -1; - long min; + else { + static long name_max; + static long name_fd = -1; + long min; - if (name_fd != fd) { - name_fd = fd; - Py_BEGIN_ALLOW_THREADS - name_max = fpathconf(fd, _PC_NAME_MAX); - Py_END_ALLOW_THREADS + if (name_fd != fd) { + name_fd = fd; + Py_BEGIN_ALLOW_THREADS; + name_max = fpathconf(fd, _PC_NAME_MAX); + Py_END_ALLOW_THREADS; + } + + min = sizeof(struct inotify_event) + name_max + 1; + + if (bufsize < min) { + PyErr_Format(PyExc_ValueError, + "bufsize must be at least %d", (int)min); + goto bail; + } } - min = sizeof(struct inotify_event) + name_max + 1; - - if (bufsize < min) { - PyErr_Format(PyExc_ValueError, "bufsize must be at least %d", - (int) min); - goto bail; - } - } - - buf = alloca(bufsize); - - Py_BEGIN_ALLOW_THREADS - nread = read(fd, buf, bufsize); - Py_END_ALLOW_THREADS - - if (nread == -1) { - PyErr_SetFromErrno(PyExc_OSError); - goto bail; - } - - ctor_args = PyTuple_New(0); - - if (ctor_args == NULL) - goto bail; + buf = alloca(bufsize); - pos = 0; - - while (pos < nread) { - struct inotify_event *in = (struct inotify_event *) (buf + pos); - struct event *evt; - PyObject *obj; - - obj = PyObject_CallObject((PyObject *) &event_type, ctor_args); - - if (obj == NULL) - goto bail; - - evt = (struct event *) obj; + Py_BEGIN_ALLOW_THREADS; + nread = read(fd, buf, bufsize); + Py_END_ALLOW_THREADS; - evt->wd = PyInt_FromLong(in->wd); - evt->mask = PyInt_FromLong(in->mask); - if (in->mask & IN_MOVE) - evt->cookie = PyInt_FromLong(in->cookie); - else { - Py_INCREF(Py_None); - evt->cookie = Py_None; - } - if (in->len) - evt->name = PyString_FromString(in->name); - else { - Py_INCREF(Py_None); - evt->name = Py_None; + if (nread == -1) { + PyErr_SetFromErrno(PyExc_OSError); + goto bail; } - if (!evt->wd || !evt->mask || !evt->cookie || !evt->name) - goto mybail; + ctor_args = PyTuple_New(0); + + if (ctor_args == NULL) + goto bail; + + pos = 0; - if (PyList_Append(ret, obj) == -1) - goto mybail; + while (pos < nread) { + struct inotify_event *in = (struct inotify_event *)(buf + pos); + struct event *evt; + PyObject *obj; - pos += sizeof(struct inotify_event) + in->len; - continue; + obj = PyObject_CallObject((PyObject *)&event_type, ctor_args); + + if (obj == NULL) + goto bail; + + evt = (struct event *)obj; - mybail: - Py_CLEAR(evt->wd); - Py_CLEAR(evt->mask); - Py_CLEAR(evt->cookie); - Py_CLEAR(evt->name); - Py_DECREF(obj); + evt->wd = PyInt_FromLong(in->wd); + evt->mask = PyInt_FromLong(in->mask); + if (in->mask & IN_MOVE) + evt->cookie = PyInt_FromLong(in->cookie); + else { + Py_INCREF(Py_None); + evt->cookie = Py_None; + } + if (in->len) + evt->name = PyString_FromString(in->name); + else { + Py_INCREF(Py_None); + evt->name = Py_None; + } + + if (!evt->wd || !evt->mask || !evt->cookie || !evt->name) + goto mybail; - goto bail; - } + if (PyList_Append(ret, obj) == -1) + goto mybail; + + pos += sizeof(struct inotify_event) + in->len; + continue; - goto done; + mybail: + Py_CLEAR(evt->wd); + Py_CLEAR(evt->mask); + Py_CLEAR(evt->cookie); + Py_CLEAR(evt->name); + Py_DECREF(obj); + + goto bail; + } + + goto done; bail: - Py_CLEAR(ret); + Py_CLEAR(ret); done: - Py_XDECREF(ctor_args); + Py_XDECREF(ctor_args); - return ret; + return ret; } PyDoc_STRVAR( - read_doc, - "read(fd, bufsize[=65536]) -> list_of_events\n" - "\n" - "\nRead inotify events from a file descriptor.\n" - "\n" - " fd: file descriptor returned by init()\n" - " bufsize: size of buffer to read into, in bytes\n" - "\n" - "Return a list of event objects.\n" - "\n" - "If bufsize is > 0, block until events are available to be read.\n" - "Otherwise, immediately return all events that can be read without\n" - "blocking."); - + read_doc, + "read(fd, bufsize[=65536]) -> list_of_events\n" + "\n" + "\nRead inotify events from a file descriptor.\n" + "\n" + " fd: file descriptor returned by init()\n" + " bufsize: size of buffer to read into, in bytes\n" + "\n" + "Return a list of event objects.\n" + "\n" + "If bufsize is > 0, block until events are available to be read.\n" + "Otherwise, immediately return all events that can be read without\n" + "blocking."); static PyMethodDef methods[] = { - {"init", init, METH_VARARGS, init_doc}, - {"add_watch", add_watch, METH_VARARGS, add_watch_doc}, - {"remove_watch", remove_watch, METH_VARARGS, remove_watch_doc}, - {"read", read_events, METH_VARARGS, read_doc}, - {"decode_mask", pydecode_mask, METH_VARARGS, decode_mask_doc}, - {NULL}, + {"init", init, METH_VARARGS, init_doc}, + {"add_watch", add_watch, METH_VARARGS, add_watch_doc}, + {"remove_watch", remove_watch, METH_VARARGS, remove_watch_doc}, + {"read", read_events, METH_VARARGS, read_doc}, + {"decode_mask", pydecode_mask, METH_VARARGS, decode_mask_doc}, + {NULL}, }; void init_inotify(void) { - PyObject *mod, *dict; + PyObject *mod, *dict; - if (PyType_Ready(&event_type) == -1) - return; + if (PyType_Ready(&event_type) == -1) + return; - mod = Py_InitModule3("_inotify", methods, doc); + mod = Py_InitModule3("_inotify", methods, doc); - dict = PyModule_GetDict(mod); + dict = PyModule_GetDict(mod); - if (dict) - define_consts(dict); + if (dict) + define_consts(dict); }