Author: jilles
Date: Sun May  5 10:51:40 2013
New Revision: 250267
URL: http://svnweb.freebsd.org/changeset/base/250267

Log:
  sh: Use O_CLOEXEC and F_DUPFD_CLOEXEC instead of separate fcntl() call.

Modified:
  head/bin/sh/input.c
  head/bin/sh/jobs.c
  head/bin/sh/main.c
  head/bin/sh/redir.c

Modified: head/bin/sh/input.c
==============================================================================
--- head/bin/sh/input.c Sun May  5 09:38:25 2013        (r250266)
+++ head/bin/sh/input.c Sun May  5 10:51:40 2013        (r250267)
@@ -397,10 +397,10 @@ setinputfile(const char *fname, int push
        int fd2;
 
        INTOFF;
-       if ((fd = open(fname, O_RDONLY)) < 0)
+       if ((fd = open(fname, O_RDONLY | O_CLOEXEC)) < 0)
                error("cannot open %s: %s", fname, strerror(errno));
        if (fd < 10) {
-               fd2 = fcntl(fd, F_DUPFD, 10);
+               fd2 = fcntl(fd, F_DUPFD_CLOEXEC, 10);
                close(fd);
                if (fd2 < 0)
                        error("Out of file descriptors");
@@ -412,14 +412,13 @@ setinputfile(const char *fname, int push
 
 
 /*
- * Like setinputfile, but takes an open file descriptor.  Call this with
- * interrupts off.
+ * Like setinputfile, but takes an open file descriptor (which should have
+ * its FD_CLOEXEC flag already set).  Call this with interrupts off.
  */
 
 void
 setinputfd(int fd, int push)
 {
-       (void)fcntl(fd, F_SETFD, FD_CLOEXEC);
        if (push) {
                pushfile();
                parsefile->buf = ckmalloc(BUFSIZ + 1);

Modified: head/bin/sh/jobs.c
==============================================================================
--- head/bin/sh/jobs.c  Sun May  5 09:38:25 2013        (r250266)
+++ head/bin/sh/jobs.c  Sun May  5 10:51:40 2013        (r250267)
@@ -127,11 +127,12 @@ setjobctl(int on)
        if (on) {
                if (ttyfd != -1)
                        close(ttyfd);
-               if ((ttyfd = open(_PATH_TTY, O_RDWR)) < 0) {
+               if ((ttyfd = open(_PATH_TTY, O_RDWR | O_CLOEXEC)) < 0) {
                        i = 0;
                        while (i <= 2 && !isatty(i))
                                i++;
-                       if (i > 2 || (ttyfd = fcntl(i, F_DUPFD, 10)) < 0)
+                       if (i > 2 ||
+                           (ttyfd = fcntl(i, F_DUPFD_CLOEXEC, 10)) < 0)
                                goto out;
                }
                if (ttyfd < 10) {
@@ -139,7 +140,7 @@ setjobctl(int on)
                         * Keep our TTY file descriptor out of the way of
                         * the user's redirections.
                         */
-                       if ((i = fcntl(ttyfd, F_DUPFD, 10)) < 0) {
+                       if ((i = fcntl(ttyfd, F_DUPFD_CLOEXEC, 10)) < 0) {
                                close(ttyfd);
                                ttyfd = -1;
                                goto out;
@@ -147,11 +148,6 @@ setjobctl(int on)
                        close(ttyfd);
                        ttyfd = i;
                }
-               if (fcntl(ttyfd, F_SETFD, FD_CLOEXEC) < 0) {
-                       close(ttyfd);
-                       ttyfd = -1;
-                       goto out;
-               }
                do { /* while we are in the background */
                        initialpgrp = tcgetpgrp(ttyfd);
                        if (initialpgrp < 0) {

Modified: head/bin/sh/main.c
==============================================================================
--- head/bin/sh/main.c  Sun May  5 09:38:25 2013        (r250266)
+++ head/bin/sh/main.c  Sun May  5 10:51:40 2013        (r250267)
@@ -248,7 +248,7 @@ read_profile(const char *name)
        if (expandedname == NULL)
                return;
        INTOFF;
-       if ((fd = open(expandedname, O_RDONLY)) >= 0)
+       if ((fd = open(expandedname, O_RDONLY | O_CLOEXEC)) >= 0)
                setinputfd(fd, 1);
        INTON;
        if (fd < 0)

Modified: head/bin/sh/redir.c
==============================================================================
--- head/bin/sh/redir.c Sun May  5 09:38:25 2013        (r250266)
+++ head/bin/sh/redir.c Sun May  5 10:51:40 2013        (r250267)
@@ -121,7 +121,7 @@ redirect(union node *redir, int flags)
 
                if ((flags & REDIR_PUSH) && sv->renamed[fd] == EMPTY) {
                        INTOFF;
-                       if ((i = fcntl(fd, F_DUPFD, 10)) == -1) {
+                       if ((i = fcntl(fd, F_DUPFD_CLOEXEC, 10)) == -1) {
                                switch (errno) {
                                case EBADF:
                                        i = CLOSED;
@@ -131,8 +131,7 @@ redirect(union node *redir, int flags)
                                        error("%d: %s", fd, strerror(errno));
                                        break;
                                }
-                       } else
-                               (void)fcntl(i, F_SETFD, FD_CLOEXEC);
+                       }
                        sv->renamed[fd] = i;
                        INTON;
                }
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to