1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
#ifndef NTUX_DRIVER_IMPL_H
#define NTUX_DRIVER_IMPL_H
#include <psxabi/sys_abitypes.h>
#include <psxabi/sys_fcntl.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 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
|