#include #include #include #include #include "archive.h" struct mydata { char *name; int fd; char buff[10240]; }; ssize_t myread(struct archive *a, void *client_data, const void **buff); int myopen(struct archive *a, void *client_data); int myclose(struct archive *a, void *client_data); int extract_archive(const char *name) { struct mydata *mydata; struct archive *a; struct archive_entry *entry; mydata = (struct mydata*)malloc(sizeof(struct mydata)); mydata->name = strdup(name); a = archive_read_new(); archive_read_support_compression_all(a); archive_read_support_format_all(a); if (archive_read_open(a, mydata, myopen, myread, myclose) == ARCHIVE_FATAL) { fprintf(stderr, "failed to open %s\n", mydata->name); free(mydata->name); free(mydata); return 0; } while (archive_read_next_header(a, &entry) == ARCHIVE_OK) { printf("extract %s\n",archive_entry_pathname(entry)); archive_read_extract(a, entry, ARCHIVE_EXTRACT_TIME); /* default */ archive_read_data_skip(a); } archive_read_finish(a); free(mydata->name); free(mydata); return 1; } ssize_t myread(struct archive *a, void *client_data, const void **buff) { struct mydata *mydata = client_data; *buff = mydata->buff; return (read(mydata->fd, mydata->buff, 10240)); } int myopen(struct archive *a, void *client_data) { struct mydata *mydata = client_data; mydata->fd = open(mydata->name, O_RDONLY); if (mydata->fd < 0) return ARCHIVE_FATAL; return 0; } int myclose(struct archive *a, void *client_data) { struct mydata *mydata = client_data; if (mydata->fd > 0) close(mydata->fd); return (0); } int main(int argc, char* argv[]) { extract_archive(argv[1]); }