diff options
author | jbj <devnull@localhost> | 1999-06-30 19:02:46 +0000 |
---|---|---|
committer | jbj <devnull@localhost> | 1999-06-30 19:02:46 +0000 |
commit | ae5b56fa00804e3391aba88038ee16798b486c90 (patch) | |
tree | 3981a58fa39c277daa77e05144dd1b0ba272ee40 | |
parent | c0d41067da0219fdf0d2fccd8628f5d336554229 (diff) | |
download | rpm-ae5b56fa00804e3391aba88038ee16798b486c90.tar.gz rpm-ae5b56fa00804e3391aba88038ee16798b486c90.tar.bz2 rpm-ae5b56fa00804e3391aba88038ee16798b486c90.zip |
move url.c and ftp.c to rpmlib right next to query.
CVS patchset: 3115
CVS date: 1999/06/30 19:02:46
-rw-r--r-- | CHANGES | 1 | ||||
-rw-r--r-- | Makefile.am | 6 | ||||
-rw-r--r-- | ftp.c | 691 | ||||
-rw-r--r-- | install.c | 3 | ||||
-rw-r--r-- | lib/Makefile.am | 10 | ||||
-rw-r--r-- | lib/query.c | 2 | ||||
-rw-r--r-- | lib/verify.c | 2 | ||||
-rw-r--r-- | po/rpm.pot | 216 | ||||
-rw-r--r-- | url.c | 478 |
9 files changed, 120 insertions, 1289 deletions
@@ -20,6 +20,7 @@ - fix: bsearch needs macro table sorted after undefine. (#3713). - fix: --checksig segfault with odd pgp output (e.g. w/o ~/.pgp) (#3720) - avoid numeric overflow in version comparison (Thayne Harbaugh<tharbaug@liberate.com>). + - move url.c and ftp.c to rpmlib right next to query. 3.0 -> 3.0.1 - fix: %verifyscript resurrected (Shing-Gene Yung). diff --git a/Makefile.am b/Makefile.am index 8db9710bd..577377fff 100644 --- a/Makefile.am +++ b/Makefile.am @@ -40,10 +40,10 @@ pkglib_SCRIPTS = find-provides find-requires mkinstalldirs \ config.guess config.sub noinst_HEADERS = \ - acconfig.h build.h checksig.h ftp.h \ - install.h system.h url.h + acconfig.h build.h checksig.h install.h \ + system.h -rpm_SOURCES = build.c checksig.c ftp.c install.c rpm.c url.c +rpm_SOURCES = build.c checksig.c install.c rpm.c rpm_LDADD = $(mylibs) @LIBMISC@ $(PROGRAMS): $(mylibs) @LIBMISC@ diff --git a/ftp.c b/ftp.c deleted file mode 100644 index ae46b194b..000000000 --- a/ftp.c +++ /dev/null @@ -1,691 +0,0 @@ -#include "system.h" - -#if !defined(HAVE_CONFIG_H) -#define HAVE_MACHINE_TYPES_H 1 -#define HAVE_ALLOCA_H 1 -#define HAVE_NETINET_IN_SYSTM_H 1 -#define HAVE_SYS_SOCKET_H 1 -#endif - -#ifndef __LCLINT__ -#if HAVE_MACHINE_TYPES_H -# include <machine/types.h> -#endif -#endif - -#if HAVE_NETINET_IN_SYSTM_H -# include <sys/types.h> -# include <netinet/in_systm.h> -#endif - -#if ! HAVE_HERRNO -extern int h_errno; -#endif - -#include <stdarg.h> - -#include <netinet/in.h> -#include <netinet/ip.h> -#include <arpa/inet.h> -#include <arpa/telnet.h> - -#include "rpmlib.h" -#include "rpmio.h" - -#if !defined(HAVE_INET_ATON) -int inet_aton(const char *cp, struct in_addr *inp); -#endif - -#define TIMEOUT_SECS 60 -#define BUFFER_SIZE 4096 - -#if defined(USE_ALT_DNS) && USE_ALT_DNS -#include "dns.h" -#endif - -#include "url.h" -#include "ftp.h" - -#ifdef __MINT__ -# ifndef EAGAIN -# define EAGAIN EWOULDBLOCK -# endif -# ifndef O_NONBLOCK -# define O_NONBLOCK O_NDELAY -# endif -#endif - -static int ftpDebug = 0; -static int ftpTimeoutSecs = TIMEOUT_SECS; -static int httpTimeoutSecs = TIMEOUT_SECS; - -static rpmCallbackFunction urlNotify = NULL; -static void * urlNotifyData = NULL; -static int urlNotifyCount = -1; - -void urlSetCallback(rpmCallbackFunction notify, void *notifyData, int notifyCount) { - urlNotify = notify; - urlNotifyData = notifyData; - urlNotifyCount = (notifyCount >= 0) ? notifyCount : 4096; -} - -static int checkResponse(int fd, int secs, int *ecp, char ** str) { - static char buf[BUFFER_SIZE + 1]; - int bufLength = 0; - fd_set emptySet, readSet; - char *se, *s; - struct timeval timeout; - int bytesRead, rc = 0; - int doesContinue = 1; - char errorCode[4]; - - errorCode[0] = '\0'; - - do { - /* - * XXX In order to preserve both getFile and getFd methods with - * XXX HTTP, the response is read 1 char at a time with breaks on - * XXX newlines. - */ - do { - FD_ZERO(&emptySet); - FD_ZERO(&readSet); - FD_SET(fd, &readSet); - - timeout.tv_sec = secs; - timeout.tv_usec = 0; - - rc = select(fd + 1, &readSet, &emptySet, &emptySet, &timeout); - if (rc < 1) { - if (rc == 0) - return FTPERR_BAD_SERVER_RESPONSE; - else - rc = FTPERR_UNKNOWN; - } else - rc = 0; - - s = buf + bufLength; - bytesRead = read(fd, s, 1); - bufLength += bytesRead; - buf[bufLength] = '\0'; - } while (bufLength < sizeof(buf) && *s != '\n'); - - /* - * Divide the response into lines. Skip continuation lines. - */ - s = se = buf; - while (*se != '\0') { - while (*se && *se != '\n') se++; - - if (se > s && se[-1] == '\r') - se[-1] = '\0'; - if (*se == '\0') - break; - - /* HTTP header termination on empty line */ - if (*s == '\0') { - doesContinue = 0; - break; - } - *se++ = '\0'; - - /* HTTP: look for "HTTP/1.1 123 ..." */ - if (!strncmp(s, "HTTP", 4)) { - char *e; - if ((e = strchr(s, ' ')) != NULL) { - e++; - if (strchr("0123456789", *e)) - strncpy(errorCode, e, 3); - errorCode[3] = '\0'; - } - s = se; - continue; - } - - /* FTP: look for "123-" and/or "123 " */ - if (strchr("0123456789", *s)) { - if (errorCode[0]) { - if (!strncmp(s, errorCode, 3) && s[3] == ' ') - doesContinue = 0; - } else { - strncpy(errorCode, s, 3); - errorCode[3] = '\0'; - if (s[3] != '-') { - doesContinue = 0; - } - } - } - s = se; - } - - if (doesContinue && se > s) { - bufLength = se - s - 1; - if (s != buf) - memcpy(buf, s, bufLength); - } else { - bufLength = 0; - } - } while (doesContinue && !rc); - -if (ftpDebug) -fprintf(stderr, "<- %s\n", buf); - - if (str) *str = buf; - if (ecp) *ecp = atoi(errorCode); - - return rc; -} - -static int ftpCheckResponse(urlinfo *u, char ** str) { - int ec = 0; - int rc = checkResponse(u->ftpControl, ftpTimeoutSecs, &ec, str); - - switch (ec) { - case 550: - return FTPERR_FILE_NOT_FOUND; - break; - case 552: - return FTPERR_NIC_ABORT_IN_PROGRESS; - break; - default: - if (ec >= 400 && ec <= 599) - return FTPERR_BAD_SERVER_RESPONSE; - break; - } - return rc; -} - -static int ftpCommand(urlinfo *u, char * command, ...) { - va_list ap; - int len; - char * s; - char * buf; - - va_start(ap, command); - len = strlen(command) + 2; - s = va_arg(ap, char *); - while (s) { - len += strlen(s) + 1; - s = va_arg(ap, char *); - } - va_end(ap); - - buf = alloca(len + 1); - - va_start(ap, command); - strcpy(buf, command); - strcat(buf, " "); - s = va_arg(ap, char *); - while (s) { - strcat(buf, s); - strcat(buf, " "); - s = va_arg(ap, char *); - } - va_end(ap); - - buf[len - 2] = '\r'; - buf[len - 1] = '\n'; - buf[len] = '\0'; - -if (ftpDebug) -fprintf(stderr, "-> %s", buf); - if (write(u->ftpControl, buf, len) != len) { - return FTPERR_SERVER_IO_ERROR; - } - - return ftpCheckResponse(u, NULL); -} - -#if !defined(USE_ALT_DNS) || !USE_ALT_DNS -static int mygethostbyname(const char * host, struct in_addr * address) { - struct hostent * hostinfo; - - hostinfo = gethostbyname(host); - if (!hostinfo) return 1; - - memcpy(address, hostinfo->h_addr_list[0], hostinfo->h_length); - return 0; -} -#endif - -static int getHostAddress(const char * host, struct in_addr * address) { - if (isdigit(host[0])) { - if (!inet_aton(host, address)) { - return FTPERR_BAD_HOST_ADDR; - } - } else { - if (mygethostbyname(host, address)) { - errno = h_errno; - return FTPERR_BAD_HOSTNAME; - } - } - - return 0; -} - -static int tcpConnect(const char *host, int port) -{ - struct sockaddr_in sin; - int sock = -1; - int rc; - - sin.sin_family = AF_INET; - sin.sin_port = htons(port); - sin.sin_addr.s_addr = INADDR_ANY; - - do { - if ((rc = getHostAddress(host, &sin.sin_addr)) < 0) - break; - - if ((sock = socket(sin.sin_family, SOCK_STREAM, IPPROTO_IP)) < 0) { - rc = FTPERR_FAILED_CONNECT; - break; - } - - if (connect(sock, (struct sockaddr *) &sin, sizeof(sin))) { - rc = FTPERR_FAILED_CONNECT; - break; - } - } while (0); - - if (rc < 0 && sock >= 0) { - close(sock); - return rc; - } - -if (ftpDebug) -fprintf(stderr,"++ connect %s:%d on fd %d\n", inet_ntoa(sin.sin_addr), ntohs(sin.sin_port), sock); - - return sock; -} - -int httpOpen(urlinfo *u) -{ - int sock; - const char *host; - const char *path; - int port; - char *buf; - size_t len; - - if (u == NULL || ((host = (u->proxyh ? u->proxyh : u->host)) == NULL)) - return FTPERR_BAD_HOSTNAME; - - if ((port = (u->proxyp > 0 ? u->proxyp : u->port)) < 0) port = 80; - - path = (u->proxyh || u->proxyp > 0) ? u->url : u->path; - if ((sock = tcpConnect(host, port)) < 0) - return sock; - - len = strlen(path) + sizeof("GET HTTP/1.0\r\n\r\n"); - buf = alloca(len); - strcpy(buf, "GET "); - strcat(buf, path); - strcat(buf, " HTTP/1.0\r\n"); - strcat(buf, "\r\n"); - - if (write(sock, buf, len) != len) { - close(sock); - return FTPERR_SERVER_IO_ERROR; - } - -if (ftpDebug) -fprintf(stderr, "-> %s", buf); - - { int ec = 0; - int rc; - rc = checkResponse(sock, httpTimeoutSecs, &ec, NULL); - - switch (ec) { - default: - if (rc == 0 && ec != 200) /* not HTTP_OK */ - rc = FTPERR_FILE_NOT_FOUND; - break; - } - - if (rc < 0) { - close(sock); - return rc; - } - } - - return sock; -} - -int ftpOpen(urlinfo *u) -{ - const char * host; - const char * user; - const char * password; - int port; - int rc; - - if (u == NULL || ((host = (u->proxyh ? u->proxyh : u->host)) == NULL)) - return FTPERR_BAD_HOSTNAME; - - if ((port = (u->proxyp > 0 ? u->proxyp : u->port)) < 0) port = IPPORT_FTP; - - if ((user = (u->proxyu ? u->proxyu : u->user)) == NULL) - user = "anonymous"; - - if ((password = u->password) == NULL) { - if (getuid()) { - struct passwd * pw = getpwuid(getuid()); - char *myp = alloca(strlen(pw->pw_name) + sizeof("@")); - strcpy(myp, pw->pw_name); - strcat(myp, "@"); - password = myp; - } else { - password = "root@"; - } - } - - if ((u->ftpControl = tcpConnect(host, port)) < 0) - return u->ftpControl; - - /* ftpCheckResponse() assumes the socket is nonblocking */ - if (fcntl(u->ftpControl, F_SETFL, O_NONBLOCK)) { - rc = FTPERR_FAILED_CONNECT; - goto errxit; - } - - if ((rc = ftpCheckResponse(u, NULL))) { - return rc; - } - - if ((rc = ftpCommand(u, "USER", user, NULL))) - goto errxit; - - if ((rc = ftpCommand(u, "PASS", password, NULL))) - goto errxit; - - if ((rc = ftpCommand(u, "TYPE", "I", NULL))) - goto errxit; - - return u->ftpControl; - -errxit: - close(u->ftpControl); - u->ftpControl = -1; - return rc; -} - -static int copyData(FD_t sfd, FD_t tfd) { - char buf[BUFFER_SIZE]; - fd_set emptySet, readSet; - struct timeval timeout; - int bytesRead; - int bytesCopied = 0; - int rc; - int notifier = -1; - - if (urlNotify) { - (*urlNotify) (NULL, RPMCALLBACK_INST_OPEN_FILE, - 0, 0, NULL, urlNotifyData); - } - - while (1) { - FD_ZERO(&emptySet); - FD_ZERO(&readSet); - FD_SET(fdFileno(sfd), &readSet); - - timeout.tv_sec = ftpTimeoutSecs; - timeout.tv_usec = 0; - - rc = select(fdFileno(sfd) + 1, &readSet, &emptySet, &emptySet, &timeout); - if (rc == 0) { - rc = FTPERR_SERVER_TIMEOUT; - break; - } else if (rc < 0) { - rc = FTPERR_UNKNOWN; - break; - } - - bytesRead = fdRead(sfd, buf, sizeof(buf)); - if (bytesRead == 0) { - rc = 0; - break; - } - - if (fdWrite(tfd, buf, bytesRead) != bytesRead) { - rc = FTPERR_FILE_IO_ERROR; - break; - } - bytesCopied += bytesRead; - if (urlNotify && urlNotifyCount > 0) { - int n = bytesCopied/urlNotifyCount; - if (n != notifier) { - (*urlNotify) (NULL, RPMCALLBACK_INST_PROGRESS, - bytesCopied, 0, NULL, urlNotifyData); - notifier = n; - } - } - } - -if (ftpDebug) -fprintf(stderr, "++ copied %d bytes: %s\n", bytesCopied, ftpStrerror(rc)); - - if (urlNotify) { - (*urlNotify) (NULL, RPMCALLBACK_INST_OPEN_FILE, - bytesCopied, bytesCopied, NULL, urlNotifyData); - } - - fdClose(sfd); - return rc; -} - -int ftpAbort(FD_t fd) { - urlinfo *u = (urlinfo *)fd->fd_url; - char buf[BUFFER_SIZE]; - int rc; - int tosecs = ftpTimeoutSecs; - -if (ftpDebug) -fprintf(stderr, "-> ABOR\n"); - - sprintf(buf, "%c%c%c", IAC, IP, IAC); - send(u->ftpControl, buf, 3, MSG_OOB); - sprintf(buf, "%cABOR\r\n", DM); - if (write(u->ftpControl, buf, 7) != 7) { - close(u->ftpControl); - u->ftpControl = -1; - return FTPERR_SERVER_IO_ERROR; - } - if (fdFileno(fd) >= 0) { - while(read(fdFileno(fd), buf, sizeof(buf)) > 0) - ; - } - - ftpTimeoutSecs = 10; - if ((rc = ftpCheckResponse(u, NULL)) == FTPERR_NIC_ABORT_IN_PROGRESS) { - rc = ftpCheckResponse(u, NULL); - } - rc = ftpCheckResponse(u, NULL); - ftpTimeoutSecs = tosecs; - - if (fdFileno(fd) >= 0) - fdClose(fd); - return 0; -} - -static int ftpGetFileDone(urlinfo *u) { - if (u->ftpGetFileDoneNeeded) { - u->ftpGetFileDoneNeeded = 0; - if (ftpCheckResponse(u, NULL)) - return FTPERR_BAD_SERVER_RESPONSE; - } - return 0; -} - -int ftpGetFileDesc(FD_t fd) -{ - urlinfo *u; - const char *remotename; - struct sockaddr_in dataAddress; - int i, j; - char * passReply; - char * chptr; - char * retrCommand; - int rc; - - u = (urlinfo *)fd->fd_url; - remotename = u->path; - -/* - * XXX When ftpGetFileDesc() is called, there may be a lurking - * XXX transfer complete message (if ftpGetFileDone() was not - * XXX called to clear that message). Clear that message now. - */ - - if (u->ftpGetFileDoneNeeded) - rc = ftpGetFileDone(u); - -if (ftpDebug) -fprintf(stderr, "-> PASV\n"); - if (write(u->ftpControl, "PASV\r\n", 6) != 6) - return FTPERR_SERVER_IO_ERROR; - - if ((rc = ftpCheckResponse(u, &passReply))) - return FTPERR_PASSIVE_ERROR; - - chptr = passReply; - while (*chptr && *chptr != '(') chptr++; - if (*chptr != '(') return FTPERR_PASSIVE_ERROR; - chptr++; - passReply = chptr; - while (*chptr && *chptr != ')') chptr++; - if (*chptr != ')') return FTPERR_PASSIVE_ERROR; - *chptr-- = '\0'; - - while (*chptr && *chptr != ',') chptr--; - if (*chptr != ',') return FTPERR_PASSIVE_ERROR; - chptr--; - while (*chptr && *chptr != ',') chptr--; - if (*chptr != ',') return FTPERR_PASSIVE_ERROR; - *chptr++ = '\0'; - - /* now passReply points to the IP portion, and chptr points to the - port number portion */ - - dataAddress.sin_family = AF_INET; - if (sscanf(chptr, "%d,%d", &i, &j) != 2) { - return FTPERR_PASSIVE_ERROR; - } - dataAddress.sin_port = htons((i << 8) + j); - - chptr = passReply; - while (*chptr++) { - if (*chptr == ',') *chptr = '.'; - } - - if (!inet_aton(passReply, &dataAddress.sin_addr)) - return FTPERR_PASSIVE_ERROR; - - fd->fd_fd = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); - if (fdFileno(fd) < 0) { - return FTPERR_FAILED_CONNECT; - } - - retrCommand = alloca(strlen(remotename) + 20); - sprintf(retrCommand, "RETR %s\r\n", remotename); - i = strlen(retrCommand); - - while (connect(fdFileno(fd), (struct sockaddr *) &dataAddress, - sizeof(dataAddress)) < 0) { - if (errno == EINTR) - continue; - fdClose(fd); - return FTPERR_FAILED_DATA_CONNECT; - } - -if (ftpDebug) -fprintf(stderr, "-> %s", retrCommand); - if (write(u->ftpControl, retrCommand, i) != i) { - return FTPERR_SERVER_IO_ERROR; - } - - if ((rc = ftpCheckResponse(u, NULL))) { - fdClose(fd); - return rc; - } - - u->ftpGetFileDoneNeeded = 1; - return 0; -} - -int httpGetFile(FD_t sfd, FD_t tfd) { - return copyData(sfd, tfd); -} - -int ftpGetFile(FD_t sfd, FD_t tfd) -{ - urlinfo *u; - int rc; - - /* XXX sfd will be freed by copyData -- grab sfd->fd_url now */ - u = (urlinfo *)sfd->fd_url; - - /* XXX normally sfd = ufdOpen(...) and this code does not execute */ - if (fdFileno(sfd) < 0 && (rc = ftpGetFileDesc(sfd)) < 0) { - fdClose(sfd); - return rc; - } - - rc = copyData(sfd, tfd); - if (rc < 0) - return rc; - - return ftpGetFileDone(u); -} - -int ftpClose(FD_t fd) { - int fdno = ((urlinfo *)fd->fd_url)->ftpControl; - if (fdno >= 0) - close(fdno); - return 0; -} - -const char *ftpStrerror(int errorNumber) { - switch (errorNumber) { - case 0: - return _("Success"); - - case FTPERR_BAD_SERVER_RESPONSE: - return _("Bad server response"); - - case FTPERR_SERVER_IO_ERROR: - return _("Server IO error"); - - case FTPERR_SERVER_TIMEOUT: - return _("Server timeout"); - - case FTPERR_BAD_HOST_ADDR: - return _("Unable to lookup server host address"); - - case FTPERR_BAD_HOSTNAME: - return _("Unable to lookup server host name"); - - case FTPERR_FAILED_CONNECT: - return _("Failed to connect to server"); - - case FTPERR_FAILED_DATA_CONNECT: - return _("Failed to establish data connection to server"); - - case FTPERR_FILE_IO_ERROR: - return _("IO error to local file"); - - case FTPERR_PASSIVE_ERROR: - return _("Error setting remote server to passive mode"); - - case FTPERR_FILE_NOT_FOUND: - return _("File not found on server"); - - case FTPERR_NIC_ABORT_IN_PROGRESS: - return _("Abort in progress"); - - case FTPERR_UNKNOWN: - default: - return _("Unknown or unexpected error"); - } -} - @@ -3,8 +3,7 @@ #include "build/rpmbuild.h" #include "install.h" -#include "url.h" -#include "ftp.h" +#include "rpmurl.h" static void printHash(const unsigned long amount, const unsigned long total); static void * showProgress(const Header h, const rpmCallbackType what, diff --git a/lib/Makefile.am b/lib/Makefile.am index 9772102fd..b2b32720d 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -10,7 +10,7 @@ INCLUDES = \ pkgincdir = $(pkgincludedir) pkginc_HEADERS = \ - dbindex.h header.h misc.h rpmio.h rpmlib.h rpmmacro.h stringbuf.h + dbindex.h header.h misc.h rpmio.h rpmlib.h rpmmacro.h rpmurl.h stringbuf.h noinst_HEADERS = \ cpio.h depends.h falloc.h fprint.h hash.h install.h \ lookup.h md5.h oldheader.h oldrpmdb.h rpm_malloc.h \ @@ -19,12 +19,12 @@ noinst_HEADERS = \ lib_LTLIBRARIES = librpm.la librpm_la_SOURCES = \ cpio.c dbindex.c depends.c falloc.c \ - formats.c fs.c header.c install.c \ + formats.c fprint.c fs.c ftp.c hash.c header.c install.c \ lookup.c macro.c md5.c md5sum.c \ - messages.c misc.c oldheader.c package.c query.c \ + messages.c misc.c oldheader.c package.c problems.c query.c \ rebuilddb.c rpmdb.c rpmerr.c rpmio.c rpmbzio.c rpmlead.c \ - rpmrc.c signature.c stringbuf.c tagName.c tagtable.c \ - tread.c uninstall.c verify.c transaction.c problems.c hash.c fprint.c + rpmrc.c signature.c stringbuf.c tagName.c tagtable.c transaction.c \ + tread.c uninstall.c url.c verify.c tagtable.c: rpmlib.h @echo '#include "system.h"' > tagtable.c diff --git a/lib/query.c b/lib/query.c index 0680f4067..91505ee0f 100644 --- a/lib/query.c +++ b/lib/query.c @@ -6,7 +6,7 @@ #include "build/rpmbuild.h" #include "popt/popt.h" -#include "url.h" +#include "rpmurl.h" static void printFileInfo(char * name, unsigned int size, unsigned short mode, unsigned int mtime, unsigned short rdev, diff --git a/lib/verify.c b/lib/verify.c index 3abc0913a..e46d932a9 100644 --- a/lib/verify.c +++ b/lib/verify.c @@ -7,7 +7,7 @@ #include "install.h" #include "build/rpmbuild.h" -#include "url.h" +#include "rpmurl.h" static int _ie = 0x44332211; static union _endian { int i; char b[4]; } *_endian = (union _endian *)&_ie; diff --git a/po/rpm.pot b/po/rpm.pot index 46f738cd9..d88c179d6 100644 --- a/po/rpm.pot +++ b/po/rpm.pot @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" -"POT-Creation-Date: 1999-06-25 06:03-0400\n" +"POT-Creation-Date: 1999-06-30 14:41-0400\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -14,7 +14,7 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: ENCODING\n" -#: ../build.c:24 ../install.c:221 ../install.c:372 +#: ../build.c:24 ../install.c:220 ../install.c:371 #, c-format msgid "cannot open %s/packages.rpm\n" msgstr "" @@ -235,159 +235,107 @@ msgstr "" msgid "rpmconvert 1.0 - converting database in /var/lib/rpm\n" msgstr "" -#: ../ftp.c:651 -msgid "Success" -msgstr "" - -#: ../ftp.c:654 -msgid "Bad server response" -msgstr "" - -#: ../ftp.c:657 -msgid "Server IO error" -msgstr "" - -#: ../ftp.c:660 -msgid "Server timeout" -msgstr "" - -#: ../ftp.c:663 -msgid "Unable to lookup server host address" -msgstr "" - -#: ../ftp.c:666 -msgid "Unable to lookup server host name" -msgstr "" - -#: ../ftp.c:669 -msgid "Failed to connect to server" -msgstr "" - -#: ../ftp.c:672 -msgid "Failed to establish data connection to server" -msgstr "" - -#: ../ftp.c:675 -msgid "IO error to local file" -msgstr "" - -#: ../ftp.c:678 -msgid "Error setting remote server to passive mode" -msgstr "" - -#: ../ftp.c:681 -msgid "File not found on server" -msgstr "" - -#: ../ftp.c:684 -msgid "Abort in progress" -msgstr "" - -#: ../ftp.c:688 -msgid "Unknown or unexpected error" -msgstr "" - -#: ../install.c:127 +#: ../install.c:126 msgid "counting packages to install\n" msgstr "" -#: ../install.c:131 +#: ../install.c:130 #, c-format msgid "found %d packages\n" msgstr "" -#: ../install.c:140 +#: ../install.c:139 msgid "looking for packages to download\n" msgstr "" -#: ../install.c:151 +#: ../install.c:150 #, c-format msgid "Retrieving %s\n" msgstr "" -#: ../install.c:160 +#: ../install.c:159 #, c-format msgid " ... as %s\n" msgstr "" -#: ../install.c:164 +#: ../install.c:163 #, c-format msgid "skipping %s - transfer failed - %s\n" msgstr "" -#: ../install.c:181 +#: ../install.c:180 #, c-format msgid "retrieved %d packages\n" msgstr "" -#: ../install.c:190 ../install.c:322 +#: ../install.c:189 ../install.c:321 #, c-format msgid "cannot open file %s\n" msgstr "" -#: ../install.c:202 ../lib/query.c:567 +#: ../install.c:201 ../lib/query.c:567 #, c-format msgid "%s does not appear to be a RPM package\n" msgstr "" -#: ../install.c:206 ../install.c:459 +#: ../install.c:205 ../install.c:458 #, c-format msgid "%s cannot be installed\n" msgstr "" -#: ../install.c:242 +#: ../install.c:241 #, c-format msgid "package %s is not relocateable\n" msgstr "" -#: ../install.c:254 +#: ../install.c:253 #, c-format msgid "error reading from file %s\n" msgstr "" -#: ../install.c:257 +#: ../install.c:256 #, c-format msgid "file %s requires a newer version of RPM\n" msgstr "" -#: ../install.c:274 +#: ../install.c:273 #, c-format msgid "found %d source and %d binary packages\n" msgstr "" -#: ../install.c:284 +#: ../install.c:283 msgid "failed dependencies:\n" msgstr "" -#: ../install.c:302 +#: ../install.c:301 msgid "installing binary packages\n" msgstr "" -#: ../install.c:383 ../lib/query.c:715 +#: ../install.c:382 ../lib/query.c:715 #, c-format msgid "package %s is not installed\n" msgstr "" -#: ../install.c:387 +#: ../install.c:386 #, c-format msgid "searching for package %s\n" msgstr "" -#: ../install.c:396 +#: ../install.c:395 #, c-format msgid "\"%s\" specifies multiple packages\n" msgstr "" -#: ../install.c:422 +#: ../install.c:421 msgid "removing these packages would break dependencies:\n" msgstr "" -#: ../install.c:449 +#: ../install.c:448 #, c-format msgid "cannot open %s\n" msgstr "" -#: ../install.c:454 +#: ../install.c:453 #, c-format msgid "Installing %s\n" msgstr "" @@ -1493,36 +1441,6 @@ msgstr "" msgid "error reading header from package\n" msgstr "" -#: ../url.c:136 -#, c-format -msgid "Password for %s@%s: " -msgstr "" - -#: ../url.c:160 ../url.c:186 -#, c-format -msgid "error: %sport must be a number\n" -msgstr "" - -#: ../url.c:271 -msgid "url port must be a number\n" -msgstr "" - -#. XXX PARANOIA -#: ../url.c:308 -#, c-format -msgid "logging into %s as %s, pw %s\n" -msgstr "" - -#: ../lib/rpmdb.c:169 ../url.c:422 -#, c-format -msgid "failed to open %s\n" -msgstr "" - -#: ../url.c:437 -#, c-format -msgid "failed to create %s\n" -msgstr "" - #: ../build/build.c:83 ../build/pack.c:248 msgid "Unable to open temp file" msgstr "" @@ -2339,6 +2257,58 @@ msgstr "" msgid "file %s is on an unknown device" msgstr "" +#: ../lib/ftp.c:650 +msgid "Success" +msgstr "" + +#: ../lib/ftp.c:653 +msgid "Bad server response" +msgstr "" + +#: ../lib/ftp.c:656 +msgid "Server IO error" +msgstr "" + +#: ../lib/ftp.c:659 +msgid "Server timeout" +msgstr "" + +#: ../lib/ftp.c:662 +msgid "Unable to lookup server host address" +msgstr "" + +#: ../lib/ftp.c:665 +msgid "Unable to lookup server host name" +msgstr "" + +#: ../lib/ftp.c:668 +msgid "Failed to connect to server" +msgstr "" + +#: ../lib/ftp.c:671 +msgid "Failed to establish data connection to server" +msgstr "" + +#: ../lib/ftp.c:674 +msgid "IO error to local file" +msgstr "" + +#: ../lib/ftp.c:677 +msgid "Error setting remote server to passive mode" +msgstr "" + +#: ../lib/ftp.c:680 +msgid "File not found on server" +msgstr "" + +#: ../lib/ftp.c:683 +msgid "Abort in progress" +msgstr "" + +#: ../lib/ftp.c:687 +msgid "Unknown or unexpected error" +msgstr "" + #: ../lib/header.c:669 #, c-format msgid "Data type %d not supprted\n" @@ -2621,7 +2591,7 @@ msgstr "" msgid "internal error (rpm bug?): " msgstr "" -#: ../lib/misc.c:342 ../lib/misc.c:348 ../lib/misc.c:355 +#: ../lib/misc.c:367 ../lib/misc.c:373 ../lib/misc.c:380 #, c-format msgid "error creating temporary file %s" msgstr "" @@ -2818,7 +2788,7 @@ msgstr "" #: ../lib/query.c:545 #, c-format -msgid "open of %s failed\n" +msgid "open of %s failed: %s\n" msgstr "" #: ../lib/query.c:558 @@ -2958,6 +2928,11 @@ msgstr "" msgid "opening database mode 0x%x in %s\n" msgstr "" +#: ../lib/rpmdb.c:169 ../lib/url.c:421 +#, c-format +msgid "failed to open %s\n" +msgstr "" + #: ../lib/rpmdb.c:182 ../lib/rpmdb.c:189 #, c-format msgid "cannot get %s lock on database" @@ -3321,6 +3296,31 @@ msgstr "" msgid "removal of %s failed: %s" msgstr "" +#: ../lib/url.c:135 +#, c-format +msgid "Password for %s@%s: " +msgstr "" + +#: ../lib/url.c:159 ../lib/url.c:185 +#, c-format +msgid "error: %sport must be a number\n" +msgstr "" + +#: ../lib/url.c:270 +msgid "url port must be a number\n" +msgstr "" + +#. XXX PARANOIA +#: ../lib/url.c:307 +#, c-format +msgid "logging into %s as %s, pw %s\n" +msgstr "" + +#: ../lib/url.c:436 +#, c-format +msgid "failed to create %s\n" +msgstr "" + #: ../lib/verify.c:36 msgid "don't verify files in package" msgstr "" diff --git a/url.c b/url.c deleted file mode 100644 index 766d9709e..000000000 --- a/url.c +++ /dev/null @@ -1,478 +0,0 @@ -#include "system.h" - -#include <netinet/in.h> - -#include "build/rpmbuild.h" - -#include "url.h" -#include "ftp.h" - -static struct urlstring { - const char *leadin; - urltype ret; -} urlstrings[] = { - { "file://", URL_IS_PATH }, - { "ftp://", URL_IS_FTP }, - { "http://", URL_IS_HTTP }, - { "-", URL_IS_DASH }, - { NULL, URL_IS_UNKNOWN } -}; - -void freeUrlinfo(urlinfo *u) -{ - if (u->ftpControl >= 0) - close(u->ftpControl); - FREE(u->url); - FREE(u->service); - FREE(u->user); - FREE(u->password); - FREE(u->host); - FREE(u->portstr); - FREE(u->path); - FREE(u->proxyu); - FREE(u->proxyh); - - FREE(u); -} - -urlinfo *newUrlinfo(void) -{ - urlinfo *u; - if ((u = malloc(sizeof(*u))) == NULL) - return NULL; - memset(u, 0, sizeof(*u)); - u->proxyp = -1; - u->port = -1; - u->ftpControl = -1; - u->ftpGetFileDoneNeeded = 0; - return u; -} - -static int urlStrcmp(const char *str1, const char *str2) -{ - if (str1 && str2) { - return (strcmp(str1, str2)); - } else - if (str1 != str2) - return -1; - return 0; -} - -static void findUrlinfo(urlinfo **uret, int mustAsk) -{ - urlinfo *u; - urlinfo **empty; - static urlinfo **uCache = NULL; - static int uCount = 0; - int i; - - if (uret == NULL) - return; - - u = *uret; - - empty = NULL; - for (i = 0; i < uCount; i++) { - urlinfo *ou; - if ((ou = uCache[i]) == NULL) { - if (empty == NULL) - empty = &uCache[i]; - continue; - } - /* Check for cache-miss condition. A cache miss is - * a) both items are not NULL and don't compare. - * b) either of the items is not NULL. - */ - if (urlStrcmp(u->service, ou->service)) - continue; - if (urlStrcmp(u->service, ou->service)) - continue; - if (urlStrcmp(u->host, ou->host)) - continue; - if (urlStrcmp(u->user, ou->user)) - continue; - if (urlStrcmp(u->password, ou->password)) - continue; - if (urlStrcmp(u->portstr, ou->portstr)) - continue; - break; /* Found item in cache */ - } - - if (i == uCount) { - if (empty == NULL) { - uCount++; - if (uCache) - uCache = realloc(uCache, sizeof(*uCache) * uCount); - else - uCache = malloc(sizeof(*uCache)); - empty = &uCache[i]; - } - *empty = u; - } else { - /* Swap original url and path into the cached structure */ - const char *up = uCache[i]->path; - uCache[i]->path = u->path; - u->path = up; - up = uCache[i]->url; - uCache[i]->url = u->url; - u->url = up; - freeUrlinfo(u); - } - - /* This URL is now cached. */ - *uret = u = uCache[i]; - - /* Zap proxy host and port in case they have been reset */ - u->proxyp = -1; - FREE(u->proxyh); - - /* Perform one-time FTP initialization */ - if (!strcmp(u->service, "ftp")) { - - if (mustAsk || (u->user != NULL && u->password == NULL)) { - char * prompt; - FREE(u->password); - prompt = alloca(strlen(u->host) + strlen(u->user) + 40); - sprintf(prompt, _("Password for %s@%s: "), u->user, u->host); - u->password = strdup(getpass(prompt)); - } - - if (u->proxyh == NULL) { - const char *proxy = rpmExpand("%{_ftpproxy}", NULL); - if (proxy && *proxy != '%') { - const char *uu = (u->user ? u->user : "anonymous"); - char *nu = malloc(strlen(uu) + sizeof("@") + strlen(u->host)); - strcpy(nu, uu); - strcat(nu, "@"); - strcat(nu, u->host); - u->proxyu = nu; - u->proxyh = strdup(proxy); - } - xfree(proxy); - } - - if (u->proxyp < 0) { - const char *proxy = rpmExpand("%{_ftpport}", NULL); - if (proxy && *proxy != '%') { - char *end; - int port = strtol(proxy, &end, 0); - if (!(end && *end == '\0')) { - fprintf(stderr, _("error: %sport must be a number\n"), - u->service); - return; - } - u->proxyp = port; - } - xfree(proxy); - } - } - - /* Perform one-time HTTP initialization */ - if (!strcmp(u->service, "http")) { - - if (u->proxyh == NULL) { - const char *proxy = rpmExpand("%{_httpproxy}", NULL); - if (proxy && *proxy != '%') - u->proxyh = strdup(proxy); - xfree(proxy); - } - - if (u->proxyp < 0) { - const char *proxy = rpmExpand("%{_httpport}", NULL); - if (proxy && *proxy != '%') { - char *end; - int port = strtol(proxy, &end, 0); - if (!(end && *end == '\0')) { - fprintf(stderr, _("error: %sport must be a number\n"), - u->service); - return; - } - u->proxyp = port; - } - xfree(proxy); - } - - } - - return; -} - -/* - * Split URL into components. The URL can look like - * service://user:password@host:port/path - */ -int urlSplit(const char * url, urlinfo **uret) -{ - urlinfo *u; - char *myurl; - char *s, *se, *f, *fe; - - if (uret == NULL) - return -1; - if ((u = newUrlinfo()) == NULL) - return -1; - - if ((se = s = myurl = strdup(url)) == NULL) { - freeUrlinfo(u); - return -1; - } - - u->url = strdup(url); - - do { - /* Point to end of next item */ - while (*se && *se != '/') se++; - if (*se == '\0') { - /* XXX can't find path */ - if (myurl) free(myurl); - freeUrlinfo(u); - return -1; - } - /* Item was service. Save service and go for the rest ...*/ - if ((se != s) && se[-1] == ':' && se[0] == '/' && se[1] == '/') { - se[-1] = '\0'; - u->service = strdup(s); - se += 2; /* skip over "//" */ - s = se++; - continue; - } - - /* Item was everything-but-path. Save path and continue parse on rest */ - u->path = strdup(se); - *se = '\0'; - break; - } while (1); - - /* Look for ...@host... */ - fe = f = s; - while (*fe && *fe != '@') fe++; - if (*fe == '@') { - s = fe + 1; - *fe = '\0'; - /* Look for user:password@host... */ - while (fe > f && *fe != ':') fe--; - if (*fe == ':') { - *fe++ = '\0'; - u->password = strdup(fe); - } - u->user = strdup(f); - } - - /* Look for ...host:port */ - fe = f = s; - while (*fe && *fe != ':') fe++; - if (*fe == ':') { - *fe++ = '\0'; - u->portstr = strdup(fe); - if (u->portstr != NULL && u->portstr[0] != '\0') { - char *end; - u->port = strtol(u->portstr, &end, 0); - if (!(end && *end == '\0')) { - rpmMessage(RPMMESS_ERROR, _("url port must be a number\n")); - if (myurl) free(myurl); - freeUrlinfo(u); - return -1; - } - } - } - u->host = strdup(f); - - if (u->port < 0 && u->service != NULL) { - struct servent *se; - if ((se = getservbyname(u->service, "tcp")) != NULL) - u->port = ntohs(se->s_port); - else if (!strcasecmp(u->service, "ftp")) - u->port = IPPORT_FTP; - else if (!strcasecmp(u->service, "http")) - u->port = IPPORT_HTTP; - } - - if (myurl) free(myurl); - if (uret) { - *uret = u; - findUrlinfo(uret, 0); - } - return 0; -} - -static int urlConnect(const char * url, urlinfo ** uret) -{ - urlinfo *u; - - if (urlSplit(url, &u) < 0) - return -1; - - if (!strcmp(u->service, "ftp") && u->ftpControl < 0) { - - u->ftpGetFileDoneNeeded = 0; /* XXX PARANOIA */ - rpmMessage(RPMMESS_DEBUG, _("logging into %s as %s, pw %s\n"), - u->host, - u->user ? u->user : "ftp", - u->password ? u->password : "(username)"); - - u->ftpControl = ftpOpen(u); - - if (u->ftpControl < 0) { /* XXX save ftpOpen error */ - u->openError = u->ftpControl; - return u->ftpControl; - } - - } - - if (uret != NULL) - *uret = u; - - return 0; -} - -urltype urlIsURL(const char * url) -{ - struct urlstring *us; - - for (us = urlstrings; us->leadin != NULL; us++) { - if (strncmp(url, us->leadin, strlen(us->leadin))) - continue; - return us->ret; - } - - return URL_IS_UNKNOWN; -} - -#ifdef NOTYET -int urlAbort(FD_t fd) -{ - if (fd != NULL && fd->fd_url) { - urlinfo *u = (urlinfo *)fd->fd_url; - if (u->ftpControl >= 0) - ftpAbort(fd); - } -} -#endif - -int ufdClose(FD_t fd) -{ - if (fd != NULL && fd->fd_url) { - urlinfo *u = (urlinfo *)fd->fd_url; - /* Close the ftp control channel (not strictly necessary, but ... */ - if (u->ftpControl >= 0) { - ftpAbort(fd); - fd = NULL; /* XXX ftpAbort does fdClose(fd) */ - close(u->ftpControl); - u->ftpControl = -1; - } - } - return fdClose(fd); -} - -FD_t ufdOpen(const char *url, int flags, mode_t mode) -{ - FD_t fd = NULL; - urlinfo *u; - - switch (urlIsURL(url)) { - case URL_IS_FTP: - if (urlConnect(url, &u) < 0) - break; - if ((fd = fdNew()) == NULL) - break; - fd->fd_url = u; - if ((u->openError = ftpGetFileDesc(fd)) < 0) { - u->ftpControl = -1; - fd = NULL; /* XXX fd already closed */ - } - break; - case URL_IS_HTTP: - if (urlSplit(url, &u)) - break; - if ((fd = fdNew()) == NULL) - break; - fd->fd_url = u; - fd->fd_fd = httpOpen(u); - if (fd->fd_fd < 0) /* XXX Save httpOpen error */ - u->openError = fd->fd_fd; - break; - case URL_IS_PATH: - if (urlSplit(url, &u)) - break; - fd = fdOpen(u->path, flags, mode); - break; - case URL_IS_DASH: - fd = fdDup(STDIN_FILENO); - break; - case URL_IS_UNKNOWN: - default: - fd = fdOpen(url, flags, mode); - break; - } - - if (fd == NULL || fdFileno(fd) < 0) { - ufdClose(fd); - return NULL; - } - return fd; -} - -int urlGetFile(const char * url, const char * dest) { - int rc; - FD_t sfd = NULL; - FD_t tfd = NULL; - - sfd = ufdOpen(url, O_RDONLY, 0); - if (sfd == NULL || fdFileno(sfd) < 0) { - rpmMessage(RPMMESS_DEBUG, _("failed to open %s\n"), url); - ufdClose(sfd); - return FTPERR_UNKNOWN; - } - - if (sfd->fd_url != NULL && dest == NULL) { - const char *fileName = ((urlinfo *)sfd->fd_url)->path; - if ((dest = strrchr(fileName, '/')) != NULL) - dest++; - else - dest = fileName; - } - - tfd = fdOpen(dest, O_CREAT|O_WRONLY|O_TRUNC, 0600); - if (fdFileno(tfd) < 0) { - rpmMessage(RPMMESS_DEBUG, _("failed to create %s\n"), dest); - fdClose(tfd); - ufdClose(sfd); - return FTPERR_UNKNOWN; - } - - switch (urlIsURL(url)) { - case URL_IS_FTP: - if ((rc = ftpGetFile(sfd, tfd))) { - unlink(dest); - ufdClose(sfd); - } - /* XXX fdClose(sfd) done by copyData */ - break; - case URL_IS_HTTP: - case URL_IS_PATH: - case URL_IS_DASH: - if ((rc = httpGetFile(sfd, tfd))) { - unlink(dest); - ufdClose(sfd); - } - /* XXX fdClose(sfd) done by copyData */ - break; - case URL_IS_UNKNOWN: - default: - rc = FTPERR_UNKNOWN; - break; - } - - fdClose(tfd); - - return rc; -} - -/* XXX This only works for httpOpen/ftpOpen/ftpGetFileDesc failures */ -const char *urlStrerror(const char *url) -{ - urlinfo *u; - if (urlSplit(url, &u)) - return "Malformed URL"; - return ftpStrerror(u->openError); -} |