void process_file(char *fnm) { int i; int fsz; ftp_connect(); FtpOptions(FTPLIB_CALLBACK, (long) NULL, conn); if ((action == FTP_SEND) || (action == FTP_GET)) { if (action == FTP_SEND) { struct stat info; if (stat(fnm,&info) == -1) { perror(fnm); return; } if (S_ISDIR(info.st_mode)) { if (!ftpMkdir(fnm)) fprintf(stderr,"mkdir %s failed\n%s",fnm,FtpLastResponse(conn)); else if (ftplib_debug) fprintf(stderr,"Directory %s created\n",fnm); return; } fsz = info.st_size; } else { if (!FtpSize(fnm, &fsz, mode, conn)) fsz = 0; } if (ftplib_debug && fsz) { FtpOptions(FTPLIB_CALLBACK, (long) log_progress, conn); FtpOptions(FTPLIB_IDLETIME, (long) 1000, conn); FtpOptions(FTPLIB_CALLBACKARG, (long) &fsz, conn); FtpOptions(FTPLIB_CALLBACKBYTES, (long) fsz/10, conn); } } switch (action) { case FTP_DIR : i = FtpDir(NULL, fnm, conn); break; case FTP_LIST : i = FtpNlst(NULL, fnm, conn); break; case FTP_SEND : i = FtpPut(fnm,fnm,mode,conn); if (ftplib_debug && i) printf("%s sent\n",fnm); break; case FTP_GET : i = FtpGet(fnm,fnm,mode,conn); if (ftplib_debug && i) printf("%s retrieved\n",fnm); break; case FTP_RM : i = FtpDelete(fnm,conn); if (ftplib_debug && i) printf("%s deleted\n", fnm); break; } if (!i) printf("ftp error\n%s\n",FtpLastResponse(conn)); }
DEFINE_THREAD_ROUTINE(academy_upload, data) { char *directoryList = NULL; char *fileList = NULL; char dirname[ACADEMY_MAX_FILENAME]; _ftp_t *academy_ftp = NULL; _ftp_status academy_status; char *ptr = NULL; academy_upload_t *academy = (academy_upload_t *)data; printf("Start thread %s\n", __FUNCTION__); while( academy_upload_started && !ardrone_tool_exit() ) { vp_os_mutex_lock(&academy->mutex); vp_os_memset(&academy->user, 0, sizeof(academy_user_t)); academy->callback = &academy_upload_private_callback; academy->connected = FALSE; academy_upload_resetState(academy); vp_os_cond_wait(&academy->cond); vp_os_mutex_unlock(&academy->mutex); while(academy_upload_started && academy->connected) { academy_status = FTP_FAIL; academy_upload_nextState(academy); switch(academy->state.state) { case ACADEMY_STATE_CONNECTION: { struct dirent *dirent = NULL; DIR *dir = NULL; academy_status = FTP_FAIL; // Check if flight_* directory exist in local dir if((dir = opendir(flight_dir)) != NULL) { struct stat statbuf; while(FTP_FAILED(academy_status) && (dirent = readdir(dir)) != NULL) { if((strncmp(dirent->d_name, "flight_", strlen("flight_")) == 0)) { char local_dir[ACADEMY_MAX_FILENAME]; sprintf(dirname, "%s", dirent->d_name); sprintf(local_dir, "%s/%s", flight_dir, dirname); if((stat(local_dir, &statbuf) == 0) && S_ISDIR(statbuf.st_mode)) academy_status = FTP_SUCCESS; } } closedir(dir); } if(FTP_SUCCEDED(academy_status)) { if(academy_ftp == NULL) academy_ftp = ftpConnectFromName(ACADEMY_SERVERNAME, ACADEMY_PORT, academy->user.username, academy->user.password, &academy_status); } } break; case ACADEMY_STATE_PREPARE_PROCESS: academy_status = ftpCd(academy_ftp, "/Uploaded"); if(FTP_FAILED(academy_status)) { ftpMkdir(academy_ftp, "/Uploaded"); academy_status = ftpCd(academy_ftp, "/Uploaded"); } if(FTP_SUCCEDED(academy_status)) { academy_status = ftpList(academy_ftp, &directoryList, NULL); if(FTP_SUCCEDED(academy_status)) { bool_t found = FALSE; char *next_dir = NULL; while(!found && (ptr = academy_get_next_item_with_prefix(directoryList, &next_dir, "flight_", TRUE))) { if(strcmp(ptr, dirname) == 0) { found = TRUE; academy_upload_setState(academy, ACADEMY_STATE_FINISH_PROCESS); } } if(directoryList != NULL) { vp_os_free(directoryList); directoryList = NULL; } } } break; case ACADEMY_STATE_PROCESS: academy_status = ftpCd(academy_ftp, "/Uploading"); if(FTP_FAILED(academy_status)) { ftpMkdir(academy_ftp, "/Uploading"); academy_status = ftpCd(academy_ftp, "/Uploading"); } if(FTP_SUCCEDED(academy_status)) { ftpMkdir(academy_ftp, dirname); academy_status = ftpCd(academy_ftp, dirname); if(FTP_SUCCEDED(academy_status)) { char local_dir[ACADEMY_MAX_FILENAME]; struct dirent *dirent = NULL; DIR *dir = NULL; sprintf(local_dir, "%s/%s", flight_dir, dirname); if((dir = opendir(local_dir)) != NULL) { char local_filename[ACADEMY_MAX_FILENAME]; struct stat statbuf; while(FTP_SUCCEDED(academy_status) && ((dirent = readdir(dir)) != NULL)) { if((strncmp(dirent->d_name, "picture_", strlen("picture_")) == 0) || (strncmp(dirent->d_name, "userbox_", strlen("userbox_")) == 0)) { sprintf(local_filename, "%s/%s", local_dir, dirent->d_name); if((stat(local_filename, &statbuf) == 0) && !S_ISDIR(statbuf.st_mode)) { PA_DEBUG("Put %s from local directory to server...", dirent->d_name); academy_status = ftpPut(academy_ftp, local_filename, dirent->d_name, 1, NULL); if(FTP_SUCCEDED(academy_status)) PA_DEBUG("OK\n"); else PA_DEBUG("ERROR\n"); } } } closedir(dir); } } } break; case ACADEMY_STATE_FINISH_PROCESS: { char local_dir[ACADEMY_MAX_FILENAME]; char src[ACADEMY_MAX_FILENAME]; char dest[ACADEMY_MAX_FILENAME]; sprintf(src, "/Uploading/%s", dirname); sprintf(dest, "/Uploaded/%s", dirname); academy_status = ftpRename(academy_ftp, src, dest); // Penser à supprimer le fichier local academy_status = FTP_FAIL; sprintf(local_dir, "%s/%s", flight_dir, dirname); if(!ftw(local_dir, &academy_remove, 1)) { rmdir(local_dir); academy_status = FTP_SUCCESS; } } break; case ACADEMY_STATE_DISCONNECTION: if(academy_ftp != NULL) ftpClose(&academy_ftp); academy_status = FTP_SUCCESS; break; default: // Nothing to do break; } if(FTP_SUCCEDED(academy_status)) { PA_DEBUG("continue state from %d to %d\n", academy->state.state, (academy->state.state + 1) % ACADEMY_STATE_MAX); academy_upload_stateOK(academy); } else { PA_DEBUG("stop\n"); academy_upload_stateERROR(academy); if(fileList != NULL) { vp_os_free(fileList); fileList = NULL; } if(academy_ftp) ftpClose(&academy_ftp); vp_os_delay(1000); } } if(fileList != NULL) { vp_os_free(fileList); fileList = NULL; } if(academy_ftp) ftpClose(&academy_ftp); } // while THREAD_RETURN(C_OK); }
void process_file(char *fnm) { int sts = 0; int fsz; struct REMFILE *filelist = NULL; struct REMFILE rem; ftp_connect(); FtpOptions(FTPLIB_CALLBACK, (long) NULL, conn); if ((action == FTP_SEND) || (action == FTP_GET)) { if (action == FTP_SEND) { struct stat info; if (stat(fnm, &info) == -1) { perror(fnm); return; } if (S_ISDIR(info.st_mode)) { if (!ftpMkdir(fnm)) fprintf(stderr, "mkdir %s failed\n%s", fnm, FtpLastResponse(conn)); else if (ftplib_debug) fprintf(stderr, "Directory %s created\n", fnm); return; } fsz = info.st_size; } else { if (!wildcard) { struct REMFILE *f; f = (struct REMFILE *) malloc(sizeof(struct REMFILE)); memset(f, 0, sizeof(struct REMFILE)); f->next = filelist; filelist = f; f->fnm = strdup(fnm); } else { netbuf * dir; char *buf; if (!FtpAccess(fnm, FTPLIB_DIR, FTPLIB_ASCII, conn, &dir)) { fprintf(stderr, "error requesting directory of %s\n%s\n", fnm, FtpLastResponse(conn)); return; } buf = malloc(DIRBUF_SIZE); while (FtpRead(buf, DIRBUF_SIZE, dir) > 0) { struct REMFILE *f; char *p; f = (struct REMFILE *) malloc(sizeof(struct REMFILE)); memset(f, 0, sizeof(struct REMFILE)); f->next = filelist; p = strchr(buf, '\n'); if (p) *p = '\0'; f->fnm = strdup(buf); filelist = f; } free(buf); FtpClose(dir); } } } switch (action) { case FTP_DIR: sts = FtpDir(NULL, fnm, conn); break; case FTP_LIST: sts = FtpNlst(NULL, fnm, conn); break; case FTP_SEND: rem.next = NULL; rem.fnm = fnm; rem.fsz = fsz; fsz /= 10; if (fsz > 100000) fsz = 100000; if (ftplib_debug && fsz) { FtpOptions(FTPLIB_CALLBACK, (long) log_progress, conn); FtpOptions(FTPLIB_IDLETIME, (long) 1000, conn); FtpOptions(FTPLIB_CALLBACKARG, (long) &rem, conn); FtpOptions(FTPLIB_CALLBACKBYTES, (long) fsz, conn); } sts = FtpPut(fnm, fnm, mode, conn); if (ftplib_debug && sts) printf("%s sent\n", fnm); break; case FTP_GET: while (filelist) { struct REMFILE *f = filelist; filelist = f->next; if (!FtpSize(f->fnm, &fsz, mode, conn)) fsz = 0; f->fsz = fsz; fsz /= 10; if (fsz > 100000) fsz = 100000; if (ftplib_debug && fsz) { FtpOptions(FTPLIB_CALLBACK, (long) log_progress, conn); FtpOptions(FTPLIB_IDLETIME, (long) 1000, conn); FtpOptions(FTPLIB_CALLBACKARG, (long) f, conn); FtpOptions(FTPLIB_CALLBACKBYTES, (long) fsz, conn); } sts = FtpGet(f->fnm, f->fnm, mode, conn); if (ftplib_debug && sts) printf("%s retrieved\n", f->fnm); free(f->fnm); free(f); } break; case FTP_RM: while (filelist) { struct REMFILE *f = filelist; filelist = f->next; sts = FtpDelete(f->fnm, conn); if (ftplib_debug && sts) printf("%s deleted\n", f->fnm); free(f->fnm); free(f); } break; } if (!sts) printf("ftp error\n%s\n", FtpLastResponse(conn)); return; }