summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--camlibs/ptp2/fujiptpip.c42
1 files changed, 27 insertions, 15 deletions
diff --git a/camlibs/ptp2/fujiptpip.c b/camlibs/ptp2/fujiptpip.c
index efd1e3b4c..1aeefb48f 100644
--- a/camlibs/ptp2/fujiptpip.c
+++ b/camlibs/ptp2/fujiptpip.c
@@ -905,7 +905,7 @@ ptp_fujiptpip_jpeg (PTPParams* params, unsigned char** xdata, unsigned int *xsiz
int
ptp_fujiptpip_connect (PTPParams* params, const char *address) {
char *addr, *s, *p;
- int port, eventport;
+ int port, eventport, connect_tries;
struct sockaddr_in saddr;
uint16_t ret;
@@ -1000,20 +1000,32 @@ ptp_fujiptpip_connect (PTPParams* params, const char *address) {
PTPSOCK_CLOSE (params->jpgfd);
return GP_ERROR_IO;
}
- ret = ptp_fujiptpip_init_command_request (params);
- if (ret != PTP_RC_OK) {
- PTPSOCK_CLOSE (params->cmdfd);
- PTPSOCK_CLOSE (params->evtfd);
- PTPSOCK_CLOSE (params->jpgfd);
- return translate_ptp_result (ret);
- }
- ret = ptp_fujiptpip_init_command_ack (params);
- if (ret != PTP_RC_OK) {
- PTPSOCK_CLOSE (params->cmdfd);
- PTPSOCK_CLOSE (params->evtfd);
- PTPSOCK_CLOSE (params->jpgfd);
- return translate_ptp_result (ret);
- }
+ connect_tries = 0;
+ do {
+ ret = ptp_fujiptpip_init_command_request (params);
+ if (ret != PTP_RC_OK) {
+ PTPSOCK_CLOSE (params->cmdfd);
+ PTPSOCK_CLOSE (params->evtfd);
+ PTPSOCK_CLOSE (params->jpgfd);
+ return translate_ptp_result (ret);
+ }
+ connect_tries++;
+ ret = ptp_fujiptpip_init_command_ack (params);
+ if (ret == PTP_RC_AccessDenied && connect_tries < 2) {
+#ifdef WIN32
+ Sleep(500);
+#else
+ usleep(500*1000);
+#endif
+ continue;
+ }
+ if (ret != PTP_RC_OK) {
+ PTPSOCK_CLOSE (params->cmdfd);
+ PTPSOCK_CLOSE (params->evtfd);
+ PTPSOCK_CLOSE (params->jpgfd);
+ return translate_ptp_result (ret);
+ }
+ } while(connect_tries < 2);
GP_LOG_D ("fujiptpip connected!");
return GP_OK;
}