From e90c4a77b7783468048bc4bc49eb0423ae676a78 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Tue, 22 Mar 2016 16:06:21 -0400 Subject: stuff --- freenect-server-http.service | 7 ++++--- freenect-server-http.socket | 1 - freenect-server.c | 2 ++ freenect-server.service | 5 ++--- freenect-server@.socket | 7 ++----- multipart-replace-http-server.c | 22 ++++++++++++++++------ multipart-replace.c | 20 +++++++++++--------- util.c | 2 -- util.h | 3 +++ 9 files changed, 40 insertions(+), 29 deletions(-) diff --git a/freenect-server-http.service b/freenect-server-http.service index f8ae608..6b4d91b 100644 --- a/freenect-server-http.service +++ b/freenect-server-http.service @@ -1,14 +1,15 @@ [Unit] Description=Kinect HTTP media streamer After=network.target -Requires=freenect-server-http.socket -After=freenect-server@accel.mjson.socket freenect-server@depth.mjpg.socket freenect-server@video.mjpg.socket +Requires=freenect-server-http.socket freenect-server.service +PartOf=freenect-server.service +After=freenect-server.service [Service] Type=simple User=alarm +Group=alarm ExecStart=/home/alarm/freenect-server/multipart-replace-http-server fd systemd /run/freenect-server/video.mjpg /run/freenect-server/depth.mjpg /run/freenect-server/accel.mjson [Install] WantedBy=multi-user.target -Also=freenect-server.socket diff --git a/freenect-server-http.socket b/freenect-server-http.socket index 3fc6244..8c54b10 100644 --- a/freenect-server-http.socket +++ b/freenect-server-http.socket @@ -6,4 +6,3 @@ ListenStream=5800 [Install] WantedBy=sockets.target -Also=freenect-server@accel.mjson.socket freenect-server@depth.mjpg.socket freenect-server@video.mjpg.socket diff --git a/freenect-server.c b/freenect-server.c index 5089bdd..558b837 100644 --- a/freenect-server.c +++ b/freenect-server.c @@ -155,6 +155,7 @@ void print_mode(const char *name, freenect_frame_mode mode) { } void cleanup() { + log("STOPPING=1"); if (ctx) freenect_shutdown(ctx); if (video_stream) @@ -163,6 +164,7 @@ void cleanup() { fclose(depth_stream); if (accel_stream) fclose(accel_stream); + fflush(stderr); sleep(5); /* work around systemd bug dropping log messages */ } diff --git a/freenect-server.service b/freenect-server.service index 75177ff..4ccf7f6 100644 --- a/freenect-server.service +++ b/freenect-server.service @@ -6,8 +6,7 @@ Requires=freenect-server@accel.mjson.socket freenect-server@depth.mjpg.socket fr [Service] Type=simple User=alarm +Group=alarm ExecStart=/home/alarm/freenect-server/freenect-server -V systemd:freenect-server@video.mjpg.socket -D systemd:freenect-server@depth.mjpg.socket -A systemd:freenect-server@accel.mjson.socket -[Install] -WantedBy=multi-user.target -Also=freenect-server.socket +Restart=always diff --git a/freenect-server@.socket b/freenect-server@.socket index 13bcc4c..78df40e 100644 --- a/freenect-server@.socket +++ b/freenect-server@.socket @@ -1,13 +1,10 @@ [Unit] -Description=Kinect media streamer internal %I stream +Description=Kinect media streamer backend %I stream After=network.target [Socket] SocketUser=alarm SocketGroup=alarm ListenFIFO=/run/freenect-server/%I -#FileDescriptorName=%I Service=freenect-server.service - -[Install] -WantedBy=sockets.target +RemoveOnStop=true \ No newline at end of file diff --git a/multipart-replace-http-server.c b/multipart-replace-http-server.c index 785bfe3..d4f0cd3 100644 --- a/multipart-replace-http-server.c +++ b/multipart-replace-http-server.c @@ -5,6 +5,7 @@ #include /* for open */ #include /* for {get,free}addrinfo() */ #include +#include /* atexit */ #include /* for EXIT_FAILURE */ #include #include @@ -60,7 +61,7 @@ void file_add(const char *filename) { strcpy(&shortname[1], filename); } strncpy(filev[filec-1].name, shortname, sizeof(filev[filec-1].name)); - error(0, 0, "added file #%zd: %s", filec-1, filev[filec-1].name); + log("added file #%zd: %s", filec-1, filev[filec-1].name); filev[filec-1].stream = stream; start_multipart_replace_reader(stream, fd, "ffserver" /* FIXME */); } @@ -103,7 +104,7 @@ void connection_handler(int fd) { line_len = getline(&line_buf, &line_cap, netstream); if (strcmp(path, "/") == 0) { - error(0, 0, "200 %s", path); + log("200 %s", path); dprintf(fd, "HTTP/1.1 200 OK\r\n" "Content-Type: text/html; charset=utf-8\r\n" @@ -127,7 +128,7 @@ void connection_handler(int fd) { } struct multipart_replace_stream *vidstream = file_get(path); if (vidstream == NULL) { - error(0, 0, "404 %s", path); + log("404 %s", path); dprintf(fd, "HTTP/1.1 404 Not Found\r\n" "\r\n"); @@ -135,7 +136,7 @@ void connection_handler(int fd) { } const char *boundary = "boundary" /* FIXME */; - error(0, 0, "200 %s", path); + log("200 %s", path); dprintf(fd, "HTTP/1.1 200 OK\r\n" "Content-Type: multipart/x-mixed-replace;boundary=%s\r\n" @@ -148,9 +149,9 @@ void connection_handler(int fd) { void *connection_thread(void *arg_anon) { pthread_setname_np(pthread_self(), "connection"); int fd = (int)(intptr_t)arg_anon; - error(0, 0, "Connection %d opened", fd); + log("Connection %d opened", fd); connection_handler(fd); - error(0, 0, "Connection %d closed", fd); + log("Connection %d closed", fd); return NULL; } @@ -275,6 +276,12 @@ void usage() { "the FILENAMEs should be pipes or sockets.\n"); } +void cleanup() { + log("STOPPING=1"); + fflush(stderr); + sleep(5); /* work around systemd bug dropping log messages */ +} + int main(int argc, char *argv[]) { if (argc >=2 && strcmp(argv[1], "-h") == 0) { usage(); @@ -285,6 +292,9 @@ int main(int argc, char *argv[]) { usage(); return EXIT_FAILURE; } + + atexit(cleanup); + int sock = sockstream_listen(argv[1], argv[2]); if (sock < 0) { if (sock == -EAI_SYSTEM) diff --git a/multipart-replace.c b/multipart-replace.c index 24a783e..78732e6 100644 --- a/multipart-replace.c +++ b/multipart-replace.c @@ -53,7 +53,7 @@ void multipart_replace_reader(struct multipart_replace_stream *s, int fd, const do { line_len = getline(&line_buf, &line_cap, stream); if (line_len < 0) { - error(0, 0, "source hung up"); + error(0, ferror(stream), "source hung up"); return; } } while (strcmp(line_buf, "\r\n") == 0); @@ -66,7 +66,7 @@ void multipart_replace_reader(struct multipart_replace_stream *s, int fd, const do { line_len = getline(&line_buf, &line_cap, stream); if (line_len < 0) { - error(0, 0, "source hung up"); + error(0, ferror(stream), "source hung up"); return; } /* append the line to the frame contents */ @@ -104,11 +104,12 @@ void multipart_replace_reader(struct multipart_replace_stream *s, int fd, const } void multipart_replace_writer(struct multipart_replace_stream *s, int fd, const char *boundary) { + FILE *stream = fdopen(fd, "w"); struct frame myframe = { 0 }; long lastframe = 0; boundary = boundary_line(boundary); size_t boundary_len = strlen(boundary); - error(0, 0, "boundary: <%s>", boundary); + while(1) { /* poll until there's a new frame */ pthread_rwlock_rdlock(&s->frontlock); @@ -127,19 +128,20 @@ void multipart_replace_writer(struct multipart_replace_stream *s, int fd, const pthread_rwlock_unlock(&s->frontlock); /* send the frame to the client */ - if (write(fd, boundary, boundary_len) < (ssize_t)boundary_len) { - error(0, errno, "write"); + if (fwrite(boundary, boundary_len, 1, stream) < 1) { + error(0, ferror(stream), "fwrite(boundary)"); return; } - if (write(fd, myframe.buf, myframe.len) < myframe.len) { - error(0, errno, "write"); + if (fwrite(myframe.buf, myframe.len, 1, stream) < 1) { + error(0, ferror(stream), "fwrite(frame.buf)"); return; } /* send a blank line for pleasantness */ - if (write(fd, "\r\n", 2) < 2) { - error(0, errno, "write"); + if (fwrite("\r\n", 2, 1, stream) < 1) { + error(0, ferror(stream), "fwrite(\"\\r\\n\")"); return; } + fflush(stream); } } diff --git a/util.c b/util.c index adc079a..772dbf8 100644 --- a/util.c +++ b/util.c @@ -51,13 +51,11 @@ int get_fd(const char *addr) { const char *e = getenv("LISTEN_FDNAMES"); if (e == NULL) return -ENOTCONN; - error(0, 0, "LISTEN_FDNAMES=\"%s\"", e); char *names = strdupa(e); char *name = NULL; int i = -1; do { name = strsep(&names, ":"); - error(0, 0, "name=\"%s\"", name); i++; } while (name != NULL && strcmp(name, addr) != 0); if (name == NULL) diff --git a/util.h b/util.h index 121d81b..0432a57 100644 --- a/util.h +++ b/util.h @@ -13,6 +13,9 @@ #define _(str) str #endif +#define log(...) error(0, 0, __VA_ARGS__) +#define debug(...) error(0, 0, __VA_ARGS__) + void *xrealloc(void *ptr, size_t size); bool is_numeric(const char *str); int get_fd(const char *addr); -- cgit v1.2.3