sh: Check if dup2 for redirection from/to a file succeeds.

A failure (e.g. caused by ulimit -n being set very low) is a redirection
error.

Example:
  ulimit -n 9; exec 9<.
This commit is contained in:
Jilles Tjoelker 2010-12-31 18:20:17 +00:00
parent 55cb182a23
commit 09683f46b9
2 changed files with 13 additions and 1 deletions

View File

@ -155,6 +155,7 @@ openredirect(union node *redir, char memory[10])
int fd = redir->nfile.fd;
char *fname;
int f;
int e;
/*
* We suppress interrupts so that we won't leave open file
@ -173,7 +174,11 @@ openredirect(union node *redir, char memory[10])
error("cannot open %s: %s", fname, strerror(errno));
movefd:
if (f != fd) {
dup2(f, fd);
if (dup2(f, fd) == -1) {
e = errno;
close(f);
error("%d: %s", fd, strerror(e));
}
close(f);
}
break;

View File

@ -0,0 +1,7 @@
# $FreeBSD$
! dummy=$(
exec 3>&1 >&2 2>&3
ulimit -n 9
exec 9<.
) && [ -n "$dummy" ]