[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

Re: [PATCH 1/7] Remove isys cpio extraction code.



Ack.

--
Martin Sivák
msivak redhat com
Red Hat Czech
Anaconda team / Brno, CZ

----- "David Cantrell" <dcantrell redhat com> wrote:

> The only place this code is still used is in loader.  Loader is now
> using libarchive to unpack cpio streams and zlib to uncompress them,
> so
> we do not need these functions anymore.
> ---
>  pyanaconda/isys/Makefile.am |    2 +-
>  pyanaconda/isys/cpio.c      |   46 ---
>  pyanaconda/isys/cpio.h      |  102 ------
>  pyanaconda/isys/lang.c      |    4 +-
>  pyanaconda/isys/lang.h      |    2 +-
>  pyanaconda/isys/stubs.h     |   44 ---
>  pyanaconda/isys/uncpio.c    |  797
> -------------------------------------------
>  7 files changed, 4 insertions(+), 993 deletions(-)
>  delete mode 100644 pyanaconda/isys/cpio.c
>  delete mode 100644 pyanaconda/isys/cpio.h
>  delete mode 100644 pyanaconda/isys/stubs.h
>  delete mode 100644 pyanaconda/isys/uncpio.c
> 
> diff --git a/pyanaconda/isys/Makefile.am
> b/pyanaconda/isys/Makefile.am
> index 2b3130c..3d521d7 100644
> --- a/pyanaconda/isys/Makefile.am
> +++ b/pyanaconda/isys/Makefile.am
> @@ -19,7 +19,7 @@
>  
>  pkgpyexecdir = $(pyexecdir)/py$(PACKAGE_NAME)
>  
> -ISYS_SRCS = devices.c imount.c cpio.c uncpio.c lang.c \
> +ISYS_SRCS = devices.c imount.c lang.c \
>              isofs.c linkdetect.c vio.c ethtool.c eddsupport.c iface.c
> \
>              auditd.c log.c mem.c
>  
> diff --git a/pyanaconda/isys/cpio.c b/pyanaconda/isys/cpio.c
> deleted file mode 100644
> index fd83605..0000000
> --- a/pyanaconda/isys/cpio.c
> +++ /dev/null
> @@ -1,46 +0,0 @@
> -/*
> - * cpio.c
> - *
> - * Copyright (C) 2007  Red Hat, Inc.  All rights reserved.
> - *
> - * This program is free software; you can redistribute it and/or
> modify
> - * it under the terms of the GNU General Public License as published
> by
> - * the Free Software Foundation; either version 2 of the License, or
> - * (at your option) any later version.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU General Public License for more details.
> - *
> - * You should have received a copy of the GNU General Public License
> - * along with this program.  If not, see
> <http://www.gnu.org/licenses/>.
> - */
> -
> -#include <fcntl.h>
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <unistd.h>
> -
> -#include "cpio.h"
> -
> -int installCpioFile(gzFile fd, char * cpioName, char * outName, int
> inWin) {
> -    struct cpioFileMapping map;
> -    int rc;
> -    const char * failedFile;
> -
> -    if (outName) {
> -	map.archivePath = cpioName;
> -	map.fsPath = outName;
> -	map.mapFlags = CPIO_MAP_PATH;
> -    }
> -
> -    rc = myCpioInstallArchive(fd, outName ? &map : NULL, 1, NULL,
> NULL, 
> -			    &failedFile);
> -
> -    if (rc || access(outName, R_OK)) {
> -	return -1;
> -    }
> -
> -    return 0;
> -}
> diff --git a/pyanaconda/isys/cpio.h b/pyanaconda/isys/cpio.h
> deleted file mode 100644
> index 4cbb7c0..0000000
> --- a/pyanaconda/isys/cpio.h
> +++ /dev/null
> @@ -1,102 +0,0 @@
> -/*
> - * cpio.h
> - *
> - * Copyright (C) 2007  Red Hat, Inc.  All rights reserved.
> - *
> - * This program is free software; you can redistribute it and/or
> modify
> - * it under the terms of the GNU General Public License as published
> by
> - * the Free Software Foundation; either version 2 of the License, or
> - * (at your option) any later version.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU General Public License for more details.
> - *
> - * You should have received a copy of the GNU General Public License
> - * along with this program.  If not, see
> <http://www.gnu.org/licenses/>.
> - */
> -
> -#ifndef H_CPIO
> -#define H_CPIO
> -
> -#include <sys/types.h>
> -
> -#include "stubs.h"
> -
> -/* Note the CPIO_CHECK_ERRNO bit is set only if errno is valid. These
> have to
> -   be positive numbers or this setting the high bit stuff is a bad
> idea. */
> -#define CPIOERR_CHECK_ERRNO	0x80000000
> -
> -#define CPIOERR_BAD_MAGIC	(2			)
> -#define CPIOERR_BAD_HEADER	(3			)
> -#define CPIOERR_OPEN_FAILED	(4    | CPIOERR_CHECK_ERRNO)
> -#define CPIOERR_CHMOD_FAILED	(5    | CPIOERR_CHECK_ERRNO)
> -#define CPIOERR_CHOWN_FAILED	(6    | CPIOERR_CHECK_ERRNO)
> -#define CPIOERR_WRITE_FAILED	(7    | CPIOERR_CHECK_ERRNO)
> -#define CPIOERR_UTIME_FAILED	(8    | CPIOERR_CHECK_ERRNO)
> -#define CPIOERR_UNLINK_FAILED	(9    | CPIOERR_CHECK_ERRNO)
> -
> -#define CPIOERR_SYMLINK_FAILED	(11   | CPIOERR_CHECK_ERRNO)
> -#define CPIOERR_STAT_FAILED	(12   | CPIOERR_CHECK_ERRNO)
> -#define CPIOERR_MKDIR_FAILED	(13   | CPIOERR_CHECK_ERRNO)
> -#define CPIOERR_MKNOD_FAILED	(14   | CPIOERR_CHECK_ERRNO)
> -#define CPIOERR_MKFIFO_FAILED	(15   | CPIOERR_CHECK_ERRNO)
> -#define CPIOERR_LINK_FAILED	(16   | CPIOERR_CHECK_ERRNO)
> -#define CPIOERR_READLINK_FAILED	(17   | CPIOERR_CHECK_ERRNO)
> -#define CPIOERR_READ_FAILED	(18   | CPIOERR_CHECK_ERRNO)
> -#define CPIOERR_COPY_FAILED	(19   | CPIOERR_CHECK_ERRNO)
> -#define CPIOERR_INTERNAL	(20			)
> -#define CPIOERR_HDR_SIZE	(21			)
> -#define CPIOERR_UNKNOWN_FILETYPE (22			)
> -
> -
> -/* Don't think this behaves just like standard cpio. It's pretty
> close, but
> -   it has some behaviors which are more to RPM's liking. I tried to
> document
> -   them inline in cpio.c, but I may have missed some. */
> -
> -#define CPIO_MAP_PATH		(1 << 0)
> -#define CPIO_MAP_MODE		(1 << 1)
> -#define CPIO_MAP_UID		(1 << 2)
> -#define CPIO_MAP_GID		(1 << 3)
> -#define CPIO_FOLLOW_SYMLINKS	(1 << 4)  /* only for building */
> -
> -struct cpioFileMapping {
> -    char * archivePath;
> -    char * fsPath;
> -    mode_t finalMode;
> -    uid_t finalUid;
> -    gid_t finalGid;
> -    int mapFlags;
> -};
> -
> -/* on cpio building, only "file" is filled in */
> -struct cpioCallbackInfo {
> -    char * file;
> -    long fileSize;			/* total file size */
> -    long fileComplete;			/* amount of file unpacked */
> -    long bytesProcessed;		/* bytes in archive read */
> -};
> -
> -typedef void (*cpioCallback)(struct cpioCallbackInfo * filespec, void
> * data);
> -
> -/* If no mappings are passed, this installs everything! If one is
> passed
> -   it should be sorted according to cpioFileMapCmp() and only files
> included
> -   in the map are installed. Files are installed relative to the
> current
> -   directory unless a mapping is given which specifies an absolute 
> -   directory. The mode mapping is only used for the permission bits,
> not
> -   for the file type. The owner/group mappings are ignored for the
> nonroot
> -   user. If *failedFile is non-NULL on return, it should be free()d.
> */
> -int myCpioInstallArchive(gzFile stream, struct cpioFileMapping *
> mappings, 
> -		       int numMappings, cpioCallback cb, void * cbData,
> -		       const char ** failedFile);
> -int myCpioFilterArchive(gzFile inStream, gzFile outStream, char **
> pattern);
> -
> -/* This is designed to be qsort/bsearch compatible */
> -int myCpioFileMapCmp(const void * a, const void * b);
> -
> -const char *myCpioStrerror(int rc);
> -
> -int installCpioFile(gzFile fd, char * cpioName, char * outName, int
> inWin);
> -
> -#endif
> diff --git a/pyanaconda/isys/lang.c b/pyanaconda/isys/lang.c
> index b6e2a36..19b98ea 100644
> --- a/pyanaconda/isys/lang.c
> +++ b/pyanaconda/isys/lang.c
> @@ -33,12 +33,12 @@
>  #define NR_KEYS 128
>  #endif
>  
> +#include <zlib.h>
> +
>  #include "linux/kd.h"
>  
> -#include "cpio.h"
>  #include "isys.h"
>  #include "lang.h"
> -#include "stubs.h"
>  
>  int isysLoadFont(void) {
>      unsigned char font[65536];
> diff --git a/pyanaconda/isys/lang.h b/pyanaconda/isys/lang.h
> index a08adbd..a83778a 100644
> --- a/pyanaconda/isys/lang.h
> +++ b/pyanaconda/isys/lang.h
> @@ -20,7 +20,7 @@
>  #ifndef ISYS_LANG_H
>  #define ISYS_LANG_H
>  
> -#include "stubs.h"
> +#include <zlib.h>
>  
>  /* define ask johnsonm redhat com where this came from */
>  #define KMAP_MAGIC 0x8B39C07F
> diff --git a/pyanaconda/isys/stubs.h b/pyanaconda/isys/stubs.h
> deleted file mode 100644
> index 40ecb22..0000000
> --- a/pyanaconda/isys/stubs.h
> +++ /dev/null
> @@ -1,44 +0,0 @@
> -/*
> - * stubs.h
> - *
> - * Copyright (C) 2007  Red Hat, Inc.  All rights reserved.
> - *
> - * This program is free software; you can redistribute it and/or
> modify
> - * it under the terms of the GNU General Public License as published
> by
> - * the Free Software Foundation; either version 2 of the License, or
> - * (at your option) any later version.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU General Public License for more details.
> - *
> - * You should have received a copy of the GNU General Public License
> - * along with this program.  If not, see
> <http://www.gnu.org/licenses/>.
> - */
> -
> -/* we use gzlib when linked against dietlibc, but otherwise, we
> should use
> -   zlib.  it would make more sense to do the defines in the other
> direction, 
> -   but that causes symbol wackiness because both gunzip_open and
> gzip_open in
> -   gzlib are gzopen from zlib
> -*/
> -
> -#ifndef ISYS_STUB
> -#define ISYS_STUB
> -
> -#ifndef GZLIB
> -#include <zlib.h>
> -
> -#define gunzip_open(x) gzopen(x, "r")
> -#define gunzip_dopen gzdopen(x, "r")
> -#define gunzip_close gzclose
> -#define gunzip_read gzread
> -#define gzip_write gzwrite
> -#define gzip_open(x, y, z) gzopen(x, "w")
> -
> -#else
> -#include "gzlib/gzlib.h"
> -
> -#endif
> -
> -#endif
> diff --git a/pyanaconda/isys/uncpio.c b/pyanaconda/isys/uncpio.c
> deleted file mode 100644
> index 0481ff0..0000000
> --- a/pyanaconda/isys/uncpio.c
> +++ /dev/null
> @@ -1,797 +0,0 @@
> -/*
> - * uncpio.c
> - *
> - * Copyright (C) 2007  Red Hat, Inc.  All rights reserved.
> - *
> - * This program is free software; you can redistribute it and/or
> modify
> - * it under the terms of the GNU General Public License as published
> by
> - * the Free Software Foundation; either version 2 of the License, or
> - * (at your option) any later version.
> - *
> - * This program is distributed in the hope that it will be useful,
> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
> - * GNU General Public License for more details.
> - *
> - * You should have received a copy of the GNU General Public License
> - * along with this program.  If not, see
> <http://www.gnu.org/licenses/>.
> - */
> -
> -#define HAVE_ALLOCA_H 1
> -#define MAJOR_IN_SYSMACROS 1
> -
> -#if HAVE_ALLOCA_H
> -# include <alloca.h>
> -#endif
> -
> -#define _(foo) (foo)
> -
> -#include <errno.h>
> -#include <fcntl.h>
> -#include <fnmatch.h>
> -#include <stdio.h>
> -#include <stdlib.h>
> -#include <string.h>
> -#include <sys/types.h>
> -#include <sys/stat.h>
> -#include <unistd.h>
> -#include <utime.h>
> -
> -#include "cpio.h"
> -#include "stubs.h"
> -#include "log.h"
> -
> -#if MAJOR_IN_SYSMACROS 
> -#include <sys/sysmacros.h>
> -#elif MAJOR_IN_MKDEV 
> -#include <sys/mkdev.h>
> -#endif
> -
> -#define CPIO_NEWC_MAGIC "070701"
> -#define CPIO_CRC_MAGIC  "070702"
> -#define TRAILER         "TRAILER!!!"
> -
> -/* FIXME: We don't translate between cpio and system mode bits!
> These
> -   should both be the same, but really odd things are going to happen
> if
> -   that's not true! */
> -
> -/* We need to maintain our oun file pointer to allow padding */
> -struct ourfd {
> -    gzFile fd;
> -    size_t pos;
> -};
> -
> -struct hardLink {
> -    struct hardLink * next;
> -    char ** files;              /* there are nlink of these, used by
> install */
> -    int * fileMaps;             /* used by build */
> -    dev_t dev;
> -    ino_t inode;
> -    int nlink;
> -    int linksLeft;
> -    int createdPath;
> -    struct stat sb;
> -};
> -
> -struct cpioCrcPhysicalHeader {
> -    char magic[6];
> -    char inode[8];
> -    char mode[8];
> -    char uid[8];
> -    char gid[8];
> -    char nlink[8];
> -    char mtime[8];
> -    char filesize[8];
> -    char devMajor[8];
> -    char devMinor[8];
> -    char rdevMajor[8];
> -    char rdevMinor[8];
> -    char namesize[8];
> -    char checksum[8];                   /* ignored !! */
> -};
> -
> -#define PHYS_HDR_SIZE 110               /* don't depend on
> sizeof(struct) */
> -
> -struct cpioHeader {
> -    ino_t inode;
> -    mode_t mode;
> -    uid_t uid;
> -    gid_t gid;
> -    int nlink;
> -    time_t mtime;
> -    unsigned long size;
> -    dev_t dev, rdev;
> -    char * path;
> -};
> -
> -static inline off_t ourread(struct ourfd * thefd, void * buf, size_t
> size) {
> -    off_t i;
> -
> -    i = gunzip_read(thefd->fd, buf, size);
> -    thefd->pos += i;
> -
> -    return i;
> -}
> -
> -static inline void padinfd(struct ourfd * fd, int modulo) {
> -    int buf[10];
> -    int amount;
> -
> -    amount = (modulo - fd->pos % modulo) % modulo;
> -    ourread(fd, buf, amount);
> -}
> -
> -static inline int padoutfd(struct ourfd * fd, size_t * where, int
> modulo) {
> -    /*static int buf[10] = { '\0', '\0', '\0', '\0', '\0', 
> -                            '\0', '\0', '\0', '\0', '\0' };*/
> -    int amount;
> -    static int buf[512];
> -
> -    amount = (modulo - *where % modulo) % modulo;
> -    *where += amount;
> -
> -    if (gzip_write(fd->fd, buf, amount) != amount)
> -        return CPIOERR_WRITE_FAILED;
> -
> -    return 0;
> -}
> -
> -static int strntoul(const char * str, char ** endptr, int base, int
> num) {
> -    char * buf, * end;
> -    unsigned long ret;
> -
> -    buf = alloca(num + 1);
> -    strncpy(buf, str, num);
> -    buf[num] = '\0';
> -
> -    ret = strtoul(buf, &end, base);
> -    if (*end)
> -        *endptr = (char *)(str + (end - buf));  /* XXX discards const
> */
> -    else
> -        *endptr = "";
> -
> -    return strtoul(buf, endptr, base);
> -}
> -
> -#define GET_NUM_FIELD(phys, log) \
> -        log = strntoul(phys, &end, 16, sizeof(phys)); \
> -        if (*end) return CPIOERR_BAD_HEADER;
> -#define SET_NUM_FIELD(phys, val, space) \
> -        sprintf(space, "%8.8lx", (unsigned long) (val)); \
> -        memcpy(phys, space, 8);
> -
> -static int getNextHeader(struct ourfd * fd, struct cpioHeader *
> chPtr,
> -                         struct cpioCrcPhysicalHeader *
> physHeaderPtr) {
> -    struct cpioCrcPhysicalHeader physHeader;
> -    int nameSize;
> -    char * end;
> -    int major, minor;
> -
> -    if (ourread(fd, &physHeader, PHYS_HDR_SIZE) != PHYS_HDR_SIZE) 
> -        return CPIOERR_READ_FAILED;
> -
> -    if (physHeaderPtr)
> -        memcpy(physHeaderPtr, &physHeader, PHYS_HDR_SIZE);
> -
> -    if (strncmp(CPIO_CRC_MAGIC, physHeader.magic,
> strlen(CPIO_CRC_MAGIC)) &&
> -        strncmp(CPIO_NEWC_MAGIC, physHeader.magic,
> strlen(CPIO_NEWC_MAGIC)))
> -        return CPIOERR_BAD_MAGIC;
> -
> -    GET_NUM_FIELD(physHeader.inode, chPtr->inode);
> -    GET_NUM_FIELD(physHeader.mode, chPtr->mode);
> -    GET_NUM_FIELD(physHeader.uid, chPtr->uid);
> -    GET_NUM_FIELD(physHeader.gid, chPtr->gid);
> -    GET_NUM_FIELD(physHeader.nlink, chPtr->nlink);
> -    GET_NUM_FIELD(physHeader.mtime, chPtr->mtime);
> -    GET_NUM_FIELD(physHeader.filesize, chPtr->size);
> -
> -    GET_NUM_FIELD(physHeader.devMajor, major);
> -    GET_NUM_FIELD(physHeader.devMinor, minor);
> -    chPtr->dev = makedev(major, minor);
> -
> -    GET_NUM_FIELD(physHeader.rdevMajor, major);
> -    GET_NUM_FIELD(physHeader.rdevMinor, minor);
> -    chPtr->rdev = makedev(major, minor);
> -
> -    GET_NUM_FIELD(physHeader.namesize, nameSize);
> -
> -    chPtr->path = malloc(nameSize + 1);
> -    if (ourread(fd, chPtr->path, nameSize) != nameSize) {
> -        free(chPtr->path);
> -        return CPIOERR_BAD_HEADER;
> -    }
> -
> -    /* this is unecessary chPtr->path[nameSize] = '\0'; */
> -
> -    padinfd(fd, 4);
> -
> -    return 0;
> -}
> -
> -int myCpioFileMapCmp(const void * a, const void * b) {
> -    const struct cpioFileMapping * first = a;
> -    const struct cpioFileMapping * second = b;
> -
> -    return (strcmp(first->archivePath, second->archivePath));
> -}
> -
> -/* This could trash files in the path! I'm not sure that's a good
> thing */
> -static int createDirectory(char * path, mode_t perms) {
> -    struct stat sb;
> -    int dounlink;
> -
> -    if (!lstat(path, &sb)) {
> -        if (S_ISDIR(sb.st_mode)) {
> -                return 0;
> -        } else if (S_ISLNK(sb.st_mode)) {
> -            if (stat(path, &sb)) {
> -                if (errno != ENOENT)
> -                    return CPIOERR_STAT_FAILED;
> -                dounlink = 1;
> -            } else {
> -                if (S_ISDIR(sb.st_mode))
> -                    return 0;
> -                dounlink = 1;
> -            }
> -        } else {
> -            dounlink = 1;
> -        }
> -
> -        if (dounlink && unlink(path)) {
> -            return CPIOERR_UNLINK_FAILED;
> -        }
> -    }
> -
> -    if (mkdir(path, 000))
> -        return CPIOERR_MKDIR_FAILED;
> -
> -    if (chmod(path, perms))
> -        return CPIOERR_CHMOD_FAILED;
> -
> -    return 0;
> -}
> -
> -static int setInfo(struct cpioHeader * hdr) {
> -    int rc = 0;
> -    struct utimbuf stamp;
> -
> -    stamp.actime = hdr->mtime; 
> -    stamp.modtime = hdr->mtime;
> -
> -    if (!S_ISLNK(hdr->mode)) {
> -        if (!getuid() && chown(hdr->path, hdr->uid, hdr->gid))
> -            rc = CPIOERR_CHOWN_FAILED;
> -        if (!rc && chmod(hdr->path, hdr->mode & 07777))
> -            rc = CPIOERR_CHMOD_FAILED;
> -        if (!rc && utime(hdr->path, &stamp))
> -            rc = CPIOERR_UTIME_FAILED;
> -    } else {
> -#       if ! CHOWN_FOLLOWS_SYMLINK
> -            if (!getuid() && !rc && lchown(hdr->path, hdr->uid,
> hdr->gid))
> -                rc = CPIOERR_CHOWN_FAILED;
> -#       endif
> -    }
> -
> -    return rc;
> -}
> -
> -static int checkDirectory(char * filename) {
> -    static char * lastDir = NULL;
> -    static int lastDirLength = 0;
> -    static int lastDirAlloced = 0;
> -    int length = strlen(filename);
> -    char * buf;
> -    char * chptr;
> -    int rc = 0;
> -
> -    buf = alloca(length + 1);
> -    strcpy(buf, filename);
> -
> -    for (chptr = buf + length - 1; chptr > buf; chptr--) {
> -        if (*chptr == '/') break;
> -    }
> -
> -    if (chptr == buf) return 0;     /* /filename - no directories */
> -
> -    *chptr = '\0';                  /* buffer is now just directories
> */
> -
> -    length = strlen(buf);
> -    if (lastDirLength == length && !strcmp(buf, lastDir)) return 0;
> -
> -    if (lastDirAlloced < (length + 1)) {
> -        lastDirAlloced = length + 100;
> -        lastDir = realloc(lastDir, lastDirAlloced);
> -    }
> -
> -    strcpy(lastDir, buf);
> -    lastDirLength = length;
> -
> -    for (chptr = buf + 1; *chptr; chptr++) {
> -        if (*chptr == '/') {
> -            *chptr = '\0';
> -            rc = createDirectory(buf, 0755);
> -            *chptr = '/';
> -            if (rc) return rc;
> -        }
> -    }
> -    rc = createDirectory(buf, 0755);
> -
> -    return rc;
> -}
> -
> -static int expandRegular(struct ourfd * fd, struct cpioHeader * hdr,
> -                         cpioCallback cb, void * cbData) {
> -    int out;
> -    char buf[8192];
> -    int bytesRead;
> -    unsigned long left = hdr->size;
> -    int rc = 0;
> -    struct cpioCallbackInfo cbInfo;
> -    struct stat sb;
> -
> -    if (!lstat(hdr->path, &sb))
> -        if (unlink(hdr->path))
> -            return CPIOERR_UNLINK_FAILED;
> -
> -    out = open(hdr->path, O_CREAT | O_WRONLY, 0);
> -    if (out < 0) 
> -        return CPIOERR_OPEN_FAILED;
> -
> -    cbInfo.file = hdr->path;
> -    cbInfo.fileSize = hdr->size;
> -
> -    while (left) {
> -        bytesRead = ourread(fd, buf, left < sizeof(buf) ? left :
> sizeof(buf));
> -        if (bytesRead <= 0) {
> -            rc = CPIOERR_READ_FAILED;
> -            break;
> -        }
> -
> -        if (write(out, buf, bytesRead) != bytesRead) {
> -            rc = CPIOERR_COPY_FAILED;
> -            break;
> -        }
> -
> -        left -= bytesRead;
> -
> -        /* don't call this with fileSize == fileComplete */
> -        if (!rc && cb && left) {
> -            cbInfo.fileComplete = hdr->size - left;
> -            cbInfo.bytesProcessed = fd->pos;
> -            cb(&cbInfo, cbData);
> -        }
> -    }
> -
> -    close(out);
> -
> -    return rc;
> -}
> -
> -static int expandSymlink(struct ourfd * fd, struct cpioHeader * hdr)
> {
> -    char buf[2048], buf2[2048];
> -    struct stat sb;
> -    int len;
> -
> -    if ((hdr->size + 1)> sizeof(buf))
> -        return CPIOERR_INTERNAL;
> -
> -    if (ourread(fd, buf, hdr->size) != hdr->size)
> -        return CPIOERR_READ_FAILED;
> -
> -    buf[hdr->size] = '\0';
> -
> -    if (!lstat(hdr->path, &sb)) {
> -        if (S_ISLNK(sb.st_mode)) {
> -            len = readlink(hdr->path, buf2, sizeof(buf2) - 1);
> -            if (len > 0) {
> -                buf2[len] = '\0';
> -                if (!strcmp(buf, buf2)) return 0;
> -            }
> -        }
> -
> -        if (unlink(hdr->path))
> -            return CPIOERR_UNLINK_FAILED;
> -    }
> -
> -    if (symlink(buf, hdr->path) < 0)
> -        return CPIOERR_SYMLINK_FAILED;
> -
> -    return 0;
> -}
> -
> -static int expandFifo(struct ourfd * fd, struct cpioHeader * hdr) {
> -    struct stat sb;
> -
> -    if (!lstat(hdr->path, &sb)) {
> -        if (S_ISFIFO(sb.st_mode)) return 0;
> -
> -        if (unlink(hdr->path))
> -            return CPIOERR_UNLINK_FAILED;
> -    }
> -
> -    if (mkfifo(hdr->path, 0))
> -        return CPIOERR_MKFIFO_FAILED;
> -
> -    return 0; 
> -}
> -
> -static int expandDevice(struct ourfd * fd, struct cpioHeader * hdr)
> {
> -    struct stat sb;
> -
> -    if (!lstat(hdr->path, &sb)) {
> -        if ((S_ISCHR(sb.st_mode) || S_ISBLK(sb.st_mode)) &&
> -            (sb.st_rdev == hdr->rdev))
> -            return 0;
> -        if (unlink(hdr->path))
> -            return CPIOERR_UNLINK_FAILED;
> -    }
> -
> -    if (mknod(hdr->path, hdr->mode & (~0777), hdr->rdev))
> -        return CPIOERR_MKNOD_FAILED;
> -
> -    return 0;
> -}
> -
> -static void freeLink(struct hardLink * li) {
> -    int i;
> -
> -    for (i = 0; i < li->nlink; i++) {
> -        if (li->files[i]) free(li->files[i]);
> -    }
> -    free(li->files);
> -}
> -
> -static int createLinks(struct hardLink * li, const char **
> failedFile) {
> -    int i;
> -    struct stat sb;
> -
> -    for (i = 0; i < li->nlink; i++) {
> -        if (i == li->createdPath) continue;
> -        if (!li->files[i]) continue;
> -
> -        if (!lstat(li->files[i], &sb)) {
> -            if (unlink(li->files[i])) {
> -                *failedFile = strdup(li->files[i]);
> -                return CPIOERR_UNLINK_FAILED;
> -            }
> -        }
> -
> -        if (link(li->files[li->createdPath], li->files[i])) {
> -            *failedFile = strdup(li->files[i]);
> -            return CPIOERR_LINK_FAILED;
> -        }
> -
> -        free(li->files[i]);
> -        li->files[i] = NULL;
> -        li->linksLeft--;
> -    }
> -
> -    return 0;
> -}
> -
> -static int eatBytes(struct ourfd * fd, unsigned long amount) {
> -    char buf[4096];
> -    unsigned long bite;
> -
> -    while (amount) {
> -        bite = (amount > sizeof(buf)) ? sizeof(buf) : amount;
> -        if (ourread(fd, buf, bite) != bite)
> -            return CPIOERR_READ_FAILED;
> -        amount -= bite;
> -    }
> -
> -    return 0;
> -}
> -
> -int myCpioInstallArchive(gzFile stream, struct cpioFileMapping *
> mappings,
> -                         int numMappings, cpioCallback cb, void *
> cbData,
> -                         const char ** failedFile) {
> -    struct cpioHeader ch;
> -    struct ourfd fd;
> -    int rc = 0;
> -    int linkNum = 0;
> -    struct cpioFileMapping * map = NULL;
> -    struct cpioFileMapping needle;
> -    mode_t cpioMode;
> -    int olderr;
> -    struct cpioCallbackInfo cbInfo;
> -    struct hardLink * links = NULL;
> -    struct hardLink * li = NULL;
> -
> -    fd.fd = stream;
> -    fd.pos = 0;
> -
> -    *failedFile = NULL;
> -
> -    do {
> -        if ((rc = getNextHeader(&fd, &ch, NULL))) {
> -            logMessage( WARNING, "error %d reading header: %s\n",
> rc,
> -                        myCpioStrerror(rc));
> -            return CPIOERR_BAD_HEADER;
> -        }
> -
> -        if (!strcmp(ch.path, TRAILER)) {
> -            free(ch.path);
> -            break;
> -        }
> -
> -        if (mappings) {
> -            needle.archivePath = ch.path;
> -            map = bsearch(&needle, mappings, numMappings,
> sizeof(needle),
> -                          myCpioFileMapCmp);
> -        }
> -
> -        if (mappings && !map) {
> -            eatBytes(&fd, ch.size);
> -        } else {
> -            cpioMode = ch.mode;
> -
> -            if (map) {
> -                if (map->mapFlags & CPIO_MAP_PATH) {
> -                    free(ch.path);
> -                    ch.path = strdup(map->fsPath);
> -                }
> -
> -                if (map->mapFlags & CPIO_MAP_MODE)
> -                    ch.mode = map->finalMode;
> -                if (map->mapFlags & CPIO_MAP_UID)
> -                    ch.uid = map->finalUid;
> -                if (map->mapFlags & CPIO_MAP_GID)
> -                    ch.gid = map->finalGid;
> -            }
> -
> -            /* This won't get hard linked symlinks right, but I can't
> seem
> -               to create those anyway */
> -
> -            if (S_ISREG(ch.mode) && ch.nlink > 1) {
> -                li = links;
> -                for (li = links; li; li = li->next) {
> -                    if (li->inode == ch.inode && li->dev == ch.dev)
> break;
> -                }
> -
> -                if (!li) {
> -                    li = malloc(sizeof(*li));
> -                    li->inode = ch.inode;
> -                    li->dev = ch.dev;
> -                    li->nlink = ch.nlink;
> -                    li->linksLeft = ch.nlink;
> -                    li->createdPath = -1;
> -                    li->files = calloc(sizeof(char *), li->nlink);
> -                    li->next = links;
> -                    links = li;
> -                }
> -
> -                for (linkNum = 0; linkNum < li->nlink; linkNum++)
> -                    if (!li->files[linkNum]) break;
> -                li->files[linkNum] = strdup(ch.path);
> -            }
> -
> -            if ((ch.nlink > 1) && S_ISREG(ch.mode) && !ch.size &&
> -                li->createdPath == -1) {
> -                /* defer file creation */
> -            } else if ((ch.nlink > 1) && S_ISREG(ch.mode) &&
> -                       (li->createdPath != -1)) {
> -                createLinks(li, failedFile);
> -
> -                /* this only happens for cpio archives which contain
> -                   hardlinks w/ the contents of each hardlink being
> -                   listed (intead of the data being given just once.
> This
> -                   shouldn't happen, but I've made it happen w/
> buggy
> -                   code, so what the heck? GNU cpio handles this well
> fwiw */
> -                if (ch.size) eatBytes(&fd, ch.size);
> -            } else {
> -                rc = checkDirectory(ch.path);
> -
> -                if (!rc) {
> -                    if (S_ISREG(ch.mode))
> -                        rc = expandRegular(&fd, &ch, cb, cbData);
> -                    else if (S_ISDIR(ch.mode))
> -                        rc = createDirectory(ch.path, 000);
> -                    else if (S_ISLNK(ch.mode))
> -                        rc = expandSymlink(&fd, &ch);
> -                    else if (S_ISFIFO(ch.mode))
> -                        rc = expandFifo(&fd, &ch);
> -                    else if (S_ISCHR(ch.mode) || S_ISBLK(ch.mode))
> -                        rc = expandDevice(&fd, &ch);
> -                    else if (S_ISSOCK(ch.mode)) {
> -                        /* this mimicks cpio but probably isnt' right
> */
> -                        rc = expandFifo(&fd, &ch);
> -                    } else {
> -                        rc = CPIOERR_INTERNAL;
> -                    }
> -                }
> -
> -                if (!rc)
> -                    rc = setInfo(&ch);
> -
> -                if (S_ISREG(ch.mode) && ch.nlink > 1) {
> -                    li->createdPath = linkNum;
> -                    li->linksLeft--;
> -                    rc = createLinks(li, failedFile);
> -                }
> -            }
> -
> -            if (rc && !*failedFile) {
> -                *failedFile = strdup(ch.path);
> -
> -                olderr = errno;
> -                unlink(ch.path);
> -                errno = olderr;
> -            }
> -        }
> -
> -        padinfd(&fd, 4);
> -
> -        if (!rc && cb) {
> -            cbInfo.file = ch.path;
> -            cbInfo.fileSize = ch.size;
> -            cbInfo.fileComplete = ch.size;
> -            cbInfo.bytesProcessed = fd.pos;
> -            cb(&cbInfo, cbData);
> -        }
> -
> -        free(ch.path);
> -    } while (1 && !rc);
> -
> -    li = links;
> -    while (li && !rc) {
> -        if (li->linksLeft) {
> -            if (li->createdPath == -1)
> -                rc = CPIOERR_INTERNAL;
> -            else
> -                rc = createLinks(li, failedFile);
> -        }
> -
> -        freeLink(li);
> -
> -        links = li;
> -        li = li->next;
> -        free(links);
> -        links = li;
> -    }
> -
> -    li = links;
> -    /* if an error got us here links will still be eating some memory
> */
> -    while (li) {
> -        freeLink(li);
> -        links = li;
> -        li = li->next;
> -        free(links);
> -    }
> -
> -    return rc;
> -}
> -
> -const char * myCpioStrerror(int rc)
> -{
> -    static char msg[256];
> -    char *s;
> -    int l, myerrno = errno;
> -
> -    strcpy(msg, "cpio: ");
> -    switch (rc) {
> -    default:
> -        s = msg + strlen(msg);
> -        sprintf(s, "(error 0x%x)", rc);
> -        s = NULL;
> -        break;
> -    case CPIOERR_BAD_MAGIC:             s = "Bad magic";       
> break;
> -    case CPIOERR_BAD_HEADER:            s = "Bad header";      
> break;
> -    case CPIOERR_OPEN_FAILED:           s = "open";            
> break;
> -    case CPIOERR_CHMOD_FAILED:          s = "chmod";           
> break;
> -    case CPIOERR_CHOWN_FAILED:          s = "chown";           
> break;
> -    case CPIOERR_WRITE_FAILED:          s = "write";           
> break;
> -    case CPIOERR_UTIME_FAILED:          s = "utime";           
> break;
> -    case CPIOERR_UNLINK_FAILED:         s = "unlink";          
> break;
> -    case CPIOERR_SYMLINK_FAILED:        s = "symlink";         
> break;
> -    case CPIOERR_STAT_FAILED:           s = "stat";            
> break;
> -    case CPIOERR_MKDIR_FAILED:          s = "mkdir";           
> break;
> -    case CPIOERR_MKNOD_FAILED:          s = "mknod";           
> break;
> -    case CPIOERR_MKFIFO_FAILED:         s = "mkfifo";          
> break;
> -    case CPIOERR_LINK_FAILED:           s = "link";            
> break;
> -    case CPIOERR_READLINK_FAILED:       s = "readlink";        
> break;
> -    case CPIOERR_READ_FAILED:           s = "read";            
> break;
> -    case CPIOERR_COPY_FAILED:           s = "copy";            
> break;
> -    case CPIOERR_INTERNAL:              s = "Internal error";  
> break;
> -    case CPIOERR_HDR_SIZE:              s = "Header size too
> big";break;
> -    case CPIOERR_UNKNOWN_FILETYPE:      s = "Unknown file
> type";break;
> -    }
> -
> -    l = sizeof(msg) - strlen(msg) - 1;
> -    if (s != NULL) {
> -        if (l > 0) strncat(msg, s, l);
> -        l -= strlen(s);
> -    }
> -    if (rc & CPIOERR_CHECK_ERRNO) {
> -        s = " failed - ";
> -        if (l > 0) strncat(msg, s, l);
> -        l -= strlen(s);
> -        if (l > 0) strncat(msg, strerror(myerrno), l);
> -    }
> -    return msg;
> -}
> -
> -static int copyFile(struct ourfd * inFd, struct ourfd * outFd, 
> -             struct cpioHeader * chp, struct cpioCrcPhysicalHeader *
> pHdr) {
> -    char buf[8192];
> -    int amount;
> -    size_t size = chp->size;
> -
> -    amount = strlen(chp->path) + 1;
> -    memcpy(pHdr->magic, CPIO_NEWC_MAGIC, sizeof(pHdr->magic));
> -
> -    gzip_write(outFd->fd, pHdr, PHYS_HDR_SIZE);
> -    gzip_write(outFd->fd, chp->path, amount);
> -
> -    outFd->pos += PHYS_HDR_SIZE + amount;
> -
> -    padoutfd(outFd, &outFd->pos, 4);
> -
> -    while (size) {
> -        amount = ourread(inFd, buf, size > sizeof(buf) ? sizeof(buf)
> : size);
> -        gzip_write(outFd->fd, buf, amount);
> -        size -= amount;
> -    }
> -
> -    outFd->pos += chp->size;
> -
> -    padoutfd(outFd, &outFd->pos, 4);
> -
> -    return 0;
> -}
> -
> -int myCpioFilterArchive(gzFile inStream, gzFile outStream, char **
> patterns) {
> -    struct ourfd inFd, outFd;
> -    char ** aPattern;
> -    struct cpioHeader ch;
> -    int rc;
> -    struct cpioCrcPhysicalHeader pHeader;
> -
> -    inFd.fd = inStream;
> -    inFd.pos = 0;
> -    outFd.fd = outStream;
> -    outFd.pos = 0;
> -
> -    do {
> -        if ((rc = getNextHeader(&inFd, &ch, &pHeader))) {
> -            logMessage( WARNING, "error %d reading header: %s\n",
> rc,
> -                        myCpioStrerror(rc));
> -            return CPIOERR_BAD_HEADER;
> -        }
> -
> -        if (!strcmp(ch.path, TRAILER)) {
> -            free(ch.path);
> -            break;
> -        }
> -
> -        for (aPattern = patterns; *aPattern; aPattern++)
> -            if (!fnmatch(*aPattern, ch.path, FNM_PATHNAME |
> FNM_PERIOD))
> -                break;
> -
> -        if (!*aPattern)
> -            eatBytes(&inFd, ch.size);
> -        else
> -            copyFile(&inFd, &outFd, &ch, &pHeader);
> -
> -        padinfd(&inFd, 4);
> -
> -        free(ch.path);
> -    } while (1 && !rc);
> -
> -    memset(&pHeader, '0', sizeof(pHeader));
> -    memcpy(pHeader.magic, CPIO_NEWC_MAGIC, sizeof(pHeader.magic));
> -    memcpy(pHeader.nlink, "00000001", 8);
> -    memcpy(pHeader.namesize, "0000000b", 8);
> -    gzip_write(outFd.fd, &pHeader, PHYS_HDR_SIZE);
> -    gzip_write(outFd.fd, "TRAILER!!!", 11);
> -
> -    outFd.pos += PHYS_HDR_SIZE + 11;
> -
> -    if ((rc = padoutfd(&outFd, &outFd.pos, 4)))
> -        return rc;
> -
> -    if ((rc = padoutfd(&outFd, &outFd.pos, 512)))
> -        return rc;
> -
> -    return 0;
> -}
> -- 
> 1.7.2.3
> 
> _______________________________________________
> Anaconda-devel-list mailing list
> Anaconda-devel-list redhat com
> https://www.redhat.com/mailman/listinfo/anaconda-devel-list


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]