diff options
-rw-r--r-- | build/Makefile.am | 2 | ||||
-rw-r--r-- | file/magic/Makefile.am | 13 | ||||
-rw-r--r-- | file/src/file.c | 10 | ||||
-rw-r--r-- | file/src/file.h | 1 | ||||
-rw-r--r-- | file/src/magic.c | 293 | ||||
-rw-r--r-- | file/src/magic.h | 58 | ||||
-rw-r--r-- | file/src/names.h | 43 | ||||
-rw-r--r-- | lib/package.c | 15 | ||||
-rw-r--r-- | lib/psm.c | 36 | ||||
-rw-r--r-- | lib/rpmlead.c | 13 | ||||
-rw-r--r-- | lib/rpmlead.h | 8 | ||||
-rw-r--r-- | lib/rpmlib.h | 4 | ||||
-rw-r--r-- | python/rpmts-py.c | 6 | ||||
-rw-r--r-- | rpmio/Makefile.am | 2 | ||||
-rw-r--r-- | tools/Makefile.am | 4 | ||||
-rw-r--r-- | tools/rpmcache.c | 6 | ||||
-rw-r--r-- | tools/rpmsort.c | 9 |
17 files changed, 454 insertions, 69 deletions
diff --git a/build/Makefile.am b/build/Makefile.am index e098e30c7..0105eb636 100644 --- a/build/Makefile.am +++ b/build/Makefile.am @@ -35,7 +35,7 @@ librpmbuild_la_LDFLAGS = -release @VERSION@ $(LDFLAGS) \ @WITH_LIBELF_LIB@ rpmfile.h: - @ln -sf $(top_builddir)/file/file.h $@ + @ln -sf $(top_builddir)/file/src/file.h $@ files.c rpmfc.c: rpmfile.h diff --git a/file/magic/Makefile.am b/file/magic/Makefile.am index e774dcd2a..67735e83e 100644 --- a/file/magic/Makefile.am +++ b/file/magic/Makefile.am @@ -18,10 +18,10 @@ magic: Header Localstuff $(magic_FRAGMENTS) done >> $@ magic.mgc: magic - $(top_builddir)/file -C -m $(srcdir)/magic + $(top_builddir)/src/file -C -m $(srcdir)/magic magic.mime.mgc: magic.mime - $(top_builddir)/file -C -m $(srcdir)/magic.mime + $(top_builddir)/src/file -C -m $(srcdir)/magic.mime magic_FRAGMENTS = \ Magdir/acorn \ @@ -40,12 +40,15 @@ Magdir/archive \ Magdir/asterix \ Magdir/att3b \ Magdir/audio \ +Magdir/bFLT \ Magdir/blender \ Magdir/blit \ +Magdir/bout \ Magdir/bsdi \ Magdir/c-lang \ Magdir/cddb \ Magdir/chi \ +Magdir/chord \ Magdir/cisco \ Magdir/citrus \ Magdir/claris \ @@ -77,13 +80,14 @@ Magdir/gimp \ Magdir/gnu \ Magdir/grace \ Magdir/gringotts \ +Magdir/hdf \ Magdir/hitachi-sh \ Magdir/hp \ +Magdir/human68k \ Magdir/ibm370 \ Magdir/ibm6000 \ Magdir/iff \ Magdir/images \ -Magdir/impulse \ Magdir/intel \ Magdir/interleaf \ Magdir/island \ @@ -107,8 +111,8 @@ Magdir/mime \ Magdir/mips \ Magdir/mirage \ Magdir/mkid \ -Magdir/mmdf \ Magdir/mlssa \ +Magdir/mmdf \ Magdir/modem \ Magdir/motorola \ Magdir/msdos \ @@ -153,6 +157,7 @@ Magdir/smalltalk \ Magdir/sniffer \ Magdir/softquad \ Magdir/spectrum \ +Magdir/sql \ Magdir/sun \ Magdir/sysex \ Magdir/teapot \ diff --git a/file/src/file.c b/file/src/file.c index 0abcaab92..22259f360 100644 --- a/file/src/file.c +++ b/file/src/file.c @@ -53,7 +53,7 @@ int os2_apptype (const char *fn, char *buf, int nb); /*@unchecked@*/ static int nobuffer = 0; /* Don't buffer stdout */ -/*@unchecked@*/ +/*@unchecked@*/ /*@observer@*/ static const char * default_separator = ":"; /* @@ -161,10 +161,10 @@ help(void) int main(int argc, char **argv) /*@globals global_fmagic, nobuffer, - default_magicfile, optind, + default_magicfile, default_separator, optind, fileSystem, internalState @*/ /*@modifies global_fmagic, nobuffer, - default_magicfile, optind, + default_magicfile, default_separator, optind, fileSystem, internalState @*/ { int xx; @@ -273,8 +273,10 @@ main(int argc, char **argv) ++didsomefiles; /*@switchbreak@*/ break; case 'F': +/*@-assignexpose@*/ fm->separator = optarg; - break; +/*@=assignexpose@*/ + /*@switchbreak@*/ break; case 'i': fm->flags |= FMAGIC_FLAGS_MIME; mime = malloc(strlen(fm->magicfile) + sizeof(".mime")); diff --git a/file/src/file.h b/file/src/file.h index 2cd0b4776..f7166801f 100644 --- a/file/src/file.h +++ b/file/src/file.h @@ -178,6 +178,7 @@ struct fmagic_s { int flags; /*!< bit(s) to control fmagic behavior. */ /*@dependent@*/ /*@observer@*/ /*@relnull@*/ const char *magicfile; /*!< name of the magic file */ +/*@dependent@*/ /*@observer@*/ const char *separator; /*!< file name/type separator (default ":" */ int lineno; /*!< current line number in magic file */ /*@relnull@*/ diff --git a/file/src/magic.c b/file/src/magic.c new file mode 100644 index 000000000..e9154c4c7 --- /dev/null +++ b/file/src/magic.c @@ -0,0 +1,293 @@ +/* + * Copyright (c) Christos Zoulas 2003. + * All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice immediately at the beginning of the file, without modification, + * this list of conditions, and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include "magic.h" +#include "file.h" + +#include <stdio.h> +#include <stdlib.h> +#include <unistd.h> +#include <string.h> +#include <sys/types.h> +#include <sys/param.h> /* for MAXPATHLEN */ +#include <sys/stat.h> +#include <fcntl.h> /* for open() */ +#ifdef QUICK +#include <sys/mman.h> +#endif +#ifdef RESTORE_TIME +# if (__COHERENT__ >= 0x420) +# include <sys/utime.h> +# else +# ifdef USE_UTIMES +# include <sys/time.h> +# else +# include <utime.h> +# endif +# endif +#endif +#ifdef HAVE_UNISTD_H +#include <unistd.h> /* for read() */ +#endif +#ifdef HAVE_LOCALE_H +#include <locale.h> +#endif + +#include <netinet/in.h> /* for byte swapping */ + +#include "patchlevel.h" + +#ifndef lint +FILE_RCSID("@(#)$Id: magic.c,v 1.6 2003/03/26 15:35:30 christos Exp $") +#endif /* lint */ + +#ifdef __EMX__ +private char *apptypeName = NULL; +protected int file_os2_apptype(struct magic_set *ms, const char *fn, + const void *buf, size_t nb); +#endif /* __EMX__ */ + +#ifndef MAGIC +# define MAGIC "/etc/magic" +#endif + +private void free_mlist(struct mlist *); + +public struct magic_set * +magic_open(int flags) +{ + struct magic_set *ms; + + if ((ms = malloc(sizeof(struct magic_set))) == NULL) + return NULL; + ms->o.ptr = ms->o.buf = malloc(ms->o.size = 1024); + ms->o.len = 0; + if (ms->o.buf == NULL) { + free(ms); + return NULL; + } + ms->c.off = malloc((ms->c.len = 10) * sizeof(*ms->c.off)); + if (ms->c.off == NULL) { + free(ms->o.buf); + free(ms); + return NULL; + } + ms->flags = flags; + ms->haderr = 0; + return ms; +} + +/* + * load a magic file + */ +public int +magic_load(struct magic_set *ms, const char *magicfile) +{ + struct mlist *ml; + + if (magicfile == NULL) + magicfile = (ms->flags & MAGIC_MIME) ? MAGIC ".mime" : MAGIC; + + ml = file_apprentice(ms, magicfile, 0); + if (ml == NULL) + return -1; + ms->mlist = ml; + return 0; +} + +private void +free_mlist(struct mlist *mlist) +{ + struct mlist *ml; + + if (mlist == NULL) + return; + + for (ml = mlist->next; ml != mlist;) { + struct mlist *next = ml->next; + struct magic *mg = ml->magic; + switch (ml->mapped) { + case 0: + free(mg); + break; + case 1: + mg--; + free(mg); + break; + case 2: + mg--; + (void)munmap(mg, sizeof(*mg) * (ml->nmagic + 1)); + break; + } + free(ml); + ml = next; + } + free(ml); +} + +public void +magic_close(ms) + struct magic_set *ms; +{ + free_mlist(ms->mlist); + free(ms->o.buf); + free(ms->c.off); + free(ms); +} + +public int +magic_compile(struct magic_set *ms, const char *magicfile) +{ + struct mlist *ml = file_apprentice(ms, magicfile, FILE_COMPILE); + if(ml == NULL) + return -1; + free_mlist(ml); + return ml ? 0 : -1; +} + +public int +magic_check(struct magic_set *ms, const char *magicfile) +{ + struct mlist *ml = file_apprentice(ms, magicfile, FILE_CHECK); + if(ml == NULL) + return -1; + free_mlist(ml); + return ml ? 0 : -1; +} + +/* + * find type of named file + */ +public const char * +magic_file(struct magic_set *ms, const char *inname) +{ + int fd = 0; + unsigned char buf[HOWMANY+1]; /* one extra for terminating '\0' */ + struct stat sb; + int nbytes = 0; /* number of bytes read from a datafile */ + + if (file_reset(ms) == -1) + return NULL; + + switch (file_fsmagic(ms, inname, &sb)) { + case -1: + return NULL; + case 0: + break; + default: + return ms->o.buf; + } + +#ifndef STDIN_FILENO +#define STDIN_FILENO 0 +#endif + if (inname == NULL) + fd = STDIN_FILENO; + else if ((fd = open(inname, O_RDONLY)) < 0) { + /* We can't open it, but we were able to stat it. */ + if (sb.st_mode & 0002) + if (file_printf(ms, "writable, ") == -1) + return NULL; + if (sb.st_mode & 0111) + if (file_printf(ms, "executable, ") == -1) + return NULL; + return ms->o.buf; + } + + /* + * try looking at the first HOWMANY bytes + */ + if ((nbytes = read(fd, (char *)buf, HOWMANY)) == -1) { + file_error(ms, "Cannot read `%s' %s", inname, strerror(errno)); + return NULL; + } + + if (nbytes == 0) { + if (file_printf(ms, (ms->flags & MAGIC_MIME) ? + "application/x-empty" : "empty") == -1) + return NULL; + } else { + buf[nbytes++] = '\0'; /* null-terminate it */ +#ifdef __EMX__ + switch (file_os2_apptype(ms, inname, buf, nbytes)) { + case -1: + return NULL; + case 0: + break; + default: + return ms->o.buf; + } +#endif + if (file_buffer(ms, buf, (size_t)nbytes) == -1) + return NULL; +#ifdef BUILTIN_ELF + if (nbytes > 5) { + /* + * We matched something in the file, so this *might* + * be an ELF file, and the file is at least 5 bytes + * long, so if it's an ELF file it has at least one + * byte past the ELF magic number - try extracting + * information from the ELF headers that can't easily + * be extracted with rules in the magic file. + */ + file_tryelf(ms, fd, buf, (size_t)nbytes); + } +#endif + } + + return ms->haderr ? NULL : ms->o.buf; +} + + +public const char * +magic_buffer(struct magic_set *ms, const void *buf, size_t nb) +{ + if (file_reset(ms) == -1) + return NULL; + /* + * The main work is done here! + * We have the file name and/or the data buffer to be identified. + */ + if (file_buffer(ms, buf, nb) == -1) { + return NULL; + } + return ms->haderr ? NULL : ms->o.buf; +} + +public const char * +magic_error(struct magic_set *ms) +{ + return ms->haderr ? ms->o.buf : NULL; +} + +public void +magic_setflags(struct magic_set *ms, int flags) +{ + ms->flags = flags; +} diff --git a/file/src/magic.h b/file/src/magic.h new file mode 100644 index 000000000..9110df11f --- /dev/null +++ b/file/src/magic.h @@ -0,0 +1,58 @@ +/* + * Copyright (c) Christos Zoulas 2003. + * All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice immediately at the beginning of the file, without modification, + * this list of conditions, and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#ifndef _MAGIC_H +#define _MAGIC_H + +#include <sys/types.h> + +#define MAGIC_NONE 0x00 /* No flags */ +#define MAGIC_DEBUG 0x01 /* Turn on debugging */ +#define MAGIC_SYMLINK 0x02 /* Follow symlinks */ +#define MAGIC_COMPRESS 0x04 /* Check inside compressed files */ +#define MAGIC_DEVICES 0x08 /* Look at the contents of devices */ +#define MAGIC_MIME 0x10 /* Return a mime string */ +#define MAGIC_CONTINUE 0x20 /* Return all matches, not just the first */ +#define MAGIC_CHECK 0x40 /* Print warnings to stderr */ + +typedef struct magic_set *magic_t; + +magic_t magic_open(int flags); +void magic_close(magic_t); + +const char *magic_file(magic_t, const char *); +const char *magic_buffer(magic_t, const void *, size_t); + +const char *magic_error(magic_t); +void magic_setflags(magic_t, int); + +int magic_load(magic_t, const char *); +int magic_compile(magic_t, const char *); +int magic_check(magic_t, const char *); + +#endif diff --git a/file/src/names.h b/file/src/names.h index 1da9f49b7..780c22500 100644 --- a/file/src/names.h +++ b/file/src/names.h @@ -1,16 +1,43 @@ /* + * Copyright (c) Ian F. Darwin 1986-1995. + * Software written by Ian F. Darwin and others; + * maintained 1995-present by Christos Zoulas and others. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice immediately at the beginning of the file, without modification, + * this list of conditions, and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Ian F. Darwin and others. + * 4. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +/* * Names.h - names and types used by ascmagic in file(1). * These tokens are here because they can appear anywhere in * the first HOWMANY bytes, while tokens in MAGIC must * appear at fixed offsets into the file. Don't make HOWMANY * too high unless you have a very fast CPU. * - * Copyright (c) Ian F. Darwin, 1987. - * Written by Ian F. Darwin. - * - * See LEGAL.NOTICE - * - * Id: names.h,v 1.19 2002/05/16 15:01:41 christos Exp + * Id: names.h,v 1.21 2003/03/23 21:16:26 christos Exp */ /* @@ -37,9 +64,9 @@ /*@unchecked@*/ /*@unused@*/ /*@observer@*/ static const struct { /*@observer@*/ /*@null@*/ - char *human; + const char *human; /*@observer@*/ /*@null@*/ - char *mime; + const char *mime; } types[] = { { "C program", "text/x-c", }, { "C++ program", "text/x-c++" }, diff --git a/lib/package.c b/lib/package.c index e2da6adb2..273b6df94 100644 --- a/lib/package.c +++ b/lib/package.c @@ -731,7 +731,7 @@ exit: } /*@-bounds@*/ /* LCL: segfault */ -int rpmReadPackageFile(rpmts ts, FD_t fd, const char * fn, Header * hdrp) +rpmRC rpmReadPackageFile(rpmts ts, FD_t fd, const char * fn, Header * hdrp) { pgpDig dig; byte buf[8*BUFSIZ]; @@ -751,27 +751,31 @@ int rpmReadPackageFile(rpmts ts, FD_t fd, const char * fn, Header * hdrp) int i; if (hdrp) *hdrp = NULL; + +#ifdef DYING { struct stat st; /*@-boundswrite@*/ memset(&st, 0, sizeof(st)); /*@=boundswrite@*/ (void) fstat(Fileno(fd), &st); /* if fd points to a socket, pipe, etc, st.st_size is *always* zero */ - if (S_ISREG(st.st_mode) && st.st_size < sizeof(*l)) + if (S_ISREG(st.st_mode) && st.st_size < sizeof(*l)) { + rc = RPMRC_NOTFOUND; goto exit; + } } +#endif memset(l, 0, sizeof(*l)); rc = readLead(fd, l); - if (rc != RPMRC_OK) { - rc = RPMRC_NOTFOUND; + if (rc != RPMRC_OK) goto exit; - } switch (l->major) { case 1: rpmError(RPMERR_NEWPACKAGE, _("packaging version 1 is not supported by this version of RPM\n")); + rc = RPMRC_NOTFOUND; goto exit; /*@notreached@*/ break; case 2: @@ -781,6 +785,7 @@ int rpmReadPackageFile(rpmts ts, FD_t fd, const char * fn, Header * hdrp) default: rpmError(RPMERR_NEWPACKAGE, _("only packaging with major numbers <= 4 " "is supported by this version of RPM\n")); + rc = RPMRC_NOTFOUND; goto exit; /*@notreached@*/ break; } @@ -242,14 +242,14 @@ rpmRC rpmInstallSourcePackage(rpmts ts, FD_t fd, struct rpmpsm_s psmbuf; rpmpsm psm = &psmbuf; int isSource; - rpmRC rc; + rpmRC rpmrc; int i; memset(psm, 0, sizeof(*psm)); psm->ts = rpmtsLink(ts, "InstallSourcePackage"); - rc = rpmReadPackageFile(ts, fd, "InstallSourcePackage", &h); - switch (rc) { + rpmrc = rpmReadPackageFile(ts, fd, "InstallSourcePackage", &h); + switch (rpmrc) { case RPMRC_NOTTRUSTED: case RPMRC_NOKEY: case RPMRC_OK: @@ -261,13 +261,13 @@ rpmRC rpmInstallSourcePackage(rpmts ts, FD_t fd, if (h == NULL) goto exit; - rc = RPMRC_OK; + rpmrc = RPMRC_OK; isSource = headerIsEntry(h, RPMTAG_SOURCEPACKAGE); if (!isSource) { rpmError(RPMERR_NOTSRPM, _("source package expected, binary found\n")); - rc = RPMRC_FAIL; + rpmrc = RPMRC_FAIL; goto exit; } @@ -277,7 +277,7 @@ rpmRC rpmInstallSourcePackage(rpmts ts, FD_t fd, h = headerFree(h); if (fi == NULL) { /* XXX can't happen */ - rc = RPMRC_FAIL; + rpmrc = RPMRC_FAIL; goto exit; } @@ -285,7 +285,7 @@ rpmRC rpmInstallSourcePackage(rpmts ts, FD_t fd, fi->te = rpmtsElement(ts, 0); /*@=onlytrans@*/ if (fi->te == NULL) { /* XXX can't happen */ - rc = RPMRC_FAIL; + rpmrc = RPMRC_FAIL; goto exit; } @@ -351,16 +351,16 @@ rpmRC rpmInstallSourcePackage(rpmts ts, FD_t fd, } _sourcedir = rpmGenPath(rpmtsRootDir(ts), "%{_sourcedir}", ""); - rc = rpmMkdirPath(_sourcedir, "sourcedir"); - if (rc) { - rc = RPMRC_FAIL; + rpmrc = rpmMkdirPath(_sourcedir, "sourcedir"); + if (rpmrc) { + rpmrc = RPMRC_FAIL; goto exit; } _specdir = rpmGenPath(rpmtsRootDir(ts), "%{_specdir}", ""); - rc = rpmMkdirPath(_specdir, "specdir"); - if (rc) { - rc = RPMRC_FAIL; + rpmrc = rpmMkdirPath(_specdir, "specdir"); + if (rpmrc) { + rpmrc = RPMRC_FAIL; goto exit; } @@ -392,22 +392,22 @@ rpmRC rpmInstallSourcePackage(rpmts ts, FD_t fd, specFile = t; } else { rpmError(RPMERR_NOSPEC, _("source package contains no .spec file\n")); - rc = RPMRC_FAIL; + rpmrc = RPMRC_FAIL; goto exit; } psm->goal = PSM_PKGINSTALL; /*@-compmempass@*/ /* FIX: psm->fi->dnl should be owned. */ - rc = rpmpsmStage(psm, PSM_PROCESS); + rpmrc = rpmpsmStage(psm, PSM_PROCESS); (void) rpmpsmStage(psm, PSM_FINI); /*@=compmempass@*/ - if (rc) rc = RPMRC_FAIL; + if (rpmrc) rpmrc = RPMRC_FAIL; exit: - if (specFilePtr && specFile && rc == RPMRC_OK) + if (specFilePtr && specFile && rpmrc == RPMRC_OK) *specFilePtr = specFile; else specFile = _free(specFile); @@ -436,7 +436,7 @@ exit: psm->ts = rpmtsFree(psm->ts); - return rc; + return rpmrc; } /*@observer@*/ /*@unchecked@*/ diff --git a/lib/rpmlead.c b/lib/rpmlead.c index a679334c3..3f78b6477 100644 --- a/lib/rpmlead.c +++ b/lib/rpmlead.c @@ -52,20 +52,23 @@ rpmRC readLead(FD_t fd, struct rpmlead *lead) /*@=boundswrite@*/ /*@-type@*/ /* FIX: remove timed read */ if (timedRead(fd, (char *)lead, sizeof(*lead)) != sizeof(*lead)) { - rpmError(RPMERR_READ, _("read failed: %s (%d)\n"), Fstrerror(fd), - errno); - return RPMRC_FAIL; + if (Ferror(fd)) { + rpmError(RPMERR_READ, _("read failed: %s (%d)\n"), + Fstrerror(fd), errno); + return RPMRC_FAIL; + } + return RPMRC_NOTFOUND; } /*@=type@*/ if (memcmp(lead->magic, lead_magic, sizeof(lead_magic))) - return RPMRC_FAIL; + return RPMRC_NOTFOUND; lead->type = ntohs(lead->type); lead->archnum = ntohs(lead->archnum); lead->osnum = ntohs(lead->osnum); lead->signature_type = ntohs(lead->signature_type); if (lead->signature_type != RPMSIGTYPE_HEADERSIG) - return RPMRC_FAIL; + return RPMRC_NOTFOUND; return RPMRC_OK; } diff --git a/lib/rpmlead.h b/lib/rpmlead.h index 48cb6f479..be8e1a67c 100644 --- a/lib/rpmlead.h +++ b/lib/rpmlead.h @@ -12,8 +12,8 @@ extern "C" { /** \ingroup lead * Write lead to file handle. * @param fd file handle - * @param lead data address - * @return 0 on success + * @param lead package lead + * @return RPMRC_OK on success, RPMRC_FAIL on error */ rpmRC writeLead(FD_t fd, const struct rpmlead *lead) /*@globals fileSystem @*/ @@ -22,8 +22,8 @@ rpmRC writeLead(FD_t fd, const struct rpmlead *lead) /** \ingroup lead * Read lead from file handle. * @param fd file handle - * @retval lead data address - * @return 0 on success + * @retval lead package lead + * @return RPMRC_OK on success, RPMRC_FAIL/RPMRC_NOTFOUND on error */ rpmRC readLead(FD_t fd, /*@out@*/ struct rpmlead *lead) /*@modifies fd, *lead @*/; diff --git a/lib/rpmlib.h b/lib/rpmlib.h index e2fc8517b..a5c5b6e81 100644 --- a/lib/rpmlib.h +++ b/lib/rpmlib.h @@ -893,9 +893,9 @@ rpmRC rpmReadHeader(rpmts ts, FD_t fd, /*@out@*/ Header *hdrp, * @param fd file handle * @param fn file name * @retval hdrp address of header (or NULL) - * @return 0 on success + * @return RPMRC_OK on success */ -int rpmReadPackageFile(rpmts ts, FD_t fd, +rpmRC rpmReadPackageFile(rpmts ts, FD_t fd, const char * fn, /*@null@*/ /*@out@*/ Header * hdrp) /*@globals rpmGlobalMacroContext, fileSystem, internalState @*/ /*@modifies ts, fd, *hdrp, rpmGlobalMacroContext, diff --git a/python/rpmts-py.c b/python/rpmts-py.c index 1b9abce61..bc3aecfb9 100644 --- a/python/rpmts-py.c +++ b/python/rpmts-py.c @@ -752,11 +752,6 @@ fprintf(stderr, "*** rpmts_HdrFromFdno(%p) ts %p rc %d\n", s, s->ts, rpmrc); h = headerFree(h); /* XXX ref held by result */ break; - case RPMRC_NOTFOUND: - Py_INCREF(Py_None); - result = Py_None; - break; - case RPMRC_NOKEY: PyErr_SetString(pyrpmError, "public key not available"); break; @@ -765,6 +760,7 @@ fprintf(stderr, "*** rpmts_HdrFromFdno(%p) ts %p rc %d\n", s, s->ts, rpmrc); PyErr_SetString(pyrpmError, "public key not trusted"); break; + case RPMRC_NOTFOUND: case RPMRC_FAIL: default: PyErr_SetString(pyrpmError, "error reading package header"); diff --git a/rpmio/Makefile.am b/rpmio/Makefile.am index 72e18c67f..adeee1c25 100644 --- a/rpmio/Makefile.am +++ b/rpmio/Makefile.am @@ -31,7 +31,7 @@ librpmio_la_SOURCES = \ rpmio.c rpmlog.c rpmmalloc.c \ rpmpgp.c rpmrpc.c rpmsq.c rpmsw.c strcasecmp.c stubs.c url.c ugid.c librpmio_la_LDFLAGS = -release @VERSION@ $(LDFLAGS) \ - $(top_builddir)/file/libfmagic.la \ + $(top_builddir)/file/src/libfmagic.la \ @WITH_ZLIB_LIB@ \ -lrt -lpthread librpmio_la_LIBADD = $(BEECRYPTLOBJS) diff --git a/tools/Makefile.am b/tools/Makefile.am index 53dbf69cd..c544162a7 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -11,7 +11,7 @@ INCLUDES = -I. \ -I$(top_srcdir)/popt \ @WITH_LIBELF_INCLUDE@ \ @WITH_LIBDWARF_INCLUDE@ \ - -I$(top_srcdir)/file \ + -I$(top_srcdir)/file/src \ @INCPATH@ \ -I$(top_srcdir)/misc @@ -48,7 +48,7 @@ rpmdeps_SOURCES = rpmdeps.c rpmdeps_LDADD = $(top_builddir)/build/librpmbuild.la #rpmdeps_LDFLAGS = $(staticLDFLAGS) -rpmfile.c: $(top_builddir)/file/file.c +rpmfile.c: $(top_builddir)/file/src/file.c rm -f $@ ln -s $< $@ diff --git a/tools/rpmcache.c b/tools/rpmcache.c index 820e0aafc..9a4b150fb 100644 --- a/tools/rpmcache.c +++ b/tools/rpmcache.c @@ -192,7 +192,7 @@ static int ftsStashLatest(FTSENT * fts, rpmts ts) /* Read header from file. */ { FD_t fd = Fopen(fts->fts_accpath, "r"); - rpmRC rc; + rpmRC rpmrc; int xx; if (fd == NULL || Ferror(fd)) { @@ -200,9 +200,9 @@ static int ftsStashLatest(FTSENT * fts, rpmts ts) goto exit; } - rc = rpmReadPackageFile(ts, fd, fts->fts_path, &h); + rpmrc = rpmReadPackageFile(ts, fd, fts->fts_path, &h); xx = Fclose(fd); - if (rc != RPMRC_OK || h == NULL) + if (rpmrc != RPMRC_OK || h == NULL) goto exit; } diff --git a/tools/rpmsort.c b/tools/rpmsort.c index f13d24f60..4fa605630 100644 --- a/tools/rpmsort.c +++ b/tools/rpmsort.c @@ -163,18 +163,13 @@ restart: rc = rpmReadPackageFile(ts, fd, *fnp, &h); Fclose(fd); - if (rc == 2) { - numFailed++; *fnp = NULL; - continue; - } - - if (rc == 0) { + if (rc == RPMRC_OK) { rc = rpmtsAddInstallElement(ts, h, (fnpyKey)fileName, 0, NULL); h = headerFree(h); continue; } - if (rc != 1) { + if (rc != RPMRC_NOTFOUND) { rpmMessage(RPMMESS_ERROR, _("%s cannot be installed\n"), *fnp); numFailed++; *fnp = NULL; break; |