Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 29 Aug 2018 17:09:04 +0000 (UTC)
From:      Mark Johnston <markj@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r338375 - in head/usr.bin/sed: . tests
Message-ID:  <201808291709.w7TH94Mn001568@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: markj
Date: Wed Aug 29 17:09:03 2018
New Revision: 338375
URL: https://svnweb.freebsd.org/changeset/base/338375

Log:
  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

Modified:
  head/usr.bin/sed/extern.h
  head/usr.bin/sed/main.c
  head/usr.bin/sed/process.c
  head/usr.bin/sed/tests/sed2_test.sh

Modified: head/usr.bin/sed/extern.h
==============================================================================
--- head/usr.bin/sed/extern.h	Wed Aug 29 16:59:19 2018	(r338374)
+++ head/usr.bin/sed/extern.h	Wed Aug 29 17:09:03 2018	(r338375)
@@ -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);

Modified: head/usr.bin/sed/main.c
==============================================================================
--- head/usr.bin/sed/main.c	Wed Aug 29 16:59:19 2018	(r338374)
+++ head/usr.bin/sed/main.c	Wed Aug 29 17:09:03 2018	(r338375)
@@ -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;
 		}

Modified: head/usr.bin/sed/process.c
==============================================================================
--- head/usr.bin/sed/process.c	Wed Aug 29 16:59:19 2018	(r338374)
+++ head/usr.bin/sed/process.c	Wed Aug 29 17:09:03 2018	(r338375)
@@ -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,

Modified: head/usr.bin/sed/tests/sed2_test.sh
==============================================================================
--- head/usr.bin/sed/tests/sed2_test.sh	Wed Aug 29 16:59:19 2018	(r338374)
+++ head/usr.bin/sed/tests/sed2_test.sh	Wed Aug 29 17:09:03 2018	(r338375)
@@ -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
 }



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201808291709.w7TH94Mn001568>