67const char *cable_state_repr(cable_state_t state);
73const char *common_map_mode_to_hardware (
const char *internal_mode);
74const char *common_map_mode_to_external (
const char *internal_mode);
79static void common_write_to_sysfs_file (
const char *path,
const char *text);
82int common_system_ (
const char *file,
int line,
const char *func,
const char *command);
83FILE *
common_popen_ (
const char *file,
int line,
const char *func,
const char *command,
const char *type);
84waitres_t common_wait (
unsigned tot_ms,
bool (*ready_cb)(
void *aptr),
void *aptr);
85bool common_msleep_ (
const char *file,
int line,
const char *func,
unsigned msec);
86static bool common_mode_in_list (
const char *mode,
char *
const *modes);
100const char *cable_state_repr(cable_state_t state)
102 LOG_REGISTER_CONTEXT;
104 static const char *
const lut[CABLE_STATE_NUMOF] = {
105 [CABLE_STATE_UNKNOWN] =
"unknown",
106 [CABLE_STATE_DISCONNECTED] =
"disconnected",
107 [CABLE_STATE_CHARGER_CONNECTED] =
"charger_connected",
108 [CABLE_STATE_PC_CONNECTED] =
"pc_connected",
130 .internal_mode = MODE_MASS_STORAGE,
135 .internal_mode = MODE_DEVELOPER,
140 .internal_mode = MODE_MTP,
145 .internal_mode = MODE_HOST,
150 .internal_mode = MODE_CONNECTION_SHARING,
155 .internal_mode = MODE_DIAG,
160 .internal_mode = MODE_ADB,
165 .internal_mode = MODE_PC_SUITE,
193common_map_mode_to_hardware(
const char *internal_mode)
195 LOG_REGISTER_CONTEXT;
197 const char *hardware_mode = 0;
199 for(
size_t i = 0; common_modemapping[i].internal_mode; ++i ) {
200 if( strcmp(common_modemapping[i].internal_mode, internal_mode) )
202 hardware_mode = common_modemapping[i].hardware_mode;
205 return hardware_mode ?: internal_mode;
209common_map_mode_to_external(
const char *internal_mode)
211 LOG_REGISTER_CONTEXT;
213 const char *external_mode = 0;
215 for(
size_t i = 0; common_modemapping[i].internal_mode; ++i ) {
216 if( strcmp(common_modemapping[i].internal_mode, internal_mode) )
218 external_mode = common_modemapping[i].external_mode;
221 return external_mode ?: internal_mode;
232 LOG_REGISTER_CONTEXT;
243 LOG_REGISTER_CONTEXT;
254 LOG_REGISTER_CONTEXT;
256 gchar *mode_list = config_get_hidden_modes();
265 LOG_REGISTER_CONTEXT;
267 gchar *mode_list = config_get_mode_whitelist();
283static void common_write_to_sysfs_file(
const char *path,
const char *text)
285 LOG_REGISTER_CONTEXT;
292 if ((fd = open(path, O_WRONLY)) == -1) {
293 if (errno != ENOENT) {
294 log_warning(
"%s: open for writing failed: %m", path);
299 if (write(fd, text, strlen(text)) == -1) {
300 log_warning(
"%s: write failed : %m", path);
326 LOG_REGISTER_CONTEXT;
329 snprintf(buff,
sizeof buff,
"%s %lld",
332 common_write_to_sysfs_file(
"/sys/power/wake_lock", buff);
334#if VERBOSE_WAKELOCKING
335 log_debug(
"common_acquire_wakelock %s", wakelock_name);
345 LOG_REGISTER_CONTEXT;
347#if VERBOSE_WAKELOCKING
348 log_debug(
"common_release_wakelock %s", wakelock_name);
351 common_write_to_sysfs_file(
"/sys/power/wake_unlock", wakelock_name);
364 LOG_REGISTER_CONTEXT;
368 char exited[32] =
"";
369 char trapped[32] =
"";
370 const char *dumped =
"";
372 log_debug(
"EXEC %s; from %s:%d: %s()", command, file, line, func);
374 if( (status = system(command)) == -1 ) {
375 snprintf(exited,
sizeof exited,
" exec=failed");
378 if( WIFSIGNALED(status) ) {
379 snprintf(trapped,
sizeof trapped,
" signal=%s",
380 strsignal(WTERMSIG(status)));
383 if( WCOREDUMP(status) )
384 dumped =
" core=dumped";
386 if( WIFEXITED(status) ) {
387 result = WEXITSTATUS(status);
388 snprintf(exited,
sizeof exited,
" exit_code=%d", result);
393 log_warning(
"EXEC %s; from %s:%d: %s();%s%s%s result=%d",
394 command, file, line, func,
395 exited, trapped, dumped, result);
405 const char *command,
const char *type)
407 LOG_REGISTER_CONTEXT;
409 log_debug(
"EXEC %s; from %s:%d: %s()",
410 command, file, line, func);
412 return popen(command, type);
416common_wait(
unsigned tot_ms,
bool (*ready_cb)(
void *aptr),
void *aptr)
418 LOG_REGISTER_CONTEXT;
422 waitres_t res = WAIT_FAILED;
425 unsigned nap_ms = (tot_ms > 200) ? 200 : tot_ms;
427 ts.tv_sec = (nap_ms / 1000);
428 ts.tv_nsec = (nap_ms % 1000);
429 ts.tv_nsec *= 1000 * 1000;
432 if( ready_cb && ready_cb(aptr) ) {
442 if( worker_bailing_out() ) {
443 log_warning(
"wait canceled");
447 if( nanosleep(&ts, &ts) == 0 )
450 if( errno != EINTR ) {
451 log_warning(
"wait failed: %m");
468 LOG_REGISTER_CONTEXT;
470 log_debug(
"SLEEP %u.%03u seconds; from %s:%d: %s()",
471 msec / 1000u, msec % 1000u,file, line, func);
472 return common_wait(msec, 0, 0) == WAIT_TIMEOUT;
480static bool common_mode_in_list(
const char *mode,
char *
const *modes)
482 LOG_REGISTER_CONTEXT;
489 for(i = 0; modes[i] != NULL; i++)
491 if(!strcmp(modes[i], mode))
506 LOG_REGISTER_CONTEXT;
522 LOG_REGISTER_CONTEXT;
538 LOG_REGISTER_CONTEXT;
551 gchar *whitelist_value = 0;
552 gchar **whitelist_array = 0;
554 if( (whitelist_value = config_get_mode_whitelist()) )
555 whitelist_array = g_strsplit(whitelist_value,
",", 0);
557 if (!whitelist_array || common_mode_in_list(data->
mode_name, whitelist_array))
560 g_strfreev(whitelist_array);
561 g_free(whitelist_value);
577 LOG_REGISTER_CONTEXT;
579 GString *mode_list_str = g_string_new(NULL);
581 gchar *hidden_modes_value = 0;
582 gchar **hidden_modes_array = 0;
584 gchar *whitelist_value = 0;
585 gchar **whitelist_array = 0;
587 if( usbmoded_get_diag_mode() )
590 g_string_append(mode_list_str, MODE_DIAG);
594 if( (hidden_modes_value = config_get_hidden_modes()) )
595 hidden_modes_array = g_strsplit(hidden_modes_value,
",", 0);
604 if( (whitelist_value = config_get_mode_whitelist()) )
605 whitelist_array = g_strsplit(whitelist_value,
",", 0);
614 if (!usbmoded_is_mode_permitted(data->
mode_name, uid))
618 if (common_mode_in_list(data->
mode_name, hidden_modes_array))
622 if (whitelist_array && !common_mode_in_list(data->
mode_name, whitelist_array))
625 g_string_append(mode_list_str, data->
mode_name);
626 g_string_append(mode_list_str,
", ");
633 g_strfreev(whitelist_array);
634 g_free(whitelist_value);
636 g_strfreev(hidden_modes_array);
637 g_free(hidden_modes_value);
639 return g_string_free(mode_list_str,
false);
const char * internal_mode
const char * hardware_mode
const char * external_mode
void common_release_wakelock(const char *wakelock_name)
int common_valid_mode(const char *mode)
int common_system_(const char *file, int line, const char *func, const char *command)
void common_send_available_modes_signal(void)
FILE * common_popen_(const char *file, int line, const char *func, const char *command, const char *type)
void common_send_whitelisted_modes_signal(void)
void common_send_hidden_modes_signal(void)
gchar * common_get_mode_list(mode_list_type_t type, uid_t uid)
bool common_modename_is_internal(const char *modename)
void common_acquire_wakelock(const char *wakelock_name)
bool common_msleep_(const char *file, int line, const char *func, unsigned msec)
bool common_modename_is_static(const char *modename)
void common_send_supported_modes_signal(void)
int umdbus_send_hidden_modes_signal(const char *hidden_modes)
int umdbus_send_available_modes_signal(const char *available_modes)
int umdbus_send_supported_modes_signal(const char *supported_modes)
int umdbus_send_whitelisted_modes_signal(const char *whitelist)
#define MODE_CHARGING_FALLBACK
const modedata_t * usbmoded_get_modedata(const char *modename)
GList * usbmoded_get_modelist(void)
#define USB_MODED_SUSPEND_DELAY_MAXIMUM_MS