]> git.webhop.me Git - lcd4linux.git/commitdiff
Add basic FIFO plugin
authormichux <michux@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Thu, 10 Apr 2008 14:45:45 +0000 (14:45 +0000)
committermichux <michux@3ae390bd-cb1e-0410-b409-cd5a39f66f1f>
Thu, 10 Apr 2008 14:45:45 +0000 (14:45 +0000)
git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@869 3ae390bd-cb1e-0410-b409-cd5a39f66f1f

Makefile.am
plugin.c
plugin_fifo.c [new file with mode: 0644]
plugins.m4

index dd1880dc9bb916a359a77a8b97f29ba24d2de5a5..54ce1f960d732d7b0eb618d23ac1381a8b2a9b5b 100644 (file)
@@ -114,6 +114,7 @@ plugin_cpuinfo.c              \
 plugin_diskstats.c            \
 plugin_dvb.c                  \
 plugin_exec.c                 \
+plugin_fifo.c                 \
 plugin_file.c                 \
 plugin_gps.c                  \
 plugin_i2c_sensors.c          \
index 35812291e3e6d9d23bd82102737a5ca041396838..66966aeec45e73eef8ec7d19b06697bd7e28f234 100644 (file)
--- a/plugin.c
+++ b/plugin.c
@@ -68,6 +68,8 @@ int plugin_init_dvb(void);
 void plugin_exit_dvb(void);
 int plugin_init_exec(void);
 void plugin_exit_exec(void);
+int plugin_init_fifo(void);
+void plugin_exit_fifo(void);
 int plugin_init_file(void);
 void plugin_exit_file(void);
 int plugin_init_gps(void);
@@ -144,6 +146,9 @@ int plugin_init(void)
 #ifdef PLUGIN_EXEC
     plugin_init_exec();
 #endif
+#ifdef PLUGIN_FIFO
+    plugin_init_fifo();
+#endif
 #ifdef PLUGIN_FILE
     plugin_init_file();
 #endif
@@ -242,6 +247,9 @@ void plugin_exit(void)
 #ifdef PLUGIN_EXEC
     plugin_exit_exec();
 #endif
+#ifdef PLUGIN_FIFO
+    plugin_exit_fifo();
+#endif
 #ifdef PLUGIN_FILE
     plugin_exit_file();
 #endif
diff --git a/plugin_fifo.c b/plugin_fifo.c
new file mode 100644 (file)
index 0000000..12a9374
--- /dev/null
@@ -0,0 +1,180 @@
+/* $Id$\r
+ * $URL$\r
+ *\r
+ * plugin template\r
+ *\r
+ * Copyright (C) 2008 Michael Vogt <michu@neophob.com>\r
+ * Copyright (C) 2004, 2005, 2006, 2007, 2008 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>\r
+ *\r
+ * This file is part of LCD4Linux.\r
+ *\r
+ * LCD4Linux is free software; you can redistribute it and/or modify\r
+ * it under the terms of the GNU General Public License as published by\r
+ * the Free Software Foundation; either version 2, or (at your option)\r
+ * any later version.\r
+ *\r
+ * LCD4Linux is distributed in the hope that it will be useful,\r
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
+ * GNU General Public License for more details.\r
+ *\r
+ * You should have received a copy of the GNU General Public License\r
+ * along with this program; if not, write to the Free Software\r
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\r
+ *\r
+ */  \r
+    \r
+/* \r
+ * Quick fifo hack for lcd4linux\r
+ * \r
+ * most code is ripped ...\r
+ *\r
+ */ \r
+    \r\r
+/* define the include files you need */ \r
+#include "config.h"\r
+    \r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <ctype.h>\r
+#include <errno.h>\r
+#include <unistd.h>\r
+#include <fcntl.h>\r
+#include <sys/stat.h>\r
+    \r
+/* these should always be included */ \r
+#include "debug.h"\r
+#include "plugin.h"\r
+#include "cfg.h"\r
+    \r
+#ifdef WITH_DMALLOC\r
+#include <dmalloc.h>\r
+#endif /* \r */
+    \r
+#define FIFO_BUFFER_SIZE 80\r
+    \rtypedef struct _FifoData {
+    \rchar *path;
+    \r int input;
+    \r int created;
+\r \r} FifoData;
+\r\rstatic char Section[] = "Plugin:FIFO";
+\r\rstatic FifoData fd;
+\rstatic char msg[FIFO_BUFFER_SIZE];
+\rstatic char fifopath[1024];
+\r\rstatic void configure_fifo(void) \r
+{
+    \rchar *s;
+    \rs = cfg_get(Section, "fifopath", "/tmp/lcd4linux.fifo");
+    \rif (*s == '\0') {
+       \rinfo("[FIFO] empty '%s.fifopath' entry from %s, assuming '/tmp/lcd4linux.fifo'", Section, cfg_source());
+       \rstrcpy(fifopath, "/tmp/lcd4linux.fifo");
+    \r} else
+       \rstrcpy(fifopath, s);
+    \r\rfree(s);
+\r}
+\r\r\rstatic void removeFifo() \r
+{
+    \rdebug("Removing FIFO \"%s\"\n", fd.path);
+    \r\rif (unlink(fd.path) < 0) {
+       \rerror("Could not remove FIFO \"%s\": %s\n", fd.path, strerror(errno));
+       \rreturn;
+    \r}
+    \r\rfd.created = 0;
+\r}
+\r\rstatic void closeFifo() \r
+{
+    \rstruct stat st;
+    \r\rif (fd.input >= 0) {
+       \rclose(fd.input);
+       \rfd.input = -1;
+    \r}
+    \r\rif (fd.created && (stat(fd.path, &st) == 0))
+       \rremoveFifo(fd);
+\r}
+\r\rstatic int makeFifo() \r
+{
+    \rif (mkfifo(fd.path, 0666) < 0) {
+       \rerror("Couldn't create FIFO \"%s\": %s\n", fd.path, strerror(errno));
+       \rreturn -1;
+    \r}
+    \r\rfd.created = 1;
+    \r\rreturn 0;
+\r}
+\r\r\rstatic int checkFifo() \r
+{
+    \rstruct stat st;
+    \rif (stat(fd.path, &st) < 0) {
+       \rif (errno == ENOENT) {
+           \r
+               /* Path doesn't exist */ \r
+               return makeFifo(fd);
+       \r}
+       \r\rerror("Failed to stat FIFO \"%s\": %s\n", fd.path, strerror(errno));
+       \rreturn -1;
+    \r}
+    \r\rif (!S_ISFIFO(st.st_mode)) {
+       \rerror("\"%s\" already exists, but is not a FIFO\n", fd.path);
+       \rreturn -1;
+    \r}
+    \r\rreturn 0;
+\r}
+\r\rstatic int openFifo() \r
+{
+    \rif (checkFifo() < 0)
+       \rreturn -1;
+    \r\rfd.input = open(fd.path, O_RDONLY | O_NONBLOCK);
+    \rif (fd.input < 0) {
+       \rerror("Could not open FIFO \"%s\" for reading: %s\n", fd.path, strerror(errno));
+       \rcloseFifo();
+       \rreturn -1;
+    \r}
+    \r\rreturn 0;
+\r}
+\r\rstatic void fiforead(RESULT * result) \r
+{
+    \rchar buf[FIFO_BUFFER_SIZE];
+    \rint i, bytes = 1;
+    \rmemset(buf, 0, FIFO_BUFFER_SIZE);
+    \r\rstrcat(buf, "ERROR");
+    \rif (checkFifo() == 0) {
+       \rmemset(buf, 0, FIFO_BUFFER_SIZE);
+       \rwhile (bytes > 0 && errno != EINTR)
+           \rbytes = read(fd.input, buf, FIFO_BUFFER_SIZE);
+       \r\rif (bytes < 0) {
+           \rerror("[FIFO] Error %i: %s\n", errno, strerror(errno));
+       \r} else {
+           \r\rif (strlen(buf) > 0) {
+               \rstrcpy(msg, buf);
+           \r}
+           \r\rfor (i = 0; i < strlen(buf); i++) {
+               \rif (msg[i] < 0x20)
+                   \rmsg[i] = ' ';
+           \r}
+       \r}
+    \r}
+    \r\r
+       /* store result */ \r
+       SetResult(&result, R_STRING, msg);
+\r}
+
+\r\r
+/* plugin initialization */ \r
+int plugin_init_fifo(void) \r
+{
+    \rconfigure_fifo();
+    \r\rfd.path = fifopath;
+    \rfd.input = -1;
+    \rfd.created = 0;
+    \r\rif (openFifo() < 0) {
+       \rreturn -1;
+    \r}
+    \r\rmemset(msg, 0, FIFO_BUFFER_SIZE);
+    \rAddFunction("fifo::read", 0, fiforead);
+    \r\rreturn 0;
+\r}
+\r\rvoid plugin_exit_fifo(void) \r
+{
+    \r
+       /* close filedescriptors */ \r
+       closeFifo();
+\r\r
index f2ddf2cc55b459d8c924ce8ded210aed3a90ad4d..da13c1b85f280fca3b9d51c606d56a7cae87381b 100644 (file)
@@ -60,6 +60,7 @@ for plugin in $plugins; do
          PLUGIN_DISKSTATS="yes"
          PLUGIN_DVB="yes"
          PLUGIN_EXEC="yes"
+         PLUGIN_FIFO="yes"
          PLUGIN_FILE="yes"
          PLUGIN_GPS="yes"
          PLUGIN_I2C_SENSORS="yes"
@@ -105,6 +106,9 @@ for plugin in $plugins; do
       exec)
          PLUGIN_EXEC=$val
          ;;
+      fifo)
+         PLUGIN_FIFO=$val
+         ;;
       file)
          PLUGIN_FILE=$val
          ;;
@@ -219,6 +223,10 @@ if test "$PLUGIN_FILE" = "yes"; then
    PLUGINS="$PLUGINS plugin_file.o"
    AC_DEFINE(PLUGIN_FILE,1,[file plugin])
 fi
+if test "$PLUGIN_FIFO" = "yes"; then
+   PLUGINS="$PLUGINS plugin_fifo.o"
+   AC_DEFINE(PLUGIN_FIFO,1,[fifo plugin])
+fi
 if test "$PLUGIN_GPS" = "yes"; then
    AC_CHECK_HEADERS(nmeap.h, [has_nmeap_header="true"], [has_nmeap_header="false"])
    if test "$has_nmeap_header" = "true"; then