librazor/rpm.c
changeset 369 f8c27fe9fe63
parent 362 cf88b5df2884
child 370 a3e288343fe7
     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);