66 const char *cable_state_repr(cable_state_t state);
72 const char *common_map_mode_to_hardware (
const char *internal_mode);
73 const char *common_map_mode_to_external (
const char *internal_mode);
78 static void common_write_to_sysfs_file (
const char *path,
const char *text);
81 int common_system_ (
const char *file,
int line,
const char *func,
const char *command);
82 FILE *
common_popen_ (
const char *file,
int line,
const char *func,
const char *command,
const char *type);
83 waitres_t common_wait (
unsigned tot_ms,
bool (*ready_cb)(
void *aptr),
void *aptr);
84 bool common_msleep_ (
const char *file,
int line,
const char *func,
unsigned msec);
85 static bool common_mode_in_list (
const char *mode,
char *
const *modes);
99 const char *cable_state_repr(cable_state_t state)
101 LOG_REGISTER_CONTEXT;
103 static const char *
const lut[CABLE_STATE_NUMOF] = {
104 [CABLE_STATE_UNKNOWN] =
"unknown",
105 [CABLE_STATE_DISCONNECTED] =
"disconnected",
106 [CABLE_STATE_CHARGER_CONNECTED] =
"charger_connected",
107 [CABLE_STATE_PC_CONNECTED] =
"pc_connected",
129 .internal_mode = MODE_MASS_STORAGE,
134 .internal_mode = MODE_DEVELOPER,
139 .internal_mode = MODE_MTP,
144 .internal_mode = MODE_HOST,
149 .internal_mode = MODE_CONNECTION_SHARING,
154 .internal_mode = MODE_DIAG,
159 .internal_mode = MODE_ADB,
164 .internal_mode = MODE_PC_SUITE,
192 common_map_mode_to_hardware(
const char *internal_mode)
194 LOG_REGISTER_CONTEXT;
196 const char *hardware_mode = 0;
198 for(
size_t i = 0; common_modemapping[i].
internal_mode; ++i ) {
199 if( strcmp(common_modemapping[i].internal_mode, internal_mode) )
204 return hardware_mode ?: internal_mode;
208 common_map_mode_to_external(
const char *internal_mode)
210 LOG_REGISTER_CONTEXT;
212 const char *external_mode = 0;
214 for(
size_t i = 0; common_modemapping[i].
internal_mode; ++i ) {
215 if( strcmp(common_modemapping[i].internal_mode, internal_mode) )
220 return external_mode ?: internal_mode;
231 LOG_REGISTER_CONTEXT;
242 LOG_REGISTER_CONTEXT;
253 LOG_REGISTER_CONTEXT;
255 gchar *mode_list = config_get_hidden_modes();
264 LOG_REGISTER_CONTEXT;
266 gchar *mode_list = config_get_mode_whitelist();
282 static void common_write_to_sysfs_file(
const char *path,
const char *text)
284 LOG_REGISTER_CONTEXT;
291 if ((fd = open(path, O_WRONLY)) == -1) {
292 if (errno != ENOENT) {
293 log_warning(
"%s: open for writing failed: %m", path);
298 if (write(fd, text, strlen(text)) == -1) {
299 log_warning(
"%s: write failed : %m", path);
325 LOG_REGISTER_CONTEXT;
328 snprintf(buff,
sizeof buff,
"%s %lld",
331 common_write_to_sysfs_file(
"/sys/power/wake_lock", buff);
333 #if VERBOSE_WAKELOCKING
334 log_debug(
"common_acquire_wakelock %s", wakelock_name);
344 LOG_REGISTER_CONTEXT;
346 #if VERBOSE_WAKELOCKING
347 log_debug(
"common_release_wakelock %s", wakelock_name);
350 common_write_to_sysfs_file(
"/sys/power/wake_unlock", wakelock_name);
363 LOG_REGISTER_CONTEXT;
367 char exited[32] =
"";
368 char trapped[32] =
"";
369 const char *dumped =
"";
371 log_debug(
"EXEC %s; from %s:%d: %s()", command, file, line, func);
373 if( (status = system(command)) == -1 ) {
374 snprintf(exited,
sizeof exited,
" exec=failed");
377 if( WIFSIGNALED(status) ) {
378 snprintf(trapped,
sizeof trapped,
" signal=%s",
379 strsignal(WTERMSIG(status)));
382 if( WCOREDUMP(status) )
383 dumped =
" core=dumped";
385 if( WIFEXITED(status) ) {
386 result = WEXITSTATUS(status);
387 snprintf(exited,
sizeof exited,
" exit_code=%d", result);
392 log_warning(
"EXEC %s; from %s:%d: %s();%s%s%s result=%d",
393 command, file, line, func,
394 exited, trapped, dumped, result);
404 const char *command,
const char *type)
406 LOG_REGISTER_CONTEXT;
408 log_debug(
"EXEC %s; from %s:%d: %s()",
409 command, file, line, func);
411 return popen(command, type);
415 common_wait(
unsigned tot_ms,
bool (*ready_cb)(
void *aptr),
void *aptr)
417 LOG_REGISTER_CONTEXT;
421 waitres_t res = WAIT_FAILED;
424 unsigned nap_ms = (tot_ms > 200) ? 200 : tot_ms;
426 ts.tv_sec = (nap_ms / 1000);
427 ts.tv_nsec = (nap_ms % 1000);
428 ts.tv_nsec *= 1000 * 1000;
431 if( ready_cb && ready_cb(aptr) ) {
441 if( worker_bailing_out() ) {
442 log_warning(
"wait canceled");
446 if( nanosleep(&ts, &ts) == 0 )
449 if( errno != EINTR ) {
450 log_warning(
"wait failed: %m");
467 LOG_REGISTER_CONTEXT;
469 log_debug(
"SLEEP %u.%03u seconds; from %s:%d: %s()",
470 msec / 1000u, msec % 1000u,file, line, func);
471 return common_wait(msec, 0, 0) == WAIT_TIMEOUT;
479 static bool common_mode_in_list(
const char *mode,
char *
const *modes)
481 LOG_REGISTER_CONTEXT;
488 for(i = 0; modes[i] != NULL; i++)
490 if(!strcmp(modes[i], mode))
505 LOG_REGISTER_CONTEXT;
521 LOG_REGISTER_CONTEXT;
537 LOG_REGISTER_CONTEXT;
550 gchar *whitelist_value = 0;
551 gchar **whitelist_array = 0;
553 if( (whitelist_value = config_get_mode_whitelist()) )
554 whitelist_array = g_strsplit(whitelist_value,
",", 0);
556 if (!whitelist_array || common_mode_in_list(data->
mode_name, whitelist_array))
559 g_strfreev(whitelist_array);
560 g_free(whitelist_value);
576 LOG_REGISTER_CONTEXT;
578 GString *mode_list_str = g_string_new(NULL);
580 gchar *hidden_modes_value = 0;
581 gchar **hidden_modes_array = 0;
583 gchar *whitelist_value = 0;
584 gchar **whitelist_array = 0;
586 if( usbmoded_get_diag_mode() )
589 g_string_append(mode_list_str, MODE_DIAG);
593 if( (hidden_modes_value = config_get_hidden_modes()) )
594 hidden_modes_array = g_strsplit(hidden_modes_value,
",", 0);
603 if( (whitelist_value = config_get_mode_whitelist()) )
604 whitelist_array = g_strsplit(whitelist_value,
",", 0);
613 if (!usbmoded_is_mode_permitted(data->
mode_name, uid))
617 if (common_mode_in_list(data->
mode_name, hidden_modes_array))
621 if (whitelist_array && !common_mode_in_list(data->
mode_name, whitelist_array))
624 g_string_append(mode_list_str, data->
mode_name);
625 g_string_append(mode_list_str,
", ");
632 g_strfreev(whitelist_array);
633 g_free(whitelist_value);
635 g_strfreev(hidden_modes_array);
636 g_free(hidden_modes_value);
638 return g_string_free(mode_list_str,
false);