From 5228b499ae2aaf77a7203a33a6a3216854fbe479 Mon Sep 17 00:00:00 2001 From: michux Date: Thu, 10 Apr 2008 14:45:45 +0000 Subject: Add basic FIFO plugin git-svn-id: https://ssl.bulix.org/svn/lcd4linux/trunk@869 3ae390bd-cb1e-0410-b409-cd5a39f66f1f --- Makefile.am | 1 + plugin.c | 8 +++ plugin_fifo.c | 180 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ plugins.m4 | 8 +++ 4 files changed, 197 insertions(+) create mode 100644 plugin_fifo.c 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 \ diff --git a/plugin.c b/plugin.c index 3581229..66966ae 100644 --- 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 index 0000000..12a9374 --- /dev/null +++ b/plugin_fifo.c @@ -0,0 +1,180 @@ +/* $Id$ + * $URL$ + * + * plugin template + * + * Copyright (C) 2008 Michael Vogt + * Copyright (C) 2004, 2005, 2006, 2007, 2008 The LCD4Linux Team + * + * 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 +#include +#include +#include +#include +#include +#include + +/* these should always be included */ +#include "debug.h" +#include "plugin.h" +#include "cfg.h" + +#ifdef WITH_DMALLOC +#include +#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(); + } diff --git a/plugins.m4 b/plugins.m4 index f2ddf2c..da13c1b 100644 --- a/plugins.m4 +++ b/plugins.m4 @@ -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 -- cgit v1.2.3