• bump NUFILE and FDBASE, allowing for more than 10 fds used by scripts
• change the code to accept more than a single digit for an fd
This commit is contained in:
parent
943446cadf
commit
ca7cd043db
25
check.t
25
check.t
|
@ -1,4 +1,4 @@
|
||||||
# $MirOS: src/bin/mksh/check.t,v 1.206 2008/07/09 20:31:19 tg Exp $
|
# $MirOS: src/bin/mksh/check.t,v 1.207 2008/07/09 21:32:42 tg Exp $
|
||||||
# $OpenBSD: bksl-nl.t,v 1.2 2001/01/28 23:04:56 niklas Exp $
|
# $OpenBSD: bksl-nl.t,v 1.2 2001/01/28 23:04:56 niklas Exp $
|
||||||
# $OpenBSD: history.t,v 1.5 2001/01/28 23:04:56 niklas Exp $
|
# $OpenBSD: history.t,v 1.5 2001/01/28 23:04:56 niklas Exp $
|
||||||
# $OpenBSD: read.t,v 1.3 2003/03/10 03:48:16 david Exp $
|
# $OpenBSD: read.t,v 1.3 2003/03/10 03:48:16 david Exp $
|
||||||
|
@ -7,7 +7,7 @@
|
||||||
# http://www.research.att.com/~gsf/public/ifs.sh
|
# http://www.research.att.com/~gsf/public/ifs.sh
|
||||||
|
|
||||||
expected-stdout:
|
expected-stdout:
|
||||||
@(#)MIRBSD KSH R34 2008/07/06
|
@(#)MIRBSD KSH R34 2008/07/09
|
||||||
description:
|
description:
|
||||||
Check version of shell.
|
Check version of shell.
|
||||||
stdin:
|
stdin:
|
||||||
|
@ -5171,3 +5171,24 @@ expected-stdout:
|
||||||
ras
|
ras
|
||||||
dwa
|
dwa
|
||||||
---
|
---
|
||||||
|
name: mkshiop-1
|
||||||
|
description:
|
||||||
|
Check for support of more than 9 file descriptors
|
||||||
|
stdin:
|
||||||
|
read -u10 foo 10<<< bar
|
||||||
|
print x$foo
|
||||||
|
expected-stdout:
|
||||||
|
xbar
|
||||||
|
---
|
||||||
|
name: mkshiop-2
|
||||||
|
description:
|
||||||
|
Check for support of more than 9 file descriptors
|
||||||
|
stdin:
|
||||||
|
exec 12>foo
|
||||||
|
print -u12 bar
|
||||||
|
print baz >&12
|
||||||
|
cat foo
|
||||||
|
expected-stdout:
|
||||||
|
bar
|
||||||
|
baz
|
||||||
|
---
|
||||||
|
|
20
lex.c
20
lex.c
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
#include "sh.h"
|
#include "sh.h"
|
||||||
|
|
||||||
__RCSID("$MirOS: src/bin/mksh/lex.c,v 1.64 2008/07/09 20:41:23 tg Exp $");
|
__RCSID("$MirOS: src/bin/mksh/lex.c,v 1.65 2008/07/09 21:32:43 tg Exp $");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* states while lexing word
|
* states while lexing word
|
||||||
|
@ -775,16 +775,22 @@ yylex(int cf)
|
||||||
state = SBASE;
|
state = SBASE;
|
||||||
|
|
||||||
dp = Xstring(ws, wp);
|
dp = Xstring(ws, wp);
|
||||||
if ((c == '<' || c == '>' || c == '&') && state == SBASE &&
|
if ((c == '<' || c == '>' || c == '&') && state == SBASE) {
|
||||||
((c2 = Xlength(ws, wp)) == 0 ||
|
|
||||||
(c2 == 2 && dp[0] == CHAR && ksh_isdigit(dp[1])))) {
|
|
||||||
struct ioword *iop = (struct ioword *)alloc(sizeof (*iop),
|
struct ioword *iop = (struct ioword *)alloc(sizeof (*iop),
|
||||||
ATEMP);
|
ATEMP);
|
||||||
|
|
||||||
if (c2 == 2)
|
if (Xlength(ws, wp) == 0)
|
||||||
iop->unit = dp[1] - '0';
|
|
||||||
else
|
|
||||||
iop->unit = c == '<' ? 0 : 1;
|
iop->unit = c == '<' ? 0 : 1;
|
||||||
|
else for (iop->unit = 0, c2 = 0; c2 < Xlength(ws, wp); c2 += 2) {
|
||||||
|
if (dp[c2] != CHAR)
|
||||||
|
goto no_iop;
|
||||||
|
if (!ksh_isdigit(dp[c2 + 1]))
|
||||||
|
goto no_iop;
|
||||||
|
iop->unit = (iop->unit * 10) + dp[c2 + 1] - '0';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (iop->unit >= FDBASE)
|
||||||
|
goto no_iop;
|
||||||
|
|
||||||
if (c == '&') {
|
if (c == '&') {
|
||||||
if ((c2 = getsc()) != '>') {
|
if ((c2 = getsc()) != '>') {
|
||||||
|
|
58
main.c
58
main.c
|
@ -1,3 +1,4 @@
|
||||||
|
#include <err.h>
|
||||||
/* $OpenBSD: main.c,v 1.44 2008/07/05 07:25:18 djm Exp $ */
|
/* $OpenBSD: main.c,v 1.44 2008/07/05 07:25:18 djm Exp $ */
|
||||||
/* $OpenBSD: tty.c,v 1.9 2006/03/14 22:08:01 deraadt Exp $ */
|
/* $OpenBSD: tty.c,v 1.9 2006/03/14 22:08:01 deraadt Exp $ */
|
||||||
/* $OpenBSD: io.c,v 1.22 2006/03/17 16:30:13 millert Exp $ */
|
/* $OpenBSD: io.c,v 1.22 2006/03/17 16:30:13 millert Exp $ */
|
||||||
|
@ -13,7 +14,7 @@
|
||||||
#include <locale.h>
|
#include <locale.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
__RCSID("$MirOS: src/bin/mksh/main.c,v 1.99 2008/07/08 22:28:26 tg Exp $");
|
__RCSID("$MirOS: src/bin/mksh/main.c,v 1.100 2008/07/09 21:32:43 tg Exp $");
|
||||||
|
|
||||||
extern char **environ;
|
extern char **environ;
|
||||||
|
|
||||||
|
@ -1007,32 +1008,35 @@ check_fd(const char *name, int mode, const char **emsgp)
|
||||||
{
|
{
|
||||||
int fd, fl;
|
int fd, fl;
|
||||||
|
|
||||||
if (ksh_isdigit(name[0]) && !name[1]) {
|
if (name[0] == 'p' && !name[1])
|
||||||
if ((fl = fcntl(fd = name[0] - '0', F_GETFL, 0)) < 0) {
|
return (coproc_getfd(mode, emsgp));
|
||||||
if (emsgp)
|
for (fd = 0; ksh_isdigit(*name); ++name)
|
||||||
*emsgp = "bad file descriptor";
|
fd = (fd * 10) + *name - '0';
|
||||||
return -1;
|
if (*name || fd >= FDBASE) {
|
||||||
}
|
if (emsgp)
|
||||||
fl &= O_ACCMODE;
|
*emsgp = "illegal file descriptor name";
|
||||||
/* X_OK is a kludge to disable this check for dups (x<&1):
|
return (-1);
|
||||||
* historical shells never did this check (XXX don't know what
|
}
|
||||||
* posix has to say).
|
if ((fl = fcntl(fd, F_GETFL, 0)) < 0) {
|
||||||
*/
|
if (emsgp)
|
||||||
if (!(mode & X_OK) && fl != O_RDWR &&
|
*emsgp = "bad file descriptor";
|
||||||
(((mode & R_OK) && fl != O_RDONLY) ||
|
return (-1);
|
||||||
((mode & W_OK) && fl != O_WRONLY))) {
|
}
|
||||||
if (emsgp)
|
fl &= O_ACCMODE;
|
||||||
*emsgp = (fl == O_WRONLY) ?
|
/* X_OK is a kludge to disable this check for dups (x<&1):
|
||||||
"fd not open for reading" :
|
* historical shells never did this check (XXX don't know what
|
||||||
"fd not open for writing";
|
* posix has to say).
|
||||||
return -1;
|
*/
|
||||||
}
|
if (!(mode & X_OK) && fl != O_RDWR && (
|
||||||
return fd;
|
((mode & R_OK) && fl != O_RDONLY) ||
|
||||||
} else if (name[0] == 'p' && !name[1])
|
((mode & W_OK) && fl != O_WRONLY))) {
|
||||||
return coproc_getfd(mode, emsgp);
|
if (emsgp)
|
||||||
if (emsgp)
|
*emsgp = (fl == O_WRONLY) ?
|
||||||
*emsgp = "illegal file descriptor name";
|
"fd not open for reading" :
|
||||||
return -1;
|
"fd not open for writing";
|
||||||
|
return (-1);
|
||||||
|
}
|
||||||
|
return (fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Called once from main */
|
/* Called once from main */
|
||||||
|
|
13
mksh.1
13
mksh.1
|
@ -1,4 +1,4 @@
|
||||||
.\" $MirOS: src/bin/mksh/mksh.1,v 1.130 2008/06/28 22:51:55 tg Exp $
|
.\" $MirOS: src/bin/mksh/mksh.1,v 1.131 2008/07/09 21:32:43 tg Exp $
|
||||||
.\" $OpenBSD: ksh.1,v 1.122 2008/05/17 23:31:52 sobrado Exp $
|
.\" $OpenBSD: ksh.1,v 1.122 2008/05/17 23:31:52 sobrado Exp $
|
||||||
.\"-
|
.\"-
|
||||||
.\" Try to make GNU groff and AT&T nroff more compatible
|
.\" Try to make GNU groff and AT&T nroff more compatible
|
||||||
|
@ -30,7 +30,7 @@
|
||||||
.el .xD \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
|
.el .xD \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8
|
||||||
..
|
..
|
||||||
.\"-
|
.\"-
|
||||||
.Dd $Mdocdate: June 28 2008 $
|
.Dd $Mdocdate: July 9 2008 $
|
||||||
.Dt MKSH 1
|
.Dt MKSH 1
|
||||||
.Os MirBSD
|
.Os MirBSD
|
||||||
.Sh NAME
|
.Sh NAME
|
||||||
|
@ -2005,13 +2005,16 @@ This is called a here string.
|
||||||
Standard input is duplicated from file descriptor
|
Standard input is duplicated from file descriptor
|
||||||
.Ar fd .
|
.Ar fd .
|
||||||
.Ar fd
|
.Ar fd
|
||||||
can be a single digit, indicating the number of an existing file descriptor;
|
can be a number, indicating the number of an existing file descriptor;
|
||||||
the letter
|
the letter
|
||||||
.Ql p ,
|
.Ql p ,
|
||||||
indicating the file descriptor associated with the output of the current
|
indicating the file descriptor associated with the output of the current
|
||||||
co-process; or the character
|
co-process; or the character
|
||||||
.Ql \- ,
|
.Ql \- ,
|
||||||
indicating standard input is to be closed.
|
indicating standard input is to be closed.
|
||||||
|
Note that
|
||||||
|
.Ar fd
|
||||||
|
is limited to a single digit in most shell implementations.
|
||||||
.It \*(Gt& Ar fd
|
.It \*(Gt& Ar fd
|
||||||
Same as
|
Same as
|
||||||
.Ic \*(Lt& ,
|
.Ic \*(Lt& ,
|
||||||
|
@ -2023,7 +2026,7 @@ This is a GNU
|
||||||
.Nm bash
|
.Nm bash
|
||||||
extension supported by
|
extension supported by
|
||||||
.Nm
|
.Nm
|
||||||
which also supports the preceding explicit fd digit, for example,
|
which also supports the preceding explicit fd number, for example,
|
||||||
.Ic 3&\*(Gt Ar file
|
.Ic 3&\*(Gt Ar file
|
||||||
is the same as
|
is the same as
|
||||||
.Ic 3\*(Gt Ar file 2\*(Gt&3
|
.Ic 3\*(Gt Ar file 2\*(Gt&3
|
||||||
|
@ -2052,7 +2055,7 @@ extensions.
|
||||||
In any of the above redirections, the file descriptor that is redirected
|
In any of the above redirections, the file descriptor that is redirected
|
||||||
(i.e. standard input or standard output)
|
(i.e. standard input or standard output)
|
||||||
can be explicitly given by preceding the
|
can be explicitly given by preceding the
|
||||||
redirection with a single digit.
|
redirection with a number (portably, only a single digit).
|
||||||
Parameter, command, and arithmetic
|
Parameter, command, and arithmetic
|
||||||
substitutions, tilde substitutions, and (if the shell is interactive)
|
substitutions, tilde substitutions, and (if the shell is interactive)
|
||||||
file name generation are all performed on the
|
file name generation are all performed on the
|
||||||
|
|
9
sh.h
9
sh.h
|
@ -100,9 +100,9 @@
|
||||||
#define __SCCSID(x) __IDSTRING(sccsid,x)
|
#define __SCCSID(x) __IDSTRING(sccsid,x)
|
||||||
|
|
||||||
#ifdef EXTERN
|
#ifdef EXTERN
|
||||||
__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.221 2008/07/06 22:41:09 tg Exp $");
|
__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.222 2008/07/09 21:32:44 tg Exp $");
|
||||||
#endif
|
#endif
|
||||||
#define MKSH_VERSION "R34 2008/07/06"
|
#define MKSH_VERSION "R34 2008/07/09"
|
||||||
|
|
||||||
#ifndef MKSH_INCLUDES_ONLY
|
#ifndef MKSH_INCLUDES_ONLY
|
||||||
|
|
||||||
|
@ -268,8 +268,13 @@ extern int __cdecl setegid(gid_t);
|
||||||
/* Table flag type - needs > 16 and < 32 bits */
|
/* Table flag type - needs > 16 and < 32 bits */
|
||||||
typedef int32_t Tflag;
|
typedef int32_t Tflag;
|
||||||
|
|
||||||
|
#ifdef MKSH_SMALL
|
||||||
#define NUFILE 32 /* Number of user-accessible files */
|
#define NUFILE 32 /* Number of user-accessible files */
|
||||||
#define FDBASE 10 /* First file usable by Shell */
|
#define FDBASE 10 /* First file usable by Shell */
|
||||||
|
#else
|
||||||
|
#define NUFILE 256 /* Number of user-accessible files */
|
||||||
|
#define FDBASE 100 /* First file usable by Shell */
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Make MAGIC a char that might be printed to make bugs more obvious, but
|
/* Make MAGIC a char that might be printed to make bugs more obvious, but
|
||||||
* not a char that is used often. Also, can't use the high bit as it causes
|
* not a char that is used often. Also, can't use the high bit as it causes
|
||||||
|
|
4
tree.c
4
tree.c
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
#include "sh.h"
|
#include "sh.h"
|
||||||
|
|
||||||
__RCSID("$MirOS: src/bin/mksh/tree.c,v 1.17 2008/05/17 18:47:02 tg Exp $");
|
__RCSID("$MirOS: src/bin/mksh/tree.c,v 1.18 2008/07/09 21:32:45 tg Exp $");
|
||||||
|
|
||||||
#define INDENT 4
|
#define INDENT 4
|
||||||
|
|
||||||
|
@ -197,7 +197,7 @@ pioact(struct shf *shf, int indent, struct ioword *iop)
|
||||||
(type == IODUP && (iop->unit == !(flag & IORDUP))) ? iop->unit :
|
(type == IODUP && (iop->unit == !(flag & IORDUP))) ? iop->unit :
|
||||||
iop->unit + 1;
|
iop->unit + 1;
|
||||||
if (iop->unit != expected)
|
if (iop->unit != expected)
|
||||||
tputc('0' + iop->unit, shf);
|
shf_fprintf(shf, "%d", iop->unit);
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case IOREAD:
|
case IOREAD:
|
||||||
|
|
Loading…
Reference in New Issue