diff options
author | jilles <jilles@FreeBSD.org> | 2009-06-19 22:09:55 +0000 |
---|---|---|
committer | jilles <jilles@FreeBSD.org> | 2009-06-19 22:09:55 +0000 |
commit | 1ebc51d79bf1b6b0a5d93e299798adb2eac765bc (patch) | |
tree | 71969d5c4fcd6d3c7f130909631c731d8065fd94 /bin | |
parent | 573bf496149c53a0d3a6a3a77491dc10007a5ee0 (diff) | |
download | FreeBSD-src-1ebc51d79bf1b6b0a5d93e299798adb2eac765bc.zip FreeBSD-src-1ebc51d79bf1b6b0a5d93e299798adb2eac765bc.tar.gz |
Fix some issues with quoted output and shorten it in some cases.
Output quoted suitable for re-input to the shell occurs in
various cases such as 'set', 'trap'.
Bugfix: *, ? and [ must be quoted (except sole [)
Bugfix: ~ and # must be quoted (really only sometimes, but keep it simple)
Bugfix: space, tab and newline must always be quoted
Shortening: other IFS characters do not need quoting
Bugfix: send to correct output file, not hard-coded stdout
Shortening: avoid unnecessary '' with \'
Approved by: ed (mentor)
Diffstat (limited to 'bin')
-rw-r--r-- | bin/sh/output.c | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/bin/sh/output.c b/bin/sh/output.c index b59e11e..0d55fdf 100644 --- a/bin/sh/output.c +++ b/bin/sh/output.c @@ -133,32 +133,38 @@ void outqstr(const char *p, struct output *file) { char ch; + int inquotes; if (p[0] == '\0') { outstr("''", file); return; } - if (p[strcspn(p, "|&;<>()$`\\\"'")] == '\0' && (!ifsset() || - p[strcspn(p, ifsval())] == '\0')) { + /* Caller will handle '=' if necessary */ + if (p[strcspn(p, "|&;<>()$`\\\"' \t\n*?[~#")] == '\0' || + strcmp(p, "[") == 0) { outstr(p, file); return; } - out1c('\''); + inquotes = 0; while ((ch = *p++) != '\0') { switch (ch) { case '\'': - /* - * Can't quote single quotes inside single quotes; - * close them, write escaped single quote, open again. - */ - outstr("'\\''", file); + /* Can't quote single quotes inside single quotes. */ + if (inquotes) + outc('\'', file); + inquotes = 0; + outstr("\\'", file); break; default: + if (!inquotes) + outc('\'', file); + inquotes = 1; outc(ch, file); } } - out1c('\''); + if (inquotes) + outc('\'', file); } STATIC char out_junk[16]; |