Go to the documentation of this file.00001
00005 #include "system.h"
00006
00007 #include <rpmio_internal.h>
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
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
00031 else if (S_ISSOCK(mode))
00032 perms[0] = 's';
00033
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
00086 if ((f = (FILE *) fdGetFp(xfd)) == NULL) {
00087
00088 rpmrc = RPMRC_NOTFOUND;
00089 goto exit;
00090 }
00091
00092 while (1) {
00093 char line[BUFSIZ];
00094
00095
00096 s = fgets(line, sizeof(line) - 1, f);
00097 if (s == NULL) {
00098
00099 break;
00100 }
00101
00102
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
00110 if ((se = strchr(s, '#')) != NULL) *se = '\0';
00111
00112
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
00121 if (*s < 32) {
00122 rpmrc = RPMRC_FAIL;
00123 goto exit;
00124 }
00125
00126
00127 *se++ = ' ';
00128 *se = '\0';
00129 appendStringBuf(sb, s);
00130 }
00131
00132 if (s == NULL)
00133 s = getStringBuf(sb);
00134
00135 if (!(s && *s)) {
00136 rpmrc = RPMRC_FAIL;
00137 goto exit;
00138 }
00139
00140
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
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
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
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 av[i] = _free(av[i]);
00193 av = _free(av);
00194 }
00195 sb = freeStringBuf(sb);
00196
00197 return rpmrc;
00198
00199 }