summaryrefslogtreecommitdiffstats
path: root/bin
diff options
context:
space:
mode:
authordes <des@FreeBSD.org>2004-01-21 12:50:01 +0000
committerdes <des@FreeBSD.org>2004-01-21 12:50:01 +0000
commit5bed8122fd9ad3746f9f6139eac42ce5041f08f4 (patch)
tree45b894f449c0d20308caae0992208804c1312206 /bin
parentc939cff38891929d64b9b5a0d14e2cd42623a789 (diff)
downloadFreeBSD-src-5bed8122fd9ad3746f9f6139eac42ce5041f08f4.zip
FreeBSD-src-5bed8122fd9ad3746f9f6139eac42ce5041f08f4.tar.gz
Replace home-grown dup2() implementation with actual dup2() calls. This
should slightly reduce the number of system calls in critical portions of the shell, and select a more efficient path through the fdalloc code. Reviewed by: bde
Diffstat (limited to 'bin')
-rw-r--r--bin/sh/eval.c12
-rw-r--r--bin/sh/input.c2
-rw-r--r--bin/sh/parser.c1
-rw-r--r--bin/sh/redir.c40
-rw-r--r--bin/sh/redir.h1
5 files changed, 13 insertions, 43 deletions
diff --git a/bin/sh/eval.c b/bin/sh/eval.c
index bf96c2f..38282d4 100644
--- a/bin/sh/eval.c
+++ b/bin/sh/eval.c
@@ -479,16 +479,14 @@ evalpipe(union node *n)
if (forkshell(jp, lp->n, n->npipe.backgnd) == 0) {
INTON;
if (prevfd > 0) {
- close(0);
- copyfd(prevfd, 0);
+ dup2(prevfd, 0);
close(prevfd);
}
if (pip[1] >= 0) {
if (!(prevfd >= 0 && pip[0] == 0))
close(pip[0]);
if (pip[1] != 1) {
- close(1);
- copyfd(pip[1], 1);
+ dup2(pip[1], 1);
close(pip[1]);
}
}
@@ -545,8 +543,7 @@ evalbackcmd(union node *n, struct backcmd *result)
FORCEINTON;
close(pip[0]);
if (pip[1] != 1) {
- close(1);
- copyfd(pip[1], 1);
+ dup2(pip[1], 1);
close(pip[1]);
}
evaltree(n, EV_EXIT);
@@ -742,8 +739,7 @@ evalcommand(union node *cmd, int flags, struct backcmd *backcmd)
FORCEINTON;
close(pip[0]);
if (pip[1] != 1) {
- close(1);
- copyfd(pip[1], 1);
+ dup2(pip[1], 1);
close(pip[1]);
}
}
diff --git a/bin/sh/input.c b/bin/sh/input.c
index 85b94d6..9948881 100644
--- a/bin/sh/input.c
+++ b/bin/sh/input.c
@@ -388,7 +388,7 @@ setinputfile(char *fname, int push)
if ((fd = open(fname, O_RDONLY)) < 0)
error("Can't open %s: %s", fname, strerror(errno));
if (fd < 10) {
- fd2 = copyfd(fd, 10);
+ fd2 = fcntl(fd, F_DUPFD, 10);
close(fd);
if (fd2 < 0)
error("Out of file descriptors");
diff --git a/bin/sh/parser.c b/bin/sh/parser.c
index da166e6..70ac6ba 100644
--- a/bin/sh/parser.c
+++ b/bin/sh/parser.c
@@ -48,7 +48,6 @@ __FBSDID("$FreeBSD$");
#include "parser.h"
#include "nodes.h"
#include "expand.h" /* defines rmescapes() */
-#include "redir.h" /* defines copyfd() */
#include "syntax.h"
#include "options.h"
#include "input.h"
diff --git a/bin/sh/redir.c b/bin/sh/redir.c
index 547cdcc..6c4f0b8 100644
--- a/bin/sh/redir.c
+++ b/bin/sh/redir.c
@@ -182,8 +182,7 @@ openredirect(union node *redir, char memory[10])
error("cannot open %s: %s", fname, strerror(errno));
movefd:
if (f != fd) {
- close(fd);
- copyfd(f, fd);
+ dup2(f, fd);
close(f);
}
break;
@@ -215,12 +214,11 @@ movefd:
if (redir->ndup.dupfd >= 0) { /* if not ">&-" */
if (memory[redir->ndup.dupfd])
memory[fd] = 1;
- else {
- close(fd);
- copyfd(redir->ndup.dupfd, fd);
- }
- } else
+ else
+ dup2(redir->ndup.dupfd, fd);
+ } else {
close(fd);
+ }
break;
case NHERE:
case NXHERE:
@@ -288,10 +286,11 @@ popredir(void)
if (rp->renamed[i] != EMPTY) {
if (i == 0)
fd0_redirected--;
- close(i);
if (rp->renamed[i] >= 0) {
- copyfd(rp->renamed[i], i);
+ dup2(rp->renamed[i], i);
close(rp->renamed[i]);
+ } else {
+ close(i);
}
}
}
@@ -346,26 +345,3 @@ clearredir(void)
}
}
}
-
-
-
-/*
- * Copy a file descriptor to be >= to. Returns -1
- * if the source file descriptor is closed, EMPTY if there are no unused
- * file descriptors left.
- */
-
-int
-copyfd(int from, int to)
-{
- int newfd;
-
- newfd = fcntl(from, F_DUPFD, to);
- if (newfd < 0) {
- if (errno == EMFILE)
- return EMPTY;
- else
- error("%d: %s", from, strerror(errno));
- }
- return newfd;
-}
diff --git a/bin/sh/redir.h b/bin/sh/redir.h
index e786004..d063ecf 100644
--- a/bin/sh/redir.h
+++ b/bin/sh/redir.h
@@ -46,5 +46,4 @@ void redirect(union node *, int);
void popredir(void);
int fd0_redirected_p(void);
void clearredir(void);
-int copyfd(int, int);
OpenPOWER on IntegriCloud