--- 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;
}
/*