44 static void modedata_free_cb(gpointer
self);
47 static gint modedata_sort_cb(gconstpointer a, gconstpointer b);
48 static modedata_t *modedata_load (
const gchar *filename);
66 modedata_free_cb(gpointer
self)
81 g_free(self->mode_name);
82 g_free(self->mode_module);
83 g_free(self->network_interface);
84 g_free(self->sysfs_path);
85 g_free(self->sysfs_value);
86 g_free(self->sysfs_reset_value);
87 g_free(self->android_extra_sysfs_path);
88 g_free(self->android_extra_sysfs_value);
89 g_free(self->android_extra_sysfs_path2);
90 g_free(self->android_extra_sysfs_value2);
91 g_free(self->android_extra_sysfs_path3);
92 g_free(self->android_extra_sysfs_value3);
93 g_free(self->android_extra_sysfs_path4);
94 g_free(self->android_extra_sysfs_value4);
95 g_free(self->idProduct);
96 g_free(self->idVendorOverride);
98 g_free(self->connman_tethering);
118 if( !(
self = calloc(1,
sizeof *
self)) )
127 self->sysfs_path = g_strdup(that->
sysfs_path);
138 self->idProduct = g_strdup(that->
idProduct);
140 self->nat = that->
nat;
143 self->connman_tethering = g_strdup(that->connman_tethering);
160 modedata_sort_cb(gconstpointer a, gconstpointer b)
162 LOG_REGISTER_CONTEXT;
177 modedata_load(
const gchar *filename)
179 LOG_REGISTER_CONTEXT;
182 bool success =
false;
183 GKeyFile *settingsfile = g_key_file_new();
185 if( !g_key_file_load_from_file(settingsfile, filename, G_KEY_FILE_NONE, NULL) ) {
186 log_err(
"%s: can't read mode configuration file", filename);
190 if( !(
self = calloc(1,
sizeof *
self)) )
194 self->mode_name = g_key_file_get_string(settingsfile, MODE_ENTRY, MODE_NAME_KEY, NULL);
195 self->mode_module = g_key_file_get_string(settingsfile, MODE_ENTRY, MODE_MODULE_KEY, NULL);
197 log_debug(
"Dynamic mode name = %s\n", self->mode_name);
198 log_debug(
"Dynamic mode module = %s\n", self->mode_module);
200 self->appsync = g_key_file_get_integer(settingsfile, MODE_ENTRY, MODE_NEEDS_APPSYNC_KEY, NULL);
201 self->mass_storage = g_key_file_get_integer(settingsfile, MODE_ENTRY, MODE_MASS_STORAGE_KEY, NULL);
202 self->network = g_key_file_get_integer(settingsfile, MODE_ENTRY, MODE_NETWORK_KEY, NULL);
203 self->network_interface = g_key_file_get_string(settingsfile, MODE_ENTRY, MODE_NETWORK_INTERFACE_KEY, NULL);
206 self->sysfs_path = g_key_file_get_string(settingsfile, MODE_OPTIONS_ENTRY, MODE_SYSFS_PATH, NULL);
207 self->sysfs_value = g_key_file_get_string(settingsfile, MODE_OPTIONS_ENTRY, MODE_SYSFS_VALUE, NULL);
208 self->sysfs_reset_value = g_key_file_get_string(settingsfile, MODE_OPTIONS_ENTRY, MODE_SYSFS_RESET_VALUE, NULL);
210 self->android_extra_sysfs_path = g_key_file_get_string(settingsfile, MODE_OPTIONS_ENTRY, MODE_ANDROID_EXTRA_SYSFS_PATH, NULL);
211 self->android_extra_sysfs_path2 = g_key_file_get_string(settingsfile, MODE_OPTIONS_ENTRY, MODE_ANDROID_EXTRA_SYSFS_PATH2, NULL);
212 self->android_extra_sysfs_path3 = g_key_file_get_string(settingsfile, MODE_OPTIONS_ENTRY, MODE_ANDROID_EXTRA_SYSFS_PATH3, NULL);
213 self->android_extra_sysfs_path4 = g_key_file_get_string(settingsfile, MODE_OPTIONS_ENTRY, MODE_ANDROID_EXTRA_SYSFS_PATH4, NULL);
214 self->android_extra_sysfs_value = g_key_file_get_string(settingsfile, MODE_OPTIONS_ENTRY, MODE_ANDROID_EXTRA_SYSFS_VALUE, NULL);
215 self->android_extra_sysfs_value2 = g_key_file_get_string(settingsfile, MODE_OPTIONS_ENTRY, MODE_ANDROID_EXTRA_SYSFS_VALUE2, NULL);
216 self->android_extra_sysfs_value3 = g_key_file_get_string(settingsfile, MODE_OPTIONS_ENTRY, MODE_ANDROID_EXTRA_SYSFS_VALUE3, NULL);
217 self->android_extra_sysfs_value4 = g_key_file_get_string(settingsfile, MODE_OPTIONS_ENTRY, MODE_ANDROID_EXTRA_SYSFS_VALUE4, NULL);
219 self->idProduct = g_key_file_get_string(settingsfile, MODE_OPTIONS_ENTRY, MODE_IDPRODUCT, NULL);
220 self->idVendorOverride = g_key_file_get_string(settingsfile, MODE_OPTIONS_ENTRY, MODE_IDVENDOROVERRIDE, NULL);
221 self->nat = g_key_file_get_integer(settingsfile, MODE_OPTIONS_ENTRY, MODE_HAS_NAT, NULL);
222 self->dhcp_server = g_key_file_get_integer(settingsfile, MODE_OPTIONS_ENTRY, MODE_HAS_DHCP_SERVER, NULL);
224 self->connman_tethering = g_key_file_get_string(settingsfile, MODE_OPTIONS_ENTRY, MODE_CONNMAN_TETHERING, NULL);
232 if( self->mode_name == NULL || self->mode_module == NULL ) {
233 log_err(
"%s: mode_name or mode_module not defined", filename);
237 if( self->network && self->network_interface == NULL) {
238 log_err(
"%s: network not fully defined", filename);
242 if( (self->sysfs_path && !self->sysfs_value) ||
243 (self->sysfs_reset_value && !self->sysfs_path) ) {
254 log_err(
"%s: sysfs_value not fully defined", filename);
258 log_debug(
"%s: successfully loaded", filename);
262 g_key_file_free(settingsfile);
281 LOG_REGISTER_CONTEXT;
283 g_list_free_full(modelist, modedata_free_cb);
296 LOG_REGISTER_CONTEXT;
299 const char *dirpath = diag ? DIAG_DIR_PATH : MODE_DIR_PATH;
300 gchar *pattern = g_strdup_printf(
"%s/*.ini", dirpath);
303 if( glob(pattern, 0, 0, &gb) != 0 )
304 log_debug(
"no mode configuration ini-files found");
306 for(
size_t i = 0; i < gb.gl_pathc; ++i ) {
307 const char *filepath = gb.gl_pathv[i];
308 log_debug(
"Read file %s\n", filepath);
309 modedata_t *list_item = modedata_load(filepath);
311 modelist = g_list_append(modelist, list_item);
317 return g_list_sort(modelist, modedata_sort_cb);