diff -r a22a319f5129 -r 3e9290bf7249 dpoke.c --- 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; } /*