diff options
Diffstat (limited to '')
-rw-r--r-- | Makefile.am | 1 | ||||
-rw-r--r-- | plugin.c | 8 | ||||
-rw-r--r-- | plugin_fifo.c | 180 | ||||
-rw-r--r-- | plugins.m4 | 8 |
4 files changed, 197 insertions, 0 deletions
diff --git a/Makefile.am b/Makefile.am index dd1880d..54ce1f9 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 \ @@ -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 index 0000000..12a9374 --- /dev/null +++ b/plugin_fifo.c @@ -0,0 +1,180 @@ +/* $Id$
+ * $URL$
+ *
+ * plugin template
+ *
+ * Copyright (C) 2008 Michael Vogt <michu@neophob.com>
+ * Copyright (C) 2004, 2005, 2006, 2007, 2008 The LCD4Linux Team <lcd4linux-devel@users.sourceforge.net>
+ *
+ * This file is part of LCD4Linux.
+ *
+ * LCD4Linux is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * LCD4Linux is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+/*
+ * Quick fifo hack for lcd4linux
+ *
+ * most code is ripped ...
+ *
+ */
+
+/* define the include files you need */
+#include "config.h"
+
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/stat.h>
+
+/* these should always be included */
+#include "debug.h"
+#include "plugin.h"
+#include "cfg.h"
+
+#ifdef WITH_DMALLOC
+#include <dmalloc.h>
+#endif /*
*/ +
+#define FIFO_BUFFER_SIZE 80
+
typedef struct _FifoData { +
char *path; +
int input; +
int created; +
} FifoData; +
static char Section[] = "Plugin:FIFO"; +
static FifoData fd; +
static char msg[FIFO_BUFFER_SIZE]; +
static char fifopath[1024]; +
static void configure_fifo(void)
+{ +
char *s; +
s = cfg_get(Section, "fifopath", "/tmp/lcd4linux.fifo"); +
if (*s == '\0') { +
info("[FIFO] empty '%s.fifopath' entry from %s, assuming '/tmp/lcd4linux.fifo'", Section, cfg_source()); +
strcpy(fifopath, "/tmp/lcd4linux.fifo"); +
} else +
strcpy(fifopath, s); +
free(s); +
} +
static void removeFifo()
+{ +
debug("Removing FIFO \"%s\"\n", fd.path); +
if (unlink(fd.path) < 0) { +
error("Could not remove FIFO \"%s\": %s\n", fd.path, strerror(errno)); +
return; +
} +
fd.created = 0; +
} +
static void closeFifo()
+{ +
struct stat st; +
if (fd.input >= 0) { +
close(fd.input); +
fd.input = -1; +
} +
if (fd.created && (stat(fd.path, &st) == 0)) +
removeFifo(fd); +
} +
static int makeFifo()
+{ +
if (mkfifo(fd.path, 0666) < 0) { +
error("Couldn't create FIFO \"%s\": %s\n", fd.path, strerror(errno)); +
return -1; +
} +
fd.created = 1; +
return 0; +
} +
static int checkFifo()
+{ +
struct stat st; +
if (stat(fd.path, &st) < 0) { +
if (errno == ENOENT) { +
+ /* Path doesn't exist */
+ return makeFifo(fd); +
} +
error("Failed to stat FIFO \"%s\": %s\n", fd.path, strerror(errno)); +
return -1; +
} +
if (!S_ISFIFO(st.st_mode)) { +
error("\"%s\" already exists, but is not a FIFO\n", fd.path); +
return -1; +
} +
return 0; +
} +
static int openFifo()
+{ +
if (checkFifo() < 0) +
return -1; +
fd.input = open(fd.path, O_RDONLY | O_NONBLOCK); +
if (fd.input < 0) { +
error("Could not open FIFO \"%s\" for reading: %s\n", fd.path, strerror(errno)); +
closeFifo(); +
return -1; +
} +
return 0; +
} +
static void fiforead(RESULT * result)
+{ +
char buf[FIFO_BUFFER_SIZE]; +
int i, bytes = 1; +
memset(buf, 0, FIFO_BUFFER_SIZE); +
strcat(buf, "ERROR"); +
if (checkFifo() == 0) { +
memset(buf, 0, FIFO_BUFFER_SIZE); +
while (bytes > 0 && errno != EINTR) +
bytes = read(fd.input, buf, FIFO_BUFFER_SIZE); +
if (bytes < 0) { +
error("[FIFO] Error %i: %s\n", errno, strerror(errno)); +
} else { +
if (strlen(buf) > 0) { +
strcpy(msg, buf); +
} +
for (i = 0; i < strlen(buf); i++) { +
if (msg[i] < 0x20) +
msg[i] = ' '; +
} +
} +
} +
+ /* store result */
+ SetResult(&result, R_STRING, msg); +
} + +
+/* plugin initialization */
+int plugin_init_fifo(void)
+{ +
configure_fifo(); +
fd.path = fifopath; +
fd.input = -1; +
fd.created = 0; +
if (openFifo() < 0) { +
return -1; +
} +
memset(msg, 0, FIFO_BUFFER_SIZE); +
AddFunction("fifo::read", 0, fiforead); +
return 0; +
} +
void plugin_exit_fifo(void)
+{ +
+ /* close filedescriptors */
+ closeFifo(); +
}
@@ -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 |