summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLuke Shumaker <lukeshu@sbcglobal.net>2016-03-22 16:06:21 -0400
committerLuke Shumaker <lukeshu@sbcglobal.net>2016-03-22 16:06:21 -0400
commite90c4a77b7783468048bc4bc49eb0423ae676a78 (patch)
tree9c26c8fa7dc4551eae417a587547efee79b5e4fa
parent51495e7579a1fcbdbfda868109c2128c2e933f9f (diff)
stuff
-rw-r--r--freenect-server-http.service7
-rw-r--r--freenect-server-http.socket1
-rw-r--r--freenect-server.c2
-rw-r--r--freenect-server.service5
-rw-r--r--freenect-server@.socket7
-rw-r--r--multipart-replace-http-server.c22
-rw-r--r--multipart-replace.c20
-rw-r--r--util.c2
-rw-r--r--util.h3
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 <fcntl.h> /* for open */
#include <netdb.h> /* for {get,free}addrinfo() */
#include <stdio.h>
+#include <stdlib.h> /* atexit */
#include <stdlib.h> /* for EXIT_FAILURE */
#include <string.h>
#include <sys/socket.h>
@@ -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);