int make_fs(const char *part_device, const char *fstype, unsigned int fsblocksize, unsigned int flags, const char *fslabel) { int i; char fsblock_size[14]; char *argv[12]; char ext_opts[1024]; uint64_t max_online_resize; const int lazy = !(flags & PLOOP_CREATE_NOLAZY); fsblocksize = fsblocksize != 0 ? fsblocksize : 4096; i = 0; argv[i++] = "mkfs"; argv[i++] = "-t"; argv[i++] = (char*)fstype; argv[i++] = "-j"; if (fslabel != NULL) { argv[i++] = "-L"; argv[i++] = (char*)fslabel; } snprintf(fsblock_size, sizeof(fsblock_size), "-b%u", fsblocksize); argv[i++] = fsblock_size; /* Reserve enough space so that the block group descriptor table can grow to 16T */ max_online_resize = PLOOP_MAX_FS_SIZE / fsblocksize; snprintf(ext_opts, sizeof(ext_opts), "-Elazy_itable_init=%d,resize=%" PRIu64, lazy, max_online_resize); argv[i++] = ext_opts; /* Set the journal size to 128M to allow online resize up to 16T * independly on the initial image size */ argv[i++] = "-Jsize=128"; argv[i++] = (char *)part_device; argv[i++] = NULL; if (run_prg(argv)) return SYSEXIT_MKFS; i = 0; argv[i++] = get_prog(tune2fs_progs); argv[i++] = "-ouser_xattr,acl"; argv[i++] = "-c0"; argv[i++] = "-i0"; argv[i++] = "-eremount-ro"; argv[i++] = (char *)part_device; argv[i++] = NULL; if (run_prg(argv)) return SYSEXIT_MKFS; return 0; }
int make_fs(const char *device, const char *fstype, unsigned int fsblocksize) { char part_device[64]; char fsblock_size[14]; char *argv[10]; char ext_opts[1024]; __u64 max_online_resize; fsblocksize = fsblocksize != 0 ? fsblocksize : 4096; if (get_partition_device_name(device, part_device, sizeof(part_device))) return SYSEXIT_MKFS; argv[0] = "mkfs"; argv[1] = "-t"; argv[2] = (char*)fstype; argv[3] = "-j"; snprintf(fsblock_size, sizeof(fsblock_size), "-b%u", fsblocksize); argv[4] = fsblock_size; /* Reserve enough space so that the block group descriptor table can grow to 16T * Note: the max_online_resize is __u32 in mkfs.ext4 */ max_online_resize = PLOOP_MAX_FS_SIZE / fsblocksize; if (max_online_resize > (__u32)~0) max_online_resize = (__u32)~0; snprintf(ext_opts, sizeof(ext_opts), "-Elazy_itable_init,resize=%llu", max_online_resize); argv[5] = ext_opts; /* Set the journal size to 128M to allow online resize up to 16T * independly on the initial image size */ argv[6] = "-Jsize=128"; argv[7] = "-i16384"; /* 1 inode per 16K disk space */ argv[8] = part_device; argv[9] = NULL; if (run_prg(argv)) return SYSEXIT_MKFS; argv[0] = get_prog(tune2fs_progs); argv[1] = "-ouser_xattr,acl"; argv[2] = "-c0"; argv[3] = "-i0"; argv[4] = "-eremount-ro"; argv[5] = part_device; argv[6] = NULL; if (run_prg(argv)) return SYSEXIT_MKFS; return 0; }
static int clone_btrfs_subvol(struct mosaic *m, struct volume *from, const char *name, int clone_flags) { char *argv[8]; char vol[PATH_MAX], pvol[PATH_MAX]; int i; /* * FIXME: locate subvolumes in subdirectories */ // Make sure upper directories exist snprintf(vol, sizeof(vol), "%s/%s", m->m_loc, name); if (mkdir_p(vol, 0, 0700) < 0) { // error is printed by mkdir_p() return -1; } i = 0; argv[i++] = "btrfs"; argv[i++] = "subvolume"; argv[i++] = "snapshot"; snprintf(pvol, sizeof(pvol), "%s/%s", m->m_loc, from->t_name); argv[i++] = pvol; snprintf(vol, sizeof(vol), "%s/%s", m->m_loc, name); argv[i++] = vol; argv[i++] = NULL; if (run_prg(argv)) return -1; return 0; }
static int new_btrfs_subvol(struct mosaic *m, const char *name, unsigned long size_in_blocks, int make_flags) { char *argv[8]; char vol[PATH_MAX]; int i; if (!(make_flags & NEW_VOL_WITH_FS)) return -1; /* * FIXME: locate this volume's subvolumes in subdirectories * FIXME: qgroups */ // Make sure upper directories exist snprintf(vol, sizeof(vol), "%s/%s", m->m_loc, name); if (mkdir_p(vol, 0, 0700) < 0) { // error is printed by mkdir_p() return -1; } i = 0; argv[i++] = "btrfs"; argv[i++] = "subvolume"; argv[i++] = "create"; snprintf(vol, sizeof(vol), "%s/%s", m->m_loc, name); argv[i++] = vol; argv[i++] = NULL; if (run_prg(argv)) return -1; return 0; }
static int drop_btrfs_subvol(struct mosaic *m, struct volume *t, int drop_flags) { char *argv[8]; char vol[PATH_MAX]; const char *base = m->m_loc; int i, ret, dfd; /* * FIXME: locate subvolumes in subdirectories */ i = 0; argv[i++] = "btrfs"; argv[i++] = "subvolume"; argv[i++] = "delete"; snprintf(vol, sizeof(vol), "%s/%s", base, t->t_name); argv[i++] = vol; argv[i++] = NULL; if (run_prg(argv)) return -1; // Remove all the non-empty parent directories up to base dfd = open(base, O_DIRECTORY); if (dfd < 0) { loge("%s: can't open %s: %m\n", __func__, base); return -1; } ret = rmdirat_r(dfd, base, t->t_name); close(dfd); return ret; }
int create_gpt_partition(const char *device, off_t size, __u32 blocksize) { unsigned long long start = blocksize; unsigned long long end = (size - blocksize) / blocksize * blocksize; char *argv[7]; char s1[22], s2[22]; if (size <= start + blocksize) { ploop_err(0, "Image size should be greater than %llu", start); return -1; } argv[0] = "parted"; argv[1] = "-s"; argv[2] = (char *)device; argv[3] = "mklabel gpt mkpart primary"; snprintf(s1, sizeof(s1), "%llub", start << PLOOP1_SECTOR_LOG); argv[4] = s1; snprintf(s2, sizeof(s2), "%llub", (end << PLOOP1_SECTOR_LOG)-1); argv[5] = s2; argv[6] = NULL; if (run_prg(argv)) { ploop_err(0, "Failed to create partition"); return -1; } return 0; }
int partprobe(const char *device) { char *argv[] = {"partprobe", (char *)device, NULL}; if (run_prg(argv)) { ploop_err(0, "Failed to run partprobe %s", device); return SYSEXIT_SYS; } return 0; }
int sgdisk_move_gpt_header(const char *device) { char *argv[4]; argv[0] = "sgdisk"; argv[1] = "-e"; argv[2] = (char *)device; argv[3] = NULL; if (run_prg(argv)) { ploop_err(0, "Failed to move GPT header to the end of the device"); return SYSEXIT_SYS; } return 0; }
int parted_mklabel_gpt(const char *device) { char *argv[5]; argv[0] = "parted"; argv[1] = "-s"; argv[2] = (char *)device; argv[3] = "mklabel gpt"; argv[4] = NULL; if (run_prg(argv)) { ploop_err(0, "Failed to create GPT table"); return SYSEXIT_SYS; } return 0; }
int sgdisk_rmpart(const char *device, int part_num) { char *argv[5]; char s1[4]; snprintf(s1, sizeof(s1), "%d", part_num); argv[0] = "sgdisk"; argv[1] = "-d"; argv[2] = s1; argv[3] = (char *)device; argv[4] = NULL; if (run_prg(argv)) { ploop_err(0, "Failed to delete partition %d", part_num); return SYSEXIT_SYS; } return 0; }
void tune_fs(int balloonfd, const char *device, unsigned long long size_sec) { unsigned long long reserved_blocks; struct statfs fs; char *argv[5]; char buf[21]; int ret; if (fstatfs(balloonfd, &fs) != 0) { ploop_err(errno, "tune_fs: can't statfs %s", device); return; } reserved_blocks = size_sec / 100 * 5 * SECTOR_SIZE / fs.f_bsize; if (reserved_blocks == 0) { ploop_err(0, "Can't set reserved blocks for size %llu", size_sec); return; } /* First try to use kernel API, if available */ ret = ioctl(balloonfd, EXT4_IOC_SET_RSV_BLOCKS, &reserved_blocks); if (!ret) return; if (errno != ENOTTY) { ploop_err(errno, "Can't set reserved blocks to %llu", reserved_blocks); return; } /* Fallback to manual modification via tune2fs */ argv[0] = get_prog(tune2fs_progs); argv[1] = "-r"; snprintf(buf, sizeof(buf), "%llu", reserved_blocks); argv[2] = buf; argv[3] = (char *)device; argv[4] = NULL; run_prg(argv); }
/* Create partition * device - path to a device * part_num - partition number * part_start - beginning of the partition in sectors * part_end - end of the partition in sectors */ int sgdisk_mkpart(const char *device, int part_num, unsigned long long part_start, unsigned long long part_end) { char *argv[5]; char s1[100]; snprintf(s1, sizeof(s1), "%d:%lluk:%lluk", part_num, part_start/2, part_end/2); argv[0] = "sgdisk"; argv[1] = "-n"; argv[2] = s1; argv[3] = (char *)device; argv[4] = NULL; if (run_prg(argv)) { ploop_err(0, "Failed to create partition %d", part_num); return SYSEXIT_SYS; } return 0; }
int main(int argc, char **argv) { static char buf[1024]; char **args = argv + 1; const char *sname = "fipstests.sh"; ARGS arg; int xargc; char **xargv; int lineno = 0, badarg = 0; int nerr = 0, quiet = 0, verbose = 0; int rv; FILE *in = NULL; #ifdef FIPS_ALGVS_MEMCHECK CRYPTO_malloc_debug_init(); OPENSSL_init(); CRYPTO_set_mem_debug_options(V_CRYPTO_MDEBUG_ALL); CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON); #endif #if defined(_TMS320C6400_PLUS) SysInit(); #endif #if (defined(__arm__) || defined(__aarch64__)) if (*args && !strcmp(*args, "-noaccel")) { extern unsigned int OPENSSL_armcap_P; OPENSSL_armcap_P=0; args++; argc--; } #endif if (*args && *args[0] != '-') { rv = run_prg(argc - 1, args); #ifdef FIPS_ALGVS_MEMCHECK CRYPTO_mem_leaks_fp(stderr); #endif return rv; } while (!badarg && *args && *args[0] == '-') { if (!strcmp(*args, "-script")) { if (args[1]) { args++; sname = *args; } else badarg = 1; } else if (!strcmp(*args, "-quiet")) quiet = 1; else if (!strcmp(*args, "-verbose")) verbose = 1; else badarg = 1; args++; } if (badarg) { fprintf(stderr, "Error processing arguments\n"); return 1; } in = fopen(sname, "r"); if (!in) { fprintf(stderr, "Error opening script file \"%s\"\n", sname); return 1; } arg.data = NULL; arg.count = 0; while (fgets(buf, sizeof(buf), in)) { lineno++; if (!chopup_args(&arg, buf, &xargc, &xargv)) fprintf(stderr, "Error processing line %d\n", lineno); else { if (!quiet) { int i; int narg = verbose ? xargc : xargc - 2; printf("Running command line:"); for (i = 0; i < narg; i++) printf(" %s", xargv[i]); printf("\n"); } rv = run_prg(xargc, xargv); if (FIPS_module_mode()) FIPS_module_mode_set(0, NULL); if (rv != 0) nerr++; if (rv == -100) fprintf(stderr, "ERROR: Command not found\n"); else if (rv != 0) fprintf(stderr, "ERROR: returned %d\n", rv); else if (verbose) printf("\tCommand run successfully\n"); } } if (!quiet) printf("Completed with %d errors\n", nerr); if (arg.data) OPENSSL_free(arg.data); fclose(in); #ifdef FIPS_ALGVS_MEMCHECK CRYPTO_mem_leaks_fp(stderr); #endif if (nerr == 0) return 0; return 1; }