-rw-r--r-- | src/eyefiworker.cc | 4 | ||||
-rw-r--r-- | src/eyefiworker.h | 1 | ||||
-rw-r--r-- | src/eyetil.h | 5 | ||||
-rw-r--r-- | src/iiid.cc | 4 |
4 files changed, 12 insertions, 2 deletions
diff --git a/src/eyefiworker.cc b/src/eyefiworker.cc index ac75fc1..1979b46 100644 --- a/src/eyefiworker.cc +++ b/src/eyefiworker.cc @@ -26,16 +26,18 @@ eyefiworker::eyefiworker() MSG_NOSIGNAL #elif defined(SO_NOSIGPIPE) SO_NOSIGPIPE #else #error Something is wrong with sigpipe prevention on the platform #endif ; } +eyefiworker::~eyefiworker() { +} int eyefiworker::run(int bindport) { #ifdef HAVE_SQLITE sqlite3_initialize(); #endif if(!soap_valid_socket(bind(0,bindport,64))) throw std::runtime_error("failed to bind()"); signal(SIGCHLD,SIG_IGN); @@ -51,17 +53,17 @@ int eyefiworker::run(int bindport) { #ifndef NDEBUG struct rusage ru; if(getrusage(RUSAGE_SELF,&ru)) { syslog(LOG_NOTICE,"Failed to getrusage(): %d",errno); }else{ syslog(LOG_INFO,"maxrss: %ld\n",ru.ru_maxrss); } #endif /* NDEBUG */ - _exit(0); + throw throwable_exit(0); } close(socket); socket = SOAP_INVALID_SOCKET; } } static binary_t session_nonce; #ifdef HAVE_SQLITE static struct { diff --git a/src/eyefiworker.h b/src/eyefiworker.h index 6d4082c..6cdecff 100644 --- a/src/eyefiworker.h +++ b/src/eyefiworker.h @@ -2,16 +2,17 @@ #define __EYEFIWORKER_H #include "soapeyefiService.h" class eyefiworker : public eyefiService { public: eyefiworker(); + ~eyefiworker(); int run(int port) __attribute__ ((noreturn)); int StartSession(std::string macaddress, std::string cnonce, int transfermode, long transfermodetimestamp, struct rns__StartSessionResponse &r); int GetPhotoStatus(std::string credential, std::string macaddress, std::string filename, long filesize, std::string filesignature, int flags, diff --git a/src/eyetil.h b/src/eyetil.h index eff2c43..03b9ba8 100644 --- a/src/eyetil.h +++ b/src/eyetil.h @@ -2,16 +2,21 @@ #define __EYETIL_H #include <vector> #include <string> #include <archive.h> #include <archive_entry.h> #include "openssl/md5.h" +struct throwable_exit { + int rc; + throwable_exit(int rc_) : rc(rc_) { } +}; + class binary_t : public std::vector<unsigned char> { public: binary_t() { } binary_t(size_type n) : std::vector<unsigned char>(n) { } binary_t(const std::string& h) { from_hex(h); } binary_t(const void *d,size_t s) { from_data(d,s); } binary_t& from_hex(const std::string& h); diff --git a/src/iiid.cc b/src/iiid.cc index d655fe3..b3dd3bf 100644 --- a/src/iiid.cc +++ b/src/iiid.cc @@ -84,14 +84,16 @@ int main(int argc,char **argv) try { syslog(LOG_WARNING,"I see nothing resembling a card config in '%s'",EYEKIN_CONF_DIR); else globfree(&g); eyefiworker().run(port); closelog(); return 0; -} catch(std::exception& e) { +} catch(const throwable_exit& e) { + return e.rc; +} catch(const std::exception& e) { syslog(LOG_CRIT,"Exiting iii daemon, because of error condition"); syslog(LOG_CRIT,"Exception: %s",e.what()); return 1; } |