diff options
author | midipix <writeonce@midipix.org> | 2020-01-31 19:42:07 -0500 |
---|---|---|
committer | midipix <writeonce@midipix.org> | 2020-05-23 05:59:02 +0000 |
commit | 239ac5c3f246a737d7b70817319a37d6cece8a69 (patch) | |
tree | 73f811b95a22759acee5c72127a66e36d5ce0a13 | |
parent | 7a9a40611a0e20eb40b15aefdd3de2e12e9cc9de (diff) | |
download | tpax-239ac5c3f246a737d7b70817319a37d6cece8a69.tar.bz2 tpax-239ac5c3f246a737d7b70817319a37d6cece8a69.tar.xz |
driver: tpax_get_unit_ctx(): implemented the non-recursive bits.
-rw-r--r-- | include/tpax/tpax.h | 4 | ||||
-rw-r--r-- | src/driver/tpax_unit_ctx.c | 29 | ||||
-rw-r--r-- | src/internal/tpax_driver_impl.h | 13 |
3 files changed, 45 insertions, 1 deletions
diff --git a/include/tpax/tpax.h b/include/tpax/tpax.h index 8c45468..a06a1e5 100644 --- a/include/tpax/tpax.h +++ b/include/tpax/tpax.h @@ -119,6 +119,10 @@ struct tpax_driver_ctx { struct tpax_unit_ctx { const char * const * path; + const char * const * link; + const struct tpax_ustar_header *uhdr; + const struct tpax_cpio_header * chdr; + const struct stat * st; void * any; }; diff --git a/src/driver/tpax_unit_ctx.c b/src/driver/tpax_unit_ctx.c index a6a91b6..a94bf05 100644 --- a/src/driver/tpax_unit_ctx.c +++ b/src/driver/tpax_unit_ctx.c @@ -8,11 +8,13 @@ #include <stddef.h> #include <stdlib.h> #include <string.h> -#include <sys/mman.h> +#include <fcntl.h> +#include <sys/stat.h> #include <tpax/tpax.h> #include "tpax_driver_impl.h" #include "tpax_errinfo_impl.h" +#include "tpax_readlink_impl.h" static int tpax_free_unit_ctx_impl(struct tpax_unit_ctx_impl * ctx, int ret) { @@ -28,6 +30,7 @@ int tpax_get_unit_ctx( const char * path, struct tpax_unit_ctx ** pctx) { + int ret; struct tpax_unit_ctx_impl * ctx; if (!dctx) @@ -40,8 +43,32 @@ int tpax_get_unit_ctx( tpax_driver_set_ectx( dctx,0,path); + if (dctx->cctx->drvflags & TPAX_DRIVER_EXEC_MODE_WRITE_COPY) { + ret = fstatat( + tpax_driver_fdcwd(dctx),path, + &ctx->st,AT_SYMLINK_NOFOLLOW); + + if (ret < 0) { + free(ctx); + return TPAX_SYSTEM_ERROR(dctx); + } + } + + if (S_ISLNK(ctx->st.st_mode)) { + if (tpax_readlink( + path,ctx->linkbuf, + sizeof(ctx->linkbuf)) < 0) { + free(ctx); + return TPAX_SYSTEM_ERROR(dctx); + } + } + ctx->path = path; + ctx->link = ctx->linkbuf; + ctx->uctx.path = &ctx->path; + ctx->uctx.link = &ctx->link; + ctx->uctx.st = &ctx->st; *pctx = &ctx->uctx; diff --git a/src/internal/tpax_driver_impl.h b/src/internal/tpax_driver_impl.h index 74af288..5f98415 100644 --- a/src/internal/tpax_driver_impl.h +++ b/src/internal/tpax_driver_impl.h @@ -9,14 +9,20 @@ #include <stdint.h> #include <stdio.h> +#include <sys/stat.h> #include <sys/types.h> #include <tpax/tpax.h> +#include <tpax/tpax_specs.h> #include "tpax_dprintf_impl.h" #include "argv/argv.h" #define TPAX_OPTV_ELEMENTS 64 +#define TPAX_DRIVER_EXEC_MODE_WRITE_COPY \ + (TPAX_DRIVER_EXEC_MODE_WRITE | \ + TPAX_DRIVER_EXEC_MODE_COPY) + extern const struct argv_option tpax_default_options[]; enum app_tags { @@ -47,6 +53,13 @@ struct tpax_driver_ctx_impl { struct tpax_unit_ctx_impl { const char * path; struct tpax_unit_ctx uctx; + struct stat st; + const char * link; + char linkbuf[1024]; + union { + struct tpax_ustar_header uhdr; + struct tpax_cpio_header chdr; + } hdrbufs; }; |