summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjbj <devnull@localhost>1999-06-30 19:02:46 +0000
committerjbj <devnull@localhost>1999-06-30 19:02:46 +0000
commitae5b56fa00804e3391aba88038ee16798b486c90 (patch)
tree3981a58fa39c277daa77e05144dd1b0ba272ee40
parentc0d41067da0219fdf0d2fccd8628f5d336554229 (diff)
downloadrpm-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--CHANGES1
-rw-r--r--Makefile.am6
-rw-r--r--ftp.c691
-rw-r--r--install.c3
-rw-r--r--lib/Makefile.am10
-rw-r--r--lib/query.c2
-rw-r--r--lib/verify.c2
-rw-r--r--po/rpm.pot216
-rw-r--r--url.c478
9 files changed, 120 insertions, 1289 deletions
diff --git a/CHANGES b/CHANGES
index 6f9857ed5..d2ca225ea 100644
--- a/CHANGES
+++ b/CHANGES
@@ -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");
- }
-}
-
diff --git a/install.c b/install.c
index 564af73d0..60aeeaae7 100644
--- a/install.c
+++ b/install.c
@@ -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);
-}