Thomas Klausner | 1becfad | 2014-11-13 18:02:34 +0100 | [diff] [blame] | 1 | .TH "ZIP_SOURCE_FUNCTION" "3" "November 13, 2014" "NiH" "Library Functions Manual" |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 2 | .nh |
| 3 | .if n .ad l |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 4 | .SH "NAME" |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 5 | \fBzip_source_function\fR |
| 6 | \- create data source from function |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 7 | .SH "LIBRARY" |
| 8 | libzip (-lzip) |
| 9 | .SH "SYNOPSIS" |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 10 | \fB#include <zip.h>\fR |
| 11 | .sp |
Thomas Klausner | 193739d | 2014-10-08 12:37:24 +0200 | [diff] [blame] | 12 | \fIzip_source_t *\fR |
Thomas Klausner | 05940fe | 2014-08-02 12:10:49 +0200 | [diff] [blame] | 13 | .PD 0 |
| 14 | .HP 4n |
Thomas Klausner | 193739d | 2014-10-08 12:37:24 +0200 | [diff] [blame] | 15 | \fBzip_source_function\fR(\fIzip_t\ *archive\fR, \fIzip_source_callback\ fn\fR, \fIvoid\ *userdata\fR); |
Thomas Klausner | 05940fe | 2014-08-02 12:10:49 +0200 | [diff] [blame] | 16 | .PD |
Thomas Klausner | 1becfad | 2014-11-13 18:02:34 +0100 | [diff] [blame] | 17 | .PP |
| 18 | \fIzip_source_t *\fR |
| 19 | .PD 0 |
| 20 | .HP 4n |
| 21 | \fBzip_source_function_create\fR(\fIzip_source_callback\ fn\fR, \fIvoid\ *userdata\fR, \fIzip_error_t\ *error\fR); |
| 22 | .PD |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 23 | .SH "DESCRIPTION" |
Thomas Klausner | 28ab5e2 | 2014-11-18 15:32:23 +0100 | [diff] [blame] | 24 | The functions |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 25 | \fBzip_source_function\fR() |
Thomas Klausner | 28ab5e2 | 2014-11-18 15:32:23 +0100 | [diff] [blame] | 26 | and |
| 27 | \fBzip_source_function_create\fR() |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 28 | creates a zip source from the user-provided function |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 29 | \fIfn\fR, |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 30 | which must be of the following type: |
Thomas Klausner | 28ab5e2 | 2014-11-18 15:32:23 +0100 | [diff] [blame] | 31 | .PP |
| 32 | \fItypedef zip_int64_t\fR |
| 33 | \fB(*zip_source_callback)\fR(\fIvoid *userdata\fR, \fIvoid *data\fR, \fIzip_uint64_t len\fR, \fIzip_source_cmd_t cmd\fR) |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 34 | .PP |
Thomas Klausner | 193739d | 2014-10-08 12:37:24 +0200 | [diff] [blame] | 35 | \fIarchive\fR |
Thomas Klausner | 1becfad | 2014-11-13 18:02:34 +0100 | [diff] [blame] | 36 | or |
| 37 | \fIerror\fR |
| 38 | are used for reporting errors and can be |
Thomas Klausner | 193739d | 2014-10-08 12:37:24 +0200 | [diff] [blame] | 39 | \fRNULL\fR. |
| 40 | .PP |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 41 | When called by the library, the first argument is the |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 42 | \fIuserdata\fR |
Thomas Klausner | 28ab5e2 | 2014-11-18 15:32:23 +0100 | [diff] [blame] | 43 | argument supplied to the function. |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 44 | The next two arguments are a buffer |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 45 | \fIdata\fR |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 46 | of size |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 47 | \fIlen\fR |
Thomas Klausner | 1becfad | 2014-11-13 18:02:34 +0100 | [diff] [blame] | 48 | when data is passed in or expected to be returned, or else |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 49 | \fRNULL\fR |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 50 | and 0. |
| 51 | The last argument, |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 52 | \fIcmd\fR, |
Thomas Klausner | 193739d | 2014-10-08 12:37:24 +0200 | [diff] [blame] | 53 | specifies which action the function should perform. |
| 54 | .PP |
| 55 | Depending on the uses, there are three useful sets of commands to be supported by a |
| 56 | \fBzip_source_callback\fR(): |
| 57 | .TP 24n |
| 58 | read source |
| 59 | Providing streamed data (for file data added to archives). |
| 60 | Must support |
| 61 | \fRZIP_SOURCE_OPEN\fR, |
| 62 | \fRZIP_SOURCE_READ\fR, |
| 63 | \fRZIP_SOURCE_CLOSE\fR, |
| 64 | \fRZIP_SOURCE_STAT\fR, |
| 65 | and |
| 66 | \fRZIP_SOURCE_ERROR\fR. |
| 67 | .TP 24n |
| 68 | seekable read source |
| 69 | Same as previous, but from a source allowing reading from arbitrary |
| 70 | offsets (also for read-only zip archive). |
| 71 | Must additionally support |
| 72 | \fRZIP_SOURCE_SEEK\fR, |
| 73 | \fRZIP_SOURCE_TELL\fR, |
| 74 | and |
| 75 | \fRZIP_SOURCE_SUPPORTS\fR. |
| 76 | .TP 24n |
| 77 | read/write source |
| 78 | Same as previous, but additionally allowing writing (also for writable |
| 79 | zip archives). |
| 80 | Must additionally support |
| 81 | \fRZIP_SOURCE_BEGIN_WRITE\fR, |
| 82 | \fRZIP_SOURCE_COMMIT_WRITE\fR, |
| 83 | \fRZIP_SOURCE_ROLLBACK_WRITE\fR, |
| 84 | \fRZIP_SOURCE_SEEK_WRITE\fR, |
| 85 | \fRZIP_SOURCE_TELL_WRITE\fR, |
| 86 | and |
| 87 | \fRZIP_SOURCE_REMOVE\fR. |
| 88 | .SS "\fRZIP_SOURCE_BEGIN_WRITE\fR" |
| 89 | Prepare the source for writing. |
| 90 | Use this to create any temporary file(s). |
| 91 | .SS "\fRZIP_SOURCE_CLOSE\fR" |
| 92 | Reading is done. |
| 93 | .SS "\fRZIP_SOURCE_COMMIT_WRITE\fR" |
| 94 | Finish writing to the source. |
| 95 | Replace the original data with the newly written data. |
| 96 | Clean up temporary files or internal buffers. |
| 97 | Subsequently opening and reading from the source should return the |
| 98 | newly written data. |
| 99 | .SS "\fRZIP_SOURCE_ERROR\fR" |
| 100 | Get error information. |
| 101 | \fIdata\fR |
| 102 | points to an array of two ints, which should be filled with the libzip |
| 103 | error code and the corresponding system error code for the error that |
| 104 | occurred. |
| 105 | See |
| 106 | zip_errors(3) |
| 107 | for details on the error codes. |
| 108 | If the source stores error information in a zip_error_t, use |
| 109 | zip_error_to_data(3) |
| 110 | and return its return value. |
| 111 | Otherwise, return 2 * sizeof(int). |
| 112 | .SS "\fRZIP_SOURCE_FREE\fR" |
Thomas Klausner | 1becfad | 2014-11-13 18:02:34 +0100 | [diff] [blame] | 113 | Clean up and free all resources, including |
| 114 | \fIstate\fR. |
| 115 | The callback function will not be called again. |
Thomas Klausner | 193739d | 2014-10-08 12:37:24 +0200 | [diff] [blame] | 116 | .SS "\fRZIP_SOURCE_OPEN\fR" |
Thomas Klausner | 3dd81d8 | 2005-06-09 19:01:53 +0000 | [diff] [blame] | 117 | Prepare for reading. |
Thomas Klausner | 193739d | 2014-10-08 12:37:24 +0200 | [diff] [blame] | 118 | .SS "\fRZIP_SOURCE_READ\fR" |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 119 | Read data into the buffer |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 120 | \fIdata\fR |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 121 | of size |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 122 | \fIlen\fR. |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 123 | Return the number of bytes placed into |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 124 | \fIdata\fR |
Thomas Klausner | 193739d | 2014-10-08 12:37:24 +0200 | [diff] [blame] | 125 | on success. |
| 126 | .SS "\fRZIP_SOURCE_REMOVE\fR" |
| 127 | Remove the underlying file. |
| 128 | This is called if a zip archive is empty when closed. |
| 129 | .SS "\fRZIP_SOURCE_ROLLBACK_WRITE\fR" |
| 130 | Abort writing to the source. |
| 131 | Discard written data. |
| 132 | Clean up temporary files or internal buffers. |
| 133 | Subsequently opening and reading from the source should return the |
| 134 | original data. |
| 135 | .SS "\fRZIP_SOURCE_SEEK\fR" |
| 136 | Specify position to read next byte from, like |
| 137 | fseek(3). |
| 138 | Use |
Thomas Klausner | 6fd2bec | 2014-10-30 15:25:39 +0100 | [diff] [blame] | 139 | ZIP_SOURCE_GET_ARGS(3) |
Thomas Klausner | 193739d | 2014-10-08 12:37:24 +0200 | [diff] [blame] | 140 | to decode the arguments into the following struct: |
| 141 | .nf |
| 142 | .sp |
| 143 | .RS 0n |
| 144 | struct zip_source_args_seek { |
| 145 | zip_int64_t offset; |
| 146 | int whence; |
| 147 | }; |
| 148 | .RE |
| 149 | .fi |
Thomas Klausner | 1becfad | 2014-11-13 18:02:34 +0100 | [diff] [blame] | 150 | .PP |
| 151 | If the size of the source's data is known, use |
| 152 | zip_source_seek_compute_offset(3) |
| 153 | to validate the arguments and compute the new offset. |
Thomas Klausner | 193739d | 2014-10-08 12:37:24 +0200 | [diff] [blame] | 154 | .SS "\fRZIP_SOURCE_SEEK_WRITE\fR" |
| 155 | Specify position to write next byte to, like |
| 156 | fseek(3). |
| 157 | See |
| 158 | \fRZIP_SOURCE_SEEK\fR |
| 159 | for details. |
| 160 | .SS "\fRZIP_SOURCE_STAT\fR" |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 161 | Get meta information for the input data. |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 162 | \fIdata\fR |
Thomas Klausner | cdbc471 | 2013-09-22 10:49:24 +0200 | [diff] [blame] | 163 | points to an allocated |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 164 | \fIstruct zip_stat\fR, |
Thomas Klausner | cdbc471 | 2013-09-22 10:49:24 +0200 | [diff] [blame] | 165 | which should be initialized using |
| 166 | zip_stat_init(3) |
| 167 | and then filled in. |
Thomas Klausner | 4b12334 | 2011-01-03 19:36:33 +0100 | [diff] [blame] | 168 | Information only available after the source has been read (e.g. size) |
| 169 | can be omitted in an earlier call. |
Thomas Klausner | 193739d | 2014-10-08 12:37:24 +0200 | [diff] [blame] | 170 | Return sizeof(struct zip_stat) on success. |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 171 | \fINOTE\fR: |
| 172 | \fBzip_source_function\fR() |
Thomas Klausner | e8dd01d | 2011-03-22 16:09:15 +0100 | [diff] [blame] | 173 | may be called with this argument even after being called with |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 174 | \fRZIP_SOURCE_CLOSE\fR. |
Thomas Klausner | 193739d | 2014-10-08 12:37:24 +0200 | [diff] [blame] | 175 | .SS "\fRZIP_SOURCE_SUPPORTS\fR" |
| 176 | Return bitmap specifying which commands are supported. |
| 177 | Use |
| 178 | zip_source_make_command_bitmap(3). |
| 179 | If this command is not implemented, the source is assumed to be a |
| 180 | read source without seek support. |
| 181 | .SS "\fRZIP_SOURCE_TELL\fR" |
| 182 | Return the current read offset in the source, like |
| 183 | ftell(3). |
| 184 | .SS "\fRZIP_SOURCE_TELL_WRITE\fR" |
| 185 | Return the current write offset in the source, like |
| 186 | ftell(3). |
| 187 | .SS "\fRZIP_SOURCE_WRITE\fR" |
| 188 | Write data to the source. |
| 189 | Return number of bytes written. |
| 190 | .SS "Return Values" |
| 191 | Commands should return \-1 on error. |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 192 | \fRZIP_SOURCE_ERROR\fR |
Thomas Klausner | 193739d | 2014-10-08 12:37:24 +0200 | [diff] [blame] | 193 | will be called to retrieve the error code. |
| 194 | On success, commands return 0, unless specified otherwise in the |
| 195 | description above. |
| 196 | .SS "Calling Conventions" |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 197 | The library will always issue |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 198 | \fRZIP_SOURCE_OPEN\fR |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 199 | before issuing |
Thomas Klausner | 1becfad | 2014-11-13 18:02:34 +0100 | [diff] [blame] | 200 | \fRZIP_SOURCE_READ\fR, |
| 201 | \fRZIP_SOURCE_SEEK\fR, |
| 202 | or |
| 203 | \fRZIP_SOURCE_TELL\fR. |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 204 | When it no longer wishes to read from this source, it will issue |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 205 | \fRZIP_SOURCE_CLOSE\fR. |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 206 | If the library wishes to read the data again, it will issue |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 207 | \fRZIP_SOURCE_OPEN\fR |
Thomas Klausner | 3dd81d8 | 2005-06-09 19:01:53 +0000 | [diff] [blame] | 208 | a second time. |
| 209 | If the function is unable to provide the data again, it should |
| 210 | return \-1. |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 211 | .PP |
Thomas Klausner | 1becfad | 2014-11-13 18:02:34 +0100 | [diff] [blame] | 212 | \fRZIP_SOURCE_BEGIN_WRITE\fR |
| 213 | will be called before |
| 214 | \fRZIP_SOURCE_WRITE\fR, |
| 215 | \fRZIP_SOURCE_SEEK_WRITE\fR, |
| 216 | or |
| 217 | \fRZIP_SOURCE_TELL_WRITE\fR. |
| 218 | When writing is complete, either |
| 219 | \fRZIP_SOURCE_COMMIT_WRITE\fR |
| 220 | or |
| 221 | \fRZIP_SOURCE_ROLLBACK_WRITE\fR |
| 222 | will be called. |
| 223 | .PP |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 224 | \fRZIP_SOURCE_STAT\fR |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 225 | can be issued at any time. |
Thomas Klausner | 1becfad | 2014-11-13 18:02:34 +0100 | [diff] [blame] | 226 | .PP |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 227 | \fRZIP_SOURCE_ERROR\fR |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 228 | will only be issued in response to the function |
| 229 | returning \-1. |
Thomas Klausner | 1becfad | 2014-11-13 18:02:34 +0100 | [diff] [blame] | 230 | .PP |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 231 | \fRZIP_SOURCE_FREE\fR |
Thomas Klausner | 4b12334 | 2011-01-03 19:36:33 +0100 | [diff] [blame] | 232 | will be the last command issued; |
| 233 | if |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 234 | \fRZIP_SOURCE_OPEN\fR |
Thomas Klausner | 4b12334 | 2011-01-03 19:36:33 +0100 | [diff] [blame] | 235 | was called and succeeded, |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 236 | \fRZIP_SOURCE_CLOSE\fR |
Thomas Klausner | 4b12334 | 2011-01-03 19:36:33 +0100 | [diff] [blame] | 237 | will be called before |
Thomas Klausner | 1becfad | 2014-11-13 18:02:34 +0100 | [diff] [blame] | 238 | \fRZIP_SOURCE_FREE\fR, |
| 239 | and similarly for |
| 240 | \fRZIP_SOURCE_BEGIN_WRITE\fR |
| 241 | and |
| 242 | \fRZIP_SOURCE_COMMIT_WRITE\fR |
| 243 | or |
| 244 | \fRZIP_SOURCE_ROLLBACK_WRITE\fR. |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 245 | .SH "RETURN VALUES" |
| 246 | Upon successful completion, the created source is returned. |
| 247 | Otherwise, |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 248 | \fRNULL\fR |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 249 | is returned and the error code in |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 250 | \fIarchive\fR |
Thomas Klausner | 1becfad | 2014-11-13 18:02:34 +0100 | [diff] [blame] | 251 | or |
| 252 | \fIerror\fR |
Thomas Klausner | 193739d | 2014-10-08 12:37:24 +0200 | [diff] [blame] | 253 | is set to indicate the error (unless |
Thomas Klausner | 1becfad | 2014-11-13 18:02:34 +0100 | [diff] [blame] | 254 | it is |
Thomas Klausner | 193739d | 2014-10-08 12:37:24 +0200 | [diff] [blame] | 255 | \fRNULL\fR). |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 256 | .SH "ERRORS" |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 257 | \fBzip_source_function\fR() |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 258 | fails if: |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 259 | .TP 19n |
| 260 | [\fRZIP_ER_MEMORY\fR] |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 261 | Required memory could not be allocated. |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 262 | .SH "SEE ALSO" |
Thomas Klausner | 3dd81d8 | 2005-06-09 19:01:53 +0000 | [diff] [blame] | 263 | libzip(3), |
Thomas Klausner | 41f7750 | 2005-05-20 22:01:09 +0000 | [diff] [blame] | 264 | zip_add(3), |
| 265 | zip_replace(3), |
Thomas Klausner | 05940fe | 2014-08-02 12:10:49 +0200 | [diff] [blame] | 266 | zip_source(3), |
Thomas Klausner | ead13a7 | 2006-12-29 20:36:49 +0000 | [diff] [blame] | 267 | zip_stat_init(3) |
Thomas Klausner | 7533013 | 2005-06-17 12:59:06 +0000 | [diff] [blame] | 268 | .SH "AUTHORS" |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 269 | Dieter Baron <\fIdillo@nih.at\fR> |
Thomas Klausner | 7533013 | 2005-06-17 12:59:06 +0000 | [diff] [blame] | 270 | and |
Thomas Klausner | a5e9d4d | 2013-10-05 16:57:58 +0200 | [diff] [blame] | 271 | Thomas Klausner <\fItk@giga.or.at\fR> |