1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
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;
}
|