summaryrefslogtreecommitdiffabout
path: root/src/eyefiworker.cc
authorMichael Krelin <hacker@klever.net>2009-03-08 20:09:21 (UTC)
committer Michael Krelin <hacker@klever.net>2009-03-08 20:09:21 (UTC)
commitaadaa8b5d7eda23e72dbded9d6437b40358353f3 (patch) (side-by-side diff)
tree0bff6fdde1e2b9be02b48aaf7d03f095604718e1 /src/eyefiworker.cc
downloadiii-0.0.zip
iii-0.0.tar.gz
iii-0.0.tar.bz2
Inital commit to public repository0.0
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;
+ }
+}