rpm 5.2.1

- Main Page
- Related Pages
- Modules
- Data Structures
- Files

- File List
- Globals

lib/manifest.c
Go to the documentation of this file.

    00001
    00005 #include "system.h"
    00006
    00007 #include <rpmio_internal.h>     /* XXX fdGetFp */
    00008 #include <rpmlog.h>
    00009 #include <rpmmacro.h>
    00010
    00011 #include <rpmtypes.h>
    00012 #include "manifest.h"
    00013 #include "debug.h"
    00014
    00015 char * rpmPermsString(int mode)
    00016 {
    00017     char *perms = xstrdup("----------");
    00018
    00019     if (S_ISREG(mode))
    00020         perms[0] = '-';
    00021     else if (S_ISDIR(mode))
    00022         perms[0] = 'd';
    00023     else if (S_ISLNK(mode))
    00024         perms[0] = 'l';
    00025     else if (S_ISFIFO(mode))
    00026         perms[0] = 'p';
    00027     /*@-unrecog@*/
    00028     else if (S_ISSOCK(mode))
    00029         perms[0] = 's';
    00030     /*@=unrecog@*/
    00031     else if (S_ISCHR(mode))
    00032         perms[0] = 'c';
    00033     else if (S_ISBLK(mode))
    00034         perms[0] = 'b';
    00035     else
    00036         perms[0] = '?';
    00037
    00038     if (mode & S_IRUSR) perms[1] = 'r';
    00039     if (mode & S_IWUSR) perms[2] = 'w';
    00040     if (mode & S_IXUSR) perms[3] = 'x';
    00041
    00042     if (mode & S_IRGRP) perms[4] = 'r';
    00043     if (mode & S_IWGRP) perms[5] = 'w';
    00044     if (mode & S_IXGRP) perms[6] = 'x';
    00045
    00046     if (mode & S_IROTH) perms[7] = 'r';
    00047     if (mode & S_IWOTH) perms[8] = 'w';
    00048     if (mode & S_IXOTH) perms[9] = 'x';
    00049
    00050     if (mode & S_ISUID)
    00051         perms[3] = ((mode & S_IXUSR) ? 's' : 'S');
    00052
    00053     if (mode & S_ISGID)
    00054         perms[6] = ((mode & S_IXGRP) ? 's' : 'S');
    00055
    00056     if (mode & S_ISVTX)
    00057         perms[9] = ((mode & S_IXOTH) ? 't' : 'T');
    00058
    00059     return perms;
    00060 }
    00061
    00063 rpmRC rpmReadPackageManifest(FD_t fd, int * argcPtr, const char *** argvPtr)
    00064 {
    00065     rpmiob iob = rpmiobNew(0);
    00066     char * s = NULL;
    00067     char * se;
    00068     int ac = 0;
    00069     const char ** av = NULL;
    00070     int argc = (argcPtr ? *argcPtr : 0);
    00071     const char ** argv = (argvPtr ? *argvPtr : NULL);
    00072     FD_t xfd;
    00073     FILE * f;
    00074     rpmRC rpmrc = RPMRC_OK;
    00075     int i, j, next, npre;
    00076
    00077     if (fdGetFp(fd) == NULL)
    00078         xfd = Fdopen(fd, "r.fpio");
    00079     else
    00080         xfd = fd;
    00081
    00082 /*@+voidabstract@*/
    00083     if ((f = (FILE *) fdGetFp(xfd)) == NULL) {
    00084 /*@=voidabstract@*/
    00085         rpmrc = RPMRC_NOTFOUND;
    00086         goto exit;
    00087     }
    00088
    00089     while (1) {
    00090         char line[BUFSIZ];
    00091
    00092         /* Read next line. */
    00093         s = fgets(line, sizeof(line) - 1, f);
    00094         if (s == NULL) {
    00095             if (Ferror(xfd))
    00096                 rpmlog(RPMLOG_ERR, _("reading %s manifest failed: %s\n"),
    00097                         fdGetOPath(xfd), Fstrerror(xfd));
    00098             break;
    00099         }
    00100
    00101         /* XXX stop processing manifest if HTML is found. */
    00102 #define DOCTYPE_HTML_PUBLIC     "<!DOCTYPE HTML PUBLIC"
    00103         if (!strncmp(line, DOCTYPE_HTML_PUBLIC, sizeof(DOCTYPE_HTML_PUBLIC)-1)) {
    00104             rpmrc = RPMRC_NOTFOUND;
    00105             goto exit;
    00106         }
    00107
    00108         /* Skip comments. */
    00109         if ((se = strchr(s, '#')) != NULL) *se = '\0';
    00110
    00111         /* Trim white space. */
    00112         se = s + strlen(s);
    00113         while (se > s && (se[-1] == '\n' || se[-1] == '\r'))
    00114             *(--se) = '\0';
    00115         while (*s && strchr(" \f\n\r\t\v", *s) != NULL)
    00116             s++;
    00117         if (*s == '\0') continue;
    00118
    00119         /* Insure that file contains only ASCII */
    00120         if (*s < 32) {
    00121             rpmlog(RPMLOG_ERR, _("reading %s manifest, non-printable characters found\n"),
    00122                 fdGetOPath(xfd));
    00123
    00124             rpmrc = RPMRC_FAIL; /* XXX reject non-printable manifests. */
    00125             goto exit;
    00126         }
    00127
    00128         /* Concatenate next line in buffer. */
    00129         *se++ = ' ';
    00130         *se = '\0';
    00131         iob = rpmiobAppend(iob, s, 0);
    00132     }
    00133
    00134     if (s == NULL)              /* XXX always true */
    00135         s = rpmiobStr(iob);
    00136
    00137     if (!(s && *s)) {
    00138         rpmrc = RPMRC_FAIL;     /* XXX force manifests to have content. */
    00139         goto exit;
    00140     }
    00141
    00142     /* Glob manifest items. */
    00143     rpmrc = rpmGlob(s, &ac, &av);
    00144     if (rpmrc != RPMRC_OK) goto exit;
    00145
    00146     rpmlog(RPMLOG_DEBUG, D_("adding %d args from manifest.\n"), ac);
    00147
    00148     /* Count non-NULL args, keeping track of 1st arg after last NULL. */
    00149     npre = 0;
    00150     next = 0;
    00151     if (argv != NULL)
    00152     for (i = 0; i < argc; i++) {
    00153         if (argv[i] != NULL)
    00154             npre++;
    00155         else if (i >= next)
    00156             next = i + 1;
    00157     }
    00158
    00159     /* Copy old arg list, inserting manifest before argv[next]. */
    00160     if (argv != NULL) {
    00161         int nac = npre + ac;
    00162         const char ** nav = xcalloc((nac + 1), sizeof(*nav));
    00163
    00164         for (i = 0, j = 0; i < next; i++) {
    00165             if (argv[i] != NULL)
    00166                 nav[j++] = argv[i];
    00167         }
    00168
    00169         if (ac)
    00170             memcpy(nav + j, av, ac * sizeof(*nav));
    00171         if ((argc - next) > 0)
    00172             memcpy(nav + j + ac, argv + next, (argc - next) * sizeof(*nav));
    00173         nav[nac] = NULL;
    00174
    00175         if (argvPtr)
    00176             *argvPtr = argv = _free(argv);
    00177         av = _free(av);
    00178         av = nav;
    00179         ac = nac;
    00180     }
    00181
    00182     /* Save new argc/argv list. */
    00183     if (argvPtr) {
    00184         *argvPtr = _free(*argvPtr);
    00185         *argvPtr = av;
    00186     }
    00187     if (argcPtr)
    00188         *argcPtr = ac;
    00189
    00190 exit:
    00191     if (argvPtr == NULL || (rpmrc != RPMRC_OK && av)) {
    00192         if (av)
    00193         for (i = 0; i < ac; i++)
    00194             /*@-unqualifiedtrans@*/av[i] = _free(av[i]); /*@=unqualifiedtrans@*/
    00195         /*@-dependenttrans@*/ av = _free(av); /*@=dependenttrans@*/
    00196     }
    00197     iob = rpmiobFree(iob);
    00198 /*@-nullstate@*/ /* FIX: *argvPtr may be NULL. */
    00199     return rpmrc;
    00200 /*@=nullstate@*/
    00201 }