static int format_ext4(char *fs_blkdev, char *fs_mnt_point, bool crypt_footer) { uint64_t dev_sz; int fd, rc = 0; if ((fd = open(fs_blkdev, O_WRONLY)) < 0) { PERROR << "Cannot open block device"; return -1; } if ((ioctl(fd, BLKGETSIZE64, &dev_sz)) == -1) { PERROR << "Cannot get block device size"; close(fd); return -1; } struct selabel_handle *sehandle = selinux_android_file_context_handle(); if (!sehandle) { /* libselinux logs specific error */ LERROR << "Cannot initialize android file_contexts"; close(fd); return -1; } /* Format the partition using the calculated length */ reset_ext4fs_info(); info.len = (off64_t)dev_sz; if (crypt_footer) { info.len -= CRYPT_FOOTER_OFFSET; } /* Use make_ext4fs_internal to avoid wiping an already-wiped partition. */ rc = make_ext4fs_internal(fd, NULL, NULL, fs_mnt_point, 0, 0, 0, 0, 0, 0, sehandle, 0, 0, NULL, NULL, NULL); if (rc) { LERROR << "make_ext4fs returned " << rc; } close(fd); if (sehandle) { selabel_close(sehandle); } return rc; }
void selinux_init_all_handles(void) { sehandle = selinux_android_file_context_handle(); sehandle_prop = selinux_android_prop_context_handle(); }
int main(int argc, char **argv) { int opt; const char *filename = NULL; const char *directory = NULL; char *mountpoint = NULL; fs_config_func_t fs_config_func = NULL; int gzip = 0; int sparse = 0; int crc = 0; int wipe = 0; int fd; int exitcode; int verbose = 0; struct selabel_handle *sehnd = NULL; #ifndef USE_MINGW struct selinux_opt seopts[] = { { SELABEL_OPT_PATH, "" } }; #endif while ((opt = getopt(argc, argv, "l:j:b:g:i:I:L:a:S:fwzJsctv")) != -1) { switch (opt) { case 'l': info.len = parse_num(optarg); break; case 'j': info.journal_blocks = parse_num(optarg); break; case 'b': info.block_size = parse_num(optarg); break; case 'g': info.blocks_per_group = parse_num(optarg); break; case 'i': info.inodes = parse_num(optarg); break; case 'I': info.inode_size = parse_num(optarg); break; case 'L': info.label = optarg; break; case 'f': force = 1; break; case 'a': #ifdef ANDROID fs_config_func = fs_config; mountpoint = optarg; #else fprintf(stderr, "can't set android permissions - built without android support\n"); usage(argv[0]); exit(EXIT_FAILURE); #endif break; case 'w': wipe = 1; break; case 'z': gzip = 1; break; case 'J': info.no_journal = 1; break; case 'c': crc = 1; break; case 's': sparse = 1; break; case 't': fprintf(stderr, "Warning: -t (initialize inode tables) is deprecated\n"); break; case 'S': #ifndef USE_MINGW seopts[0].value = optarg; sehnd = selabel_open(SELABEL_CTX_FILE, seopts, 1); if (!sehnd) { perror(optarg); exit(EXIT_FAILURE); } #endif break; case 'v': verbose = 1; break; default: /* '?' */ usage(argv[0]); exit(EXIT_FAILURE); } } #if !defined(HOST) // Use only if -S option not requested if (!sehnd && mountpoint) { sehnd = selinux_android_file_context_handle(); if (!sehnd) { perror(optarg); exit(EXIT_FAILURE); } } #endif if (wipe && sparse) { fprintf(stderr, "Cannot specifiy both wipe and sparse\n"); usage(argv[0]); exit(EXIT_FAILURE); } if (wipe && gzip) { fprintf(stderr, "Cannot specifiy both wipe and gzip\n"); usage(argv[0]); exit(EXIT_FAILURE); } if (optind >= argc) { fprintf(stderr, "Expected filename after options\n"); usage(argv[0]); exit(EXIT_FAILURE); } filename = argv[optind++]; if (optind < argc) directory = argv[optind++]; if (optind < argc) { fprintf(stderr, "Unexpected argument: %s\n", argv[optind]); usage(argv[0]); exit(EXIT_FAILURE); } if (strcmp(filename, "-")) { fd = open(filename, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY, 0644); if (fd < 0) { perror("open"); return EXIT_FAILURE; } } else { fd = STDOUT_FILENO; } exitcode = make_ext4fs_internal(fd, directory, mountpoint, fs_config_func, gzip, sparse, crc, wipe, sehnd, verbose); close(fd); if (exitcode && strcmp(filename, "-")) unlink(filename); return exitcode; }
int restorecon_main(int argc, char **argv) { int ch, recurse = 0, ftsflags = FTS_PHYSICAL; int i = 0; progname = argv[0]; do { ch = getopt(argc, argv, "nrRv"); if (ch == EOF) break; switch (ch) { case 'n': nochange = 1; break; case 'r': case 'R': recurse = 1; break; case 'v': verbose = 1; break; default: usage(); } } while (1); argc -= optind; argv += optind; if (!argc) usage(); sehandle = selinux_android_file_context_handle(); if (!sehandle) { fprintf(stderr, "Could not load file_contexts: %s\n", strerror(errno)); return -1; } if (recurse) { FTS *fts; FTSENT *ftsent; fts = fts_open(argv, ftsflags, NULL); if (!fts) { fprintf(stderr, "Could not traverse filesystems (first was %s): %s\n", argv[0], strerror(errno)); return -1; } while ((ftsent = fts_read(fts))) { switch (ftsent->fts_info) { case FTS_DP: break; case FTS_DNR: case FTS_ERR: case FTS_NS: fprintf(stderr, "Could not access %s: %s\n", ftsent->fts_path, strerror(errno)); fts_set(fts, ftsent, FTS_SKIP); break; default: if (restore(ftsent->fts_path, ftsent->fts_statp) < 0) fts_set(fts, ftsent, FTS_SKIP); break; } } } else { int i, rc; struct stat sb; for (i = 0; i < argc; i++) { rc = lstat(argv[i], &sb); if (rc < 0) { fprintf(stderr, "Could not stat %s: %s\n", argv[i], strerror(errno)); continue; } restore(argv[i], &sb); } } return 0; }