[sed] Forgot to add the new patch

Martin Briza mbriza at fedoraproject.org
Fri Jan 4 15:28:53 UTC 2013


commit a42395139faf7a0767024119850e0b52c3dfe740
Author: Martin Briza <mbriza at redhat.com>
Date:   Fri Jan 4 16:28:35 2013 +0100

    Forgot to add the new patch

 sed-4.2.2-copy.patch |  241 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 241 insertions(+), 0 deletions(-)
---
diff --git a/sed-4.2.2-copy.patch b/sed-4.2.2-copy.patch
new file mode 100644
index 0000000..593b980
--- /dev/null
+++ b/sed-4.2.2-copy.patch
@@ -0,0 +1,241 @@
+--- sed-4.2.2/sed/sed.h.copy	2012-07-25 12:33:09.000000000 +0200
++++ sed-4.2.2/sed/sed.h	2013-01-04 15:26:07.702167448 +0100
+@@ -230,6 +230,10 @@ extern countT lcmd_out_line_len;
+ /* How do we edit files in-place? (we don't if NULL) */
+ extern char *in_place_extension;
+ 
++/* Do we use copy or rename when in in-place edit mode? (boolean
++   value, non-zero for copy, zero for rename).*/
++extern int copy_instead_of_rename;
++
+ /* The mode to use to read and write files, either "rt"/"w" or "rb"/"wb".  */
+ extern char *read_mode;
+ extern char *write_mode;
+--- sed-4.2.2/sed/utils.c.copy	2012-03-16 10:13:31.000000000 +0100
++++ sed-4.2.2/sed/utils.c	2013-01-04 15:23:54.278515120 +0100
+@@ -27,6 +27,7 @@
+ #include <sys/stat.h>
+ #include <unistd.h>
+ #include <limits.h>
++#include <fcntl.h>
+ 
+ #include "utils.h"
+ #include "pathmax.h"
+@@ -410,33 +411,109 @@ follow_symlink(const char *fname)
+   return fname;
+ #endif /* ENABLE_FOLLOW_SYMLINKS */
+ }
++
+ 
+-/* Panic on failing rename */
++/* Panic on failing unlink */
+ void
+-ck_rename (from, to, unlink_if_fail)
+-  const char *from, *to;
+-  const char *unlink_if_fail;
++ck_unlink (name)
++  const char *name;
+ {
+-  int rd = rename (from, to);
+-  if (rd != -1)
+-    return;
++  if (unlink (name) == -1)
++    panic (_("cannot remove %s: %s"), name, strerror (errno));
++}
+ 
+-  if (unlink_if_fail)
++/* Attempt to unlink denoted file if operation rd failed. */
++static int
++_unlink_if_fail (rd, unlink_if_fail)
++  int rd;
++  const char *unlink_if_fail;
++{
++  if (rd == -1 && unlink_if_fail)
+     {
+       int save_errno = errno;
++      ck_unlink (unlink_if_fail);
++      errno = save_errno;
++    }
++
++  return rd != -1;
++}
++
++/* Copy contents between files. */
++static int
++_copy (from, to)
++  const char *from, *to;
++{
++  static char buf[4096];
++
++  FILE *infile, *outfile;
++  int c, retval = 0;
+       errno = 0;
+-      unlink (unlink_if_fail);
+ 
+-      /* Failure to remove the temporary file is more severe, so trigger it first.  */
+-      if (errno != 0)
+-        panic (_("cannot remove %s: %s"), unlink_if_fail, strerror (errno));
++  infile = fopen (from, "r");
++  if (infile == NULL)
++    return -1;
+ 
+-      errno = save_errno;
++  outfile = fopen (to, "w");
++  if (outfile == NULL)
++    {
++      fclose (infile);
++      return -1;
++    }
++
++  while (1)
++    {
++      size_t bytes_in = fread (buf, 1, sizeof (buf), infile);
++      size_t bytes_out;
++      if (bytes_in == 0)
++	{
++	  if (ferror (infile))
++	    retval = -1;
++	  break;
++	}
++
++      bytes_out = fwrite (buf, 1, bytes_in, outfile);
++      if (bytes_out != bytes_in)
++	{
++	  retval = -1;
++	  break;
++	}
+     }
+ 
++  fclose (outfile);
++  fclose (infile);
++
++  return retval;
++}
++
++/* Panic on failing rename */
++void
++ck_rename (from, to, unlink_if_fail)
++  const char *from, *to;
++  const char *unlink_if_fail;
++{
++  if (!_unlink_if_fail (rename (from, to), unlink_if_fail))
+   panic (_("cannot rename %s: %s"), from, strerror (errno));
+ }
+ 
++/* Attempt to copy file contents between the files. */
++void
++ck_fccopy (from, to, unlink_if_fail)
++  const char *from, *to;
++  const char *unlink_if_fail;
++{
++  if (!_unlink_if_fail (_copy (from, to), unlink_if_fail))
++    panic (_("cannot copy %s to %s: %s"), from, to, strerror (errno));
++}
++
++/* Copy contents between files, and then unlink the source. */
++void
++ck_fcmove (from, to, unlink_if_fail)
++  const char *from, *to;
++  const char *unlink_if_fail;
++{
++  ck_fccopy (from, to, unlink_if_fail);
++  ck_unlink (from);
++}
+ 
+ 
+ 
+--- sed-4.2.2/sed/execute.c.copy	2012-03-16 10:13:31.000000000 +0100
++++ sed-4.2.2/sed/execute.c	2013-01-04 15:23:54.232515231 +0100
+@@ -703,11 +703,13 @@ closedown(input)
+       if (strcmp(in_place_extension, "*") != 0)
+         {
+           char *backup_file_name = get_backup_file_name(target_name);
+-	  ck_rename (target_name, backup_file_name, input->out_file_name);
++	  (copy_instead_of_rename?ck_fccopy:ck_rename)
++            (target_name, backup_file_name, input->out_file_name);
+           free (backup_file_name);
+ 	}
+ 
+-      ck_rename (input->out_file_name, target_name, input->out_file_name);
++      (copy_instead_of_rename?ck_fcmove:ck_rename)
++        (input->out_file_name, target_name, input->out_file_name);
+       free (input->out_file_name);
+     }
+   else
+--- sed-4.2.2/sed/utils.h.copy	2012-03-16 10:13:31.000000000 +0100
++++ sed-4.2.2/sed/utils.h	2013-01-04 15:25:30.821263467 +0100
+@@ -33,6 +33,8 @@ size_t ck_getdelim (char **text, size_t
+ FILE * ck_mkstemp (char **p_filename, const char *tmpdir, const char *base,
+ 		   const char *mode);
+ void ck_rename (const char *from, const char *to, const char *unlink_if_fail);
++void ck_fccopy (const char *from, const char *to, const char *unlink_if_fail);
++void ck_fcmove (const char *from, const char *to, const char *unlink_if_fail);
+ 
+ void *ck_malloc (size_t size);
+ void *xmalloc (size_t size);
+--- sed-4.2.2/sed/sed.c.copy	2012-03-16 10:13:31.000000000 +0100
++++ sed-4.2.2/sed/sed.c	2013-01-04 15:28:10.772846595 +0100
+@@ -56,6 +56,10 @@ bool follow_symlinks = false;
+ /* How do we edit files in-place? (we don't if NULL) */
+ char *in_place_extension = NULL;
+ 
++/* Do we use copy or rename when in in-place edit mode? (boolean
++   value, non-zero for copy, zero for rename).*/
++int copy_instead_of_rename = 0;
++
+ /* The mode to use to read/write files, either "r"/"w" or "rb"/"wb".  */
+ char *read_mode = "r";
+ char *write_mode = "w";
+@@ -117,6 +121,8 @@ Usage: %s [OPTION]... {script-only-if-no
+ #endif
+   fprintf(out, _("  -i[SUFFIX], --in-place[=SUFFIX]\n\
+                  edit files in place (makes backup if SUFFIX supplied)\n"));
++  fprintf(out, _("  -c, --copy\n\
++                 use copy instead of rename when shuffling files in -i mode\n"));
+ #if defined(WIN32) || defined(_WIN32) || defined(__CYGWIN__) || defined(MSDOS) || defined(__EMX__)
+   fprintf(out, _("  -b, --binary\n\
+                  open files in binary mode (CR+LFs are not processed specially)\n"));
+@@ -158,9 +164,9 @@ main(argc, argv)
+   char **argv;
+ {
+ #ifdef REG_PERL
+-#define SHORTOPTS "bsnrzRuEe:f:l:i::V:"
++#define SHORTOPTS "bcsnrzRuEe:f:l:i::V:"
+ #else
+-#define SHORTOPTS "bsnrzuEe:f:l:i::V:"
++#define SHORTOPTS "bcsnrzuEe:f:l:i::V:"
+ #endif
+ 
+   static struct option longopts[] = {
+@@ -172,6 +178,7 @@ main(argc, argv)
+     {"expression", 1, NULL, 'e'},
+     {"file", 1, NULL, 'f'},
+     {"in-place", 2, NULL, 'i'},
++    {"copy", 0, NULL, 'c'},
+     {"line-length", 1, NULL, 'l'},
+     {"null-data", 0, NULL, 'z'},
+     {"zero-terminated", 0, NULL, 'z'},
+@@ -244,6 +251,10 @@ main(argc, argv)
+ 
+ 	case 'F':
+ 	  follow_symlinks = true;
++ 	  break;
++
++	case 'c':
++	  copy_instead_of_rename = true;
+ 	  break;
+ 
+ 	case 'i':
+@@ -314,6 +325,12 @@ main(argc, argv)
+ 	}
+     }
+ 
++  if (copy_instead_of_rename && in_place_extension == NULL)
++    {
++      fprintf (stderr, _("Error: -c used without -i.\n"));
++      usage(4);
++    }
++
+   if (!the_program)
+     {
+       if (optind < argc)


More information about the scm-commits mailing list