diff options
author | midipix <writeonce@midipix.org> | 2024-07-18 05:13:52 +0000 |
---|---|---|
committer | midipix <writeonce@midipix.org> | 2024-07-18 05:45:24 +0000 |
commit | 6a7e25a01553a02630daac61f06c4bdbbdc4180b (patch) | |
tree | 8a1029209bfc6f192a1807404187cece59d5198a /src | |
parent | 88391942aae898d9d7b58bb130dccef44d57634c (diff) | |
download | tpax-6a7e25a01553a02630daac61f06c4bdbbdc4180b.tar.bz2 tpax-6a7e25a01553a02630daac61f06c4bdbbdc4180b.tar.xz |
driver: list, read, and copy modes: attempt mapping the source archive.
Diffstat (limited to 'src')
-rw-r--r-- | src/driver/tpax_driver_ctx.c | 56 | ||||
-rw-r--r-- | src/internal/tpax_driver_impl.h | 3 |
2 files changed, 59 insertions, 0 deletions
diff --git a/src/driver/tpax_driver_ctx.c b/src/driver/tpax_driver_ctx.c index d926631..aaaea59 100644 --- a/src/driver/tpax_driver_ctx.c +++ b/src/driver/tpax_driver_ctx.c @@ -576,6 +576,38 @@ static int tpax_driver_keyval_error( return TPAX_ERROR; } +static int tpax_driver_srcstat_error( + struct tpax_driver_ctx_impl * ctx, + const struct argv_entry * archive, + const char * program) +{ + int lerrno; + const char * errstr; + + lerrno = errno; + errno = 0; + + errstr = strerror(lerrno); + errstr = errno ? "" : errstr; + errno = lerrno; + + if (archive) { + tpax_dprintf( + ctx->fdctx.fderr, + "%s: could not stat archive file '%s' (%s).\n", + program,archive->arg,errstr); + } else { + tpax_dprintf( + ctx->fdctx.fderr, + "%s: could not stat input source file <fd=%d> (%s).\n", + program,ctx->fdctx.fdin,errstr); + } + + tpax_lib_free_driver_ctx(&ctx->ctx); + + return TPAX_ERROR; +} + int tpax_lib_get_driver_ctx( char ** argv, char ** envp, @@ -905,6 +937,27 @@ int tpax_lib_get_driver_ctx( if (!tpax_driver_is_valid_keyval(*pkeyval)) return tpax_driver_keyval_error(ctx,*pkeyval,program); + /* source data mapping (non-critical) */ + if (cctx.srcflags) { + if (fstat(fdctx->fdin,&ctx->srcstat) < 0) + return tpax_driver_srcstat_error(ctx,archive,program); + + ctx->mapsize = ctx->srcstat.st_size; + ctx->mapaddr = mmap( + 0,ctx->mapsize, + PROT_READ,MAP_PRIVATE, + fdctx->fdin,0); + + if (ctx->mapaddr == MAP_FAILED) { + ctx->cctx.srcflags = TPAX_SOURCE_DATA_FILEIO; + ctx->mapaddr = 0; + ctx->mapsize = 0; + } else { + ctx->cctx.srcflags = TPAX_SOURCE_DATA_MAPPED; + } + } + + /* all done */ if (archive) { ctx->file = archive->arg; ctx->ctx.file = &ctx->file; @@ -945,6 +998,9 @@ static void tpax_free_driver_ctx_impl(struct tpax_driver_ctx_alloc * ictx) if (ictx->ctx.keyvalv) free(ictx->ctx.keyvalv); + if (ictx->ctx.mapaddr) + munmap(ictx->ctx.mapaddr,ictx->ctx.mapsize); + if (ictx->ctx.bufaddr) munmap(ictx->ctx.bufaddr,ictx->ctx.bufsize); diff --git a/src/internal/tpax_driver_impl.h b/src/internal/tpax_driver_impl.h index a7350d7..bc3ffc2 100644 --- a/src/internal/tpax_driver_impl.h +++ b/src/internal/tpax_driver_impl.h @@ -99,6 +99,7 @@ struct tpax_driver_ctx_impl { struct tpax_fd_ctx fdctx; const struct tpax_unit_ctx * euctx; const char * eunit; + struct stat srcstat; struct argv_keyval ** keyvalv; struct tpax_replstr * replstrv; char * replstrs; @@ -117,6 +118,8 @@ struct tpax_driver_ctx_impl { void * dirbuff; void * bufaddr; size_t bufsize; + void * mapaddr; + size_t mapsize; size_t nqueued; off_t cpos; }; |