librazor/razor.c
changeset 372 6e93e5485947
parent 369 f8c27fe9fe63
child 373 fda83d91e600
     1.1 --- a/librazor/razor.c	Fri Jun 12 16:59:11 2009 +0100
     1.2 +++ b/librazor/razor.c	Fri Jul 03 18:02:33 2009 +0100
     1.3 @@ -67,6 +67,7 @@
     1.4  	{ RAZOR_PROPERTIES,	offsetof(struct razor_set, properties) },
     1.5  	{ RAZOR_PACKAGE_POOL,	offsetof(struct razor_set, package_pool) },
     1.6  	{ RAZOR_PROPERTY_POOL,	offsetof(struct razor_set, property_pool) },
     1.7 +	{ RAZOR_PREFIX_POOL,	offsetof(struct razor_set, prefix_pool) },
     1.8  };
     1.9  
    1.10  struct razor_set_section_index razor_files_sections[] = {
    1.11 @@ -377,9 +378,9 @@
    1.12  }
    1.13  
    1.14  static const char *
    1.15 -razor_package_get_details_type(struct razor_set *set,
    1.16 -			       struct razor_package *package,
    1.17 -			       enum razor_detail_type type)
    1.18 +razor_package_get_details_string(struct razor_set *set,
    1.19 +				 struct razor_package *package,
    1.20 +				 enum razor_detail_type type)
    1.21  {
    1.22  	const char *pool;
    1.23  
    1.24 @@ -434,6 +435,24 @@
    1.25  	}
    1.26  }
    1.27  
    1.28 +static const char *const *
    1.29 +razor_package_get_details_array(struct razor_set *set,
    1.30 +				struct razor_package *package,
    1.31 +				enum razor_detail_type type)
    1.32 +{
    1.33 +	switch (type) {
    1.34 +	case RAZOR_DETAIL_PREFIXES:
    1.35 +		/* We don't track prefixes in packages. Install prefixes
    1.36 +		 * are tracked, but we don't provide an API to get them.
    1.37 +		 */
    1.38 +		return NULL;
    1.39 +
    1.40 +	default:
    1.41 +		fprintf(stderr, "type %u not found\n", type);
    1.42 +		return NULL;
    1.43 +	}
    1.44 +}
    1.45 +
    1.46  /**
    1.47   * razor_package_get_details_varg:
    1.48   * @set: a %razor_set
    1.49 @@ -447,14 +466,22 @@
    1.50  {
    1.51  	int i;
    1.52  	enum razor_detail_type type;
    1.53 -	const char **data;
    1.54 +	const char **string;
    1.55 +	const char *const **array;
    1.56  
    1.57  	for (i = 0;; i += 2) {
    1.58  		type = va_arg(args, enum razor_detail_type);
    1.59  		if (type == RAZOR_DETAIL_LAST)
    1.60  			break;
    1.61 -		data = va_arg(args, const char **);
    1.62 -		*data = razor_package_get_details_type(set, package, type);
    1.63 +		if (type == RAZOR_DETAIL_PREFIXES) {
    1.64 +			array = va_arg(args, const char *const **);
    1.65 +			*array = razor_package_get_details_array(set, package,
    1.66 +								 type);
    1.67 +		} else {
    1.68 +			string = va_arg(args, const char **);
    1.69 +			*string = razor_package_get_details_string(set, package,
    1.70 +								   type);
    1.71 +		}
    1.72  	}
    1.73  
    1.74  }
    1.75 @@ -501,7 +528,10 @@
    1.76  	struct razor_package *p;
    1.77  	char buffer[PATH_MAX];
    1.78  	const char *name, *program, *script;
    1.79 -	int retval = 0, count;
    1.80 +	int retval = 0, i, count;
    1.81 +	struct environment env;
    1.82 +	struct list *link;
    1.83 +	const char *prefix;
    1.84  
    1.85  	razor_package_get_details(set, package,
    1.86  				  RAZOR_DETAIL_PREUNPROG, &program,
    1.87 @@ -535,7 +565,22 @@
    1.88  				  RAZOR_DETAIL_POSTUN, &script,
    1.89  				  RAZOR_DETAIL_LAST);
    1.90  
    1.91 -	return razor_run_script(root, RAZOR_PROPERTY_POSTUN, program, script);
    1.92 +	environment_init(&env);
    1.93 +	link = list_first(&package->install_prefixes, &set->prefix_pool);
    1.94 +	for (i = 0; link; i++) {
    1.95 +		prefix = (const char *)set->string_pool.data + link->data;
    1.96 +		sprintf(buffer, "RPM_INSTALL_PREFIX%d", i);
    1.97 +		environment_add_variable(&env, buffer, prefix);
    1.98 +		link = list_next(link);
    1.99 +	}
   1.100 +	environment_set(&env);
   1.101 +
   1.102 +	retval = razor_run_script(root, RAZOR_PROPERTY_POSTUN, program, script);
   1.103 +
   1.104 +	environment_unset(&env);
   1.105 +	environment_release(&env);
   1.106 +
   1.107 +	return retval;
   1.108  }
   1.109  
   1.110  RAZOR_EXPORT const char *