Radix cross Linux

The main Radix cross Linux repository contains the build scripts of packages, which have the most complete and common functionality for desktop machines

452 Commits   2 Branches   1 Tag
Index: gamin.c
===================================================================
--- gamin.c	(nonexistent)
+++ gamin.c	(revision 5)
@@ -0,0 +1,461 @@
+/*
+ * gamin.c: glue to the gamin library for access from Python
+ *
+ * See Copyright for the status of this software.
+ *
+ * veillard@redhat.com
+ */
+
+#include <Python.h>
+#include <fam.h>
+
+#ifdef GAMIN_DEBUG_API
+int FAMDebug(FAMConnection *fc, const char *filename, FAMRequest * fr,
+             void *userData);
+#endif
+
+void init_gamin(void);
+
+static FAMConnection **connections = NULL;
+static int nb_connections = 0;
+static int max_connections = 0;
+
+static FAMRequest **requests = NULL;
+static int nb_requests = 0;
+static int max_requests = 0;
+
+static int
+get_connection(void) {
+    int i;
+
+    if (connections == NULL) {
+        max_connections = 10;
+        connections = (FAMConnection **) malloc(max_connections *
+	                                        sizeof(FAMConnection *));
+	if (connections == NULL) {
+	    max_connections = 0;
+	    return(-1);
+	}
+	memset(connections, 0, max_connections * sizeof(FAMConnection *));
+    }
+    for (i = 0;i < max_connections;i++)
+        if (connections[i] == NULL)
+	    break;
+    if (i >= max_connections) {
+        FAMConnection **tmp;
+
+	tmp = (FAMConnection **) realloc(connections, max_connections * 2 *
+	                                 sizeof(FAMConnection *));
+	if (tmp == NULL)
+	    return(-1);
+	memset(&tmp[max_connections], 0,
+	       max_connections * sizeof(FAMConnection *));
+	max_connections *= 2;
+	connections = tmp;
+    }
+    connections[i] = (FAMConnection *) malloc(sizeof(FAMConnection));
+    if (connections[i] == NULL)
+        return(-1);
+    nb_connections++;
+    return(i);
+}
+
+static int
+release_connection(int no) {
+    if ((no < 0) || (no >= max_connections))
+        return(-1);
+    if (connections[no] == NULL)
+        return(-1);
+    free(connections[no]);
+    connections[no] = NULL;
+    nb_connections--;
+    return(0);
+}
+
+static FAMConnection *
+check_connection(int no) {
+    if ((no < 0) || (no >= max_connections))
+        return(NULL);
+    return(connections[no]);
+}
+
+static int
+get_request(void) {
+    int i;
+
+    if (requests == NULL) {
+        max_requests = 10;
+        requests = (FAMRequest **) malloc(max_requests *
+	                                        sizeof(FAMRequest *));
+	if (requests == NULL) {
+	    max_requests = 0;
+	    return(-1);
+	}
+	memset(requests, 0, max_requests * sizeof(FAMRequest *));
+    }
+    for (i = 0;i < max_requests;i++)
+        if (requests[i] == NULL)
+	    break;
+    if (i >= max_requests) {
+        FAMRequest **tmp;
+
+	tmp = (FAMRequest **) realloc(requests, max_requests * 2 *
+	                                 sizeof(FAMRequest *));
+	if (tmp == NULL)
+	    return(-1);
+	memset(&tmp[max_requests], 0,
+	       max_requests * sizeof(FAMRequest *));
+	max_requests *= 2;
+	requests = tmp;
+    }
+    requests[i] = (FAMRequest *) malloc(sizeof(FAMRequest));
+    if (requests[i] == NULL)
+        return(-1);
+    nb_requests++;
+    return(i);
+}
+
+static int
+release_request(int no) {
+    if ((no < 0) || (no >= max_requests))
+        return(-1);
+    if (requests[no] == NULL)
+        return(-1);
+    free(requests[no]);
+    requests[no] = NULL;
+    nb_requests--;
+    return(0);
+}
+
+static FAMRequest *
+check_request(int no) {
+    if ((no < 0) || (no >= max_requests))
+        return(NULL);
+    return(requests[no]);
+}
+
+static int fam_connect(void) {
+    int ret;
+    int no = get_connection();
+    FAMConnection *conn;
+
+    if (no < 0)
+        return(-1);
+    conn = connections[no];
+    if (conn == NULL)
+        return(-1);
+    ret = FAMOpen2(conn, "gamin-python");
+    if (ret < 0) {
+        release_connection(no);
+        return(ret);
+    }
+    return(no);
+}
+
+static int
+call_internal_callback(PyObject *self, const char *filename, FAMCodes event) {
+    PyObject *ret;
+
+    if ((self == NULL) || (filename == NULL))
+        return(-1);
+/*    fprintf(stderr, "call_internal_callback(%p)\n", self); */
+    ret = PyEval_CallMethod(self, (char *) "_internal_callback",
+                            (char *) "(zi)", filename, (int) event);
+    if (ret != NULL) {
+        Py_DECREF(ret);
+#if 0
+    } else {
+	fprintf(stderr, "call_internal_callback() failed\n");
+#endif
+    }
+    return(0);
+}
+
+static PyObject *
+gamin_Errno(PyObject *self, PyObject * args) {
+    return(PyInt_FromLong(FAMErrno));
+}
+
+static PyObject *
+gamin_MonitorConnect(PyObject *self, PyObject * args) {
+    int ret;
+
+    ret = fam_connect();
+    if (ret < 0) {
+	return(PyInt_FromLong(-1));
+    }
+    return(PyInt_FromLong(ret));
+}
+
+static PyObject *
+gamin_GetFd(PyObject *self, PyObject * args) {
+    int no;
+    FAMConnection *conn;
+
+    if (!PyArg_ParseTuple(args, (char *)"i:GetFd", &no))
+	return(NULL);
+
+    conn = check_connection(no);
+    if (conn == NULL) {
+	return(PyInt_FromLong(-1));
+    }
+    return(PyInt_FromLong(FAMCONNECTION_GETFD(conn)));
+}
+
+static PyObject *
+gamin_MonitorClose(PyObject *self, PyObject * args) {
+    int no;
+    int ret;
+
+    if (!PyArg_ParseTuple(args, (char *)"i:MonitorClose", &no))
+	return(NULL);
+
+    ret = release_connection(no);
+    return(PyInt_FromLong(ret));
+}
+
+static PyObject *
+gamin_ProcessOneEvent(PyObject *self, PyObject * args) {
+    int ret;
+    FAMEvent fe;
+    int no;
+    FAMConnection *conn;
+
+    if (!PyArg_ParseTuple(args, (char *)"i:ProcessOneEvent", &no))
+	return(NULL);
+
+    conn = check_connection(no);
+    if (conn == NULL) {
+	return(PyInt_FromLong(-1));
+    }
+
+    ret = FAMNextEvent(conn, &fe);
+    if (ret < 0) {
+	return(PyInt_FromLong(-1));
+    }
+    call_internal_callback(fe.userdata, &fe.filename[0], fe.code);
+
+    return(PyInt_FromLong(ret));
+}
+
+static PyObject *
+gamin_ProcessEvents(PyObject *self, PyObject * args) {
+    int ret;
+    int nb = 0;
+    FAMEvent fe;
+    int no;
+    FAMConnection *conn;
+
+    if (!PyArg_ParseTuple(args, (char *)"i:ProcessOneEvent", &no))
+	return(NULL);
+
+    conn = check_connection(no);
+    if (conn == NULL) {
+	return(PyInt_FromLong(-1));
+    }
+
+    do {
+	ret = FAMPending(conn);
+	if (ret < 0)
+	    return(PyInt_FromLong(-1));
+	if (ret == 0)
+	    break;
+	ret = FAMNextEvent(conn, &fe);
+	if (ret < 0)
+	    return(PyInt_FromLong(-1));
+	call_internal_callback(fe.userdata, &fe.filename[0], fe.code);
+	nb++;
+    } while (ret >= 0);
+
+    return(PyInt_FromLong(nb));
+}
+
+static PyObject *
+gamin_EventPending(PyObject *self, PyObject * args) {
+    int no;
+    FAMConnection *conn;
+
+    if (!PyArg_ParseTuple(args, (char *)"i:ProcessOneEvent", &no))
+	return(NULL);
+
+    conn = check_connection(no);
+    if (conn == NULL) {
+	return(PyInt_FromLong(-1));
+    }
+    return(PyInt_FromLong(FAMPending(conn)));
+}
+
+static PyObject *
+gamin_MonitorNoExists(PyObject *self, PyObject * args) {
+    int no;
+    FAMConnection *conn;
+
+    if (!PyArg_ParseTuple(args, (char *)"i:MonitorNoExists", &no))
+	return(NULL);
+
+    conn = check_connection(no);
+    if (conn == NULL) {
+	return(PyInt_FromLong(-1));
+    }
+    return(PyInt_FromLong(FAMNoExists(conn)));
+}
+
+static PyObject *
+gamin_MonitorDirectory(PyObject *self, PyObject * args) {
+    PyObject *userdata;
+    char * filename;
+    int ret;
+    int noreq;
+    int no;
+    FAMConnection *conn;
+    FAMRequest *request;
+
+    if (!PyArg_ParseTuple(args, (char *)"izO:MonitorDirectory",
+        &no, &filename, &userdata))
+	return(NULL);
+    
+    conn = check_connection(no);
+    if (conn == NULL) {
+	return(PyInt_FromLong(-1));
+    }
+    noreq = get_request();
+    if (noreq < 0) {
+	return(PyInt_FromLong(-1));
+    }
+    request = check_request(noreq);
+
+    ret = FAMMonitorDirectory(conn, filename, request, userdata);
+    if (ret < 0) {
+        release_request(noreq);
+	return(PyInt_FromLong(-1));
+    }
+    return(PyInt_FromLong(noreq));
+}
+
+static PyObject *
+gamin_MonitorFile(PyObject *self, PyObject * args) {
+    PyObject *userdata;
+    char * filename;
+    int ret;
+    int noreq;
+    int no;
+    FAMConnection *conn;
+    FAMRequest *request;
+
+    if (!PyArg_ParseTuple(args, (char *)"izO:MonitorFile",
+        &no, &filename, &userdata))
+	return(NULL);
+    
+    conn = check_connection(no);
+    if (conn == NULL) {
+	return(PyInt_FromLong(-1));
+    }
+    noreq = get_request();
+    if (noreq < 0) {
+	return(PyInt_FromLong(-1));
+    }
+    request = check_request(noreq);
+
+    ret = FAMMonitorFile(conn, filename, request, userdata);
+    if (ret < 0) {
+        release_request(noreq);
+	return(PyInt_FromLong(-1));
+    }
+    return(PyInt_FromLong(noreq));
+}
+
+static PyObject *
+gamin_MonitorCancel(PyObject *self, PyObject * args) {
+    int ret;
+    int noreq;
+    int no;
+    FAMConnection *conn;
+    FAMRequest *request;
+
+    if (!PyArg_ParseTuple(args, (char *)"ii:MonitorCancel",
+        &no, &noreq))
+	return(NULL);
+    
+    conn = check_connection(no);
+    if (conn == NULL) {
+	return(PyInt_FromLong(-1));
+    }
+    request = check_request(noreq);
+    if (request == NULL) {
+	return(PyInt_FromLong(-1));
+    }
+
+    ret = FAMCancelMonitor(conn, request);
+    if (ret < 0) {
+        release_request(noreq);
+	return(PyInt_FromLong(-1));
+    }
+    return(PyInt_FromLong(ret));
+}
+
+#ifdef GAMIN_DEBUG_API
+static PyObject *
+gamin_MonitorDebug(PyObject *self, PyObject * args) {
+    PyObject *userdata;
+    char * filename;
+    int ret;
+    int noreq;
+    int no;
+    FAMConnection *conn;
+    FAMRequest *request;
+
+    if (!PyArg_ParseTuple(args, (char *)"izO:MonitorDebug",
+        &no, &filename, &userdata))
+	return(NULL);
+    
+    conn = check_connection(no);
+    if (conn == NULL) {
+	return(PyInt_FromLong(-1));
+    }
+    noreq = get_request();
+    if (noreq < 0) {
+	return(PyInt_FromLong(-1));
+    }
+    request = check_request(noreq);
+
+    ret = FAMDebug(conn, filename, request, userdata);
+    if (ret < 0) {
+        release_request(noreq);
+	return(PyInt_FromLong(-1));
+    }
+    return(PyInt_FromLong(noreq));
+}
+#endif
+
+static PyMethodDef gaminMethods[] = {
+    {(char *)"MonitorConnect", gamin_MonitorConnect, METH_VARARGS, NULL},
+    {(char *)"MonitorDirectory", gamin_MonitorDirectory, METH_VARARGS, NULL},
+    {(char *)"MonitorFile", gamin_MonitorFile, METH_VARARGS, NULL},
+    {(char *)"MonitorCancel", gamin_MonitorCancel, METH_VARARGS, NULL},
+    {(char *)"MonitorNoExists", gamin_MonitorNoExists, METH_VARARGS, NULL},
+    {(char *)"EventPending", gamin_EventPending, METH_VARARGS, NULL},
+    {(char *)"ProcessOneEvent", gamin_ProcessOneEvent, METH_VARARGS, NULL},
+    {(char *)"ProcessEvents", gamin_ProcessEvents, METH_VARARGS, NULL},
+    {(char *)"MonitorClose", gamin_MonitorClose, METH_VARARGS, NULL},
+    {(char *)"GetFd", gamin_GetFd, METH_VARARGS, NULL},
+    {(char *)"Errno", gamin_Errno, METH_VARARGS, NULL},
+#ifdef GAMIN_DEBUG_API
+    {(char *)"MonitorDebug", gamin_MonitorDebug, METH_VARARGS, NULL},
+#endif
+    {NULL, NULL, 0, NULL}
+};
+
+void
+init_gamin(void)
+{
+    static int initialized = 0;
+
+    if (initialized != 0)
+        return;
+
+    /* intialize the python extension module */
+    Py_InitModule((char *) "_gamin", gaminMethods);
+
+    initialized = 1;
+}
+
Index: .
===================================================================
--- .	(nonexistent)
+++ .	(revision 5)

Property changes on: .
___________________________________________________________________
Added: svn:ignore
## -0,0 +1,73 ##
+
+# install dir
+dist
+
+# Target build dirs
+.a1x-newlib
+.a2x-newlib
+.at91sam7s-newlib
+
+.build-machine
+
+.a1x-glibc
+.a2x-glibc
+.h3-glibc
+.h5-glibc
+.i586-glibc
+.i686-glibc
+.imx6-glibc
+.jz47xx-glibc
+.makefile
+.am335x-glibc
+.omap543x-glibc
+.p5600-glibc
+.power8-glibc
+.power8le-glibc
+.power9-glibc
+.power9le-glibc
+.m1000-glibc
+.riscv64-glibc
+.rk328x-glibc
+.rk33xx-glibc
+.rk339x-glibc
+.s8xx-glibc
+.s9xx-glibc
+.x86_64-glibc
+
+# Hidden files (each file)
+.makefile
+.dist
+.rootfs
+
+# src & hw requires
+.src_requires
+.src_requires_depend
+.requires
+.requires_depend
+
+# Tarballs
+*.gz
+*.bz2
+*.lz
+*.xz
+*.tgz
+*.txz
+
+# Signatures
+*.asc
+*.sig
+*.sign
+*.sha1sum
+
+# Patches
+*.patch
+
+# Descriptions
+*.dsc
+*.txt
+
+# Default linux config files
+*.defconfig
+
+# backup copies
+*~