7 #if defined(HAVE_PTHREAD_H) && !defined(__LCLINT__)
13 #define _RPMDAV_INTERNAL
24 static int ftpMkdir(
const char * path, mode_t mode)
29 if ((rc =
ftpCmd(
"MKD", path, NULL)) != 0)
33 sprintf(buf,
" 0%o", mode);
34 (void)
ftpCmd(
"SITE CHMOD", path, buf);
44 return ftpCmd(
"CWD", path, NULL);
51 return ftpCmd(
"RMD", path, NULL);
54 static int ftpRename(
const char * oldpath,
const char * newpath)
59 if ((rc =
ftpCmd(
"RNFR", oldpath, NULL)) != 0)
61 return ftpCmd(
"RNTO", newpath, NULL);
68 return ftpCmd(
"DELE", path, NULL);
72 int Mkdir (
const char * path, mode_t mode)
92 return mkdir(path, mode);
122 int ut =
urlPath(path, &lpath);
148 int ut =
urlPath(path, &lpath);
151 fprintf(stderr,
"*** Chroot(%s)\n", path);
170 if (strcmp(path,
"."))
178 int Open(
const char * path,
int flags, mode_t mode)
181 int ut =
urlPath(path, &lpath);
185 fprintf(stderr,
"*** Open(%s, 0x%x, 0%o)\n", path, flags, mode);
206 size_t ob = strlen(path);
209 if (ob > nb && !strncmp(path,
_chroot_prefix, nb) && path[nb] ==
'/')
216 fdno = open(path, flags, mode);
218 if (fdno < 0 &&
errno == ENOENT) {
219 const char *dbpath =
rpmExpand(
"%{_dbpath}",
"/", NULL);
220 const char *fn = strstr(path + 1, dbpath);
222 fdno = open(fn, flags, mode);
224 dbpath =
_free(dbpath);
231 int Rename (
const char * oldpath,
const char * newpath)
233 const char *oe = NULL;
234 const char *ne = NULL;
238 if (!strcmp(oldpath, newpath))
return 0;
257 fprintf(stderr,
"*** rename old %*s new %*s\n", (
int)(oe - oldpath), oldpath, (
int)(ne - newpath), newpath);
258 if (!(oldut == newut && oe && ne && (oe - oldpath) == (ne - newpath) &&
277 return rename(oldpath, newpath);
280 int Link (
const char * oldpath,
const char * newpath)
282 const char *oe = NULL;
283 const char *ne = NULL;
308 fprintf(stderr,
"*** link old %*s new %*s\n", (
int)(oe - oldpath), oldpath, (
int)(ne - newpath), newpath);
309 if (!(oldut == newut && oe && ne && (oe - oldpath) == (ne - newpath) &&
323 return link(oldpath, newpath);
330 int ut =
urlPath(path, &lpath);
352 #define g_strdup xstrdup
383 for (numcols = 0; *p && numcols <
MAXCOLS; numcols++){
384 while (*p ==
' ' || *p ==
'\r' || *p ==
'\n'){
390 while (*p && *p !=
' ' && *p !=
'\r' && *p !=
'\n')
413 if (str != NULL && strlen(str) == 8 &&
414 str[2] == str[5] && strchr(
"\\-/", (
int)str[2]) != NULL)
424 static const char * week =
"SunMonTueWedThuFriSat";
428 if (str != NULL && (pos=strstr(week, str)) != NULL) {
431 tim->tm_wday = (pos - week)/3;
441 static const char * month =
"JanFebMarAprMayJunJulAugSepOctNovDec";
445 if (str != NULL && (pos = strstr(month, str)) != NULL) {
448 tim->tm_mon = (pos - month)/3;
458 const char * p, * p2;
460 if (str != NULL && (p = strchr(str,
':')) && (p2 = strrchr(str,
':'))) {
462 if (sscanf (str,
"%2d:%2d:%2d", &tim->tm_hour, &tim->tm_min, &tim->tm_sec) != 3)
465 if (sscanf (str,
"%2d:%2d", &tim->tm_hour, &tim->tm_min) != 2)
474 static int is_year(
const char * str,
struct tm * tim)
485 if (strlen(str) != 4)
488 if (sscanf(str,
"%ld", &year) != 1)
491 if (year < 1900 || year > 3000)
494 tim->tm_year = (int) (year - 1900);
510 case 'd':
return S_IFDIR;
511 case 'b':
return S_IFBLK;
512 case 'c':
return S_IFCHR;
513 case 'l':
return S_IFLNK;
518 case 'p':
return S_IFIFO;
520 case '-':
case '?':
return S_IFREG;
530 case 'r': res |= 0400;
break;
535 case 'w': res |= 0200;
break;
540 case 'x': res |= 0100;
break;
541 case 's': res |= 0100 | S_ISUID;
break;
542 case 'S': res |= S_ISUID;
break;
547 case 'r': res |= 0040;
break;
552 case 'w': res |= 0020;
break;
557 case 'x': res |= 0010;
break;
558 case 's': res |= 0010 | S_ISGID;
break;
560 case 'S': res |= S_ISGID;
break;
565 case 'r': res |= 0004;
break;
570 case 'w': res |= 0002;
break;
575 case 'x': res |= 0001;
break;
576 case 't': res |= 0001 | S_ISVTX;
break;
577 case 'T': res |= S_ISVTX;
break;
613 tim.tm_mday = (int)atol (
columns [idx++]);
635 memset(d, 0,
sizeof(d));
636 if (sscanf(p,
"%2d-%2d-%2d", &d[0], &d[1], &d[2]) == 3){
688 if ((*t = mktime(&tim)) < 0)
697 const char ** filename,
698 const char ** linkname)
701 int idx, idx2, num_cols;
705 if (strncmp (p,
"total", 5) == 0)
719 if (strlen (p) <= 8 || p [8] !=
']')
723 if (S_ISDIR (st->st_mode))
724 st->st_mode |= (S_IRUSR | S_IRGRP | S_IROTH | S_IWUSR | S_IXUSR | S_IXGRP | S_IXOTH);
726 st->st_mode |= (S_IRUSR | S_IRGRP | S_IROTH | S_IWUSR);
744 st->st_nlink = atol (
columns [0]);
745 if (st->st_nlink < 0)
750 st->st_uid = finduid (
columns [1]);
755 st->st_uid = (uid_t) atol (
columns [1]);
758 for (idx = 3; idx <= 5; idx++)
762 if (idx == 6 || (idx == 5 && !S_ISCHR (st->st_mode) && !S_ISBLK (st->st_mode)))
766 if (idx == 3 || (idx == 4 && (S_ISCHR(st->st_mode) || S_ISBLK (st->st_mode))))
771 st->st_gid = (gid_t) atol (
columns [2]);
774 st->st_gid = findgid (
columns [2]);
782 if (S_ISCHR (st->st_mode) || S_ISBLK (st->st_mode)){
785 if (!
is_num (idx2) || sscanf(
columns [idx2],
" %d,", &maj) != 1)
788 if (!
is_num (++idx2) || sscanf(
columns [idx2],
" %d", &min) != 1)
792 st->st_rdev = ((maj & 0x000000ffU) << 8) | (min & 0x000000ffU);
801 st->st_size = (size_t) atol (
columns [idx2]);
811 st->st_atime = st->st_ctime = st->st_mtime;
814 #ifdef HAVE_ST_BLKSIZE
815 st->st_blksize = 512;
817 #ifdef HAVE_ST_BLOCKS
818 st->st_blocks = (st->st_size + 511) / 512;
821 for (i = idx + 1, idx2 = 0; i < num_cols; i++ )
822 if (strcmp (
columns [i],
"->") == 0){
828 (num_cols == idx + 3 && st->st_nlink > 1)))
839 strncpy(t, p_copy + column_ptr [idx], nb);
846 if (t [tlen-1] ==
'\r' || t [tlen-1] ==
'\n')
848 if (t [tlen-2] ==
'\r' || t [tlen-2] ==
'\n')
867 if (t [tlen-1] ==
'\r' || t [tlen-1] ==
'\n')
869 if (t [tlen-2] ==
'\r' || t [tlen-2] ==
'\n')
883 static int errorcount = 0;
885 if (++errorcount < 5) {
886 message_1s (1,
"Could not parse:", p_copy);
887 }
else if (errorcount == 5)
888 message_1s (1,
"More parsing errors will be ignored.",
"(sorry)" );
918 #define alloca_strdup(_s) strcpy(alloca(strlen(_s)+1), (_s))
923 char * rlbuf,
size_t rlbufsiz)
931 int bufLength, moretodo;
932 const char *n, *ne, *o, *oe;
941 n = ne = o = oe = NULL;
946 switch (ftpSysCall) {
949 if (fd == NULL || u == NULL)
957 if ((bn = strrchr(urldn,
'/')) == NULL)
971 if (fd == NULL || u == NULL)
977 if (bn == NULL || nbn <= 0) {
985 fd =
fdLink(fd,
"error data (ftpStat)");
1007 s = se =
ftpBuf + bufLength;
1016 bufLength += strlen(se);
1020 for (s = se; *s !=
'\0'; s = se) {
1023 while (*se && *se !=
'\n') se++;
1024 if (se > s && se[-1] ==
'\r') se[-1] =
'\0';
1029 if (!strncmp(s,
"total ",
sizeof(
"total ")-1))
1033 for (bingo = 0, n = se; n >= s; n--) {
1039 if (o || !(n[-3] ==
' ' && n[-2] ==
'-' && n[-1] ==
'>')) {
1040 while (*(++n) ==
' ')
1045 for (o = n + 1; *o ==
' '; o++)
1057 if (nbn != (ne - n))
1059 if (strncmp(n, bn, nbn))
1066 if (moretodo && se > s) {
1067 bufLength = se - s - 1;
1069 memmove(
ftpBuf, s, bufLength);
1075 switch (ftpSysCall) {
1082 if (st == NULL || !(n && ne)) {
1089 if (rlbuf == NULL || !(o && oe)) {
1095 memcpy(rlbuf, o, rc);
1114 static const char *
statstr(
const struct stat * st,
1119 "*** dev %x ino %x mode %0o nlink %d uid %d gid %d rdev %x size %x\n",
1120 (
unsigned int)st->st_dev,
1121 (
unsigned int)st->st_ino,
1122 (
unsigned int)st->st_mode,
1123 (
unsigned int)st->st_nlink,
1124 (
unsigned int)st->st_uid,
1125 (
unsigned int)st->st_gid,
1126 (
unsigned int)st->st_rdev,
1127 (
unsigned int)st->st_size);
1135 static int ftpStat(
const char * path,
struct stat *st)
1143 if (st->st_ino == 0)
1146 fprintf(stderr,
"*** ftpStat(%s) rc %d\n%s", path, rc,
statstr(st, buf));
1151 static int ftpLstat(
const char * path,
struct stat *st)
1159 if (st->st_ino == 0)
1162 fprintf(stderr,
"*** ftpLstat(%s) rc %d\n%s\n", path, rc,
statstr(st, buf));
1173 fprintf(stderr,
"*** ftpReadlink(%s) rc %d\n", path, rc);
1186 const char * s, * sb, * se;
1195 fprintf(stderr,
"*** ftpOpendir(%s)\n", path);
1204 nb =
sizeof(
".") +
sizeof(
"..");
1208 while ((c = *se) !=
'\0') {
1216 for (sb = se; sb > s && sb[-1] !=
' '; sb--)
1222 if (*se ==
'\n') se++;
1231 nb +=
sizeof(*avdir) +
sizeof(*dp) + ((ac + 1) *
sizeof(*av)) + (ac + 1);
1234 dp = (
struct dirent *) (avdir + 1);
1235 av = (
const char **) (dp + 1);
1236 dt = (
char *) (av + (ac + 1));
1237 t = (
char *) (dt + ac + 1);
1240 avdir->fd = avmagicdir;
1242 avdir->data = (
char *) dp;
1244 avdir->allocation = nb;
1249 #if defined(HAVE_PTHREAD_H)
1251 (void) pthread_mutex_init(&avdir->lock, NULL);
1257 dt[ac] = DT_DIR; av[ac++] = t; t =
stpcpy(t,
"."); t++;
1258 dt[ac] = DT_DIR; av[ac++] = t; t =
stpcpy(t,
".."); t++;
1262 while ((c = *se) !=
'\0') {
1297 dt[ac] = DT_UNKNOWN;
1301 for (sb = se; sb > s && sb[-1] !=
' '; sb--)
1305 t =
stpncpy(t, sb, (se - sb));
1307 if (*se ==
'\n') se++;
1318 return (DIR *) avdir;
1327 assert(resolved_path == NULL);
1332 int Stat(
const char * path,
struct stat * st)
1335 int ut =
urlPath(path, &lpath);
1338 fprintf(stderr,
"*** Stat(%s,%p)\n", path, st);
1355 return stat(path, st);
1358 int Lstat(
const char * path,
struct stat * st)
1361 int ut =
urlPath(path, &lpath);
1364 fprintf(stderr,
"*** Lstat(%s,%p)\n", path, st);
1381 return lstat(path, st);
1384 int Chown(
const char * path, uid_t owner, gid_t group)
1387 int ut =
urlPath(path, &lpath);
1390 fprintf(stderr,
"*** Chown(%s,%d,%d)\n", path, (
int)owner, (
int)group);
1407 return chown(path, owner, group);
1410 int Lchown(
const char * path, uid_t owner, gid_t group)
1413 int ut =
urlPath(path, &lpath);
1416 fprintf(stderr,
"*** Lchown(%s,%d,%d)\n", path, (
int)owner, (
int)group);
1433 return lchown(path, owner, group);
1436 int Chmod(
const char * path, mode_t mode)
1439 int ut =
urlPath(path, &lpath);
1442 fprintf(stderr,
"*** Chmod(%s,%0o)\n", path, (
int)mode);
1459 return chmod(path, mode);
1465 int ut =
urlPath(path, &lpath);
1468 fprintf(stderr,
"*** Mkfifo(%s,%0o)\n", path, (
int)mode);
1485 return mkfifo(path, mode);
1488 int Mknod(
const char * path, mode_t mode, dev_t dev)
1491 int ut =
urlPath(path, &lpath);
1494 fprintf(stderr,
"*** Mknod(%s,%0o, 0x%x)\n", path, (
int)mode, (
int)dev);
1512 return mknod(path, mode, dev);
1516 int Utime(
const char * path,
const struct utimbuf *buf)
1519 int ut =
urlPath(path, &lpath);
1522 fprintf(stderr,
"*** Utime(%s,%p)\n", path, buf);
1539 return utime(path, buf);
1543 int Utimes(
const char * path,
const struct timeval times[2])
1546 int ut =
urlPath(path, &lpath);
1549 fprintf(stderr,
"*** Utimes(%s,%p)\n", path, times);
1566 return utimes(path, times);
1570 int Symlink(
const char * oldpath,
const char * newpath)
1573 int out =
urlPath(oldpath, &opath);
1575 int nut =
urlPath(newpath, &npath);
1579 fprintf(stderr,
"*** Symlink(%s,%s)\n", oldpath, newpath);
1597 return symlink(oldpath, newpath);
1600 int Readlink(
const char * path,
char * buf,
size_t bufsiz)
1603 int ut =
urlPath(path, &lpath);
1606 fprintf(stderr,
"*** Readlink(%s,%p[%u])\n", path, buf, (
unsigned)bufsiz);
1624 return readlink(path, buf, bufsiz);
1631 int ut =
urlPath(path, &lpath);
1634 fprintf(stderr,
"*** Access(%s,%d)\n", path, amode);
1651 return access(path, amode);
1662 int ut =
urlPath(pattern, &p);
1666 while ((c = *p++) !=
'\0')
1676 if (quote && *p !=
'\0')
1704 int Glob(
const char *pattern,
int flags,
1705 int errfunc(
const char * epath,
int eerrno), glob_t *pglob)
1708 int ut =
urlPath(pattern, &lpath);
1712 fprintf(stderr,
"*** Glob(%s,0x%x,%p,%p)\n", pattern, (
unsigned)flags, (
void *)errfunc, pglob);
1716 pglob->gl_closedir = closedir;
1717 pglob->gl_readdir = readdir;
1718 pglob->gl_opendir = opendir;
1719 pglob->gl_lstat =
Lstat;
1720 pglob->gl_stat =
Lstat;
1723 flags |= GLOB_ALTDIRFUNC;
1733 pglob->gl_lstat =
Lstat;
1734 pglob->gl_stat =
Stat;
1736 flags |= GLOB_ALTDIRFUNC;
1737 flags &= ~GLOB_TILDE;
1750 return glob(pattern, flags, errfunc, pglob);
1756 fprintf(stderr,
"*** Globfree(%p)\n", pglob);
1763 int ut =
urlPath(path, &lpath);
1766 fprintf(stderr,
"*** Opendir(%s)\n", path);
1783 return opendir(path);
1790 fprintf(stderr,
"*** Readdir(%p)\n", (
void *)dir);
1794 return avReaddir(dir);
1795 return readdir(dir);
1801 fprintf(stderr,
"*** Closedir(%p)\n", (
void *)dir);
1805 return avClosedir(dir);
1806 return closedir(dir);
1809 char *
Realpath(
const char * path,
char * resolved_path)
1812 int ut =
urlPath(path, &lpath);
1816 fprintf(stderr,
"*** Realpath(%s, %s)\n", path, (resolved_path ? resolved_path :
"NULL"));
1820 if (path == NULL || resolved_path != NULL)
1821 return realpath(path, resolved_path);
1833 #if defined(__linux__)
1834 lpath =
"/dev/stdin";
1845 if (lpath == NULL || *lpath ==
'/')
1847 rpath =
realpath(lpath, resolved_path);
1851 #if defined(__GLIBC__)
1863 if ((t =
realpath(
".", dn)) != NULL) {
1865 rpath = (
char *)
rpmGetPath(t,
"/", lpath, NULL);
1867 if (lpath[strlen(lpath)-1] ==
'/') {
1875 #if defined(__GLIBC__)
1883 off_t
Lseek(
int fdno, off_t offset,
int whence)
1886 fprintf(stderr,
"*** Lseek(%d,0x%lx,%d)\n", fdno, (
long)offset, whence);
1887 return lseek(fdno, offset, whence);