pm

barely a pack manager
git clone git://z3bra.org/pm
Log | Files | Refs | README | LICENSE

commit 8ef8e1103b492188efea63c94b4ba538dff30aec
parent 96d5fa5f539e7b9efff7b2e243a652c0ef12a830
Author: z3bra <willyatmailoodotorg>
Date:   Fri Dec 18 20:03:54 2015

Add pack_creat() to create tar.bz2

Diffstat:
 pack.c | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 66 insertions(+), 6 deletions(-)

diff --git a/pack.c b/pack.c @@ -1,7 +1,13 @@ +#include <fcntl.h> #include <stdio.h> +#include <sys/stat.h> +#include <sys/types.h> + #include <archive.h> #include <archive_entry.h> +#define PACKAGE_BUFF_SIZE 8192 + /* * output the content of an archive */ @@ -11,25 +17,73 @@ pack_list(char *filename) struct archive *a; struct archive_entry *e; int r; - + + /* configure archive to support all types */ a = archive_read_new(); archive_read_support_filter_all(a); archive_read_support_format_all(a); /* set blocksize to 0 as libarchive will choose the best size anyway */ r = archive_read_open_filename(a, filename, 0); - if (r != ARCHIVE_OK) - return 1; + return r; + /* output each filename to stdout */ while(archive_read_next_header(a, &e) == ARCHIVE_OK) { puts(archive_entry_pathname(e)); } r = archive_read_free(a); + if (r != ARCHIVE_OK) + return r; + return 0; +} + +/* + * create an archive out of a file name (or directory + */ +int +pack_creat(const char *out, char **filename) +{ + struct archive *a; + struct archive_entry *e; + struct stat st; + char buf[PACKAGE_BUFF_SIZE]; + size_t len; + int fd, r; + + a = archive_write_new(); + archive_write_add_filter_bzip2(a); + archive_write_set_format_pax_restricted(a); + + r = archive_write_open_filename(a, out); if (r != ARCHIVE_OK) - return 1; + return r; + + while (*filename) { + stat(*filename, &st); + e = archive_entry_new(); + + archive_entry_set_pathname(e, *filename); + archive_entry_set_size(e, st.st_size); + archive_entry_set_filetype(e, AE_IFREG); + archive_entry_set_mode(e, st.st_mode); + archive_write_header(a, e); + + fd = open(*filename, O_RDONLY); + if (fd < 0) + return fd; + + while ((len = read(fd, buf, sizeof(buf))) > 0) + archive_write_data(a, buf, len); + + close(fd); + archive_entry_free(e); + filename++; + } + + archive_write_free(a); return 0; } @@ -37,8 +91,14 @@ pack_list(char *filename) int main (int argc, char **argv) { - while (*(++argv)) - pack_list(*argv); + const char *out; + + if (argc == 2) + pack_list(*(++argv)); + if (argc > 2) { + out = *(++argv); + pack_creat(out, ++argv); + } return 0; } \ No newline at end of file