| #ifndef NTUX_DRIVER_IMPL_H |
| #define NTUX_DRIVER_IMPL_H |
| |
| #include <ntapi/ntapi.h> |
| #include <psxscl/psxscl.h> |
| #include <stdint.h> |
| #include <stdio.h> |
| |
| #include <ntux/ntux.h> |
| #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 _ntapi_vtbl * ntux_ntapi; |
| |
| #define ntapi ntux_ntapi |
| |
| enum app_tags { |
| TAG_HELP, |
| TAG_VERSION, |
| TAG_CMD, |
| TAG_LOADER, |
| TAG_LOGFILE, |
| TAG_VERBOSE, |
| TAG_SILENT, |
| TAG_RECURSIVE, |
| TAG_STRMODE, |
| TAG_REFMODE, |
| TAG_CHANGES, |
| TAG_ROOTED, |
| TAG_ROOTLESS, |
| }; |
| |
| 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; |
| 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 |