summaryrefslogtreecommitdiffhomepage
path: root/src/internal/ntux_driver_impl.h
blob: 8b2be85f4e3c4508bb46f5872762754ca3178a8f (plain)
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