1865695bbc89088b9526ea9045410e5afb70a985cplars/* 245cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis * Copyright (c) International Business Machines Corp., 2001 345cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis * 07/2001 Ported by Wayne Boyer 4865695bbc89088b9526ea9045410e5afb70a985cplars * 545cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis * This program is free software; you can redistribute it and/or modify 645cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis * it under the terms of the GNU General Public License as published by 745cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis * the Free Software Foundation; either version 2 of the License, or 845cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis * (at your option) any later version. 9865695bbc89088b9526ea9045410e5afb70a985cplars * 1045cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis * This program is distributed in the hope that it will be useful, 1145cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis * but WITHOUT ANY WARRANTY; without even the implied warranty of 1245cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See 1345cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis * the GNU General Public License for more details. 14865695bbc89088b9526ea9045410e5afb70a985cplars * 1545cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis * You should have received a copy of the GNU General Public License 1645cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis * along with this program; if not, write to the Free Software Foundation, 1745cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 18865695bbc89088b9526ea9045410e5afb70a985cplars */ 19865695bbc89088b9526ea9045410e5afb70a985cplars 20865695bbc89088b9526ea9045410e5afb70a985cplars/* 2145cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis * Testcase to check that creat(2) system call returns EMFILE. 22865695bbc89088b9526ea9045410e5afb70a985cplars */ 23865695bbc89088b9526ea9045410e5afb70a985cplars 24865695bbc89088b9526ea9045410e5afb70a985cplars#include <stdio.h> 25db790f49b662fa96a29da1ea820c1057a50b0a63Jan Stancek#include <stdlib.h> 26865695bbc89088b9526ea9045410e5afb70a985cplars#include <errno.h> 2774948ad801d4aba1c872652580b8b331e41aefcaplars#include <sys/types.h> 28865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/time.h> 29865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/resource.h> 302c9452499e6aa5681ccb1cc52c6009c06a2c0702robbiew#include <sys/stat.h> 312c9452499e6aa5681ccb1cc52c6009c06a2c0702robbiew#include <fcntl.h> 32865695bbc89088b9526ea9045410e5afb70a985cplars#include <linux/limits.h> 33865695bbc89088b9526ea9045410e5afb70a985cplars#include <unistd.h> 3445cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis#include "tst_test.h" 35865695bbc89088b9526ea9045410e5afb70a985cplars 36db790f49b662fa96a29da1ea820c1057a50b0a63Jan Stancekstatic int *opened_fds, num_opened_fds; 37865695bbc89088b9526ea9045410e5afb70a985cplars 3845cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubisstatic void verify_creat(void) 39865695bbc89088b9526ea9045410e5afb70a985cplars{ 4045cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis TEST(creat("filename", 0666)); 41865695bbc89088b9526ea9045410e5afb70a985cplars 4245cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis if (TEST_RETURN != -1) { 4345cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis tst_res(TFAIL, "call succeeded unexpectedly"); 4445cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis SAFE_CLOSE(TEST_RETURN); 4545cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis return; 46865695bbc89088b9526ea9045410e5afb70a985cplars } 47865695bbc89088b9526ea9045410e5afb70a985cplars 4845cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis if (TEST_ERRNO == EMFILE) 4945cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis tst_res(TPASS, "creat() failed with EMFILE"); 5045cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis else 5145cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis tst_res(TFAIL | TTERRNO, "Expected EMFILE"); 5287bc45c477f1dc9114ec3bceab05693de8b07180Garrett Cooper} 53865695bbc89088b9526ea9045410e5afb70a985cplars 5445cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubisstatic void setup(void) 55865695bbc89088b9526ea9045410e5afb70a985cplars{ 562c9452499e6aa5681ccb1cc52c6009c06a2c0702robbiew int max_open; 5745cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis int fd; 5845cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis char fname[PATH_MAX]; 59865695bbc89088b9526ea9045410e5afb70a985cplars 60865695bbc89088b9526ea9045410e5afb70a985cplars /* get the maximum number of files that we can open */ 61865695bbc89088b9526ea9045410e5afb70a985cplars max_open = getdtablesize(); 6245cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis tst_res(TINFO, "getdtablesize() = %d", max_open); 63db790f49b662fa96a29da1ea820c1057a50b0a63Jan Stancek opened_fds = SAFE_MALLOC(max_open * sizeof(int)); 64865695bbc89088b9526ea9045410e5afb70a985cplars 65865695bbc89088b9526ea9045410e5afb70a985cplars /* now open as many files as we can up to max_open */ 66db790f49b662fa96a29da1ea820c1057a50b0a63Jan Stancek do { 67db790f49b662fa96a29da1ea820c1057a50b0a63Jan Stancek snprintf(fname, sizeof(fname), "creat05_%d", num_opened_fds); 68db790f49b662fa96a29da1ea820c1057a50b0a63Jan Stancek fd = SAFE_CREAT(fname, 0666); 69db790f49b662fa96a29da1ea820c1057a50b0a63Jan Stancek opened_fds[num_opened_fds++] = fd; 70db790f49b662fa96a29da1ea820c1057a50b0a63Jan Stancek } while (fd < max_open - 1); 71db790f49b662fa96a29da1ea820c1057a50b0a63Jan Stancek 72db790f49b662fa96a29da1ea820c1057a50b0a63Jan Stancek tst_res(TINFO, "Opened additional #%d fds", num_opened_fds); 73865695bbc89088b9526ea9045410e5afb70a985cplars} 74865695bbc89088b9526ea9045410e5afb70a985cplars 7545cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubisstatic void cleanup(void) 76865695bbc89088b9526ea9045410e5afb70a985cplars{ 77db790f49b662fa96a29da1ea820c1057a50b0a63Jan Stancek int i; 7845cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis 79db790f49b662fa96a29da1ea820c1057a50b0a63Jan Stancek for (i = 0; i < num_opened_fds; i++) { 80db790f49b662fa96a29da1ea820c1057a50b0a63Jan Stancek if (close(opened_fds[i])) { 81db790f49b662fa96a29da1ea820c1057a50b0a63Jan Stancek tst_res(TWARN | TERRNO, "close(%i) failed", 82db790f49b662fa96a29da1ea820c1057a50b0a63Jan Stancek opened_fds[i]); 83db790f49b662fa96a29da1ea820c1057a50b0a63Jan Stancek } 84865695bbc89088b9526ea9045410e5afb70a985cplars } 85db790f49b662fa96a29da1ea820c1057a50b0a63Jan Stancek 86db790f49b662fa96a29da1ea820c1057a50b0a63Jan Stancek free(opened_fds); 87865695bbc89088b9526ea9045410e5afb70a985cplars} 88865695bbc89088b9526ea9045410e5afb70a985cplars 8945cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubisstatic struct tst_test test = { 9045cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis .tid = "creat05", 9145cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis .test_all = verify_creat, 9245cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis .needs_tmpdir = 1, 9345cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis .setup = setup, 9445cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis .cleanup = cleanup, 9545cd1160f715219f00f0e1cff9820b36284ebc44Cyril Hrubis}; 96