This source file includes following definitions.
- _zip_set_name
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 #include <stdlib.h>
36 #include <string.h>
37
38 #include "zipint.h"
39
40
41 int
42 _zip_set_name(zip_t *za, zip_uint64_t idx, const char *name, zip_flags_t flags)
43 {
44 zip_entry_t *e;
45 zip_string_t *str;
46 bool same_as_orig;
47 zip_int64_t i;
48 const zip_uint8_t *old_name, *new_name;
49 zip_string_t *old_str;
50
51 if (idx >= za->nentry) {
52 zip_error_set(&za->error, ZIP_ER_INVAL, 0);
53 return -1;
54 }
55
56 if (ZIP_IS_RDONLY(za)) {
57 zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
58 return -1;
59 }
60
61 if (name && name[0] != '\0') {
62
63 if ((str=_zip_string_new((const zip_uint8_t *)name, (zip_uint16_t)strlen(name), flags, &za->error)) == NULL)
64 return -1;
65 if ((flags & ZIP_FL_ENCODING_ALL) == ZIP_FL_ENC_GUESS && _zip_guess_encoding(str, ZIP_ENCODING_UNKNOWN) == ZIP_ENCODING_UTF8_GUESSED)
66 str->encoding = ZIP_ENCODING_UTF8_KNOWN;
67 }
68 else
69 str = NULL;
70
71
72 if ((i=_zip_name_locate(za, name, 0, NULL)) >= 0 && (zip_uint64_t)i != idx) {
73 _zip_string_free(str);
74 zip_error_set(&za->error, ZIP_ER_EXISTS, 0);
75 return -1;
76 }
77
78
79 if (i>=0 && (zip_uint64_t)i == idx) {
80 _zip_string_free(str);
81 return 0;
82 }
83
84 e = za->entry+idx;
85
86 if (e->orig)
87 same_as_orig = _zip_string_equal(e->orig->filename, str);
88 else
89 same_as_orig = false;
90
91 if (!same_as_orig && e->changes == NULL) {
92 if ((e->changes=_zip_dirent_clone(e->orig)) == NULL) {
93 zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
94 _zip_string_free(str);
95 return -1;
96 }
97 }
98
99 if ((new_name = _zip_string_get(same_as_orig ? e->orig->filename : str, NULL, 0, &za->error)) == NULL) {
100 _zip_string_free(str);
101 return -1;
102 }
103
104 if (e->changes) {
105 old_str = e->changes->filename;
106 }
107 else if (e->orig) {
108 old_str = e->orig->filename;
109 }
110 else {
111 old_str = NULL;
112 }
113
114 if (old_str) {
115 if ((old_name = _zip_string_get(old_str, NULL, 0, &za->error)) == NULL) {
116 _zip_string_free(str);
117 return -1;
118 }
119 }
120 else {
121 old_name = NULL;
122 }
123
124 if (_zip_hash_add(za->names, new_name, idx, 0, &za->error) == false) {
125 _zip_string_free(str);
126 return -1;
127 }
128 if (old_name) {
129 _zip_hash_delete(za->names, old_name, NULL);
130 }
131
132 if (same_as_orig) {
133 if (e->changes) {
134 if (e->changes->changed & ZIP_DIRENT_FILENAME) {
135 _zip_string_free(e->changes->filename);
136 e->changes->changed &= ~ZIP_DIRENT_FILENAME;
137 if (e->changes->changed == 0) {
138 _zip_dirent_free(e->changes);
139 e->changes = NULL;
140 }
141 else {
142
143 e->changes->filename = e->orig->filename;
144 }
145 }
146 }
147 _zip_string_free(str);
148 }
149 else {
150 if (e->changes->changed & ZIP_DIRENT_FILENAME) {
151 _zip_string_free(e->changes->filename);
152 }
153 e->changes->changed |= ZIP_DIRENT_FILENAME;
154 e->changes->filename = str;
155 }
156
157 return 0;
158 }