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

Generated on Mon Nov 29 2010 05:18:43 for rpm by  doxygen 1.7.2