-rw-r--r-- | src/eyefiworker.cc | 26 |
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 @@ | |||
1 | #include <sys/wait.h> | ||
2 | #include <stdexcept> | ||
3 | #include "eyefiworker.h" | ||
4 | |||
5 | eyefiworker::eyefiworker() | ||
6 | : eyefiService(SOAP_IO_STORE|SOAP_IO_KEEPALIVE) { | ||
7 | bind_flags = SO_REUSEADDR; max_keep_alive = 0; | ||
8 | } | ||
9 | |||
10 | int eyefiworker::run(int port) { | ||
11 | if(!soap_valid_socket(bind(0,port,5))) | ||
12 | throw std::runtime_error("failed to bind()"); | ||
13 | while(true) { | ||
14 | while(waitpid(-1,0,WNOHANG)>0); | ||
15 | if(!soap_valid_socket(accept())) | ||
16 | throw std::runtime_error("failed to accept()"); | ||
17 | pid_t p = fork(); | ||
18 | if(p<0) throw std::runtime_error("failed to fork()"); | ||
19 | if(!p) { | ||
20 | (void)serve(); | ||
21 | soap_destroy(this); soap_end(this); soap_done(this); | ||
22 | _exit(0); | ||
23 | } | ||
24 | close(socket); socket = SOAP_INVALID_SOCKET; | ||
25 | } | ||
26 | } | ||