librazor/razor.h
author J. Ali Harlow <ali@juiblex.co.uk>
Thu Feb 09 20:45:27 2012 +0000 (2012-02-09)
changeset 418 33b825d3128d
parent 416 d0aa9e0a6d04
child 423 6112bcc5d1cf
permissions -rw-r--r--
Add transaction barriers
These allow packages to be installed and removed which have scripts
that depend on each other when atomic transactions are involved.
Note that yum supports pre, but not other requires flags. post will
need similar support to the post scripts themselves pulling in the
requires flags from the rpms. Likewise preun and postun will need
similar handling to those scrips since the requires flags will need
to be stored in the razor database.
rhughes@241
     1
/*
rhughes@241
     2
 * Copyright (C) 2008  Kristian Høgsberg <krh@redhat.com>
rhughes@241
     3
 * Copyright (C) 2008  Red Hat, Inc
ali@418
     4
 * Copyright (C) 2009, 2011, 2012  J. Ali Harlow <ali@juiblex.co.uk>
rhughes@241
     5
 *
rhughes@241
     6
 * This program is free software; you can redistribute it and/or modify
rhughes@241
     7
 * it under the terms of the GNU General Public License as published by
rhughes@241
     8
 * the Free Software Foundation; either version 2 of the License, or
rhughes@241
     9
 * (at your option) any later version.
rhughes@241
    10
 *
rhughes@241
    11
 * This program is distributed in the hope that it will be useful,
rhughes@241
    12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
rhughes@241
    13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
rhughes@241
    14
 * GNU General Public License for more details.
rhughes@241
    15
 *
rhughes@241
    16
 * You should have received a copy of the GNU General Public License along
rhughes@241
    17
 * with this program; if not, write to the Free Software Foundation, Inc.,
rhughes@241
    18
 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
rhughes@241
    19
 */
rhughes@241
    20
rhughes@241
    21
#ifndef _RAZOR_H_
rhughes@241
    22
#define _RAZOR_H_
rhughes@241
    23
jbowes@284
    24
#include <stdint.h>
ali@403
    25
#include <sys/types.h>
ali@403
    26
ali@403
    27
/* GCC extensions */
ali@403
    28
#if defined(__GNUC__)
ali@403
    29
#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96)
ali@403
    30
#define RAZOR_MALLOC __attribute__((__malloc__))
ali@403
    31
#else
ali@403
    32
#define RAZOR_MALLOC
ali@403
    33
#endif
ali@403
    34
#if __GNUC__ >= 4
ali@403
    35
#define RAZOR_NULL_TERMINATED __attribute__ ((__sentinel__))
ali@403
    36
#else
ali@403
    37
#define RAZOR_NULL_TERMINATED
ali@403
    38
#endif
ali@403
    39
#endif	/* __GNUC__ */
jbowes@284
    40
krh@373
    41
enum razor_section_type {
krh@373
    42
	RAZOR_SECTION_MAIN = 0x01,
krh@373
    43
	RAZOR_SECTION_DETAILS = 0x02,
krh@373
    44
	RAZOR_SECTION_FILES = 0x04,
krh@373
    45
	RAZOR_SECTION_ALL = 0x07
jbowes@258
    46
};
jbowes@258
    47
ali@403
    48
enum razor_stage_type {
ali@403
    49
	RAZOR_STAGE_SCRIPTS_PRE = 0x1,
ali@403
    50
	RAZOR_STAGE_FILES = 0x2,
ali@403
    51
	RAZOR_STAGE_SCRIPTS_POST = 0x4,
ali@403
    52
	RAZOR_STAGE_SCRIPTS = 0x5,
ali@403
    53
	RAZOR_STAGE_ALL = 0x7
ali@403
    54
};
ali@403
    55
richard@302
    56
enum razor_detail_type {
richard@307
    57
	RAZOR_DETAIL_LAST = 0,	/* the sentinel */
richard@307
    58
	RAZOR_DETAIL_NAME,
richard@302
    59
	RAZOR_DETAIL_VERSION,
richard@302
    60
	RAZOR_DETAIL_ARCH,
richard@302
    61
	RAZOR_DETAIL_SUMMARY,
richard@302
    62
	RAZOR_DETAIL_DESCRIPTION,
richard@302
    63
	RAZOR_DETAIL_URL,
ali@369
    64
	RAZOR_DETAIL_LICENSE,
ali@369
    65
	RAZOR_DETAIL_PREUNPROG,
ali@369
    66
	RAZOR_DETAIL_PREUN,
ali@369
    67
	RAZOR_DETAIL_POSTUNPROG,
ali@372
    68
	RAZOR_DETAIL_POSTUN,
ali@372
    69
	RAZOR_DETAIL_PREFIXES
richard@302
    70
};
richard@302
    71
krh@247
    72
enum razor_property_flags {
krh@247
    73
	RAZOR_PROPERTY_LESS		= 1 << 0,
krh@247
    74
	RAZOR_PROPERTY_GREATER		= 1 << 1,
krh@247
    75
	RAZOR_PROPERTY_EQUAL		= 1 << 2,
krh@247
    76
	RAZOR_PROPERTY_RELATION_MASK	=
krh@247
    77
		RAZOR_PROPERTY_LESS |
krh@247
    78
		RAZOR_PROPERTY_GREATER |
krh@247
    79
		RAZOR_PROPERTY_EQUAL,
krh@247
    80
krh@247
    81
	RAZOR_PROPERTY_REQUIRES		= 0 << 3,
krh@247
    82
	RAZOR_PROPERTY_PROVIDES		= 1 << 3,
krh@247
    83
	RAZOR_PROPERTY_CONFLICTS	= 2 << 3,
krh@247
    84
	RAZOR_PROPERTY_OBSOLETES	= 3 << 3,
krh@247
    85
	RAZOR_PROPERTY_TYPE_MASK	= 3 << 3,
krh@247
    86
		
krh@247
    87
	RAZOR_PROPERTY_PRE		= 1 << 5,
krh@247
    88
	RAZOR_PROPERTY_POST		= 1 << 6,
krh@247
    89
	RAZOR_PROPERTY_PREUN		= 1 << 7,
ali@368
    90
	RAZOR_PROPERTY_POSTUN		= 1 << 8,
ali@368
    91
	RAZOR_PROPERTY_SCRIPT_MASK	=
ali@368
    92
		RAZOR_PROPERTY_PRE |
ali@368
    93
		RAZOR_PROPERTY_POST |
ali@368
    94
		RAZOR_PROPERTY_PREUN |
ali@368
    95
		RAZOR_PROPERTY_POSTUN
rhughes@241
    96
};
rhughes@241
    97
krh@262
    98
/**
ali@403
    99
 * SECTION:atomic
ali@403
   100
 * @title: Atomic transactions
ali@403
   101
 * @short_description: File-based transactions that shouldn't half-succeed
ali@403
   102
 *
ali@403
   103
 * This is a helper object for issuing a sequence of file-based actions
ali@403
   104
 * that should either all succeed or all fail.
ali@403
   105
 *
ali@403
   106
 * Note that currently only Windows 7 has a native implementation and that
ali@416
   107
 * while the emulated fallback implementation attempts to rollback the
ali@416
   108
 * transaction if it fails, this is not guaranteed to succeed and that
ali@416
   109
 * the transaction is held in core (and thus vulnernable to program crashes,
ali@416
   110
 * power loss, etc.). This could (and should) be improved.
ali@416
   111
 *
ali@416
   112
 * Atomic transactions can be disabled via configure, in which case all
ali@416
   113
 * bets are off.
ali@403
   114
 **/
ali@403
   115
struct razor_atomic;
ali@403
   116
ali@403
   117
struct razor_atomic *razor_atomic_open(const char *description);
ali@403
   118
int razor_atomic_commit(struct razor_atomic *atomic);
ali@403
   119
const char *razor_atomic_get_error_msg(struct razor_atomic *atomic);
ali@403
   120
void razor_atomic_destroy(struct razor_atomic *atomic);
ali@403
   121
ali@403
   122
/**
ali@403
   123
 * razor_atomic_make_dirs
ali@403
   124
 * 
ali@403
   125
 * Create all sub-directories leading up to path. We know root exists
ali@403
   126
 * and is a dir, root does not end in a '/', and path either has a
ali@403
   127
 * leading '/' or (on MS-Windows only) root is the empty string
ali@403
   128
 * and path starts with drive (eg., "c:/windows").
ali@403
   129
 * Note: path itself is not created, only the directory in which it
ali@403
   130
 * (would) exist.
ali@403
   131
 *
ali@403
   132
 * Returns: non-zero on error.
ali@403
   133
 **/
ali@403
   134
int razor_atomic_make_dirs(struct razor_atomic *atomic, const char *root,
ali@403
   135
  const char *path);
ali@403
   136
int razor_atomic_remove(struct razor_atomic *atomic, const char *path);
ali@403
   137
int razor_atomic_rename_file(struct razor_atomic *atomic, const char *oldpath,
ali@403
   138
			     const char *newpath);
ali@403
   139
ali@403
   140
/**
ali@403
   141
 * razor_atomic_create_dir
ali@403
   142
 * 
ali@403
   143
 * Create a directory, replacing any existing object at this path except
ali@403
   144
 * an existing directory (which is not counted as a error).
ali@403
   145
 *
ali@403
   146
 * Returns: non-zero on error.
ali@403
   147
 */
ali@403
   148
int razor_atomic_create_dir(struct razor_atomic *atomic, const char *dirname,
ali@403
   149
  mode_t mode);
ali@403
   150
ali@403
   151
/**
ali@403
   152
 * razor_atomic_create_symlink
ali@403
   153
 * 
ali@403
   154
 * Create a symbolic link, replacing any existing object at this path except
ali@403
   155
 * a non-empty directory.
ali@403
   156
 *
ali@403
   157
 * Note: This function will always fail on platforms that don't support
ali@403
   158
 * symbolic links.
ali@403
   159
 *
ali@403
   160
 * Returns: non-zero on error.
ali@403
   161
 */
ali@403
   162
int razor_atomic_create_symlink(struct razor_atomic *atomic, const char *target,
ali@403
   163
  const char *path);
ali@403
   164
/**
ali@403
   165
 * razor_atomic_create_file
ali@403
   166
 * 
ali@403
   167
 * Create a file, replacing any existing object at this path except
ali@403
   168
 * a non-empty directory.
ali@403
   169
 *
ali@403
   170
 * Returns: A handle to be passed to razor_atomic_write() and
ali@403
   171
 * razor_atomic_close() or a negative value on error.
ali@403
   172
 */
ali@403
   173
int razor_atomic_create_file(struct razor_atomic *atomic, const char *filename,
ali@403
   174
  mode_t mode);
ali@403
   175
int razor_atomic_write(struct razor_atomic *atomic, int handle,
ali@403
   176
  const void *data, size_t size);
ali@403
   177
int razor_atomic_close(struct razor_atomic *atomic, int handle);
ali@403
   178
int razor_atomic_sync(struct razor_atomic *atomic, int handle);
ali@403
   179
void razor_atomic_abort(struct razor_atomic *atomic, const char *error_msg);
ali@403
   180
int razor_atomic_in_error_state(struct razor_atomic *atomic);
ali@403
   181
ali@403
   182
/**
krh@262
   183
 * SECTION:set
krh@262
   184
 * @title: Package Set
krh@262
   185
 * @short_description: Represents a set of packages and their metadata.
krh@262
   186
 *
krh@262
   187
 * This object represents a set of packages, their dependency
krh@262
   188
 * information, the file lists and a number of other details.
krh@262
   189
 **/
rhughes@241
   190
krh@262
   191
struct razor_set;
krh@262
   192
struct razor_package;
krh@262
   193
struct razor_property;
krh@262
   194
ali@403
   195
#define RAZOR_HEADER_VERSION		2	/* Current version */
ali@403
   196
#define RAZOR_HEADER_VERSION_MIN	1	/* Minimum version we support */
ali@403
   197
krh@262
   198
/**
krh@262
   199
 * razor_set_create:
krh@262
   200
 * 
krh@262
   201
 * Create a new #razor_set object.
krh@262
   202
 * 
krh@262
   203
 * Returns: the new #razor_set object.
krh@262
   204
 **/
ali@363
   205
struct razor_set *razor_set_create_without_root(void);
rhughes@241
   206
struct razor_set *razor_set_create(void);
ali@403
   207
struct razor_set *razor_set_open(const char *filename,
ali@403
   208
				 struct razor_atomic *atomic);
ali@403
   209
uint32_t razor_set_get_header_version(struct razor_set *set);
ali@403
   210
int razor_set_set_header_version(struct razor_set *set,
ali@403
   211
				 uint32_t header_version);
ali@403
   212
void razor_set_unref(struct razor_set *set);
ali@403
   213
struct razor_set *razor_set_ref(struct razor_set *set);
ali@403
   214
void razor_set_write_to_handle(struct razor_set *set,
ali@403
   215
			       struct razor_atomic *atomic, int handle,
ali@403
   216
			       uint32_t section_mask);
ali@403
   217
int razor_set_write(struct razor_set *set, struct razor_atomic *atomic,
krh@373
   218
		    const char *filename, uint32_t setions);
ali@403
   219
int razor_set_bind_sections(struct razor_set *set, struct razor_atomic *atomic,
ali@403
   220
			    const char *filename);
rhughes@241
   221
rhughes@241
   222
struct razor_package *
rhughes@241
   223
razor_set_get_package(struct razor_set *set, const char *package);
rhughes@241
   224
jbowes@258
   225
void
richard@304
   226
razor_package_get_details(struct razor_set *set,
richard@307
   227
			  struct razor_package *package, ...);
ali@369
   228
int
ali@382
   229
razor_package_remove(struct razor_set *prev, struct razor_set *next,
ali@403
   230
		     struct razor_atomic *atomic, struct razor_package *package,
ali@403
   231
		     const char *root, int install_count,
ali@403
   232
		     enum razor_stage_type stage);
krh@262
   233
krh@262
   234
/**
krh@262
   235
 * SECTION:iterator
krh@262
   236
 * @title: Iterators
krh@262
   237
 * @short_description: Objects for traversing packages or properties.
krh@262
   238
 *
krh@262
   239
 * The razor iterator objects provides a way to iterate through a set
krh@262
   240
 * of packages or properties.
krh@262
   241
 **/
krh@262
   242
rhughes@241
   243
struct razor_package_iterator;
krh@262
   244
krh@262
   245
/**
krh@262
   246
 * razor_package_iterator_create:
krh@262
   247
 * 
krh@262
   248
 * Create a new #razor_package_iterator object.
krh@262
   249
 * 
krh@262
   250
 * Returns: the new #razor_package_iterator object.
krh@262
   251
 **/
krh@262
   252
rhughes@241
   253
struct razor_package_iterator *
rhughes@241
   254
razor_package_iterator_create(struct razor_set *set);
krh@262
   255
krh@262
   256
/**
krh@262
   257
 * razor_package_iterator_create_for_property:
krh@262
   258
 * 
krh@262
   259
 * Create a new #razor_package_iterator object for the packages that
krh@262
   260
 * own the given property.
krh@262
   261
 * 
krh@262
   262
 * Returns: the new #razor_package_iterator object.
krh@262
   263
 **/
rhughes@241
   264
struct razor_package_iterator *
rhughes@241
   265
razor_package_iterator_create_for_property(struct razor_set *set,
rhughes@241
   266
					   struct razor_property *property);
jbowes@277
   267
jbowes@277
   268
/**
jbowes@277
   269
 * razor_package_iterator_create_for_file:
jbowes@277
   270
 *
jbowes@277
   271
 * Create a new #razor_package_iterator object for the packages that
jbowes@277
   272
 * contain the given file name.
jbowes@277
   273
 *
jbowes@277
   274
 * Returns: the new #razor_package_iterator object.
jbowes@277
   275
 **/
rhughes@241
   276
struct razor_package_iterator *
rhughes@241
   277
razor_package_iterator_create_for_file(struct razor_set *set,
rhughes@241
   278
				       const char *filename);
rhughes@241
   279
rhughes@241
   280
int razor_package_iterator_next(struct razor_package_iterator *pi,
richard@307
   281
				struct razor_package **package, ...);
rhughes@241
   282
void razor_package_iterator_destroy(struct razor_package_iterator *pi);
rhughes@241
   283
rhughes@241
   284
struct razor_package_query *
rhughes@241
   285
razor_package_query_create(struct razor_set *set);
rhughes@241
   286
void
rhughes@241
   287
razor_package_query_add_package(struct razor_package_query *pq,
rhughes@241
   288
				struct razor_package *p);
rhughes@241
   289
void
rhughes@241
   290
razor_package_query_add_iterator(struct razor_package_query *pq,
rhughes@241
   291
				 struct razor_package_iterator *pi);
rhughes@241
   292
struct razor_package_iterator *
rhughes@241
   293
razor_package_query_finish(struct razor_package_query *pq);
rhughes@241
   294
rhughes@241
   295
struct razor_property_iterator;
rhughes@241
   296
struct razor_property_iterator *
rhughes@241
   297
razor_property_iterator_create(struct razor_set *set,
rhughes@241
   298
			       struct razor_package *package);
rhughes@241
   299
int razor_property_iterator_next(struct razor_property_iterator *pi,
rhughes@241
   300
				 struct razor_property **property,
rhughes@241
   301
				 const char **name,
krh@247
   302
				 uint32_t *flags,
krh@247
   303
				 const char **version);
rhughes@241
   304
void
rhughes@241
   305
razor_property_iterator_destroy(struct razor_property_iterator *pi);
rhughes@241
   306
ali@351
   307
struct razor_file_iterator;
ali@351
   308
struct razor_file_iterator *
ali@351
   309
razor_file_iterator_create(struct razor_set *set,
ali@377
   310
			   struct razor_package *package, int post_order);
ali@351
   311
int razor_file_iterator_next(struct razor_file_iterator *fi,
ali@351
   312
			     const char **name);
ali@351
   313
void razor_file_iterator_destroy(struct razor_file_iterator *fi);
ali@351
   314
rhughes@241
   315
void razor_set_list_files(struct razor_set *set, const char *prefix);
krh@306
   316
void razor_set_list_package_files(struct razor_set *set,
krh@306
   317
				  struct razor_package *package);
rhughes@241
   318
krh@253
   319
enum razor_diff_action {
krh@253
   320
	RAZOR_DIFF_ACTION_ADD,
krh@253
   321
	RAZOR_DIFF_ACTION_REMOVE,
krh@253
   322
};
krh@253
   323
krh@253
   324
typedef void (*razor_diff_callback_t)(enum razor_diff_action action,
krh@253
   325
				      struct razor_package *package,
krh@253
   326
				      const char *name,
krh@253
   327
				      const char *version,
krh@253
   328
				      const char *arch,
krh@253
   329
				      void *data);
krh@253
   330
rhughes@241
   331
void
rhughes@241
   332
razor_set_diff(struct razor_set *set, struct razor_set *upstream,
krh@253
   333
	       razor_diff_callback_t callback, void *data);
krh@316
   334
krh@316
   335
struct razor_install_iterator;
krh@316
   336
krh@316
   337
enum razor_install_action {
krh@316
   338
	RAZOR_INSTALL_ACTION_ADD,
ali@416
   339
	RAZOR_INSTALL_ACTION_REMOVE,
ali@416
   340
	RAZOR_INSTALL_ACTION_COMMIT
krh@316
   341
};
krh@316
   342
krh@316
   343
struct razor_install_iterator *
krh@254
   344
razor_set_create_install_iterator(struct razor_set *set,
krh@254
   345
				  struct razor_set *next);
rhughes@241
   346
krh@316
   347
int razor_install_iterator_next(struct razor_install_iterator *ii,
krh@316
   348
				struct razor_package **package,
krh@316
   349
				enum razor_install_action *action,
krh@316
   350
				int *count);
krh@316
   351
ali@418
   352
/**
ali@418
   353
 * razor_install_iterator_commit_set
ali@418
   354
 *
ali@418
   355
 * Immediately after razor_install_iterator_next() returns
ali@418
   356
 * RAZOR_INSTALL_ACTION_COMMIT, this function will return the razor_set
ali@418
   357
 * which should be committed.
ali@418
   358
 *
ali@418
   359
 * Returns: a new #razor_set object.
ali@418
   360
 **/
ali@418
   361
struct razor_set *
ali@418
   362
razor_install_iterator_commit_set(struct razor_install_iterator *ii);
ali@418
   363
ali@403
   364
void razor_install_iterator_rewind(struct razor_install_iterator *ii);
ali@418
   365
size_t razor_install_iterator_tell(struct razor_install_iterator *ii);
ali@418
   366
size_t razor_install_iterator_seek(struct razor_install_iterator *ii,
ali@418
   367
				   size_t pos);
krh@316
   368
void razor_install_iterator_destroy(struct razor_install_iterator *ii);
krh@316
   369
krh@262
   370
/**
krh@262
   371
 * SECTION:transaction
krh@262
   372
 * @title: Transaction
krh@262
   373
 * @short_description: Create a new package set by merging two or more sets.
krh@262
   374
 *
krh@262
   375
 * The razor transaction object provides a way to create a new package set
krh@262
   376
 * from packages from one or more other package sets.
krh@262
   377
 **/
rhughes@241
   378
ali@369
   379
struct razor_rpm;
ali@369
   380
rhughes@241
   381
struct razor_transaction *
rhughes@241
   382
razor_transaction_create(struct razor_set *system, struct razor_set *upstream);
rhughes@241
   383
void razor_transaction_install_package(struct razor_transaction *transaction,
rhughes@241
   384
				       struct razor_package *package);
rhughes@241
   385
void razor_transaction_remove_package(struct razor_transaction *transaction,
rhughes@241
   386
				      struct razor_package *package);
rhughes@241
   387
void razor_transaction_update_package(struct razor_transaction *trans,
rhughes@241
   388
				      struct razor_package *package);
ali@369
   389
void razor_transaction_fixup_package(struct razor_transaction *trans,
ali@369
   390
				     struct razor_package *package,
ali@369
   391
				     struct razor_rpm *rpm);
rhughes@241
   392
void razor_transaction_update_all(struct razor_transaction *transaction);
rhughes@241
   393
int razor_transaction_resolve(struct razor_transaction *trans);
rhughes@241
   394
int razor_transaction_describe(struct razor_transaction *trans);
ali@369
   395
struct razor_set *razor_transaction_commit(struct razor_transaction *trans);
rhughes@241
   396
void razor_transaction_destroy(struct razor_transaction *trans);
rhughes@241
   397
rhughes@241
   398
/* Temporary helper for test suite. */
rhughes@241
   399
int razor_transaction_unsatisfied_property(struct razor_transaction *trans,
rhughes@241
   400
					   const char *name,
krh@247
   401
					   uint32_t flags,
krh@247
   402
					   const char *version);
rhughes@241
   403
krh@262
   404
/**
krh@262
   405
 * SECTION:rpm
krh@262
   406
 * @title: Razor RPM
krh@262
   407
 * @short_description: Operating on RPM files.
krh@262
   408
 *
krh@262
   409
 * Functions for open RPM files and extracting information and
krh@262
   410
 * installing or removing RPM files.
krh@262
   411
 **/
rhughes@241
   412
ali@351
   413
struct razor_relocations;
krh@262
   414
ali@351
   415
struct razor_relocations *razor_relocations_create(void);
ali@351
   416
void razor_relocations_add(struct razor_relocations *relocations,
ali@351
   417
			   const char *oldpath, const char *newpath);
ali@351
   418
void razor_relocations_set_rpm(struct razor_relocations *relocations,
ali@351
   419
			       struct razor_rpm *rpm);
ali@351
   420
const char *razor_relocations_apply(struct razor_relocations *relocations,
ali@351
   421
				    const char *path);
ali@351
   422
void razor_relocations_destroy(struct razor_relocations *relocations);
ali@351
   423
ali@403
   424
struct razor_rpm *razor_rpm_open(const char *filename,
ali@403
   425
				 struct razor_atomic *atomic);
ali@369
   426
void razor_rpm_get_details(struct razor_rpm *rpm, ...);
ali@351
   427
void razor_rpm_set_relocations(struct razor_rpm *rpm,
ali@351
   428
			       struct razor_relocations *relocations);
ali@403
   429
int razor_rpm_install(struct razor_rpm *rpm, struct razor_atomic *atomic,
ali@403
   430
		      const char *root, int install_count,
ali@403
   431
		      enum razor_stage_type stage);
krh@262
   432
int razor_rpm_close(struct razor_rpm *rpm);
krh@262
   433
krh@262
   434
/**
krh@262
   435
 * SECTION:importer
krh@262
   436
 * @title: Importer
krh@262
   437
 * @short_description: A mechanism for building #razor_set objects
krh@262
   438
 *
krh@309
   439
 * The %razor_importer is a helper object for building a razor set
krh@309
   440
 * from external sources, like yum metadata, the RPM database or RPM
krh@309
   441
 * files.
krh@309
   442
 *
krh@309
   443
 * The importer is a stateful object; it has the notion of a current
krh@309
   444
 * package, and the caller can provide meta data such as properties,
krh@309
   445
 * files and similiar for the package as it becomes available.  Once a
krh@309
   446
 * package is fully described, the next pacakge can begin.  When all
krh@309
   447
 * packages have been described to the importer, the importer will
krh@309
   448
 * create a new %razor_set with the specified packages.
krh@309
   449
 *
krh@309
   450
 * A typical use
krh@309
   451
 * of the importer will follow this template:
krh@309
   452
 * |[
krh@309
   453
 * importer = razor_importer_create();
krh@309
   454
 *
krh@309
   455
 * while ( /<!-- -->* more packages to import *<!-- -->/; ) {
krh@309
   456
 *   /<!-- -->* get name, version and arch of next package *<!-- -->/
krh@309
   457
 *   razor_importer_begin_package(importer, name, version, arch);
krh@309
   458
 *   razor_importer_add_details(importer, summary, description, url, license);
krh@309
   459
 *
krh@309
   460
 *   while ( /<!-- -->* more properties to add *<!-- -->/ )
krh@309
   461
 *     razor_importer_add_property(importer, name, flags, version);
krh@309
   462
 *
krh@309
   463
 *   while ( /<!-- -->* [more files to add *<!-- -->/ )
krh@309
   464
 *     razor_importer_add_file(importer, name);
krh@309
   465
 *
krh@309
   466
 *   razor_importer_finish_package(importer);
krh@309
   467
 * }
krh@309
   468
 *
krh@309
   469
 * return razor_importer_finish(importer);
krh@309
   470
 * ]|
krh@262
   471
 **/
rhughes@241
   472
struct razor_importer;
rhughes@241
   473
krh@249
   474
struct razor_importer *razor_importer_create(void);
rhughes@241
   475
void razor_importer_destroy(struct razor_importer *importer);
rhughes@241
   476
void razor_importer_begin_package(struct razor_importer *importer,
rhughes@241
   477
				  const char *name,
rhughes@241
   478
				  const char *version,
rhughes@241
   479
				  const char *arch);
jbowes@258
   480
void razor_importer_add_details(struct razor_importer *importer,
jbowes@258
   481
				const char *summary,
jbowes@258
   482
				const char *description,
jbowes@258
   483
				const char *url,
jbowes@258
   484
				const char *license);
ali@369
   485
void razor_importer_add_script(struct razor_importer *importer,
ali@369
   486
			       enum razor_property_flags script,
ali@369
   487
			       const char *program,
ali@369
   488
			       const char *body);
ali@372
   489
void razor_importer_add_install_prefix(struct razor_importer *importer,
ali@372
   490
				       const char *install_prefix);
rhughes@241
   491
void razor_importer_add_property(struct razor_importer *importer,
rhughes@241
   492
				 const char *name,
krh@247
   493
				 uint32_t flags,
krh@247
   494
				 const char *version);
rhughes@241
   495
void razor_importer_add_file(struct razor_importer *importer,
rhughes@241
   496
			     const char *name);
rhughes@241
   497
void razor_importer_finish_package(struct razor_importer *importer);
rhughes@241
   498
rhughes@241
   499
int razor_importer_add_rpm(struct razor_importer *importer,
rhughes@241
   500
			   struct razor_rpm *rpm);
rhughes@241
   501
rhughes@241
   502
struct razor_set *razor_importer_finish(struct razor_importer *importer);
rhughes@241
   503
rhughes@241
   504
struct razor_set *razor_set_create_from_yum(void);
rhughes@241
   505
struct razor_set *razor_set_create_from_rpmdb(void);
rhughes@241
   506
krh@262
   507
/**
krh@262
   508
 * SECTION:root
krh@262
   509
 * @title: Root
krh@262
   510
 * @short_description: Functions for accessing an install root.
krh@262
   511
 *
krh@262
   512
 * The #razor_root object encapsulate access to and locking of a razor
krh@262
   513
 * install root.
krh@262
   514
 **/
rhughes@241
   515
struct razor_root;
rhughes@241
   516
rhughes@241
   517
int razor_root_create(const char *root);
ali@403
   518
struct razor_root *
ali@403
   519
razor_root_open(const char *root, struct razor_atomic *atomic);
ali@403
   520
struct razor_set *razor_root_open_read_only(const char *root,
ali@403
   521
					    struct razor_atomic *atomic);
krh@250
   522
struct razor_set *razor_root_get_system_set(struct razor_root *root);
krh@250
   523
int razor_root_close(struct razor_root *root);
krh@250
   524
void razor_root_update(struct razor_root *root, struct razor_set *next);
krh@250
   525
int razor_root_commit(struct razor_root *root);
rhughes@241
   526
krh@262
   527
/**
krh@262
   528
 * SECTION:misc
krh@262
   529
 * @title: Miscellaneous Functions
krh@262
   530
 * @short_description: Various helper functions
krh@262
   531
 *
krh@262
   532
 * Functions that doesn't fit anywhere else.
krh@262
   533
 **/
krh@262
   534
krh@262
   535
const char *
krh@262
   536
razor_property_relation_to_string(struct razor_property *p);
krh@262
   537
const char *
krh@262
   538
razor_property_type_to_string(struct razor_property *p);
krh@262
   539
krh@262
   540
void razor_build_evr(char *evr_buf, int size, const char *epoch,
krh@262
   541
		     const char *version, const char *release);
krh@262
   542
int razor_versioncmp(const char *s1, const char *s2);
krh@262
   543
ali@359
   544
void razor_disable_root_name_checks(int disable);
ali@359
   545
ali@361
   546
void razor_set_lua_loader(const char *modname, void (*loader)());
ali@368
   547
void (*razor_get_lua_loader(const char *modname))();
ali@361
   548
ali@403
   549
char *razor_concat(const char *s, ...) RAZOR_MALLOC RAZOR_NULL_TERMINATED;
ali@403
   550
ali@403
   551
const char *razor_system_arch(void);
krh@262
   552
rhughes@241
   553
#endif /* _RAZOR_H_ */