diff -r cf88b5df2884 -r f8c27fe9fe63 librazor/rpm.c --- a/librazor/rpm.c Fri May 01 16:43:37 2009 +0100 +++ b/librazor/rpm.c Fri Jun 12 16:59:11 2009 +0100 @@ -256,6 +256,7 @@ size_t size; void *payload; struct razor_relocations *relocations; + char *evr; }; enum razor_relocation_flags { @@ -491,6 +492,95 @@ } } +static void +razor_rpm_build_evr(struct razor_rpm *rpm) +{ + const char *version, *release; + const uint32_t *epoch; + char evr[128], buf[16]; + + epoch = razor_rpm_get_indirect(rpm, RPMTAG_EPOCH, NULL); + version = razor_rpm_get_indirect(rpm, RPMTAG_VERSION, NULL); + release = razor_rpm_get_indirect(rpm, RPMTAG_RELEASE, NULL); + if (epoch) + snprintf(buf, sizeof buf, "%lu", (unsigned long)ntohl(*epoch)); + razor_build_evr(evr, sizeof evr, epoch ? buf : NULL, version, release); + rpm->evr = strdup(evr); +} + +static const char * +razor_rpm_get_details_type(struct razor_rpm *rpm, enum razor_detail_type type) +{ + switch(type) { + case RAZOR_DETAIL_NAME: + return razor_rpm_get_indirect(rpm, RPMTAG_NAME, NULL); + + case RAZOR_DETAIL_VERSION: + if (!rpm->evr) + razor_rpm_build_evr(rpm); + return rpm->evr; + + case RAZOR_DETAIL_ARCH: + return razor_rpm_get_indirect(rpm, RPMTAG_ARCH, NULL); + + case RAZOR_DETAIL_SUMMARY: + return razor_rpm_get_indirect(rpm, RPMTAG_SUMMARY, NULL); + + case RAZOR_DETAIL_DESCRIPTION: + return razor_rpm_get_indirect(rpm, RPMTAG_DESCRIPTION, NULL); + + case RAZOR_DETAIL_URL: + return razor_rpm_get_indirect(rpm, RPMTAG_URL, NULL); + + case RAZOR_DETAIL_LICENSE: + return razor_rpm_get_indirect(rpm, RPMTAG_LICENSE, NULL); + + case RAZOR_DETAIL_PREUNPROG: + return razor_rpm_get_indirect(rpm, RPMTAG_PREUNPROG, NULL); + + case RAZOR_DETAIL_PREUN: + return razor_rpm_get_indirect(rpm, RPMTAG_PREUN, NULL); + + case RAZOR_DETAIL_POSTUNPROG: + return razor_rpm_get_indirect(rpm, RPMTAG_POSTUNPROG, NULL); + + case RAZOR_DETAIL_POSTUN: + return razor_rpm_get_indirect(rpm, RPMTAG_POSTUN, NULL); + + default: + fprintf(stderr, "type %u not found\n", type); + return NULL; + } +} + +void +razor_rpm_get_details_varg(struct razor_rpm *rpm, va_list args) +{ + int i; + enum razor_detail_type type; + const char **data; + + for (i = 0;; i += 2) { + type = va_arg(args, enum razor_detail_type); + if (type == RAZOR_DETAIL_LAST) + break; + data = va_arg(args, const char **); + *data = razor_rpm_get_details_type(rpm, type); + } +} + +RAZOR_EXPORT void +razor_rpm_get_details(struct razor_rpm *rpm, ...) +{ + va_list args; + + assert(rpm != NULL); + + va_start(args, rpm); + razor_rpm_get_details_varg(rpm, args); + va_end(args); +} + RAZOR_EXPORT struct razor_rpm * razor_rpm_open(const char *filename) { @@ -865,7 +955,7 @@ } } - if (strcmp(program, "") == 0) + if (program && strcmp(program, "") == 0) retval = run_script_lua(installer->root, script_tag, script); else retval = run_script_external(installer->root, program, script); @@ -881,6 +971,47 @@ return retval; } +int +razor_run_script(const char *root, enum razor_property_flags script, + const char *program, const char *body) +{ + int retval; + unsigned int script_tag; + + if (program && !*program) + program = NULL; + if (body && !*body) + body = NULL; + if (program == NULL && body == NULL) + return 0; + + if (program && strcmp(program, "") == 0) + { + switch(script) { + case RAZOR_PROPERTY_PRE: + script_tag = RPMTAG_PREIN; + break; + case RAZOR_PROPERTY_POST: + script_tag = RPMTAG_POSTIN; + break; + case RAZOR_PROPERTY_PREUN: + script_tag = RPMTAG_PREUN; + break; + case RAZOR_PROPERTY_POSTUN: + script_tag = RPMTAG_POSTUN; + break; + default: + script_tag = 0; + break; + } + retval = run_script_lua(root, script_tag, body); + } + else + retval = run_script_external(root, program, body); + + return retval; +} + static int installer_init(struct installer *installer) { @@ -1035,6 +1166,7 @@ free(rpm->dirs); free(rpm->prefixes); err = razor_file_free_contents(rpm->map, rpm->size); + free(rpm->evr); free(rpm); return err; @@ -1043,32 +1175,23 @@ RAZOR_EXPORT int razor_importer_add_rpm(struct razor_importer *importer, struct razor_rpm *rpm) { - const char *name, *version, *release, *arch; + const char *name, *version, *arch; const char *summary, *description, *url, *license; - const uint32_t *epoch; - char evr[128], buf[16]; assert (importer != NULL); assert (rpm != NULL); - name = razor_rpm_get_indirect(rpm, RPMTAG_NAME, NULL); - epoch = razor_rpm_get_indirect(rpm, RPMTAG_EPOCH, NULL); - version = razor_rpm_get_indirect(rpm, RPMTAG_VERSION, NULL); - release = razor_rpm_get_indirect(rpm, RPMTAG_RELEASE, NULL); - arch = razor_rpm_get_indirect(rpm, RPMTAG_ARCH, NULL); + razor_rpm_get_details(rpm, + RAZOR_DETAIL_NAME, &name, + RAZOR_DETAIL_VERSION, &version, + RAZOR_DETAIL_ARCH, &arch, + RAZOR_DETAIL_SUMMARY, &summary, + RAZOR_DETAIL_DESCRIPTION, &description, + RAZOR_DETAIL_URL, &url, + RAZOR_DETAIL_LICENSE, &license, + RAZOR_DETAIL_LAST); - summary = razor_rpm_get_indirect(rpm, RPMTAG_SUMMARY, NULL); - description = razor_rpm_get_indirect(rpm, RPMTAG_DESCRIPTION, NULL); - url = razor_rpm_get_indirect(rpm, RPMTAG_URL, NULL); - license = razor_rpm_get_indirect(rpm, RPMTAG_LICENSE, NULL); - - if (epoch) { - snprintf(buf, sizeof buf, "%lu", ntohl(*epoch)); - razor_build_evr(evr, sizeof evr, buf, version, release); - } else { - razor_build_evr(evr, sizeof evr, NULL, version, release); - } - razor_importer_begin_package(importer, name, evr, arch); + razor_importer_begin_package(importer, name, version, arch); razor_importer_add_details(importer, summary, description, url, license);