summaryrefslogtreecommitdiff
path: root/shell
diff options
context:
space:
mode:
Diffstat (limited to 'shell')
-rw-r--r--shell/ash.c30
1 files changed, 18 insertions, 12 deletions
diff --git a/shell/ash.c b/shell/ash.c
index 4f6ba0c..c358c5f 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -12405,32 +12405,38 @@ find_dot_file(char *name)
}
static int FAST_FUNC
-dotcmd(int argc, char **argv)
+dotcmd(int argc_ UNUSED_PARAM, char **argv_ UNUSED_PARAM)
{
+ /* "false; . empty_file; echo $?" should print 0, not 1: */
+ int status = 0;
char *fullname;
+ char **argv;
struct strlist *sp;
volatile struct shparam saveparam;
for (sp = cmdenviron; sp; sp = sp->next)
setvareq(ckstrdup(sp->text), VSTRFIXED | VTEXTFIXED);
- if (!argv[1]) {
+ nextopt(nullstr); /* handle possible "--" */
+ argv = argptr;
+
+ if (!argv[0]) {
/* bash says: "bash: .: filename argument required" */
return 2; /* bash compat */
}
- /* "false; . empty_file; echo $?" should print 0, not 1: */
- exitstatus = 0;
-
/* This aborts if file isn't found, which is POSIXly correct.
* bash returns exitcode 1 instead.
*/
- fullname = find_dot_file(argv[1]);
- argv += 2;
- argc -= 2;
- if (argc) { /* argc > 0, argv[0] != NULL */
+ fullname = find_dot_file(argv[0]);
+ argv++;
+ if (argv[0]) { /* . FILE ARGS, ARGS exist */
+ int argc;
saveparam = shellparam;
shellparam.malloced = 0;
+ argc = 1;
+ while (argv[argc])
+ argc++;
shellparam.nparam = argc;
shellparam.p = argv;
};
@@ -12440,15 +12446,15 @@ dotcmd(int argc, char **argv)
*/
setinputfile(fullname, INPUT_PUSH_FILE);
commandname = fullname;
- cmdloop(0);
+ status = cmdloop(0);
popfile();
- if (argc) {
+ if (argv[0]) {
freeparam(&shellparam);
shellparam = saveparam;
};
- return exitstatus;
+ return status;
}
static int FAST_FUNC