annotate libzip/lib/zip_extra_field_api.c @ 63:b3c185090dc2

cmake: use BUILD_INTERFACE, closes #881 @10m
author David Demelier <markand@malikania.fr>
date Fri, 13 Jul 2018 12:32:37 +0200
parents 2306f4b04790
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 zip_extra_field_api.c -- public extra fields API functions
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 Copyright (C) 2012-2014 Dieter Baron and Thomas Klausner
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
4
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 This file is part of libzip, a library to manipulate ZIP archives.
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 The authors can be contacted at <libzip@nih.at>
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
7
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 Redistribution and use in source and binary forms, with or without
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 modification, are permitted provided that the following conditions
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 are met:
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 1. Redistributions of source code must retain the above copyright
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 notice, this list of conditions and the following disclaimer.
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 2. Redistributions in binary form must reproduce the above copyright
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 notice, this list of conditions and the following disclaimer in
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 the documentation and/or other materials provided with the
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 distribution.
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 3. The names of the authors may not be used to endorse or promote
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
18 products derived from this software without specific prior
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 written permission.
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
20
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 */
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
33
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
34
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 #include "zipint.h"
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
36
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
37
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 ZIP_EXTERN int
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 zip_file_extra_field_delete(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_idx, zip_flags_t flags)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 zip_dirent_t *de;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
42
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 if ((flags & ZIP_EF_BOTH) == 0) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 zip_error_set(&za->error, ZIP_ER_INVAL, 0);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
47
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 if (((flags & ZIP_EF_BOTH) == ZIP_EF_BOTH) && (ef_idx != ZIP_EXTRA_FIELD_ALL)) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 zip_error_set(&za->error, ZIP_ER_INVAL, 0);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
52
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 if (_zip_get_dirent(za, idx, 0, NULL) == NULL)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
55
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 if (ZIP_IS_RDONLY(za)) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
60
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 if (_zip_file_extra_field_prepare_for_change(za, idx) < 0)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
63
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 de = za->entry[idx].changes;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
65
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 de->extra_fields = _zip_ef_delete_by_id(de->extra_fields, ZIP_EXTRA_FIELD_ALL, ef_idx, flags);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 return 0;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
69
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
70
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 ZIP_EXTERN int
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 zip_file_extra_field_delete_by_id(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_uint16_t ef_idx, zip_flags_t flags)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 zip_dirent_t *de;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
75
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 if ((flags & ZIP_EF_BOTH) == 0) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 zip_error_set(&za->error, ZIP_ER_INVAL, 0);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
80
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 if (((flags & ZIP_EF_BOTH) == ZIP_EF_BOTH) && (ef_idx != ZIP_EXTRA_FIELD_ALL)) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 zip_error_set(&za->error, ZIP_ER_INVAL, 0);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
85
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 if (_zip_get_dirent(za, idx, 0, NULL) == NULL)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
88
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 if (ZIP_IS_RDONLY(za)) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
93
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 if (_zip_file_extra_field_prepare_for_change(za, idx) < 0)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
96
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 de = za->entry[idx].changes;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
98
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 de->extra_fields = _zip_ef_delete_by_id(de->extra_fields, ef_id, ef_idx, flags);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 return 0;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
102
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
103
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 ZIP_EXTERN const zip_uint8_t *
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 zip_file_extra_field_get(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_idx, zip_uint16_t *idp, zip_uint16_t *lenp, zip_flags_t flags)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 static const zip_uint8_t empty[1] = { '\0' };
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
108
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 zip_dirent_t *de;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 zip_extra_field_t *ef;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 int i;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
112
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 if ((flags & ZIP_EF_BOTH) == 0) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 zip_error_set(&za->error, ZIP_ER_INVAL, 0);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 return NULL;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
117
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 if ((de=_zip_get_dirent(za, idx, flags, &za->error)) == NULL)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 return NULL;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
120
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 if (flags & ZIP_FL_LOCAL)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 if (_zip_read_local_ef(za, idx) < 0)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 return NULL;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
124
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 i = 0;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 for (ef=de->extra_fields; ef; ef=ef->next) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 if (ef->flags & flags & ZIP_EF_BOTH) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 if (i < ef_idx) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 i++;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 continue;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
132
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 if (idp)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 *idp = ef->id;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 if (lenp)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 *lenp = ef->size;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 if (ef->size > 0)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 return ef->data;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 else
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 return empty;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
143
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 zip_error_set(&za->error, ZIP_ER_NOENT, 0);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 return NULL;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
146
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
148
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
149
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 ZIP_EXTERN const zip_uint8_t *
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 zip_file_extra_field_get_by_id(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_uint16_t ef_idx, zip_uint16_t *lenp, zip_flags_t flags)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 zip_dirent_t *de;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
154
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 if ((flags & ZIP_EF_BOTH) == 0) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 zip_error_set(&za->error, ZIP_ER_INVAL, 0);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 return NULL;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
159
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 if ((de=_zip_get_dirent(za, idx, flags, &za->error)) == NULL)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 return NULL;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
162
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 if (flags & ZIP_FL_LOCAL)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 if (_zip_read_local_ef(za, idx) < 0)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 return NULL;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
166
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 return _zip_ef_get_by_id(de->extra_fields, lenp, ef_id, ef_idx, flags, &za->error);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
169
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
170
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 ZIP_EXTERN zip_int16_t
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 zip_file_extra_fields_count(zip_t *za, zip_uint64_t idx, zip_flags_t flags)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 zip_dirent_t *de;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 zip_extra_field_t *ef;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 zip_uint16_t n;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
177
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 if ((flags & ZIP_EF_BOTH) == 0) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 zip_error_set(&za->error, ZIP_ER_INVAL, 0);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
182
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 if ((de=_zip_get_dirent(za, idx, flags, &za->error)) == NULL)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
185
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 if (flags & ZIP_FL_LOCAL)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 if (_zip_read_local_ef(za, idx) < 0)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
189
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 n = 0;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 for (ef=de->extra_fields; ef; ef=ef->next)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 if (ef->flags & flags & ZIP_EF_BOTH)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 n++;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
194
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 return (zip_int16_t)n;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
197
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
198
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 ZIP_EXTERN zip_int16_t
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
200 zip_file_extra_fields_count_by_id(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_flags_t flags)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
202 zip_dirent_t *de;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 zip_extra_field_t *ef;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 zip_uint16_t n;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
205
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 if ((flags & ZIP_EF_BOTH) == 0) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 zip_error_set(&za->error, ZIP_ER_INVAL, 0);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
210
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 if ((de=_zip_get_dirent(za, idx, flags, &za->error)) == NULL)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
213
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 if (flags & ZIP_FL_LOCAL)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 if (_zip_read_local_ef(za, idx) < 0)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
217
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
218 n = 0;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 for (ef=de->extra_fields; ef; ef=ef->next)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 if (ef->id == ef_id && (ef->flags & flags & ZIP_EF_BOTH))
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 n++;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
222
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 return (zip_int16_t)n;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
224 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
225
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
226
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 ZIP_EXTERN int
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 zip_file_extra_field_set(zip_t *za, zip_uint64_t idx, zip_uint16_t ef_id, zip_uint16_t ef_idx, const zip_uint8_t *data, zip_uint16_t len, zip_flags_t flags)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
230 zip_dirent_t *de;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 zip_uint16_t ls, cs;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 zip_extra_field_t *ef, *ef_prev, *ef_new;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 int i, found, new_len;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
234
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 if ((flags & ZIP_EF_BOTH) == 0) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
236 zip_error_set(&za->error, ZIP_ER_INVAL, 0);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
239
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
240 if (_zip_get_dirent(za, idx, 0, NULL) == NULL)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
242
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 if (ZIP_IS_RDONLY(za)) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
244 zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
245 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
246 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
247
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
248 if (ZIP_EF_IS_INTERNAL(ef_id)) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 zip_error_set(&za->error, ZIP_ER_INVAL, 0);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
250 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
251 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
252
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 if (_zip_file_extra_field_prepare_for_change(za, idx) < 0)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
254 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
255
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
256 de = za->entry[idx].changes;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
257
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 ef = de->extra_fields;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
259 ef_prev = NULL;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
260 i = 0;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 found = 0;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
262
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
263 for (; ef; ef=ef->next) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
264 if (ef->id == ef_id && (ef->flags & flags & ZIP_EF_BOTH)) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
265 if (i == ef_idx) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
266 found = 1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
267 break;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
268 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
269 i++;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
270 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
271 ef_prev = ef;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
272 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
273
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
274 if (i < ef_idx && ef_idx != ZIP_EXTRA_FIELD_NEW) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
275 zip_error_set(&za->error, ZIP_ER_INVAL, 0);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
276 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
277 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
278
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
279 if (flags & ZIP_EF_LOCAL)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
280 ls = _zip_ef_size(de->extra_fields, ZIP_EF_LOCAL);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
281 else
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
282 ls = 0;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
283 if (flags & ZIP_EF_CENTRAL)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
284 cs = _zip_ef_size(de->extra_fields, ZIP_EF_CENTRAL);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
285 else
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
286 cs = 0;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
287
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
288 new_len = ls > cs ? ls : cs;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
289 if (found)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
290 new_len -= ef->size + 4;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
291 new_len += len + 4;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
292
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
293 if (new_len > ZIP_UINT16_MAX) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
294 zip_error_set(&za->error, ZIP_ER_INVAL, 0);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
295 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
296 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
297
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
298 if ((ef_new=_zip_ef_new(ef_id, len, data, flags)) == NULL) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
299 zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
300 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
301 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
302
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
303 if (found) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
304 if ((ef->flags & ZIP_EF_BOTH) == (flags & ZIP_EF_BOTH)) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
305 ef_new->next = ef->next;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
306 ef->next = NULL;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
307 _zip_ef_free(ef);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
308 if (ef_prev)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
309 ef_prev->next = ef_new;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
310 else
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
311 de->extra_fields = ef_new;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
312 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
313 else {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
314 ef->flags &= ~(flags & ZIP_EF_BOTH);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
315 ef_new->next = ef->next;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
316 ef->next = ef_new;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
317 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
318 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
319 else if (ef_prev) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
320 ef_new->next = ef_prev->next;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
321 ef_prev->next = ef_new;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
322 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
323 else
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
324 de->extra_fields = ef_new;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
325
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
326 return 0;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
327 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
328
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
329
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
330
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
331 int
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
332 _zip_file_extra_field_prepare_for_change(zip_t *za, zip_uint64_t idx)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
333 {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
334 zip_entry_t *e;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
335
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
336 if (idx >= za->nentry) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
337 zip_error_set(&za->error, ZIP_ER_INVAL, 0);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
338 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
339 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
340
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
341 e = za->entry+idx;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
342
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
343 if (e->changes && (e->changes->changed & ZIP_DIRENT_EXTRA_FIELD))
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
344 return 0;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
345
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
346 if (e->orig) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
347 if (_zip_read_local_ef(za, idx) < 0)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
348 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
349 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
350
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
351 if (e->changes == NULL) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
352 if ((e->changes=_zip_dirent_clone(e->orig)) == NULL) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
353 zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
354 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
355 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
356 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
357
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
358 if (e->orig && e->orig->extra_fields) {
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
359 if ((e->changes->extra_fields=_zip_ef_clone(e->orig->extra_fields, &za->error)) == NULL)
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
360 return -1;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
361 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
362 e->changes->changed |= ZIP_DIRENT_EXTRA_FIELD;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
363
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
364 return 0;
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
365 }
2306f4b04790 libzip: import 1.1.2
David Demelier <markand@malikania.fr>
parents:
diff changeset
366