diff options
-rw-r--r-- | include/tpax/tpax.h | 5 | ||||
-rw-r--r-- | src/driver/tpax_driver_ctx.c | 70 | ||||
-rw-r--r-- | src/internal/tpax_driver_impl.h | 1 | ||||
-rw-r--r-- | src/skin/tpax_skin_default.c | 5 |
4 files changed, 80 insertions, 1 deletions
diff --git a/include/tpax/tpax.h b/include/tpax/tpax.h index c649058..7c8404b 100644 --- a/include/tpax/tpax.h +++ b/include/tpax/tpax.h @@ -43,6 +43,11 @@ extern "C" { #define TPAX_DRIVER_ANNOTATE_NEVER 0x2000 #define TPAX_DRIVER_ANNOTATE_FULL 0x4000 +#define TPAX_DRIVER_WRITE_FORMAT_PAX 0x10000 +#define TPAX_DRIVER_WRITE_FORMAT_CPIO 0x20000 +#define TPAX_DRIVER_WRITE_FORMAT_USTAR 0x40000 +#define TPAX_DRIVER_WRITE_FORMAT_RUSTAR 0x80000 + /* error flags */ #define TPAX_ERROR_TOP_LEVEL 0x0001 #define TPAX_ERROR_NESTED 0x0002 diff --git a/src/driver/tpax_driver_ctx.c b/src/driver/tpax_driver_ctx.c index b43d129..675d836 100644 --- a/src/driver/tpax_driver_ctx.c +++ b/src/driver/tpax_driver_ctx.c @@ -23,6 +23,12 @@ | TPAX_DRIVER_EXEC_MODE_WRITE \ | TPAX_DRIVER_EXEC_MODE_COPY) +#define TPAX_DRIVER_WRITE_FORMAT_MASK \ + (TPAX_DRIVER_WRITE_FORMAT_PAX \ + | TPAX_DRIVER_WRITE_FORMAT_CPIO \ + | TPAX_DRIVER_WRITE_FORMAT_USTAR \ + | TPAX_DRIVER_WRITE_FORMAT_RUSTAR) + /* package info */ static const struct tpax_source_version tpax_src_version = { TPAX_TAG_VER_MAJOR, @@ -78,7 +84,7 @@ static int tpax_driver_usage( "Synopsis:\n" " %s\n" " %s -r\n" - " %s -w\n" + " %s -w [−x format]\n" " %s -r -w\n\n" "Options:\n", program,program,program,program,program); @@ -167,6 +173,25 @@ static int tpax_driver_usage_copy_mode( return TPAX_USAGE; } +static int tpax_driver_usage_write_format( + int fdout, + const char * program, + const char * arg, + const struct argv_option ** optv, + struct argv_meta * meta) +{ + tpax_driver_usage( + fdout,program, + arg,optv,meta); + + tpax_dprintf( + fdout, + "\nArchive format may only be specified " + "in write mode.\n"); + + return TPAX_USAGE; +} + static int tpax_driver_error_not_implemented( int fdout, const char * program, @@ -295,6 +320,20 @@ int tpax_get_driver_ctx( case TAG_COPY: cctx.drvflags |= TPAX_DRIVER_EXEC_MODE_COPY; break; + + case TAG_FORMAT: + cctx.drvflags &= ~(uint64_t)(TPAX_DRIVER_WRITE_FORMAT_MASK); + + if (!strcmp(entry->arg,"pax")) + cctx.drvflags |= TPAX_DRIVER_WRITE_FORMAT_PAX; + else if (!strcmp(entry->arg,"cpio")) + cctx.drvflags |= TPAX_DRIVER_WRITE_FORMAT_CPIO; + else if (!strcmp(entry->arg,"ustar")) + cctx.drvflags |= TPAX_DRIVER_WRITE_FORMAT_USTAR; + else if (!strcmp(entry->arg,"rustar")) + cctx.drvflags |= TPAX_DRIVER_WRITE_FORMAT_RUSTAR; + + break; } } else { operand = entry; @@ -372,6 +411,35 @@ int tpax_get_driver_ctx( break; } + /* archive format vs. execution mode*/ + switch (cctx.drvflags & TPAX_DRIVER_EXEC_MODE_MASK) { + case TPAX_DRIVER_EXEC_MODE_WRITE: + if (!(cctx.drvflags & TPAX_DRIVER_WRITE_FORMAT_MASK)) + cctx.drvflags |= TPAX_DRIVER_WRITE_FORMAT_USTAR; + break; + + default: + if (cctx.drvflags & TPAX_DRIVER_WRITE_FORMAT_MASK) + return tpax_driver_usage_write_format( + fdctx->fderr,program, + entry->arg,optv,meta); + } + + /* not implemented archive format(s) */ + switch (cctx.drvflags & TPAX_DRIVER_WRITE_FORMAT_MASK) { + case TPAX_DRIVER_WRITE_FORMAT_PAX: + return tpax_driver_error_not_implemented( + fdctx->fderr,program,"the pax format",meta); + + case TPAX_DRIVER_WRITE_FORMAT_CPIO: + return tpax_driver_error_not_implemented( + fdctx->fderr,program,"the cpio format",meta); + + default: + break; + } + + /* driver ctx */ if (!(ctx = tpax_driver_ctx_alloc(meta,fdctx,&cctx,nunits))) { if (cctx.drvflags & TPAX_DRIVER_EXEC_MODE_COPY) close(fddst); diff --git a/src/internal/tpax_driver_impl.h b/src/internal/tpax_driver_impl.h index 6d749b5..d061474 100644 --- a/src/internal/tpax_driver_impl.h +++ b/src/internal/tpax_driver_impl.h @@ -26,6 +26,7 @@ enum app_tags { TAG_READ, TAG_WRITE, TAG_COPY, + TAG_FORMAT, }; struct tpax_driver_ctx_impl { diff --git a/src/skin/tpax_skin_default.c b/src/skin/tpax_skin_default.c index eb7e363..69179be 100644 --- a/src/skin/tpax_skin_default.c +++ b/src/skin/tpax_skin_default.c @@ -21,5 +21,10 @@ const struct argv_option tpax_default_options[] = { "copy mode (copy specified files " "to a specified destination directory)"}, + + {"format", 'x',TAG_FORMAT,ARGV_OPTARG_REQUIRED,0, + "pax|cpio|ustar|rustar",0, + "archive format [%s]"}, + {0,0,0,0,0,0,0,0} }; |