Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 25 Jan 2011 23:02:25 +0000 (UTC)
From:      Jilles Tjoelker <jilles@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-8@freebsd.org
Subject:   svn commit: r217863 - stable/8/usr.bin/sed
Message-ID:  <201101252302.p0PN2PKk055533@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jilles
Date: Tue Jan 25 23:02:25 2011
New Revision: 217863
URL: http://svn.freebsd.org/changeset/base/217863

Log:
  MFC r217133:   sed: Try hard links to make -i target available continually.
  
  When creating a backup file, sed renamed the original before renaming the
  changed copy into place, leading to a short time when no file with the
  original name was present (usually only visible on SMP systems). Try
  creating the backup file using a hard link instead, avoiding this problem.
  If creating the hard link fails for any reason, fall back to the old rename
  method.
  
  When not creating a backup file, sed already renamed the changed copy onto
  the original. This remains unchanged.
  
  PR:		bin/153261
  Submitted by:	Pedro F. Giffuni
  Reviewed by:	dds (older version)
  Obtained from:	Illumos

Modified:
  stable/8/usr.bin/sed/main.c
Directory Properties:
  stable/8/usr.bin/sed/   (props changed)

Modified: stable/8/usr.bin/sed/main.c
==============================================================================
--- stable/8/usr.bin/sed/main.c	Tue Jan 25 22:55:50 2011	(r217862)
+++ stable/8/usr.bin/sed/main.c	Tue Jan 25 23:02:25 2011	(r217863)
@@ -338,18 +338,35 @@ mf_fgets(SPACE *sp, enum e_spflag spflag
 		if (infile != NULL) {
 			fclose(infile);
 			if (*oldfname != '\0') {
-				if (rename(fname, oldfname) != 0) {
+				/* if there was a backup file, remove it */
+				unlink(oldfname);
+				/*
+				 * Backup the original.  Note that hard links
+				 * are not supported on all filesystems.
+				 */
+				if ((link(fname, oldfname) != 0) &&
+				   (rename(fname, oldfname) != 0)) {
 					warn("rename()");
-					unlink(tmpfname);
+					if (*tmpfname)
+						unlink(tmpfname);
 					exit(1);
 				}
 				*oldfname = '\0';
 			}
 			if (*tmpfname != '\0') {
 				if (outfile != NULL && outfile != stdout)
-					fclose(outfile);
+					if (fclose(outfile) != 0) {
+						warn("fclose()");
+						unlink(tmpfname);
+						exit(1);
+					}
 				outfile = NULL;
-				rename(tmpfname, fname);
+				if (rename(tmpfname, fname) != 0) {
+					/* this should not happen really! */
+					warn("rename()");
+					unlink(tmpfname);
+					exit(1);
+				}
 				*tmpfname = '\0';
 			}
 			outfname = NULL;



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