int do_mkdir(int nargs, char **args) { mode_t mode = 0755; int ret; /* mkdir <path> [mode] [owner] [group] */ if (nargs >= 3) { mode = strtoul(args[2], 0, 8); } ret = mkdir(args[1], mode); /* chmod in case the directory already exists */ if (ret == -1 && errno == EEXIST) { ret = chmod(args[1], mode); } if (ret == -1) { return -errno; } if (nargs >= 4) { uid_t uid = decode_uid(args[3]); gid_t gid = -1; if (nargs == 5) { gid = decode_uid(args[4]); } if (chown(args[1], uid, gid)) { return -errno; } } return 0; }
int do_device(int nargs, char **args) { int len; char tmp[64]; char *source = args[1]; int prefix = 0; if (nargs != 5) return -1; /* Check for wildcard '*' at the end which indicates a prefix. */ len = strlen(args[1]) - 1; if (args[1][len] == '*') { args[1][len] = '\0'; prefix = 1; } /* If path starts with mtd@ lookup the mount number. */ if (!strncmp(source, "mtd@", 4)) { int n = mtd_name_to_number(source + 4); if (n >= 0) { snprintf(tmp, sizeof(tmp), "/dev/mtd/mtd%d", n); source = tmp; } } add_devperms_partners(source, get_mode(args[2]), decode_uid(args[3]), decode_uid(args[4]), prefix); return 0; }
int mkdir_with_perms(const char *path, mode_t mode, const char *owner, const char *group) { int ret; ret = mkdir(path, mode); /* chmod in case the directory already exists */ if (ret == -1 && errno == EEXIST) { ret = chmod(path, mode); } if (ret == -1) { return -errno; } if(owner) { uid_t uid = decode_uid(owner); gid_t gid = -1; if(group) gid = decode_uid(group); if(chown(path, uid, gid) < 0) return -errno; } return 0; }
int do_mkdir(int nargs, char **args) { mode_t mode = 0755; /* mkdir <path> [mode] [owner] [group] */ if (nargs >= 3) { mode = strtoul(args[2], 0, 8); } if (mkdir(args[1], mode)) { return -errno; } if (nargs >= 4) { uid_t uid = decode_uid(args[3]); gid_t gid = -1; if (nargs == 5) { gid = decode_uid(args[4]); } if (chown(args[1], uid, gid)) { return -errno; } } return 0; }
int do_chown(int nargs, char **args) { /* GID is optional. */ if (nargs == 3) { if (_chown(args[2], decode_uid(args[1]), -1) < 0) return -errno; } else if (nargs == 4) { if (_chown(args[3], decode_uid(args[1]), decode_uid(args[2])) < 0) return -errno; } else if (nargs == 5) { int ret = 0; int ftsflags = FTS_PHYSICAL; FTS *fts; FTSENT *ftsent; char *options = args[1]; uid_t uid = decode_uid(args[2]); uid_t gid = decode_uid(args[3]); char * path_argv[] = {args[4], NULL}; if (strcmp(options, "-R")) { ERROR("do_chown: Invalid argument: %s\n", args[1]); return -EINVAL; } fts = fts_open(path_argv, ftsflags, NULL); if (!fts) { ERROR("do_chown: Error traversing hierarchy starting at %s\n", path_argv[0]); return -errno; } while ((ftsent = fts_read(fts))) { switch (ftsent->fts_info) { case FTS_DP: case FTS_SL: break; case FTS_DNR: case FTS_ERR: case FTS_NS: ERROR("do_chown: Could not access %s\n", ftsent->fts_path); fts_set(fts, ftsent, FTS_SKIP); ret = -errno; break; default: if (_chown(ftsent->fts_accpath, uid, gid) < 0) { ret = -errno; fts_set(fts, ftsent, FTS_SKIP); } break; } } fts_close(fts); if (ret) return ret; } else { return -1; } return 0; }
int do_chown(int nargs, char **args) { /* GID is optional. */ if (nargs == 3) { if (chown(args[2], decode_uid(args[1]), -1) < 0) return -errno; } else if (nargs == 4) { if (chown(args[3], decode_uid(args[1]), decode_uid(args[2]))) return -errno; } else { return -1; } return 0; }
static int do_chown(const std::vector<std::string>& args) { /* GID is optional. */ if (args.size() == 3) { if (lchown(args[2].c_str(), decode_uid(args[1].c_str()), -1) == -1) return -errno; } else if (args.size() == 4) { if (lchown(args[3].c_str(), decode_uid(args[1].c_str()), decode_uid(args[2].c_str())) == -1) return -errno; } else { return -1; } return 0; }
int do_mkdir(int nargs, char **args) { mode_t mode = 0755; int ret; /* mkdir <path> [mode] [owner] [group] */ if (nargs >= 3) { mode = strtoul(args[2], 0, 8); } ret = make_dir(args[1], mode); /* chmod in case the directory already exists */ if (ret == -1 && errno == EEXIST) { ret = _chmod(args[1], mode); } if (ret == -1) { return -errno; } if (nargs >= 4) { uid_t uid = decode_uid(args[3]); gid_t gid = -1; if (nargs == 5) { gid = decode_uid(args[4]); } if (_chown(args[1], uid, gid) < 0) { return -errno; } /* chown may have cleared S_ISUID and S_ISGID, chmod again */ if (mode & (S_ISUID | S_ISGID)) { ret = _chmod(args[1], mode); if (ret == -1) { return -errno; } } } return 0; }
int do_mkdir(int nargs, char **args) { mode_t mode = 0755; int ret; /* mkdir <path> [mode] [owner] [group] */ if (nargs >= 3) { mode = strtoul(args[2], 0, 8); } ret = make_dir(args[1], mode); /* chmod in case the directory already exists */ if (ret == -1 && errno == EEXIST) { ret = fchmodat(AT_FDCWD, args[1], mode, AT_SYMLINK_NOFOLLOW); } if (ret == -1) { return -errno; } if (nargs >= 4) { uid_t uid = decode_uid(args[3]); gid_t gid = -1; if (nargs == 5) { gid = decode_uid(args[4]); } if (lchown(args[1], uid, gid) == -1) { return -errno; } /* chown may have cleared S_ISUID and S_ISGID, chmod again */ if (mode & (S_ISUID | S_ISGID)) { ret = fchmodat(AT_FDCWD, args[1], mode, AT_SYMLINK_NOFOLLOW); if (ret == -1) { return -errno; } } } return e4crypt_set_directory_policy(args[1]); }
int do_chown(const char *file, char *uid, char *gid) { unsigned int duid, dgid; int result = 0; if (file == NULL) return -ENOENT; if (strstr(file, SDCARD_CRASH_DIR)) return 0; duid = decode_uid(uid, &result); if ( result ) return result; dgid = decode_uid(gid, &result); if ( result ) return result; if ( chown(file, duid, dgid) ) return -errno; return 0; }
int do_chown(int nargs, char **args) { char tmp[64]; char *target; int n; switch (nargs){ case 3: target = args[2]; break; case 4: target = args[3]; break; default: ERROR("invalid args num: %d, It should be 3 or 4\n", nargs); return -1; } if (!strncmp(target, "mtd@", 4)) { n = mtd_name_to_number(target + 4); if (n < 0) { return -1; } sprintf(tmp, "/dev/mtd/mtd%d", n); target = tmp; } //ERROR("do_chown debug: target:%s\n",target); /* GID is optional. */ if (nargs == 3) { if (chown(target, decode_uid(args[1]), -1) < 0) return -errno; } else if (nargs == 4) { if (chown(target, decode_uid(args[1]), decode_uid(args[2]))) return -errno; } else { return -1; } return 0; }
TEST(util, decode_uid) { EXPECT_EQ(0U, decode_uid("root")); EXPECT_EQ(-1U, decode_uid("toot")); EXPECT_EQ(123U, decode_uid("123")); }
uint8_t bootmgr_show_rom_list(void) { bootmgr_set_time_thread(0); bootmgr_phase = BOOTMGR_SD_SEL; bootmgr_display->bg_img = 0; bootmgr_printf(-1, 20, WHITE, "Mounting sd-ext..."); bootmgr_draw(); if(!backups_loaded) { // mknod mknod(SD_EXT_BLOCK, (0666 | S_IFBLK), makedev(179, 2)); //mkdir mkdir("/sdroot", (mode_t)0775); uid_t uid = decode_uid("system"); gid_t gid = decode_uid("system"); chown("/sdroot", uid, gid); //mount static const char *mount_args[] = { NULL, "ext4", SD_EXT_BLOCK, "/sdroot" }; int res = do_mount(4, mount_args); if(res < 0) { bootmgr_printf(-1, 20, WHITE, "Failed to mount sd-ext!"); bootmgr_printf(-1, 21, WHITE, "Press back to return."); return 0; } DIR *dir = opendir("/sdroot/multirom/backup"); if(dir) { struct dirent * de = NULL; while ((de = readdir(dir)) != NULL) { if (de->d_name[0] == '.') continue; backups[total_backups] = (char*)malloc(128); strcpy(backups[total_backups++], de->d_name); if(total_backups >= BOOTMGR_BACKUPS_MAX-1) break; } closedir(dir); backups[total_backups] = NULL; } dir = opendir("/sdroot/multirom/rom"); if(dir) backups_has_active = 1; } backups_loaded = 1; bootmgr_printf(0, 0, (0x3F << 11), "Select ROM to boot. Press back to return"); if(backups_has_active) { bootmgr_printf(0, 2, WHITE, "Current active ROM"); bootmgr_select(2); } bootmgr_printf(0, 4, (0x3F << 11), "Backup folder:"); uint16_t i = 0; for(; i <= 25 && i < total_backups; ++i) bootmgr_printf(0, i + 5, WHITE, "%s", backups[i]); if(total_backups) { if(!backups_has_active) { bootmgr_printf(-1, 2, WHITE, "No active ROM"); bootmgr_select(5); } bootmgr_erase_text(20); } // Useless to print this, because it will be deleted immediately //else if(backups_has_active) // bootmgr_printf(-1, 19, WHITE, "No backups present."); else { bootmgr_printf(-1, 20, WHITE, "No active ROM nor backups present."); bootmgr_printf(-1, 21, WHITE, "Press \"back\" to return"); } while(bootmgr_get_last_key() != -1); // clear key queue while(bootmgr_get_last_touch(&i, &i)); // clear touch queue if(!total_backups && backups_has_active) return bootmgr_boot_sd(); bootmgr_draw(); return 0; }