2
2
zip_set_name.c -- rename helper function
3
Copyright (C) 1999-2007 Dieter Baron and Thomas Klausner
3
Copyright (C) 1999-2012 Dieter Baron and Thomas Klausner
5
5
This file is part of libzip, a library to manipulate ZIP archives.
6
6
The authors can be contacted at <libzip@nih.at>
44
_zip_set_name(struct zip *za, zip_uint64_t idx, const char *name)
44
_zip_set_name(struct zip *za, zip_uint64_t idx, const char *name, zip_flags_t flags)
47
struct zip_string *str;
49
if (idx >= za->nentry || name == NULL) {
51
if (idx >= za->nentry) {
50
52
_zip_error_set(&za->error, ZIP_ER_INVAL, 0);
54
if ((i=_zip_name_locate(za, name, 0, NULL)) != -1 && i != idx) {
56
if (ZIP_IS_RDONLY(za)) {
57
_zip_error_set(&za->error, ZIP_ER_RDONLY, 0);
61
if (name && strlen(name) > 0) {
62
/* TODO: check for string too long */
63
if ((str=_zip_string_new((const zip_uint8_t *)name, (zip_uint16_t)strlen(name), flags, &za->error)) == NULL)
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;
71
/* TODO: encoding flags needed for CP437? */
72
if ((i=_zip_name_locate(za, name, 0, NULL)) >= 0 && (zip_uint64_t)i != idx) {
73
_zip_string_free(str);
55
74
_zip_error_set(&za->error, ZIP_ER_EXISTS, 0);
59
78
/* no effective name change */
79
if (i>=0 && (zip_uint64_t)i == idx) {
80
_zip_string_free(str);
63
if ((s=strdup(name)) == NULL) {
64
_zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
68
if (za->entry[idx].state == ZIP_ST_UNCHANGED)
69
za->entry[idx].state = ZIP_ST_RENAMED;
71
free(za->entry[idx].ch_filename);
72
za->entry[idx].ch_filename = s;
87
_zip_string_free(e->changes->filename);
88
e->changes->filename = NULL;
89
e->changes->changed &= ~ZIP_DIRENT_FILENAME;
93
changed = !_zip_string_equal(e->orig->filename, str);
98
if (e->changes == NULL) {
99
if ((e->changes=_zip_dirent_clone(e->orig)) == NULL) {
100
_zip_error_set(&za->error, ZIP_ER_MEMORY, 0);
101
_zip_string_free(str);
105
e->changes->filename = str;
106
e->changes->changed |= ZIP_DIRENT_FILENAME;
109
_zip_string_free(str);
110
if (e->changes && e->changes->changed == 0) {
111
_zip_dirent_free(e->changes);