apio
cb432fd306
First we're saying "reads up to max" and then "always reads up to metadata.size, regardless of max". We actually mean that we never read more than metadata.size, so that's what this patched text says.
183 lines
9.0 KiB
Markdown
183 lines
9.0 KiB
Markdown
# minitar API documentation
|
|
|
|
Functions/types suffixed with `_w` or that contain `write` in their names are part of the newer API for writing to archives. Other types/functions are part of the (older) API for reading archives.
|
|
|
|
## Functions
|
|
### minitar_open
|
|
`int minitar_open(const char* pathname, struct minitar* mp)`
|
|
|
|
Initializes the caller-provided `mp` [handle](API.md#minitar) by opening the archive pointed to by `pathname` for reading. Returns 0 on success, anything else is failure.
|
|
|
|
### minitar_open_w
|
|
`int minitar_open_w(const char* pathname, struct minitar_w* mp, enum minitar_write_mode mode)`
|
|
|
|
Initializes the caller-provided `mp` [handle](API.md#minitar_w) by opening the archive pointed to by `pathname` for writing (in case `pathname` already exists, mode selects if the existing file is overwritten or if new entries are appended to it). Returns 0 on success, anything else is failure.
|
|
|
|
### minitar_read_entry
|
|
`int minitar_read_entry(struct minitar* mp, struct minitar_entry* out)`
|
|
|
|
Reads the next entry from a `struct minitar` which should be initialized by a previous call to `minitar_open()` and stores the result in `out`.
|
|
|
|
The `minitar_entry` structure consists of the file metadata (in the `metadata` field), and other internally-used values.
|
|
|
|
To read the contents of an entry, you should allocate a buffer large enough to hold `metadata.size` bytes and pass it to `minitar_read_contents()`.
|
|
|
|
This function returns 0 on success and -1 on end-of-file (when all entries have been read).
|
|
|
|
### minitar_write_file_entry
|
|
`int minitar_write_file_entry(struct minitar_w* mp, const struct minitar_entry_metadata* metadata, char* buf)`
|
|
|
|
Writes a regular file entry into a `struct minitar_w` which should be initialized by a previous call to `minitar_open_w()`.
|
|
|
|
This function writes both a header (generated from the metadata) and the file contents in `buf`, which should be `metadata.size` bytes long.
|
|
|
|
This function will only write entries for regular files (metadata.type == `MTAR_REGULAR`). It will ignore the `type` field and write the "regular file" type into the tar archive.
|
|
|
|
To write any other kind of entry (directories, special files), use `minitar_write_special_entry`.
|
|
|
|
This function returns 0 on success.
|
|
|
|
### minitar_write_special_entry
|
|
`int minitar_write_special_entry(struct minitar_w* mp, const struct minitar_entry_metadata* metadata)`
|
|
|
|
Writes a special file entry (anything that does not have contents, so directories or special files) into a `struct minitar_w` which should be initialized by a previous call to `minitar_open_w()`.
|
|
|
|
This function only writes a header (generated from the metadata). The `size` field is written as 0, no matter what its original value was.
|
|
|
|
This function does not write entries for regular files (metadata.type == `MTAR_REGULAR`). Trying to do so will result in minitar panicking (see [error handling](../README.md#error-handling)). To write regular files, use `minitar_write_file_entry`.
|
|
|
|
This function returns 0 on success.
|
|
|
|
### minitar_rewind
|
|
`void minitar_rewind(struct minitar* mp)`
|
|
|
|
Rewinds the `struct minitar` back to the beginning of the archive file, which means that the next call to `minitar_read_entry()` will fetch the first entry instead of the entry after the last read entry.
|
|
|
|
### minitar_find_by_name
|
|
`int minitar_find_by_name(struct minitar* mp, const char* name, struct minitar_entry* out)`
|
|
|
|
Stores the first entry with a matching name in `out` and returns 0, or non-zero if none are found. If none are found, the state of `out` is unspecified and might have been changed by the function. (In this context, a "name" means the base name of a file, so `baz.txt` given the path `foo/bar/baz.txt`)
|
|
|
|
This function starts searching from the current archive position, which means that to find a matching entry in the entire archive `minitar_rewind()` should be called on it first.
|
|
|
|
The state of `mp` after `minitar_find_by_name()` returns is unspecified, but a successive call to `minitar_find_by_name()` will find the next matching entry, if there is one. (Calling `minitar_find_by_name()` in a loop until it returns non-zero will return all matching entries.)
|
|
|
|
In order to perform other minitar operations on the archive, `minitar_rewind()` should probably be called first, to get a known state.
|
|
|
|
### minitar_find_by_path
|
|
`int minitar_find_by_path(struct minitar* mp, const char* path, struct minitar_entry* out)`
|
|
|
|
Same as `minitar_find_by_name()`, but matches the full path inside the archive instead of the file name.
|
|
|
|
|
|
### minitar_find_any_of
|
|
`int minitar_find_any_of(struct minitar* mp, enum minitar_file_type type, struct minitar_entry* out)`
|
|
|
|
Same as `minitar_find_by_name()`, but matches the file type instead of the name. As with `minitar_find_by_name()`, this function starts searching from the current archive position and calling it in a loop until it returns -1 will find all matching entries.
|
|
|
|
### minitar_read_contents
|
|
`size_t minitar_read_contents(struct minitar* mp, const struct minitar_entry* entry, char* buf, size_t max)`
|
|
|
|
Reads up to `max` bytes of an entry's contents from the archive stream `mp` and stores them into `buf`.
|
|
|
|
This function can be called as many times as desired, and at any given point in time, provided both `mp` and `entry` are valid. (`mp` should be initialized by a previous call to `minitar_open()`, and `entry` initialized by a previous call to `minitar_read_entry()`, `minitar_find_by_name()`, `minitar_find_by_path()` or `minitar_find_any_of()`).
|
|
|
|
This function returns the number of bytes read, or 0 on error. 0 might also be a successful return value (if `max` is 0 or the entry's size is 0, for example), which means `errno` should be checked to see if 0 means error or simply 0 bytes read.
|
|
|
|
`minitar_read_contents()` will never read more than `metadata.size`, regardless of the value in `max`. (so, if `max == SIZE_MAX`, `minitar_read_contents()` will always read `metadata.size` bytes).
|
|
|
|
The contents are not null-terminated. If you want null-termination (keep in mind the contents might not be ASCII and might contain null bytes before the end), just do `buf[nread] = 0;`. In that case, the value of `max` should be one less than the size of the buffer, to make sure the zero byte is not written past the end of `buf` if `max` bytes are read.
|
|
|
|
### minitar_close
|
|
`int minitar_close(struct minitar* mp)`
|
|
|
|
Closes the tar archive file `mp` points to. The pointer passed to `minitar_close()` should be initialized by a previous call to `minitar_open()`.
|
|
|
|
Returns 0 on success, everything else is failure and you should check `errno`.
|
|
|
|
### minitar_close_w
|
|
`int minitar_close_w(struct minitar_w* mp)`
|
|
|
|
Closes the tar archive file `mp` points to. The pointer passed to `minitar_close_w()` should be initialized by a previous call to `minitar_open_w()`.
|
|
|
|
Returns 0 on success, everything else is failure and you should check `errno`.
|
|
|
|
## Types
|
|
|
|
### minitar_file_type
|
|
`enum minitar_file_type`
|
|
|
|
This enum lists all supported file types:
|
|
|
|
`MTAR_REGULAR`: Regular files
|
|
|
|
`MTAR_DIRECTORY`: Directories
|
|
|
|
`MTAR_SYMLINK`: Symbolic links
|
|
|
|
`MTAR_HARDLINK`: Hard links
|
|
|
|
`MTAR_FIFO`: FIFO special files
|
|
|
|
`MTAR_BLKDEV`: Block devices
|
|
|
|
`MTAR_CHRDEV`: Character devices
|
|
|
|
### minitar_write_mode
|
|
`enum minitar_write_mode`
|
|
|
|
This enum tells `minitar_open_w` what to do if the chosen archive path already exists:
|
|
|
|
`MTAR_OVERWRITE`: Overwrite the archive
|
|
|
|
`MTAR_APPEND`: Add new entries to the end of it
|
|
|
|
### minitar_entry_metadata
|
|
`struct minitar_entry_metadata`
|
|
|
|
This structure represents an entry's metadata, with the following fields:
|
|
|
|
`path`: A string representing the full path of the entry within the archive. (`char[]`)
|
|
|
|
`name`: A string representing the base name of the entry (the last component of its path). (`char[]`)
|
|
|
|
`link`: A string representing the file being linked to. (Only applies to symlinks/hard links) (`char[]`)
|
|
|
|
`mode`: An integer representing the permissions of the entry. (`mode_t`)
|
|
|
|
`uid`: An integer representing the user ID of the entry's owner. (`uid_t`)
|
|
|
|
`gid`: An integer representing the group ID of the entry's owner. (`gid_t`)
|
|
|
|
`size`: An integer representing the size of the entry's contents in bytes. (`size_t`)
|
|
|
|
`mtime`: A UNIX timestamp representing the last time the entry was modified. (`time_t`)
|
|
|
|
`type`: An enum representing the type of the entry. (`enum minitar_file_type`)
|
|
|
|
`uname`: A string representing the username of the entry's owner. (`char[]`)
|
|
|
|
`gname`: A string representing the group name of the entry's owner. (`char[]`)
|
|
|
|
`devmajor`: An integer representing the major number of a device. (`unsigned int`)
|
|
|
|
`devminor`: An integer representing the minor number of a device. (`unsigned int`)
|
|
|
|
### minitar_entry
|
|
`struct minitar_entry`
|
|
|
|
An entry in a tar archive. Fields:
|
|
|
|
`metadata`: The entry's metadata. (`struct minitar_entry_metadata`)
|
|
|
|
`_internal`: Reserved for internal use. (`struct minitar_entry_internal`)
|
|
|
|
### minitar
|
|
`struct minitar`
|
|
|
|
An archive handle for the "reading" API. To write to an archive, use `struct minitar_w` and `minitar_open_w()` instead.
|
|
|
|
### minitar_w
|
|
`struct minitar_w`
|
|
|
|
An archive handle for the "writing" API. To read from an archive, use `struct minitar` and `minitar_open()` instead. |