diff options
author | Kim Kibum <kb0929.kim@samsung.com> | 2012-05-21 17:49:08 +0900 |
---|---|---|
committer | Kim Kibum <kb0929.kim@samsung.com> | 2012-05-21 17:49:08 +0900 |
commit | dec48cfa66e17ba4a7e50c92cb24b913289feb12 (patch) | |
tree | e1f48cd5cabb40a1d604b36949ff072d01267cb5 /lib/manifest.c | |
parent | b7a3bffb8e0341b7e4ef69def268bca3a7f279ff (diff) | |
download | rpm-dec48cfa66e17ba4a7e50c92cb24b913289feb12.tar.gz rpm-dec48cfa66e17ba4a7e50c92cb24b913289feb12.tar.bz2 rpm-dec48cfa66e17ba4a7e50c92cb24b913289feb12.zip |
Upload Tizen:Base source
Diffstat (limited to 'lib/manifest.c')
-rw-r--r-- | lib/manifest.c | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/lib/manifest.c b/lib/manifest.c new file mode 100644 index 0000000..5d71f3f --- /dev/null +++ b/lib/manifest.c @@ -0,0 +1,175 @@ +/** \ingroup rpmcli + * \file lib/manifest.c + */ + +#include "system.h" + +#include <rpm/rpmlog.h> +#include <rpm/rpmfileutil.h> +#include <rpm/argv.h> + +#include "lib/manifest.h" + +#include "debug.h" + + +char * rpmPermsString(int mode) +{ + char *perms = xstrdup("----------"); + + if (S_ISREG(mode)) + perms[0] = '-'; + else if (S_ISDIR(mode)) + perms[0] = 'd'; + else if (S_ISLNK(mode)) + perms[0] = 'l'; + else if (S_ISFIFO(mode)) + perms[0] = 'p'; + else if (S_ISSOCK(mode)) + perms[0] = 's'; + else if (S_ISCHR(mode)) + perms[0] = 'c'; + else if (S_ISBLK(mode)) + perms[0] = 'b'; + else + perms[0] = '?'; + + if (mode & S_IRUSR) perms[1] = 'r'; + if (mode & S_IWUSR) perms[2] = 'w'; + if (mode & S_IXUSR) perms[3] = 'x'; + + if (mode & S_IRGRP) perms[4] = 'r'; + if (mode & S_IWGRP) perms[5] = 'w'; + if (mode & S_IXGRP) perms[6] = 'x'; + + if (mode & S_IROTH) perms[7] = 'r'; + if (mode & S_IWOTH) perms[8] = 'w'; + if (mode & S_IXOTH) perms[9] = 'x'; + + if (mode & S_ISUID) + perms[3] = ((mode & S_IXUSR) ? 's' : 'S'); + + if (mode & S_ISGID) + perms[6] = ((mode & S_IXGRP) ? 's' : 'S'); + + if (mode & S_ISVTX) + perms[9] = ((mode & S_IXOTH) ? 't' : 'T'); + + return perms; +} + +/**@todo Infinite loops through manifest files exist, operator error for now. */ +rpmRC rpmReadPackageManifest(FD_t fd, int * argcPtr, char *** argvPtr) +{ + ARGV_t sb = NULL; + char * s = NULL; + char * se; + int ac = 0; + char ** av = NULL; + int argc = (argcPtr ? *argcPtr : 0); + char ** argv = (argvPtr ? *argvPtr : NULL); + FILE * f = fdopen(Fileno(fd), "r"); + rpmRC rpmrc = RPMRC_OK; + int i, j, next, npre; + + if (f != NULL) + while (1) { + char line[BUFSIZ]; + + /* Read next line. */ + s = fgets(line, sizeof(line) - 1, f); + if (s == NULL) { + /* XXX Ferror check needed */ + break; + } + + /* Skip comments. */ + if ((se = strchr(s, '#')) != NULL) *se = '\0'; + + /* Trim white space. */ + se = s + strlen(s); + while (se > s && (se[-1] == '\n' || se[-1] == '\r')) + *(--se) = '\0'; + while (*s && strchr(" \f\n\r\t\v", *s) != NULL) + s++; + if (*s == '\0') continue; + + /* Sanity checks: skip obviously binary lines and dash (for stdin) */ + if (*s < 32 || rstreq(s, "-")) { + s = NULL; + rpmrc = RPMRC_NOTFOUND; + goto exit; + } + + /* Concatenate next line in buffer. */ + *se = '\0'; + argvAdd(&sb, s); + } + + s = argvJoin(sb, " "); + + if (!(s && *s)) { + rpmrc = RPMRC_NOTFOUND; + goto exit; + } + + /* Glob manifest items. */ + rpmrc = (rpmGlob(s, &ac, &av) == 0 ? RPMRC_OK : RPMRC_FAIL); + if (rpmrc != RPMRC_OK) goto exit; + + rpmlog(RPMLOG_DEBUG, "adding %d args from manifest.\n", ac); + + /* Count non-NULL args, keeping track of 1st arg after last NULL. */ + npre = 0; + next = 0; + if (argv != NULL) + for (i = 0; i < argc; i++) { + if (argv[i] != NULL) + npre++; + else if (i >= next) + next = i + 1; + } + + /* Copy old arg list, inserting manifest before argv[next]. */ + if (argv != NULL) { + int nac = npre + ac; + char ** nav = xcalloc((nac + 1), sizeof(*nav)); + + for (i = 0, j = 0; i < next; i++) { + if (argv[i] != NULL) + nav[j++] = argv[i]; + } + + if (ac) + memcpy(nav + j, av, ac * sizeof(*nav)); + if ((argc - next) > 0) + memcpy(nav + j + ac, argv + next, (argc - next) * sizeof(*nav)); + nav[nac] = NULL; + + if (argvPtr) + *argvPtr = argv = _free(argv); + av = _free(av); + av = nav; + ac = nac; + } + + /* Save new argc/argv list. */ + if (argvPtr) { + *argvPtr = _free(*argvPtr); + *argvPtr = av; + } + if (argcPtr) + *argcPtr = ac; + +exit: + if (argvPtr == NULL || (rpmrc != RPMRC_OK && av)) { + if (av) + for (i = 0; i < ac; i++) + av[i] = _free(av[i]); + av = _free(av); + } + argvFree(sb); + free(s); + /* FIX: *argvPtr may be NULL. */ + return rpmrc; +} |