10 #define _RPMAV_INTERNAL
11 #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)
78 fprintf(stderr,
"*** Mkdir(%s, 0%o)\n", path, (
unsigned)mode);
100 return mkdir(path, mode);
106 int ut =
urlPath(path, &lpath);
109 fprintf(stderr,
"*** Chdir(%s)\n", path);
117 return davChdir(path);
141 int ut =
urlPath(path, &lpath);
144 fprintf(stderr,
"*** Rmdir(%s)\n", path);
175 int ut =
urlPath(path, &lpath);
178 fprintf(stderr,
"*** Chroot(%s)\n", path);
200 if (strcmp(path,
"."))
210 int Open(
const char * path,
int flags, mode_t mode)
213 int ut =
urlPath(path, &lpath);
217 fprintf(stderr,
"*** Open(%s, 0x%x, 0%o)\n", path, flags, (
unsigned)mode);
238 size_t ob = strlen(path);
241 if (ob > nb && !strncmp(path,
_chroot_prefix, nb) && path[nb] ==
'/')
248 fdno = open(path, flags, mode);
250 if (fcntl(fdno, F_SETFD, FD_CLOEXEC) < 0) {
260 int Rename (
const char * oldpath,
const char * newpath)
262 const char *oe = NULL;
263 const char *ne = NULL;
267 fprintf(stderr,
"*** Rename(%s, %s)\n", oldpath, newpath);
269 if (!strcmp(oldpath, newpath))
return 0;
294 fprintf(stderr,
"*** rename old %*s new %*s\n", (
int)(oe - oldpath), oldpath, (
int)(ne - newpath), newpath);
295 if (!(oldut == newut && oe && ne && (oe - oldpath) == (ne - newpath) &&
314 return rename(oldpath, newpath);
317 int Link (
const char * oldpath,
const char * newpath)
319 const char *oe = NULL;
320 const char *ne = NULL;
324 fprintf(stderr,
"*** Link(%s, %s)\n", oldpath, newpath);
347 fprintf(stderr,
"*** link old %*s new %*s\n", (
int)(oe - oldpath), oldpath, (
int)(ne - newpath), newpath);
348 if (!(oldut == newut && oe && ne && (oe - oldpath) == (ne - newpath) &&
362 return link(oldpath, newpath);
369 int ut =
urlPath(path, &lpath);
372 fprintf(stderr,
"*** Unlink(%s)\n", path);
399 #define g_strdup xstrdup
429 for (numcols = 0; *p && numcols <
MAXCOLS; numcols++){
430 while (*p ==
' ' || *p ==
'\r' || *p ==
'\n'){
436 while (*p && *p !=
' ' && *p !=
'\r' && *p !=
'\n')
455 if (str != NULL && strlen(str) == 8 &&
456 str[2] == str[5] && strchr(
"\\-/", (
int)str[2]) != NULL)
465 static const char * week =
"SunMonTueWedThuFriSat";
469 if (str != NULL && (pos=strstr(week, str)) != NULL) {
472 tim->tm_wday = (pos - week)/3;
482 static const char * month =
"JanFebMarAprMayJunJulAugSepOctNovDec";
486 if (str != NULL && (pos = strstr(month, str)) != NULL) {
489 tim->tm_mon = (pos - month)/3;
499 const char * p, * p2;
501 if (str != NULL && (p = strchr(str,
':')) && (p2 = strrchr(str,
':'))) {
503 if (sscanf (str,
"%2d:%2d:%2d", &tim->tm_hour, &tim->tm_min, &tim->tm_sec) != 3)
506 if (sscanf (str,
"%2d:%2d", &tim->tm_hour, &tim->tm_min) != 2)
515 static int is_year(
const char * str,
struct tm * tim)
526 if (strlen(str) != 4)
529 if (sscanf(str,
"%ld", &year) != 1)
532 if (year < 1900 || year > 3000)
535 tim->tm_year = (int) (year - 1900);
551 case 'd':
return (
int)S_IFDIR;
552 case 'b':
return (
int)S_IFBLK;
553 case 'c':
return (
int)S_IFCHR;
554 case 'l':
return (
int)S_IFLNK;
559 case 'p':
return (
int)S_IFIFO;
561 case '-':
case '?':
return (
int)S_IFREG;
571 case 'r': res |= 0400;
break;
576 case 'w': res |= 0200;
break;
581 case 'x': res |= 0100;
break;
582 case 's': res |= 0100 | S_ISUID;
break;
583 case 'S': res |= S_ISUID;
break;
588 case 'r': res |= 0040;
break;
593 case 'w': res |= 0020;
break;
598 case 'x': res |= 0010;
break;
599 case 's': res |= 0010 | S_ISGID;
break;
601 case 'S': res |= S_ISGID;
break;
606 case 'r': res |= 0004;
break;
611 case 'w': res |= 0002;
break;
616 case 'x': res |= 0001;
break;
617 case 't': res |= 0001 | S_ISVTX;
break;
618 case 'T': res |= S_ISVTX;
break;
653 tim.tm_mday = (int)atol (
columns [idx++]);
675 memset(d, 0,
sizeof(d));
676 if (sscanf(p,
"%2d-%2d-%2d", &d[0], &d[1], &d[2]) == 3){
728 if ((*t = mktime(&tim)) < 0)
735 const char ** filename,
736 const char ** linkname)
739 int idx, idx2, num_cols;
744 if (strncmp (p,
"total", 5) == 0)
758 if (strlen (p) <= 8 || p [8] !=
']')
762 if (S_ISDIR (st->st_mode))
763 st->st_mode |= (S_IRUSR | S_IRGRP | S_IROTH | S_IWUSR | S_IXUSR | S_IXGRP | S_IXOTH);
765 st->st_mode |= (S_IRUSR | S_IRGRP | S_IROTH | S_IWUSR);
790 st->st_uid = finduid (
columns [1]);
795 st->st_uid = (uid_t) atol (
columns [1]);
798 for (idx = 3; idx <= 5; idx++)
802 if (idx == 6 || (idx == 5 && !S_ISCHR (st->st_mode) && !S_ISBLK (st->st_mode)))
806 if (idx == 3 || (idx == 4 && (S_ISCHR(st->st_mode) || S_ISBLK (st->st_mode))))
811 st->st_gid = (gid_t) atol (
columns [2]);
814 st->st_gid = findgid (
columns [2]);
822 if (S_ISCHR (st->st_mode) || S_ISBLK (st->st_mode)){
825 if (!
is_num (idx2) || sscanf(
columns [idx2],
" %d,", &maj) != 1)
828 if (!
is_num (++idx2) || sscanf(
columns [idx2],
" %d", &min) != 1)
832 st->st_rdev = ((maj & 0x000000ffU) << 8) | (min & 0x000000ffU);
841 st->st_size = (size_t) atol (
columns [idx2]);
851 st->st_atime = st->st_ctime = st->st_mtime;
854 #ifdef HAVE_ST_BLKSIZE
855 st->st_blksize = 512;
857 #ifdef HAVE_ST_BLOCKS
858 st->st_blocks = (st->st_size + 511) / 512;
861 for (i = idx + 1, idx2 = 0; i < num_cols; i++ )
862 if (strcmp (
columns [i],
"->") == 0){
868 (num_cols == idx + 3 && st->st_nlink > 1)))
876 t = strncpy(
xcalloc(1, nb+1), p_copy + column_ptr [idx], nb);
882 if (t [tlen-1] ==
'\r' || t [tlen-1] ==
'\n')
884 if (t [tlen-2] ==
'\r' || t [tlen-2] ==
'\n')
903 if (t [tlen-1] ==
'\r' || t [tlen-1] ==
'\n')
905 if (t [tlen-2] ==
'\r' || t [tlen-2] ==
'\n')
919 static int errorcount = 0;
921 if (++errorcount < 5) {
922 message_1s (1,
"Could not parse:", p_copy);
923 }
else if (errorcount == 5)
924 message_1s (1,
"More parsing errors will be ignored.",
"(sorry)" );
952 #define alloca_strdup(_s) strcpy(alloca(strlen(_s)+1), (_s))
956 char * rlbuf,
size_t rlbufsiz)
964 int bufLength, moretodo;
965 const char *n, *ne, *o, *oe;
974 n = ne = o = oe = NULL;
979 switch (ftpSysCall) {
982 if (fd == NULL || u == NULL)
989 if ((bn = strrchr(urldn,
'/')) == NULL)
1002 if (fd == NULL || u == NULL)
1008 if (bn == NULL || nbn == 0) {
1016 fd =
fdLink(fd,
"error data (ftpStat)");
1038 s = se =
ftpBuf + bufLength;
1047 bufLength += strlen(se);
1051 for (s = se; *s !=
'\0'; s = se) {
1054 while (*se && *se !=
'\n') se++;
1055 if (se > s && se[-1] ==
'\r') se[-1] =
'\0';
1060 if (!strncmp(s,
"total ",
sizeof(
"total ")-1))
1064 for (bingo = 0, n = se; n >= s; n--) {
1070 if (o || !(n[-3] ==
' ' && n[-2] ==
'-' && n[-1] ==
'>')) {
1071 while (*(++n) ==
' ')
1076 for (o = n + 1; *o ==
' '; o++)
1088 if (nbn != (
size_t)(ne - n))
1090 if (strncmp(n, bn, nbn))
1097 if (moretodo && se > s) {
1098 bufLength = se - s - 1;
1100 memmove(
ftpBuf, s, bufLength);
1106 switch (ftpSysCall) {
1113 if (st == NULL || !(n && ne)) {
1120 if (rlbuf == NULL || !(o && oe)) {
1125 if (rc > (
int)rlbufsiz)
1127 memcpy(rlbuf, o, (
size_t)rc);
1128 if (rc < (
int)rlbufsiz)
1145 static const char *
statstr(
const struct stat * st,
1150 sprintf(t,
"*** dev %x", (
unsigned int)st->st_dev);
1152 sprintf(t,
" ino %x", (
unsigned int)st->st_ino);
1154 sprintf(t,
" mode %0o", (
unsigned int)st->st_mode);
1156 sprintf(t,
" nlink %d", (
unsigned int)st->st_nlink);
1158 sprintf(t,
" uid %d", (
unsigned int)st->st_uid);
1160 sprintf(t,
" gid %d", (
unsigned int)st->st_gid);
1162 sprintf(t,
" rdev %x", (
unsigned int)st->st_rdev);
1164 sprintf(t,
" size %x", (
unsigned int)st->st_size);
1171 static int ftpStat(
const char * path,
struct stat *st)
1181 if (st->st_ino == 0)
1185 fprintf(stderr,
"*** ftpStat(%s) rc %d\n%s", path, rc,
statstr(st, buf));
1190 static int ftpLstat(
const char * path,
struct stat *st)
1200 if (st->st_ino == 0)
1204 fprintf(stderr,
"*** ftpLstat(%s) rc %d\n%s\n", path, rc,
statstr(st, buf));
1215 fprintf(stderr,
"*** ftpReadlink(%s) rc %d\n", path, rc);
1228 struct stat * st = NULL;
1229 const char * s, * sb, * se;
1235 fprintf(stderr,
"*** ftpOpendir(%s)\n", path);
1251 while ((c = (
int) *se++) != (
int)
'\0') {
1258 for (sb = se; sb > s && sb[-1] !=
' '; sb--)
1263 if (*se ==
'\n') se++;
1272 ctx->av =
xcalloc(nac+1,
sizeof(*ctx->av));
1273 ctx->modes =
xcalloc(nac,
sizeof(*ctx->modes));
1278 while ((c = (
int) *se) != (
int)
'\0') {
1286 ctx->modes[nac] = (*s ==
'd' ? 0755 : 0644);
1289 case 'p': ctx->modes[nac] |= S_IFIFO;
break;
1290 case 'c': ctx->modes[nac] |= S_IFCHR;
break;
1291 case 'd': ctx->modes[nac] |= S_IFDIR;
break;
1292 case 'b': ctx->modes[nac] |= S_IFBLK;
break;
1293 case '-': ctx->modes[nac] |= S_IFREG;
break;
1294 case 'l': ctx->modes[nac] |= S_IFLNK;
break;
1295 case 's': ctx->modes[nac] |=
S_IFSOCK;
break;
1296 default: ctx->modes[nac] |= S_IFREG;
break;
1299 for (sb = se; sb > s && sb[-1] !=
' '; sb--)
1302 ctx->av[nac++] = strncpy(
xcalloc(1, (se-sb-1)+1), sb, (se-sb-1));
1303 if (*se ==
'\n') se++;
1317 return (DIR *) avdir;
1324 assert(resolved_path == NULL);
1329 int Stat(
const char * path,
struct stat * st)
1334 int ut =
urlPath(path, &lpath);
1337 fprintf(stderr,
"*** Stat(%s,%p)\n", path, st);
1360 return stat(path, st);
1363 int Lstat(
const char * path,
struct stat * st)
1368 int ut =
urlPath(path, &lpath);
1371 fprintf(stderr,
"*** Lstat(%s,%p)\n", path, st);
1394 return lstat(path, st);
1401 int ut =
urlPath(path, &lpath);
1404 fprintf(stderr,
"*** Fstat(%p,%p) path %s\n", fd, st, path);
1405 if (fd == NULL || path == NULL || *path ==
'\0' || st == NULL) {
1423 memset(st, 0,
sizeof(*st));
1424 if (path[strlen(path)-1] ==
'/') {
1426 st->st_mode = (S_IFDIR | 0755);
1429 st->st_mode = (S_IFREG | 0644);
1435 st->st_atime = st->st_ctime = st->st_mtime;
1436 st->st_blksize = 4 * 1024;
1437 st->st_blocks = (st->st_size + 511)/512;
1444 return fstat(
Fileno(fd), st);
1447 int Chown(
const char * path, uid_t owner, gid_t group)
1450 int ut =
urlPath(path, &lpath);
1453 fprintf(stderr,
"*** Chown(%s,%u,%u)\n", path, (
unsigned)owner, (
unsigned)group);
1470 return chown(path, owner, group);
1477 int ut =
urlPath(path, &lpath);
1480 fprintf(stderr,
"*** Fchown(%p,%u,%u) path %s\n", fd, (
unsigned)owner, (
unsigned)group, path);
1497 return fchown(
Fileno(fd), owner, group);
1500 int Lchown(
const char * path, uid_t owner, gid_t group)
1503 int ut =
urlPath(path, &lpath);
1506 fprintf(stderr,
"*** Lchown(%s,%u,%u)\n", path, (
unsigned)owner, (
unsigned)group);
1523 return lchown(path, owner, group);
1526 int Chmod(
const char * path, mode_t mode)
1529 int ut =
urlPath(path, &lpath);
1532 fprintf(stderr,
"*** Chmod(%s,%0o)\n", path, (
int)mode);
1549 return chmod(path, mode);
1556 int ut =
urlPath(path, &lpath);
1559 fprintf(stderr,
"*** Fchmod(%p,%0o) path %s\n", fd, (
int)mode, path);
1576 return fchmod(
Fileno(fd), mode);
1582 int ut =
urlPath(path, &lpath);
1585 fprintf(stderr,
"*** Mkfifo(%s,%0o)\n", path, (
int)mode);
1602 return mkfifo(path, mode);
1605 int Mknod(
const char * path, mode_t mode, dev_t dev)
1608 int ut =
urlPath(path, &lpath);
1611 fprintf(stderr,
"*** Mknod(%s,%0o, 0x%x)\n", path, (
int)mode, (
int)dev);
1629 return mknod(path, mode, dev);
1633 int Utime(
const char * path,
const struct utimbuf *buf)
1636 int ut =
urlPath(path, &lpath);
1639 fprintf(stderr,
"*** Utime(%s,%p)\n", path, buf);
1656 return utime(path, buf);
1660 int Utimes(
const char * path,
const struct timeval times[2])
1663 int ut =
urlPath(path, &lpath);
1666 fprintf(stderr,
"*** Utimes(%s,%p)\n", path, times);
1683 return utimes(path, times);
1687 int Symlink(
const char * oldpath,
const char * newpath)
1690 int out =
urlPath(oldpath, &opath);
1692 int nut =
urlPath(newpath, &npath);
1696 fprintf(stderr,
"*** Symlink(%s,%s)\n", oldpath, newpath);
1714 return symlink(oldpath, newpath);
1717 int Readlink(
const char * path,
char * buf,
size_t bufsiz)
1722 int ut =
urlPath(path, &lpath);
1725 fprintf(stderr,
"*** Readlink(%s,%p[%u])\n", path, buf, (
unsigned)bufsiz);
1733 return davReadlink(path, buf, bufsiz);
1751 return readlink(path, buf, bufsiz);
1758 int ut =
urlPath(path, &lpath);
1761 fprintf(stderr,
"*** Access(%s,%d)\n", path, amode);
1778 return access(path, amode);
1789 int ut =
urlPath(pattern, &p);
1793 while ((c = *p++) !=
'\0')
1803 if (quote && *p !=
'\0')
1832 int Glob(
const char *pattern,
int flags,
1833 int errfunc(
const char * epath,
int eerrno),
void *_pglob)
1837 int ut =
urlPath(pattern, &lpath);
1838 const char *home =
getenv(
"HOME");
1842 fprintf(stderr,
"*** Glob(%s,0x%x,%p,%p)\n", pattern, (
unsigned)flags, (
void *)errfunc, pglob);
1862 if (home && home[0])
1873 return glob(pattern, flags, errfunc, pglob);
1880 fprintf(stderr,
"*** Globfree(%p)\n", pglob);
1889 int ut =
urlPath(path, &lpath);
1892 fprintf(stderr,
"*** Opendir(%s)\n", path);
1915 return opendir(path);
1922 fprintf(stderr,
"*** Readdir(%p)\n", (
void *)dir);
1927 return readdir(dir);
1933 fprintf(stderr,
"*** Closedir(%p)\n", (
void *)dir);
1938 return closedir(dir);
1941 char *
Realpath(
const char * path,
char * resolved_path)
1944 int ut =
urlPath(path, &lpath);
1945 char * rpath = NULL;
1948 fprintf(stderr,
"*** Realpath(%s, %s)\n", path, (resolved_path ? resolved_path :
"NULL"));
1949 #if !defined(__LCLINT__)
1953 if (path == NULL || resolved_path != NULL)
1954 return realpath(path, resolved_path);
1975 #if defined(__linux__)
1976 lpath =
"/dev/stdin";
1987 #if !defined(__LCLINT__)
1988 if (lpath == NULL || *lpath ==
'/')
1990 rpath =
realpath(lpath, resolved_path);
1994 #if defined(__GLIBC__)
2006 if ((t =
realpath(
".", dn)) != NULL) {
2008 rpath = (
char *)
rpmGetPath(t,
"/", lpath, NULL);
2010 if (lpath[strlen(lpath)-1] ==
'/') {
2018 #if defined(__GLIBC__)
2027 off_t
Lseek(
int fdno, off_t offset,
int whence)
2030 fprintf(stderr,
"*** Lseek(%d,0x%lx,%d)\n", fdno, (
long)offset, whence);
2031 return lseek(fdno, offset, whence);