#include "posix_spawn_pipe_test.h"#include <errno.h>#include <unistd.h>#include <spawn.h>#include <stdio.h>#include <string.h>#define panic(n, str) if (n != 0) { perror(str); return 1; }#define readIdx 0#define writeIdx 1int main() {int out[2], err[2];posix_spawn_file_actions_t fdops;pid_t pid;char* const argv[] = { "./posix_spawn_pipe_err", NULL };panic(pipe(out), "pipe stdout");panic(pipe(err), "pipe stderr");errno = posix_spawn_file_actions_init(&fdops);panic(errno, "init");errno = posix_spawn_file_actions_addclose(&fdops, out[readIdx]);panic(errno, "close stdout read");errno = posix_spawn_file_actions_adddup2(&fdops, out[writeIdx], 1);panic(errno, "dup2 stdout write");errno = posix_spawn_file_actions_addclose(&fdops, err[readIdx]);panic(errno, "close stderr read");errno = posix_spawn_file_actions_adddup2(&fdops, err[writeIdx], 2);panic(errno, "dup2 stderr write");errno = posix_spawn(&pid, "./posix_spawn_pipe_err", &fdops, NULL, argv, NULL);panic(errno, "spawn");FILE *cOut = fdopen(out[readIdx], "r");if (cOut == NULL) panic(-1, "cOut");FILE *cErr = fdopen(err[readIdx], "r");if (cErr == NULL) panic(-1, "cErr");char *buf = NULL;size_t bufsize = 0;getline(&buf, &bufsize, cOut);panic(ferror(cOut), "getline cOut");if (strcmp(buf, testOut) != 0) {printf("stdout got: %s", buf);printf("stdout exp: %s", testOut);}getline(&buf, &bufsize, cErr);panic(ferror(cErr), "getline cErr");if (strcmp(buf, testErr) != 0) {printf("stderr got: %s", buf);printf("stderr exp: %s", testErr);}return 0;}