summaryrefslogtreecommitdiffstats
path: root/src/ustar.h
blob: 220603a170818d159db710b7d91b9ccc8b3fc70c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/*
 * Copyright (C) 2023  Patrick McDermott
 *
 * This file is part of opkg-opk.
 *
 * opkg-opk is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * opkg-opk is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with opkg-opk.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef OPKG_OPK_USTAR_H_
#define OPKG_OPK_USTAR_H_

#include <stdint.h>
#include "gzip.h"

#define OPKG_OPK_USTAR_RECORD_SIZE 512
#define OPKG_OPK_USTAR_NAME_SIZE   257  /* prefix[155] + '/' + name[100] + '\0'
                                         */

struct opkg_opk_ustar;

struct opkg_opk_ustar_member {
	char                          name[OPKG_OPK_USTAR_NAME_SIZE];
	uint16_t                      mode;
	uint64_t                      size;
	int64_t                       mtime;
	char                          type;
	char                          linkname[101];
	char                          uname    [32];
	char                          gname    [32];
	struct opkg_opk_ustar_member *next;
};

struct opkg_opk_ustar_seek_name;

/*
 * Allocates and initializes an archive structure.
 * Parameters:
 * - gzip: Decompressor for archive's gzip stream.
 * Returns:
 * - Allocated archive structure on success.  Free with opkg_opk_ustar_free().
 * - NULL on memory exhaustion.
 */
struct opkg_opk_ustar *
opkg_opk_ustar_init(struct opkg_opk_gzip *gzip);

/*
 * Lists member files one at a time.
 * Parameters:
 * - ustar:  Archive structure.
 * - member: Address in which to store address of allocated member structure.
 *           Free with free().
 * Returns:
 * - OPKG_OPK_OK if a member was listed.  More members may exist.
 * - OPKG_OPK_END if no more members exist.  Parameter "member" is unchanged.
 * - OPKG_OPK_ERROR on decompression error, memory exhaustion, mode or mtime
 *   integer conversion error, or unsupported file type.
 */
int
opkg_opk_ustar_list(struct opkg_opk_ustar *ustar,
		struct opkg_opk_ustar_member **member);

/*
 * Adds a name to a list of names to find with opkg_opk_ustar_seek().  List is
 * dynamically allocated; free with opkg_opk_ustar_free_seek_names().
 * Parameters:
 * - names: Address in which to store address of list.
 * - name:  Name of member file to find.
 * Returns:
 * - OPKG_OPK_OK if the name was added to the list.
 * - OPKG_OPK_ERROR on memory exhaustion.
 */
int
opkg_opk_ustar_add_seek_name(struct opkg_opk_ustar_seek_name **names,
		const char *name);

/*
 * Frees a list of names to find with opkg_opk_ustar_seek().
 * Parameters:
 * - names: List of names.
 */
void
opkg_opk_ustar_free_seek_names(struct opkg_opk_ustar_seek_name *names);

/*
 * Advances to a named member file.  May be called multiple times until all
 * requested members are found.
 * Parameters:
 * - ustar: Archive structure.
 * - names: Name(s) to find.
 * Returns:
 * - OPKG_OPK_OK if a member matching one of the requested names is found but
 *   more names remain to be found.
 * - OPKG_OPK_END if a member matching one of the requested names is found and
 *   no more names remain to be found.
 * - OPKG_OPK_ERROR if no matching member is found or on decompression error, an
 *   invalid header, or unsupported file type.
 */
int
opkg_opk_ustar_seek(struct opkg_opk_ustar *ustar,
		struct opkg_opk_ustar_seek_name *names);

/*
 * Advances to a named member file.
 * Parameters:
 * - ustar: Archive structure.
 * - name:  Name to find.
 * Returns:
 * - OPKG_OPK_OK if a member matching the requested name is found.
 * - OPKG_OPK_ERROR if no matching member is found or on decompression error, an
 *   invalid header, or unsupported file type.
 */
int
opkg_opk_ustar_seek_one(struct opkg_opk_ustar *ustar, const char *name);

/*
 * Reads up to a record (512 octets) of member file data at a time.
 * Parameters:
 * - ustar:  Archive structure.
 * - buffer: Address in which to store address of data buffer.  May be NULL.  Do
 *   not free.
 * - size:   Address in which to store size of read data.  May be NULL.
 * Returns:
 * - OPKG_OPK_OK if data was read.
 * - OPKG_OPK_END if no more data exists.
 * - OPKG_OPK_ERROR on decompression error or premature end of gzip stream.
 */
int
opkg_opk_ustar_read(struct opkg_opk_ustar *ustar, char **buffer, size_t *size);

/*
 * Frees an archive structure.
 * Parameters:
 * - ustar: Archive structure.
 */
void
opkg_opk_ustar_free(struct opkg_opk_ustar *ustar);

#endif  /* OPKG_OPK_USTAR_H_ */