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