• revert the cat hack for realpath and rename

‣ I was convinced by several that more magic is never the solution
• fix a comment: function cat already had precedence
• change cat loader to look for existence, FPATH included, before
  ditching the builtin; note that in manpage
This commit is contained in:
tg 2015-07-06 17:48:37 +00:00
parent d09aca4175
commit f463d9da76
7 changed files with 39 additions and 65 deletions

View File

@ -1,5 +1,5 @@
#!/bin/sh #!/bin/sh
srcversion='$MirOS: src/bin/mksh/Build.sh,v 1.680 2015/07/05 15:45:16 tg Exp $' srcversion='$MirOS: src/bin/mksh/Build.sh,v 1.681 2015/07/06 17:48:28 tg Exp $'
#- #-
# Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
# 2011, 2012, 2013, 2014, 2015 # 2011, 2012, 2013, 2014, 2015
@ -2645,9 +2645,6 @@ MKSH_NOPROSPECTOFWORK disable jobs, co-processes, etc. (do not use)
MKSH_NOPWNAM skip PAM calls, for -static on glibc or Solaris MKSH_NOPWNAM skip PAM calls, for -static on glibc or Solaris
MKSH_NO_CMDLINE_EDITING disable command line editing code entirely MKSH_NO_CMDLINE_EDITING disable command line editing code entirely
MKSH_NO_DEPRECATED_WARNING omit warning when deprecated stuff is run MKSH_NO_DEPRECATED_WARNING omit warning when deprecated stuff is run
MKSH_NO_EXTERNAL_CAT omit hack to skip cat builtin when flags passed
MKSH_NO_EXTERNAL_REALPATH same for realpath builtin
MKSH_NO_EXTERNAL_RENAME same for rename builtin
MKSH_NO_LIMITS omit ulimit code MKSH_NO_LIMITS omit ulimit code
MKSH_NO_SIGSETJMP define if sigsetjmp is broken or not available MKSH_NO_SIGSETJMP define if sigsetjmp is broken or not available
MKSH_NO_SIGSUSPEND use sigprocmask+pause instead of sigsuspend MKSH_NO_SIGSUSPEND use sigprocmask+pause instead of sigsuspend

20
check.t
View File

@ -1,4 +1,4 @@
# $MirOS: src/bin/mksh/check.t,v 1.698 2015/07/05 19:37:11 tg Exp $ # $MirOS: src/bin/mksh/check.t,v 1.699 2015/07/06 17:48:29 tg Exp $
# -*- mode: sh -*- # -*- mode: sh -*-
#- #-
# Copyright © 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, # Copyright © 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
@ -30,7 +30,7 @@
# (2013/12/02 20:39:44) http://openbsd.cs.toronto.edu/cgi-bin/cvsweb/src/regress/bin/ksh/?sortby=date # (2013/12/02 20:39:44) http://openbsd.cs.toronto.edu/cgi-bin/cvsweb/src/regress/bin/ksh/?sortby=date
expected-stdout: expected-stdout:
@(#)MIRBSD KSH R51 2015/07/05 @(#)MIRBSD KSH R51 2015/07/06
description: description:
Check version of shell. Check version of shell.
stdin: stdin:
@ -39,7 +39,7 @@ name: KSH_VERSION
category: shell:legacy-no category: shell:legacy-no
--- ---
expected-stdout: expected-stdout:
@(#)LEGACY KSH R51 2015/07/05 @(#)LEGACY KSH R51 2015/07/06
description: description:
Check version of legacy shell. Check version of legacy shell.
stdin: stdin:
@ -8533,7 +8533,7 @@ description:
Ensure concatenating behaviour matches other shells Ensure concatenating behaviour matches other shells
stdin: stdin:
showargs() { for s_arg in "$@"; do echo -n "<$s_arg> "; done; echo .; } showargs() { for s_arg in "$@"; do echo -n "<$s_arg> "; done; echo .; }
#showargs 0 ""$@ showargs 0 ""$@
x=; showargs 1 "$x"$@ x=; showargs 1 "$x"$@
set A; showargs 2 "${@:+}" set A; showargs 2 "${@:+}"
n() { echo "$#"; } n() { echo "$#"; }
@ -8553,6 +8553,7 @@ stdin:
n "$@" n "$@"
n "$@""$e" n "$@""$e"
expected-stdout: expected-stdout:
<0> <> .
<1> <> . <1> <> .
<2> <> . <2> <> .
2 2
@ -8568,17 +8569,6 @@ expected-stdout:
0 0
1 1
--- ---
name: varexpand-null-3a
description:
Ensure concatenating behaviour matches other shells
(currently broken cases)
expected-fail: yes
stdin:
showargs() { for s_arg in "$@"; do echo -n "<$s_arg> "; done; echo .; }
showargs 0 ""$@
expected-stdout:
<0> <> .
---
name: print-funny-chars name: print-funny-chars
description: description:
Check print builtin's capability to output designated characters Check print builtin's capability to output designated characters

41
exec.c
View File

@ -23,7 +23,7 @@
#include "sh.h" #include "sh.h"
__RCSID("$MirOS: src/bin/mksh/exec.c,v 1.154 2015/07/05 15:45:17 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/exec.c,v 1.155 2015/07/06 17:48:31 tg Exp $");
#ifndef MKSH_DEFAULT_EXECSHELL #ifndef MKSH_DEFAULT_EXECSHELL
#define MKSH_DEFAULT_EXECSHELL "/bin/sh" #define MKSH_DEFAULT_EXECSHELL "/bin/sh"
@ -551,6 +551,8 @@ comexec(struct op *t, struct tbl * volatile tp, const char **ap,
} }
if ((tp = findcom(cp, FC_BI)) == NULL) if ((tp = findcom(cp, FC_BI)) == NULL)
errorf("%s: %s: %s", Tbuiltin, cp, "not a builtin"); errorf("%s: %s: %s", Tbuiltin, cp, "not a builtin");
if (tp->type == CSHELL && tp->val.f == c_cat)
break;
continue; continue;
} else if (tp->val.f == c_exec) { } else if (tp->val.f == c_exec) {
if (ap[1] == NULL) if (ap[1] == NULL)
@ -607,30 +609,19 @@ comexec(struct op *t, struct tbl * volatile tp, const char **ap,
subst_exstat = 0; subst_exstat = 0;
break; break;
} }
#if !defined(MKSH_NO_EXTERNAL_CAT) || \ } else if (tp->val.f == c_cat) {
!defined(MKSH_NO_EXTERNAL_REALPATH) || \
!defined(MKSH_NO_EXTERNAL_RENAME)
} else if (
#ifndef MKSH_NO_EXTERNAL_CAT
tp->val.f == c_cat ||
#endif
#ifndef MKSH_NO_EXTERNAL_REALPATH
tp->val.f == c_realpath ||
#endif
#ifndef MKSH_NO_EXTERNAL_RENAME
tp->val.f == c_rename ||
#endif
0) {
/* if we have any flags, do not use the builtin */ /* if we have any flags, do not use the builtin */
if (ap[1] && ap[1][0] == '-' && ap[1][1] != '\0' && if (ap[1] && ap[1][0] == '-' && ap[1][1] != '\0' &&
/* argument, begins with -, is not - or -- */ /* argument, begins with -, is not - or -- */
(ap[1][1] != '-' || ap[1][2] != '\0')) (ap[1][1] != '-' || ap[1][2] != '\0')) {
/* don't look for builtins or functions */ struct tbl *ext_cat;
fcflags = FC_PATH;
else ext_cat = findcom(Tcat, FC_PATH | FC_FUNC);
/* go on, use the builtin */ if (ext_cat && (ext_cat->type != CTALIAS ||
(ext_cat->flag & ISSET)))
tp = ext_cat;
}
break; break;
#endif
} else if (tp->val.f == c_trap) { } else if (tp->val.f == c_trap) {
t->u.evalflags &= ~DOTCOMEXEC; t->u.evalflags &= ~DOTCOMEXEC;
break; break;
@ -710,6 +701,7 @@ comexec(struct op *t, struct tbl * volatile tp, const char **ap,
/* shell built-in */ /* shell built-in */
case CSHELL: case CSHELL:
do_call_builtin:
rv = call_builtin(tp, (const char **)ap, null, resetspec); rv = call_builtin(tp, (const char **)ap, null, resetspec);
if (resetspec && tp->val.f == c_shift) { if (resetspec && tp->val.f == c_shift) {
l_expand->argc = l_assign->argc; l_expand->argc = l_assign->argc;
@ -734,6 +726,11 @@ comexec(struct op *t, struct tbl * volatile tp, const char **ap,
break; break;
} }
if (include(tp->u.fpath, 0, NULL, false) < 0) { if (include(tp->u.fpath, 0, NULL, false) < 0) {
if (!strcmp(cp, Tcat)) {
no_cat_in_FPATH:
tp = findcom(Tcat, FC_BI);
goto do_call_builtin;
}
warningf(true, "%s: %s %s %s: %s", cp, warningf(true, "%s: %s %s %s: %s", cp,
"can't open", "function definition file", "can't open", "function definition file",
tp->u.fpath, cstrerror(errno)); tp->u.fpath, cstrerror(errno));
@ -742,6 +739,8 @@ comexec(struct op *t, struct tbl * volatile tp, const char **ap,
} }
if (!(ftp = findfunc(cp, hash(cp), false)) || if (!(ftp = findfunc(cp, hash(cp), false)) ||
!(ftp->flag & ISSET)) { !(ftp->flag & ISSET)) {
if (!strcmp(cp, Tcat))
goto no_cat_in_FPATH;
warningf(true, "%s: %s %s", cp, warningf(true, "%s: %s %s", cp,
"function not defined by", tp->u.fpath); "function not defined by", tp->u.fpath);
rv = 127; rv = 127;

View File

@ -38,7 +38,7 @@
#endif #endif
#endif #endif
__RCSID("$MirOS: src/bin/mksh/funcs.c,v 1.276 2015/07/05 19:37:14 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/funcs.c,v 1.277 2015/07/06 17:48:32 tg Exp $");
#if HAVE_KILLPG #if HAVE_KILLPG
/* /*
@ -99,7 +99,7 @@ const struct builtin mkshbuiltins[] = {
{Talias, c_alias}, {Talias, c_alias},
{"*=break", c_brkcont}, {"*=break", c_brkcont},
{Tgbuiltin, c_builtin}, {Tgbuiltin, c_builtin},
{"cat", c_cat}, {Tcat, c_cat},
{"cd", c_cd}, {"cd", c_cd},
/* dash compatibility hack */ /* dash compatibility hack */
{"chdir", c_cd}, {"chdir", c_cd},

4
main.c
View File

@ -34,7 +34,7 @@
#include <locale.h> #include <locale.h>
#endif #endif
__RCSID("$MirOS: src/bin/mksh/main.c,v 1.294 2015/07/05 19:37:16 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/main.c,v 1.295 2015/07/06 17:48:34 tg Exp $");
extern char **environ; extern char **environ;
@ -87,7 +87,7 @@ static const char *initcoms[] = {
NULL, NULL,
/* this is what AT&T ksh seems to track, with the addition of emacs */ /* this is what AT&T ksh seems to track, with the addition of emacs */
Talias, "-tU", Talias, "-tU",
"cat", "cc", "chmod", "cp", "date", "ed", "emacs", "grep", "ls", Tcat, "cc", "chmod", "cp", "date", "ed", "emacs", "grep", "ls",
"make", "mv", "pr", "rm", "sed", "sh", "vi", "who", NULL, "make", "mv", "pr", "rm", "sed", "sh", "vi", "who", NULL,
NULL NULL
}; };

23
mksh.1
View File

@ -1,4 +1,4 @@
.\" $MirOS: src/bin/mksh/mksh.1,v 1.372 2015/07/05 19:37:17 tg Exp $ .\" $MirOS: src/bin/mksh/mksh.1,v 1.373 2015/07/06 17:48:35 tg Exp $
.\" $OpenBSD: ksh.1,v 1.160 2015/07/04 13:27:04 feinerer Exp $ .\" $OpenBSD: ksh.1,v 1.160 2015/07/04 13:27:04 feinerer Exp $
.\"- .\"-
.\" Copyright © 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, .\" Copyright © 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009,
@ -74,7 +74,7 @@
.\" with -mandoc, it might implement .Mx itself, but we want to .\" with -mandoc, it might implement .Mx itself, but we want to
.\" use our own definition. And .Dd must come *first*, always. .\" use our own definition. And .Dd must come *first*, always.
.\" .\"
.Dd $Mdocdate: July 5 2015 $ .Dd $Mdocdate: July 6 2015 $
.\" .\"
.\" Check which macro package we use, and do other -mdoc setup. .\" Check which macro package we use, and do other -mdoc setup.
.\" .\"
@ -3161,15 +3161,13 @@ If a
is a single dash is a single dash
.Pq Sq - .Pq Sq -
or absent, read from standard input. or absent, read from standard input.
Unless compiled with
.Dv MKSH_NO_EXTERNAL_CAT ,
if any options are given, an external
.Xr cat 1
utility is invoked instead if called from the shell.
For direct builtin calls, the For direct builtin calls, the
.Tn POSIX .Tn POSIX
.Fl u .Fl u
option is supported as a no-op. option is supported as a no-op.
For calls from shell, if any options are given, an external
.Xr cat 1
utility is preferred over the builtin.
.Pp .Pp
.It Xo .It Xo
.Ic cd .Ic cd
@ -3958,12 +3956,6 @@ it's also checked for existence and whether it is a directory; otherwise,
returns 0 if the pathname either exists or can be created immediately, returns 0 if the pathname either exists or can be created immediately,
i.e. all but the last component exist and are directories. i.e. all but the last component exist and are directories.
.Pp .Pp
Unless compiled with
.Dv MKSH_NO_EXTERNAL_REALPATH ,
if any options are given and this is not a direct builtin call, an external
.Xr realpath 1
utility is invoked instead.
.Pp
.It Xo .It Xo
.Ic rename .Ic rename
.Op Fl \- .Op Fl \-
@ -3978,11 +3970,6 @@ This builtin is intended for emergency situations where
.Pa /bin/mv .Pa /bin/mv
becomes unusable, and directly calls becomes unusable, and directly calls
.Xr rename 2 . .Xr rename 2 .
Unless compiled with
.Dv MKSH_NO_EXTERNAL_RENAME ,
if any options are given and this is not a direct builtin call, an external
.Xr rename 1
utility is invoked instead.
.Pp .Pp
.It Ic return Op Ar status .It Ic return Op Ar status
Returns from a function or Returns from a function or

5
sh.h
View File

@ -169,9 +169,9 @@
#endif #endif
#ifdef EXTERN #ifdef EXTERN
__RCSID("$MirOS: src/bin/mksh/sh.h,v 1.733 2015/07/05 19:37:18 tg Exp $"); __RCSID("$MirOS: src/bin/mksh/sh.h,v 1.734 2015/07/06 17:48:37 tg Exp $");
#endif #endif
#define MKSH_VERSION "R51 2015/07/05" #define MKSH_VERSION "R51 2015/07/06"
/* arithmetic types: C implementation */ /* arithmetic types: C implementation */
#if !HAVE_CAN_INTTYPES #if !HAVE_CAN_INTTYPES
@ -821,6 +821,7 @@ EXTERN const char T_typeset[] E_INIT("=typeset");
#define Ttypeset (T_typeset + 1) /* "typeset" */ #define Ttypeset (T_typeset + 1) /* "typeset" */
EXTERN const char Talias[] E_INIT("alias"); EXTERN const char Talias[] E_INIT("alias");
EXTERN const char Tunalias[] E_INIT("unalias"); EXTERN const char Tunalias[] E_INIT("unalias");
EXTERN const char Tcat[] E_INIT("cat");
EXTERN const char Tsgset[] E_INIT("*=set"); EXTERN const char Tsgset[] E_INIT("*=set");
#define Tset (Tsgset + 2) /* "set" */ #define Tset (Tsgset + 2) /* "set" */
EXTERN const char Tsgexport[] E_INIT("*=export"); EXTERN const char Tsgexport[] E_INIT("*=export");