summaryrefslogtreecommitdiffabout
path: root/src/eyefiworker.cc
Side-by-side diff
Diffstat (limited to 'src/eyefiworker.cc') (more/less context) (ignore whitespace changes)
-rw-r--r--src/eyefiworker.cc26
1 files changed, 26 insertions, 0 deletions
diff --git a/src/eyefiworker.cc b/src/eyefiworker.cc
new file mode 100644
index 0000000..d87c36e
--- a/dev/null
+++ b/src/eyefiworker.cc
@@ -0,0 +1,26 @@
+#include <sys/wait.h>
+#include <stdexcept>
+#include "eyefiworker.h"
+
+eyefiworker::eyefiworker()
+ : eyefiService(SOAP_IO_STORE|SOAP_IO_KEEPALIVE) {
+ bind_flags = SO_REUSEADDR; max_keep_alive = 0;
+ }
+
+int eyefiworker::run(int port) {
+ if(!soap_valid_socket(bind(0,port,5)))
+ throw std::runtime_error("failed to bind()");
+ while(true) {
+ while(waitpid(-1,0,WNOHANG)>0);
+ if(!soap_valid_socket(accept()))
+ throw std::runtime_error("failed to accept()");
+ pid_t p = fork();
+ if(p<0) throw std::runtime_error("failed to fork()");
+ if(!p) {
+ (void)serve();
+ soap_destroy(this); soap_end(this); soap_done(this);
+ _exit(0);
+ }
+ close(socket); socket = SOAP_INVALID_SOCKET;
+ }
+}