if (strncmp(line, pat, 4) == 0) {
/* Terminate string at end of source filename */
- line[strcspn(line,"\t\n\r")] = '\0';
+ line[strcspn(line, "\t\n\r")] = '\0';
/* Skip over (patch_level) number of leading directories */
while (patch_level--) {
}
int patch_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
-int patch_main(int argc ATTRIBUTE_UNUSED, char **argv)
+int patch_main(int argc UNUSED_PARAM, char **argv)
{
struct stat saved_stat;
char *patch_line;
int patch_level;
int ret = 0;
char plus = '+';
+ unsigned opt;
+ enum {
+ OPT_R = (1 << 2),
+ OPT_N = (1 << 3),
+ };
xfunc_error_retval = 2;
{
const char *p = "-1";
const char *i = "-"; /* compat */
- if (getopt32(argv, "p:i:R", &p, &i) & 4)
+ opt = getopt32(argv, "p:i:RN", &p, &i);
+ if (opt & OPT_R)
plus = '-';
patch_level = xatoi(p); /* can be negative! */
patch_file = xfopen_stdin(i);
}
- patch_line = xmalloc_getline(patch_file);
+ patch_line = xmalloc_fgetline(patch_file);
while (patch_line) {
FILE *src_stream;
FILE *dst_stream;
/* Extract the filename used before the patch was generated */
new_filename = extract_filename(patch_line, patch_level, "--- ");
// was old_filename above
- patch_line = xmalloc_getline(patch_file);
+ patch_line = xmalloc_fgetline(patch_file);
if (!patch_line) goto quit;
} while (!new_filename);
free(new_filename); // "source" filename is irrelevant
} else {
backup_filename = xasprintf("%s.orig", new_filename);
xrename(new_filename, backup_filename);
- src_stream = xfopen(backup_filename, "r");
+ src_stream = xfopen_for_read(backup_filename);
}
- dst_stream = xfopen(new_filename, "w");
+ dst_stream = xfopen_for_write(new_filename);
fchmod(fileno(dst_stream), saved_stat.st_mode);
printf("patching file %s\n", new_filename);
src_line = NULL;
}
}
+ /* Do not patch an already patched hunk with -N */
+ if (src_line == 0 && (opt & OPT_N)) {
+ continue;
+ }
if (!src_line) {
bb_error_msg("hunk #%u FAILED at %u", hunk_count, hunk_offset_start);
bad_hunk_count++;