void transfer_begin_nohup(int argc, char **argv) { nohup_start_time = time(0); ftp_set_signal(SIGHUP, SIG_IGN); /* ignore signals */ ftp_set_signal(SIGINT, SIG_IGN); ftp_set_signal(SIGQUIT, SIG_IGN); ftp_set_signal(SIGTSTP, SIG_IGN); ftp_set_signal(SIGTERM, term_handler); dup2(fileno(logfp), fileno(stdout)); dup2(fileno(logfp), fileno(stderr)); #if 0 && (defined(HAVE_SETPROCTITLE) || defined(linux)) if(gvUseEnvString) setproctitle("%s, nohup, %s", ftp->url->hostname, nohup_logfile); #endif printf(_("Connected to %s as user %s\n"), ftp->url->hostname, ftp->url->username); if(argv) printf(_("Transfer started %s\n"), ctime(&nohup_start_time)); else printf(_("Transfer received SIGHUP %s\n"), ctime(&nohup_start_time)); nohup_command = argv ? args_cat(argc, argv, 0) : 0; if(argv) printf(_("Command: '%s'\n"), nohup_command); printf("pid: %u\n\n", getpid()); }
/* reads reply * returns 0 on success or -1 on error */ int ftp_read_reply(void) { char tmp[5]="xxx "; int r; ftp_set_signal(SIGALRM, reply_ALRM_handler); if(ftp->reply_timeout) alarm(ftp->reply_timeout); sock_clearerr_in(ftp->ctrl); r = ftp_gets(); if(!sock_connected(ftp->ctrl)) { alarm(0); ftp_set_signal(SIGALRM, SIG_DFL); ftp_trace("sock is not connected\n"); return -1; } if(r == -1) { alarm(0); ftp_set_signal(SIGALRM, SIG_DFL); ftp_trace("ftp_gets returned -1\n"); return -1; } ftp_print_reply(); if(ftp->reply[3] == '-') { /* multiline response */ strncpy(tmp, ftp->reply, 3); do { if(ftp_gets() == -1) break; ftp_print_reply(); } while(strncmp(tmp, ftp->reply, 4) != 0); } ftp->tmp_verbosity = vbUnset; alarm(0); ftp_set_signal(SIGALRM, SIG_DFL); return r; }
void invoke_shell(const char* fmt, ...) { char *shell; pid_t pid; ftp_set_signal(SIGINT, SIG_IGN); shell = getenv("SHELL"); if(!shell) shell = STD_SHELL; pid = fork(); if(pid == 0) { /* child thread */ if(fmt) { char* tmp = NULL; va_list ap; va_start(ap, fmt); int r = vasprintf(&tmp, fmt, ap); va_end(ap); if (r == -1) { fprintf(stderr, _("Failed to allocate memory.\n")); exit(1); } execl(shell, shell, "-c", tmp, (char *)NULL); } else { printf(_("Executing '%s', use 'exit' to exit from shell...\n"), shell); execl(shell, shell, (char *)NULL); } perror(shell); exit(1); } if(pid == -1) { perror("fork()"); return; } waitpid(pid, 0, 0); /* wait for child to finish execution */ }
int ftp_open_url(url_t *urlp, bool reset_vars) { bool use_proxy; int i; if(reset_vars) ftp_reset_vars(); /* don't assume server is in ascii mode initially even if RFC says so */ ftp->prev_type = '?'; #ifdef HAVE_POSIX_SIGSETJMP if(sigsetjmp(open_timeout_jmp, 1)) #else if(setjmp(open_timeout_jmp)) #endif { ftp_close(); ftp_err(_("Connection timeout after %u seconds\n"), ftp->open_timeout); return 1; } ftp_set_signal(SIGALRM, ftp_open_handler); alarm(ftp->open_timeout); use_proxy = (proxy_type(urlp) != 0); ftp_err(_("Looking up %s... "), use_proxy ? gvProxyUrl->hostname : urlp->hostname); /* Set the default port (22) for SSH if no port is specified. We * need to do this here, 'cause host_lookup() sets it to 21 * (default port for vanilla FTP) */ if(urlp->protocol) { if(strcmp(urlp->protocol, "sftp") == 0) url_setprotocol(urlp, "ssh"); if(strcmp(urlp->protocol, "ssh") == 0 && urlp->port == -1) urlp->port = 22; /* default SSH port */ } ftp->host = host_create(use_proxy ? gvProxyUrl : urlp); if(!host_lookup(ftp->host)) { herror(host_getname(ftp->host)); alarm(0); ftp_set_signal(SIGALRM, SIG_IGN); return -1; } /* keep the value in urlp->port urlp->port = ntohs(ftp->host->port); and set it to 21 if it is -1 */ if(urlp->port == -1) { urlp->port = 21; } fprintf(stderr, "\r "); i = strlen(use_proxy ? gvProxyUrl->hostname : urlp->hostname); while(i--) fprintf(stderr, " "); fprintf(stderr, "\r"); ftp_trace("\n"); #ifdef HAVE_LIBSSH if(urlp->protocol && strcmp(urlp->protocol, "ssh") == 0) { int ret = ssh_open_url(urlp); alarm(0); return ret; } #endif if(urlp->protocol && strcmp(urlp->protocol, "ftp") != 0) { ftp_err(_("Sorry, don't know how to handle your '%s' protocol\n" "trying 'ftp' instead...\n"), urlp->protocol); url_setprotocol(urlp, 0); } if(use_proxy) { ftp_err(_("Connecting to proxy %s at port %d...\n"), host_getoname(ftp->host), urlp->port); } else { ftp_err(_("Connecting to %s at port %d...\n"), host_getoname(ftp->host), urlp->port); } ftp->ctrl = sock_create(); if (ftp->ctrl == 0) { ftp_err(_("Unable to create socket.\n")); alarm(0); ftp_set_signal(SIGALRM, SIG_IGN); return -1; } if(!sock_connect_host(ftp->ctrl, ftp->host)) { alarm(0); ftp_set_signal(SIGALRM, SIG_IGN); return -1; } sock_lowdelay(ftp->ctrl); char* ip = host_getip(ftp->host); ftp_err(_("Connected to %s ([%s]:%d).\n"), host_getoname(ftp->host), ip, urlp->port); free(ip); /* read startup message from server */ ftp_set_tmp_verbosity(vbCommand); ftp_read_reply(); if(ftp->fullcode == 120) { ftp_set_tmp_verbosity(vbCommand); ftp_read_reply(); } alarm(0); ftp_set_signal(SIGALRM, SIG_IGN); if(!sock_connected(ftp->ctrl)) { ftp_close(); return 1; } ftp->connected = (ftp->fullcode == 220); if(ftp->connected) { void (*tracefunq)(const char *fmt, ...); url_destroy(ftp->url); ftp->url = url_clone(urlp); tracefunq = (ftp->verbosity == vbDebug ? ftp_err : ftp_trace); char* remote_addr = printable_address(sock_remote_addr(ftp->ctrl)), *local_addr = printable_address(sock_local_addr(ftp->ctrl)); tracefunq("remote address: %s\n", remote_addr); tracefunq("local address: %s\n", local_addr); free(remote_addr); free(local_addr); return 0; } else { ftp_close(); return 1; } }