+void exec_command(int nb, struct file_node **nodes) {
+ char **args;
+ int max_group_size = 0, group_size, m, n, status;
+ pid_t pid;
+
+ for(n = 0; n < nb; n++) {
+ if(n == 0 || nodes[n]->group_id != nodes[n-1]->group_id) {
+ group_size = 0;
+ }
+ group_size++;
+ if(group_size > max_group_size) {
+ max_group_size = group_size;
+ }
+ }
+
+ args = safe_malloc((max_group_size + 2) * sizeof(char *));
+ args[0] = command_to_exec;
+
+ n = 0;
+ while(n < nb) {
+ m = n;
+ while(n < nb && nodes[n]->group_id == nodes[m]->group_id) {
+ args[n - m + 1] = nodes[n]->name;
+ n++;
+ }
+ args[n - m + 1] = 0;
+ pid = fork();
+ if(pid < 0) {
+ } else if(pid == 0) {
+ if(execvp(command_to_exec, args) < 0) {
+ perror("execvp");
+ exit(EXIT_FAILURE);
+ }
+ } else {
+ while(wait(&status) != pid);
+ if(status > 0) {
+ exit(EXIT_FAILURE);
+ }
+ }
+ }
+
+ free(args);
+}