diff options
author | Mark Johnston <markj@FreeBSD.org> | 2018-08-29 17:09:03 +0000 |
---|---|---|
committer | Mark Johnston <markj@FreeBSD.org> | 2018-08-29 17:09:03 +0000 |
commit | b48050264837c9246eb6f1ef686f73883c0320d9 (patch) | |
tree | 009bbaf807a214a0b2475d23f282025dade9d96f /usr.bin/sed | |
parent | 94ec7ec758aad2cdfd976ef5385ca2b345a6d64d (diff) | |
download | src-b48050264837c9246eb6f1ef686f73883c0320d9.tar.gz src-b48050264837c9246eb6f1ef686f73883c0320d9.zip |
sed: Fix -i option behavior with 'q' command.
Don't just exit when encountering the 'q' command if we edit file
inplace, and give mf_fgets() a chance to actually handle the
inplace case.
Also add a regression test.
Submitted by: Yuri Pankov <yuripv@yuripv.net>
Approved by: re (kib)
MFC after: 1 week
Differential Revision: https://reviews.freebsd.org/D16798
Notes
Notes:
svn path=/head/; revision=338375
Diffstat (limited to 'usr.bin/sed')
-rw-r--r-- | usr.bin/sed/extern.h | 2 | ||||
-rw-r--r-- | usr.bin/sed/main.c | 5 | ||||
-rw-r--r-- | usr.bin/sed/process.c | 12 | ||||
-rwxr-xr-x | usr.bin/sed/tests/sed2_test.sh | 18 |
4 files changed, 31 insertions, 6 deletions
diff --git a/usr.bin/sed/extern.h b/usr.bin/sed/extern.h index a104c31dcaea..4d88650417a3 100644 --- a/usr.bin/sed/extern.h +++ b/usr.bin/sed/extern.h @@ -46,6 +46,8 @@ extern int aflag, eflag, nflag; extern const char *fname, *outfname; extern FILE *infile, *outfile; extern int rflags; /* regex flags to use */ +extern const char *inplace; +extern int quit; void cfclose(struct s_command *, struct s_command *); void compile(void); diff --git a/usr.bin/sed/main.c b/usr.bin/sed/main.c index e48c85ea9ae4..96994ec4469d 100644 --- a/usr.bin/sed/main.c +++ b/usr.bin/sed/main.c @@ -102,6 +102,7 @@ FILE *outfile; /* Current output file */ int aflag, eflag, nflag; int rflags = 0; +int quit = 0; static int rval; /* Exit status */ static int ispan; /* Whether inplace editing spans across files */ @@ -115,7 +116,7 @@ const char *fname; /* File name. */ const char *outfname; /* Output file name */ static char oldfname[PATH_MAX]; /* Old file name (for in-place editing) */ static char tmpfname[PATH_MAX]; /* Temporary file name (for in-place editing) */ -static const char *inplace; /* Inplace edit file extension. */ +const char *inplace; /* Inplace edit file extension. */ u_long linenum; static void add_compunit(enum e_cut, char *); @@ -338,7 +339,7 @@ mf_fgets(SPACE *sp, enum e_spflag spflag) } for (;;) { - if (infile != NULL && (c = getc(infile)) != EOF) { + if (infile != NULL && (c = getc(infile)) != EOF && !quit) { (void)ungetc(c, infile); break; } diff --git a/usr.bin/sed/process.c b/usr.bin/sed/process.c index e79d187be35f..261c6239c273 100644 --- a/usr.bin/sed/process.c +++ b/usr.bin/sed/process.c @@ -210,10 +210,14 @@ redirect: } break; case 'q': - if (!nflag && !pd) - OUT(); - flush_appends(); - exit(0); + if (inplace == NULL) { + if (!nflag && !pd) + OUT(); + flush_appends(); + exit(0); + } + quit = 1; + break; case 'r': if (appendx >= appendnum) if ((appends = realloc(appends, diff --git a/usr.bin/sed/tests/sed2_test.sh b/usr.bin/sed/tests/sed2_test.sh index a32f09d4bbab..9acd628a8f1e 100755 --- a/usr.bin/sed/tests/sed2_test.sh +++ b/usr.bin/sed/tests/sed2_test.sh @@ -38,6 +38,7 @@ inplace_hardlink_src_body() atf_check ln a b atf_check sed -i '' -e 's,foo,bar,g' b atf_check -o 'inline:bar\n' -s exit:0 cat b + atf_check -s not-exit:0 stat -q '.!'* } atf_test_case inplace_symlink_src @@ -50,10 +51,27 @@ inplace_symlink_src_body() echo foo > a atf_check ln -s a b atf_check -e not-empty -s not-exit:0 sed -i '' -e 's,foo,bar,g' b + atf_check -s not-exit:0 stat -q '.!'* +} + +atf_test_case inplace_command_q +inplace_command_q_head() +{ + atf_set "descr" "Verify -i works correctly with the 'q' command" +} +inplace_command_q_body() +{ + printf '1\n2\n3\n' > a + atf_check -o 'inline:1\n2\n' sed '2q' a + atf_check sed -i.bak '2q' a + atf_check -o 'inline:1\n2\n' cat a + atf_check -o 'inline:1\n2\n3\n' cat a.bak + atf_check -s not-exit:0 stat -q '.!'* } atf_init_test_cases() { + atf_add_test_case inplace_command_q atf_add_test_case inplace_hardlink_src atf_add_test_case inplace_symlink_src } |