12 #include <alloca.h> |
12 #include <alloca.h> |
13 #include <sys/inotify.h> |
13 #include <sys/inotify.h> |
14 #include <stdint.h> |
14 #include <stdint.h> |
15 #include <sys/ioctl.h> |
15 #include <sys/ioctl.h> |
16 #include <unistd.h> |
16 #include <unistd.h> |
|
17 |
|
18 /* Variables used in the event string representation */ |
|
19 static PyObject *join; |
|
20 static PyObject *er_wm; |
|
21 static PyObject *er_wmc; |
|
22 static PyObject *er_wmn; |
|
23 static PyObject *er_wmcn; |
17 |
24 |
18 static PyObject *init(PyObject *self, PyObject *args) |
25 static PyObject *init(PyObject *self, PyObject *args) |
19 { |
26 { |
20 PyObject *ret = NULL; |
27 PyObject *ret = NULL; |
21 int fd = -1; |
28 int fd = -1; |
330 Py_TYPE(evt)->tp_free(evt); |
337 Py_TYPE(evt)->tp_free(evt); |
331 } |
338 } |
332 |
339 |
333 static PyObject *event_repr(struct event *evt) |
340 static PyObject *event_repr(struct event *evt) |
334 { |
341 { |
335 int wd = PyInt_AsLong(evt->wd); |
|
336 int cookie = evt->cookie == Py_None ? -1 : PyInt_AsLong(evt->cookie); |
342 int cookie = evt->cookie == Py_None ? -1 : PyInt_AsLong(evt->cookie); |
337 PyObject *ret = NULL, *pymasks = NULL, *pymask = NULL; |
343 PyObject *ret = NULL, *pymasks = NULL, *pymask = NULL; |
338 PyObject *join = NULL; |
|
339 char *maskstr; |
344 char *maskstr; |
340 |
345 PyObject *tuple = NULL, *formatstr = NULL; |
341 join = PyString_FromString("|"); |
|
342 if (join == NULL) |
|
343 goto bail; |
|
344 |
346 |
345 pymasks = decode_mask(PyInt_AsLong(evt->mask)); |
347 pymasks = decode_mask(PyInt_AsLong(evt->mask)); |
346 if (pymasks == NULL) |
348 if (pymasks == NULL) |
347 goto bail; |
349 goto bail; |
348 |
350 |
349 pymask = _PyString_Join(join, pymasks); |
351 pymask = _PyString_Join(join, pymasks); |
350 if (pymask == NULL) |
352 if (pymask == NULL) |
351 goto bail; |
353 goto bail; |
352 |
354 |
353 maskstr = PyString_AsString(pymask); |
|
354 |
|
355 if (evt->name != Py_None) { |
355 if (evt->name != Py_None) { |
356 PyObject *pyname = PyString_Repr(evt->name, 1); |
356 if (cookie == -1) { |
357 char *name = pyname ? PyString_AsString(pyname) : "???"; |
357 formatstr = er_wmn; |
358 |
358 tuple = PyTuple_Pack(3, evt->wd, pymask, evt->name); |
359 if (cookie == -1) |
359 } |
360 ret = PyString_FromFormat( |
360 else { |
361 "event(wd=%d, mask=%s, name=%s)", |
361 formatstr = er_wmcn; |
362 wd, maskstr, name); |
362 tuple = PyTuple_Pack(4, evt->wd, pymask, |
363 else |
363 evt->cookie, evt->name); |
364 ret = PyString_FromFormat("event(wd=%d, mask=%s, " |
364 } |
365 "cookie=0x%x, name=%s)", |
|
366 wd, maskstr, cookie, name); |
|
367 |
|
368 Py_XDECREF(pyname); |
|
369 } else { |
365 } else { |
370 if (cookie == -1) |
366 if (cookie == -1) { |
371 ret = PyString_FromFormat("event(wd=%d, mask=%s)", |
367 formatstr = er_wm; |
372 wd, maskstr); |
368 tuple = PyTuple_Pack(2, evt->wd, pymask); |
|
369 } |
373 else { |
370 else { |
374 ret = PyString_FromFormat( |
371 formatstr = er_wmc; |
375 "event(wd=%d, mask=%s, cookie=0x%x)", |
372 tuple = PyTuple_Pack(3, evt->wd, pymask, evt->cookie); |
376 wd, maskstr, cookie); |
373 } |
377 } |
374 } |
378 } |
375 |
|
376 if (tuple == NULL) |
|
377 goto bail; |
|
378 |
|
379 ret = PyNumber_Remainder(formatstr, tuple); |
|
380 |
|
381 if (ret == NULL) |
|
382 goto bail; |
379 |
383 |
380 goto done; |
384 goto done; |
381 bail: |
385 bail: |
382 Py_CLEAR(ret); |
386 Py_CLEAR(ret); |
383 |
387 |
384 done: |
388 done: |
385 Py_XDECREF(pymask); |
389 Py_XDECREF(pymask); |
386 Py_XDECREF(pymasks); |
390 Py_XDECREF(pymasks); |
387 Py_XDECREF(join); |
391 Py_XDECREF(tuple); |
388 |
392 |
389 return ret; |
393 return ret; |
390 } |
394 } |
391 |
395 |
392 static PyTypeObject event_type = { |
396 static PyTypeObject event_type = { |
559 Py_XDECREF(ctor_args); |
563 Py_XDECREF(ctor_args); |
560 |
564 |
561 return ret; |
565 return ret; |
562 } |
566 } |
563 |
567 |
|
568 static int init_globals(void) |
|
569 { |
|
570 join = PyString_FromString("|"); |
|
571 er_wm = PyString_FromString("event(wd=%d, mask=%s)"); |
|
572 er_wmn = PyString_FromString("event(wd=%d, mask=%s, name=%s)"); |
|
573 er_wmc = PyString_FromString("event(wd=%d, mask=%s, cookie=0x%x)"); |
|
574 er_wmcn = PyString_FromString("event(wd=%d, mask=%s, cookie=0x%x, name=%s)"); |
|
575 |
|
576 return join && er_wm && er_wmn && er_wmc && er_wmcn; |
|
577 } |
|
578 |
564 PyDoc_STRVAR( |
579 PyDoc_STRVAR( |
565 read_doc, |
580 read_doc, |
566 "read(fd, bufsize[=65536]) -> list_of_events\n" |
581 "read(fd, bufsize[=65536]) -> list_of_events\n" |
567 "\n" |
582 "\n" |
568 "\nRead inotify events from a file descriptor.\n" |
583 "\nRead inotify events from a file descriptor.\n" |