Convert TODO to markdown.
diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..cf9dce2 --- /dev/null +++ b/TODO.md
@@ -0,0 +1,170 @@ +# API Plans + +## Encryption + +````c +struct zip *zip_open_encrypted(const char *path, int flags, const char *password, int *errorp); +int zip_set_encryption(struct zip *archive, zip_uint64_t idx, zip_uint16_t method, const char *password); +void zip_set_archive_encryption(struct zip *archive, zip_uint16_t method, const char *password); +```` + +## Prefixes + +For example for adding extractors for self-extracting zip archives. +````c +zip_set_archive_prefix(struct zip *za, const zip_uint8_t *data, zip_uint64_t length); +const zip_uint8_t *zip_get_archive_prefix(struct zip *za, zip_uint64_t *lengthp); +```` + +## Progress Callback + +Register callback; will be called from `zip_close()` after each file has been processed. + +````c +typedef void (*zip_progress_callback_t)(double); +void zip_register_progress_callback(zip_t *, zip_progress_callback_t); +```` + +# API Issues + +* `zip_get_archive_comment` has `int *lenp` argument. Cleaner would be `zip_uint32_t *`. + rename and fix. which other functions for naming consistency? +* rename remaining `zip_XXX_{file,archive}_*` to `zip_{file,archive}_XXX_*`? +* compression/crypt implementations: how to set error code on failure +* compression/crypt error messages a la `ZIP_ER_ZLIB` (no detailed info passing) +* check arguments for every entry point into libzip + +# Features + +* support setting extra fields from zip_source + * introduce layers of extra fields: + * original + * from zip_source + * manually set + * when querying extra fields, search all of them in reverse order + * add whiteout (deleted) flag + * allow invalid data flag, used when computing extra field size before writing data + * new command `ZIP_SOURCE_EXTRA_FIELDS` + * no support for multiple copies of same extra field +* delete all extra fields during `zip_replace()` +* function to copy file from one archive to another +* set `O_CLOEXEC` flag after fopen and mkstemp +* configure: use windows backends on windows +* add append-only mode writing file to disk incrementally to keep memory usage low +* `zip_file_set_mtime()`: support InfoZIP time stamps + +* support streaming output (creating new archive to e.g. stdout) +* add functions to: + * read/set ASCII file flag? (more general options?) +* `zip_commit()` (to finish changes without closing archive) +* add custom compression function support +* `zip_fseek()` +* `zip_source_zip()`: allow rewinding +* zipcmp: add option for file content comparison +* zipcmp: compare bit flags if paranoid +* zipcmp: compare external attributes/opsys if paranoid +* zipcmp: compare last_mod if paranoid (or with separate flag?) +* consistency + . for stored files, test compressed = uncompressed + . data descriptor + . local headers come before central dir + +* support for old compression methods????? + +# Bugs + +* support InfoZIP encryption header extension (copy data descriptor for encrypted files) +* ensure that nentries is small enough not to cause overflow (size_t for entry, uint64 for CD on disk) +* fix OpenSUSE i686 regression failures +* fix `open_filename_duplicate_consistency.test` to fail +* check for limits imposed by format (central dir size, file size, extra fields, ...) +* `_zip_u2d_time()`: handle `localtime(3)` failure +* POSIX: `zip_open()`: check whether file can be created and fail if not +* fix inconsistent usage of valid flags (not checked in many places) +* `cdr == NULL` -> `ER_NOENT` vs. `idx > cdir->nentry` -> `ER_INVAL` inconsistent (still there?) + + +# Cleanup + +* use bool +* use `ZIP_SOURCE_SUPPORTS_{READABLE,SEEKABLE,WRITABLE}` +* use `zip_source_seek_compute_offset()` +* move compat refs from `zipint.h` to own file, and include that in `zipint.h` and `src` +* get rid of `zip_get_{compression,encryption}_implementation()` +* use `zip_*int*_t` internally + +# Analysis + +* pass through coverity + +# Infrastructure + +* create CMakefile.txt man page linking from links file + +# Test Case Issues + +* unchange on added file +* test seek in `zip_source_crc()` +* test cases for `set_extra*`, `delete_extra*`, `*extra_field*` +* test cases for in memory archives + * add + * delete + * delete all + * modify +* use gcov output to increase test coverage +* merge most tools into ziptool +* add test case to change values for newly added files (name, compression method, comment, mtime, . . .) +* `zip_open()` file less than `EOCDLEN` bytes long +* test calls against old API +* run regression tests also from CMake framework +* rename file to dir/ and vice versa (fails) +* fix comment test to be newline insensitive +* check if http://bugs.python.org/issue20078 provides ideas for new tests + +* (add, replace) + * add to empty zip + * add to existing zip + * add w/ existing file name [E] + * replace ok + * replace w/ illegal index [E] + * replace w/ deleted name [E] + * unchange added/replaced file +* (close) + * copy zip file + * open copy + * rename, delete, replace, add w/ new name, add w/ deleted name + * close + * zipcmp copy expected + * remove copy +* (error_get) +* (error_get_sys_type) +* (error_to_str) +* (extra_fields) +* (file_error_get) +* (file_strerror) +* (replace) +* (source_buffer) +* (source_file) +* (source_filep) +* (source_free) +* (source_function) +* (source_zip) +* (strerror) +* (unchange) +* (unchange_all) +* open(ZIP_RDONLY) +* I/O abstraction layer + * zip_open_from_source +* read two zip entries interleaved + +# Unsorted + +* `zip_source_file()`: don't allow write if start/len specify a part of the file +* script to check if all exported symbols are marked with `ZIP_EXTERN`, add to make distcheck + +* re-implement fix for OS X sandboxing (`zip_archive_set_tempdir()`). + +* document: `zip_source_write()`: length can't be > `ZIP_INT64_MAX` +* document: `ZIP_SOURCE_CLOSE` implementation can't return error +* keep error codes in man pages in sync +* document error codes in new man pages