+ int sig;
+ I32 i, child_fd, max = av_len(redir);
+
+ for (child_fd = 0; child_fd <= max; child_fd++) {
+ SV **parent = av_fetch(redir, child_fd, 0);
+ int parent_fd = SvIV(*parent);
+ if (parent_fd == child_fd)
+ continue;
+ if (dup2(parent_fd, child_fd) < 0)
+ exit_err(&cerrnum);
+ }
+ for (sig = 1; sig < NSIG; sig++)
+ signal(sig, SIG_DFL); /* ignore errors on signals */
+ if (*cd && chdir(cd) < 0)
+ exit_err(&cerrnum);
+
+ max = av_len(rlim);
+ for (i = 0; i < max; i += 3) {
+ struct rlimit rl;
+ SV **res = av_fetch(rlim, i, 0);
+ SV **soft = av_fetch(rlim, i + 1, 0);
+ SV **hard = av_fetch(rlim, i + 2, 0);
+
+ rl.rlim_cur = SvIV(*soft);
+ rl.rlim_max = SvIV(*hard);
+ if (setrlimit(SvIV(*res), &rl) < 0)
+ exit_err(&cerrnum);
+ }
+
+ /*
+ * don't bother unblocking, we don't want signals
+ * to the group taking out a subprocess
+ */