summaryrefslogtreecommitdiffabout
path: root/src
authorMichael Krelin <hacker@klever.net>2009-04-04 23:51:03 (UTC)
committer Michael Krelin <hacker@klever.net>2009-04-05 00:41:00 (UTC)
commit01eedb36de69f92fc896c525047df78b34f87324 (patch) (unidiff)
tree05320addd7a51652d3f3ff34cfe17e81cf1b8889 /src
parent6b71fd1e4edd46b7caf47135740c961d5d4f051c (diff)
downloadiii-01eedb36de69f92fc896c525047df78b34f87324.zip
iii-01eedb36de69f92fc896c525047df78b34f87324.tar.gz
iii-01eedb36de69f92fc896c525047df78b34f87324.tar.bz2
send back original transfer mode and timestamp
in an attempt to make it send more than one photo per session, but it doesn't seem to help. Well, it doesn't hurt either. Signed-off-by: Michael Krelin <hacker@klever.net>
Diffstat (limited to 'src') (more/less context) (ignore whitespace changes)
-rw-r--r--src/eyefiservice.cc4
1 files changed, 2 insertions, 2 deletions
diff --git a/src/eyefiservice.cc b/src/eyefiservice.cc
index 97cb33b..153a7c4 100644
--- a/src/eyefiservice.cc
+++ b/src/eyefiservice.cc
@@ -4,98 +4,98 @@
4#include <stdexcept> 4#include <stdexcept>
5#include <iterator> 5#include <iterator>
6#include <syslog.h> 6#include <syslog.h>
7#include <sys/wait.h> 7#include <sys/wait.h>
8#include <autosprintf.h> 8#include <autosprintf.h>
9#include "eyekinfig.h" 9#include "eyekinfig.h"
10#include "eyetil.h" 10#include "eyetil.h"
11#include "soapeyefiService.h" 11#include "soapeyefiService.h"
12 12
13static bool detached_child() { 13static bool detached_child() {
14 pid_t p = fork(); 14 pid_t p = fork();
15 if(p<0) throw std::runtime_error("failed to fork()"); 15 if(p<0) throw std::runtime_error("failed to fork()");
16 if(!p) { 16 if(!p) {
17 p = fork(); 17 p = fork();
18 if(p<0) { 18 if(p<0) {
19 syslog(LOG_ERR,"Failed to re-fork child process"); 19 syslog(LOG_ERR,"Failed to re-fork child process");
20 _exit(-1); 20 _exit(-1);
21 } 21 }
22 if(!p) { 22 if(!p) {
23 setsid(); 23 setsid();
24 for(int i=getdtablesize();i>=0;--i) close(i); 24 for(int i=getdtablesize();i>=0;--i) close(i);
25 int i=open("/dev/null",O_RDWR); assert(i==0); 25 int i=open("/dev/null",O_RDWR); assert(i==0);
26 i = dup(i); assert(i==1); 26 i = dup(i); assert(i==1);
27 i = dup(i); assert(i==2); 27 i = dup(i); assert(i==2);
28 return true; 28 return true;
29 } 29 }
30 _exit(0); 30 _exit(0);
31 } 31 }
32 int rc; 32 int rc;
33 if(waitpid(p,&rc,0)<0) throw std::runtime_error("failed to waitpid()"); 33 if(waitpid(p,&rc,0)<0) throw std::runtime_error("failed to waitpid()");
34 if(!WIFEXITED(rc)) throw std::runtime_error("error in forked process"); 34 if(!WIFEXITED(rc)) throw std::runtime_error("error in forked process");
35 if(WEXITSTATUS(rc)) throw std::runtime_error("forked process signalled error"); 35 if(WEXITSTATUS(rc)) throw std::runtime_error("forked process signalled error");
36 return false; 36 return false;
37} 37}
38 38
39int eyefiService::StartSession( 39int eyefiService::StartSession(
40 std::string macaddress,std::string cnonce, 40 std::string macaddress,std::string cnonce,
41 int transfermode,long transfermodetimestamp, 41 int transfermode,long transfermodetimestamp,
42 struct rns__StartSessionResponse &r ) { 42 struct rns__StartSessionResponse &r ) {
43#ifndef NDEBUG 43#ifndef NDEBUG
44 syslog(LOG_DEBUG, 44 syslog(LOG_DEBUG,
45 "StartSession request from %s with cnonce=%s, transfermode=%d, transfermodetimestamp=%ld", 45 "StartSession request from %s with cnonce=%s, transfermode=%d, transfermodetimestamp=%ld",
46 macaddress.c_str(), cnonce.c_str(), transfermode, transfermodetimestamp ); 46 macaddress.c_str(), cnonce.c_str(), transfermode, transfermodetimestamp );
47#endif 47#endif
48 r.credential = binary_t(macaddress+cnonce+eyekinfig_t(macaddress).get_upload_key()).md5().hex(); 48 r.credential = binary_t(macaddress+cnonce+eyekinfig_t(macaddress).get_upload_key()).md5().hex();
49 /* TODO: better nonce generator */ 49 /* TODO: better nonce generator */
50 time_t t = time(0); 50 time_t t = time(0);
51 r.snonce = binary_t(&t,sizeof(t)).md5().hex(); 51 r.snonce = binary_t(&t,sizeof(t)).md5().hex();
52 r.transfermode=2; 52 r.transfermode=transfermode;
53 r.transfermodetimestamp=t; 53 r.transfermodetimestamp=transfermodetimestamp;
54 r.upsyncallowed=false; 54 r.upsyncallowed=false;
55 55
56 std::string cmd = eyekinfig_t(macaddress).get_on_start_session(); 56 std::string cmd = eyekinfig_t(macaddress).get_on_start_session();
57 if(!cmd.empty()) { 57 if(!cmd.empty()) {
58 if(detached_child()) { 58 if(detached_child()) {
59 putenv( gnu::autosprintf("EYEFI_MACADDRESS=%s",macaddress.c_str()) ); 59 putenv( gnu::autosprintf("EYEFI_MACADDRESS=%s",macaddress.c_str()) );
60 putenv( gnu::autosprintf("EYEFI_TRANSFERMODE=%d",transfermode) ); 60 putenv( gnu::autosprintf("EYEFI_TRANSFERMODE=%d",transfermode) );
61 putenv( gnu::autosprintf("EYEFI_TRANSFERMODETIMESTAMP=%ld",transfermodetimestamp) ); 61 putenv( gnu::autosprintf("EYEFI_TRANSFERMODETIMESTAMP=%ld",transfermodetimestamp) );
62 char *argv[] = { (char*)"/bin/sh", (char*)"-c", (char*)cmd.c_str(), 0 }; 62 char *argv[] = { (char*)"/bin/sh", (char*)"-c", (char*)cmd.c_str(), 0 };
63 execv("/bin/sh",argv); 63 execv("/bin/sh",argv);
64 syslog(LOG_ERR,"Failed to execute '%s'",cmd.c_str()); 64 syslog(LOG_ERR,"Failed to execute '%s'",cmd.c_str());
65 _exit(-1); 65 _exit(-1);
66 } 66 }
67 } 67 }
68 return SOAP_OK; 68 return SOAP_OK;
69} 69}
70 70
71int eyefiService::GetPhotoStatus( 71int eyefiService::GetPhotoStatus(
72 std::string credential, std::string macaddress, 72 std::string credential, std::string macaddress,
73 std::string filename, long filesize, std::string filesignature, 73 std::string filename, long filesize, std::string filesignature,
74 struct rns__GetPhotoStatusResponse &r ) { 74 struct rns__GetPhotoStatusResponse &r ) {
75#ifndef NDEBUG 75#ifndef NDEBUG
76 syslog(LOG_DEBUG, 76 syslog(LOG_DEBUG,
77 "GetPhotoStatus request from %s with credential=%s, filename=%s, filesize=%ld, filesignature=%s", 77 "GetPhotoStatus request from %s with credential=%s, filename=%s, filesize=%ld, filesignature=%s",
78 macaddress.c_str(), credential.c_str(), filename.c_str(), filesize, filesignature.c_str() ); 78 macaddress.c_str(), credential.c_str(), filename.c_str(), filesize, filesignature.c_str() );
79#endif 79#endif
80 r.fileid = 1; r.offset = 0; 80 r.fileid = 1; r.offset = 0;
81 return SOAP_OK; 81 return SOAP_OK;
82} 82}
83 83
84int eyefiService::MarkLastPhotoInRoll( 84int eyefiService::MarkLastPhotoInRoll(
85 std::string macaddress, int mergedelta, 85 std::string macaddress, int mergedelta,
86 struct rns__MarkLastPhotoInRollResponse &r ) { 86 struct rns__MarkLastPhotoInRollResponse &r ) {
87#ifndef NDEBUG 87#ifndef NDEBUG
88 syslog(LOG_DEBUG, 88 syslog(LOG_DEBUG,
89 "MarkLastPhotoInRoll request from %s with mergedelta=%d", 89 "MarkLastPhotoInRoll request from %s with mergedelta=%d",
90 macaddress.c_str(), mergedelta ); 90 macaddress.c_str(), mergedelta );
91#endif 91#endif
92 std::string cmd = eyekinfig_t(macaddress).get_on_mark_last_photo_in_roll(); 92 std::string cmd = eyekinfig_t(macaddress).get_on_mark_last_photo_in_roll();
93 if(!cmd.empty()) { 93 if(!cmd.empty()) {
94 if(detached_child()) { 94 if(detached_child()) {
95 putenv( gnu::autosprintf("EYEFI_MACADDRESS=%s",macaddress.c_str()) ); 95 putenv( gnu::autosprintf("EYEFI_MACADDRESS=%s",macaddress.c_str()) );
96 putenv( gnu::autosprintf("EYEFI_MERGEDELTA=%d",mergedelta) ); 96 putenv( gnu::autosprintf("EYEFI_MERGEDELTA=%d",mergedelta) );
97 char *argv[] = { (char*)"/bin/sh", (char*)"-c", (char*)cmd.c_str(), 0 }; 97 char *argv[] = { (char*)"/bin/sh", (char*)"-c", (char*)cmd.c_str(), 0 };
98 execv("/bin/sh",argv); 98 execv("/bin/sh",argv);
99 syslog(LOG_ERR,"Failed to execute '%s'",cmd.c_str()); 99 syslog(LOG_ERR,"Failed to execute '%s'",cmd.c_str());
100 _exit(-1); 100 _exit(-1);
101 } 101 }