static int ftpdir(char *host, char *user, char *pass, char *root, char *fspec) { if (!ftpOpen(host)) { fprintf(stderr,"Unable to connect to node %s\n%s",host,ftplib_lastresp); return 0; } if (!ftpLogin(user,pass)) { fprintf(stderr,"Login failure\n%s",ftplib_lastresp); return 0; } if (root != NULL) { if (!ftpChdir(root)) { fprintf(stderr,"Change directory failed\n%s",ftplib_lastresp); return 0; } } if (!ftpNlst(NULL,fspec)) { fprintf(stderr,"Directory failure\n%s",ftplib_lastresp); return 0; } ftpQuit(); return 1; }
int ftpget(char *host, char *user, char *pass, char *root, char mode) { char fnm[256]; if (!ftpOpen(host)) { fprintf(stderr,"Unable to connect to node %s\n%s",host,ftplib_lastresp); return 0; } if (!ftpLogin(user,pass)) { fprintf(stderr,"Login failure\n%s",ftplib_lastresp); return 0; } if (root) if (!ftpChdir(root)) { fprintf(stderr,"Change directory to %s failed\n%s", root,ftplib_lastresp); return 0; } while (gets(fnm) != NULL) { if (!ftpGet(fnm,fnm,mode)) { fprintf(stderr,"Get of %s failed\n%s",fnm,ftplib_lastresp); } else { if (ftplib_debug > 1) fprintf(stderr,"File %s received\n",fnm); } } ftpQuit(); return 1; }
/* set to NULL if not needed */ int urlinstStartTransfer(struct iurlinfo * ui, char * filename, char *extraHeaders) { char * buf; int fd, port; int family = -1; char * finalPrefix; struct in_addr addr; struct in6_addr addr6; char *hostname, *portstr; if (!strcmp(ui->prefix, "/")) finalPrefix = ""; else finalPrefix = ui->prefix; buf = alloca(strlen(finalPrefix) + strlen(filename) + 20); if (*filename == '/') sprintf(buf, "%s%s", finalPrefix, filename); else sprintf(buf, "%s/%s", finalPrefix, filename); logMessage(INFO, "transferring %s://%s/%s to a fd", ui->protocol == URL_METHOD_FTP ? "ftp" : "http", ui->address, buf); splitHostname(ui->address, &hostname, &portstr); if (portstr == NULL) port = -1; else port = atoi(portstr); if (inet_pton(AF_INET, hostname, &addr) >= 1) family = AF_INET; else if (inet_pton(AF_INET6, hostname, &addr6) >= 1) family = AF_INET6; else { if (mygethostbyname(hostname, &addr, AF_INET) == 0) { family = AF_INET; } else if (mygethostbyname(hostname, &addr6, AF_INET6) == 0) { family = AF_INET6; } else { logMessage(ERROR, "cannot determine address family of %s", hostname); } } if (ui->protocol == URL_METHOD_FTP) { ui->ftpPort = ftpOpen(hostname, family, ui->login ? ui->login : "******", ui->password ? ui->password : "******", NULL, port); if (ui->ftpPort < 0) return -2; fd = ftpGetFileDesc(ui->ftpPort, addr6, family, buf); if (fd < 0) { close(ui->ftpPort); return -1; } } else { #ifdef ROCKS { /* * try harder to start HTTP transfer */ int tries = 1; int rc; logMessage(INFO, "ROCKS:urlinstStartTransfer:http://%s/%s\n" "Headers:%s\n", ui->address, filename, extraHeaders); fd = -1; while ((fd < 0) && (tries < 10)) { fd = httpGetFileDesc(ui->address, -1, buf, extraHeaders); if (fd == FTPERR_FAILED_DATA_CONNECT) { /* Server busy, backoff */ sleep(60); tries = 1; continue; } logMessage(INFO, "ROCKS:urlinstStartTransfer:attempt (%d)", tries); sleep(1); ++tries; } if (fd < 0) { logMessage(ERROR, "ROCKS:urlinstStartTransfer:Failed"); rc = newtWinChoice(_("GET File Error"), _("Retry"), _("Cancel"), _("Could not get file:\n\nhttp://%s/%s\n\n%s"), ui->address, filename, ftpStrerror(fd, URL_METHOD_HTTP)); if (rc == 1) return urlinstStartTransfer(ui, filename, extraHeaders); else return -1; } } #else fd = httpGetFileDesc(hostname, port, buf, extraHeaders); if (fd < 0) return -1; #endif /* ROCKS */ } if (!FL_CMDLINE(flags)) winStatus(70, 3, _("Retrieving"), "%s %s...", _("Retrieving"), filename); return fd; }