1 #ifndef H_HEADER_INTERNAL
2 #define H_HEADER_INTERNAL
3
4 /** \ingroup header
5 * \file lib/header_internal.h
6 */
7
8 #include <rpm/header.h>
9 #include <netinet/in.h>
10
11 /** \ingroup header
12 * Description of tag data.
13 */
14 typedef struct entryInfo_s * entryInfo;
15 struct entryInfo_s {
16 rpm_tag_t tag; /*!< Tag identifier. */
17 rpm_tagtype_t type; /*!< Tag data type. */
18 int32_t offset; /*!< Offset into data segment (ondisk only). */
19 rpm_count_t count; /*!< Number of tag elements. */
20 };
21
22 typedef struct hdrblob_s * hdrblob;
23 struct hdrblob_s {
24 int32_t *ei;
25 int32_t il;
26 int32_t dl;
27 entryInfo pe;
28 int32_t pvlen;
29 uint8_t *dataStart;
30 uint8_t *dataEnd;
31
32 rpmTagVal regionTag;
33 int32_t ril;
34 int32_t rdl;
35 };
36
37 #ifdef __cplusplus
38 extern "C" {
39 #endif
40
41 /* convert entry info to host endianess */
ei2h(const struct entryInfo_s * pe,struct entryInfo_s * info)42 static inline void ei2h(const struct entryInfo_s *pe, struct entryInfo_s *info)
43 {
44 info->tag = ntohl(pe->tag);
45 info->type = ntohl(pe->type);
46 info->offset = ntohl(pe->offset);
47 info->count = ntohl(pe->count);
48 }
49
ei2td(const struct entryInfo_s * info,unsigned char * dataStart,size_t len,struct rpmtd_s * td)50 static inline void ei2td(const struct entryInfo_s *info,
51 unsigned char * dataStart, size_t len,
52 struct rpmtd_s *td)
53 {
54 td->tag = info->tag;
55 td->type = info->type;
56 td->count = info->count;
57 td->size = len;
58 td->data = dataStart + info->offset;
59 td->ix = -1;
60 td->flags = RPMTD_IMMUTABLE;
61 }
62
63 RPM_GNUC_INTERNAL
64 hdrblob hdrblobCreate(void);
65
66 RPM_GNUC_INTERNAL
67 hdrblob hdrblobFree(hdrblob blob);
68
69 RPM_GNUC_INTERNAL
70 rpmRC hdrblobInit(const void *uh, size_t uc,
71 rpmTagVal regionTag, int exact_size,
72 struct hdrblob_s *blob, char **emsg);
73
74 RPM_GNUC_INTERNAL
75 rpmRC hdrblobRead(FD_t fd, int magic, int exact_size, rpmTagVal regionTag, hdrblob blob, char **emsg);
76
77 RPM_GNUC_INTERNAL
78 rpmRC hdrblobImport(hdrblob blob, int fast, Header *hdrp, char **emsg);
79
80 RPM_GNUC_INTERNAL
81 rpmRC hdrblobGet(hdrblob blob, uint32_t tag, rpmtd td);
82
83 /** \ingroup header
84 * Set header instance (rpmdb record number)
85 * @param h header
86 * @param instance record number
87 */
88 RPM_GNUC_INTERNAL
89 void headerSetInstance(Header h, unsigned int instance);
90
91 /* Package IO helper to consolidate partial read and error handling */
92 RPM_GNUC_INTERNAL
93 ssize_t Freadall(FD_t fd, void * buf, ssize_t size);
94
95 RPM_GNUC_INTERNAL
96 int headerIsSourceHeuristic(Header h);
97 #ifdef __cplusplus
98 }
99 #endif
100
101 #endif /* H_HEADER_INTERNAL */
102