• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <stdio.h>
2 #include <errno.h>
3 #include <stdarg.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <fcntl.h>
7 #include <sys/param.h>
8 #include <sys/wait.h>
9 #include <dirent.h>
10 #include <sys/stat.h>
11 #include <unistd.h>
12 
13 #define TEMPLATE "ltpXXXXXX"
14 
15 int write_something(int);
16 void delete_files(void);
17 void abortx(char *fmt, ...);
18 
main(int argc,char * argv[])19 int main(int argc, char *argv[])
20 {
21 	int filedes[25500];
22 	int i, n, first, n_files;
23 	int cid, fork_number;
24 	int status;
25 	char filename[PATH_MAX];
26 
27 	if (argc != 2) {
28 		fprintf(stderr, "Usage: %s <number of files>\n", argv[0]);
29 		exit(1);
30 	}
31 
32 	n = sscanf(argv[1], "%d", &n_files);
33 	if (n != 1) {
34 		fprintf(stderr, "Usage: %s <number of files>\n", argv[0]);
35 		exit(1);
36 	}
37 
38 	first = 0;
39 	fork_number = 0;
40 	for (n = 0; n < n_files; n++) {
41 		strcpy(filename, TEMPLATE);
42 		filedes[n] = mkstemp(filename);
43 		if (filedes[n] == -1) {
44 			if (errno != EMFILE)
45 				abortx
46 				    ("open() error: file = \"%s\", errno = %d",
47 				     filename, errno);
48 			else {
49 				if ((cid = fork())) {
50 					if (cid == -1)
51 						abortx("Error forking child");
52 					else {
53 						waitpid(cid, &status, 0);
54 						for (i = first; i < n; i++)
55 							if (!write_something
56 							    (filedes[i]))
57 								abortx
58 								    ("Error writing to files");
59 						if (fork_number == 0)
60 							delete_files();
61 						exit(WEXITSTATUS(status));
62 					}
63 				} else {
64 					fork_number++;
65 					for (i = first; i < n; i++)
66 						close(filedes[i]);
67 					first = n;
68 					n--;
69 				}
70 			}
71 		}
72 	}
73 
74 	for (i = first; i < n; i++)
75 		if (!write_something(filedes[i]))
76 			abortx("Error writing to files");
77 	if (fork_number == 0)
78 		delete_files();
79 	exit(0);
80 }
81 
write_something(int fd)82 int write_something(int fd)
83 {
84 	int rc;
85 	const char msg[] = "I Love Linux!!!\n";
86 	int msg_len = strlen(msg);
87 
88 	rc = write(fd, msg, msg_len);
89 	if (rc != msg_len)
90 		return (0);
91 	if (close(fd))
92 		return (0);
93 	return (1);
94 }
95 
delete_files(void)96 void delete_files(void)
97 {
98 	DIR *dirp;
99 	struct dirent *entp;
100 	struct stat stat_buffer;
101 
102 	dirp = opendir(".");
103 	for (entp = readdir(dirp); entp; entp = readdir(dirp))
104 		if (!strncmp(entp->d_name, "apt", 3)) {
105 			if (stat(entp->d_name, &stat_buffer))
106 				abortx("stat() failed for \"%s\", errno = %d",
107 				       entp->d_name, errno);
108 			if (stat_buffer.st_size != 23)
109 				abortx("wrong file size for \"%s\"",
110 				       entp->d_name);
111 			if (unlink(entp->d_name))
112 				abortx("unlink failed for \"%s\"",
113 				       entp->d_name);
114 		}
115 }
116 
abortx(char * fmt,...)117 void abortx(char *fmt, ...)
118 {
119 	va_list args;
120 
121 	va_start(args, fmt);
122 	vfprintf(stderr, fmt, args);
123 	va_end(args);
124 	fprintf(stderr, "\n");
125 	exit(1);
126 }
127