author | Michael Krelin <hacker@klever.net> | 2012-01-20 20:46:30 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2012-01-20 20:46:30 (UTC) |
commit | 62d09cb2346588773a9e25ac9e9a942816b8581a (patch) (unidiff) | |
tree | 791221bad465ac702a481490d5fdab0a96b6e185 | |
parent | a9f093cc83926b0e83324aa9e022903563d9d801 (diff) | |
download | iii-62d09cb2346588773a9e25ac9e9a942816b8581a.zip iii-62d09cb2346588773a9e25ac9e9a942816b8581a.tar.gz iii-62d09cb2346588773a9e25ac9e9a942816b8581a.tar.bz2 |
minor but numerous changes from compiler-happiness department
Signed-off-by: Michael Krelin <hacker@klever.net>
-rw-r--r-- | src/eyefiservice.cc | 2 | ||||
-rw-r--r-- | src/eyefiworker.cc | 4 | ||||
-rw-r--r-- | src/eyefiworker.h | 2 | ||||
-rw-r--r-- | src/eyekinfig.cc | 2 | ||||
-rw-r--r-- | src/eyetil.cc | 10 | ||||
-rw-r--r-- | src/iiid.cc | 2 |
6 files changed, 11 insertions, 11 deletions
diff --git a/src/eyefiservice.cc b/src/eyefiservice.cc index 2586ade..e89b2fc 100644 --- a/src/eyefiservice.cc +++ b/src/eyefiservice.cc | |||
@@ -30,129 +30,129 @@ static bool detached_child() { | |||
30 | return false; | 30 | return false; |
31 | } | 31 | } |
32 | 32 | ||
33 | int eyefiService::StartSession( | 33 | int eyefiService::StartSession( |
34 | std::string macaddress,std::string cnonce, | 34 | std::string macaddress,std::string cnonce, |
35 | int transfermode,long transfermodetimestamp, | 35 | int transfermode,long transfermodetimestamp, |
36 | struct rns__StartSessionResponse &r ) try { | 36 | struct rns__StartSessionResponse &r ) try { |
37 | #ifndef NDEBUG | 37 | #ifndef NDEBUG |
38 | syslog(LOG_DEBUG, | 38 | syslog(LOG_DEBUG, |
39 | "StartSession request from %s with cnonce=%s, transfermode=%d, transfermodetimestamp=%ld", | 39 | "StartSession request from %s with cnonce=%s, transfermode=%d, transfermodetimestamp=%ld", |
40 | macaddress.c_str(), cnonce.c_str(), transfermode, transfermodetimestamp ); | 40 | macaddress.c_str(), cnonce.c_str(), transfermode, transfermodetimestamp ); |
41 | #endif | 41 | #endif |
42 | eyekinfig_t eyekinfig(macaddress); | 42 | eyekinfig_t eyekinfig(macaddress); |
43 | r.credential = binary_t(macaddress+cnonce+eyekinfig.get_upload_key()).md5().hex(); | 43 | r.credential = binary_t(macaddress+cnonce+eyekinfig.get_upload_key()).md5().hex(); |
44 | 44 | ||
45 | r.snonce = session_nonce.make_nonce().hex(); | 45 | r.snonce = session_nonce.make_nonce().hex(); |
46 | r.transfermode=transfermode; | 46 | r.transfermode=transfermode; |
47 | r.transfermodetimestamp=transfermodetimestamp; | 47 | r.transfermodetimestamp=transfermodetimestamp; |
48 | r.upsyncallowed=false; | 48 | r.upsyncallowed=false; |
49 | 49 | ||
50 | std::string cmd = eyekinfig.get_on_start_session(); | 50 | std::string cmd = eyekinfig.get_on_start_session(); |
51 | if(!cmd.empty()) { | 51 | if(!cmd.empty()) { |
52 | if(detached_child()) { | 52 | if(detached_child()) { |
53 | putenv( gnu::autosprintf("EYEFI_MACADDRESS=%s",macaddress.c_str()) ); | 53 | putenv( gnu::autosprintf("EYEFI_MACADDRESS=%s",macaddress.c_str()) ); |
54 | putenv( gnu::autosprintf("EYEFI_TRANSFERMODE=%d",transfermode) ); | 54 | putenv( gnu::autosprintf("EYEFI_TRANSFERMODE=%d",transfermode) ); |
55 | putenv( gnu::autosprintf("EYEFI_TRANSFERMODETIMESTAMP=%ld",transfermodetimestamp) ); | 55 | putenv( gnu::autosprintf("EYEFI_TRANSFERMODETIMESTAMP=%ld",transfermodetimestamp) ); |
56 | char *argv[] = { (char*)"/bin/sh", (char*)"-c", (char*)cmd.c_str(), 0 }; | 56 | char *argv[] = { (char*)"/bin/sh", (char*)"-c", (char*)cmd.c_str(), 0 }; |
57 | execv("/bin/sh",argv); | 57 | execv("/bin/sh",argv); |
58 | syslog(LOG_ERR,"Failed to execute '%s'",cmd.c_str()); | 58 | syslog(LOG_ERR,"Failed to execute '%s'",cmd.c_str()); |
59 | _exit(-1); | 59 | _exit(-1); |
60 | } | 60 | } |
61 | } | 61 | } |
62 | return SOAP_OK; | 62 | return SOAP_OK; |
63 | }catch(std::runtime_error& e) { | 63 | }catch(std::runtime_error& e) { |
64 | syslog(LOG_ERR,"error while processing StartSession: %s",e.what()); | 64 | syslog(LOG_ERR,"error while processing StartSession: %s",e.what()); |
65 | return soap_receiverfault(e.what(),0); | 65 | return soap_receiverfault(e.what(),0); |
66 | } | 66 | } |
67 | 67 | ||
68 | int eyefiService::GetPhotoStatus( | 68 | int eyefiService::GetPhotoStatus( |
69 | std::string credential, std::string macaddress, | 69 | std::string credential, std::string macaddress, |
70 | std::string filename, long filesize, std::string filesignature, | 70 | std::string filename, long filesize, std::string filesignature, |
71 | int flags, | 71 | int flags, |
72 | struct rns__GetPhotoStatusResponse &r ) { | 72 | struct rns__GetPhotoStatusResponse &r ) { |
73 | #ifndef NDEBUG | 73 | #ifndef NDEBUG |
74 | syslog(LOG_DEBUG, | 74 | syslog(LOG_DEBUG, |
75 | "GetPhotoStatus request from %s with credential=%s, filename=%s, filesize=%ld, filesignature=%s, flags=%d; session nonce=%s", | 75 | "GetPhotoStatus request from %s with credential=%s, filename=%s, filesize=%ld, filesignature=%s, flags=%d; session nonce=%s", |
76 | macaddress.c_str(), credential.c_str(), filename.c_str(), filesize, filesignature.c_str(), flags, | 76 | macaddress.c_str(), credential.c_str(), filename.c_str(), filesize, filesignature.c_str(), flags, |
77 | session_nonce.hex().c_str() ); | 77 | session_nonce.hex().c_str() ); |
78 | #endif | 78 | #endif |
79 | 79 | ||
80 | std::string computed_credential = binary_t(macaddress+eyekinfig_t(macaddress).get_upload_key()+session_nonce.hex()).md5().hex(); | 80 | std::string computed_credential = binary_t(macaddress+eyekinfig_t(macaddress).get_upload_key()+session_nonce.hex()).md5().hex(); |
81 | 81 | ||
82 | #ifndef NDEBUG | 82 | #ifndef NDEBUG |
83 | syslog(LOG_DEBUG, " computed credential=%s", computed_credential.c_str()); | 83 | syslog(LOG_DEBUG, " computed credential=%s", computed_credential.c_str()); |
84 | #endif | 84 | #endif |
85 | 85 | ||
86 | if (credential != computed_credential) throw std::runtime_error("card authentication failed"); | 86 | if (credential != computed_credential) throw std::runtime_error("card authentication failed"); |
87 | 87 | ||
88 | r.fileid = 1; r.offset = 0; | 88 | r.fileid = 1; r.offset = 0; |
89 | return SOAP_OK; | 89 | return SOAP_OK; |
90 | } | 90 | } |
91 | 91 | ||
92 | int eyefiService::MarkLastPhotoInRoll( | 92 | int eyefiService::MarkLastPhotoInRoll( |
93 | std::string macaddress, int mergedelta, | 93 | std::string macaddress, int mergedelta, |
94 | struct rns__MarkLastPhotoInRollResponse &r ) { | 94 | struct rns__MarkLastPhotoInRollResponse&/* r */ ) { |
95 | #ifndef NDEBUG | 95 | #ifndef NDEBUG |
96 | syslog(LOG_DEBUG, | 96 | syslog(LOG_DEBUG, |
97 | "MarkLastPhotoInRoll request from %s with mergedelta=%d", | 97 | "MarkLastPhotoInRoll request from %s with mergedelta=%d", |
98 | macaddress.c_str(), mergedelta ); | 98 | macaddress.c_str(), mergedelta ); |
99 | #endif | 99 | #endif |
100 | std::string cmd = eyekinfig_t(macaddress).get_on_mark_last_photo_in_roll(); | 100 | std::string cmd = eyekinfig_t(macaddress).get_on_mark_last_photo_in_roll(); |
101 | if(!cmd.empty()) { | 101 | if(!cmd.empty()) { |
102 | if(detached_child()) { | 102 | if(detached_child()) { |
103 | putenv( gnu::autosprintf("EYEFI_MACADDRESS=%s",macaddress.c_str()) ); | 103 | putenv( gnu::autosprintf("EYEFI_MACADDRESS=%s",macaddress.c_str()) ); |
104 | putenv( gnu::autosprintf("EYEFI_MERGEDELTA=%d",mergedelta) ); | 104 | putenv( gnu::autosprintf("EYEFI_MERGEDELTA=%d",mergedelta) ); |
105 | char *argv[] = { (char*)"/bin/sh", (char*)"-c", (char*)cmd.c_str(), 0 }; | 105 | char *argv[] = { (char*)"/bin/sh", (char*)"-c", (char*)cmd.c_str(), 0 }; |
106 | execv("/bin/sh",argv); | 106 | execv("/bin/sh",argv); |
107 | syslog(LOG_ERR,"Failed to execute '%s'",cmd.c_str()); | 107 | syslog(LOG_ERR,"Failed to execute '%s'",cmd.c_str()); |
108 | _exit(-1); | 108 | _exit(-1); |
109 | } | 109 | } |
110 | } | 110 | } |
111 | keep_alive = 0; | 111 | keep_alive = 0; |
112 | return SOAP_OK; | 112 | return SOAP_OK; |
113 | } | 113 | } |
114 | 114 | ||
115 | int eyefiService::UploadPhoto( | 115 | int eyefiService::UploadPhoto( |
116 | int fileid, std::string macaddress, | 116 | int fileid, std::string macaddress, |
117 | std::string filename, long filesize, std::string filesignature, | 117 | std::string filename, long filesize, std::string filesignature, |
118 | std::string encryption, int flags, | 118 | std::string encryption, int flags, |
119 | struct rns__UploadPhotoResponse& r ) { | 119 | struct rns__UploadPhotoResponse& r ) { |
120 | #ifndef NDEBUG | 120 | #ifndef NDEBUG |
121 | syslog(LOG_DEBUG, | 121 | syslog(LOG_DEBUG, |
122 | "UploadPhoto request from %s with fileid=%d, filename=%s, filesize=%ld," | 122 | "UploadPhoto request from %s with fileid=%d, filename=%s, filesize=%ld," |
123 | " filesignature=%s, encryption=%s, flags=%04X", | 123 | " filesignature=%s, encryption=%s, flags=%04X", |
124 | macaddress.c_str(), fileid, filename.c_str(), filesize, | 124 | macaddress.c_str(), fileid, filename.c_str(), filesize, |
125 | filesignature.c_str(), encryption.c_str(), flags ); | 125 | filesignature.c_str(), encryption.c_str(), flags ); |
126 | #endif | 126 | #endif |
127 | eyekinfig_t eyekinfig(macaddress); | 127 | eyekinfig_t eyekinfig(macaddress); |
128 | 128 | ||
129 | umask(eyekinfig.get_umask()); | 129 | umask(eyekinfig.get_umask()); |
130 | 130 | ||
131 | std::string td = eyekinfig.get_targetdir(); | 131 | std::string td = eyekinfig.get_targetdir(); |
132 | tmpdir_t indir(td+"/.incoming.XXXXXX"); | 132 | tmpdir_t indir(td+"/.incoming.XXXXXX"); |
133 | 133 | ||
134 | std::string tf,lf; | 134 | std::string tf,lf; |
135 | binary_t digest, idigest; | 135 | binary_t digest, idigest; |
136 | 136 | ||
137 | for(soap_multipart::iterator i=mime.begin(),ie=mime.end();i!=ie;++i) { | 137 | for(soap_multipart::iterator i=mime.begin(),ie=mime.end();i!=ie;++i) { |
138 | #ifndef NDEBUG | 138 | #ifndef NDEBUG |
139 | syslog(LOG_DEBUG, | 139 | syslog(LOG_DEBUG, |
140 | " MIME attachment with id=%s, type=%s, size=%ld", | 140 | " MIME attachment with id=%s, type=%s, size=%ld", |
141 | (*i).id, (*i).type, (long)(*i).size ); | 141 | (*i).id, (*i).type, (long)(*i).size ); |
142 | #endif | 142 | #endif |
143 | 143 | ||
144 | if((*i).id && !strcmp((*i).id,"INTEGRITYDIGEST")) { | 144 | if((*i).id && !strcmp((*i).id,"INTEGRITYDIGEST")) { |
145 | std::string idigestr((*i).ptr,(*i).size); | 145 | std::string idigestr((*i).ptr,(*i).size); |
146 | #ifndef NDEBUG | 146 | #ifndef NDEBUG |
147 | syslog(LOG_DEBUG, " INTEGRITYDIGEST=%s", idigestr.c_str()); | 147 | syslog(LOG_DEBUG, " INTEGRITYDIGEST=%s", idigestr.c_str()); |
148 | #endif | 148 | #endif |
149 | idigest.from_hex(idigestr); | 149 | idigest.from_hex(idigestr); |
150 | } | 150 | } |
151 | if( (*i).id && !strcmp((*i).id,"FILENAME") ) { | 151 | if( (*i).id && !strcmp((*i).id,"FILENAME") ) { |
152 | assert( (*i).type && !strcmp((*i).type,"application/x-tar") ); | 152 | assert( (*i).type && !strcmp((*i).type,"application/x-tar") ); |
153 | #ifdef III_SAVE_TARS | 153 | #ifdef III_SAVE_TARS |
154 | std::string tarfile = indir.get_file(filename); | 154 | std::string tarfile = indir.get_file(filename); |
155 | { | 155 | { |
156 | std::ofstream(tarfile.c_str(),std::ios::out|std::ios::binary).write((*i).ptr,(*i).size); | 156 | std::ofstream(tarfile.c_str(),std::ios::out|std::ios::binary).write((*i).ptr,(*i).size); |
157 | } | 157 | } |
158 | #endif | 158 | #endif |
diff --git a/src/eyefiworker.cc b/src/eyefiworker.cc index 2d7827c..c051482 100644 --- a/src/eyefiworker.cc +++ b/src/eyefiworker.cc | |||
@@ -1,36 +1,36 @@ | |||
1 | #include <signal.h> | 1 | #include <signal.h> |
2 | #include <stdexcept> | 2 | #include <stdexcept> |
3 | #include "eyefiworker.h" | 3 | #include "eyefiworker.h" |
4 | 4 | ||
5 | eyefiworker::eyefiworker() | 5 | eyefiworker::eyefiworker() |
6 | : eyefiService(SOAP_IO_STORE|SOAP_IO_KEEPALIVE) { | 6 | : eyefiService(SOAP_IO_STORE|SOAP_IO_KEEPALIVE) { |
7 | bind_flags = SO_REUSEADDR; max_keep_alive = 0; | 7 | bind_flags = SO_REUSEADDR; max_keep_alive = 0; |
8 | socket_flags = | 8 | socket_flags = |
9 | #if defined(MSG_NOSIGNAL) | 9 | #if defined(MSG_NOSIGNAL) |
10 | MSG_NOSIGNAL | 10 | MSG_NOSIGNAL |
11 | #elif defined(SO_NOSIGPIPE) | 11 | #elif defined(SO_NOSIGPIPE) |
12 | SO_NOSIGPIPE | 12 | SO_NOSIGPIPE |
13 | #else | 13 | #else |
14 | #error Something is wrong with sigpipe prevention on the platform | 14 | #error Something is wrong with sigpipe prevention on the platform |
15 | #endif | 15 | #endif |
16 | ; | 16 | ; |
17 | } | 17 | } |
18 | 18 | ||
19 | int eyefiworker::run(int port) { | 19 | int eyefiworker::run(int bindport) { |
20 | if(!soap_valid_socket(bind(0,port,64))) | 20 | if(!soap_valid_socket(bind(0,bindport,64))) |
21 | throw std::runtime_error("failed to bind()"); | 21 | throw std::runtime_error("failed to bind()"); |
22 | signal(SIGCHLD,SIG_IGN); | 22 | signal(SIGCHLD,SIG_IGN); |
23 | while(true) { | 23 | while(true) { |
24 | if(!soap_valid_socket(accept())) | 24 | if(!soap_valid_socket(accept())) |
25 | throw std::runtime_error("failed to accept()"); | 25 | throw std::runtime_error("failed to accept()"); |
26 | pid_t p = fork(); | 26 | pid_t p = fork(); |
27 | if(p<0) throw std::runtime_error("failed to fork()"); | 27 | if(p<0) throw std::runtime_error("failed to fork()"); |
28 | if(!p) { | 28 | if(!p) { |
29 | recv_timeout = 600; send_timeout = 120; | 29 | recv_timeout = 600; send_timeout = 120; |
30 | (void)serve(); | 30 | (void)serve(); |
31 | soap_destroy(this); soap_end(this); soap_done(this); | 31 | soap_destroy(this); soap_end(this); soap_done(this); |
32 | _exit(0); | 32 | _exit(0); |
33 | } | 33 | } |
34 | close(socket); socket = SOAP_INVALID_SOCKET; | 34 | close(socket); socket = SOAP_INVALID_SOCKET; |
35 | } | 35 | } |
36 | } | 36 | } |
diff --git a/src/eyefiworker.h b/src/eyefiworker.h index c08ec8b..afb97c7 100644 --- a/src/eyefiworker.h +++ b/src/eyefiworker.h | |||
@@ -1,15 +1,15 @@ | |||
1 | #ifndef __EYEFIWORKER_H | 1 | #ifndef __EYEFIWORKER_H |
2 | #define __EYEFIWORKER_H | 2 | #define __EYEFIWORKER_H |
3 | 3 | ||
4 | #include "soapeyefiService.h" | 4 | #include "soapeyefiService.h" |
5 | 5 | ||
6 | class eyefiworker : public eyefiService { | 6 | class eyefiworker : public eyefiService { |
7 | public: | 7 | public: |
8 | 8 | ||
9 | eyefiworker(); | 9 | eyefiworker(); |
10 | 10 | ||
11 | int run(int port); | 11 | int run(int port) __attribute__ ((noreturn)); |
12 | 12 | ||
13 | }; | 13 | }; |
14 | 14 | ||
15 | #endif /* __EYEFIWORKER_H */ | 15 | #endif /* __EYEFIWORKER_H */ |
diff --git a/src/eyekinfig.cc b/src/eyekinfig.cc index 27a5a56..56c74a7 100644 --- a/src/eyekinfig.cc +++ b/src/eyekinfig.cc | |||
@@ -2,66 +2,66 @@ | |||
2 | #include <stdexcept> | 2 | #include <stdexcept> |
3 | #include <autosprintf.h> | 3 | #include <autosprintf.h> |
4 | #include "eyekinfig.h" | 4 | #include "eyekinfig.h" |
5 | 5 | ||
6 | #include "config.h" | 6 | #include "config.h" |
7 | 7 | ||
8 | eyekinfig_t::eyekinfig_t(const std::string& ma) | 8 | eyekinfig_t::eyekinfig_t(const std::string& ma) |
9 | : macaddress(ma) { | 9 | : macaddress(ma) { |
10 | static cfg_opt_t opts[] = { | 10 | static cfg_opt_t opts[] = { |
11 | CFG_STR((char*)"targetdir",(char*)"/var/lib/" PACKAGE "/%s",CFGF_NONE), | 11 | CFG_STR((char*)"targetdir",(char*)"/var/lib/" PACKAGE "/%s",CFGF_NONE), |
12 | CFG_STR((char*)"uploadkey",(char*)"",CFGF_NONE), | 12 | CFG_STR((char*)"uploadkey",(char*)"",CFGF_NONE), |
13 | CFG_STR((char*)"on-start-session",(char*)"",CFGF_NONE), | 13 | CFG_STR((char*)"on-start-session",(char*)"",CFGF_NONE), |
14 | CFG_STR((char*)"on-upload-photo",(char*)"",CFGF_NONE), | 14 | CFG_STR((char*)"on-upload-photo",(char*)"",CFGF_NONE), |
15 | CFG_STR((char*)"on-mark-last-photo-in-roll",(char*)"",CFGF_NONE), | 15 | CFG_STR((char*)"on-mark-last-photo-in-roll",(char*)"",CFGF_NONE), |
16 | CFG_INT((char*)"umask",022,CFGF_NONE), | 16 | CFG_INT((char*)"umask",022,CFGF_NONE), |
17 | CFG_END() | 17 | CFG_END() |
18 | }; | 18 | }; |
19 | cfg = cfg_init(opts,CFGF_NONE); | 19 | cfg = cfg_init(opts,CFGF_NONE); |
20 | if(!cfg) | 20 | if(!cfg) |
21 | throw std::runtime_error("failed to cfg_init()"); | 21 | throw std::runtime_error("failed to cfg_init()"); |
22 | std::string::size_type ls = macaddress.rfind('/'); | 22 | std::string::size_type ls = macaddress.rfind('/'); |
23 | if(cfg_parse(cfg,gnu::autosprintf( | 23 | if(cfg_parse(cfg,gnu::autosprintf( |
24 | EYEKIN_CONF_DIR "/%s.conf", | 24 | EYEKIN_CONF_DIR "/%s.conf", |
25 | (ls==std::string::npos) | 25 | (ls==std::string::npos) |
26 | ? macaddress.c_str() | 26 | ? macaddress.c_str() |
27 | : macaddress.substr(ls+1).c_str() | 27 | : macaddress.substr(ls+1).c_str() |
28 | )) ==CFG_PARSE_ERROR) { | 28 | )) ==CFG_PARSE_ERROR) { |
29 | if(cfg) cfg_free(cfg); | 29 | if(cfg) cfg_free(cfg); |
30 | cfg=0; | 30 | cfg=0; |
31 | throw std::runtime_error("failed to cfg_parse()"); | 31 | throw std::runtime_error("failed to cfg_parse()"); |
32 | } | 32 | } |
33 | } | 33 | } |
34 | 34 | ||
35 | eyekinfig_t::~eyekinfig_t() { | 35 | eyekinfig_t::~eyekinfig_t() { |
36 | if(cfg) cfg_free(cfg); | 36 | if(cfg) cfg_free(cfg); |
37 | } | 37 | } |
38 | 38 | ||
39 | std::string eyekinfig_t::get_targetdir() { | 39 | std::string eyekinfig_t::get_targetdir() { |
40 | assert(cfg); | 40 | assert(cfg); |
41 | return gnu::autosprintf(cfg_getstr(cfg,"targetdir"),macaddress.c_str()); | 41 | return gnu::autosprintf(cfg_getstr(cfg,"targetdir"),macaddress.c_str()); |
42 | } | 42 | } |
43 | 43 | ||
44 | std::string eyekinfig_t::get_upload_key() { | 44 | std::string eyekinfig_t::get_upload_key() { |
45 | assert(cfg); | 45 | assert(cfg); |
46 | return cfg_getstr(cfg,"uploadkey"); | 46 | return cfg_getstr(cfg,"uploadkey"); |
47 | } | 47 | } |
48 | 48 | ||
49 | std::string eyekinfig_t::get_on_start_session() { | 49 | std::string eyekinfig_t::get_on_start_session() { |
50 | assert(cfg); | 50 | assert(cfg); |
51 | return cfg_getstr(cfg,"on-start-session"); | 51 | return cfg_getstr(cfg,"on-start-session"); |
52 | } | 52 | } |
53 | std::string eyekinfig_t::get_on_upload_photo() { | 53 | std::string eyekinfig_t::get_on_upload_photo() { |
54 | assert(cfg); | 54 | assert(cfg); |
55 | return cfg_getstr(cfg,"on-upload-photo"); | 55 | return cfg_getstr(cfg,"on-upload-photo"); |
56 | } | 56 | } |
57 | 57 | ||
58 | std::string eyekinfig_t::get_on_mark_last_photo_in_roll() { | 58 | std::string eyekinfig_t::get_on_mark_last_photo_in_roll() { |
59 | assert(cfg); | 59 | assert(cfg); |
60 | return cfg_getstr(cfg,"on-mark-last-photo-in-roll"); | 60 | return cfg_getstr(cfg,"on-mark-last-photo-in-roll"); |
61 | } | 61 | } |
62 | 62 | ||
63 | 63 | ||
64 | int eyekinfig_t::get_umask() { | 64 | int eyekinfig_t::get_umask() { |
65 | assert(cfg); | 65 | assert(cfg); |
66 | return cfg_getint(cfg,"umask"); | 66 | return 0777&cfg_getint(cfg,"umask"); |
67 | } | 67 | } |
diff --git a/src/eyetil.cc b/src/eyetil.cc index 2e6ab7e..11e2fb7 100644 --- a/src/eyetil.cc +++ b/src/eyetil.cc | |||
@@ -1,173 +1,173 @@ | |||
1 | #include <stdlib.h> | 1 | #include <stdlib.h> |
2 | #include <sys/stat.h> | 2 | #include <sys/stat.h> |
3 | #include <syslog.h> | 3 | #include <syslog.h> |
4 | #include <iostream> | 4 | #include <iostream> |
5 | #include <cassert> | 5 | #include <cassert> |
6 | #include <stdexcept> | 6 | #include <stdexcept> |
7 | #include <algorithm> | 7 | #include <algorithm> |
8 | #include <numeric> | 8 | #include <numeric> |
9 | #include <openssl/md5.h> | 9 | #include <openssl/md5.h> |
10 | #include "eyetil.h" | 10 | #include "eyetil.h" |
11 | 11 | ||
12 | #include "config.h" | 12 | #include "config.h" |
13 | #ifdef HAVE_LIBUUID | 13 | #ifdef HAVE_LIBUUID |
14 | # include <uuid/uuid.h> | 14 | # include <uuid/uuid.h> |
15 | #endif | 15 | #endif |
16 | 16 | ||
17 | binary_t& binary_t::from_hex(const std::string& h) { | 17 | binary_t& binary_t::from_hex(const std::string& h) { |
18 | std::string::size_type hs = h.length(); | 18 | std::string::size_type hs = h.length(); |
19 | if(hs&1) | 19 | if(hs&1) |
20 | throw std::runtime_error("odd number of characters in hexadecimal number"); | 20 | throw std::runtime_error("odd number of characters in hexadecimal number"); |
21 | int rvs = hs>>1; | 21 | size_t rvs = hs>>1; |
22 | resize(rvs); | 22 | resize(rvs); |
23 | const unsigned char *hp = (const unsigned char*)h.data(); | 23 | const unsigned char *hp = (const unsigned char*)h.data(); |
24 | iterator oi=begin(); | 24 | iterator oi=begin(); |
25 | char t[3] = { 0,0,0 }; | 25 | char t[3] = { 0,0,0 }; |
26 | for(int i=0;i<rvs;++i) { | 26 | for(size_t i=0;i<rvs;++i) { |
27 | t[0]=*(hp++); t[1]=*(hp++); | 27 | t[0]=*(hp++); t[1]=*(hp++); |
28 | *(oi++) = strtol(t,0,16); | 28 | *(oi++) = static_cast<binary_t::value_type>(0xff&strtol(t,0,16)); |
29 | } | 29 | } |
30 | return *this; | 30 | return *this; |
31 | } | 31 | } |
32 | 32 | ||
33 | binary_t& binary_t::from_data(const void *d,size_t s) { | 33 | binary_t& binary_t::from_data(const void *d,size_t s) { |
34 | resize(s); | 34 | resize(s); |
35 | std::copy((const unsigned char*)d,(const unsigned char *)d+s, | 35 | std::copy((const unsigned char*)d,(const unsigned char *)d+s, |
36 | begin() ); | 36 | begin() ); |
37 | return *this; | 37 | return *this; |
38 | } | 38 | } |
39 | 39 | ||
40 | binary_t& binary_t::make_nonce() { | 40 | binary_t& binary_t::make_nonce() { |
41 | #ifdef HAVE_LIBUUID | 41 | #ifdef HAVE_LIBUUID |
42 | uuid_t uuid; | 42 | uuid_t uuid; |
43 | uuid_generate(uuid); | 43 | uuid_generate(uuid); |
44 | from_data((unsigned char*)uuid,sizeof(uuid)); | 44 | from_data((unsigned char*)uuid,sizeof(uuid)); |
45 | #else | 45 | #else |
46 | resize(16); | 46 | resize(16); |
47 | std::generate_n(begin(),16,rand); | 47 | std::generate_n(begin(),16,rand); |
48 | #endif /* HAVE_LIBUUID */ | 48 | #endif /* HAVE_LIBUUID */ |
49 | return *this; | 49 | return *this; |
50 | } | 50 | } |
51 | 51 | ||
52 | std::string binary_t::hex() const { | 52 | std::string binary_t::hex() const { |
53 | std::string rv; | 53 | std::string rv; |
54 | rv.reserve((size()<<1)+1); | 54 | rv.reserve((size()<<1)+1); |
55 | char t[3] = {0,0,0}; | 55 | char t[3] = {0,0,0}; |
56 | for(const_iterator i=begin(),ie=end();i!=ie;++i) { | 56 | for(const_iterator i=begin(),ie=end();i!=ie;++i) { |
57 | int rc = snprintf(t,sizeof(t),"%02x",*i); | 57 | size_t rc = snprintf(t,sizeof(t),"%02x",*i); |
58 | assert(rc<sizeof(t)); | 58 | assert(rc<sizeof(t)); |
59 | rv += t; | 59 | rv += t; |
60 | } | 60 | } |
61 | return rv; | 61 | return rv; |
62 | } | 62 | } |
63 | 63 | ||
64 | binary_t binary_t::md5() const { | 64 | binary_t binary_t::md5() const { |
65 | binary_t rv(MD5_DIGEST_LENGTH); | 65 | binary_t rv(MD5_DIGEST_LENGTH); |
66 | if(!MD5( | 66 | if(!MD5( |
67 | (const unsigned char*)&(front()),size(), | 67 | (const unsigned char*)&(front()),size(), |
68 | (unsigned char*)&(rv.front()) )) | 68 | (unsigned char*)&(rv.front()) )) |
69 | throw std::runtime_error("failed to md5()"); | 69 | throw std::runtime_error("failed to md5()"); |
70 | return rv; | 70 | return rv; |
71 | } | 71 | } |
72 | 72 | ||
73 | void md5_digester::init() { | 73 | void md5_digester::init() { |
74 | if(!MD5_Init(&ctx)) throw std::runtime_error("failed to MD5_Init()"); | 74 | if(!MD5_Init(&ctx)) throw std::runtime_error("failed to MD5_Init()"); |
75 | } | 75 | } |
76 | void md5_digester::update(const void *d,size_t l) { | 76 | void md5_digester::update(const void *d,size_t l) { |
77 | if(!MD5_Update(&ctx,d,l)) throw std::runtime_error("failed to MD5_Update()"); | 77 | if(!MD5_Update(&ctx,d,l)) throw std::runtime_error("failed to MD5_Update()"); |
78 | } | 78 | } |
79 | binary_t md5_digester::final() { | 79 | binary_t md5_digester::final() { |
80 | binary_t rv(MD5_DIGEST_LENGTH); | 80 | binary_t rv(MD5_DIGEST_LENGTH); |
81 | if(!MD5_Final((unsigned char*)&(rv.front()), &ctx)) | 81 | if(!MD5_Final((unsigned char*)&(rv.front()), &ctx)) |
82 | throw std::runtime_error("failed to MD5_Final()"); | 82 | throw std::runtime_error("failed to MD5_Final()"); |
83 | return rv; | 83 | return rv; |
84 | } | 84 | } |
85 | 85 | ||
86 | 86 | ||
87 | static void make_path_for_template(const std::string& p,mode_t m) { | 87 | static void make_path_for_template(const std::string& p,mode_t m) { |
88 | struct stat st; | 88 | struct stat st; |
89 | std::string pp; | 89 | std::string pp; |
90 | for(std::string::size_type sl=p.find('/',1); | 90 | for(std::string::size_type sl=p.find('/',1); |
91 | sl!=std::string::npos; | 91 | sl!=std::string::npos; |
92 | sl=p.find('/',sl+1)) { | 92 | sl=p.find('/',sl+1)) { |
93 | if(stat( (pp=p.substr(0,sl)).c_str() ,&st) | 93 | if(stat( (pp=p.substr(0,sl)).c_str() ,&st) |
94 | || !S_ISDIR(st.st_mode)) { | 94 | || !S_ISDIR(st.st_mode)) { |
95 | if(mkdir(pp.c_str(),m)) | 95 | if(mkdir(pp.c_str(),m)) |
96 | throw std::runtime_error("failed to mkdir()"); | 96 | throw std::runtime_error("failed to mkdir()"); |
97 | } | 97 | } |
98 | } | 98 | } |
99 | } | 99 | } |
100 | 100 | ||
101 | tmpdir_t::tmpdir_t(const std::string& dt) : dir(dt) { | 101 | tmpdir_t::tmpdir_t(const std::string& dt) : dir(dt) { |
102 | make_path_for_template(dt,0777); | 102 | make_path_for_template(dt,0777); |
103 | if(!mkdtemp((char*)dir.data())) | 103 | if(!mkdtemp((char*)dir.data())) |
104 | throw std::runtime_error("failed to mkdtmp()"); | 104 | throw std::runtime_error("failed to mkdtmp()"); |
105 | } | 105 | } |
106 | tmpdir_t::~tmpdir_t() { | 106 | tmpdir_t::~tmpdir_t() { |
107 | assert(!dir.empty()); | 107 | assert(!dir.empty()); |
108 | if(rmdir(dir.c_str())) { | 108 | if(rmdir(dir.c_str())) { |
109 | syslog(LOG_WARNING,"Failed to remove '%s' directory",dir.c_str()); | 109 | syslog(LOG_WARNING,"Failed to remove '%s' directory",dir.c_str()); |
110 | } | 110 | } |
111 | } | 111 | } |
112 | 112 | ||
113 | std::string tmpdir_t::get_file(const std::string& f) { | 113 | std::string tmpdir_t::get_file(const std::string& f) { |
114 | std::string::size_type ls = f.rfind('/'); | 114 | std::string::size_type ls = f.rfind('/'); |
115 | return dir+'/'+( | 115 | return dir+'/'+( |
116 | (ls==std::string::npos) | 116 | (ls==std::string::npos) |
117 | ? f | 117 | ? f |
118 | : f.substr(ls+1) | 118 | : f.substr(ls+1) |
119 | ); | 119 | ); |
120 | } | 120 | } |
121 | 121 | ||
122 | tarchive_t::tarchive_t(void *p,size_t s) : a(archive_read_new()), e(0) { | 122 | tarchive_t::tarchive_t(void *p,size_t s) : a(archive_read_new()), e(0) { |
123 | if(!a) throw std::runtime_error("failed to archive_read_new()"); | 123 | if(!a) throw std::runtime_error("failed to archive_read_new()"); |
124 | if(archive_read_support_format_tar(a)) { | 124 | if(archive_read_support_format_tar(a)) { |
125 | archive_read_finish(a); | 125 | archive_read_finish(a); |
126 | throw std::runtime_error("failed to archive_read_support_format_tar()"); | 126 | throw std::runtime_error("failed to archive_read_support_format_tar()"); |
127 | } | 127 | } |
128 | if(archive_read_open_memory(a,p,s)) { | 128 | if(archive_read_open_memory(a,p,s)) { |
129 | archive_read_finish(a); | 129 | archive_read_finish(a); |
130 | throw std::runtime_error("failed to archive_read_open_memory()"); | 130 | throw std::runtime_error("failed to archive_read_open_memory()"); |
131 | } | 131 | } |
132 | } | 132 | } |
133 | tarchive_t::~tarchive_t() { | 133 | tarchive_t::~tarchive_t() { |
134 | assert(a); | 134 | assert(a); |
135 | archive_read_finish(a); | 135 | archive_read_finish(a); |
136 | } | 136 | } |
137 | 137 | ||
138 | bool tarchive_t::read_next_header() { | 138 | bool tarchive_t::read_next_header() { |
139 | assert(a); | 139 | assert(a); |
140 | return archive_read_next_header(a,&e)==ARCHIVE_OK; | 140 | return archive_read_next_header(a,&e)==ARCHIVE_OK; |
141 | } | 141 | } |
142 | 142 | ||
143 | std::string tarchive_t::entry_pathname() { | 143 | std::string tarchive_t::entry_pathname() { |
144 | assert(a); assert(e); | 144 | assert(a); assert(e); |
145 | return archive_entry_pathname(e); | 145 | return archive_entry_pathname(e); |
146 | } | 146 | } |
147 | 147 | ||
148 | bool tarchive_t::read_data_into_fd(int fd) { | 148 | bool tarchive_t::read_data_into_fd(int fd) { |
149 | assert(a); | 149 | assert(a); |
150 | return archive_read_data_into_fd(a,fd)==ARCHIVE_OK; | 150 | return archive_read_data_into_fd(a,fd)==ARCHIVE_OK; |
151 | } | 151 | } |
152 | 152 | ||
153 | #pragma pack(1) | 153 | #pragma pack(1) |
154 | struct block512_t { | 154 | struct block512_t { |
155 | enum { words = 512 / sizeof(uint16_t) }; | 155 | enum { words = 512 / sizeof(uint16_t) }; |
156 | uint16_t data[words]; | 156 | uint16_t data[words]; |
157 | 157 | ||
158 | static uint16_t tcpcksum(block512_t& data) { | 158 | static uint16_t tcpcksum(block512_t& data) { |
159 | uint32_t sum = std::accumulate(data.data,data.data+words,0); | 159 | uint32_t sum = std::accumulate(data.data,data.data+words,0); |
160 | while(uint32_t hw = sum>>16) sum = (sum&0xffff)+hw; | 160 | while(uint32_t hw = sum>>16) sum = (sum&0xffff)+hw; |
161 | return ~sum; | 161 | return 0xffff&~sum; |
162 | } | 162 | } |
163 | 163 | ||
164 | }; | 164 | }; |
165 | #pragma pack() | 165 | #pragma pack() |
166 | 166 | ||
167 | binary_t integrity_digest(const void *ptr,size_t size,const std::string& ukey) { | 167 | binary_t integrity_digest(const void *ptr,size_t size,const std::string& ukey) { |
168 | md5_digester rv; | 168 | md5_digester rv; |
169 | std::transform( (block512_t*)ptr, ((block512_t*)ptr)+size/sizeof(block512_t), | 169 | std::transform( (block512_t*)ptr, ((block512_t*)ptr)+size/sizeof(block512_t), |
170 | rv.updater<uint16_t>(), block512_t::tcpcksum ); | 170 | rv.updater<uint16_t>(), block512_t::tcpcksum ); |
171 | rv.update( binary_t(ukey) ); | 171 | rv.update( binary_t(ukey) ); |
172 | return rv.final(); | 172 | return rv.final(); |
173 | } | 173 | } |
diff --git a/src/iiid.cc b/src/iiid.cc index 6c23790..c026050 100644 --- a/src/iiid.cc +++ b/src/iiid.cc | |||
@@ -1,86 +1,86 @@ | |||
1 | #include <syslog.h> | 1 | #include <syslog.h> |
2 | #include <getopt.h> | 2 | #include <getopt.h> |
3 | #include <iostream> | 3 | #include <iostream> |
4 | #include <cassert> | 4 | #include <cassert> |
5 | #include <stdexcept> | 5 | #include <stdexcept> |
6 | #include "eyetil.h" | 6 | #include "eyetil.h" |
7 | #include "eyefiworker.h" | 7 | #include "eyefiworker.h" |
8 | 8 | ||
9 | #include "config.h" | 9 | #include "config.h" |
10 | 10 | ||
11 | #include "eyefi.nsmap" | 11 | #include "eyefi.nsmap" |
12 | 12 | ||
13 | #define PHEADER \ | 13 | #define PHEADER \ |
14 | PACKAGE " Version " VERSION "\n" \ | 14 | PACKAGE " Version " VERSION "\n" \ |
15 | "Copyright (c) 2009 Klever Group" | 15 | "Copyright (c) 2009 Klever Group" |
16 | 16 | ||
17 | int main(int argc,char **argv) try { | 17 | int main(int argc,char **argv) try { |
18 | 18 | ||
19 | int port = 59278; | 19 | int port = 59278; |
20 | 20 | ||
21 | while(true) { | 21 | while(true) { |
22 | static struct option opts[] = { | 22 | static struct option opts[] = { |
23 | { "help", no_argument, 0, 'h' }, | 23 | { "help", no_argument, 0, 'h' }, |
24 | { "usage", no_argument, 0, 'h' }, | 24 | { "usage", no_argument, 0, 'h' }, |
25 | { "version", no_argument, 0, 'V' }, | 25 | { "version", no_argument, 0, 'V' }, |
26 | { "license", no_argument, 0, 'L' }, | 26 | { "license", no_argument, 0, 'L' }, |
27 | { "port", required_argument, 0, 'p' }, | 27 | { "port", required_argument, 0, 'p' }, |
28 | { NULL, 0, 0, 0 } | 28 | { NULL, 0, 0, 0 } |
29 | }; | 29 | }; |
30 | int c = getopt_long(argc,argv,"hVLp:",opts,NULL); | 30 | int c = getopt_long(argc,argv,"hVLp:",opts,NULL); |
31 | if(c==-1) break; | 31 | if(c==-1) break; |
32 | switch(c) { | 32 | switch(c) { |
33 | case 'h': | 33 | case 'h': |
34 | std::cerr << PHEADER << std::endl << std::endl | 34 | std::cerr << PHEADER << std::endl << std::endl |
35 | << " " << argv[0] << " [options]" << std::endl | 35 | << " " << argv[0] << " [options]" << std::endl |
36 | << std::endl << | 36 | << std::endl << |
37 | " -h, --help,\n" | 37 | " -h, --help,\n" |
38 | " --usage display this text\n" | 38 | " --usage display this text\n" |
39 | " -V, --version display version information\n" | 39 | " -V, --version display version information\n" |
40 | " -L, --license show license\n" | 40 | " -L, --license show license\n" |
41 | " -p <port>, --port=<port> port to listen to\n" | 41 | " -p <port>, --port=<port> port to listen to\n" |
42 | " (you're not likely to ever need it)\n" | 42 | " (you're not likely to ever need it)\n" |
43 | << std::endl << std::endl; | 43 | << std::endl << std::endl; |
44 | exit(0); | 44 | exit(0); |
45 | break; | 45 | break; |
46 | case 'V': | 46 | case 'V': |
47 | std::cerr << VERSION << std::endl; | 47 | std::cerr << VERSION << std::endl; |
48 | exit(0); | 48 | exit(0); |
49 | break; | 49 | break; |
50 | case 'L': | 50 | case 'L': |
51 | extern const char *COPYING; | 51 | extern const char *COPYING; |
52 | std::cerr << COPYING << std::endl; | 52 | std::cerr << COPYING << std::endl; |
53 | exit(0); | 53 | exit(0); |
54 | break; | 54 | break; |
55 | case 'p': | 55 | case 'p': |
56 | port = strtol(optarg,0,0); | 56 | port = 0xffff&strtol(optarg,0,0); |
57 | if(errno) { | 57 | if(errno) { |
58 | std::cerr << "Failed to parse port number" << std::endl; | 58 | std::cerr << "Failed to parse port number" << std::endl; |
59 | exit(1); | 59 | exit(1); |
60 | } | 60 | } |
61 | break; | 61 | break; |
62 | default: | 62 | default: |
63 | std::cerr << "Huh?" << std::endl; | 63 | std::cerr << "Huh?" << std::endl; |
64 | exit(1); | 64 | exit(1); |
65 | break; | 65 | break; |
66 | } | 66 | } |
67 | } | 67 | } |
68 | 68 | ||
69 | const char *ident = rindex(*argv,'/'); | 69 | const char *ident = rindex(*argv,'/'); |
70 | if(ident) | 70 | if(ident) |
71 | ++ident; | 71 | ++ident; |
72 | else | 72 | else |
73 | ident = *argv; | 73 | ident = *argv; |
74 | openlog(ident,LOG_PERROR|LOG_PID,LOG_DAEMON); | 74 | openlog(ident,LOG_PERROR|LOG_PID,LOG_DAEMON); |
75 | syslog(LOG_INFO,"Starting iii eye-fi manager"); | 75 | syslog(LOG_INFO,"Starting iii eye-fi manager"); |
76 | 76 | ||
77 | eyefiworker().run(port); | 77 | eyefiworker().run(port); |
78 | 78 | ||
79 | closelog(); | 79 | closelog(); |
80 | return 0; | 80 | return 0; |
81 | } catch(std::exception& e) { | 81 | } catch(std::exception& e) { |
82 | syslog(LOG_CRIT,"Exiting iii daemon, because of error condition"); | 82 | syslog(LOG_CRIT,"Exiting iii daemon, because of error condition"); |
83 | syslog(LOG_CRIT,"Exception: %s",e.what()); | 83 | syslog(LOG_CRIT,"Exception: %s",e.what()); |
84 | return 1; | 84 | return 1; |
85 | } | 85 | } |
86 | 86 | ||