3b82e3c1 |
1 | /* |
2 | * Copyright (c) 2014 Ian Sutton <ian@kremlin.cc> |
3 | * |
4 | * Permission to use, copy, modify, and distribute this software for any |
5 | * purpose with or without fee is hereby granted, provided that the above |
6 | * copyright notice and this permission notice appear in all copies. |
7 | * |
8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
15 | */ |
16 | |
36575bff |
17 | #include <unistd.h> |
18 | #include <fcntl.h> |
19 | #include <gio/gio.h> |
20 | |
21 | static GKeyFile *config; |
d099276b |
22 | static int config_descr; |
36575bff |
23 | |
5b435dd1 |
24 | static gchar *data_dir; |
25 | |
8f18585d |
26 | /*static int hostnamed_ispect_xml_descr, hostnamed_dbus_xml_descr; |
5b435dd1 |
27 | static int localed_ispect_xml_descr, localed_dbus_xml_descr; |
28 | static int timedated_ispect_xml_descr, timedated_dbus_xml_descr; |
29 | static int logind_ispect_xml_descr, logind_dbus_xml_descr; |
30 | |
8f18585d |
31 | /*TODO depending on builtin xml flag, these should be matched to checksums */ /* |
5b435dd1 |
32 | static gchar **hostnamed_ispect_xml, hostnamed_dbus_xml; |
33 | static gchar **localed_ispect_xml, localed_dbus_xml; |
34 | static gchar **timedated_ispect_xml, timedated_dbus_xml; |
8f18585d |
35 | static gchar **logind_ispect_xml, logind_dbus_xml; */ |
5b435dd1 |
36 | |
5e2aed57 |
37 | static void set_xml_descriptors(); |
38 | |
36575bff |
39 | static const gchar *CONFIG_KEYS[] = { |
1cd5e6fe |
40 | "PrettyHostname", |
41 | "IconName", |
42 | "ChassisType" |
36575bff |
43 | }; |
44 | |
45 | /* NULL if key doesn't exist */ |
46 | gchar *get_option(gchar *key, gchar *group) { |
47 | |
1cd5e6fe |
48 | if(!group) |
49 | group = "default"; |
36575bff |
50 | |
1cd5e6fe |
51 | return g_key_file_get_string(config, group, key, NULL); |
36575bff |
52 | } |
53 | |
54 | /* false if key isn't already defined or value is invalid */ |
55 | gboolean set_option(gchar *key, gchar *value, gchar *group) { |
56 | |
1cd5e6fe |
57 | if(!group) |
58 | group = "default"; |
36575bff |
59 | |
1cd5e6fe |
60 | if(!g_key_file_get_string(config, group, key, NULL)) |
61 | return FALSE; |
36575bff |
62 | |
1cd5e6fe |
63 | //TODO safteycheck value |
64 | g_key_file_set_string(config, group, key, value); |
65 | return TRUE; |
36575bff |
66 | } |
67 | |
68 | /* initial load/check */ |
36575bff |
69 | gboolean config_init() { |
70 | |
1cd5e6fe |
71 | if(config) |
72 | return TRUE; //already init'd |
39df6847 |
73 | |
1cd5e6fe |
74 | config = g_key_file_new(); |
75 | |
76 | const gchar *config_path; |
77 | GStatBuf *config_lstat; |
39df6847 |
78 | |
1cd5e6fe |
79 | config_path = "/etc/systemd_compat.conf"; |
39df6847 |
80 | |
1cd5e6fe |
81 | /* does conf exist? */ |
82 | if(g_lstat(config_path, config_lstat)) { |
39df6847 |
83 | |
1cd5e6fe |
84 | /* if not, can we write it */ |
85 | if(g_access("/etc/", W_OK)) { |
86 | g_printf("%s\n", "no write permissions for /etc/! exiting.."); |
87 | return FALSE; |
88 | } |
39df6847 |
89 | |
1cd5e6fe |
90 | int config_descr; |
91 | config_descr = g_open(config_path, O_CREAT, 644); |
39df6847 |
92 | |
1cd5e6fe |
93 | gchar *posix_hostname; |
94 | posix_hostname = g_malloc(HOST_NAME_MAX); |
39df6847 |
95 | |
1cd5e6fe |
96 | gethostname(posix_hostname, HOST_NAME_MAX); |
39df6847 |
97 | |
1cd5e6fe |
98 | g_key_file_set_string(config, "hostnamed", "Hostname", posix_hostname); |
99 | g_key_file_set_string(config, "hostnamed", "PrettyHostname", ""); |
100 | g_key_file_set_string(config, "hostnamed", "IconName", "Computer"); |
101 | g_key_file_set_string(config, "hostnamed", "ChassisType", "laptop"); //TODO set these correctly |
39df6847 |
102 | |
1cd5e6fe |
103 | if(!g_key_file_save_to_file(config, config_path, NULL)) { |
104 | g_printf("failed to write config to %s!\n", config_path); |
105 | g_free(posix_hostname); |
106 | return FALSE; |
107 | } |
39df6847 |
108 | |
1cd5e6fe |
109 | g_printf("wrote config to %s\n", config_path); |
39df6847 |
110 | |
1cd5e6fe |
111 | g_free(posix_hostname); |
39df6847 |
112 | |
1cd5e6fe |
113 | return TRUE; |
36575bff |
114 | |
1cd5e6fe |
115 | /* it does exist, read it */ |
116 | } else { |
36575bff |
117 | |
1cd5e6fe |
118 | if(!g_access(config_path, W_OK)) { |
119 | g_printf("%s\n", "no write permissions for /etc/! exiting.."); |
120 | return FALSE; |
121 | } else if(g_key_file_load_from_file(config, config_path, G_KEY_FILE_KEEP_COMMENTS, NULL)) |
122 | return TRUE; |
36575bff |
123 | |
1cd5e6fe |
124 | g_printf("could not read config at %s! exiting..", config_path); |
125 | return FALSE; |
126 | } |
446ae274 |
127 | } |
8f18585d |
128 | |
129 | gboolean init_xml() { |
130 | |
131 | const gchar * const *data_dir_prefix; |
132 | |
133 | data_dir_prefix = g_get_system_data_dirs(); |
134 | data_dir = g_strconcat(data_dir_prefix[0], "systemd_compat", NULL); |
135 | |
136 | GStatBuf *xml_lstat; |
137 | |
138 | /* does xml dir exist? */ |
139 | if(g_lstat(data_dir, xml_lstat)) { |
140 | |
141 | /* if not, can we write it? */ |
142 | if(g_access(data_dir_prefix[0], W_OK)) { |
143 | g_printf("no write permissions for %s! exiting...\n", data_dir_prefix[0]); |
144 | return FALSE; |
145 | } |
146 | |
147 | g_printf("creating xml data directory %s...\n", data_dir); |
148 | if(g_mkdir(data_dir, 644)) { |
149 | g_printf("failed to create dir %s...\n", data_dir); |
150 | return FALSE; |
151 | } |
152 | |
5e2aed57 |
153 | set_xml_descriptors(); |
8f18585d |
154 | } |
5e2aed57 |
155 | return TRUE; /* kill me! */ |
156 | } /* kill me too!*/ |
446ae274 |
157 | |
8f18585d |
158 | //LEFTOFF |
159 | |
160 | /* gchar *posix_hostname; |
161 | posix_hostname = g_malloc(255); |
162 | |
163 | gethostname(posix_hostname, 255); |
164 | |
165 | g_key_file_set_string(config, "hostnamed", "Hostname", posix_hostname); |
166 | g_key_file_set_string(config, "hostnamed", "PrettyHostname", ""); |
167 | g_key_file_set_string(config, "hostnamed", "IconName", "Computer"); |
168 | g_key_file_set_string(config, "hostnamed", "ChassisType", "laptop"); //TODO set these correctly |
169 | |
170 | if(!g_key_file_save_to_file(config, config_path, NULL)) { |
171 | g_printf("failed to write config to %s!\n", config_path); |
172 | g_free(posix_hostname); |
173 | return FALSE; |
174 | } |
175 | |
176 | g_printf("wrote config to %s\n", config_path); |
177 | |
178 | g_free(posix_hostname); |
179 | |
180 | return TRUE; |
181 | |
182 | /* it does exist, read it */ /* |
183 | } else { |
184 | |
185 | if(!g_access(config_path, W_OK)) { |
186 | g_printf("%s\n", "no write permissions for /etc/! exiting.."); |
187 | return FALSE; |
188 | } else if(g_key_file_load_from_file(config, config_path, G_KEY_FILE_KEEP_COMMENTS, NULL)) { |
189 | config_descr = g_open(config_path, O_RDWR, 644); |
190 | return TRUE; |
191 | } |
192 | |
193 | g_printf("could not read config at %s! exiting..", config_path); |
194 | return FALSE; |
195 | } |
196 | |
197 | |
198 | return TRUE; |
199 | } */ |
200 | |
446ae274 |
201 | static void set_xml_descriptors() { |
8f18585d |
202 | |
203 | } |
204 | |
205 | void clean_config() { |
206 | |
207 | //TODO g_ptr_array all of this |
208 | g_free(config); |
209 | g_free(data_dir); |
210 | g_close(config_descr, NULL); |
446ae274 |
211 | } |