1 #ifndef H_RPMTS
2 #define H_RPMTS
3 
4 /** \ingroup rpmts
5  * \file lib/rpmts.h
6  * Structures and prototypes used for an "rpmts" transaction set.
7  */
8 
9 #include <sys/types.h>
10 
11 #include <rpm/rpmtypes.h>
12 #include <rpm/rpmte.h>
13 #include <rpm/rpmps.h>
14 #include <rpm/rpmsw.h>
15 #include <rpm/rpmpgp.h>
16 #include <rpm/rpmfi.h>
17 #include <rpm/rpmcallback.h>
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 
23 extern int _rpmts_stats;
24 
25 /** \ingroup rpmts
26  * Bit(s) to control rpmtsRun() operation.
27  */
28 enum rpmtransFlags_e {
29     RPMTRANS_FLAG_NONE		= 0,
30     RPMTRANS_FLAG_TEST		= (1 <<  0),	/*!< from --test */
31     RPMTRANS_FLAG_BUILD_PROBS	= (1 <<  1),	/*!< don't process payload */
32     RPMTRANS_FLAG_NOSCRIPTS	= (1 <<  2),	/*!< from --noscripts */
33     RPMTRANS_FLAG_JUSTDB	= (1 <<  3),	/*!< from --justdb */
34     RPMTRANS_FLAG_NOTRIGGERS	= (1 <<  4),	/*!< from --notriggers */
35     RPMTRANS_FLAG_NODOCS	= (1 <<  5),	/*!< from --excludedocs */
36     RPMTRANS_FLAG_ALLFILES	= (1 <<  6),	/*!< from --allfiles */
37     RPMTRANS_FLAG_NOPLUGINS	= (1 <<  7),	/*!< from --noplugins */
38     RPMTRANS_FLAG_NOCONTEXTS	= (1 <<  8),	/*!< from --nocontexts */
39     RPMTRANS_FLAG_NOCAPS	= (1 <<  9),	/*!< from --nocaps */
40     /* bits 10-15 unused */
41     RPMTRANS_FLAG_NOTRIGGERPREIN= (1 << 16),	/*!< from --notriggerprein */
42     RPMTRANS_FLAG_NOPRE		= (1 << 17),	/*!< from --nopre */
43     RPMTRANS_FLAG_NOPOST	= (1 << 18),	/*!< from --nopost */
44     RPMTRANS_FLAG_NOTRIGGERIN	= (1 << 19),	/*!< from --notriggerin */
45     RPMTRANS_FLAG_NOTRIGGERUN	= (1 << 20),	/*!< from --notriggerun */
46     RPMTRANS_FLAG_NOPREUN	= (1 << 21),	/*!< from --nopreun */
47     RPMTRANS_FLAG_NOPOSTUN	= (1 << 22),	/*!< from --nopostun */
48     RPMTRANS_FLAG_NOTRIGGERPOSTUN = (1 << 23),	/*!< from --notriggerpostun */
49     RPMTRANS_FLAG_NOPRETRANS	= (1 << 24),	/*!< from --nopretrans */
50     RPMTRANS_FLAG_NOPOSTTRANS	= (1 << 25),	/*!< from --noposttrans */
51     /* bit 26 unused */
52     RPMTRANS_FLAG_NOMD5		= (1 << 27),	/*!< from --nomd5 */
53     RPMTRANS_FLAG_NOFILEDIGEST	= (1 << 27),	/*!< from --nofiledigest (alias to --nomd5) */
54     /* bit 28 unused */
55     RPMTRANS_FLAG_NOARTIFACTS	= (1 << 29),	/*!< from --noartifacts */
56     RPMTRANS_FLAG_NOCONFIGS	= (1 << 30),	/*!< from --noconfigs */
57     RPMTRANS_FLAG_DEPLOOPS	= (1 << 31)	/*!< from --deploops */
58 };
59 
60 typedef rpmFlags rpmtransFlags;
61 
62 #define	_noTransScripts		\
63   ( RPMTRANS_FLAG_NOPRE |	\
64     RPMTRANS_FLAG_NOPOST |	\
65     RPMTRANS_FLAG_NOPREUN |	\
66     RPMTRANS_FLAG_NOPOSTUN |	\
67     RPMTRANS_FLAG_NOPRETRANS |	\
68     RPMTRANS_FLAG_NOPOSTTRANS \
69   )
70 
71 #define	_noTransTriggers	\
72   ( RPMTRANS_FLAG_NOTRIGGERPREIN | \
73     RPMTRANS_FLAG_NOTRIGGERIN |	\
74     RPMTRANS_FLAG_NOTRIGGERUN |	\
75     RPMTRANS_FLAG_NOTRIGGERPOSTUN \
76   )
77 
78 /* Avoid unnecessary breakage for stuff referring to these unused flags */
79 #define RPMTRANS_FLAG_NOPAYLOAD 0
80 #define RPMTRANS_FLAG_APPLYONLY 0
81 #define RPMTRANS_FLAG_KEEPOBSOLETE 0
82 #define RPMTRANS_FLAG_DIRSTASH 0
83 #define RPMTRANS_FLAG_REPACKAGE 0
84 #define RPMTRANS_FLAG_PKGCOMMIT 0
85 #define RPMTRANS_FLAG_PKGUNDO 0
86 #define RPMTRANS_FLAG_COMMIT 0
87 #define RPMTRANS_FLAG_UNDO 0
88 #define RPMTRANS_FLAG_REVERSE 0
89 #define RPMTRANS_FLAG_NOSUGGEST 0
90 #define RPMTRANS_FLAG_ADDINDEPS 0
91 
92 /** \ingroup rpmts
93  * Bit(s) to control digest and signature verification.
94  */
95 enum rpmVSFlags_e {
96     RPMVSF_DEFAULT	= 0,
97     RPMVSF_NOHDRCHK	= (1 <<  0),
98     RPMVSF_NEEDPAYLOAD	= (1 <<  1),
99     /* bit(s) 2-7 unused */
100     RPMVSF_NOSHA1HEADER	= (1 <<  8),
101     RPMVSF_NOSHA256HEADER = (1 <<  9),
102     RPMVSF_NODSAHEADER	= (1 << 10),
103     RPMVSF_NORSAHEADER	= (1 << 11),
104     /* bit(s) 12-15 unused */
105     RPMVSF_NOPAYLOAD	= (1 << 16),
106     RPMVSF_NOMD5	= (1 << 17),
107     RPMVSF_NODSA	= (1 << 18),
108     RPMVSF_NORSA	= (1 << 19)
109     /* bit(s) 16-31 unused */
110 };
111 
112 typedef rpmFlags rpmVSFlags;
113 
114 #define	RPMVSF_MASK_NODIGESTS	\
115   ( RPMVSF_NOSHA1HEADER |	\
116     RPMVSF_NOSHA256HEADER |	\
117     RPMVSF_NOPAYLOAD |	\
118     RPMVSF_NOMD5 )
119 #define	_RPMVSF_NODIGESTS	RPMVSF_MASK_NODIGESTS
120 
121 #define	RPMVSF_MASK_NOSIGNATURES	\
122   ( RPMVSF_NODSAHEADER |	\
123     RPMVSF_NORSAHEADER |	\
124     RPMVSF_NODSA |		\
125     RPMVSF_NORSA )
126 #define	_RPMVSF_NOSIGNATURES	RPMVSF_MASK_NOSIGNATURES
127 
128 #define	RPMVSF_MASK_NOHEADER	\
129   ( RPMVSF_NOSHA1HEADER |	\
130     RPMVSF_NOSHA256HEADER |	\
131     RPMVSF_NODSAHEADER |	\
132     RPMVSF_NORSAHEADER )
133 #define	_RPMVSF_NOHEADER	RPMVSF_MASK_NOHEADER
134 
135 #define	RPMVSF_MASK_NOPAYLOAD	\
136   ( RPMVSF_NOMD5 |		\
137     RPMVSF_NOPAYLOAD |		\
138     RPMVSF_NODSA |		\
139     RPMVSF_NORSA )
140 #define	_RPMVSF_NOPAYLOAD	RPMVSF_MASK_NOPAYLOAD
141 
142 enum {
143     RPMSIG_NONE_TYPE		= 0,
144     RPMSIG_DIGEST_TYPE		= (1 << 0),
145     RPMSIG_SIGNATURE_TYPE	= (1 << 1),
146     RPMSIG_OTHER_TYPE		= (1 << 2),
147 };
148 
149 #define RPMSIG_VERIFIABLE_TYPE (RPMSIG_DIGEST_TYPE|RPMSIG_SIGNATURE_TYPE)
150 #define RPMSIG_UNVERIFIED_TYPE 	(1 << 30)
151 
152 /** \ingroup rpmts
153  * Indices for timestamps.
154  */
155 typedef	enum rpmtsOpX_e {
156     RPMTS_OP_TOTAL		=  0,
157     RPMTS_OP_CHECK		=  1,
158     RPMTS_OP_ORDER		=  2,
159     RPMTS_OP_FINGERPRINT	=  3,
160     RPMTS_OP_INSTALL		=  5,
161     RPMTS_OP_ERASE		=  6,
162     RPMTS_OP_SCRIPTLETS		=  7,
163     RPMTS_OP_COMPRESS		=  8,
164     RPMTS_OP_UNCOMPRESS		=  9,
165     RPMTS_OP_DIGEST		= 10,
166     RPMTS_OP_SIGNATURE		= 11,
167     RPMTS_OP_DBADD		= 12,
168     RPMTS_OP_DBREMOVE		= 13,
169     RPMTS_OP_DBGET		= 14,
170     RPMTS_OP_DBPUT		= 15,
171     RPMTS_OP_DBDEL		= 16,
172     RPMTS_OP_VERIFY		= 17,
173     RPMTS_OP_MAX		= 18
174 } rpmtsOpX;
175 
176 enum rpmtxnFlags_e {
177     RPMTXN_READ		= (1 << 0),
178     RPMTXN_WRITE	= (1 << 1),
179 };
180 typedef rpmFlags rpmtxnFlags;
181 
182 /** \ingroup rpmts
183  * Perform dependency resolution on the transaction set.
184  *
185  * Any problems found by rpmtsCheck() can be examined by retrieving the
186  * problem set with rpmtsProblems(), success here only means that
187  * the resolution was successfully attempted for all packages in the set.
188  *
189  * @param ts		transaction set
190  * @return		0 on success
191  */
192 int rpmtsCheck(rpmts ts);
193 
194 /** \ingroup rpmts
195  * Determine package order in a transaction set according to dependencies.
196  *
197  * Order packages, returning error if circular dependencies cannot be
198  * eliminated by removing Requires's from the loop(s). Only dependencies from
199  * added or removed packages are used to determine ordering using a
200  * topological sort (Knuth vol. 1, p. 262). Use rpmtsCheck() to verify
201  * that all dependencies can be resolved.
202  *
203  * The final order ends up as installed packages followed by removed packages,
204  * with packages removed for upgrades immediately following the new package
205  * to be installed.
206  *
207  * @param ts		transaction set
208  * @return		no. of (added) packages that could not be ordered
209  */
210 int rpmtsOrder(rpmts ts);
211 
212 /** \ingroup rpmts
213  * Process all package elements in a transaction set.  Before calling
214  * rpmtsRun be sure to have:
215  *
216  *    - setup the rpm root dir via rpmtsSetRoot().
217  *    - setup the rpm notify callback via rpmtsSetNotifyCallback().
218  *    - setup the rpm transaction flags via rpmtsSetFlags().
219  *
220  * Additionally, though not required you may want to:
221  *
222  *    - setup the rpm verify signature flags via rpmtsSetVSFlags().
223  *
224  * @param ts		transaction set
225  * @param okProbs	unused
226  * @param ignoreSet	bits to filter problem types
227  * @return		0 on success, -1 on error, >0 with newProbs set
228  */
229 int rpmtsRun(rpmts ts, rpmps okProbs, rpmprobFilterFlags ignoreSet);
230 
231 /** \ingroup rpmts
232  * Reference a transaction set instance.
233  * @param ts		transaction set
234  * @return		new transaction set reference
235  */
236 rpmts rpmtsLink (rpmts ts);
237 
238 /** \ingroup rpmts
239  * Close the database used by the transaction.
240  * @param ts		transaction set
241  * @return		0 on success
242  */
243 int rpmtsCloseDB(rpmts ts);
244 
245 /** \ingroup rpmts
246  * Open the database used by the transaction.
247  * @param ts		transaction set
248  * @param dbmode	O_RDONLY or O_RDWR
249  * @return		0 on success
250  */
251 int rpmtsOpenDB(rpmts ts, int dbmode);
252 
253 /** \ingroup rpmts
254  * Initialize the database used by the transaction.
255  * @deprecated An explicit rpmdbInit() is almost never needed.
256  * @param ts		transaction set
257  * @param dbmode	O_RDONLY or O_RDWR
258  * @return		0 on success
259  */
260 int rpmtsInitDB(rpmts ts, int dbmode);
261 
262 /** \ingroup rpmts
263  * Return the transaction database mode
264  * @param ts		transaction set
265  * @return		O_RDONLY, O_RDWR or -1 (lazy opens disabled)
266  */
267 int rpmtsGetDBMode(rpmts ts);
268 
269 /** \ingroup rpmts
270  * Set the transaction database mode. Only permitted when when backing
271  * database hasn't been opened yet (ie rpmtsGetRdb(ts) == NULL)
272  * @param ts		transaction set
273  * @param dbmode	O_RDONLY, O_RDWR or -1 (disable lazy opens)
274  * @return		0 on success, 1 on error
275  */
276 int rpmtsSetDBMode(rpmts ts, int dbmode);
277 
278 /** \ingroup rpmts
279  * Rebuild the database used by the transaction.
280  * @param ts		transaction set
281  * @return		0 on success
282  */
283 int rpmtsRebuildDB(rpmts ts);
284 
285 /** \ingroup rpmts
286  * Verify the database used by the transaction.
287  * @param ts		transaction set
288  * @return		0 on success
289  */
290 int rpmtsVerifyDB(rpmts ts);
291 
292 /** \ingroup rpmts
293  * Return transaction database iterator.
294  * @param ts		transaction set
295  * @param rpmtag	database index tag
296  * @param keyp		key data (NULL for sequential access)
297  * @param keylen	key data length (0 will use strlen(keyp))
298  * @return		NULL on failure
299  */
300 rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmDbiTagVal rpmtag,
301 			const void * keyp, size_t keylen);
302 
303 /** \ingroup rpmts
304  * Import a header into the rpmdb
305  * @param txn		transaction handle
306  * @param h		header
307  * @param flags		(unused)
308  * @return              RPMRC_OK/RPMRC_FAIL
309  */
310 rpmRC rpmtsImportHeader(rpmtxn txn, Header h, rpmFlags flags);
311 
312 /** \ingroup rpmts
313  * Import public key packet(s).
314  * @todo Implicit --update policy for gpg-pubkey headers.
315  * @param ts            transaction set
316  * @param pkt           pgp pubkey packet(s)
317  * @param pktlen        pgp pubkey length
318  * @return              RPMRC_OK/RPMRC_FAIL
319  */
320 rpmRC rpmtsImportPubkey(rpmts ts, const unsigned char * pkt, size_t pktlen);
321 
322 /** \ingroup rpmts
323  * Retrieve handle for keyring used for this transaction set
324  * @param ts            transaction set
325  * @param autoload	load default keyring if keyring is not set
326  * @return              keyring handle (or NULL)
327  */
328 rpmKeyring rpmtsGetKeyring(rpmts ts, int autoload);
329 
330 /** \ingroup rpmts
331  * Set keyring to use for this transaction set.
332  * Keyring can be only changed while the underlying rpm database is not
333  * yet open.
334  * @param ts            transaction set
335  * @param keyring	keyring handle (NULL to free current keyring)
336  * @return              0 on success, -1 on error
337  */
338 int rpmtsSetKeyring(rpmts ts, rpmKeyring keyring);
339 
340 /** \ingroup rpmts
341  * Set dependency solver callback.
342  * @param ts		transaction set
343  * @param (*solve)	dependency solver callback
344  * @param solveData	dependency solver callback data (opaque)
345  * @return		0 on success
346  */
347 int rpmtsSetSolveCallback(rpmts ts,
348 		int (*solve) (rpmts ts, rpmds ds, const void * data),
349 		const void * solveData);
350 
351 /** \ingroup rpmts
352  * Return current transaction set problems.
353  * @param ts		transaction set
354  * @return		current problem set (or NULL if no problems)
355  */
356 rpmps rpmtsProblems(rpmts ts);
357 
358 /** \ingroup rpmts
359  * Clean current transaction problem set.
360  * @param ts		transaction set
361  */
362 void rpmtsCleanProblems(rpmts ts);
363 
364 /** \ingroup rpmts
365  * Free memory needed only for dependency checks and ordering.
366  * @param ts		transaction set
367  */
368 void rpmtsClean(rpmts ts);
369 
370 /** \ingroup rpmts
371  * Re-create an empty transaction set.
372  * @param ts		transaction set
373  */
374 void rpmtsEmpty(rpmts ts);
375 
376 /** \ingroup rpmts
377  * Destroy transaction set, closing the database as well.
378  * @param ts		transaction set
379  * @return		NULL always
380  */
381 rpmts rpmtsFree(rpmts ts);
382 
383 /** \ingroup rpmts
384  * Get verify signatures flag(s).
385  * @param ts		transaction set
386  * @return		verify signatures flags
387  */
388 rpmVSFlags rpmtsVSFlags(rpmts ts);
389 
390 /** \ingroup rpmts
391  * Set verify signatures flag(s).
392  * @param ts		transaction set
393  * @param vsflags	new verify signatures flags
394  * @return		previous value
395  */
396 rpmVSFlags rpmtsSetVSFlags(rpmts ts, rpmVSFlags vsflags);
397 
398 /** \ingroup rpmts
399  * Get package verify flag(s).
400  * @param ts		transaction set
401  * @return		verify signatures flags
402  */
403 rpmVSFlags rpmtsVfyFlags(rpmts ts);
404 
405 /** \ingroup rpmts
406  * Set package verify flag(s).
407  * @param ts		transaction set
408  * @param vfyflags	new package verify flags
409  * @return		old package verify flags
410  */
411 rpmVSFlags rpmtsSetVfyFlags(rpmts ts, rpmVSFlags vfyflags);
412 
413 /** \ingroup rpmts
414  * Get enforced package verify level
415  * @param ts		transaction set
416  * @return		package verify level
417  */
418 int rpmtsVfyLevel(rpmts ts);
419 
420 /** \ingroup rpmts
421  * Set enforced package verify level
422  * @param ts		transaction set
423  * @param vfylevel	new package verify level
424  * @return		old package verify level
425  */
426 int rpmtsSetVfyLevel(rpmts ts, int vfylevel);
427 
428 /** \ingroup rpmts
429  * Get transaction rootDir, i.e. path to chroot(2).
430  * @param ts		transaction set
431  * @return		transaction rootDir
432  */
433 const char * rpmtsRootDir(rpmts ts);
434 
435 /** \ingroup rpmts
436  * Set transaction rootDir, i.e. path to chroot(2).
437  * @param ts		transaction set
438  * @param rootDir	new transaction rootDir (or NULL)
439  * @return		0 on success, -1 on error (invalid rootDir)
440  */
441 int rpmtsSetRootDir(rpmts ts, const char * rootDir);
442 
443 /** \ingroup rpmts
444  * Get transaction script file handle, i.e. stdout/stderr on scriptlet execution
445  * @param ts		transaction set
446  * @return		transaction script file handle
447  */
448 FD_t rpmtsScriptFd(rpmts ts);
449 
450 /** \ingroup rpmts
451  * Set transaction script file handle, i.e. stdout/stderr on scriptlet execution
452  * @param ts		transaction set
453  * @param scriptFd	new script file handle (or NULL)
454  */
455 void rpmtsSetScriptFd(rpmts ts, FD_t scriptFd);
456 
457 /** \ingroup rpmts
458  * Get transaction id, i.e. transaction time stamp.
459  * @param ts		transaction set
460  * @return		transaction id
461  */
462 rpm_tid_t rpmtsGetTid(rpmts ts);
463 
464 /** \ingroup rpmts
465  * Set transaction id, i.e. transaction time stamp.
466  * @param ts		transaction set
467  * @param tid		new transaction id
468  * @return		previous transaction id
469  */
470 rpm_tid_t rpmtsSetTid(rpmts ts, rpm_tid_t tid);
471 
472 /** \ingroup rpmts
473  * Get transaction set database handle.
474  * @param ts		transaction set
475  * @return		transaction database handle
476  */
477 rpmdb rpmtsGetRdb(rpmts ts);
478 
479 /** \ingroup rpmts
480  * Perform transaction progress notify callback.
481  * @param ts		transaction set
482  * @param te		current transaction element
483  * @param what		type of call back
484  * @param amount	current value
485  * @param total		final value
486  * @return		callback dependent pointer
487  */
488 void * rpmtsNotify(rpmts ts, rpmte te,
489                 rpmCallbackType what, rpm_loff_t amount, rpm_loff_t total);
490 
491 /** \ingroup rpmts
492  * Return number of (ordered) transaction set elements.
493  * @param ts		transaction set
494  * @return		no. of transaction set elements
495  */
496 int rpmtsNElements(rpmts ts);
497 
498 /** \ingroup rpmts
499  * Return (ordered) transaction set element.
500  * @param ts		transaction set
501  * @param ix		transaction element index
502  * @return		transaction element (or NULL)
503  */
504 rpmte rpmtsElement(rpmts ts, int ix);
505 
506 /** \ingroup rpmts
507  * Get problem ignore bit mask, i.e. bits to filter encountered problems.
508  * @param ts		transaction set
509  * @return		ignore bit mask
510  */
511 rpmprobFilterFlags rpmtsFilterFlags(rpmts ts);
512 
513 /** \ingroup rpmts
514  * Get transaction flags, i.e. bits that control rpmtsRun().
515  * @param ts		transaction set
516  * @return		transaction flags
517  */
518 rpmtransFlags rpmtsFlags(rpmts ts);
519 
520 /** \ingroup rpmts
521  * Set transaction flags, i.e. bits that control rpmtsRun().
522  * @param ts		transaction set
523  * @param transFlags	new transaction flags
524  * @return		previous transaction flags
525  */
526 rpmtransFlags rpmtsSetFlags(rpmts ts, rpmtransFlags transFlags);
527 
528 /** \ingroup rpmts
529  * Retrieve color bits of transaction set.
530  * @param ts		transaction set
531  * @return		color bits
532  */
533 rpm_color_t rpmtsColor(rpmts ts);
534 
535 /** \ingroup rpmts
536  * Retrieve preferred file color
537  * @param ts		transaction set
538  * @return		color bits
539  */
540 rpm_color_t rpmtsPrefColor(rpmts ts);
541 
542 /** \ingroup rpmts
543  * Set color bits of transaction set.
544  * @param ts		transaction set
545  * @param color		new color bits
546  * @return		previous color bits
547  */
548 rpm_color_t rpmtsSetColor(rpmts ts, rpm_color_t color);
549 
550 /** \ingroup rpmts
551  * Set preferred file color
552  * @param ts		transaction set
553  * @param color		new color bits
554  * @return		previous color bits
555  */
556 rpm_color_t rpmtsSetPrefColor(rpmts ts, rpm_color_t color);
557 
558 /** \ingroup rpmts
559  * Retrieve operation timestamp from a transaction set.
560  * @param ts		transaction set
561  * @param opx		operation timestamp index
562  * @return		pointer to operation timestamp.
563  */
564 rpmop rpmtsOp(rpmts ts, rpmtsOpX opx);
565 
566 /** \ingroup rpmts
567  * Get the plugins associated with a transaction set
568  * @param ts		transaction set
569  * @return		plugins
570  */
571 rpmPlugins rpmtsPlugins(rpmts ts);
572 
573 /** \ingroup rpmts
574  * Set transaction notify callback function and argument.
575  *
576  * @warning This call must be made before rpmtsRun() for
577  *	install/upgrade/freshen to function correctly.
578  *
579  * @param ts		transaction set
580  * @param notify	progress callback
581  * @param notifyData	progress callback private data
582  * @return		0 on success
583  */
584 int rpmtsSetNotifyCallback(rpmts ts,
585 		rpmCallbackFunction notify,
586 		rpmCallbackData notifyData);
587 
588 /** \ingroup rpmts
589  * Create an empty transaction set.
590  * @return		new transaction set
591  */
592 rpmts rpmtsCreate(void);
593 
594 /** \ingroup rpmts
595  * Add package to be installed to transaction set.
596  *
597  * The transaction set is checked for duplicate package names.
598  * If found, the package with the "newest" EVR will be replaced.
599  *
600  * @param ts		transaction set
601  * @param h		header
602  * @param key		package retrieval key (e.g. file name)
603  * @param upgrade	is package being upgraded?
604  * @param relocs	package file relocations
605  * @return		0 on success, 1 on I/O error, 2 needs capabilities
606  */
607 int rpmtsAddInstallElement(rpmts ts, Header h,
608 		const fnpyKey key, int upgrade,
609 		rpmRelocation * relocs);
610 
611 /** \ingroup rpmts
612  * Add package to be reinstalled to transaction set.
613  *
614  * @param ts		transaction set
615  * @param h		header
616  * @param key		package retrieval key (e.g. file name)
617  * @return		0 on success
618  */
619 int rpmtsAddReinstallElement(rpmts ts, Header h, const fnpyKey key);
620 
621 /** \ingroup rpmts
622  * Add package to be erased to transaction set.
623  * @param ts		transaction set
624  * @param h		header
625  * @param dboffset	ununsed
626  * @return		0 on success, 1 on error (not installed)
627  */
628 int rpmtsAddEraseElement(rpmts ts, Header h, int dboffset);
629 
630 /** \ingroup rpmts
631  * Create a transaction (lock) handle
632  * @param ts		transaction set
633  * @param flags		flags
634  * @return		transaction handle
635  */
636 rpmtxn rpmtxnBegin(rpmts ts, rpmtxnFlags flags);
637 
638 /** \ingroup rpmts
639  * Destroy transaction (lock) handle
640  * @param txn		transaction handle
641  * @return		NULL always
642  */
643 rpmtxn rpmtxnEnd(rpmtxn txn);
644 
645 /** \ingroup rpmte
646  * Destroy transaction element iterator.
647  * @param tsi		transaction element iterator
648  * @return		NULL always
649  */
650 rpmtsi rpmtsiFree(rpmtsi tsi);
651 
652 /** \ingroup rpmte
653  * Create transaction element iterator.
654  * @param ts		transaction set
655  * @return		transaction element iterator
656  */
657 rpmtsi rpmtsiInit(rpmts ts);
658 
659 /** \ingroup rpmte
660  * Return next transaction element of type.
661  * @param tsi		transaction element iterator
662  * @param types		transaction element type selector (0 for any)
663  * @return		next transaction element of type, NULL on termination
664  */
665 rpmte rpmtsiNext(rpmtsi tsi, rpmElementTypes types);
666 
667 #ifdef __cplusplus
668 }
669 #endif
670 
671 
672 #endif	/* H_RPMTS */
673