1.1 --- a/librazor/rpm.c Fri May 01 16:43:37 2009 +0100
1.2 +++ b/librazor/rpm.c Fri Jun 12 16:59:11 2009 +0100
1.3 @@ -256,6 +256,7 @@
1.4 size_t size;
1.5 void *payload;
1.6 struct razor_relocations *relocations;
1.7 + char *evr;
1.8 };
1.9
1.10 enum razor_relocation_flags {
1.11 @@ -491,6 +492,95 @@
1.12 }
1.13 }
1.14
1.15 +static void
1.16 +razor_rpm_build_evr(struct razor_rpm *rpm)
1.17 +{
1.18 + const char *version, *release;
1.19 + const uint32_t *epoch;
1.20 + char evr[128], buf[16];
1.21 +
1.22 + epoch = razor_rpm_get_indirect(rpm, RPMTAG_EPOCH, NULL);
1.23 + version = razor_rpm_get_indirect(rpm, RPMTAG_VERSION, NULL);
1.24 + release = razor_rpm_get_indirect(rpm, RPMTAG_RELEASE, NULL);
1.25 + if (epoch)
1.26 + snprintf(buf, sizeof buf, "%lu", (unsigned long)ntohl(*epoch));
1.27 + razor_build_evr(evr, sizeof evr, epoch ? buf : NULL, version, release);
1.28 + rpm->evr = strdup(evr);
1.29 +}
1.30 +
1.31 +static const char *
1.32 +razor_rpm_get_details_type(struct razor_rpm *rpm, enum razor_detail_type type)
1.33 +{
1.34 + switch(type) {
1.35 + case RAZOR_DETAIL_NAME:
1.36 + return razor_rpm_get_indirect(rpm, RPMTAG_NAME, NULL);
1.37 +
1.38 + case RAZOR_DETAIL_VERSION:
1.39 + if (!rpm->evr)
1.40 + razor_rpm_build_evr(rpm);
1.41 + return rpm->evr;
1.42 +
1.43 + case RAZOR_DETAIL_ARCH:
1.44 + return razor_rpm_get_indirect(rpm, RPMTAG_ARCH, NULL);
1.45 +
1.46 + case RAZOR_DETAIL_SUMMARY:
1.47 + return razor_rpm_get_indirect(rpm, RPMTAG_SUMMARY, NULL);
1.48 +
1.49 + case RAZOR_DETAIL_DESCRIPTION:
1.50 + return razor_rpm_get_indirect(rpm, RPMTAG_DESCRIPTION, NULL);
1.51 +
1.52 + case RAZOR_DETAIL_URL:
1.53 + return razor_rpm_get_indirect(rpm, RPMTAG_URL, NULL);
1.54 +
1.55 + case RAZOR_DETAIL_LICENSE:
1.56 + return razor_rpm_get_indirect(rpm, RPMTAG_LICENSE, NULL);
1.57 +
1.58 + case RAZOR_DETAIL_PREUNPROG:
1.59 + return razor_rpm_get_indirect(rpm, RPMTAG_PREUNPROG, NULL);
1.60 +
1.61 + case RAZOR_DETAIL_PREUN:
1.62 + return razor_rpm_get_indirect(rpm, RPMTAG_PREUN, NULL);
1.63 +
1.64 + case RAZOR_DETAIL_POSTUNPROG:
1.65 + return razor_rpm_get_indirect(rpm, RPMTAG_POSTUNPROG, NULL);
1.66 +
1.67 + case RAZOR_DETAIL_POSTUN:
1.68 + return razor_rpm_get_indirect(rpm, RPMTAG_POSTUN, NULL);
1.69 +
1.70 + default:
1.71 + fprintf(stderr, "type %u not found\n", type);
1.72 + return NULL;
1.73 + }
1.74 +}
1.75 +
1.76 +void
1.77 +razor_rpm_get_details_varg(struct razor_rpm *rpm, va_list args)
1.78 +{
1.79 + int i;
1.80 + enum razor_detail_type type;
1.81 + const char **data;
1.82 +
1.83 + for (i = 0;; i += 2) {
1.84 + type = va_arg(args, enum razor_detail_type);
1.85 + if (type == RAZOR_DETAIL_LAST)
1.86 + break;
1.87 + data = va_arg(args, const char **);
1.88 + *data = razor_rpm_get_details_type(rpm, type);
1.89 + }
1.90 +}
1.91 +
1.92 +RAZOR_EXPORT void
1.93 +razor_rpm_get_details(struct razor_rpm *rpm, ...)
1.94 +{
1.95 + va_list args;
1.96 +
1.97 + assert(rpm != NULL);
1.98 +
1.99 + va_start(args, rpm);
1.100 + razor_rpm_get_details_varg(rpm, args);
1.101 + va_end(args);
1.102 +}
1.103 +
1.104 RAZOR_EXPORT struct razor_rpm *
1.105 razor_rpm_open(const char *filename)
1.106 {
1.107 @@ -865,7 +955,7 @@
1.108 }
1.109 }
1.110
1.111 - if (strcmp(program, "<lua>") == 0)
1.112 + if (program && strcmp(program, "<lua>") == 0)
1.113 retval = run_script_lua(installer->root, script_tag, script);
1.114 else
1.115 retval = run_script_external(installer->root, program, script);
1.116 @@ -881,6 +971,47 @@
1.117 return retval;
1.118 }
1.119
1.120 +int
1.121 +razor_run_script(const char *root, enum razor_property_flags script,
1.122 + const char *program, const char *body)
1.123 +{
1.124 + int retval;
1.125 + unsigned int script_tag;
1.126 +
1.127 + if (program && !*program)
1.128 + program = NULL;
1.129 + if (body && !*body)
1.130 + body = NULL;
1.131 + if (program == NULL && body == NULL)
1.132 + return 0;
1.133 +
1.134 + if (program && strcmp(program, "<lua>") == 0)
1.135 + {
1.136 + switch(script) {
1.137 + case RAZOR_PROPERTY_PRE:
1.138 + script_tag = RPMTAG_PREIN;
1.139 + break;
1.140 + case RAZOR_PROPERTY_POST:
1.141 + script_tag = RPMTAG_POSTIN;
1.142 + break;
1.143 + case RAZOR_PROPERTY_PREUN:
1.144 + script_tag = RPMTAG_PREUN;
1.145 + break;
1.146 + case RAZOR_PROPERTY_POSTUN:
1.147 + script_tag = RPMTAG_POSTUN;
1.148 + break;
1.149 + default:
1.150 + script_tag = 0;
1.151 + break;
1.152 + }
1.153 + retval = run_script_lua(root, script_tag, body);
1.154 + }
1.155 + else
1.156 + retval = run_script_external(root, program, body);
1.157 +
1.158 + return retval;
1.159 +}
1.160 +
1.161 static int
1.162 installer_init(struct installer *installer)
1.163 {
1.164 @@ -1035,6 +1166,7 @@
1.165 free(rpm->dirs);
1.166 free(rpm->prefixes);
1.167 err = razor_file_free_contents(rpm->map, rpm->size);
1.168 + free(rpm->evr);
1.169 free(rpm);
1.170
1.171 return err;
1.172 @@ -1043,32 +1175,23 @@
1.173 RAZOR_EXPORT int
1.174 razor_importer_add_rpm(struct razor_importer *importer, struct razor_rpm *rpm)
1.175 {
1.176 - const char *name, *version, *release, *arch;
1.177 + const char *name, *version, *arch;
1.178 const char *summary, *description, *url, *license;
1.179 - const uint32_t *epoch;
1.180 - char evr[128], buf[16];
1.181
1.182 assert (importer != NULL);
1.183 assert (rpm != NULL);
1.184
1.185 - name = razor_rpm_get_indirect(rpm, RPMTAG_NAME, NULL);
1.186 - epoch = razor_rpm_get_indirect(rpm, RPMTAG_EPOCH, NULL);
1.187 - version = razor_rpm_get_indirect(rpm, RPMTAG_VERSION, NULL);
1.188 - release = razor_rpm_get_indirect(rpm, RPMTAG_RELEASE, NULL);
1.189 - arch = razor_rpm_get_indirect(rpm, RPMTAG_ARCH, NULL);
1.190 + razor_rpm_get_details(rpm,
1.191 + RAZOR_DETAIL_NAME, &name,
1.192 + RAZOR_DETAIL_VERSION, &version,
1.193 + RAZOR_DETAIL_ARCH, &arch,
1.194 + RAZOR_DETAIL_SUMMARY, &summary,
1.195 + RAZOR_DETAIL_DESCRIPTION, &description,
1.196 + RAZOR_DETAIL_URL, &url,
1.197 + RAZOR_DETAIL_LICENSE, &license,
1.198 + RAZOR_DETAIL_LAST);
1.199
1.200 - summary = razor_rpm_get_indirect(rpm, RPMTAG_SUMMARY, NULL);
1.201 - description = razor_rpm_get_indirect(rpm, RPMTAG_DESCRIPTION, NULL);
1.202 - url = razor_rpm_get_indirect(rpm, RPMTAG_URL, NULL);
1.203 - license = razor_rpm_get_indirect(rpm, RPMTAG_LICENSE, NULL);
1.204 -
1.205 - if (epoch) {
1.206 - snprintf(buf, sizeof buf, "%lu", ntohl(*epoch));
1.207 - razor_build_evr(evr, sizeof evr, buf, version, release);
1.208 - } else {
1.209 - razor_build_evr(evr, sizeof evr, NULL, version, release);
1.210 - }
1.211 - razor_importer_begin_package(importer, name, evr, arch);
1.212 + razor_importer_begin_package(importer, name, version, arch);
1.213
1.214 razor_importer_add_details(importer, summary, description, url,
1.215 license);