1 /* RPM - Copyright (C) 1995 Red Hat Software
3 * header.h - routines for managing rpm tagged structures
6 /* WARNING: 1 means success, 0 means failure (yes, this is backwards) */
12 #if defined(__alpha__)
13 typedef long int int_64;
15 typedef short int int_16;
18 typedef unsigned int uint_32;
19 typedef unsigned short uint_16;
23 typedef long long int int_64;
25 typedef short int int_16;
28 typedef unsigned int uint_32;
29 typedef unsigned short uint_16;
32 typedef struct headerToken *Header;
33 typedef struct headerIteratorS *HeaderIterator;
35 struct headerTagTableEntry {
40 enum headerSprintfExtenstionType { HEADER_EXT_TAG, HEADER_EXT_FORMAT,
41 HEADER_EXT_MORE, HEADER_EXT_LAST = 0};
43 /* This will only ever be passed RPM_TYPE_INT32 or RPM_TYPE_STRING to
44 help keep things simple */
45 typedef char * (*headerTagFormatFunction)(int_32 type, const void * data,
47 int padding, int element);
49 struct headerSprintfExtension {
50 enum headerSprintfExtenstionType type;
54 headerTagFormatFunction formatFunction;
55 struct headerSprintfExtension * more;
59 /* This defines some basic conversions all header users would probably like
61 extern const struct headerSprintfExtension headerDefaultFormats[];
63 /* read and write a header from a file */
64 Header headerRead(int fd, int magicp);
65 void headerWrite(int fd, Header h, int magicp);
66 unsigned int headerSizeof(Header h, int magicp);
68 #define HEADER_MAGIC_NO 0
69 #define HEADER_MAGIC_YES 1
71 /* load and unload a header from a chunk of memory */
72 Header headerLoad(void *p);
73 void *headerUnload(Header h);
75 Header headerNew(void);
76 void headerFree(Header h);
78 /* dump a header to a file, in human readable format */
79 void headerDump(Header h, FILE *f, int flags,
80 const struct headerTagTableEntry * tags);
82 /* the returned string must be free()d */
83 char * headerSprintf(Header h, const char * fmt,
84 const struct headerTagTableEntry * tags,
85 const struct headerSprintfExtension * extentions,
88 #define HEADER_DUMP_INLINE 1
90 /* I18N items need an RPM_STRING_TYPE entry (used by default) and an
91 RPM_18NSTRING_TYPE table added. Dups are okay, but only defined for
92 iteration (with the exceptions noted below) */
93 int headerAddEntry(Header h, int_32 tag, int_32 type, void *p, int_32 c);
94 int headerModifyEntry(Header h, int_32 tag, int_32 type, void *p, int_32 c);
96 /* Appends item p to entry w/ tag and type as passed. Won't work on
97 RPM_STRING_TYPE. Any pointers from headerGetEntry() for this entry
98 are invalid after this call has been made! */
99 int headerAppendEntry(Header h, int_32 tag, int_32 type, void * p, int_32 c);
101 /* Will never return RPM_I18NSTRING_TYPE! RPM_STRING_TYPE elements w/
102 RPM_I18NSTRING_TYPE equivalent enreies are translated (if HEADER_I18NTABLE
103 entry is present). */
104 int headerGetEntry(Header h, int_32 tag, int_32 *type, void **p, int_32 *c);
106 /* If *type is RPM_NULL_TYPE any type will match, otherwise only *type will
108 int headerGetRawEntry(Header h, int_32 tag, int_32 *type, void **p, int_32 *c);
110 int headerIsEntry(Header h, int_32 tag);
111 /* removes all entries of type tag from the header, returns 1 if none were
113 int headerRemoveEntry(Header h, int_32 tag);
115 HeaderIterator headerInitIterator(Header h);
116 int headerNextIterator(HeaderIterator iter,
117 int_32 *tag, int_32 *type, void **p, int_32 *c);
118 void headerFreeIterator(HeaderIterator iter);
120 Header headerCopy(Header h);
121 void headerSort(Header h);
125 #define RPM_NULL_TYPE 0
126 #define RPM_CHAR_TYPE 1
127 #define RPM_INT8_TYPE 2
128 #define RPM_INT16_TYPE 3
129 #define RPM_INT32_TYPE 4
130 /* #define RPM_INT64_TYPE 5 ---- These aren't supported (yet) */
131 #define RPM_STRING_TYPE 6
132 #define RPM_BIN_TYPE 7
133 #define RPM_STRING_ARRAY_TYPE 8
134 #define RPM_I18NSTRING_TYPE 9
136 /* Tags -- general use tags should start at 1000 (RPM's tag space starts
139 #define HEADER_I18NTABLE 100