/* 15May24: Dieses Programm führt ein Programm in vielen Prozessen
 * aus, jeweils gestartet mit nur einem Argument.  Bspw.:
 *
 * $ ./list-run echo one two three
 * one
 * two
 * three
 */

#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <sys/wait.h>

/* Diese Datei benutzt eine Funktion aus einem anderem Modul.  Wir
 * fügen hier den Header ein, damit der Compiler die Prototype der
 * Funktionen aus dem anderem Modul kennt. */
#include "exec1.h"

static void run(char *cmd, char *arg) {

     /* Wenn ein Prozess erfolgreich erstellt werden konnte... */
     pid_t pid = fork();
     if (pid == -1) {
          perror("fork");
          exit(EXIT_FAILURE);
     }

     /* ...dann prüfen wir ob wir im Kind-Prozess sind... */
     if (pid == 0) {
          /* Und wenn ja, versuchen wir den Programm im Prozess
           * auszuwechseln.  Dazu benutze ich die Funktion aus dem
           * anderem Modul was wir in der TÜ programmiert haben,
           * normalerweise würde man auf execvp(2)/execlp(2)
           * zurückgreifen. */
          exec1(cmd, arg);
          perror("waitpid");
          exit(EXIT_FAILURE);
     }

     /* Im Eltern-Prozess wollen wir nur darauf warten, bis der neu
      * erstelle Prozess sich beendet hat. */
     if (-1 == waitpid(pid, NULL, 0)) {
          perror("waitpid");
          exit(EXIT_FAILURE);
     }
}

int main(int argc, char *argv[])
{
     for (int i = 2; i < argc; i++) {
          run(argv[1], argv[i]);
     }

     return 0;
}