summaryrefslogtreecommitdiffhomepage
path: root/src/driver/sfrt_driver_ctx.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/driver/sfrt_driver_ctx.c')
-rw-r--r--src/driver/sfrt_driver_ctx.c249
1 files changed, 0 insertions, 249 deletions
diff --git a/src/driver/sfrt_driver_ctx.c b/src/driver/sfrt_driver_ctx.c
deleted file mode 100644
index 643de8d..0000000
--- a/src/driver/sfrt_driver_ctx.c
+++ /dev/null
@@ -1,249 +0,0 @@
-#include <stdint.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-#define ARGV_DRIVER
-
-#include <sofort/sofort.h>
-#include "sofort_version.h"
-#include "sofort_driver_impl.h"
-#include "argv/argv.h"
-
-/* package info */
-static const struct sfrt_source_version sfrt_src_version = {
- SFRT_TAG_VER_MAJOR,
- SFRT_TAG_VER_MINOR,
- SFRT_TAG_VER_PATCH,
- SOFORT_GIT_VERSION
-};
-
-struct sfrt_driver_ctx_alloc {
- struct argv_meta * meta;
- struct sfrt_driver_ctx_impl ctx;
- uint64_t guard;
- const char * units[];
-};
-
-static uint32_t sfrt_argv_flags(uint32_t flags)
-{
- uint32_t ret = ARGV_CLONE_VECTOR;
-
- if (flags & SFRT_DRIVER_VERBOSITY_NONE)
- ret |= ARGV_VERBOSITY_NONE;
-
- if (flags & SFRT_DRIVER_VERBOSITY_ERRORS)
- ret |= ARGV_VERBOSITY_ERRORS;
-
- if (flags & SFRT_DRIVER_VERBOSITY_STATUS)
- ret |= ARGV_VERBOSITY_STATUS;
-
- return ret;
-}
-
-static int sfrt_driver_usage(
- int fdout,
- const char * program,
- const char * arg,
- const struct argv_option ** optv,
- struct argv_meta * meta)
-{
- char header[512];
-
- snprintf(header,sizeof(header),
- "Usage: %s [options] <file>...\n" "Options:\n",
- program);
-
- argv_usage(fdout,header,optv,arg);
- argv_free(meta);
-
- return SFRT_USAGE;
-}
-
-static struct sfrt_driver_ctx_impl * sfrt_driver_ctx_alloc(
- struct argv_meta * meta,
- const struct sfrt_fd_ctx * fdctx,
- const struct sfrt_common_ctx * cctx,
- size_t nunits)
-{
- struct sfrt_driver_ctx_alloc * ictx;
- size_t size;
- struct argv_entry * entry;
- const char ** units;
- int elements;
-
- size = sizeof(struct sfrt_driver_ctx_alloc);
- size += (nunits+1)*sizeof(const char *);
-
- if (!(ictx = calloc(1,size)))
- return 0;
-
- memcpy(&ictx->ctx.fdctx,fdctx,sizeof(*fdctx));
- memcpy(&ictx->ctx.cctx,cctx,sizeof(*cctx));
-
- for (entry=meta->entries,units=ictx->units; entry->fopt || entry->arg; entry++)
- if (!entry->fopt)
- *units++ = entry->arg;
-
- elements = sizeof(ictx->ctx.erribuf) / sizeof(*ictx->ctx.erribuf);
-
- ictx->ctx.errinfp = &ictx->ctx.erriptr[0];
- ictx->ctx.erricap = &ictx->ctx.erriptr[--elements];
-
- ictx->meta = meta;
- ictx->ctx.ctx.units = ictx->units;
- ictx->ctx.ctx.errv = ictx->ctx.errinfp;
- return &ictx->ctx;
-}
-
-static int sfrt_get_driver_ctx_fail(struct argv_meta * meta)
-{
- argv_free(meta);
- return -1;
-}
-
-int sfrt_get_driver_ctx(
- char ** argv,
- char ** envp,
- uint32_t flags,
- const struct sfrt_fd_ctx * fdctx,
- struct sfrt_driver_ctx ** pctx)
-{
- struct sfrt_driver_ctx_impl * ctx;
- struct sfrt_common_ctx cctx;
- const struct argv_option * optv[SFRT_OPTV_ELEMENTS];
- struct argv_meta * meta;
- struct argv_entry * entry;
- size_t nunits;
- const char * program;
-
- (void)envp;
-
- if (!fdctx) {
- fdctx = &(const struct sfrt_fd_ctx) {
- .fdin = STDIN_FILENO,
- .fdout = STDOUT_FILENO,
- .fderr = STDERR_FILENO,
- .fdlog = (-1),
- .fdcwd = AT_FDCWD,
- .fddst = AT_FDCWD,
- };
- }
-
- argv_optv_init(sfrt_default_options,optv);
-
- if (!(meta = argv_get(
- argv,optv,
- sfrt_argv_flags(flags),
- fdctx->fderr)))
- return -1;
-
- nunits = 0;
- program = argv_program_name(argv[0]);
- memset(&cctx,0,sizeof(cctx));
- cctx.drvflags = flags;
-
- if (!argv[1] && (flags & SFRT_DRIVER_VERBOSITY_USAGE))
- return sfrt_driver_usage(
- fdctx->fderr,
- program,0,
- optv,meta);
-
- /* get options, count units */
- for (entry=meta->entries; entry->fopt || entry->arg; entry++) {
- if (entry->fopt) {
- switch (entry->tag) {
- case TAG_HELP:
- if (flags & SFRT_DRIVER_VERBOSITY_USAGE)
- return sfrt_driver_usage(
- fdctx->fderr,
- program,entry->arg,
- optv,meta);
-
- case TAG_VERSION:
- cctx.drvflags |= SFRT_DRIVER_VERSION;
- break;
-/* dummy */
-/* dummy */ case TAG_OUTPUT_DUMMY:
-/* dummy */ cctx.anystring = entry->arg;
-/* dummy */ break;
-/* dummy */
-/* dummy */ case TAG_OUTPUT_PROPERTY:
-/* dummy */ if (!(strcmp(entry->arg,"name")))
-/* dummy */ cctx.actflags |= SFRT_OUTPUT_NAME;
-/* dummy */ else if (!(strcmp(entry->arg,"address")))
-/* dummy */ cctx.actflags |= SFRT_OUTPUT_ADDRESS;
-/* dummy */ break;
- }
- } else
- nunits++;
- }
-
- if (!(ctx = sfrt_driver_ctx_alloc(meta,fdctx,&cctx,nunits)))
- return sfrt_get_driver_ctx_fail(meta);
-
- ctx->ctx.program = program;
- ctx->ctx.cctx = &ctx->cctx;
-
- *pctx = &ctx->ctx;
- return SFRT_OK;
-}
-
-static void sfrt_free_driver_ctx_impl(struct sfrt_driver_ctx_alloc * ictx)
-{
- argv_free(ictx->meta);
- free(ictx);
-}
-
-void sfrt_free_driver_ctx(struct sfrt_driver_ctx * ctx)
-{
- struct sfrt_driver_ctx_alloc * ictx;
- uintptr_t addr;
-
- if (ctx) {
- addr = (uintptr_t)ctx - offsetof(struct sfrt_driver_ctx_impl,ctx);
- addr = addr - offsetof(struct sfrt_driver_ctx_alloc,ctx);
- ictx = (struct sfrt_driver_ctx_alloc *)addr;
- sfrt_free_driver_ctx_impl(ictx);
- }
-}
-
-const struct sfrt_source_version * sfrt_source_version(void)
-{
- return &sfrt_src_version;
-}
-
-int sfrt_get_driver_fdctx(
- const struct sfrt_driver_ctx * dctx,
- struct sfrt_fd_ctx * fdctx)
-{
- struct sfrt_driver_ctx_impl * ictx;
-
- ictx = sfrt_get_driver_ictx(dctx);
-
- fdctx->fdin = ictx->fdctx.fdin;
- fdctx->fdout = ictx->fdctx.fdout;
- fdctx->fderr = ictx->fdctx.fderr;
- fdctx->fdlog = ictx->fdctx.fdlog;
- fdctx->fdcwd = ictx->fdctx.fdcwd;
- fdctx->fddst = ictx->fdctx.fddst;
-
- return 0;
-}
-
-int sfrt_set_driver_fdctx(
- struct sfrt_driver_ctx * dctx,
- const struct sfrt_fd_ctx * fdctx)
-{
- struct sfrt_driver_ctx_impl * ictx;
-
- ictx = sfrt_get_driver_ictx(dctx);
-
- ictx->fdctx.fdin = fdctx->fdin;
- ictx->fdctx.fdout = fdctx->fdout;
- ictx->fdctx.fderr = fdctx->fderr;
- ictx->fdctx.fdlog = fdctx->fdlog;
- ictx->fdctx.fdcwd = fdctx->fdcwd;
- ictx->fdctx.fddst = fdctx->fddst;
-
- return 0;
-}