summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Zach Hilman2018-09-30 14:28:17 -0400
committerGravatar Zach Hilman2018-10-07 14:32:32 -0400
commit081f5c1dbf8f7a40c801832f56adb5293e2bac1a (patch)
tree08f5e56dc68f2e4cc91b1ceb25237ecaa56de6ad /src
parentqt: Add UI option to configure arguments (diff)
downloadyuzu-081f5c1dbf8f7a40c801832f56adb5293e2bac1a.tar.gz
yuzu-081f5c1dbf8f7a40c801832f56adb5293e2bac1a.tar.xz
yuzu-081f5c1dbf8f7a40c801832f56adb5293e2bac1a.zip
cmd: Support passing game arguments from command line
Uses -p (--program) and following string as args.
Diffstat (limited to 'src')
-rw-r--r--src/core/loader/nro.cpp2
-rw-r--r--src/core/loader/nso.cpp2
-rw-r--r--src/yuzu_cmd/config.cpp1
-rw-r--r--src/yuzu_cmd/yuzu.cpp19
4 files changed, 14 insertions, 10 deletions
diff --git a/src/core/loader/nro.cpp b/src/core/loader/nro.cpp
index 4109b9974..0d7c1dcfa 100644
--- a/src/core/loader/nro.cpp
+++ b/src/core/loader/nro.cpp
@@ -155,7 +155,7 @@ bool AppLoader_NRO::LoadNro(FileSys::VirtualFile file, VAddr load_base) {
155 if (!Settings::values.program_args.empty()) { 155 if (!Settings::values.program_args.empty()) {
156 const auto arg_data = Settings::values.program_args; 156 const auto arg_data = Settings::values.program_args;
157 codeset->DataSegment().size += 0x9000; 157 codeset->DataSegment().size += 0x9000;
158 NSOArgumentHeader args_header{0x9000, arg_data.size(), {}}; 158 NSOArgumentHeader args_header{0x9000, static_cast<u32_le>(arg_data.size()), {}};
159 program_image.resize(static_cast<u32>(program_image.size()) + 0x9000); 159 program_image.resize(static_cast<u32>(program_image.size()) + 0x9000);
160 std::memcpy(program_image.data() + program_image.size() - 0x9000, &args_header, 160 std::memcpy(program_image.data() + program_image.size() - 0x9000, &args_header,
161 sizeof(NSOArgumentHeader)); 161 sizeof(NSOArgumentHeader));
diff --git a/src/core/loader/nso.cpp b/src/core/loader/nso.cpp
index 8ee2c6f2b..c225e2d24 100644
--- a/src/core/loader/nso.cpp
+++ b/src/core/loader/nso.cpp
@@ -130,7 +130,7 @@ VAddr AppLoader_NSO::LoadModule(FileSys::VirtualFile file, VAddr load_base,
130 if (should_pass_arguments && !Settings::values.program_args.empty()) { 130 if (should_pass_arguments && !Settings::values.program_args.empty()) {
131 const auto arg_data = Settings::values.program_args; 131 const auto arg_data = Settings::values.program_args;
132 codeset->DataSegment().size += 0x9000; 132 codeset->DataSegment().size += 0x9000;
133 NSOArgumentHeader args_header{0x9000, arg_data.size(), {}}; 133 NSOArgumentHeader args_header{0x9000, static_cast<u32_le>(arg_data.size()), {}};
134 program_image.resize(static_cast<u32>(program_image.size()) + 0x9000); 134 program_image.resize(static_cast<u32>(program_image.size()) + 0x9000);
135 std::memcpy(program_image.data() + program_image.size() - 0x9000, &args_header, 135 std::memcpy(program_image.data() + program_image.size() - 0x9000, &args_header,
136 sizeof(NSOArgumentHeader)); 136 sizeof(NSOArgumentHeader));
diff --git a/src/yuzu_cmd/config.cpp b/src/yuzu_cmd/config.cpp
index 9d934e220..2470f4640 100644
--- a/src/yuzu_cmd/config.cpp
+++ b/src/yuzu_cmd/config.cpp
@@ -138,6 +138,7 @@ void Config::ReadValues() {
138 Settings::values.use_gdbstub = sdl2_config->GetBoolean("Debugging", "use_gdbstub", false); 138 Settings::values.use_gdbstub = sdl2_config->GetBoolean("Debugging", "use_gdbstub", false);
139 Settings::values.gdbstub_port = 139 Settings::values.gdbstub_port =
140 static_cast<u16>(sdl2_config->GetInteger("Debugging", "gdbstub_port", 24689)); 140 static_cast<u16>(sdl2_config->GetInteger("Debugging", "gdbstub_port", 24689));
141 Settings::values.program_args = sdl2_config->Get("Debugging", "program_args", "");
141 142
142 // Web Service 143 // Web Service
143 Settings::values.enable_telemetry = 144 Settings::values.enable_telemetry =
diff --git a/src/yuzu_cmd/yuzu.cpp b/src/yuzu_cmd/yuzu.cpp
index 1d951ca3f..27aba95f6 100644
--- a/src/yuzu_cmd/yuzu.cpp
+++ b/src/yuzu_cmd/yuzu.cpp
@@ -56,9 +56,10 @@ static void PrintHelp(const char* argv0) {
56 std::cout << "Usage: " << argv0 56 std::cout << "Usage: " << argv0
57 << " [options] <filename>\n" 57 << " [options] <filename>\n"
58 "-g, --gdbport=NUMBER Enable gdb stub on port NUMBER\n" 58 "-g, --gdbport=NUMBER Enable gdb stub on port NUMBER\n"
59 "-f, --fullscreen Start in fullscreen mode\n" 59 "-f, --fullscreen Start in fullscreen mode\n"
60 "-h, --help Display this help and exit\n" 60 "-h, --help Display this help and exit\n"
61 "-v, --version Output version information and exit\n"; 61 "-v, --version Output version information and exit\n"
62 "-p, --program Pass following string as arguments to executable\n";
62} 63}
63 64
64static void PrintVersion() { 65static void PrintVersion() {
@@ -103,15 +104,13 @@ int main(int argc, char** argv) {
103 bool fullscreen = false; 104 bool fullscreen = false;
104 105
105 static struct option long_options[] = { 106 static struct option long_options[] = {
106 {"gdbport", required_argument, 0, 'g'}, 107 {"gdbport", required_argument, 0, 'g'}, {"fullscreen", no_argument, 0, 'f'},
107 {"fullscreen", no_argument, 0, 'f'}, 108 {"help", no_argument, 0, 'h'}, {"version", no_argument, 0, 'v'},
108 {"help", no_argument, 0, 'h'}, 109 {"program", optional_argument, 0, 'p'}, {0, 0, 0, 0},
109 {"version", no_argument, 0, 'v'},
110 {0, 0, 0, 0},
111 }; 110 };
112 111
113 while (optind < argc) { 112 while (optind < argc) {
114 char arg = getopt_long(argc, argv, "g:fhv", long_options, &option_index); 113 char arg = getopt_long(argc, argv, "g:fhvp::", long_options, &option_index);
115 if (arg != -1) { 114 if (arg != -1) {
116 switch (arg) { 115 switch (arg) {
117 case 'g': 116 case 'g':
@@ -135,6 +134,10 @@ int main(int argc, char** argv) {
135 case 'v': 134 case 'v':
136 PrintVersion(); 135 PrintVersion();
137 return 0; 136 return 0;
137 case 'p':
138 Settings::values.program_args = argv[optind];
139 ++optind;
140 break;
138 } 141 }
139 } else { 142 } else {
140#ifdef _WIN32 143#ifdef _WIN32