/* * Copyright (C) 2023 Patrick McDermott * * This file is part of opkg-opk. * * opkg-opk is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * opkg-opk is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with opkg-opk. If not, see . */ #ifndef OPKG_OPK_USTAR_H_ #define OPKG_OPK_USTAR_H_ #include #include "dirent.h" #include "gzip.h" #define OPKG_OPK_USTAR_RECORD_SIZE 512 #define OPKG_OPK_USTAR_NAME_SIZE 257 /* prefix[155] + '/' + name[100] + '\0' */ #define OPKG_OPK_USTAR_LINKNAME_SIZE 101 /* linkname[100] + '\0' */ struct opkg_opk_ustar; struct opkg_opk_ustar_member { char *name; uint16_t mode; uint64_t size; uint64_t mtime; char type; char *linkname; char uname [32]; char gname [32]; uint32_t devmajor; uint32_t devminor; struct opkg_opk_ustar_member *next; }; struct opkg_opk_ustar_seek_name; /* * Allocates and initializes an archive structure. * Parameters: * - gzip: Decompressor for archive's gzip stream. * Returns: * - Allocated archive structure on success. Free with opkg_opk_ustar_free(). * - NULL on memory exhaustion. */ struct opkg_opk_ustar * opkg_opk_ustar_init(struct opkg_opk_gzip *gzip); /* * Lists member files one at a time. * Parameters: * - ustar: Archive structure. * - member: Address in which to store address of allocated member structure. * Free with opkg_opk_ustar_member_free(). * Returns: * - OPKG_OPK_OK if a member was listed. More members may exist. * - OPKG_OPK_END if no more members exist. Parameter "member" is unchanged. * - OPKG_OPK_ERROR on decompression error, memory exhaustion, mode or mtime * integer conversion error, or unsupported file type. */ int opkg_opk_ustar_list(struct opkg_opk_ustar *ustar, struct opkg_opk_ustar_member **member); /* * Reads up to a record (512 octets) of member file data at a time. * Parameters: * - ustar: Archive structure. * - buffer: Address in which to store address of data buffer. May be NULL. Do * not free. * - size: Address in which to store size of read data. May be NULL. * Returns: * - OPKG_OPK_OK if data was read. * - OPKG_OPK_END if no more data exists. * - OPKG_OPK_ERROR on decompression error or premature end of gzip stream. */ int opkg_opk_ustar_read(struct opkg_opk_ustar *ustar, char **buffer, size_t *size); int opkg_opk_ustar_write_header(struct opkg_opk_ustar *ustar, struct opkg_opk_dirent *dirent, uint16_t mode, uid_t uid, const char *uname, gid_t gid, const char *gname, uint32_t devmajor, uint32_t devminor, uint64_t size, uint64_t mtime, char type, const char *linkname); int opkg_opk_ustar_get_buffer(struct opkg_opk_ustar *ustar, char **buffer, size_t *size); int opkg_opk_ustar_write_data(struct opkg_opk_ustar *ustar, size_t size); int opkg_opk_ustar_write_trailer(struct opkg_opk_ustar *ustar); /* * Frees a member structure. * Parameters: * - member: Member structure. */ void opkg_opk_ustar_member_free(struct opkg_opk_ustar_member *member); /* * Frees an archive structure. * Parameters: * - ustar: Archive structure. */ void opkg_opk_ustar_free(struct opkg_opk_ustar *ustar); #endif /* OPKG_OPK_USTAR_H_ */