From 6d1d4d0a5506dce90c833ef8dd141058fea3c33a Mon Sep 17 00:00:00 2001 From: bigfoot547 Date: Mon, 25 Dec 2023 06:05:40 -0600 Subject: [WIP] Add instances still need to do the following: - check if the folder exists - try and find some way to canonicalize the path name --- src/l2su.c | 131 +++++++++++++++---------------------------------------------- 1 file changed, 32 insertions(+), 99 deletions(-) (limited to 'src/l2su.c') diff --git a/src/l2su.c b/src/l2su.c index bd22987..c9a100b 100644 --- a/src/l2su.c +++ b/src/l2su.c @@ -1,135 +1,68 @@ #include "l2su.h" +#include "command.h" #include "macros.h" #include #include #include +#include -char *l2_launcher__strdup(const char *); -char *l2_launcher__strapp(char *, const char *); - -char *l2_launcher__find_config_path(void) -{ - /* check for $L2SU_CONFIG */ - char *config = getenv(PROJECT_NAME_UPPER "_CONFIG"); - if (config) { - return l2_launcher__strdup(config); - } - - /* check for $XDG_CONFIG_HOME */ - config = getenv("XDG_CONFIG_HOME"); - if (config) { - /* want to append '"/" PROJECT_NAME' to our string */ - char *ret = l2_launcher__strdup(config); - if (!ret) return NULL; - - return l2_launcher__strapp(ret, "/" PROJECT_NAME); - } - - /* check for $HOME/.config */ - config = getenv("HOME"); - if (config) { - char *ret = l2_launcher__strdup(config); - if (!ret) return NULL; - - return l2_launcher__strapp(ret, "/.config/" PROJECT_NAME); - } - - /* fail (do NOT attempt to find home directory from passwd */ - return NULL; -} - -char *l2_launcher__find_data_path(void) -{ - /* check for $L2SU_DATA */ - char *config = getenv(PROJECT_NAME_UPPER "_DATA"); - if (config) { - return l2_launcher__strdup(config); - } - - /* check for $XDG_DATA_HOME */ - config = getenv("XDG_DATA_HOME"); - if (config) { - char *ret = l2_launcher__strdup(config); - if (!ret) return NULL; - - return l2_launcher__strapp(ret, "/" PROJECT_NAME); - } - - /* check for $HOME/.local/share */ - config = getenv("HOME"); - if (config) { - char *ret = l2_launcher__strdup(config); - if (!ret) return NULL; - - return l2_launcher__strapp(ret, "/.local/share/" PROJECT_NAME); - } - - return NULL; -} +struct tag_l2_state_t l2_state = { 0 }; int l2_launcher_init(void) { /* find paths (set up l2_state.paths) */ /* create folders if they don't exist */ - printf("project is " PROJECT_NAME "...\n"); - /* look for config path */ - if (!(l2_state.paths.config = l2_launcher__find_config_path())) { + if (!(l2_state.paths.config = l2_launcher_find_config_path())) { fputs("fatal: Could not decide on a configuration directory! Please define " PROJECT_NAME_UPPER "_CONFIG to a sensible value.\n", stderr); return 1; } - if (!(l2_state.paths.data = l2_launcher__find_data_path())) { + if (!(l2_state.paths.data = l2_launcher_find_data_path())) { fputs("fatal: Could not decide on a data directory! Please define " PROJECT_NAME_UPPER "_DATA to a sensible value.\n", stderr); return 1; } - printf("config path: %s\n", l2_state.paths.config); - printf("data path: %s\n", l2_state.paths.data); + printf("Using configuration path: %s\n", l2_state.paths.config); + printf("Using data path: %s\n", l2_state.paths.data); - return 0; -} + if (l2_launcher_mkdir_parents(l2_state.paths.config) < 0) { + fprintf(stderr, "fatal: Could not create config directory: %s\n", strerror(errno)); + return 1; + } -int main(void) -{ - int status = l2_launcher_init(); - if (status != 0) return status; + if (l2_launcher_mkdir_parents(l2_state.paths.data) < 0) { + fprintf(stderr, "fatal: Could not create data directory: %s\n", strerror(errno)); + return 1; + } return 0; } -/* handcoded string functions - * - * NOTE: I am aware that this is inefficient but since these are used only a handful of times - * during initialization, I don't think performance is really a huge deal here. - * - * remember that this is a Minecraft launcher, so the PC has to meet the minimum specs of that, - * which are well above the minimum specs of this launcher */ - -char *l2_launcher__strdup(const char *in) +int main(int argc, char **argv) { - if (!in) return NULL; + int status = l2_launcher_init(); + if (status != 0) return EXIT_FAILURE; - size_t inlen = strlen(in); - char *ret = calloc(1, inlen + 1); + if (argc == 0 || !argv || !*argv) { + fputs("weird: no program name!\n", stderr); + return EXIT_FAILURE; + } - if (ret) memcpy(ret, in, inlen); + struct l2_parseinfo parseinfo; + unsigned parseres = l2_cmd_parse_command(argv + 1, &parseinfo); + if (parseres != CMD_PARSE_SUCCESS) { + fputs("failed to parse command\n", stderr); + return EXIT_FAILURE; + } - return ret; -} + unsigned res = (*parseinfo.proc)(parseinfo.ctx, parseinfo.argv); -char *l2_launcher__strapp(char *buf, const char *src) -{ - size_t buflen = strlen(buf); - size_t srclen = strlen(src); + l2_cmd_free_ctx(parseinfo.ctx); - char *ret = realloc(buf, buflen + srclen + 1); - if (!ret) return NULL; + return res == CMD_RESULT_SUCCESS ? EXIT_SUCCESS : EXIT_FAILURE; +} - memcpy(ret + buflen, src, srclen); - ret[buflen + srclen] = '\0'; - return ret; -} -- cgit v1.2.3-70-g09d2