// Translate a uid into the corresponding name. // 0 to AID_APP-1 -> "system", "radio", etc. // AID_APP to AID_ISOLATED_START-1 -> u0_a1234 // AID_ISOLATED_START to AID_USER-1 -> u0_i1234 // AID_USER+ -> u1_radio, u1_a1234, u2_i1234, etc. // returns a passwd structure (sets errno to ENOENT on failure). static passwd* app_id_to_passwd(uid_t uid, passwd_state_t* state) { if (uid < AID_APP) { errno = ENOENT; return NULL; } print_app_name_from_uid(uid, state->name_buffer_, sizeof(state->name_buffer_)); const uid_t appid = uid % AID_USER; if (appid < AID_APP) { snprintf(state->dir_buffer_, sizeof(state->dir_buffer_), "/"); } else { snprintf(state->dir_buffer_, sizeof(state->dir_buffer_), "/data"); } snprintf(state->sh_buffer_, sizeof(state->sh_buffer_), "/system/bin/sh"); passwd* pw = &state->passwd_; pw->pw_name = state->name_buffer_; pw->pw_dir = state->dir_buffer_; pw->pw_shell = state->sh_buffer_; pw->pw_uid = uid; pw->pw_gid = uid; return pw; }
// Translate a gid into the corresponding app_<gid> // group structure (sets errno to ENOENT on failure). static group* app_id_to_group(gid_t gid, stubs_state_t* state) { if (gid < AID_APP) { errno = ENOENT; return NULL; } print_app_name_from_uid(gid, state->group_name_buffer_, sizeof(state->group_name_buffer_)); group* gr = &state->group_; gr->gr_name = state->group_name_buffer_; gr->gr_gid = gid; gr->gr_mem[0] = gr->gr_name; gr->gr_mem[1] = NULL; return gr; }