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

int main(int argc, char *argv[]) {
  if (argc < 2) {
    printf("non abbastanza argomenti\n");
    exit(1);
  }

  pid_t pid;
  int wstatus;
  int ret_val = 1;
  char *argo[argc];
  argo[argc - 1] = NULL;
  for (int i = 0; i < argc - 1; i++) {

    argo[i] = malloc(sizeof(char) * strlen(argv[i + 1]));
    strcpy(argo[i], argv[i + 1]);
  }

  do {
    switch (pid = fork()) {
    case -1:
      exit(1);
      break;
    case 0:
      printf("Esecuzione comando da processo figlio con pid:%d \n", getpid());
      execvp(argo[0], argo);
      break;
    default:
      if (waitpid(pid, &wstatus, 0) == -1)
        exit(1);
      ret_val = WEXITSTATUS(wstatus);
      break;
    }
  } while (ret_val == 0 && !(WIFSIGNALED(wstatus)));

  printf("Figlio ucciso o terminato con errore, addio\n");
  for (int i = 0; i < argc - 1; i++) {
    free(argo[i]);
  }

  return 0;
}