diff options
Diffstat (limited to 'src/l2su.c')
| -rw-r--r-- | src/l2su.c | 135 |
1 files changed, 135 insertions, 0 deletions
diff --git a/src/l2su.c b/src/l2su.c new file mode 100644 index 0000000..bd22987 --- /dev/null +++ b/src/l2su.c @@ -0,0 +1,135 @@ +#include "l2su.h" +#include "macros.h" + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +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; +} + +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())) { + 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())) { + 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); + + return 0; +} + +int main(void) +{ + int status = l2_launcher_init(); + if (status != 0) return status; + + 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) +{ + if (!in) return NULL; + + size_t inlen = strlen(in); + char *ret = calloc(1, inlen + 1); + + if (ret) memcpy(ret, in, inlen); + + return ret; +} + +char *l2_launcher__strapp(char *buf, const char *src) +{ + size_t buflen = strlen(buf); + size_t srclen = strlen(src); + + char *ret = realloc(buf, buflen + srclen + 1); + if (!ret) return NULL; + + memcpy(ret + buflen, src, srclen); + ret[buflen + srclen] = '\0'; + + return ret; +} |
