RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson Root: /v/rpm/cvs Email: j...@rpm5.org Module: rpm Date: 18-Apr-2017 13:14:42 Branch: rpm-5_4 Handle: 2017041811144101 Modified files: (Branch: rpm-5_4) rpm CHANGES rpm/rpmio bzdio.c gzdio.c librpmio.vers rpmio.c rpmio.h rpmio_internal.h rpmrpc.c xzdio.c Log: - rpmio: add fchdir+fchmod+fchown+fincore+flock+futimes. Summary: Revision Changes Path 1.3501.2.533+1 -0 rpm/CHANGES 2.24.4.3 +1 -1 rpm/rpmio/bzdio.c 2.17.4.3 +1 -2 rpm/rpmio/gzdio.c 2.199.2.67 +8 -0 rpm/rpmio/librpmio.vers 1.230.2.41 +246 -71 rpm/rpmio/rpmio.c 1.97.2.11 +70 -42 rpm/rpmio/rpmio.h 2.127.2.10 +93 -33 rpm/rpmio/rpmio_internal.h 2.99.2.8 +27 -327 rpm/rpmio/rpmrpc.c 1.14.4.3 +2 -2 rpm/rpmio/xzdio.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.3501.2.532 -r1.3501.2.533 CHANGES --- rpm/CHANGES 17 Apr 2017 18:19:07 -0000 1.3501.2.532 +++ rpm/CHANGES 18 Apr 2017 11:14:41 -0000 1.3501.2.533 @@ -1,4 +1,5 @@ 5.4.17 -> 5.4.18: + - jbj: rpmio: add fchdir+fchmod+fchown+fincore+flock+futimes. - jbj: rpmio: add fallocate+fdatasync+fadvise+fsync. - jbj: install: use clock_gettime/gettimeofday/time for *.rpm timestamps. - jbj: build: add usecs to RPMTAG_BUILDTIME/RPMTAG_COOKIE. @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/bzdio.c ============================================================================ $ cvs diff -u -r2.24.4.2 -r2.24.4.3 bzdio.c --- rpm/rpmio/bzdio.c 24 Sep 2014 13:03:03 -0000 2.24.4.2 +++ rpm/rpmio/bzdio.c 18 Apr 2017 11:14:41 -0000 2.24.4.3 @@ -369,7 +369,7 @@ #ifdef NOTYET /* XXX persistent URI cache prevents pop */ fdPop(fd); fdPush(fd, bzdio, bz, fileno(bz->fp)); #else - fdSetFdno(fd, -1); /* XXX skip the fdio close */ + (void) fdSetFdno(fd, -1); /* XXX skip the fdio close */ fdPush(fd, bzdio, bz, fdno); /* Push bzdio onto stack */ #endif return fdLink(fd, "bzdFdopen"); @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/gzdio.c ============================================================================ $ cvs diff -u -r2.17.4.2 -r2.17.4.3 gzdio.c --- rpm/rpmio/gzdio.c 24 Sep 2014 13:03:03 -0000 2.17.4.2 +++ rpm/rpmio/gzdio.c 18 Apr 2017 11:14:42 -0000 2.17.4.3 @@ -281,8 +281,7 @@ rpmGZFILE rpmgz; if (fmode == NULL) return NULL; - fdno = fdFileno(fd); - fdSetFdno(fd, -1); /* XXX skip the fdio close */ + fdno = fdSetFdno(fd, -1); /* XXX skip the fdio close */ if (fdno < 0) return NULL; rpmgz = (rpmGZFILE) xcalloc(1, sizeof(*rpmgz)); rpmgz->gz = gzdopen(fdno, fmode); @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/librpmio.vers ============================================================================ $ cvs diff -u -r2.199.2.66 -r2.199.2.67 librpmio.vers --- rpm/rpmio/librpmio.vers 17 Apr 2017 18:19:08 -0000 2.199.2.66 +++ rpm/rpmio/librpmio.vers 18 Apr 2017 11:14:42 -0000 2.199.2.67 @@ -102,6 +102,9 @@ _Fchown; Fclose; _Fclose; + Fchdir; + Fchmod; + Fchown; Fcntl; _Fcntl; Fdatasync; @@ -121,6 +124,8 @@ Fileno; _Fileno; _fini; + Fincore; + Flock; Fopen; _Fopen; fpio; @@ -147,6 +152,7 @@ Fts_open; Fts_read; Fts_set; + Futimes; Fwrite; _Fwrite; get_date; @@ -236,6 +242,8 @@ Mmap; Mount; Mprotect; + Mremap; + Msync; Munmap; noLibio; _odbc_debug; @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmio.c ============================================================================ $ cvs diff -u -r1.230.2.40 -r1.230.2.41 rpmio.c --- rpm/rpmio/rpmio.c 17 Apr 2017 19:25:27 -0000 1.230.2.40 +++ rpm/rpmio/rpmio.c 18 Apr 2017 11:14:42 -0000 1.230.2.41 @@ -5,6 +5,10 @@ #include "system.h" #include <stdarg.h> +#if defined(HAVE_SYS_FILE_H) +#include <sys/file.h> +#endif + #if defined(HAVE_MACHINE_TYPES_H) # include <machine/types.h> #endif @@ -274,7 +278,7 @@ } fd = fdNew("open (fdDup)"); fdSetOpen(fd, "fdDup", nfdno, 0); /* XXX bogus */ - fdSetFdno(fd, nfdno); + (void) fdSetFdno(fd, nfdno); DBGIO(fd, (stderr, "<-- fdDup(%d) fd %p %s\n", fdno, (fd ? fd : NULL), fdbg(fd))); return fd; } @@ -477,70 +481,14 @@ return (int) rc; } -#ifdef DEBUGGING -static size_t mmincore(const char * msg, void * b, size_t nb) -{ - size_t cnt = 0; - size_t pagesize = sysconf(_SC_PAGESIZE); - size_t npages = (nb + pagesize-1)/pagesize; - unsigned char * vec = alloca(npages+1); - - if (msg) - fprintf(stderr, "%s:", msg); - if (Mincore(b, nb, vec) == -1) { - perror("mincore"); - goto exit; - } - for (size_t i = 0; i < npages; i++) { - if (!vec[i] & 0x1) - continue; - cnt++; - } - -exit: - fprintf(stderr, " %u\n", (unsigned)cnt); - return cnt; -} - -static size_t fmincore(const char * msg, int fdno) -{ - size_t cnt = 0; - void * mapped = MAP_FAILED; - size_t nmapped = 0; - struct stat sb; - - if (fstat(fdno, &sb) == -1) { - perror("fstat failed"); - goto exit; - } - if (sb.st_size == 0) - goto exit; - - nmapped = sb.st_size; - mapped = mmap(NULL, nmapped, PROT_READ|PROT_WRITE, MAP_SHARED, fdno, 0); - if (mapped == MAP_FAILED) { - perror("fmincore mmap failed"); - goto exit; - } - - cnt = mmincore(msg, mapped, nmapped); - - if (munmap(mapped, nmapped) == -1) { - perror("fmincore munmap failed"); - goto exit; - } - -exit: - return cnt; -} -#endif - static int fdSync(FD_t fd) { int rc = -2; int fdno = fdFileno(fd); if (fdno >= 0 && RPMFD_ISSET(fd, FSYNC)) { + if (RPMFD_ISSET(fd, DEBUGIO)) + (void) Fincore(fd); if (RPMFD_ISSET(fd, FDATASYNC)) { rc = Fdatasync(fd); if (rc < 0 && errno != ENOSYS) /* XXX best effort */ @@ -556,6 +504,8 @@ rc = Fsync(fd); if (rc < 0 && errno != ENOSYS) /* XXX best effort */ goto exit; + if (RPMFD_ISSET(fd, DEBUGIO)) + (void) Fincore(fd); } rc = 0; @@ -576,8 +526,7 @@ if (RPMFD_ISSET(fd, FSYNC)) rc = fdSync(fd); - fdno = fdFileno(fd); - fdSetFdno(fd, -1); + fdno = fdSetFdno(fd, -1); fdstat_enter(fd, FDSTAT_CLOSE); /* HACK: flimsy wiring for davClose */ @@ -683,7 +632,7 @@ } fd = fdNew("open (fdOpen)"); fdSetOpen(fd, path, oflags, mode); - fdSetFdno(fd, fdno); + (void) fdSetFdno(fd, fdno); assert(fd != NULL); fd->flags = flags; DBGIO(fd, (stderr, "<--\tfdOpen(\"%s\",%x,0%o) %s\n", path, (unsigned)flags, (unsigned)mode, fdbg(fd))); @@ -1066,7 +1015,7 @@ fprintf(stderr,"++ connect %s:%d on fdno %d\n", inet_ntoa(sin.sin_addr) (int)ntohs(sin.sin_port), fdno); #endif /* HAVE_GETADDRINFO */ - fdSetFdno(ctrl, (fdno >= 0 ? fdno : -1)); + (void) fdSetFdno(ctrl, (fdno >= 0 ? fdno : -1)); return 0; errxit: @@ -1511,7 +1460,7 @@ for (res = res0; res != NULL; res = res->ai_next) { rc = socket(res->ai_family, res->ai_socktype, res->ai_protocol); - fdSetFdno(data, (rc >= 0 ? rc : -1)); + (void) fdSetFdno(data, (rc >= 0 ? rc : -1)); if (rc < 0) { if (res->ai_next) continue; @@ -1562,7 +1511,7 @@ } rc = socket(AF_INET, SOCK_STREAM, IPPROTO_IP); - fdSetFdno(data, (rc >= 0 ? rc : -1)); + (void) fdSetFdno(data, (rc >= 0 ? rc : -1)); if (rc < 0) { rc = FTPERR_FAILED_CONNECT; goto errxit; @@ -2997,14 +2946,14 @@ int Fileno(FD_t fd) { - int i, rc = -1; + int rc = -1; if (fd == NULL) - return -1; + return rc; if (fd->req != NULL) rc = 123456789; /* HACK: https has no steenkin fileno. */ else - for (i = fd->nfps ; rc == -1 && i >= 0; i--) { + for (int i = fd->nfps ; rc == -1 && i >= 0; i--) { rc = fd->fps[i].fdno; } @@ -3014,12 +2963,238 @@ return rc; } -/* XXX this is naive */ -int Fcntl(FD_t fd, int op, void *lip) +/* =============================================================== */ +#define fdSyscall(_syscall) (fdno >= 0 ? (_syscall) : -2) + +int Fcntl(FD_t fd, int cmd, ...) +{ + int fdno = fdSyscallPre(__FUNCTION__, fd, 1, NULL); + va_list ap; + void * arg = NULL; + int rc = -2; + + va_start(ap, cmd); + arg = va_arg(ap, void *); + va_end(ap); + + fdstat_enter(fd, FDSTAT_FCNTL); + rc = fdSyscall( fcntl(fdno, cmd, arg) ); + fdstat_exit(fd, FDSTAT_FCNTL, 0); + + return fdSyscallPost(__FUNCTION__, fd, fdno, rc); +} + +int Flock(FD_t fd, int op) +{ + int fdno = fdSyscallPre(__FUNCTION__, fd, 1, NULL); + fdstat_enter(fd, FDSTAT_FLOCK); + int rc = fdSyscall( flock(fdno, op) ); + fdstat_exit(fd, FDSTAT_FLOCK, 0); + return fdSyscallPost(__FUNCTION__, fd, fdno, rc); +} + +int Fchdir(FD_t fd) +{ + int fdno = fdSyscallPre(__FUNCTION__, fd, 1, NULL); + fdstat_enter(fd, FDSTAT_FCHDIR); + int rc = fdSyscall( fchdir(fdno) ); + fdstat_exit(fd, FDSTAT_FCHDIR, 0); + return fdSyscallPost(__FUNCTION__, fd, fdno, rc); +} + +int Fchmod(FD_t fd, mode_t mode) +{ + int fdno = fdSyscallPre(__FUNCTION__, fd, 1, NULL); + fdstat_enter(fd, FDSTAT_FCHMOD); + int rc = fdSyscall( fchdir(fdno) ); + fdstat_exit(fd, FDSTAT_FCHMOD, 0); + return fdSyscallPost(__FUNCTION__, fd, fdno, rc); +} + +int Fchown(FD_t fd, uid_t uid, gid_t gid) +{ + int fdno = fdSyscallPre(__FUNCTION__, fd, 1, NULL); + fdstat_enter(fd, FDSTAT_FCHOWN); + int rc = fdSyscall( fchown(fdno, uid, gid) ); + fdstat_exit(fd, FDSTAT_FCHOWN, 0); + return fdSyscallPost(__FUNCTION__, fd, fdno, rc); +} + +int Futimes(FD_t fd, const struct timeval tv[2]) { - return fcntl(Fileno(fd), op, lip); + int fdno = fdSyscallPre(__FUNCTION__, fd, 1, NULL); + fdstat_enter(fd, FDSTAT_FUTIMES); + int rc = fdSyscall( futimes(fdno, tv) ); + fdstat_exit(fd, FDSTAT_FUTIMES, 0); + return fdSyscallPost(__FUNCTION__, fd, fdno, rc); +} + +int Fchflags(FD_t fd, unsigned int flags) +{ + int fdno = fdSyscallPre(__FUNCTION__, fd, 1, NULL); + int rc = -2; + + fdstat_enter(fd, FDSTAT_FCHFLAGS); +#if defined(HAVE_FCHFLAGS) + rc = fdSyscall( fchflags(fdno, flags) ); +#else + errno = ENOSYS; +#endif + fdstat_exit(fd, FDSTAT_FCHFLAGS, 0); + return fdSyscallPost(__FUNCTION__, fd, fdno, rc); } +int Fadvise(FD_t fd, off_t offset, off_t len, int advice) +{ + int fdno = fdSyscallPre(__FUNCTION__, fd, 1, NULL); + int rc = -2; + + if (fdno < 0) { + /* XXX remap non-local errno */ + if (errno == EINVAL) + errno = ESPIPE; + } + fdstat_enter(fd, FDSTAT_FADVISE); + switch (advice) { +#if defined(HAVE_POSIX_FADVISE) + case POSIX_FADV_NORMAL: + case POSIX_FADV_SEQUENTIAL: + case POSIX_FADV_RANDOM: + case POSIX_FADV_NOREUSE: + case POSIX_FADV_WILLNEED: + case POSIX_FADV_DONTNEED: + rc = fdSyscall( posix_fadvise(fdno, offset, len, advice) ); +#else + errno = ENOSYS; +#endif + break; + default: + errno = EINVAL; + goto exit; + break; + } + fdstat_exit(fd, FDSTAT_FADVISE, len); + +exit: + return fdSyscallPost(__FUNCTION__, fd, fdno, rc); +} + +#undef HAVE_FALLOCATE /* XXX hmmm, fallocate64 is AWOL in F11. */ +int Fallocate(FD_t fd, off_t offset, off_t len) +{ + int fdno = fdSyscallPre(__FUNCTION__, fd, 1, NULL); + int rc = -2; + + fdstat_enter(fd, FDSTAT_FALLOCATE); +#if defined(HAVE_POSIX_FALLOCATE) + rc = fdSyscall( posix_fallocate(fdno, offset, len) ); +#elif defined(HAVE_FALLOCATE) + /* XXX linux FALLOC_FL_KEEP_SIZE zeroes allocated blocks */ + rc = fdSyscall( fallocate(fdno, 0, (loff_t)offset, (loff_t)len) ); +#else + errno = ENOSYS; +#endif + fdstat_exit(fd, FDSTAT_FALLOCATE, len); + + return fdSyscallPost(__FUNCTION__, fd, fdno, rc); +} + +int Ftruncate(FD_t fd, off_t len) +{ + int fdno = fdSyscallPre(__FUNCTION__, fd, 1, NULL); + int rc = -2; + +#if defined(HAVE_FTRUNCATE) + rc = fdSyscall( ftruncate(fdno, len) ); +#else + errno = ENOSYS; +#endif + + return fdSyscallPost(__FUNCTION__, fd, fdno, rc); +} + +int Fdatasync(FD_t fd) +{ + int fdno = fdSyscallPre(__FUNCTION__, fd, 1, NULL); + int rc = -2; + + fdstat_enter(fd, FDSTAT_FDATASYNC); +#if defined(HAVE_FDATASYNC) + rc = fdSyscall( fdatasync(fdno) ); +#else + errno = ENOSYS; +#endif + fdstat_exit(fd, FDSTAT_FDATASYNC, 0); /* XXX #bytes? */ + + return fdSyscallPost(__FUNCTION__, fd, fdno, rc); +} + +int Fsync(FD_t fd) +{ + int fdno = fdSyscallPre(__FUNCTION__, fd, 1, NULL); + int rc = -2; + + fdstat_enter(fd, FDSTAT_FSYNC); +#if defined(HAVE_FDATASYNC) + rc = fdSyscall( fdatasync(fdno) ); +#else + errno = ENOSYS; +#endif + fdstat_exit(fd, FDSTAT_FSYNC, 0); /* XXX #bytes? */ + + return fdSyscallPost(__FUNCTION__, fd, fdno, rc); +} + +int Fincore(FD_t fd) +{ + int fdno = fdSyscallPre(__FUNCTION__, fd, 1, NULL); + void * mapped = MAP_FAILED; + size_t nmapped = 0; + size_t pagesize = sysconf(_SC_PAGESIZE); + struct stat sb; + size_t npages; + unsigned char * vec; + int rc = -2; + + fdstat_enter(fd, FDSTAT_FINCORE); + if (fdno < 0) + goto exit; + + rc = fstat(fdno, &sb); + if (rc) + goto exit; + if (sb.st_size == 0) + goto exit; + + nmapped = sb.st_size; + mapped = Mmap(NULL, nmapped, PROT_NONE, MAP_PRIVATE, fd, 0); + if (mapped == MAP_FAILED) { + rc = -1; + goto exit; + } + + npages = (nmapped + pagesize-1)/pagesize; + vec = alloca(npages+1); + rc = Mincore(mapped, nmapped, vec); + if (rc) + goto exit; + + rc = 0; + for (size_t i = 0; i < npages; i++) { + if (!vec[i] & 0x1) + continue; + rc++; + } + +exit: + if (mapped != MAP_FAILED) + (void) Munmap(mapped, nmapped); + fdstat_exit(fd, FDSTAT_FINCORE, (rc >= 0 ? rc : 0) * pagesize); + return fdSyscallPost(__FUNCTION__, fd, fdno, rc); +} + +#undef fdSyscall + /* =============================================================== */ /* Helper routines that may be generally useful. */ @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmio.h ============================================================================ $ cvs diff -u -r1.97.2.10 -r1.97.2.11 rpmio.h --- rpm/rpmio/rpmio.h 17 Apr 2017 18:19:08 -0000 1.97.2.10 +++ rpm/rpmio/rpmio.h 18 Apr 2017 11:14:42 -0000 1.97.2.11 @@ -160,7 +160,68 @@ /** * fcntl(2) clone. */ -int Fcntl(FD_t fd, int op, void *lip); +int Fcntl(FD_t fd, int cmd, ...); + +/** + * flock(2) clone. + */ +int Flock(FD_t fd, int op); + +/** + * fchdir(2) clone. + */ +int Fchdir(FD_t fd); + +/** + * fchmod(2) clone. + */ +int Fchmod(FD_t fd, mode_t mode); + +/** + * fchown(2) clone. + */ +int Fchown(FD_t fd, uid_t uid, gid_t gid); + +/** + * futimes(2) clone. + */ +int Futimes(FD_t fd, const struct timeval tv[2]); + +/** + * fchflags(2) clone. + */ +int Fchflags(FD_t fd, unsigned int flags); + +/** + * posix_fadvise(2) clone. + */ +int Fadvise(FD_t fd, off_t offset, off_t length, int advice); + +/** + * posix_fallocate(3)/fallocate(2) clone. + */ +int Fallocate(FD_t fd, off_t offset, off_t length); + +/** + * ftruncate(2) clone. + */ +int Ftruncate(FD_t fd, off_t len); + +/** + * fdatasync(2) clone. + */ +int Fdatasync(FD_t fd); + +/** + * fsync(2) clone. + */ +int Fsync(FD_t fd); + +/** + * Return no. of pages in cache (using mmap(2) and mincore(2)). + * @return no. of pages in core, -1 on error + */ +int Fincore(FD_t fd); /*@}*/ @@ -230,39 +291,24 @@ int Fstat(FD_t fd, struct stat * st); /** - * posix_fadvise(2) clone. - */ -int Fadvise(FD_t fd, off_t offset, off_t length, int advice); - -/** - * posix_fallocate(3)/fallocate(2) clone. - */ -int Fallocate(FD_t fd, off_t offset, off_t length); - -/** - * ftruncate(2) clone. - */ -int Ftruncate(FD_t fd, off_t len); - -/** - * fdatasync(2) clone. + * mmap(2) clone. */ -int Fdatasync(FD_t fd); +void *Mmap(void *addr, size_t len, int prot, int flags, FD_t fd, off_t offset); /** - * fsync(2) clone. + * munmap(2) clone. */ -int Fsync(FD_t fd); +int Munmap(void * addr, size_t len); /** - * mmap(2) clone. + * msync(2) clone. */ -void *Mmap(void *addr, size_t len, int prot, int flags, FD_t fd, off_t offset); +int Msync(void * addr, size_t len, int flags); /** - * munmap(2) clone. + * mremap(2) clone. */ -int Munmap(void * addr, size_t len); +void *Mremap(void * oaddr, size_t olen, size_t nlen, int flags, ...); /** * mprotect(2) clone. @@ -309,12 +355,6 @@ int Chown(const char * path, uid_t owner, gid_t group); /** - * fchown(2) clone. - * @todo Implement remotely. - */ -int Fchown(FD_t fd, uid_t owner, gid_t group); - -/** * lchown(2) clone. * @todo Implement remotely. */ @@ -333,12 +373,6 @@ int Lchmod(const char * path, mode_t mode); /** - * fchmod(2) clone. - * @todo Implement remotely. - */ -int Fchmod(FD_t fd, mode_t mode); - -/** * chflags(2) clone. * @todo Implement remotely. */ @@ -351,12 +385,6 @@ int Lchflags(const char * path, unsigned int flags); /** - * fchflags(2) clone. - * @todo Implement remotely. - */ -int Fchflags(FD_t fd, unsigned int flags); - -/** * mkfifo(3) clone. * @todo Implement remotely. */ @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmio_internal.h ============================================================================ $ cvs diff -u -r2.127.2.9 -r2.127.2.10 rpmio_internal.h --- rpm/rpmio/rpmio_internal.h 17 Apr 2017 19:25:27 -0000 2.127.2.9 +++ rpm/rpmio/rpmio_internal.h 18 Apr 2017 11:14:42 -0000 2.127.2.10 @@ -27,15 +27,24 @@ * Identify per-desciptor I/O operation statistics. */ typedef enum fdOpX_e { - FDSTAT_READ = 0, /*!< read statistics index. */ - FDSTAT_WRITE = 1, /*!< write statistics index. */ - FDSTAT_SEEK = 2, /*!< seek statistics index. */ - FDSTAT_CLOSE = 3, /*!< close statistics index */ - FDSTAT_DIGEST = 4, /*!< digest statistics index. */ - FDSTAT_FALLOCATE = 5, /*!< fallocate statistics index. */ - FDSTAT_FDATASYNC = 6, /*!< fdatasync statistics index. */ - FDSTAT_FADVISE = 7, /*!< fadvise statistics index. */ - FDSTAT_FSYNC = 8, /*!< fsync statistics index. */ + FDSTAT_READ = 0, /*!< read statistics index. */ + FDSTAT_WRITE = 1, /*!< write statistics index. */ + FDSTAT_SEEK = 2, /*!< seek statistics index. */ + FDSTAT_CLOSE = 3, /*!< close statistics index */ + FDSTAT_DIGEST = 4, /*!< digest statistics index. */ + FDSTAT_OPEN = 5, /*!< open statistics index. */ + FDSTAT_FCNTL = 6, /*!< fcntl statistics index. */ + FDSTAT_FLOCK = 7, /*!< flock statistics index. */ + FDSTAT_FCHDIR = 8, /*!< fchdir statistics index. */ + FDSTAT_FCHMOD = 9, /*!< fchmod statistics index. */ + FDSTAT_FCHOWN = 10, /*!< fchown statistics index. */ + FDSTAT_FUTIMES = 11, /*!< futimes statistics index. */ + FDSTAT_FCHFLAGS = 12, /*!< fchflags statistics index. */ + FDSTAT_FALLOCATE = 13, /*!< fallocate statistics index. */ + FDSTAT_FDATASYNC = 14, /*!< fdatasync statistics index. */ + FDSTAT_FADVISE = 15, /*!< fadvise statistics index. */ + FDSTAT_FSYNC = 16, /*!< fsync statistics index. */ + FDSTAT_FINCORE = 17, /*!< fincore statistics index. */ FDSTAT_MAX } fdOpX; @@ -305,10 +314,13 @@ /** \ingroup rpmio */ static inline -void fdSetFdno(FD_t fd, int fdno) +int fdSetFdno(FD_t fd, int fdno) { + int ofdno; FDSANE(fd); + ofdno = fd->fps[fd->nfps].fdno; fd->fps[fd->nfps].fdno = fdno; + return ofdno; } /** \ingroup rpmio @@ -355,7 +367,7 @@ rpmop op = NULL; if (fd != NULL && fd->stats != NULL && (int)opx >= 0 && opx < FDSTAT_MAX) - op = fd->stats->ops + opx; + op = fd->stats->ops + opx; return op; } @@ -413,38 +425,34 @@ if (fd == NULL || fd->stats == NULL) return; for (int opx = 0; opx < FDSTAT_MAX; opx++) { static const char *const names[] = { - [FDSTAT_READ] = " read", - [FDSTAT_WRITE] = " write", - [FDSTAT_SEEK] = " seek", + [FDSTAT_READ] = " read", + [FDSTAT_WRITE] = " write", + [FDSTAT_SEEK] = " seek", #ifdef NOISY - [FDSTAT_CLOSE] = " close", + [FDSTAT_CLOSE] = " close", #endif - [FDSTAT_DIGEST] = "digest", - [FDSTAT_FALLOCATE] = " alloc", - [FDSTAT_FDATASYNC] = " dsync", + [FDSTAT_DIGEST] = " digest", + [FDSTAT_OPEN] = " open", + [FDSTAT_FCNTL] = " cntl", + [FDSTAT_FLOCK] = " lock", + [FDSTAT_FCHDIR] = " chdir", + [FDSTAT_FCHMOD] = " chmod", + [FDSTAT_FCHOWN] = " chown", + [FDSTAT_FUTIMES] = " utimes", + [FDSTAT_FCHFLAGS] = " chflags", + [FDSTAT_FALLOCATE] = " alloc", #ifdef NOISY - [FDSTAT_FADVISE] = "advise", + [FDSTAT_FADVISE] = " advise", #endif - [FDSTAT_FSYNC] = " sync", + [FDSTAT_FDATASYNC] = "datasync", + [FDSTAT_FSYNC] = " sync", + [FDSTAT_FINCORE] = " incore", }; rpmop op = &fd->stats->ops[opx]; if (names[opx] == NULL || *names[opx] == '\0') continue; if (op->count <= 0) continue; - switch (opx) { - case FDSTAT_READ: - case FDSTAT_WRITE: - case FDSTAT_SEEK: - case FDSTAT_CLOSE: - case FDSTAT_FALLOCATE: - case FDSTAT_FDATASYNC: - case FDSTAT_FADVISE: - case FDSTAT_FSYNC: - default: - break; - } - if (msg != NULL) fprintf(fp, "%s:", msg); fprintf(fp, "%8d %s(s), %8lu total bytes in %d.%06d secs\n", op->count, names[opx], (unsigned long)op->bytes, @@ -620,6 +628,58 @@ return fd->fps[0].fdno; } +/** \ingroup rpmio + * Common prologue for checking wrapped system functions. + * @return file descriptor + */ +static inline +int fdSyscallPre(const char * sysname, FD_t fd, int local, const char ** lpathp) +{ + int fdno = Fileno(fd); + const char * path = fdGetOPath(fd); + const char * lpath; + int ut = urlPath(path, &lpath); + + FDSANE(fd); +DBGIO(fd, (stderr, "--> %s(%p) fdno %d path %s\n", sysname, fd, fdno, path)); + + if (fdno < 0) { + errno = EBADF; + goto exit; + } + + if (local) /* XXX Restrict to local file paths? */ + switch (ut) { + case URL_IS_PATH: + case URL_IS_UNKNOWN: + break; + default: + fdno = -1; + errno = EINVAL; + goto exit; + break; + } + +exit: + if (lpathp) + *lpathp = lpath; + return fdno; +} + +/** \ingroup rpmio + * Common epilogue for checking wrapped system functions. + * @return exit code + */ +static inline +int fdSyscallPost(const char * sysname, FD_t fd, int fdno, int rc) +{ + if (rc < 0) + rpmlog(RPMLOG_DEBUG, _("%s(%d) failed: rc %d %m\n"), + __FUNCTION__, fdno, rc); +DBGIO(fd, (stderr, "<-- %s(%p) fdno %d rc %d\n", sysname, fd, fdno, rc)); + return rc; +} + #ifdef __cplusplus } #endif @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmrpc.c ============================================================================ $ cvs diff -u -r2.99.2.7 -r2.99.2.8 rpmrpc.c --- rpm/rpmio/rpmrpc.c 17 Apr 2017 19:53:09 -0000 2.99.2.7 +++ rpm/rpmio/rpmrpc.c 18 Apr 2017 11:14:42 -0000 2.99.2.8 @@ -1430,242 +1430,12 @@ return rc; } -int Fadvise(FD_t fd, off_t offset, off_t len, int advice) -{ - int rc = -2; - const char * path = fdGetOPath(fd); - const char * lpath; - int ut = urlPath(path, &lpath); - int fdno = Fileno(fd); - - FDSANE(fd); -DBGIO(fd, (stderr, "--> %s(%p,0x%x,0x%x,0x%x) fdno %d path %s\n", __FUNCTION__, fd, (unsigned)offset, (unsigned)len, advice, fdno, path)); - - /* XXX errno is not set by fallocate/posix_fallocate */ - if (fd == NULL || fdno < 0) { - errno = EBADF; - goto exit; - } - - switch (ut) { - case URL_IS_PATH: - case URL_IS_UNKNOWN: - break; - default: - errno = ESPIPE; - goto exit; - break; - } - - switch (advice) { -#if defined(HAVE_POSIX_FADVISE) - case POSIX_FADV_NORMAL: - case POSIX_FADV_SEQUENTIAL: - case POSIX_FADV_RANDOM: - case POSIX_FADV_NOREUSE: - case POSIX_FADV_WILLNEED: - case POSIX_FADV_DONTNEED: - fdstat_enter(fd, FDSTAT_FADVISE); - rc = posix_fadvise(fdno, offset, len, advice); - fdstat_exit(fd, FDSTAT_FADVISE, len); -#else - errno = ENOSYS; - goto exit; -#endif - break; - default: - errno = EINVAL; - goto exit; - break; - } - -exit: - if (rc != 0) - rpmlog(RPMLOG_DEBUG, _("%s(%d,0x%x,0x%x) failed: rc %d %m\n"), - __FUNCTION__, fdno, (unsigned)offset, (unsigned)len, rc); - - return rc; -} - -#undef HAVE_FALLOCATE /* XXX hmmm, fallocate64 is AWOL in F11. */ -int Fallocate(FD_t fd, off_t offset, off_t len) -{ - int rc = -2; - const char * path = fdGetOPath(fd); - const char * lpath; - int ut = urlPath(path, &lpath); - int fdno = Fileno(fd); - - FDSANE(fd); -DBGIO(fd, (stderr, "--> %s(%p,0x%x,0x%x) fdno %d path %s\n", __FUNCTION__, fd, (unsigned)offset, (unsigned)len, fdno, path)); - - /* XXX errno is not set by fallocate/posix_fallocate */ - if (fd == NULL || fdno < 0) { - errno = EBADF; - goto exit; - } - - switch (ut) { - case URL_IS_PATH: - case URL_IS_UNKNOWN: - break; - default: - errno = ENODEV; - goto exit; - break; - } - -#if defined(HAVE_POSIX_FALLOCATE) - fdstat_enter(fd, FDSTAT_FALLOCATE); - rc = posix_fallocate(fdno, offset, len); - fdstat_exit(fd, FDSTAT_FALLOCATE, len); -#elif defined(HAVE_FALLOCATE) - /* XXX linux FALLOC_FL_KEEP_SIZE zeroes allocated blocks */ - fdstat_enter(fd, FDSTAT_FALLOCATE); - rc = (int) fallocate(fdno, 0, (loff_t)offset, (loff_t)len); - fdstat_exit(fd, FDSTAT_FALLOCATE, len); -#else - errno = ENOSYS; -#endif - -exit: - if (rc != 0) - rpmlog(RPMLOG_DEBUG, _("%s(%d,0x%x,0x%x) failed: rc %d %m\n"), - __FUNCTION__, fdno, (unsigned)offset, (unsigned)len, rc); - - return rc; -} - -int Ftruncate(FD_t fd, off_t len) -{ - int rc = -2; - const char * path = fdGetOPath(fd); - const char * lpath; - int ut = urlPath(path, &lpath); - int fdno = Fileno(fd); - - FDSANE(fd); -DBGIO(fd, (stderr, "--> %s(%p,0x%x) fdno %d path %s\n", __FUNCTION__, fd, (unsigned)len, fdno, path)); - - if (fd == NULL || fdno < 0) { - errno = EBADF; - goto exit; - } - - switch (ut) { - case URL_IS_PATH: - case URL_IS_UNKNOWN: - break; - default: - errno = EINVAL; - goto exit; - break; - } - -#if defined(HAVE_FTRUNCATE) - rc = ftruncate(fdno, len); -#else - errno = ENOSYS; -#endif - -exit: - if (rc != 0) - rpmlog(RPMLOG_DEBUG, _("%s(%d,0x%x) failed: rc %d %m\n"), - __FUNCTION__, fdno, (unsigned)len, rc); - - return rc; -} - -int Fdatasync(FD_t fd) -{ - int rc = -2; - const char * path = fdGetOPath(fd); - const char * lpath; - int ut = urlPath(path, &lpath); - int fdno = Fileno(fd); - - FDSANE(fd); -DBGIO(fd, (stderr, "--> %s(%p) fdno %d path %s\n", __FUNCTION__, fd, fdno, path)); - - if (fd == NULL || fdno < 0) { - errno = EBADF; - goto exit; - } - - switch (ut) { - case URL_IS_PATH: - case URL_IS_UNKNOWN: - break; - default: - errno = EINVAL; - goto exit; - break; - } - -#if defined(HAVE_FDATASYNC) - fdstat_enter(fd, FDSTAT_FDATASYNC); - rc = fdatasync(fdno); - fdstat_exit(fd, FDSTAT_FDATASYNC, 0); /* XXX #bytes? */ -#else - errno = ENOSYS; -#endif - -exit: - if (rc != 0) - rpmlog(RPMLOG_DEBUG, _("%s(%d) failed: rc %d %m\n"), - __FUNCTION__, fdno, rc); - - return rc; -} - -int Fsync(FD_t fd) -{ - int rc = -2; - const char * path = fdGetOPath(fd); - const char * lpath; - int ut = urlPath(path, &lpath); - int fdno = Fileno(fd); - - FDSANE(fd); -DBGIO(fd, (stderr, "--> %s(%p) fdno %d path %s\n", __FUNCTION__, fd, fdno, path)); - - if (fd == NULL || fdno < 0) { - errno = EBADF; - goto exit; - } - - switch (ut) { - case URL_IS_PATH: - case URL_IS_UNKNOWN: - break; - default: - errno = EINVAL; - goto exit; - break; - } - -#if defined(HAVE_FDATASYNC) - fdstat_enter(fd, FDSTAT_FSYNC); - rc = fdatasync(fdno); - fdstat_exit(fd, FDSTAT_FSYNC, 0); /* XXX #bytes? */ -#else - errno = ENOSYS; -#endif - -exit: - if (rc != 0) - rpmlog(RPMLOG_DEBUG, _("%s(%d) failed: rc %d %m\n"), - __FUNCTION__, fdno, rc); - - return rc; -} - void *Mmap(void *addr, size_t len, int prot, int flags, FD_t fd, off_t offset) { int fdno = (fd ? Fileno(fd) : -1); void * ret = mmap(addr, len, prot, flags, fdno, offset); - if (ret == NULL || ret == (void *)-1) + if (ret == NULL || ret == MAP_FAILED) rpmlog(RPMLOG_ERR, _("%s(%p[%u],0x%x,0x%x,%p,0x%x) failed: %m\n"), __FUNCTION__, addr, (unsigned)len, prot, flags, fd, (unsigned)offset); @@ -1685,6 +1455,32 @@ return rc; } +int Msync(void * addr, size_t len, int flags) +{ + int rc = msync(addr, len, flags); + if (rc < 0) + rpmlog(RPMLOG_ERR, _("%s(%p[%u],%d) failed: %m\n"), + __FUNCTION__, addr, (unsigned)len, flags); +if (_rpmio_debug) +fprintf(stderr, "<-- %s(%p[%u],%d) rc %d\n", __FUNCTION__, addr, (unsigned)len, flags, rc); + return rc; +} + +void * Mremap(void * oaddr, size_t olen, size_t nlen, int flags, ...) +{ + va_list ap; + va_start(ap, flags); + void * naddr = va_arg(ap, void *); + va_end(ap); + void * ret = mremap(oaddr, olen, nlen, flags, naddr); + if (ret == NULL || ret == MAP_FAILED) + rpmlog(RPMLOG_ERR, _("%s(%p[%u => %u],%d,%p) failed: %m\n"), + __FUNCTION__, oaddr, (unsigned)olen, (unsigned)nlen, flags, naddr); +if (_rpmio_debug) +fprintf(stderr, "<-- %s(%p[%u => %u],%d,%p) ret %p\n", __FUNCTION__, oaddr, (unsigned)olen, (unsigned)nlen, flags, naddr, ret); + return ret; +} + int Mprotect(void * addr, size_t len, int prot) { int rc = mprotect(addr, len, prot); @@ -1859,37 +1655,6 @@ return rc; } -int Fchown(FD_t fd, uid_t owner, gid_t group) -{ - int rc = -2; - const char * path = fdGetOPath(fd); - const char * lpath; - int ut = urlPath(path, &lpath); - - switch (ut) { - case URL_IS_PATH: - path = lpath; - /*@fallthrough@*/ - case URL_IS_UNKNOWN: - break; - case URL_IS_DASH: - case URL_IS_HKP: - case URL_IS_FTP: /* XXX TODO: implement. */ - case URL_IS_HTTP: /* XXX TODO: implement. */ - case URL_IS_HTTPS: /* XXX TODO: implement. */ - case URL_IS_MONGO: /* XXX FIXME */ - default: - errno = EINVAL; /* XXX W2DO? */ - goto exit; - break; - } - rc = fchown(Fileno(fd), owner, group); -exit: -if (_rpmio_debug) -fprintf(stderr, "<-- %s(%p,%u,%u) path %s rc %d\n", __FUNCTION__, fd, (unsigned)owner, (unsigned)group, path, rc); - return rc; -} - int Lchown(const char * path, uid_t owner, gid_t group) { int rc = -2; @@ -1984,37 +1749,6 @@ return rc; } -int Fchmod(FD_t fd, mode_t mode) -{ - int rc = -2; - const char * path = fdGetOPath(fd); - const char * lpath; - int ut = urlPath(path, &lpath); - - switch (ut) { - case URL_IS_PATH: - path = lpath; - /*@fallthrough@*/ - case URL_IS_UNKNOWN: - break; - case URL_IS_DASH: - case URL_IS_HKP: - case URL_IS_FTP: /* XXX TODO: implement. */ - case URL_IS_HTTP: /* XXX TODO: implement. */ - case URL_IS_HTTPS: /* XXX TODO: implement. */ - case URL_IS_MONGO: /* XXX FIXME */ - default: - errno = EINVAL; /* XXX W2DO? */ - goto exit; - break; - } - rc = fchmod(Fileno(fd), mode); -exit: -if (_rpmio_debug) -fprintf(stderr, "<-- %s(%p,%0o) path %s rc %d\n", __FUNCTION__, fd, (int)mode, path, rc); - return rc; -} - int Chflags(const char * path, unsigned int flags) { int rc = -2; @@ -2083,40 +1817,6 @@ return rc; } -int Fchflags(FD_t fd, unsigned int flags) -{ - int rc = -2; -#if defined(HAVE_FCHFLAGS) - const char * path = fdGetOPath(fd); - const char * lpath; - int ut = urlPath(path, &lpath); - -if (_rpmio_debug) -fprintf(stderr, "*** Fchflags(%p,0x%x) path %s\n", fd, flags, path); - switch (ut) { - case URL_IS_PATH: - path = lpath; - /*@fallthrough@*/ - case URL_IS_UNKNOWN: - break; - case URL_IS_DASH: - case URL_IS_HKP: - case URL_IS_FTP: /* XXX TODO: implement. */ - case URL_IS_HTTP: /* XXX TODO: implement. */ - case URL_IS_HTTPS: /* XXX TODO: implement. */ - case URL_IS_MONGO: /* XXX FIXME */ - default: - errno = EINVAL; /* XXX W2DO? */ - goto exit; - break; - } - rc = fchflags(Fileno(fd), flags); -exit: -#else - errno = ENOSYS; -#endif - return rc; -} int Mkfifo(const char * path, mode_t mode) { const char * lpath; @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/xzdio.c ============================================================================ $ cvs diff -u -r1.14.4.2 -r1.14.4.3 xzdio.c --- rpm/rpmio/xzdio.c 24 Sep 2014 13:03:04 -0000 1.14.4.2 +++ rpm/rpmio/xzdio.c 18 Apr 2017 11:14:42 -0000 1.14.4.3 @@ -311,7 +311,7 @@ XZFILE *xzfile; assert(fmode != NULL); - fdSetFdno(fd, -1); /* XXX skip the fdio close */ + (void) fdSetFdno(fd, -1); /* XXX skip the fdio close */ if (fdno < 0) return NULL; xzfile = lzdopen(fdno, fmode); if (xzfile == NULL) return NULL; @@ -348,7 +348,7 @@ XZFILE *xzfile; assert(fmode != NULL); - fdSetFdno(fd, -1); /* XXX skip the fdio close */ + (void) fdSetFdno(fd, -1); /* XXX skip the fdio close */ if (fdno < 0) return NULL; xzfile = xzdopen(fdno, fmode); if (xzfile == NULL) return NULL; @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository rpm-cvs@rpm5.org