summaryrefslogtreecommitdiffabout
authorMichael Krelin <hacker@klever.net>2013-02-12 20:37:10 (UTC)
committer Michael Krelin <hacker@klever.net>2013-02-12 20:37:10 (UTC)
commit13fb4abba3fd3cac0d5cb25d3eccddc298220d41 (patch) (side-by-side diff)
tree8a086ffef06f153e739674a5c8beab1db9388238
parentb80844f51353339cfbb8b35a5585911cdb4301e2 (diff)
downloadiii-13fb4abba3fd3cac0d5cb25d3eccddc298220d41.zip
iii-13fb4abba3fd3cac0d5cb25d3eccddc298220d41.tar.gz
iii-13fb4abba3fd3cac0d5cb25d3eccddc298220d41.tar.bz2
introduce throwable_exit for nicer stack unwinding
yes, I enjoy abusing features Signed-off-by: Michael Krelin <hacker@klever.net>
Diffstat (more/less context) (ignore whitespace changes)
-rw-r--r--src/eyefiworker.cc4
-rw-r--r--src/eyefiworker.h1
-rw-r--r--src/eyetil.h5
-rw-r--r--src/iiid.cc4
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
@@ -32,4 +32,6 @@ eyefiworker::eyefiworker()
;
}
+eyefiworker::~eyefiworker() {
+}
int eyefiworker::run(int bindport) {
@@ -57,5 +59,5 @@ int eyefiworker::run(int bindport) {
}
#endif /* NDEBUG */
- _exit(0);
+ throw throwable_exit(0);
}
close(socket); socket = SOAP_INVALID_SOCKET;
diff --git a/src/eyefiworker.h b/src/eyefiworker.h
index 6d4082c..6cdecff 100644
--- a/src/eyefiworker.h
+++ b/src/eyefiworker.h
@@ -8,4 +8,5 @@ class eyefiworker : public eyefiService {
eyefiworker();
+ ~eyefiworker();
int run(int port) __attribute__ ((noreturn));
diff --git a/src/eyetil.h b/src/eyetil.h
index eff2c43..03b9ba8 100644
--- a/src/eyetil.h
+++ b/src/eyetil.h
@@ -8,4 +8,9 @@
#include "openssl/md5.h"
+struct throwable_exit {
+ int rc;
+ throwable_exit(int rc_) : rc(rc_) { }
+};
+
class binary_t : public std::vector<unsigned char> {
public:
diff --git a/src/iiid.cc b/src/iiid.cc
index d655fe3..b3dd3bf 100644
--- a/src/iiid.cc
+++ b/src/iiid.cc
@@ -90,5 +90,7 @@ int main(int argc,char **argv) try {
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());