Skip to content

Commit

Permalink
[usb-moded] Add option keep-developer-mode. Fixes JB#53129
Browse files Browse the repository at this point in the history
The keep-developer-mode option keeps the developer mode running
when changing user.
  • Loading branch information
salmelamike committed Mar 2, 2021
1 parent 758e080 commit dd0fe1b
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 2 deletions.
6 changes: 6 additions & 0 deletions src/usb_moded-control.c
Expand Up @@ -149,6 +149,12 @@ control_user_changed(void)
/* Cable must be connected to a pc */
if( control_get_cable_state() != CABLE_STATE_PC_CONNECTED )
return;

/* Don't leave developer mode if keep developer mode is set */
if( !strcmp(control_get_usb_mode(), MODE_DEVELOPER) &&
usbmoded_get_keep_developer_mode() )
return;

bool user_changed = (control_get_current_user() != control_get_user_for_mode());
log_debug("control_user_changed: user_changed %d", user_changed);
if (user_changed)
Expand Down
47 changes: 46 additions & 1 deletion src/usb_moded.c
Expand Up @@ -122,6 +122,8 @@ bool usbmoded_get_rescue_mode (void);
void usbmoded_set_rescue_mode (bool rescue_mode);
bool usbmoded_get_diag_mode (void);
void usbmoded_set_diag_mode (bool diag_mode);
bool usbmoded_get_keep_developer_mode (void);
void usbmoded_set_keep_developer_mode (bool keep_mode);
bool usbmoded_is_mode_permitted (const char *modename, uid_t uid);
void usbmoded_set_cable_connection_delay(int delay_ms);
int usbmoded_get_cable_connection_delay(void);
Expand Down Expand Up @@ -357,6 +359,42 @@ void usbmoded_set_diag_mode(bool diag_mode)
}
}

/* ------------------------------------------------------------------------- *
* KEEP_DEVELOPER_MODE
* ------------------------------------------------------------------------- */

/** Keep developer mode on
*
* Keeps on developer mode after user logout to allow debugging.
*/
static int usbmoded_keep_developer_mode = -1;

bool usbmoded_get_keep_developer_mode(void)
{
LOG_REGISTER_CONTEXT;

if( usbmoded_keep_developer_mode == -1 ) {
usbmoded_keep_developer_mode = false;
}

return usbmoded_keep_developer_mode;
}

void usbmoded_set_keep_developer_mode(bool keep_mode)
{
LOG_REGISTER_CONTEXT;

if( usbmoded_keep_developer_mode != keep_mode ) {
if( usbmoded_keep_developer_mode == -1 ) {
usbmoded_keep_developer_mode = keep_mode;
log_info("keep developer mode: set to %d", usbmoded_keep_developer_mode);
}
else {
log_err("keep developer mode already locked to %d", usbmoded_keep_developer_mode);
}
}
}

/* ------------------------------------------------------------------------- *
* ACCESS_CHECKS
* ------------------------------------------------------------------------- */
Expand Down Expand Up @@ -990,6 +1028,8 @@ static const char usbmoded_usage_info[] =
#endif
" -v, --version\n"
" output version information and exit\n"
" -k, --keep-developer-mode\n"
" keep developer mode on user change\n"
" -m, --max-cable-delay=<ms>\n"
" maximum delay before accepting cable connection\n"
" -b, --android-bootup-function=<function>\n"
Expand All @@ -1016,6 +1056,7 @@ static const struct option usbmoded_long_options[] =
{ "rescue", no_argument, 0, 'r' },
{ "systemd", no_argument, 0, 'n' },
{ "version", no_argument, 0, 'v' },
{ "keep-developer-mode", no_argument, 0, 'k' },
{ "max-cable-delay", required_argument, 0, 'm' },
{ "android-bootup-function", required_argument, 0, 'b' },
{ "auto-exit", no_argument, 0, 'Q' },
Expand All @@ -1024,7 +1065,7 @@ static const struct option usbmoded_long_options[] =
{ 0, 0, 0, 0 }
};

static const char usbmoded_short_options[] = "aifsTlDdhrnvm:b:QIB";
static const char usbmoded_short_options[] = "aifsTlDdhrnvkm:b:QIB";

/* Display usbmoded_usage information */
static void usbmoded_usage(void)
Expand Down Expand Up @@ -1095,6 +1136,10 @@ static void usbmoded_parse_options(int argc, char* argv[])
printf("USB mode daemon version: %s\n", VERSION);
exit(EXIT_SUCCESS);

case 'k':
usbmoded_set_keep_developer_mode(true);
break;

case 'm':
usbmoded_set_cable_connection_delay(strtol(optarg, 0, 0));
break;
Expand Down
2 changes: 2 additions & 0 deletions src/usb_moded.h
Expand Up @@ -78,6 +78,8 @@ bool usbmoded_get_rescue_mode (void);
void usbmoded_set_rescue_mode (bool rescue_mode);
bool usbmoded_get_diag_mode (void);
void usbmoded_set_diag_mode (bool diag_mode);
bool usbmoded_get_keep_developer_mode (void);
void usbmoded_set_keep_developer_mode (bool keep_mode);
bool usbmoded_is_mode_permitted (const char *modename, uid_t uid);
void usbmoded_set_cable_connection_delay(int delay_ms);
int usbmoded_get_cable_connection_delay(void);
Expand Down
2 changes: 1 addition & 1 deletion systemd/usb-moded.service
Expand Up @@ -11,7 +11,7 @@ Type=notify
TimeoutSec=25
EnvironmentFile=-/var/lib/environment/usb-moded/*.conf
EnvironmentFile=-/run/usb-moded/*.conf
ExecStart=/usr/sbin/usb_moded --systemd --force-syslog $USB_MODED_ARGS $USB_MODED_HW_ADAPTATION_ARGS
ExecStart=/usr/sbin/usb_moded --systemd --force-syslog $USB_MODED_ARGS $USB_MODED_HW_ADAPTATION_ARGS $USB_MODED_DEBUG_ARGS
Restart=always
ExecReload=/bin/kill -HUP $MAINPID

Expand Down

0 comments on commit dd0fe1b

Please sign in to comment.