1dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall/* 2dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall * Copyright (C) 2012 The Android Open Source Project 3dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall * 4dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall * Licensed under the Apache License, Version 2.0 (the "License"); 5dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall * you may not use this file except in compliance with the License. 6dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall * You may obtain a copy of the License at 7dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall * 8dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall * http://www.apache.org/licenses/LICENSE-2.0 9dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall * 10dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall * Unless required by applicable law or agreed to in writing, software 11dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall * distributed under the License is distributed on an "AS IS" BASIS, 12dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall * See the License for the specific language governing permissions and 14dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall * limitations under the License. 15dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall */ 16dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall 17dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall#include <sys/types.h> 18dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall#include <sys/stat.h> 19dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall#include <fcntl.h> 20dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall#include <stdio.h> 21dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall#include <stdlib.h> 22dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall#include <unistd.h> 23dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall#include <sys/time.h> 24dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall#include <sys/resource.h> 25dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall 26dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrallint main(int argc, char *argv[]) 27dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall{ 28dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall int i; 29dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall int nfiles; 30dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall int *fds; 31dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall char *dir; 32dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall struct stat statbuf; 33dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall char name[16]; 34dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall struct rlimit rlim; 35dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall 36dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall if (argc != 3) { 37dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall fprintf(stderr, "Usage: opentest <directory> <num_files>\n"); 38dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall exit(1); 39dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall } 40dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall 41dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall dir = argv[1]; 42dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall 43dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall nfiles = atoi(argv[2]); 44dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall if ((nfiles <= 0) || (nfiles > 65536)) { 45dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall fprintf(stderr, "num_files must be between 1 and 65536\n"); 46dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall exit(1); 47dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall } 48dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall 49dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall if (stat(dir, &statbuf)) { 50dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall fprintf(stderr, "Cannot stat %s\n", dir); 51dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall exit(1); 52dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall } 53dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall 54dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall if (! S_ISDIR(statbuf.st_mode)) { 55dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall fprintf(stderr, "%s is not a directory!\n", dir); 56dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall exit(1); 57dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall } 58dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall 59dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall if (access(dir, R_OK | W_OK)) { 60dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall fprintf(stderr, "No access to %s\n", dir); 61dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall exit(1); 62dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall } 63dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall 64dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall fds = malloc(nfiles * sizeof(int)); 65dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall if (fds == 0) { 66dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall fprintf(stderr, "Unable to malloc array of %d fds\n", nfiles); 67dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall exit(1); 68dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall } 69dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall 70dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall if (chdir(dir)) { 71dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall fprintf(stderr, "Cannot chdir to %s\n", dir); 72dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall exit(1); 73dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall } 74dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall 75dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall rlim.rlim_cur = nfiles + 10; 76dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall rlim.rlim_max = nfiles + 10; 77dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall if (setrlimit(RLIMIT_NOFILE, &rlim)) { 78dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall fprintf(stderr, "Unable to raise RLIMIT_NOFILE to %ld\n", rlim.rlim_cur); 79dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall exit(1); 80dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall } 81dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall 82dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall for (i = 0; i < nfiles; i++) { 83dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall snprintf(name, sizeof(name), "%d", i); 84dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall fds[i] = open(name, O_WRONLY | O_CREAT, 0666); 85dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall if (fds[i] < 0) { 86dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall fprintf(stderr, "Unable to open %d fd\n", i); 87dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall exit(1); 88dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall } 89dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall } 90dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall 91dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall /* Rely upon exit to cleanup! */ 92dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall exit(0); 93dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall} 94dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall 95dd03e47358368bbba26eed8d727d4703a1c8807aKen Sumrall 96