#ifndef NTUX_DRIVER_IMPL_H #define NTUX_DRIVER_IMPL_H #include #include #include #include #include #include #include "ntux_dprintf_impl.h" #include "argv/argv.h" #define NTUX_OPTV_ELEMENTS 64 extern const struct argv_option ntux_default_options[]; extern const struct argv_option ntux_spawn_options[]; extern const struct argv_option ntux_strace_options[]; extern const struct argv_option ntux_chmod_options[]; extern const struct argv_option ntux_aceit_options[]; extern const struct argv_option ntux_fspath_options[]; extern const struct argv_option ntux_bridge_options[]; /* bridge functionality */ #define NTUX_EXE_SUFFIX ".exe" #define NTUX_EXE_SUFFIX_LEN (4) #define NTUX_MAX_PATH_UTF8 (32768 / 2 * 3) #define NTUX_MAX_PATH NTUX_MAX_PATH_UTF8 enum app_tags { TAG_HELP, TAG_VERSION, TAG_CMD, TAG_LOADER, TAG_LOGFILE, TAG_VERBOSE, TAG_SILENT, TAG_RECURSIVE, TAG_STRMODE, TAG_REFOBJ, TAG_CHANGES, TAG_OWNER, TAG_GROUP, TAG_ROOTED, TAG_ROOTLESS, TAG_DUMP, TAG_SYNTAX, TAG_RPATH, TAG_APATH, TAG_NPATH, TAG_DPATH, TAG_INTERP, TAG_SCRIPT, TAG_OPTARG, TAG_CWDPATH, TAG_ABSPATH, }; struct ntux_driver_ctx_impl { struct ntux_common_ctx cctx; struct ntux_driver_ctx ctx; struct ntux_fd_ctx fdctx; struct __psx_context xctx; const struct ntux_unit_ctx *euctx; const char * eunit; char * interp; struct ntux_error_info ** errinfp; struct ntux_error_info ** erricap; struct ntux_error_info * erriptr[64]; struct ntux_error_info erribuf[64]; char errsbuf[28]; int errcode; }; static inline struct ntux_driver_ctx_impl * ntux_get_driver_ictx(const struct ntux_driver_ctx * dctx) { uintptr_t addr; if (dctx) { addr = (uintptr_t)dctx - offsetof(struct ntux_driver_ctx_impl,ctx); return (struct ntux_driver_ctx_impl *)addr; } return 0; } static inline void ntux_driver_set_ectx( const struct ntux_driver_ctx * dctx, const struct ntux_unit_ctx * uctx, const char * unit) { struct ntux_driver_ctx_impl * ictx; ictx = ntux_get_driver_ictx(dctx); ictx->euctx = uctx; ictx->eunit = unit; } static inline int ntux_driver_fdin(const struct ntux_driver_ctx * dctx) { struct ntux_fd_ctx fdctx; ntux_get_driver_fdctx(dctx,&fdctx); return fdctx.fdin; } static inline int ntux_driver_fdout(const struct ntux_driver_ctx * dctx) { struct ntux_fd_ctx fdctx; ntux_get_driver_fdctx(dctx,&fdctx); return fdctx.fdout; } static inline int ntux_driver_fderr(const struct ntux_driver_ctx * dctx) { struct ntux_fd_ctx fdctx; ntux_get_driver_fdctx(dctx,&fdctx); return fdctx.fderr; } static inline int ntux_driver_fdlog(const struct ntux_driver_ctx * dctx) { struct ntux_fd_ctx fdctx; ntux_get_driver_fdctx(dctx,&fdctx); return fdctx.fdlog; } static inline int ntux_driver_fdcwd(const struct ntux_driver_ctx * dctx) { struct ntux_fd_ctx fdctx; ntux_get_driver_fdctx(dctx,&fdctx); return fdctx.fdcwd; } static inline int ntux_driver_fddst(const struct ntux_driver_ctx * dctx) { struct ntux_fd_ctx fdctx; ntux_get_driver_fdctx(dctx,&fdctx); return fdctx.fddst; } #endif