diff options
author | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1999-03-24 08:52:35 +0000 |
---|---|---|
committer | matz <matz@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 1999-03-24 08:52:35 +0000 |
commit | 35247a52ef719584a59ae9c518523f0ee825c8e3 (patch) | |
tree | e14e2a884d3c40a86f93b8dcb4ec144f510fe35a /missing | |
parent | 1727010a3abf84fd06f0e44d44b1b8ef6cde588e (diff) |
990324
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_3@409 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'missing')
-rw-r--r-- | missing/dup2.c | 69 | ||||
-rw-r--r-- | missing/fnmatch.c | 2 |
2 files changed, 48 insertions, 23 deletions
diff --git a/missing/dup2.c b/missing/dup2.c index c541149d4b..e7cc46f4c1 100644 --- a/missing/dup2.c +++ b/missing/dup2.c @@ -1,36 +1,61 @@ -/* - * Copyright (c) 1991, Larry Wall +/* + * Public domain dup2() lookalike + * by Curtis Jackson @ AT&T Technologies, Burlington, NC + * electronic address: burl!rcj * - * You may distribute under the terms of either the GNU General Public - * License or the Artistic License, as specified in the README file. + * dup2 performs the following functions: + * + * Check to make sure that fd1 is a valid open file descriptor. + * Check to see if fd2 is already open; if so, close it. + * Duplicate fd1 onto fd2; checking to make sure fd2 is a valid fd. + * Return fd2 if all went well; return BADEXIT otherwise. */ -#include "defines.h" +#include "config.h" -#if defined(HAVE_FCNTL) && defined(F_DUPFD) +#if defined(HAVE_FCNTL) # include <fcntl.h> #endif +#if !defined(HAVE_FCNTL) || !defined(F_DUPFD) +# include <errno.h> +#endif + +#define BADEXIT -1 + int -dup2(oldfd,newfd) -int oldfd; -int newfd; +dup2(fd1, fd2) +int fd1, fd2; { #if defined(HAVE_FCNTL) && defined(F_DUPFD) - close(newfd); - return fcntl(oldfd, F_DUPFD, newfd); + if (fd1 != fd2) { +#ifdef F_GETFL + if (fcntl(fd1, F_GETFL) < 0) + return BADEXIT; + if (fcntl(fd2, F_GETFL) >= 0) + close(fd2); +#else + close(fd2); +#endif + if (fcntl(fd1, F_DUPFD, fd2) < 0) + return BADEXIT; + } + return fd2; #else - int fdtmp[256]; - int fdx = 0; - int fd; + extern int errno; + int i, fd, fds[256]; - if (oldfd == newfd) - return 0; - close(newfd); - while ((fd = dup(oldfd)) != newfd) /* good enough for low fd's */ - fdtmp[fdx++] = fd; - while (fdx > 0) - close(fdtmp[--fdx]); - return 0; + if (fd1 == fd2) return 0; + close(fd2); + for (i=0; i<256; i++) { + fd = fds[i] = dup(fd1); + if (fd == fd2) break; + } + while (i) { + close(fds[i--]); + } + if (fd == fd2) return 0; + errno = EMFILE; + return BADEXIT; #endif } diff --git a/missing/fnmatch.c b/missing/fnmatch.c index 09f474b0ec..4cf746118a 100644 --- a/missing/fnmatch.c +++ b/missing/fnmatch.c @@ -48,7 +48,7 @@ static char sccsid[] = "@(#)fnmatch.c 8.2 (Berkeley) 4/16/94"; #define EOS '\0' -static char *rangematch(const char *, int, int); +static char *rangematch(); int fnmatch(pattern, string, flags) |