diff --git a/include/tpax/tpax.h b/include/tpax/tpax.h index fa685c3..b811987 100644 --- a/include/tpax/tpax.h +++ b/include/tpax/tpax.h @@ -184,8 +184,11 @@ tpax_api int tpax_output_error_vector (const struct tpax_driver_ctx *); tpax_api int tpax_output_error_record (const struct tpax_driver_ctx *, const struct tpax_error_info *); /* meta interfaces */ -tpax_api int tpax_meta_init_ustar_header (const struct tpax_driver_ctx *, const char *, const struct stat *, - const char *, struct tpax_ustar_header *); +tpax_api int tpax_meta_init_ustar_header (const char * pathname, const struct stat *, + const char * linkname, struct tpax_ustar_header *); + +tpax_api int tpax_meta_init_rustar_header (const char * pathname, const struct stat *, + const char * linkname, struct tpax_ustar_header *); /* low-level interfaces */ tpax_api int tpax_io_create_memory_snapshot(const struct tpax_driver_ctx *, int, const char *, diff --git a/src/logic/tpax_archive_write.c b/src/logic/tpax_archive_write.c index a881bd9..f01bb7b 100644 --- a/src/logic/tpax_archive_write.c +++ b/src/logic/tpax_archive_write.c @@ -110,6 +110,7 @@ static int tpax_archive_write_impl( int fdcwd, int fdout) { + int ret; struct tpax_unit_ctx * uctx; struct tpax_ustar_header uhdr; const struct stat * st; @@ -210,9 +211,14 @@ static int tpax_archive_write_impl( dpos = hpos + sizeof(uhdr); /* header */ - if (tpax_meta_init_ustar_header( - dctx,apath,st, - slnk,&uhdr) < 0) + if (dctx->cctx->drvflags & TPAX_DRIVER_WRITE_FORMAT_RUSTAR) { + ret = tpax_meta_init_rustar_header(apath,st,slnk,&uhdr); + + } else if (dctx->cctx->drvflags & TPAX_DRIVER_WRITE_FORMAT_USTAR) { + ret = tpax_meta_init_ustar_header(apath,st,slnk,&uhdr); + } + + if (ret < 0) return tpax_archive_write_ret( TPAX_NESTED_ERROR(dctx), dctx,uctx); diff --git a/src/meta/tpax_init_ustar_header.c b/src/meta/tpax_init_ustar_header.c index 2479e28..5078344 100644 --- a/src/meta/tpax_init_ustar_header.c +++ b/src/meta/tpax_init_ustar_header.c @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -30,12 +31,12 @@ static void tpax_octal_write(char * ch, ssize_t len, uint64_t val) } } -int tpax_meta_init_ustar_header( - const struct tpax_driver_ctx * dctx, +static int tpax_meta_init_ustar_header_impl( const char * path, const struct stat * st, const char * linkname, - struct tpax_ustar_header * uhdr) + struct tpax_ustar_header * uhdr, + bool frustar) { size_t len; const char * cap; @@ -140,7 +141,7 @@ int tpax_meta_init_ustar_header( tpax_octal_write(uhdr->u_mode,ssizeof(uhdr->u_mode),st->st_mode & TPAX_USTAR_MODE_MASK); /* u_uid, u_gid, u_uname, u_gname */ - if (dctx->cctx->drvflags & TPAX_DRIVER_WRITE_FORMAT_RUSTAR) { + if (frustar) { tpax_octal_write(uhdr->u_uid,ssizeof(uhdr->u_uid),0); tpax_octal_write(uhdr->u_gid,ssizeof(uhdr->u_gid),0); } else { @@ -216,3 +217,21 @@ int tpax_meta_init_ustar_header( /* all done; caller may now change REGFILE to HARDLINK */ return 0; } + +int tpax_meta_init_ustar_header( + const char * path, + const struct stat * st, + const char * linkname, + struct tpax_ustar_header * uhdr) +{ + return tpax_meta_init_ustar_header_impl(path,st,linkname,uhdr,false); +} + +int tpax_meta_init_rustar_header( + const char * path, + const struct stat * st, + const char * linkname, + struct tpax_ustar_header * uhdr) +{ + return tpax_meta_init_ustar_header_impl(path,st,linkname,uhdr,true); +}