FD_t Fopen(const char *path, const char *fmode) { char stdio[20], other[20]; const char *end = NULL; mode_t perms = 0666; int flags = 0; FD_t fd; if (path == NULL || fmode == NULL) return NULL; stdio[0] = '\0'; cvtfmode(fmode, stdio, sizeof(stdio), other, sizeof(other), &end, &flags); if (stdio[0] == '\0') return NULL; if (end == NULL || rstreq(end, "fdio")) { if (_rpmio_debug) fprintf(stderr, "*** Fopen fdio path %s fmode %s\n", path, fmode); fd = fdOpen(path, flags, perms); if (fdFileno(fd) < 0) { if (fd) (void) fdClose(fd); return NULL; } } else { /* XXX gzdio and bzdio here too */ switch (urlIsURL(path)) { case URL_IS_HTTPS: case URL_IS_HTTP: case URL_IS_HKP: case URL_IS_PATH: case URL_IS_DASH: case URL_IS_FTP: case URL_IS_UNKNOWN: if (_rpmio_debug) fprintf(stderr, "*** Fopen ufdio path %s fmode %s\n", path, fmode); fd = ufdOpen(path, flags, perms); if (fd == NULL || !(fdFileno(fd) >= 0)) return fd; break; default: if (_rpmio_debug) fprintf(stderr, "*** Fopen WTFO path %s fmode %s\n", path, fmode); return NULL; break; } } if (fd) fd = Fdopen(fd, fmode); DBGIO(fd, (stderr, "==>\tFopen(\"%s\",%x,0%o) %s\n", path, (unsigned)flags, (unsigned)perms, fdbg(fd))); return fd; }
static ssize_t fdWrite(FD_t fd, const void * buf, size_t count) { if (count == 0) return 0; return write(fdFileno(fd), buf, count); }
int Ferror(FD_t fd) { int i, rc = 0; if (fd == NULL) return -1; for (i = fd->nfps; rc == 0 && i >= 0; i--) { FDSTACK_t * fps = &fd->fps[i]; int ec; if (fps->io == gzdio) { ec = (fd->syserrno || fd->errcookie != NULL) ? -1 : 0; i--; /* XXX fdio under gzdio always has fdno == -1 */ #if HAVE_BZLIB_H } else if (fps->io == bzdio) { ec = (fd->syserrno || fd->errcookie != NULL) ? -1 : 0; i--; /* XXX fdio under bzdio always has fdno == -1 */ #endif #if HAVE_LZMA_H } else if (fps->io == xzdio || fps->io == lzdio) { ec = (fd->syserrno || fd->errcookie != NULL) ? -1 : 0; i--; /* XXX fdio under xzdio/lzdio always has fdno == -1 */ #endif } else { /* XXX need to check ufdio/gzdio/bzdio/fdio errors correctly. */ ec = (fdFileno(fd) < 0 ? -1 : 0); } if (rc == 0 && ec) rc = ec; } DBGIO(fd, (stderr, "==> Ferror(%p) rc %d %s\n", fd, rc, fdbg(fd))); return rc; }
static FD_t lzdFdopen(FD_t fd, const char * fmode) { int fdno; LZFILE *lzfile; if (fd == NULL || fmode == NULL) return NULL; fdno = fdFileno(fd); fdSetFdno(fd, -1); /* XXX skip the fdio close */ if (fdno < 0) return NULL; lzfile = lzdopen(fdno, fmode); if (lzfile == NULL) return NULL; fdPush(fd, xzdio, lzfile, fdno); return fdLink(fd); }
static int fdClose(FD_t fd) { int fdno; int rc; if (fd == NULL) return -2; fdno = fdFileno(fd); fdSetFdno(fd, -1); rc = ((fdno >= 0) ? close(fdno) : -2); fdFree(fd); return rc; }
/*@-globuse@*/ static /*@null@*/ FD_t xzdFdopen(void * cookie, const char * fmode) /*@globals fileSystem, internalState @*/ /*@modifies fileSystem, internalState @*/ { FD_t fd = c2f(cookie); int fdno = fdFileno(fd); XZFILE *xzfile; assert(fmode != NULL); fdSetFdno(fd, -1); /* XXX skip the fdio close */ if (fdno < 0) return NULL; xzfile = xzdopen(fdno, fmode); if (xzfile == NULL) return NULL; fdPush(fd, xzdio, xzfile, fdno); return fdLink(fd, "xzdFdopen"); }
static FD_t bzdFdopen(FD_t fd, const char * fmode) { int fdno; BZFILE *bzfile; if (fd == NULL || fmode == NULL) return NULL; fdno = fdFileno(fd); fdSetFdno(fd, -1); /* XXX skip the fdio close */ if (fdno < 0) return NULL; bzfile = BZ2_bzdopen(fdno, fmode); if (bzfile == NULL) return NULL; fdPush(fd, bzdio, bzfile, fdno); /* Push bzdio onto stack */ return fdLink(fd); }
static FD_t gzdFdopen(FD_t fd, const char *fmode) { int fdno; gzFile gzfile; if (fd == NULL || fmode == NULL) return NULL; fdno = fdFileno(fd); fdSetFdno(fd, -1); /* XXX skip the fdio close */ if (fdno < 0) return NULL; gzfile = gzdopen(fdno, fmode); if (gzfile == NULL) return NULL; fdPush(fd, gzdio, gzfile, fdno); /* Push gzdio onto stack */ return fdLink(fd); }
/* Extract the file */ static size_t RPMCopy(install_info *info, const char *path, const char *dest, const char *current_option_name, xmlNodePtr node, int (*update)(install_info *info, const char *path, size_t progress, size_t size, const char *current)) { FD_t fdi; Header hd; size_t size; int_32 type, c; int rc, isSource; void *p; const char *reloc = xmlGetProp(node, "relocate"); const char *autorm = xmlGetProp(node, "autoremove"); const char *depsoff = xmlGetProp(node, "nodeps"); int relocate = (reloc && !strcasecmp(reloc, "true")); int autoremove = (autorm && !strcasecmp(autorm, "true")); int nodeps = (depsoff && !strcasecmp(depsoff, "true")); fdi = fdOpen(path, O_RDONLY, 0644); rc = rpmReadPackageHeader(fdi, &hd, &isSource, NULL, NULL); if ( rc ) { log_warning(_("RPM error: %s"), rpmErrorString()); return 0; } size = 0; if ( rpm_access && ! force_manual ) { /* We can call RPM directly */ char cmd[300]; FILE *fp; float percent = 0.0; double bytes_copied = 0.0; double previous_bytes = 0.0; char *name = "", *version = "", *release = ""; char *options = (char *) malloc(PATH_MAX); options[0] = '\0'; headerGetEntry(hd, RPMTAG_SIZE, &type, &p, &c); if(type==RPM_INT32_TYPE){ size = *(int_32*) p; } headerGetEntry(hd, RPMTAG_RELEASE, &type, &p, &c); if(type==RPM_STRING_TYPE){ release = (char *) p; } headerGetEntry(hd, RPMTAG_NAME, &type, &p, &c); if(type==RPM_STRING_TYPE){ name = (char*)p; } headerGetEntry(hd, RPMTAG_VERSION, &type, &p, &c); if(type==RPM_STRING_TYPE){ version = (char*)p; } fdClose(fdi); if (relocate) { /* force relocating RPM to install directory */ sprintf(options, " --relocate /=%s --badreloc ", dest); } if (nodeps) { strcat(options, " --nodeps "); } snprintf(cmd,sizeof(cmd),"rpm -U --percent --root %s %s %s", rpm_root, options, path); fp = popen(cmd, "r"); while ( percent < 100.0 ) { if(!fp || feof(fp)){ pclose(fp); free(options); log_warning(_("Unable to install RPM file: '%s'"), path); return 0; } fscanf(fp,"%s", cmd); if(strcmp(cmd,"%%")){ pclose(fp); free(options); log_warning(_("Unable to install RPM file: '%s'"), path); return 0; } fscanf(fp,"%f", &percent); /* calculate the bytes installed in this pass of the loop */ bytes_copied = (percent/100.0)*size - previous_bytes; previous_bytes += bytes_copied; info->installed_bytes += bytes_copied; if ( ! update(info, path, (percent/100.0)*size, size, current_option_name) ) break; } pclose(fp); free (options); /* Log the RPM installation */ add_rpm_entry(info, current_option, name, version, atoi(release), autoremove); } else { /* Manually install the RPM file */ gzFile gzdi = NULL; BZFILE *bzdi = NULL; FILE *fd = NULL; unsigned char magic[2]; stream *cpio; if(headerIsEntry(hd, RPMTAG_PREIN)){ headerGetEntry(hd, RPMTAG_PREIN, &type, &p, &c); if(type==RPM_STRING_TYPE) run_script(info, (char*)p, 1, 1); } /* Identify the type of compression for the archive */ if ( fdRead(fdi, magic, 2) < 2 ) { return 0; } lseek(fdFileno(fdi), -2L, SEEK_CUR); if ( magic[0]==037 && magic[1]==0213 ) { gzdi = gzdopen(fdFileno(fdi), "r"); /* XXX gzdi == fdi */ } else if ( magic[0]=='B' && magic[1]=='Z' ) { bzdi = BZDOPEN(fdFileno(fdi), "r"); } else { /* Assume not compressed */ fd = fdopen(fdFileno(fdi), "r"); } cpio = file_fdopen(info, path, fd, gzdi, bzdi, "r"); /* if relocate="true", copy the files into dest instead of rpm_root */ if (relocate) { size = copy_cpio_stream(info, cpio, dest, current_option_name, node, update); } else { size = copy_cpio_stream(info, cpio, rpm_root, current_option_name, node, update); } if(headerIsEntry(hd, RPMTAG_POSTIN)){ headerGetEntry(hd, RPMTAG_POSTIN, &type, &p, &c); if(type==RPM_STRING_TYPE) run_script(info, (char*)p, 1, 1); } /* Append the uninstall scripts to the uninstall */ if(headerIsEntry(hd, RPMTAG_PREUN)){ headerGetEntry(hd, RPMTAG_PREUN, &type, &p, &c); if(type==RPM_STRING_TYPE) add_script_entry(info, current_option, (char*)p, 0); } if(headerIsEntry(hd, RPMTAG_POSTUN)){ headerGetEntry(hd, RPMTAG_POSTUN, &type, &p, &c); if(type==RPM_STRING_TYPE) add_script_entry(info, current_option, (char*)p, 1); } fdClose(fdi); } return size; }
static int fdSeek(FD_t fd, off_t pos, int whence) { return lseek(fdFileno(fd), pos, whence); }
static ssize_t fdRead(FD_t fd, void * buf, size_t count) { return read(fdFileno(fd), buf, count); }