dpoke.c
changeset 1 3e9290bf7249
parent 0 a22a319f5129
child 19 bf780d158f3e
--- a/dpoke.c	Sat Mar 16 00:03:51 2013 +0400
+++ b/dpoke.c	Mon Oct 20 22:59:08 2014 +0400
@@ -21,7 +21,7 @@
 };
 typedef enum DPokeSourceType_en DPokeSourceType;
 
-#define DPOKE_BUFFER 32
+#define DPOKE_BUFFER 128
 struct DPokeSource_st {
     DPokeSourceType type;
     char *path;
@@ -48,35 +48,38 @@
 
 #define LENGTH(X)               (sizeof X / sizeof X[0])
 
-char* smprintf(char *fmt, ...) {
-    va_list fmtargs;
-    char *ret;
-    int len;
+char *
+smprintf(char *fmt, ...)
+{
+        va_list fmtargs;
+        char *ret;
+        int len;
 
-    va_start(fmtargs, fmt);
-    len = vsnprintf(NULL, 0, fmt, fmtargs);
-    va_end(fmtargs);
+        va_start(fmtargs, fmt);
+        len = vsnprintf(NULL, 0, fmt, fmtargs);
+        va_end(fmtargs);
 
-    ret = malloc(++len);
-    if (ret == NULL) {
-        perror("malloc");
-        exit(1);
-    }
+        ret = malloc(++len);
+        if (ret == NULL) {
+                perror("malloc");
+                exit(1);
+        }
 
-    va_start(fmtargs, fmt);
-    vsnprintf(ret, len, fmt, fmtargs);
-    va_end(fmtargs);
+        va_start(fmtargs, fmt);
+        vsnprintf(ret, len, fmt, fmtargs);
+        va_end(fmtargs);
 
-    return ret;
+        return ret;
 }
 
-
-void display();
+void display(char *v[], size_t vc);
+void setup(void);
+void cleanup(int exitcode);
 
 extern char* v[];
 #include "config.h"
 #ifdef DEBUG
-#define errprintf(...) fprintf(stderr,...)
+#define errprintf(...) fprintf(stderr,__VA_ARGS__)
 #else
 #define errprintf(...)
 #endif
@@ -85,6 +88,12 @@
 
 static struct pollfd source_fds[LENGTH(sources)];
 
+void die(int exitcode) {
+    fprintf(stderr, "Dying with exit code %d\n", exitcode);
+    cleanup(exitcode);
+    exit(exitcode);
+}
+
 void source_open(int source_id) {
     DPokeSource *src = &sources[source_id];
     //FILE* stream;
@@ -94,12 +103,12 @@
             //stream = popen(src->path, "r");
             if (pipe(p_stdout)!=0) {
                 perror("pipe");
-                exit(7);
+                die(7);
             }
             pid_t pid = fork();
             if (pid < 0) {
                 perror("fork");
-                exit(7);
+                die(7);
             } else if (pid == 0) {
                 dup2(open("/dev/null",O_RDONLY),0);
                 close(p_stdout[0]);
@@ -113,7 +122,7 @@
             break;
         default:
             errprintf("Don't know how to handle source type %d.\n",src->type);
-            exit(2);
+            die(2);
     }
     //src->stream = stream;
     //src->fd = fileno(stream);
@@ -138,7 +147,7 @@
                         sources[i].status = DPOKE_DIED; break;
                     default:
                         errprintf("#%d died in state %d. Whaddafuck?!\n",i,sources[i].status);
-                        exit(8);
+                        die(8);
                 }
             }
     }
@@ -155,19 +164,20 @@
     struct timespec tp;
     if (clock_gettime(CLOCK_MONOTONIC,&tp)) {
         perror("clock_gettime");
-        exit(5);
+        die(5);
     }
     return tp.tv_sec + tp.tv_nsec*1E-9;
 }
 
 int main(int argc, char* argv[]) {
+    setup();
     struct sigaction act;
 
     memset (&act, 0, sizeof(act));
     act.sa_handler = sigchld_hdl;
     if (sigaction(SIGCHLD, &act, 0)) {
         perror ("sigaction");
-        exit(6);
+        die(6);
     }
 
     for (int i = 0; i < LENGTH(sources); i++ ) {
@@ -186,11 +196,13 @@
         for (int i = 0; i < LENGTH(sources); i++) {
             DPokeSource *src = sources+i;
             if (source_fds[i].revents & POLLIN) {
+                errprintf("Event: %d\n", source_fds[i].revents);
                 int data_read = read(src->fd,src->buffer+src->buffer_usage,DPOKE_BUFFER-src->buffer_usage);
                 if (data_read>0) {
                     src->buffer_usage += data_read;
-                    if (src->buffer_usage==DPOKE_BUFFER) {
-                        errprintf("Buffer is full for #%d.\n",i);
+                    if (src->buffer_usage>=DPOKE_BUFFER) {
+                        fprintf(stderr, "Buffer is full for #%d. Resetting.\n",i);
+                        src->buffer_usage = 0;
                     }
                     src->buffer[src->buffer_usage] = '\0';
                     char* eolpos = strchr(src->buffer + src->buffer_usage - data_read,'\n');
@@ -203,8 +215,9 @@
                     if (src->status == DPOKE_STARTED)
                         src->status = DPOKE_RUNNING;
                 } else {
+                    fprintf(stderr, "Buffer usage: %d\n", src->buffer_usage);
                     perror("read");
-                    exit(3);
+                    die(3);
                 }
             } else if ((source_fds[i].revents & POLLHUP)||(src->status==DPOKE_DIED)) {
                 errprintf("#%d HUP\n",i);
@@ -224,7 +237,7 @@
         }
         double curtime = dpoke_time();
         if ((curtime-prevtime)>MINTIME) {
-            display();
+            display(v,LENGTH(sources));
             prevtime = curtime;
             sleeptime = 10000;
         } else {
@@ -234,6 +247,7 @@
         }
         errprintf("Will sleep for %d\n",sleeptime);
     }
+    cleanup(0);
     return 0;
 }
 /*