hgext/inotify/linux/_inotify.c
changeset 11548 dd2f356e1f6f
parent 11547 36a6aeb679da
child 11549 935c83ce9172
equal deleted inserted replaced
11547:36a6aeb679da 11548:dd2f356e1f6f
    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;
   310 	 "file name"},
   317 	 "file name"},
   311 	{NULL}
   318 	{NULL}
   312 };
   319 };
   313 
   320 
   314 PyDoc_STRVAR(
   321 PyDoc_STRVAR(
   315     event_doc,
   322 	event_doc,
   316     "event: Structure describing an inotify event.");
   323 	"event: Structure describing an inotify event.");
   317 
   324 
   318 static PyObject *event_new(PyTypeObject *t, PyObject *a, PyObject *k)
   325 static PyObject *event_new(PyTypeObject *t, PyObject *a, PyObject *k)
   319 {
   326 {
   320 	return (*t->tp_alloc)(t, 0);
   327 	return (*t->tp_alloc)(t, 0);
   321 }
   328 }
   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"
   590 	PyObject *mod, *dict;
   605 	PyObject *mod, *dict;
   591 
   606 
   592 	if (PyType_Ready(&event_type) == -1)
   607 	if (PyType_Ready(&event_type) == -1)
   593 		return;
   608 		return;
   594 
   609 
       
   610 	if (!init_globals())
       
   611 		return;
       
   612 
   595 	mod = Py_InitModule3("_inotify", methods, doc);
   613 	mod = Py_InitModule3("_inotify", methods, doc);
   596 
   614 
   597 	dict = PyModule_GetDict(mod);
   615 	dict = PyModule_GetDict(mod);
   598 
   616 
   599 	if (dict)
   617 	if (dict)