#include "l2su.h" #include "macros.h" #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; } 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; }