#include #include #include #include #include #include #include int main(int argc, char *argv[]) { char *base_path = argv[1]; char name[4096]; int nr_mounts, i, sleep_ms = 0; if (argc < 3 || argc > 4) errx(1, "usage: %s base_path nr_mounts [sleep_ms]", argv[0]); nr_mounts = atoi(argv[2]); if (argc > 3) sleep_ms = atoi(argv[3]); fprintf(stderr, "Mounting...\n"); if (mount("none", base_path, "tmpfs", 0, NULL) == -1) err(1, "mount/tmpfs"); if (mount("none", base_path, NULL, MS_PRIVATE, NULL) == -1) err(1, "mount/MS_PRIVATE"); for (i = 0; i < nr_mounts; i++) { sprintf(name, "%s/%d", base_path, i); if (mkdir(name, 0755) == -1) err(1, "mkdir"); if (mount("none", name, "tmpfs", 0, NULL) == -1) err(1, "mount/tmpfs"); if (mount("none", name, NULL, MS_PRIVATE, NULL) == -1) err(1, "mount/MS_PRIVATE"); if (sleep_ms) usleep(sleep_ms * 1000); } fprintf(stderr, "Press ENTER\n"); getchar(); fprintf(stderr, "Unmounting...\n"); if (umount2(base_path, MNT_DETACH) == -1) err(1, "umount"); fprintf(stderr, "Done\n"); return 0; }