aboutsummaryrefslogtreecommitdiffstats
path: root/src/l2su.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/l2su.c')
-rw-r--r--src/l2su.c135
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;
+}