aboutsummaryrefslogtreecommitdiffstats
path: root/src/l2su.c
diff options
context:
space:
mode:
authorLibravatar bigfoot547 <[email protected]>2023-12-25 06:05:40 -0600
committerLibravatar bigfoot547 <[email protected]>2023-12-25 06:05:40 -0600
commit6d1d4d0a5506dce90c833ef8dd141058fea3c33a (patch)
tree12a95579dbf04c4310e5b42ad8cae399d81f1189 /src/l2su.c
parentinitial commit (diff)
[WIP] Add instances
still need to do the following: - check if the folder exists - try and find some way to canonicalize the path name
Diffstat (limited to 'src/l2su.c')
-rw-r--r--src/l2su.c131
1 files changed, 32 insertions, 99 deletions
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 <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <errno.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;
-}
+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;
-}