#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <fcntl.h>
#include <sys/wait.h>
/* */
int main(int argc, char *argv[]) {
pid_t mpid = getpid();
pid_t *pids = calloc(argc - 1, sizeof(pid_t));
char *ofname = NULL;
for(int i = 1; i < argc; i++) {
if((pids[i - 1] = fork()) == 0) {
asprintf(&ofname, "/tmp/%d.%d", mpid, i - 1);
close(0);
if(open(argv[i], O_RDONLY) == 0) {
close(1);
if(open(ofname, O_CREAT | O_TRUNC | O_WRONLY, 0666) == 1) {
execlp("gzip", "gzip", NULL);
perror("exec");
} else {
perror(ofname);
}
} else {
perror(argv[i]);
}
exit(1);
} else if(pids[i - 1] < 0) {
perror("fork");
}
}
for(int i = 1; i < argc; i++) {
int stat;
pid_t cpid = wait(&stat);
for(int p = 1; p < argc; p++) {
if(pids[p - 1] == cpid) {
if(stat) {
fprintf(stderr, "Error compressing '%s'\n", argv[p]);
} else {
printf("Compressed '%s'\n", argv[p]);
}
break;
}
}
}
}