8 #if defined(HAVE_MACHINE_TYPES_H)
9 # include <machine/types.h>
12 #if defined(HAVE_SYS_SOCKET_H)
13 # include <sys/socket.h>
17 #define NI_MAXHOST 1025
20 #if defined(__LCLINT__)
28 struct sockaddr *ai_addr;
30 struct addrinfo *ai_next;
34 extern int getaddrinfo (
__const char *__restrict __name,
35 __const char *__restrict __service,
36 __const struct addrinfo *__restrict __req,
37 struct addrinfo **__restrict __pai)
40 extern int getnameinfo (
__const struct sockaddr *__restrict __sa,
41 socklen_t __salen,
char *__restrict __host,
42 socklen_t __hostlen,
char *__restrict __serv,
43 socklen_t __servlen,
unsigned int __flags)
46 extern void freeaddrinfo (
struct addrinfo *__ai)
53 #include <netinet/in.h>
54 #include <arpa/inet.h>
56 #if defined(HAVE_NETINET_IN_SYSTM_H)
57 # include <sys/types.h>
58 # include <netinet/in_systm.h>
84 #define _RPMHKP_INTERNAL
91 #if defined(HAVE_LIBIO_H) && defined(_G_IO_IO_FILE_VERSION)
96 #if !defined(HAVE_HERRNO) && (defined(hpux) || defined(__hpux) || defined(__LCLINT__))
102 #define IPPORT_FTP 21
105 #define IPPORT_HTTP 80
108 #if !defined(HAVE_INET_ATON)
109 #define inet_aton(cp,inp) rpm_inet_aton(cp,inp)
115 addr = inet_addr(cp);
116 if (addr == ((
long) -1))
return 0;
118 memcpy(inp, &addr,
sizeof(addr));
123 #if defined(USE_ALT_DNS) && USE_ALT_DNS
130 #define fdOpen __fdOpen
132 #define fdRead __fdRead
134 #define fdWrite __fdWrite
136 #define fdClose __fdClose
150 #define FDTO(fd) (fd ? ((FD_t)fd)->rd_timeoutsecs : -99)
151 #define FDCPIOPOS(fd) (fd ? ((FD_t)fd)->fd_cpioPos : -99)
153 #define FDONLY(fd) assert(fdGetIo(fd) == fdio)
157 #define fdGetFILE(_fd) ((FILE *)fdGetFp(_fd))
168 #define TIMEOUT_SECS 60
199 static char buf[BUFSIZ];
208 sprintf(be,
"fd %p", fd); be += strlen(be);
219 strcpy(be,
" chunked");
223 for (i = fd->
nfps; i >= 0; i--) {
233 #if defined(WITH_ZLIB)
237 #if defined(WITH_BZIP2)
247 }
else if (fps->
io ==
fpio) {
249 sprintf(be,
"%s %p(%d) fdno %d",
250 (fps->
fdno < 0 ?
"LIBIO" :
"FP"),
251 fps->
fp, fileno(((FILE *)fps->
fp)), fps->
fdno);
254 sprintf(be,
"??? io %p fp %p fdno %d ???",
269 if ((nfdno = dup(fdno)) < 0)
271 if (fcntl(nfdno, F_SETFD, FD_CLOEXEC)) {
275 fd =
fdNew(
"open (fdDup)");
278 DBGIO(fd, (stderr,
"<-- fdDup(%d) fd %p %s\n", fdno, (fd ? fd :
NULL),
fdbg(fd)));
306 for (i = fd->
ndigests - 1; i >= 0; i--) {
324 fprintf(stderr,
"*** %s: fd->req %p\n", __FUNCTION__, fd->
req);
343 if (_fdPool ==
NULL) {
415 if (fd->
req != (
void *)-1)
438 DBGIO(fd, (stderr,
"<--\tfdRead(%p,%p,%ld) rc %ld %s\n", cookie, buf, (
long)count, (
long)rc,
fdbg(fd)));
455 if (count == 0)
return 0;
461 if (fd->
req != (
void *)-1)
472 DBGIO(fd, (stderr,
"<--\tfdWrite(%p,%p,%ld) rc %ld %s\n", cookie, buf, (
long)count, (
long)rc,
fdbg(fd)));
481 #ifdef USE_COOKIE_SEEK_POINTER
482 _IO_off64_t
p = *
pos;
491 rc = lseek(
fdFileno(fd), p, whence);
494 DBGIO(fd, (stderr,
"<--\tfdSeek(%p,%ld,%d) rc %lx %s\n", cookie, (
long)p, whence, (
unsigned long)rc,
fdbg(fd)));
507 if (cookie ==
NULL)
return -2;
522 rc = ((fdno >= 0) ? close(fdno) : -2);
525 DBGIO(fd, (stderr,
"<--\tfdClose(%p) rc %lx %s\n", (fd ? fd :
NULL), (
unsigned long)rc,
fdbg(fd)));
527 fd =
fdFree(fd,
"open (fdClose)");
538 fdno = open(path, flags, mode);
539 if (fdno < 0)
return NULL;
540 if (fcntl(fdno, F_SETFD, FD_CLOEXEC)) {
544 fd =
fdNew(
"open (fdOpen)");
549 DBGIO(fd, (stderr,
"<--\tfdOpen(\"%s\",%x,0%o) %s\n", path, (
unsigned)flags, (
unsigned)mode,
fdbg(fd)));
554 FILE *fdFdopen(
void *
cookie,
const char *fmode)
562 if (fdno < 0)
return NULL;
563 fp = fdopen(fdno, fmode);
564 DBGIO(fd, (stderr,
"<-- fdFdopen(%p,\"%s\") fdno %d -> fp %p fdno %d\n", cookie, fmode, fdno, fp, fileno(fp)));
565 fd =
fdFree(fd,
"open (fdFdopen)");
582 #if defined(HAVE_POLL_H)
583 int msecs = (secs >= 0 ? (1000 * secs) : -1);
586 struct timeval timeout, *tvp = (secs >= 0 ? &timeout :
NULL);
593 return (fd->
req == (
void *)-1 ? -1 : 1);
599 #if defined(HAVE_POLL_H)
601 wrfds.events = POLLOUT;
603 rc = poll(&wrfds, 1, msecs);
609 FD_SET(fdno, &wrfds);
611 rc = select(fdno + 1,
NULL, &wrfds,
NULL, tvp);
617 fprintf(stderr,
"*** fdWritable fdno %d rc %d %s\n", fdno, rc, strerror(
errno));
637 #if defined(HAVE_POLL_H)
638 int msecs = (secs >= 0 ? (1000 * secs) : -1);
641 struct timeval timeout, *tvp = (secs >= 0 ? &timeout :
NULL);
648 return (fd->
req == (
void *)-1 ? -1 : 1);
654 #if defined(HAVE_POLL_H)
656 rdfds.events = POLLIN;
658 rc = poll(&rdfds, 1, msecs);
664 FD_SET(fdno, &rdfds);
666 rc = select(fdno + 1, &rdfds,
NULL,
NULL, tvp);
691 char lastchar =
'\0';
717 rc =
fdRead(fd, buf + nb, 1);
731 fprintf(stderr,
"*** read: fd %p rc %d errno %d %s \"%s\"\n", fd, rc,
errno, strerror(
errno), buf);
734 }
else if (rc == 0) {
736 fprintf(stderr,
"*** read: fd %p rc %d EOF errno %d %s \"%s\"\n", fd, rc,
errno, strerror(
errno), buf);
741 lastchar = buf[nb - 1];
743 }
while (ec == 0 && nb < len && lastchar !=
'\n');
745 return (ec >= 0 ? (
int)nb : ec);
753 switch (errorNumber) {
759 return (
"NE_ERROR: Generic error.");
761 return (
"NE_LOOKUP: Hostname lookup failed.");
763 return (
"NE_AUTH: Server authentication failed.");
765 return (
"NE_PROXYAUTH: Proxy authentication failed.");
767 return (
"NE_CONNECT: Could not connect to server.");
769 return (
"NE_TIMEOUT: Connection timed out.");
771 return (
"NE_FAILED: The precondition failed.");
773 return (
"NE_RETRY: Retry request.");
775 return (
"NE_REDIRECT: Redirect received.");
778 return _(
"Bad server response");
780 return _(
"Server I/O error");
782 return _(
"Server timeout");
784 return _(
"Unable to lookup server host address");
786 return _(
"Unable to lookup server host name");
788 return _(
"Failed to connect to server");
790 return _(
"Failed to establish data connection to server");
792 return _(
"I/O error to local file");
794 return _(
"Error setting remote server to passive mode");
796 return _(
"File not found on server");
798 return _(
"Abort in progress");
802 return _(
"Unknown or unexpected error");
819 retstr =
_(
"Malformed URL");
823 retstr = strerror(
errno);
829 #if !defined(HAVE_GETADDRINFO)
830 #if !defined(USE_ALT_DNS) || !USE_ALT_DNS
832 struct in_addr * address)
836 struct hostent * hostinfo;
839 hostinfo = gethostbyname(host);
841 if (!hostinfo)
return 1;
843 memcpy(address, hostinfo->h_addr_list[0],
sizeof(*address));
854 if (!
strcmp(host,
"localhost")) {
884 #ifdef HAVE_GETADDRINFO
886 struct addrinfo hints, *
res, *res0;
888 #define NI_MAXSERV 32
890 char pbuf[NI_MAXSERV];
893 memset(&hints, 0,
sizeof(hints));
894 hints.ai_family = AF_UNSPEC;
895 hints.ai_socktype = SOCK_STREAM;
897 pbuf[
sizeof(pbuf)-1] =
'\0';
899 if (getaddrinfo(host, pbuf, &hints, &res0) == 0) {
900 for (res = res0; res !=
NULL; res = res->ai_next) {
901 if ((fdno = socket(res->ai_family, res->ai_socktype, res->ai_protocol)) < 0)
903 if (connect(fdno, res->ai_addr, (
int)res->ai_addrlen) < 0) {
913 xx = getnameinfo(res->ai_addr, res->ai_addrlen, hbuf,
sizeof(hbuf),
914 NULL, 0, NI_NUMERICHOST);
915 fprintf(stderr,
"++ connect [%s]:%d on fdno %d\n",
926 struct sockaddr_in sin;
928 memset(&sin, 0,
sizeof(sin));
929 sin.sin_family = AF_INET;
930 sin.sin_port = htons(port);
931 sin.sin_addr.s_addr = INADDR_ANY;
937 if ((fdno = socket(sin.sin_family, SOCK_STREAM, IPPROTO_IP)) < 0) {
943 if (connect(fdno, (
struct sockaddr *) &sin,
sizeof(sin))) {
954 fprintf(stderr,
"++ connect %s:%d on fdno %d\n",
956 inet_ntoa(sin.sin_addr)
958 (
int)ntohs(sin.sin_port), fdno);
961 fdSetFdno(ctrl, (fdno >= 0 ? fdno : -1));
974 int *ecp,
char ** str)
1005 se = buf + bufLength;
1007 rc =
fdFgets(ctrl, se, (bufAlloced - bufLength));
1011 }
else if (rc == 0 ||
fdWritable(ctrl, 0) < 1)
1017 for (s = se; *s !=
'\0'; s =
se) {
1020 while (*se && *se !=
'\n') se++;
1022 if (se > s && se[-1] ==
'\r')
1028 fprintf(stderr,
"<- %s\n", s);
1038 if (!strncmp(s,
"HTTP",
sizeof(
"HTTP")-1)) {
1040 if ((e = strchr(s,
'.')) !=
NULL) {
1048 if ((e = strchr(s,
' ')) !=
NULL) {
1050 if (strchr(
"0123456789", *e))
1052 errorCode[3] =
'\0';
1058 for (e = s; *e && !(*e ==
' ' || *e ==
':'); e++)
1060 if (e > s && *e++ ==
':') {
1061 size_t ne = (e -
s);
1062 while (*e && *e ==
' ') e++;
1064 if (!strncmp(s,
"Date:", ne)) {
1066 if (!strncmp(s,
"Server:", ne)) {
1068 if (!strncmp(s,
"Last-Modified:", ne)) {
1070 if (!strncmp(s,
"ETag:", ne)) {
1073 if (!strncmp(s,
"Accept-Ranges:", ne)) {
1079 if (!strncmp(s,
"Content-Length:", ne)) {
1080 if (strchr(
"0123456789", *e))
1083 if (!strncmp(s,
"Connection:", ne)) {
1089 if (!strncmp(s,
"Content-Type:", ne)) {
1091 if (!strncmp(s,
"Transfer-Encoding:", ne)) {
1092 if (!
strcmp(e,
"chunked"))
1097 if (!strncmp(s,
"Allow:", ne)) {
1104 if (!strncmp(s,
"<TITLE>",
sizeof(
"<TITLE>")-1))
1105 s +=
sizeof(
"<TITLE>") - 1;
1108 if (strchr(
"0123456789", *s)) {
1109 if (errorCode[0] !=
'\0') {
1110 if (!strncmp(s, errorCode,
sizeof(
"123")-1) && s[3] ==
' ')
1113 strncpy(errorCode, s,
sizeof(
"123")-1);
1114 errorCode[3] =
'\0';
1121 if (moretodo && se > s) {
1122 bufLength = se - s - 1;
1124 memmove(buf, s, bufLength);
1128 }
while (moretodo && ec == 0);
1130 if (str) *str =
buf;
1131 if (ecp) *ecp = atoi(errorCode);
1154 if (ec >= 400 && ec <= 599) {
1168 const char *
s, *
t;
1174 while ((s = va_arg(ap,
const char *)) !=
NULL) {
1178 len +=
sizeof(
"\r\n")-1;
1181 t = te = (
char *)
alloca(len + 1);
1184 while ((s = va_arg(ap,
const char *)) !=
NULL) {
1185 if (te > t) *te++ =
' ';
1206 const char * password;
1224 uid_t uid = getuid();
1226 if (uid && (pw = getpwuid(uid)) !=
NULL) {
1227 char *myp = (
char *)
alloca(strlen(pw->pw_name) +
sizeof(
"@"));
1228 strcpy(myp, pw->pw_name);
1279 struct sockaddr_in dataAddress;
1295 cmdlen = strlen(ftpCmd) + (ftpArg ? 1+strlen(ftpArg) : 0) +
sizeof(
"\r\n");
1296 cmd = (
char *)
alloca(cmdlen);
1297 chptr =
stpcpy(cmd, ftpCmd);
1300 chptr =
stpcpy(chptr, ftpArg);
1302 chptr =
stpcpy(chptr,
"\r\n");
1303 cmdlen = chptr - cmd;
1308 if (!strncmp(cmd,
"RETR", 4)) {
1315 if (sscanf(passReply,
"%d %u", &rc, &cl) != 2) {
1325 #ifdef HAVE_GETNAMEINFO
1328 #ifdef HAVE_GETADDRINFO
1329 struct sockaddr_storage ss;
1331 struct sockaddr_in ss;
1333 socklen_t sslen =
sizeof(ss);
1336 if ((getpeername(
fdFileno(
c2f(u->
ctrl)), (
struct sockaddr *)&ss, &sslen) == 0)
1337 && (getnameinfo((
struct sockaddr *)&ss, sslen,
1338 remoteIP,
sizeof(remoteIP),
1339 NULL, 0, NI_NUMERICHOST) == 0))
1361 while (*chptr && *chptr !=
'(') chptr++;
1365 while (*chptr && *chptr !=
')') chptr++;
1371 if(sscanf(passReply,
"%*c%*c%*c%d%*c",&i) != 1) {
1378 while (*chptr && *chptr !=
',') chptr--;
1381 while (*chptr && *chptr !=
',') chptr--;
1389 if (sscanf(chptr,
"%d,%d", &i, &j) != 2) {
1397 while (*chptr++ !=
'\0') {
1398 if (*chptr ==
',') *chptr =
'.';
1400 sprintf(remoteIP,
"%s", passReply);
1403 #ifdef HAVE_GETADDRINFO
1406 struct addrinfo hints, *
res, *res0;
1407 char pbuf[NI_MAXSERV];
1410 memset(&hints, 0,
sizeof(hints));
1411 hints.ai_family = AF_UNSPEC;
1412 hints.ai_socktype = SOCK_STREAM;
1413 hints.ai_flags = AI_NUMERICHOST;
1415 hints.ai_flags |= AI_IDN;
1418 pbuf[
sizeof(pbuf)-1] =
'\0';
1419 if (getaddrinfo(remoteIP, pbuf, &hints, &res0)) {
1424 for (res = res0; res !=
NULL; res = res->ai_next) {
1425 rc = socket(res->ai_family, res->ai_socktype, res->ai_protocol);
1436 data =
fdLink(data,
"open data (ftpReq)");
1444 while (connect(
fdFileno(data), res->ai_addr, (
int)res->ai_addrlen) < 0) {
1470 memset(&dataAddress, 0,
sizeof(dataAddress));
1471 dataAddress.sin_family = AF_INET;
1472 dataAddress.sin_port = htons(port);
1475 if (!
inet_aton(remoteIP, &dataAddress.sin_addr)) {
1481 rc = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
1487 data =
fdLink(data,
"open data (ftpReq)");
1494 while (connect(
fdFileno(data), (
struct sockaddr *) &dataAddress,
1495 sizeof(dataAddress)) < 0)
1506 fprintf(stderr,
"-> %s", cmd);
1507 if ((
size_t)
fdWrite(u->
ctrl, cmd, cmdlen) != cmdlen) {
1535 static void * _urlNotifyData =
NULL;
1538 static int _urlNotifyCount = -1;
1540 static void urlSetCallback(
rpmCallbackFunction notify,
void *notifyData,
int notifyCount) {
1541 _urlNotify = notify;
1542 _urlNotifyData = notifyData;
1543 _urlNotifyCount = (notifyCount >= 0) ? notifyCount : 4096;
1551 int itemsCopied = 0;
1559 0, 0,
NULL, _urlNotifyData);
1565 rc = (
int)
Fread(buf,
sizeof(buf[0]),
sizeof(
buf), sfd);
1573 rc = (
int)
Fwrite(buf,
sizeof(buf[0]), itemsRead, tfd);
1576 if (rc != itemsRead) {
1581 itemsCopied += itemsRead;
1583 if (_urlNotify && _urlNotifyCount > 0) {
1584 int n = itemsCopied/_urlNotifyCount;
1585 if (n != notifier) {
1588 itemsCopied, 0,
NULL, _urlNotifyData);
1596 DBGIO(sfd, (stderr,
"++ copied %d bytes: %s\n", itemsCopied,
1603 itemsCopied, itemsCopied,
NULL, _urlNotifyData);
1625 fd = u->
ctrl =
fdNew(
"persist ctrl (urlConnect FTP)");
1637 fd =
fdLink(fd,
"grab ctrl (urlConnect FTP)");
1646 u->
ctrl =
fdFree(fd,
"grab ctrl (urlConnect FTP)");
1653 *uret =
urlLink(u,
"urlConnect");
1654 u =
urlFree(u,
"urlSplit (urlConnect)");
1672 int ftpCmd(
const char * cmd,
const char * url,
const char * arg2)
1690 #define IAC ((unsigned char)255)
1693 #define IP ((unsigned char)244)
1696 #define DM ((unsigned char)242)
1698 #if !defined(SHUT_RDWR)
1699 #define SHUT_RDWR 1+1
1706 static unsigned char ipbuf[3] = {
IAC,
IP,
IAC };
1721 DBGIO(0, (stderr,
"-> ABOR\n"));
1724 if (send(
fdFileno(ctrl), ipbuf,
sizeof(ipbuf), MSG_OOB) !=
sizeof(ipbuf)) {
1795 if (
_ftp_debug && !(rc == 0 && (ec == 200 || ec == 201)))
1796 fprintf(stderr,
"*** httpResp: rc %d ec %d\n", rc, ec);
1814 static int httpReq(
FD_t ctrl,
const char * httpCmd,
const char * httpArg)
1834 if (strchr(host,
':'))
1835 sprintf(hthost,
"[%s]", host);
1837 strcpy(hthost, host);
1841 if (path ==
NULL) path =
"";
1853 ctrl =
fdLink(ctrl,
"open ctrl (httpReq)");
1858 User-Agent: rpm/3.0.4\r\n\
1860 Accept: text/plain\r\n\
1861 Transfer-Encoding: chunked\r\n\
1863 ") + strlen(httpCmd) + strlen(path) +
sizeof(
VERSION) + strlen(hthost) + 20;
1868 if (!
strcmp(httpCmd,
"PUT")) {
1870 %s %s HTTP/1.%d\r\n\
1871 User-Agent: rpm/%s\r\n\
1873 Accept: text/plain\r\n\
1874 Transfer-Encoding: chunked\r\n\
1879 %s %s HTTP/1.%d\r\n\
1880 User-Agent: rpm/%s\r\n\
1882 Accept: text/plain\r\n\
1888 fprintf(stderr,
"-> %s", req);
1891 if (
fdWrite(ctrl, req, len) != (ssize_t)len) {
1896 if (!
strcmp(httpCmd,
"PUT")) {
1912 ctrl =
fdLink(ctrl,
"open data (httpReq)");
1934 return urlLink(fd->
u,
"ufdGetUrlinfo");
1951 (
void) fstat(fdno, &sb);
1952 if (S_ISREG(sb.st_mode))
1953 return fdRead(fd, buf, count);
1959 for (total = 0; total <
count; total += bytesRead) {
1972 return (ssize_t) total;
1978 rc = (
int)
fdRead(fd, buf + total, count - total);
1989 fprintf(stderr,
"*** read: rc %d errno %d %s \"%s\"\n", rc,
errno, strerror(
errno), buf);
1992 }
else if (rc == 0) {
1993 return (ssize_t) total;
1996 bytesRead = (size_t) rc;
1999 return (ssize_t)
count;
2007 size_t bytesWritten;
2014 if (S_ISREG(sb.st_mode))
2015 return fdWrite(fd, buf, count);
2021 for (total = 0; total <
count; total += bytesWritten) {
2029 fprintf(stderr,
"*** ufdWrite fd %p WRITE PAST END OF CONTENT\n", fd);
2030 return (ssize_t) total;
2037 return (ssize_t) total;
2043 rc = (
int)
fdWrite(fd, buf + total, count - total);
2054 fprintf(stderr,
"*** write: rc %d errno %d %s \"%s\"\n", rc,
errno, strerror(
errno), buf);
2057 }
else if (rc == 0) {
2058 return (ssize_t) total;
2061 bytesWritten = (size_t) rc;
2064 return (ssize_t)
count;
2087 return fdSeek(cookie, pos, whence);
2102 fd = u->
data =
fdFree(fd,
"grab data (ufdClose persist)");
2104 fd =
fdFree(fd,
"grab data (ufdClose)");
2164 && (!strncmp(u->
scheme,
"http",
sizeof(
"http")-1) || !strncmp(u->
scheme,
"hkp",
sizeof(
"hkp")-1)))
2177 fd = u->
ctrl =
fdFree(fd,
"open data (ufdClose HTTP persist ctrl)");
2178 else if (fd == u->
data)
2179 fd = u->
data =
fdFree(fd,
"open data (ufdClose HTTP persist data)");
2181 fd =
fdFree(fd,
"open data (ufdClose HTTP)");
2218 assert(!(flags & O_RDWR));
2224 u->
data =
fdNew(
"persist data (ftpOpen)");
2229 fd = u->
data =
fdLink(u->
data,
"grab data (ftpOpen persist data)");
2231 fd =
fdNew(
"grab data (ftpOpen)");
2241 fd->
u =
urlLink(u,
"url (ufdOpen FTP)");
2265 fprintf(stderr,
"*** ufdOpen(%s,0x%x,0%o)\n", url, (
unsigned)flags, (
unsigned)mode);
2270 fd =
ftpOpen(url, flags, mode, &u);
2275 cmd = ((flags & O_WRONLY)
2276 ? ((flags & O_APPEND) ?
"APPE" :
2277 ((flags & O_CREAT) ?
"STOR" :
"STOR"))
2278 : ((flags & O_CREAT) ?
"STOR" :
"RETR"));
2282 fd =
fdLink(fd,
"error data (ufdOpen FTP)");
2293 fd =
davOpen(url, flags, mode, &u);
2295 fd =
httpOpen(url, flags, mode, &u);
2300 cmd = ((flags & O_WRONLY)
2301 ? ((flags & O_APPEND) ?
"PUT" :
2302 ((flags & O_CREAT) ?
"PUT" :
"PUT"))
2311 fd =
fdLink(fd,
"error ctrl (ufdOpen HTTP)");
2312 fd =
fdLink(fd,
"error data (ufdOpen HTTP)");
2323 assert(!(flags & O_RDWR));
2324 fd =
fdDup( ((flags & O_WRONLY) ? STDOUT_FILENO : STDIN_FILENO) );
2335 fd =
fdOpen(path, flags, mode);
2350 DBGIO(fd, (stderr,
"<--\tufdOpen(\"%s\",%x,0%o) %s\n", url, (
unsigned)flags, (
unsigned)mode,
fdbg(fd)));
2367 const char *errstr =
NULL;
2369 #if defined(WITH_ZLIB)
2375 #if defined(WITH_BZIP2)
2381 #if defined(WITH_XZ)
2407 #define FDIOVEC(_fd, _vec) \
2408 ((fdGetIo(_fd) && fdGetIo(_fd)->_vec) ? fdGetIo(_fd)->_vec : NULL)
2415 DBGIO(fd, (stderr,
"==> Fread(%p,%u,%u,%p) %s\n", buf, (
unsigned)size, (
unsigned)nmemb, (fd ? fd :
NULL),
fdbg(fd)));
2428 rc = (
int) (_read ? (*_read) (
fd, (
char *)buf, size * nmemb) : -2);
2438 DBGIO(fd, (stderr,
"==> Fwrite(%p,%u,%u,%p) %s\n", buf, (
unsigned)size, (
unsigned)nmemb, (fd ? fd :
NULL),
fdbg(fd)));
2451 rc = (
int) (_write ? _write(fd, (
const char *)buf, size * nmemb) : -2);
2458 #ifdef USE_COOKIE_SEEK_POINTER
2459 _IO_off64_t o64 =
offset;
2468 DBGIO(fd, (stderr,
"==> Fseek(%p,%ld,%d) %s\n", fd, (
long)offset, whence,
fdbg(fd)));
2471 return fseek(
fdGetFILE(fd), (
long)offset, whence);
2477 rc = (_seek ? _seek(fd, pos, whence) : -2);
2491 DBGIO(fd, (stderr,
"<== Ftell(%p) rc %ld %s\n", fd, rc,
fdbg(fd)));
2498 DBGIO(fd, (stderr,
"==> Rewind(%p) %s\n", fd,
fdbg(fd)));
2514 DBGIO(fd, (stderr,
"<== Fgetpos(%p,%p) rc %d %s\n", fd, pos, rc,
fdbg(fd)));
2528 DBGIO(fd, (stderr,
"<== Fsetpos(%p,%p) rc %d %s\n", fd, pos, rc,
fdbg(fd)));
2537 DBGIO(fd, (stderr,
"==> Fclose(%p) %s\n", (fd ? fd :
NULL),
fdbg(fd)));
2540 fd =
fdLink(fd,
"Fclose");
2542 while (fd->
nfps >= 0) {
2554 if (fd->
nfps > 0 && fpno == -1 &&
2559 int hadreqpersist = (fd->
req !=
NULL);
2575 if (hadreqpersist) {
2602 fd =
fdFree(fd,
"fopencookie (Fclose)");
2612 if (fd == NULL || fd->
nfps == 0)
2618 fd =
fdFree(fd,
"Fclose");
2641 char *stdio,
size_t nstdio,
2642 char *other,
size_t nother,
2643 const char **end,
int *
f)
2651 flags |= O_WRONLY | O_CREAT | O_APPEND;
2652 if (--nstdio > 0) *stdio++ = *
m;
2655 flags |= O_WRONLY | O_CREAT | O_TRUNC;
2656 if (--nstdio > 0) *stdio++ = *
m;
2660 if (--nstdio > 0) *stdio++ = *
m;
2669 while ((c = *m++) !=
'\0') {
2674 flags &= ~(O_RDONLY|O_WRONLY);
2676 if (--nstdio > 0) *stdio++ =
c;
2684 #if defined(__GLIBC__) && __GLIBC__ == 2 && __GLIBC_MINOR__ >= 3
2685 if (--nstdio > 0) *stdio++ =
c;
2690 if (--nstdio > 0) *stdio++ =
c;
2694 if (--nother > 0) *other++ =
c;
2702 *stdio = *other =
'\0';
2704 *end = (*m !=
'\0' ? m :
NULL);
2710 #if defined(__GLIBC__) && __GLIBC__ == 2 && __GLIBC_MINOR__ == 0
2712 typedef _IO_cookie_io_functions_t cookie_io_functions_t;
2718 char stdio[20], other[20], zstdio[40+1];
2719 const char *end =
NULL;
2724 fprintf(stderr,
"*** Fdopen(%p,%s) %s\n", fd, fmode,
fdbg(fd));
2730 cvtfmode(fmode, stdio,
sizeof(stdio), other,
sizeof(other), &end,
NULL);
2731 if (stdio[0] ==
'\0')
2736 if (end ==
NULL && other[0] ==
'\0')
2740 if (!
strcmp(end,
"fdio")) {
2742 #if defined(WITH_ZLIB)
2743 }
else if (!
strcmp(end,
"gzdio")) {
2746 fd = iof->
_fdopen(fd, zstdio);
2749 #if defined(WITH_BZIP2)
2750 }
else if (!
strcmp(end,
"bzdio")) {
2753 fd = iof->
_fdopen(fd, zstdio);
2756 #if defined(WITH_XZ)
2757 }
else if (!
strcmp(end,
"lzdio")) {
2759 fd = iof->
_fdopen(fd, zstdio);
2760 }
else if (!
strcmp(end,
"xzdio")) {
2762 fd = iof->
_fdopen(fd, zstdio);
2764 }
else if (!
strcmp(end,
"ufdio")) {
2766 }
else if (!
strcmp(end,
"fpio")) {
2770 FILE * fp = fdopen(fdno, stdio);
2773 fprintf(stderr,
"*** Fdopen fpio fp %p\n", (
void *)fp);
2785 }
else if (other[0] !=
'\0') {
2786 for (end = other; *end && strchr(
"0123456789fh", *end); end++)
2789 #if defined(WITH_ZLIB)
2792 fd = iof->
_fdopen(fd, zstdio);
2804 { cookie_io_functions_t ciof;
2805 ciof.read = iof->
read;
2806 ciof.write = iof->
write;
2807 ciof.seek = iof->
seek;
2808 ciof.close = iof->
close;
2809 fp = fopencookie(fd, stdio, ciof);
2810 DBGIO(fd, (stderr,
"<-- fopencookie(%p,\"%s\",*%p) returns fp %p\n", fd, stdio, iof, fp));
2821 fd =
fdLink(fd,
"fopencookie");
2826 DBGIO(fd, (stderr,
"<== Fdopen(%p,\"%s\") returns fd %p %s\n", ofd, fmode, (fd ? fd :
NULL),
fdbg(fd)));
2833 const char * fmode =
NULL;
2834 char stdio[20], other[20];
2835 const char *end =
NULL;
2836 mode_t perms = 0666;
2840 if (path ==
NULL || _fmode ==
NULL)
2847 fprintf(stderr,
"==> Fopen(%s, %s)\n", path, fmode);
2850 cvtfmode(fmode, stdio,
sizeof(stdio), other,
sizeof(other), &end, &flags);
2851 if (stdio[0] ==
'\0')
2855 fd =
fdOpen(path, flags, perms);
2878 fd =
ufdOpen(path, flags, perms);
2894 if (isHTTP && ((fp = (FILE *)
fdGetFp(fd)) !=
NULL)
2909 fprintf(stderr,
"<== Fopen(%s, %s) fd %p\n", path, fmode, fd);
2910 fmode =
_free(fmode);
2917 if (fd ==
NULL)
return -1;
2924 #if defined(WITH_ZLIB)
2928 #if defined(WITH_BZIP2)
2932 #if defined(WITH_XZ)
2946 if (fd ==
NULL)
return -1;
2951 for (i = fd->
nfps; rc == 0 && i >= 0; i--) {
2959 #if defined(WITH_ZLIB)
2960 }
else if (fps->
io ==
gzdio) {
2964 #if defined(WITH_BZIP2)
2965 }
else if (fps->
io ==
bzdio) {
2969 #if defined(WITH_XZ)
2970 }
else if (fps->
io ==
lzdio) {
2973 }
else if (fps->
io ==
xzdio) {
2985 DBGIO(fd, (stderr,
"<== Ferror(%p) rc %d %s\n", fd, rc,
fdbg(fd)));
2998 for (i = fd->
nfps ; rc == -1 && i >= 0; i--) {
3002 DBGIO(fd, (stderr,
"<== Fileno(%p) rc %d %s\n", (fd ? fd :
NULL), rc,
fdbg(fd)));
3009 return fcntl(
Fileno(fd), op, lip);
3021 if (path ==
NULL || *path ==
'\0')
3023 d = (
char *)
alloca(strlen(path)+2);
3026 for (de = d; *de !=
'\0'; de++) {
3030 while (*de && *de !=
'/') de++;
3043 rc =
Mkdir(d, mode);
3047 if (!(uid == (uid_t) -1 && gid == (gid_t) -1)) {
3048 rc =
Chown(d, uid, gid);
3052 }
else if (!S_ISDIR(st.st_mode)) {
3060 path, (
unsigned)mode);
3064 #define _PATH "/bin:/usr/bin:/sbin:/usr/sbin"
3068 #define alloca_strdup(_s) strcpy((char *)alloca(strlen(_s)+1), (_s))
3080 if (FN ==
NULL || *FN ==
'\0')
3088 for (t = bn; t && *
t; t++) {
3101 && strchr(
"Rr_", bn[0]) !=
NULL
3102 && strchr(
"Ww_", bn[1]) !=
NULL
3103 && strchr(
"Xx_", bn[2]) !=
NULL) {
3105 if (strchr(
"Rr", bn[0]) !=
NULL)
3107 if (strchr(
"Ww", bn[1]) !=
NULL)
3109 if (strchr(
"Xx", bn[2]) !=
NULL)
3113 }
else if (!
strcmp(bn,
"exists"))
3115 else if (!
strcmp(bn,
"executable"))
3117 else if (!
strcmp(bn,
"readable"))
3119 else if (!
strcmp(bn,
"writable"))
3123 te = bn + strlen(t) - 1;
3136 rc = (
Access(bn, mode) != 0 ? 1 : 0);
3138 fprintf(stderr,
"*** rpmioAccess(\"%s\", 0x%x) rc %d\n", bn, mode, rc);
3156 for (re = r; (re = strchr(re,
':')) !=
NULL; re++) {
3157 if (!(re[1] ==
'/' && re[2] ==
'/'))
3160 if (re && *re ==
':')
3169 if (r[0] ==
'~' && r[1] ==
'/') {
3170 const char * home =
getenv(
"HOME");
3173 if (strlen(home) > (
sizeof(fn) - strlen(r)))
3179 if (t[-1] !=
'/' && *bn !=
'/')
3187 rc = (
Access(t, mode) != 0 ? 1 : 0);
3189 fprintf(stderr,
"*** rpmioAccess(\"%s\", 0x%x) rc %d\n", t, mode, rc);
3202 #if defined(WITH_NSS) && !defined(__LCLINT__)
3207 extern void NSS_Shutdown(
void);
3214 int _rpmnss_init = 0;
3268 #if defined(WITH_LUA)
3271 #if defined(WITH_NEON)
3274 #if defined(WITH_NSS) && !defined(__LCLINT__)
3276 (
void) NSS_Shutdown();
3296 _rpmficlI = rpmficlFree(_rpmficlI);
3299 _rpmgitI = rpmgitFree(_rpmgitI);
3302 _rpmaugI = rpmaugFree(_rpmaugI);
3304 _rpmmgoI = rpmmgoFree(_rpmmgoI);
3316 _rpmnixI = rpmnixFree(_rpmnixI);
3324 _rpmhkpI = rpmhkpFree(_rpmhkpI);
3326 _rpmhkp_awol.bf = rpmbfFree(_rpmhkp_awol.bf);
3327 _rpmhkp_crl.bf = rpmbfFree(_rpmhkp_crl.bf);
3332 _rpmsmI = rpmsmFree(_rpmsmI);
int davDisconnect(void *_u)
Close active neon transfer(s) (if any).
static int fdSeekNot(void *cookie, _libio_pos_t pos, int whence)
static void fdPop(FD_t fd)
int ufdCopy(FD_t sfd, FD_t tfd)
static int mygethostbyname(const char *host, struct in_addr *address)
int fdWritable(FD_t fd, int secs)
rpmioPool _rpmrubyPool
The pool of Ruby interpreter instances.
int Fcntl(FD_t fd, int op, void *lip)
fcntl(2) clone.
static int ufdSeek(void *cookie, _libio_pos_t pos, int whence)
rpmlog(RPMLOG_ERR,"%s\n", buf)
static void fdSetIo(FD_t fd, FDIO_t io)
static void fdPush(FD_t fd, FDIO_t io, void *fp, int fdno)
char * getenv(const char *name)
int ftpCmd(const char *cmd, const char *url, const char *arg2)
enum urltype_e urltype
Supported URL types.
static const char * _path
void *(* rpmCallbackFunction)(const void *h, const rpmCallbackType what, const rpmuint64_t amount, const rpmuint64_t total, fnpyKey key, rpmCallbackData data)
static int ftpTimeoutSecs
struct urlinfo_s * urlinfo
rpmsquirrel rpmsquirrelFree(rpmsquirrel squirrel)
Destroy a squirrel interpreter.
size_t Fwrite(const void *buf, size_t size, size_t nmemb, FD_t fd)
fwrite(3) clone.
char * rpmCleanPath(char *path)
Canonicalize file path.
int Fsetpos(FD_t fd, fpos_t *pos)
FD_t Fopen(const char *path, const char *_fmode)
fopen(3) clone.
rpmjs rpmjsFree(rpmjs js)
Destroy a js interpreter.
#define RPMURL_SERVER_HASRANGE
static void fdSetOpen(FD_t fd, const char *path, int flags, mode_t mode)
static int httpResp(urlinfo u, FD_t ctrl, char **str)
static char *size_t nb
fgets(3) analogue that reads \ continuations.
rpmioItem rpmioLinkPoolItem(rpmioItem item, const char *msg, const char *fn, unsigned ln)
Increment a pool item refcount.
int Access(const char *path, int amode)
access(2) clone.
rpmsx rpmsxFree(rpmsx sx)
Destroy a SELinux wrapper.
int rpmioMkpath(const char *path, mode_t mode, uid_t uid, gid_t gid)
Insure that directories in path exist, creating as needed.
FD_t ftpOpen(const char *url, int flags, mode_t mode, urlinfo *uret)
urltype urlIsURL(const char *url)
Return type of URL.
static int ftpFileDone(urlinfo u, FD_t data)
void rpmlogClose(void)
Close desriptor used to write to system logger.
rpmsquirrel _rpmsquirrelI
int Fgetpos(FD_t fd, fpos_t *pos)
const char * urlStrerror(const char *url)
int Stat(const char *path, struct stat *st)
stat(2) clone.
FD_t fdLink(void *cookie, const char *msg)
static struct FDIO_s fpio_s
ssize_t davRead(void *cookie, char *buf, size_t count)
urltype urlType(void *_u)
static int ftpLogin(urlinfo u)
int Fflush(FD_t fd)
fflush(3) clone.
ssize_t(* fdio_write_function_t)(void *cookie, const char *buf, size_t nbytes)
fdio_fdopen_function_t _fdopen
const char * ftpStrerror(int errorNumber)
int ufdClose(void *cookie)
int Fseek(FD_t fd, _libio_off_t offset, int whence)
fseek(3) clone.
FD_t fdNew(const char *msg)
static PyObject *char * mode
sprintf(t," (%u)",(unsigned) dig->nbytes)
static int getHostAddress(const char *host, struct in_addr *address)
static FD_t ufdOpen(const char *url, int flags, mode_t mode)
rpmpython rpmpythonFree(rpmpython python)
Destroy a python interpreter.
int Chown(const char *path, uid_t owner, gid_t group)
chown(2) clone.
static int ftpCommand(urlinfo u, char **str,...)
static int rpm_inet_aton(const char *cp, struct in_addr *inp)
memset(_r, 0, sizeof(*_r))
int(* fdio_close_function_t)(void *cookie)
const char * Fstrerror(FD_t fd)
strerror(3) clone.
void * xcalloc(size_t nmemb, size_t size)
assert(key->size==sizeof(hdrNum))
static void fdSetFdno(FD_t fd, int fdno)
fdio_close_function_t close
rpmioItem rpmioGetPool(rpmioPool pool, size_t size)
Get unused item from pool, or alloc a new item.
fprintf(stderr,"--> %s(%p,%p,%p) sig %p sigp %p\n", __FUNCTION__, dig, t, rsactx, sig, sigp)
FD_t fdFree(FD_t fd, const char *msg)
static void fdSetFp(FD_t fd, void *fp)
int Mkdir(const char *path, mode_t mode)
mkdir(2) clone.
int fdReadable(FD_t fd, int secs)
static ssize_t ufdWrite(void *cookie, const char *buf, size_t count)
int rpmioAccess(const char *FN, const char *path, int mode)
Check FN access, expanding relative paths and twiddles.
static int tcpConnect(FD_t ctrl, const char *host, int port)
const char * fdbg(FD_t fd)
The FD_t File Handle data structure.
fdio_flush_function_t _flush
pgpDig pgpDigFree(pgpDig dig)
Destroy a container for parsed OpenPGP packates.
static int fdFileno(void *cookie)
static void fdFini(void *_fd)
void * rpmluaFree(rpmlua lua)
static int urlConnect(const char *url, urlinfo *uret)
char * rpmExpand(const char *arg,...)
Return (malloc'ed) concatenated macro expansion(s).
static void fdstat_enter(FD_t fd, int opx)
Embedded Ruby interpreter.
void * ufdGetUrlinfo(FD_t fd)
size_t Fread(void *buf, size_t size, size_t nmemb, FD_t fd)
fread(3) clone.
static int fdGetFdno(FD_t fd)
static int ftpAbort(urlinfo u, FD_t data)
struct @6 * FDSTAT_t
Cumulative statistics for a descriptor.
int Fclose(FD_t fd)
fclose(3) clone.
#define alloca_strdup(_s)
static const char * getFdErrstr(FD_t fd)
static const char *char c
Return text between pl and matching pr characters.
FD_t XfdNew(const char *msg, const char *fn, unsigned ln)
static FDIO_t fdGetIo(FD_t fd)
rpmruby rpmrubyFree(rpmruby ruby)
Destroys a Ruby interpreter instance.
static int ftpCheckResponse(urlinfo u, char **str)
ssize_t davWrite(void *cookie, const char *buf, size_t count)
FD_t httpOpen(const char *url, int flags, mode_t mode, urlinfo *uret)
static struct FDIO_s ufdio_s
static void fdstat_exit(FD_t fd, int opx, ssize_t rc)
static int httpReq(FD_t ctrl, const char *httpCmd, const char *httpArg)
int ufdGetFile(FD_t sfd, FD_t tfd)
int Ferror(FD_t fd)
ferror(3) clone.
int urlSplit(const char *url, urlinfo *uret)
Parse URL string into a control structure.
rpmsql rpmsqlFree(rpmsql sql)
Destroy a sql interpreter.
unsigned long long fd_cpioPos
int davClose(void *cookie)
static ssize_t ufdRead(void *cookie, char *buf, size_t count)
return strcmp(ame->name, bme->name)
int fdFgets(FD_t fd, char *buf, size_t len)
static int xisdigit(int c)
rpmioPool _rpmsquirrelPool
urltype urlPath(const char *url, const char **pathp)
Return path component of URL.
#define inet_aton(cp, inp)
void davDestroy(void)
Free global neon+openSSL state memory.
rpmioPool rpmioNewPool(const char *name, size_t size, int limit, int flags, char *(*dbg)(void *item), void(*init)(void *item), void(*fini)(void *item))
Create a memory pool.
char * stpcpy(char *dest, const char *src)
static int fdSeek(void *cookie, _libio_pos_t pos, int whence)
static struct FDIO_s fdio_s
FD_t Fdopen(FD_t ofd, const char *fmode)
static void fdUpdateDigests(FD_t fd, const unsigned char *buf, ssize_t buflen)
Update digest(s) attached to fd.
const char * contentDisposition
static FD_t c2f(void *cookie)
static int checkResponse(void *_u, FD_t ctrl, int *ecp, char **str)
void urlFreeCache(void)
Free cached URL control structures.
FD_t davOpen(const char *url, int flags, mode_t mode, urlinfo *uret)
Open a URL.
int davReq(FD_t ctrl, const char *httpCmd, const char *httpArg)
Send a http request.
static void * fdGetFp(FD_t fd)
rpmtcl rpmtclFree(rpmtcl tcl)
Destroy a tcl interpreter.
off_t _libio_off_t
Hide libio API lossage.
fdio_write_function_t write
int Fileno(FD_t fd)
fileno(3) clone.
static void
Print copy of spec file, filling in Group/Description/Summary from specspo.
rpmxar rpmxarFree(rpmxar xar, const char *msg)
Destroy a xar archive instance.
ssize_t(* fdio_read_function_t)(void *cookie, char *buf, size_t nbytes)
char * buf
Parse (and execute) macro undefinition.
fdio_read_function_t read
int
Save source and expand field into target.
void rpmDigestFinal(rpmDigestDup(md5ctx),&md5sum,&md5len, 0)
int ftpReq(FD_t data, const char *ftpCmd, const char *ftpArg)
int(* fdio_seek_function_t)(void *cookie, _libio_pos_t pos, int whence)
rpmperl rpmperlFree(rpmperl perl)
Destroy a perl interpreter.
static void * _free(const void *p)
Wrapper to free(3), hides const compilation noise, permit NULL, return NULL.
static FD_t fdGetPool(rpmioPool pool)
ssize_t xarRead(void *cookie, char *buf, size_t count)
fdio_seek_function_t seek
urlinfo urlFree(urlinfo u, const char *msg)
Dereference a URL control structure instance.
#define FDIOVEC(_fd, _vec)
_rpmrubyI
Current (global) interpreter instance.
rpmioPool rpmioFreePool(rpmioPool pool)
Reclaim memory pool items.
static void cvtfmode(const char *m, char *stdio, size_t nstdio, char *other, size_t nother, const char **end, int *f)
Convert stdio fmode to open(2) mode, filtering out zlib/bzlib flags.
static void fdSetSyserrno(FD_t fd, int syserrno, const void *errcookie)
urlinfo urlLink(urlinfo u, const char *msg)
Reference a URL control structure instance.