summaryrefslogtreecommitdiffabout
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) (side-by-side diff)
tree05320addd7a51652d3f3ff34cfe17e81cf1b8889
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 (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 @@
#include <stdexcept>
#include <iterator>
#include <syslog.h>
#include <sys/wait.h>
#include <autosprintf.h>
#include "eyekinfig.h"
#include "eyetil.h"
#include "soapeyefiService.h"
static bool detached_child() {
pid_t p = fork();
if(p<0) throw std::runtime_error("failed to fork()");
if(!p) {
p = fork();
if(p<0) {
syslog(LOG_ERR,"Failed to re-fork child process");
_exit(-1);
}
if(!p) {
setsid();
for(int i=getdtablesize();i>=0;--i) close(i);
int i=open("/dev/null",O_RDWR); assert(i==0);
i = dup(i); assert(i==1);
i = dup(i); assert(i==2);
return true;
}
_exit(0);
}
int rc;
if(waitpid(p,&rc,0)<0) throw std::runtime_error("failed to waitpid()");
if(!WIFEXITED(rc)) throw std::runtime_error("error in forked process");
if(WEXITSTATUS(rc)) throw std::runtime_error("forked process signalled error");
return false;
}
int eyefiService::StartSession(
std::string macaddress,std::string cnonce,
int transfermode,long transfermodetimestamp,
struct rns__StartSessionResponse &r ) {
#ifndef NDEBUG
syslog(LOG_DEBUG,
"StartSession request from %s with cnonce=%s, transfermode=%d, transfermodetimestamp=%ld",
macaddress.c_str(), cnonce.c_str(), transfermode, transfermodetimestamp );
#endif
r.credential = binary_t(macaddress+cnonce+eyekinfig_t(macaddress).get_upload_key()).md5().hex();
/* TODO: better nonce generator */
time_t t = time(0);
r.snonce = binary_t(&t,sizeof(t)).md5().hex();
- r.transfermode=2;
- r.transfermodetimestamp=t;
+ r.transfermode=transfermode;
+ r.transfermodetimestamp=transfermodetimestamp;
r.upsyncallowed=false;
std::string cmd = eyekinfig_t(macaddress).get_on_start_session();
if(!cmd.empty()) {
if(detached_child()) {
putenv( gnu::autosprintf("EYEFI_MACADDRESS=%s",macaddress.c_str()) );
putenv( gnu::autosprintf("EYEFI_TRANSFERMODE=%d",transfermode) );
putenv( gnu::autosprintf("EYEFI_TRANSFERMODETIMESTAMP=%ld",transfermodetimestamp) );
char *argv[] = { (char*)"/bin/sh", (char*)"-c", (char*)cmd.c_str(), 0 };
execv("/bin/sh",argv);
syslog(LOG_ERR,"Failed to execute '%s'",cmd.c_str());
_exit(-1);
}
}
return SOAP_OK;
}
int eyefiService::GetPhotoStatus(
std::string credential, std::string macaddress,
std::string filename, long filesize, std::string filesignature,
struct rns__GetPhotoStatusResponse &r ) {
#ifndef NDEBUG
syslog(LOG_DEBUG,
"GetPhotoStatus request from %s with credential=%s, filename=%s, filesize=%ld, filesignature=%s",
macaddress.c_str(), credential.c_str(), filename.c_str(), filesize, filesignature.c_str() );
#endif
r.fileid = 1; r.offset = 0;
return SOAP_OK;
}
int eyefiService::MarkLastPhotoInRoll(
std::string macaddress, int mergedelta,
struct rns__MarkLastPhotoInRollResponse &r ) {
#ifndef NDEBUG
syslog(LOG_DEBUG,
"MarkLastPhotoInRoll request from %s with mergedelta=%d",
macaddress.c_str(), mergedelta );
#endif
std::string cmd = eyekinfig_t(macaddress).get_on_mark_last_photo_in_roll();
if(!cmd.empty()) {
if(detached_child()) {
putenv( gnu::autosprintf("EYEFI_MACADDRESS=%s",macaddress.c_str()) );
putenv( gnu::autosprintf("EYEFI_MERGEDELTA=%d",mergedelta) );
char *argv[] = { (char*)"/bin/sh", (char*)"-c", (char*)cmd.c_str(), 0 };
execv("/bin/sh",argv);
syslog(LOG_ERR,"Failed to execute '%s'",cmd.c_str());
_exit(-1);
}