← Commit list

0cdb7ea38

Denys Vlasenko
Denys Vlasenko
2016-10-02
SUCCESS Duration: 227s

Subject

ash: support "--" in "source" builtin

Binary

No binary (build failed)

Architecture & Compiler Flags

Architecture: x86_64-linux-gnu Compiler: gcc (Ubuntu 11.4.0-1ubuntu1~22.04.3) 11.4.0

—

Build Log

(log yok)

Commit Diff GitHub →

shell/ash.c+18 -12
@@ -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