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