diff --git a/cli/CMakeLists.txt b/cli/CMakeLists.txt index c718185..83c37a9 100644 --- a/cli/CMakeLists.txt +++ b/cli/CMakeLists.txt @@ -1,7 +1,8 @@ set(SOURCE include/chiaki-cli.h - src/discover.c) + src/discover.c + src/wakeup.c) add_library(chiaki-cli-lib STATIC ${SOURCE}) target_include_directories(chiaki-cli-lib PUBLIC "include") diff --git a/cli/include/chiaki-cli.h b/cli/include/chiaki-cli.h index 0bd1e1b..13743e0 100644 --- a/cli/include/chiaki-cli.h +++ b/cli/include/chiaki-cli.h @@ -26,6 +26,7 @@ extern "C" { #endif CHIAKI_EXPORT int chiaki_cli_cmd_discover(ChiakiLog *log, int argc, char *argv[]); +CHIAKI_EXPORT int chiaki_cli_cmd_wakeup(ChiakiLog *log, int argc, char *argv[]); #ifdef __cplusplus } diff --git a/cli/src/main.c b/cli/src/main.c index 7395ba8..05f0b4c 100644 --- a/cli/src/main.c +++ b/cli/src/main.c @@ -27,7 +27,8 @@ static const char doc[] = "CLI for Chiaki (PS4 Remote Play Client)" "\v" "Supported commands are:\n" - " discover Discover Consoles.\n"; + " discover Discover Consoles.\n" + " wakeup Send Wakeup Packet.\n"; #define ARG_KEY_VERBOSE 'v' @@ -73,6 +74,8 @@ static int parse_opt(int key, char *arg, struct argp_state *state) case ARGP_KEY_ARG: if(strcmp(arg, "discover") == 0) exit(call_subcmd(state, "discover", chiaki_cli_cmd_discover)); + else if(strcmp(arg, "wakeup") == 0) + exit(call_subcmd(state, "wakeup", chiaki_cli_cmd_wakeup)); // fallthrough case ARGP_KEY_END: argp_usage(state); diff --git a/cli/src/wakeup.c b/cli/src/wakeup.c new file mode 100644 index 0000000..06a6220 --- /dev/null +++ b/cli/src/wakeup.c @@ -0,0 +1,92 @@ +/* + * This file is part of Chiaki. + * + * Chiaki is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Chiaki is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Chiaki. If not, see . + */ + +#include + +#include + +#include +#include + +static char doc[] = "Send a PS4 wakeup packet."; + +#define ARG_KEY_HOST 'h' +#define ARG_KEY_REGISTKEY 'r' + +static struct argp_option options[] = { + { "host", ARG_KEY_HOST, "Host", 0, "Host to send wakeup packet to", 0 }, + { "registkey", ARG_KEY_REGISTKEY, "RegistKey", 0, "PS4 registration key", 0 }, + { 0 } +}; + +typedef struct arguments +{ + const char *host; + const char *registkey; +} Arguments; + +static int parse_opt(int key, char *arg, struct argp_state *state) +{ + Arguments *arguments = state->input; + + switch(key) + { + case ARG_KEY_HOST: + arguments->host = arg; + break; + case ARG_KEY_REGISTKEY: + arguments->registkey = arg; + break; + case ARGP_KEY_ARG: + argp_usage(state); + break; + default: + return ARGP_ERR_UNKNOWN; + } + + return 0; +} + +static struct argp argp = { options, parse_opt, 0, doc, 0, 0, 0 }; + +CHIAKI_EXPORT int chiaki_cli_cmd_wakeup(ChiakiLog *log, int argc, char *argv[]) +{ + Arguments arguments = { 0 }; + error_t argp_r = argp_parse(&argp, argc, argv, ARGP_IN_ORDER, NULL, &arguments); + if(argp_r != 0) + return 1; + + if(!arguments.host) + { + fprintf(stderr, "No host specified, see --help.\n"); + return 1; + } + if(!arguments.registkey) + { + fprintf(stderr, "No registration key specified, see --help.\n"); + return 1; + } + if(strlen(arguments.registkey) > 8) + { + fprintf(stderr, "Given registkey is too long.\n"); + return 1; + } + + uint64_t credential = (uint64_t)strtoull(arguments.registkey, NULL, 16); + + return chiaki_discovery_wakeup(log, NULL, arguments.host, credential); +} diff --git a/gui/src/main.cpp b/gui/src/main.cpp index ec5ec30..3a2b449 100644 --- a/gui/src/main.cpp +++ b/gui/src/main.cpp @@ -40,7 +40,8 @@ struct CLICommand }; static const QMap cli_commands = { - { "discover", { chiaki_cli_cmd_discover } } + { "discover", { chiaki_cli_cmd_discover } }, + { "wakeup", { chiaki_cli_cmd_wakeup } } }; #endif