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