diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-09-24 22:30:02 +0400 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-09-24 22:30:02 +0400 |
commit | 46a530626d93419ea29cca73a181e3893aeea261 (patch) | |
tree | e5d59aea20c03968113a1ea129effffd7743967b | |
parent | 818322b9b19a452d66a07ca69256e2c092f5db5f (diff) |
ash: fix prompt expansion (Natanael Copa <natanael.copa@gmail.com>)
-rw-r--r-- | shell/ash.c | 19 |
1 files changed, 17 insertions, 2 deletions
diff --git a/shell/ash.c b/shell/ash.c index 167232c33..a3bfe3977 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -2494,6 +2494,7 @@ pwdcmd(int argc, char **argv) #define DQSYNTAX 1 /* in double quotes */ #define SQSYNTAX 2 /* in single quotes */ #define ARISYNTAX 3 /* in arithmetic */ +#define PSSYNTAX 4 /* prompt */ #if ENABLE_ASH_OPTIMIZE_FOR_SIZE #define USE_SIT_FUNCTION @@ -9886,6 +9887,9 @@ readtoken1(int firstc, int syntax, char *eofmark, int striptabs) smallint dblquote; smallint oldstyle; smallint prevsyntax; /* syntax before arithmetic */ +#if ENABLE_ASH_EXPAND_PRMT + smallint pssyntax; /* we are expanding a prompt string */ +#endif int varnest; /* levels of variables expansion */ int arinest; /* levels of arithmetic expansion */ int parenlevel; /* levels of parens in arithmetic */ @@ -9907,9 +9911,14 @@ readtoken1(int firstc, int syntax, char *eofmark, int striptabs) startlinno = plinno; bqlist = NULL; quotef = 0; - dblquote = (syntax == DQSYNTAX); oldstyle = 0; prevsyntax = 0; +#if ENABLE_ASH_EXPAND_PRMT + pssyntax = (syntax == PSSYNTAX); + if (pssyntax) + syntax = DQSYNTAX; +#endif + dblquote = (syntax == DQSYNTAX); varnest = 0; arinest = 0; parenlevel = 0; @@ -9948,6 +9957,12 @@ readtoken1(int firstc, int syntax, char *eofmark, int striptabs) if (doprompt) setprompt(2); } else { +#if ENABLE_ASH_EXPAND_PRMT + if (c == '$' && pssyntax) { + USTPUTC(CTLESC, out); + USTPUTC('\\', out); + } +#endif if (dblquote && c != '\\' && c != '`' && c != '$' && ( @@ -10780,7 +10795,7 @@ expandstr(const char *ps) /* XXX Fix (char *) cast. */ setinputstring((char *)ps); - readtoken1(pgetc(), DQSYNTAX, nullstr, 0); + readtoken1(pgetc(), PSSYNTAX, nullstr, 0); popfile(); n.narg.type = NARG; |