1865695bbc89088b9526ea9045410e5afb70a985cplars#include <stdio.h>
2865695bbc89088b9526ea9045410e5afb70a985cplars#include <errno.h>
31b59f909338d26b1d7f3eed20de5111288de0da1robbiew#include <stdarg.h>
4865695bbc89088b9526ea9045410e5afb70a985cplars#include <stdlib.h>
51b59f909338d26b1d7f3eed20de5111288de0da1robbiew#include <string.h>
6865695bbc89088b9526ea9045410e5afb70a985cplars#include <fcntl.h>
7865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/param.h>
8865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/wait.h>
9865695bbc89088b9526ea9045410e5afb70a985cplars#include <dirent.h>
10865695bbc89088b9526ea9045410e5afb70a985cplars#include <sys/stat.h>
111b59f909338d26b1d7f3eed20de5111288de0da1robbiew#include <unistd.h>
12865695bbc89088b9526ea9045410e5afb70a985cplars
130989fe65f306df05c9af6a940d8a568142e841b2robbiew#define TEMPLATE "ltpXXXXXX"
14865695bbc89088b9526ea9045410e5afb70a985cplars
151b59f909338d26b1d7f3eed20de5111288de0da1robbiewint write_something(int);
161b59f909338d26b1d7f3eed20de5111288de0da1robbiewvoid delete_files(void);
171b59f909338d26b1d7f3eed20de5111288de0da1robbiewvoid abortx(char *fmt, ...);
181b59f909338d26b1d7f3eed20de5111288de0da1robbiew
1994c85d93e8bd5ffa0c19d3ab0c3f39d21c46ef9aJan Stancekint main(int argc, char *argv[])
20865695bbc89088b9526ea9045410e5afb70a985cplars{
21354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int filedes[25500];
22354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int i, n, first, n_files;
23354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int cid, fork_number;
24354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int status;
25354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	char filename[PATH_MAX];
26865695bbc89088b9526ea9045410e5afb70a985cplars
27354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (argc != 2) {
28354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		fprintf(stderr, "Usage: %s <number of files>\n", argv[0]);
29354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		exit(1);
30354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
31865695bbc89088b9526ea9045410e5afb70a985cplars
32354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	n = sscanf(argv[1], "%d", &n_files);
33354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (n != 1) {
34354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		fprintf(stderr, "Usage: %s <number of files>\n", argv[0]);
35354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		exit(1);
36354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	}
37865695bbc89088b9526ea9045410e5afb70a985cplars
38354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	first = 0;
39354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	fork_number = 0;
40354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	for (n = 0; n < n_files; n++) {
41354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		strcpy(filename, TEMPLATE);
42354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		filedes[n] = mkstemp(filename);
43354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (filedes[n] == -1) {
44354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (errno != EMFILE)
45354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				abortx
46354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				    ("open() error: file = \"%s\", errno = %d",
47354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				     filename, errno);
48354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			else {
49354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				if ((cid = fork())) {
50354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					if (cid == -1)
51354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						abortx("Error forking child");
52354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					else {
53354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						waitpid(cid, &status, 0);
54354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						for (i = first; i < n; i++)
55354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							if (!write_something
56354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							    (filedes[i]))
57354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao								abortx
58354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao								    ("Error writing to files");
59354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						if (fork_number == 0)
60354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao							delete_files();
61354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						exit(WEXITSTATUS(status));
62354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					}
63354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				} else {
64354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					fork_number++;
65354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					for (i = first; i < n; i++)
66354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao						close(filedes[i]);
67354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					first = n;
68354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao					n--;
69354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				}
70354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			}
71865695bbc89088b9526ea9045410e5afb70a985cplars		}
72865695bbc89088b9526ea9045410e5afb70a985cplars	}
73865695bbc89088b9526ea9045410e5afb70a985cplars
74354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	for (i = first; i < n; i++)
75354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (!write_something(filedes[i]))
76354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			abortx("Error writing to files");
77354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (fork_number == 0)
78354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		delete_files();
79354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	exit(0);
80865695bbc89088b9526ea9045410e5afb70a985cplars}
81865695bbc89088b9526ea9045410e5afb70a985cplars
821b59f909338d26b1d7f3eed20de5111288de0da1robbiewint write_something(int fd)
83865695bbc89088b9526ea9045410e5afb70a985cplars{
84354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	int rc;
8594c85d93e8bd5ffa0c19d3ab0c3f39d21c46ef9aJan Stancek	const char msg[] = "I Love Linux!!!\n";
8694c85d93e8bd5ffa0c19d3ab0c3f39d21c46ef9aJan Stancek	int msg_len = strlen(msg);
87865695bbc89088b9526ea9045410e5afb70a985cplars
8894c85d93e8bd5ffa0c19d3ab0c3f39d21c46ef9aJan Stancek	rc = write(fd, msg, msg_len);
8994c85d93e8bd5ffa0c19d3ab0c3f39d21c46ef9aJan Stancek	if (rc != msg_len)
90354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return (0);
91354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	if (close(fd))
92354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		return (0);
93354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	return (1);
94865695bbc89088b9526ea9045410e5afb70a985cplars}
95865695bbc89088b9526ea9045410e5afb70a985cplars
961b59f909338d26b1d7f3eed20de5111288de0da1robbiewvoid delete_files(void)
97865695bbc89088b9526ea9045410e5afb70a985cplars{
98354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	DIR *dirp;
99354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	struct dirent *entp;
100354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	struct stat stat_buffer;
101865695bbc89088b9526ea9045410e5afb70a985cplars
102354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	dirp = opendir(".");
103354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	for (entp = readdir(dirp); entp; entp = readdir(dirp))
104354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		if (!strncmp(entp->d_name, "apt", 3)) {
105354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (stat(entp->d_name, &stat_buffer))
106354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				abortx("stat() failed for \"%s\", errno = %d",
107354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				       entp->d_name, errno);
108354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (stat_buffer.st_size != 23)
109354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				abortx("wrong file size for \"%s\"",
110354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				       entp->d_name);
111354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao			if (unlink(entp->d_name))
112354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				abortx("unlink failed for \"%s\"",
113354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao				       entp->d_name);
114354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao		}
115865695bbc89088b9526ea9045410e5afb70a985cplars}
116865695bbc89088b9526ea9045410e5afb70a985cplars
1171b59f909338d26b1d7f3eed20de5111288de0da1robbiewvoid abortx(char *fmt, ...)
118865695bbc89088b9526ea9045410e5afb70a985cplars{
119354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	va_list args;
1202c28215423293e443469a07ae7011135d058b671Garrett Cooper
121354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	va_start(args, fmt);
122354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	vfprintf(stderr, fmt, args);
123354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	va_end(args);
124354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	fprintf(stderr, "\n");
125354ebb48db8e66a853a58379a4808d5dcd1ceac3Wanlong Gao	exit(1);
126ec6edca7aa42b6affd989ef91b5897f96795e40fChris Dearman}
127