diff -ur patch-2.5.4/patch.c patch-2.5.4-hacked/patch.c --- patch-2.5.4/patch.c Fri May 4 16:55:41 2001 +++ patch-2.5.4-hacked/patch.c Fri May 4 17:02:02 2001 @@ -65,7 +65,7 @@ static bool spew_output PARAMS ((struct outstate *)); static char const *make_temp PARAMS ((int)); static int numeric_string PARAMS ((char const *, int, char const *)); -static void abort_hunk PARAMS ((void)); +static void abort_hunk PARAMS ((char *name)); static void cleanup PARAMS ((void)); static void get_some_switches PARAMS ((void)); static void init_output PARAMS ((char const *, int, struct outstate *)); @@ -79,6 +79,7 @@ static char const *version_control; static char const *version_control_context; static int remove_empty_files; +static char *global_reject; /* TRUE if -R was specified on command line. */ static int reverse_flag_specified; @@ -280,7 +281,7 @@ newwhere = pch_newfirst() + last_offset; if (skip_rest_of_patch) { - abort_hunk(); + abort_hunk(outname); failed++; if (verbosity == VERBOSE) say ("Hunk #%d ignored at %s.\n", hunk, @@ -294,14 +295,14 @@ say ("Patch attempted to create file %s, which already exists.\n", quotearg (inname)); - abort_hunk(); + abort_hunk(outname); failed++; if (verbosity != SILENT) say ("Hunk #%d FAILED at %s.\n", hunk, format_linenum (numbuf, newwhere)); } else if (! apply_hunk (&outstate, where)) { - abort_hunk (); + abort_hunk (outname); failed++; if (verbosity != SILENT) say ("Hunk #%d FAILED at %s.\n", hunk, @@ -427,6 +428,14 @@ strcpy (rej, outname); addext (rej, ".rej", '#'); } + + if (global_reject) + { + static int file_flags = O_CREAT; + copy_file (TMPREJNAME, global_reject, file_flags, 0664); + file_flags = O_APPEND; + } + say (" -- saving rejects to file %s", quotearg (rej)); if (! dry_run) { @@ -524,6 +534,7 @@ {"no-backup-if-mismatch", no_argument, NULL, CHAR_MAX + 6}, {"posix", no_argument, NULL, CHAR_MAX + 7}, {"quoting-style", required_argument, NULL, CHAR_MAX + 8}, + {"global-reject", required_argument, NULL, CHAR_MAX + 9}, {NULL, no_argument, NULL, 0} }; @@ -582,6 +593,7 @@ " --verbose Output extra information about the work being done.", " --dry-run Do not actually change any files; just print what would happen.", " --posix Conform to the POSIX standard.", +" --global-reject=file Put all rejects into file (even with --dry-run).", "", " -d DIR --directory=DIR Change the working directory to DIR first.", #if HAVE_SETMODE @@ -780,6 +792,8 @@ set_quoting_style ((struct quoting_options *) 0, (enum quoting_style) i); } + case CHAR_MAX+9: + global_reject = savestr (optarg); break; default: usage (stderr, 2); @@ -932,7 +946,7 @@ /* We did not find the pattern, dump out the hunk so they can handle it. */ static void -abort_hunk (void) +abort_hunk (char *name) { register LINENUM i; register LINENUM pat_end = pch_end (); @@ -946,7 +960,7 @@ char const *minuses = (int) NEW_CONTEXT_DIFF <= (int) diff_type ? " ----" : " -----"; - fprintf(rejfp, "***************\n"); + fprintf(rejfp, "*************** %s\n", name ? name : ""); for (i=0; i<=pat_end; i++) { char numbuf0[LINENUM_LENGTH_BOUND + 1]; char numbuf1[LINENUM_LENGTH_BOUND + 1]; diff -ur patch-2.5.4/util.c patch-2.5.4-hacked/util.c --- patch-2.5.4/util.c Fri May 4 16:55:41 2001 +++ patch-2.5.4-hacked/util.c Fri May 4 16:55:13 2001 @@ -209,7 +209,9 @@ mode &= ~ (S_IXUSR | S_IXGRP | S_IXOTH); if (! (O_CREAT && O_TRUNC)) close (creat (file, mode)); - fd = open (file, O_CREAT | O_TRUNC | open_flags, mode); + if (!(open_flags & O_APPEND)) + open_flags |= O_CREAT | O_TRUNC; + fd = open (file, open_flags, mode); if (fd < 0) pfatal ("Can't create file %s", quotearg (file)); return fd;