63static int config_validate_ip (
const char *ipadd);
64char *config_find_mounts (
void);
65int config_find_sync (
void);
66char *config_find_alt_mount (
void);
67char *config_check_trigger (
void);
68char *config_get_trigger_subsystem (
void);
69char *config_get_trigger_mode (
void);
70char *config_get_trigger_property (
void);
71char *config_get_trigger_value (
void);
72static char *config_get_network_ip (
void);
73static char *config_get_network_interface (
void);
74static char *config_get_network_gateway (
void);
75static char *config_get_network_netmask (
void);
76static char *config_get_network_nat_interface(
void);
77static int config_get_conf_int (
const gchar *entry,
const gchar *key);
78char *config_get_conf_string (
const gchar *entry,
const gchar *key);
79static gchar *config_make_user_key_string (
const gchar *base_key, uid_t uid);
80gchar *config_get_user_conf_string (
const gchar *entry,
const gchar *base_key, uid_t uid);
81static char *config_get_kcmdline_string (
const char *entry);
82char *config_get_mode_setting (uid_t uid);
83set_config_result_t config_set_config_setting (
const char *entry,
const char *key,
const char *value);
84set_config_result_t config_set_user_config_setting (
const char *entry,
const char *base_key,
const char *value, uid_t uid);
86static char *config_make_modes_string (
const char *key,
const char *mode_name,
int include);
91#ifdef SAILFISH_ACCESS_CONTROL
92char *config_get_group_for_mode (
const char *mode);
97static void config_merge_key (GKeyFile *dest, GKeyFile *srce,
const char *grp,
const char *key);
98static void config_merge_group (GKeyFile *dest, GKeyFile *srce,
const char *grp);
99static void config_merge_data (GKeyFile *dest, GKeyFile *srce);
100static void config_purge_data (GKeyFile *dest, GKeyFile *srce);
101static void config_purge_empty_groups (GKeyFile *dest);
102static int config_glob_error_cb (
const char *path,
int err);
103static bool config_merge_from_file (GKeyFile *ini,
const char *path);
104static void config_load_static_config (GKeyFile *ini);
105static bool config_load_legacy_config (GKeyFile *ini);
106static void config_remove_legacy_config (
void);
107static void config_load_dynamic_config (GKeyFile *ini);
108static void config_save_dynamic_config (GKeyFile *ini);
110static GKeyFile *config_get_settings (
void);
111char *config_get_android_manufacturer (
void);
112char *config_get_android_vendor_id (
void);
113char *config_get_android_product (
void);
114char *config_get_android_product_id (
void);
115char *config_get_hidden_modes (
void);
116char *config_get_mode_whitelist (
void);
117int config_is_roaming_not_allowed (
void);
124static int config_validate_ip(
const char *ipadd)
126 LOG_REGISTER_CONTEXT;
128 unsigned int b1, b2, b3, b4;
131 if (sscanf(ipadd,
"%3u.%3u.%3u.%3u%c", &b1, &b2, &b3, &b4, &c) != 4)
134 if ((b1 | b2 | b3 | b4) > 255)
136 if (strspn(ipadd,
"0123456789.") < strlen(ipadd))
142char *config_find_mounts(
void)
144 LOG_REGISTER_CONTEXT;
148 ret = config_get_conf_string(FS_MOUNT_ENTRY, FS_MOUNT_KEY);
151 ret = g_strdup(FS_MOUNT_DEFAULT);
157int config_find_sync(
void)
159 LOG_REGISTER_CONTEXT;
161 return config_get_conf_int(FS_SYNC_ENTRY, FS_SYNC_KEY);
164char * config_find_alt_mount(
void)
166 LOG_REGISTER_CONTEXT;
168 return config_get_conf_string(ALT_MOUNT_ENTRY, ALT_MOUNT_KEY);
171char * config_check_trigger(
void)
173 LOG_REGISTER_CONTEXT;
175 return config_get_conf_string(TRIGGER_ENTRY, TRIGGER_PATH_KEY);
178char * config_get_trigger_subsystem(
void)
180 LOG_REGISTER_CONTEXT;
182 return config_get_conf_string(TRIGGER_ENTRY, TRIGGER_UDEV_SUBSYSTEM);
185char * config_get_trigger_mode(
void)
187 LOG_REGISTER_CONTEXT;
189 return config_get_conf_string(TRIGGER_ENTRY, TRIGGER_MODE_KEY);
192char * config_get_trigger_property(
void)
194 LOG_REGISTER_CONTEXT;
196 return config_get_conf_string(TRIGGER_ENTRY, TRIGGER_PROPERTY_KEY);
199char * config_get_trigger_value(
void)
201 LOG_REGISTER_CONTEXT;
203 return config_get_conf_string(TRIGGER_ENTRY, TRIGGER_PROPERTY_VALUE_KEY);
206static char * config_get_network_ip(
void)
208 LOG_REGISTER_CONTEXT;
210 char * ip = config_get_kcmdline_string(NETWORK_IP_KEY);
212 if(!config_validate_ip(ip))
217 return config_get_conf_string(NETWORK_ENTRY, NETWORK_IP_KEY);
220static char * config_get_network_interface(
void)
222 LOG_REGISTER_CONTEXT;
224 return config_get_conf_string(NETWORK_ENTRY, NETWORK_INTERFACE_KEY);
227static char * config_get_network_gateway(
void)
229 LOG_REGISTER_CONTEXT;
231 char * gw = config_get_kcmdline_string(NETWORK_GATEWAY_KEY);
235 return config_get_conf_string(NETWORK_ENTRY, NETWORK_GATEWAY_KEY);
238static char * config_get_network_netmask(
void)
240 LOG_REGISTER_CONTEXT;
242 char * netmask = config_get_kcmdline_string(NETWORK_NETMASK_KEY);
246 return config_get_conf_string(NETWORK_ENTRY, NETWORK_NETMASK_KEY);
249static char * config_get_network_nat_interface(
void)
251 LOG_REGISTER_CONTEXT;
253 return config_get_conf_string(NETWORK_ENTRY, NETWORK_NAT_INTERFACE_KEY);
256static int config_get_conf_int(
const gchar *entry,
const gchar *key)
258 LOG_REGISTER_CONTEXT;
261 GKeyFile *ini = config_get_settings();
263 gint val = g_key_file_get_integer(ini, entry, key, 0);
264 g_key_file_free(ini);
269char *config_get_conf_string(
const gchar *entry,
const gchar *key)
271 LOG_REGISTER_CONTEXT;
274 GKeyFile *ini = config_get_settings();
276 gchar *val = g_key_file_get_string(ini, entry, key, 0);
277 g_key_file_free(ini);
282static gchar *config_make_user_key_string(
const gchar *base_key, uid_t uid)
284 LOG_REGISTER_CONTEXT;
287#ifdef SAILFISH_ACCESS_CONTROL
289 if( uid >= MIN_ADDITIONAL_USER && uid <= MAX_ADDITIONAL_USER )
290 key = g_strdup_printf(
"%s_%d", base_key, (
int)uid);
295gchar *config_get_user_conf_string(
const gchar *entry,
const gchar *base_key, uid_t uid)
297 LOG_REGISTER_CONTEXT;
300 gchar *key = config_make_user_key_string(base_key, uid);
302 value = config_get_conf_string(entry, key);
305 value = config_get_conf_string(entry, base_key);
310static char * config_get_kcmdline_string(
const char *entry)
312 LOG_REGISTER_CONTEXT;
320 gchar **arg_tokens = NULL, **network_tokens = NULL;
321 GError *optErr = NULL;
324 if ((fd = open(
"/proc/cmdline", O_RDONLY)) < 0)
326 log_debug(
"could not read /proc/cmdline");
330 len = read(fd, cmdLine,
sizeof cmdLine - 1);
335 log_debug(
"kernel command line was empty");
343 if (!g_shell_parse_argv(cmdLine, &argc, &argv, &optErr))
345 g_error_free(optErr);
350 for (i=0; i < argc; i++)
352 arg_tokens = g_strsplit(argv[i],
"=", 2);
353 if (!g_ascii_strcasecmp(arg_tokens[0],
"usb_moded_ip"))
355 network_tokens = g_strsplit(arg_tokens[1],
":", 7);
357 if(g_strrstr(network_tokens[5],
"usb")|| (g_strrstr(network_tokens[5],
"rndis")))
359 if(!strcmp(entry, NETWORK_IP_KEY))
361 g_free(ret), ret = g_strdup(network_tokens[0]);
362 log_debug(
"Command line ip = %s\n", ret);
364 if(!strcmp(entry, NETWORK_GATEWAY_KEY))
367 if(strlen(network_tokens[2]) > 2)
369 g_free(ret), ret = g_strdup(network_tokens[2]);
370 log_debug(
"Command line gateway = %s\n", ret);
373 if(!strcmp(entry, NETWORK_NETMASK_KEY))
375 g_free(ret), ret = g_strdup(network_tokens[3]);
376 log_debug(
"Command line netmask = %s\n", ret);
380 g_strfreev(arg_tokens);
383 g_strfreev(network_tokens);
388char * config_get_mode_setting(uid_t uid)
390 LOG_REGISTER_CONTEXT;
395 if( (mode = config_get_kcmdline_string(MODE_SETTING_KEY)) )
398 mode = config_get_user_conf_string(MODE_SETTING_ENTRY, MODE_SETTING_KEY, uid);
405 log_warning(
"default mode '%s' is not valid for uid '%d', reset to '%s'",
407 g_free(mode), mode = g_strdup(
MODE_ASK);
408 config_set_mode_setting(mode, uid);
415set_config_result_t config_set_config_setting(
const char *entry,
const char *key,
const char *value)
417 LOG_REGISTER_CONTEXT;
421 GKeyFile *static_ini = g_key_file_new();
422 GKeyFile *active_ini = g_key_file_new();
427 config_load_static_config(static_ini);
430 config_merge_data(active_ini, static_ini);
431 config_load_dynamic_config(active_ini);
433 prev = g_key_file_get_string(active_ini, entry, key, 0);
434 if( g_strcmp0(prev, value) ) {
435 g_key_file_set_string(active_ini, entry, key, value);
441 config_purge_data(active_ini, static_ini);
444 config_save_dynamic_config(active_ini);
447 g_key_file_free(active_ini);
448 g_key_file_free(static_ini);
453set_config_result_t config_set_user_config_setting(
const char *entry,
const char *base_key,
const char *value, uid_t uid)
455 LOG_REGISTER_CONTEXT;
457 gchar *key = config_make_user_key_string(base_key, uid);
465 LOG_REGISTER_CONTEXT;
472 if (!usbmoded_is_mode_permitted(mode, uid))
475 return config_set_user_config_setting(MODE_SETTING_ENTRY,
476 MODE_SETTING_KEY, mode, uid);
481static char * config_make_modes_string(
const char *key,
const char *mode_name,
int include)
483 LOG_REGISTER_CONTEXT;
487 gchar **modes_arr = 0;
488 GString *modes_tmp = 0;
492 modes_old = config_get_conf_string(MODE_SETTING_ENTRY, key);
495 modes_old = g_strdup(
"");
498 modes_arr = g_strsplit(modes_old,
",", 0);
500 modes_tmp = g_string_new(NULL);
502 for(i = 0; modes_arr[i] != NULL; i++)
504 if(strlen(modes_arr[i]) == 0)
510 if(!strcmp(modes_arr[i], mode_name))
520 if(modes_tmp->len > 0)
521 modes_tmp = g_string_append(modes_tmp,
",");
522 modes_tmp = g_string_append(modes_tmp, modes_arr[i]);
528 if(modes_tmp->len > 0)
529 modes_tmp = g_string_append(modes_tmp,
",");
530 modes_tmp = g_string_append(modes_tmp, mode_name);
533 modes_new = g_string_free(modes_tmp, FALSE), modes_tmp = 0;
535 g_strfreev(modes_arr), modes_arr = 0;
537 g_free(modes_old), modes_old = 0;
544 LOG_REGISTER_CONTEXT;
548 char *hidden_modes = config_make_modes_string(MODE_HIDE_KEY, mode, 1);
551 ret = config_set_config_setting(MODE_SETTING_ENTRY, MODE_HIDE_KEY, hidden_modes);
560 g_free(hidden_modes);
567 LOG_REGISTER_CONTEXT;
571 char *hidden_modes = config_make_modes_string(MODE_HIDE_KEY, mode, 0);
574 ret = config_set_config_setting(MODE_SETTING_ENTRY, MODE_HIDE_KEY, hidden_modes);
583 g_free(hidden_modes);
590 LOG_REGISTER_CONTEXT;
592 set_config_result_t ret = config_set_config_setting(MODE_SETTING_ENTRY, MODE_WHITELIST_KEY, whitelist);
596 char *mode_setting = config_get_mode_setting(current_user);
598 config_set_mode_setting(
MODE_ASK, current_user);
599 g_free(mode_setting);
612 LOG_REGISTER_CONTEXT;
616 char *whitelist = config_make_modes_string(MODE_WHITELIST_KEY, mode, allowed);
618 ret = config_set_mode_whitelist(whitelist ?:
"");
625#ifdef SAILFISH_ACCESS_CONTROL
626char *config_get_group_for_mode(
const char *mode)
628 LOG_REGISTER_CONTEXT;
630 char *group = config_get_conf_string(MODE_GROUP_ENTRY, mode);
633 group = g_strdup(
"sailfish-system");
645 LOG_REGISTER_CONTEXT;
647 if(!strcmp(config, NETWORK_IP_KEY) || !strcmp(config, NETWORK_GATEWAY_KEY))
648 if(config_validate_ip(setting) != 0)
651 if(!strcmp(config, NETWORK_IP_KEY) || !strcmp(config, NETWORK_INTERFACE_KEY) || !strcmp(config, NETWORK_GATEWAY_KEY))
653 return config_set_config_setting(NETWORK_ENTRY, config, setting);
667 LOG_REGISTER_CONTEXT;
671 if( !g_strcmp0(config, NETWORK_IP_KEY) )
672 ret = config_get_network_ip();
673 else if( !g_strcmp0(config, NETWORK_INTERFACE_KEY))
674 ret = config_get_network_interface();
675 else if( !g_strcmp0(config, NETWORK_GATEWAY_KEY) )
676 ret = config_get_network_gateway();
677 else if( !g_strcmp0(config, NETWORK_NETMASK_KEY) )
678 ret = config_get_network_netmask();
679 else if( !g_strcmp0(config, NETWORK_NAT_INTERFACE_KEY) )
680 ret = config_get_network_nat_interface();
682 log_warning(
"unknown network setting '%s' queried", config);
695 LOG_REGISTER_CONTEXT;
699 if( !g_strcmp0(config, NETWORK_IP_KEY) )
700 ret = g_strdup(NETWORK_IP_FALLBACK);
701 else if( !g_strcmp0(config, NETWORK_INTERFACE_KEY))
702 ret = g_strdup(NETWORK_INTERFACE_FALLBACK);
703 else if( !g_strcmp0(config, NETWORK_GATEWAY_KEY) )
704 ret = g_strdup(NETWORK_GATEWAY_FALLBACK);
705 else if( !g_strcmp0(config, NETWORK_NETMASK_KEY) )
706 ret = g_strdup(NETWORK_NETMASK_FALLBACK);
707 else if( !g_strcmp0(config, NETWORK_NAT_INTERFACE_KEY) )
708 ret = g_strdup(NETWORK_NAT_INTERFACE_FALLBACK);
710 log_warning(
"unknown network fallback '%s' queried", config);
725static void config_merge_key(GKeyFile *dest, GKeyFile *srce,
726 const char *grp,
const char *key)
728 LOG_REGISTER_CONTEXT;
730 gchar *val = g_key_file_get_value(srce, grp, key, 0);
733 g_key_file_set_value(dest, grp, key, val);
745static void config_merge_group(GKeyFile *dest, GKeyFile *srce,
748 LOG_REGISTER_CONTEXT;
750 gchar **key = g_key_file_get_keys(srce, grp, 0, 0);
752 for(
size_t i = 0; key[i]; ++i )
753 config_merge_key(dest, srce, grp, key[i]);
764static void config_merge_data(GKeyFile *dest, GKeyFile *srce)
766 LOG_REGISTER_CONTEXT;
768 gchar **grp = g_key_file_get_groups(srce, 0);
771 for(
size_t i = 0; grp[i]; ++i )
772 config_merge_group(dest, srce, grp[i]);
777static void config_purge_data(GKeyFile *dest, GKeyFile *srce)
779 LOG_REGISTER_CONTEXT;
782 gchar **group = g_key_file_get_groups(srce, &groups);
783 for( gsize g = 0; g < groups; ++g ) {
785 gchar **key = g_key_file_get_keys(srce, group[g], &keys, 0);
786 for( gsize k = 0; k < keys; ++k ) {
787 gchar *cur_val = g_key_file_get_value(dest, group[g], key[k], 0);
791 gchar *def_val = g_key_file_get_value(srce, group[g], key[k], 0);
793 if( !g_strcmp0(cur_val, def_val) ) {
794 log_debug(
"purge redundant: [%s] %s = %s",
795 group[g], key[k], cur_val);
796 g_key_file_remove_key(dest, group[g], key[k], 0);
806static void config_purge_empty_groups(GKeyFile *dest)
808 LOG_REGISTER_CONTEXT;
811 gchar **group = g_key_file_get_groups(dest, &groups);
812 for( gsize g = 0; g < groups; ++g ) {
814 gchar **key = g_key_file_get_keys(dest, group[g], &keys, 0);
816 log_debug(
"purge redundant group: [%s]", group[g]);
817 g_key_file_remove_group(dest, group[g], 0);
832static int config_glob_error_cb(
const char *path,
int err)
834 LOG_REGISTER_CONTEXT;
836 log_debug(
"%s: glob: %s", path, g_strerror(err));
840static bool config_merge_from_file(GKeyFile *ini,
const char *path)
842 LOG_REGISTER_CONTEXT;
846 GKeyFile *tmp = g_key_file_new();
848 if( !g_key_file_load_from_file(tmp, path, 0, &err) ) {
849 log_debug(
"%s: can't load: %s", path, err->message);
852 config_merge_data(ini, tmp);
856 g_key_file_free(tmp);
860static void config_load_static_config(GKeyFile *ini)
862 LOG_REGISTER_CONTEXT;
864 static const char pattern[] = USB_MODED_STATIC_CONFIG_DIR
"/*.ini";
868 if( glob(pattern, 0, config_glob_error_cb, &gb) != 0 )
869 log_debug(
"no configuration ini-files found");
872 g_key_file_set_string(ini, MODE_SETTING_ENTRY, MODE_SETTING_KEY,
MODE_ASK);
875 for(
size_t i = 0; i < gb.gl_pathc; ++i ) {
876 const char *path = gb.gl_pathv[i];
877 if( strcmp(path, USB_MODED_STATIC_CONFIG_FILE) )
878 config_merge_from_file(ini, path);
884static bool config_load_legacy_config(GKeyFile *ini)
886 LOG_REGISTER_CONTEXT;
893 if( access(USB_MODED_STATIC_CONFIG_FILE, F_OK) == -1 )
908 if( access(USB_MODED_DYNAMIC_CONFIG_FILE, F_OK) == 0 ) {
909 log_warning(
"%s: has reappeared after settings migration",
910 USB_MODED_STATIC_CONFIG_FILE);
914 if( !config_merge_from_file(ini, USB_MODED_STATIC_CONFIG_FILE) )
923 gchar *val = g_key_file_get_value(ini, MODE_SETTING_ENTRY,
924 MODE_SETTING_KEY, 0);
927 g_key_file_remove_key(ini, MODE_SETTING_ENTRY,
928 MODE_SETTING_KEY, 0);
939static void config_remove_legacy_config(
void)
941 LOG_REGISTER_CONTEXT;
948 if( access(USB_MODED_STATIC_CONFIG_FILE, F_OK) == -1 && errno == ENOENT ) {
951 else if( unlink(USB_MODED_STATIC_CONFIG_FILE) == -1 && errno != ENOENT ) {
952 log_warning(
"%s: can't remove stale config file: %m",
953 USB_MODED_STATIC_CONFIG_FILE);
957static void config_load_dynamic_config(GKeyFile *ini)
959 LOG_REGISTER_CONTEXT;
961 config_merge_from_file(ini, USB_MODED_DYNAMIC_CONFIG_FILE);
964static void config_save_dynamic_config(GKeyFile *ini)
966 LOG_REGISTER_CONTEXT;
968 gchar *current_dta = 0;
969 gchar *previous_dta = 0;
971 config_purge_empty_groups(ini);
972 current_dta = g_key_file_to_data(ini, 0, 0);
974 g_file_get_contents(USB_MODED_DYNAMIC_CONFIG_FILE, &previous_dta, 0, 0);
975 if( g_strcmp0(previous_dta, current_dta) ) {
977 if( mkdir(USB_MODED_DYNAMIC_CONFIG_DIR, 0755) == -1 && errno != EEXIST ) {
978 log_err(
"%s: can't create dir: %m", USB_MODED_DYNAMIC_CONFIG_DIR);
980 else if( !g_file_set_contents(USB_MODED_DYNAMIC_CONFIG_FILE,
981 current_dta, -1, &err) ) {
982 log_err(
"%s: can't save: %s", USB_MODED_DYNAMIC_CONFIG_FILE,
986 log_debug(
"%s: updated", USB_MODED_DYNAMIC_CONFIG_FILE);
989 config_remove_legacy_config();
995 g_free(previous_dta);
1006 LOG_REGISTER_CONTEXT;
1010 GKeyFile *legacy_ini = g_key_file_new();
1011 GKeyFile *static_ini = g_key_file_new();
1012 GKeyFile *active_ini = g_key_file_new();
1015 config_load_static_config(static_ini);
1018 if( config_load_legacy_config(legacy_ini) ) {
1019 config_purge_data(legacy_ini, static_ini);
1020 config_merge_data(active_ini, legacy_ini);
1024 config_load_dynamic_config(active_ini);
1027 config_purge_data(active_ini, static_ini);
1030 config_save_dynamic_config(active_ini);
1032 g_key_file_free(active_ini);
1033 g_key_file_free(static_ini);
1034 g_key_file_free(legacy_ini);
1039static GKeyFile *config_get_settings(
void)
1041 LOG_REGISTER_CONTEXT;
1043 GKeyFile *ini = g_key_file_new();
1044 config_load_static_config(ini);
1045 config_load_dynamic_config(ini);
1049char * config_get_android_manufacturer(
void)
1051 LOG_REGISTER_CONTEXT;
1063 return config_get_conf_string(ANDROID_ENTRY, ANDROID_MANUFACTURER_KEY);
1066char * config_get_android_vendor_id(
void)
1068 LOG_REGISTER_CONTEXT;
1070 return config_get_conf_string(ANDROID_ENTRY, ANDROID_VENDOR_ID_KEY);
1073char * config_get_android_product(
void)
1075 LOG_REGISTER_CONTEXT;
1087 return config_get_conf_string(ANDROID_ENTRY, ANDROID_PRODUCT_KEY);
1090char * config_get_android_product_id(
void)
1092 LOG_REGISTER_CONTEXT;
1094 return config_get_conf_string(ANDROID_ENTRY, ANDROID_PRODUCT_ID_KEY);
1097char * config_get_hidden_modes(
void)
1099 LOG_REGISTER_CONTEXT;
1101 return config_get_conf_string(MODE_SETTING_ENTRY, MODE_HIDE_KEY);
1103char * config_get_mode_whitelist(
void)
1105 LOG_REGISTER_CONTEXT;
1107 return config_get_conf_string(MODE_SETTING_ENTRY, MODE_WHITELIST_KEY);
1110int config_is_roaming_not_allowed(
void)
1112 LOG_REGISTER_CONTEXT;
1114 return config_get_conf_int(NETWORK_ENTRY, NO_ROAMING_KEY);
1122#ifdef SAILFISH_ACCESS_CONTROL
1123 if (uid < MIN_ADDITIONAL_USER || uid > MAX_ADDITIONAL_USER) {
1124 log_err(
"Invalid uid value: %d\n", uid);
1129 GKeyFile *active_ini = g_key_file_new();
1130 config_load_dynamic_config(active_ini);
1132 char *key = config_make_user_key_string(MODE_SETTING_KEY, uid);
1134 if (g_key_file_remove_key(active_ini, MODE_SETTING_ENTRY, key, NULL))
1135 config_save_dynamic_config(active_ini);
1139 g_key_file_free(active_ini);
int common_valid_mode(const char *mode)
void common_send_available_modes_signal(void)
void common_send_hidden_modes_signal(void)
void common_send_supported_modes_signal(void)
bool config_user_clear(uid_t uid)
char * config_get_network_fallback(const char *config)
char * config_get_network_setting(const char *config)
void control_settings_changed(void)
void umdbus_send_config_signal(const char *section, const char *key, const char *value)
int umdbus_send_whitelisted_modes_signal(const char *whitelist)
gchar * ssu_get_manufacturer_name(void)
gchar * ssu_get_product_name(void)
uid_t usbmoded_get_current_user(void)