diff options
-rw-r--r-- | TODO | 4 | ||||
-rw-r--r-- | editors/patch.c | 28 | ||||
-rw-r--r-- | include/usage.h | 8 |
3 files changed, 26 insertions, 14 deletions
@@ -39,8 +39,8 @@ fuser Would be nice. The basic susv3 options, plus fuser -k. --- patch - should have -i support, and simple fuzz factor support to apply patches - at an offset shouldn't take up too much space. + should have simple fuzz factor support to apply patches at an offset which + shouldn't take up too much space. --- man It would be nice to have a man command. Not one that handles troff or diff --git a/editors/patch.c b/editors/patch.c index 6a68d2ef8..59b70210f 100644 --- a/editors/patch.c +++ b/editors/patch.c @@ -107,14 +107,24 @@ extern int patch_main(int argc, char **argv) { unsigned int patch_level = -1; char *patch_line; - int ret = 0; + int ret; + FILE *patch_file = NULL; - /* Handle 'p' option */ - if (argv[1] && (argv[1][0] == '-') && (argv[1][1] == 'p')) { - patch_level = atoi(&argv[1][2]); + { + char *p, *i; + ret = bb_getopt_ulflags(argc, argv, "p:i:", &p, &i); + if (ret & 1) + patch_level = bb_xgetularg10_bnd(p, -1, USHRT_MAX); + if (ret & 2) { + patch_file = bb_xfopen(i, "r"); + } + ret = 0; } - patch_line = bb_get_line_from_file(stdin); + if (!patch_file) + patch_file = stdin; + + patch_line = bb_get_line_from_file(patch_file); while (patch_line) { FILE *src_stream; FILE *dst_stream; @@ -133,14 +143,14 @@ extern int patch_main(int argc, char **argv) */ while (patch_line && strncmp(patch_line, "--- ", 4) != 0) { free(patch_line); - patch_line = bb_get_line_from_file(stdin); + patch_line = bb_get_line_from_file(patch_file); } /* Extract the filename used before the patch was generated */ original_filename = extract_filename(patch_line, patch_level); free(patch_line); - patch_line = bb_get_line_from_file(stdin); + patch_line = bb_get_line_from_file(patch_file); if (strncmp(patch_line, "+++ ", 4) != 0) { ret = 2; bb_error_msg("Invalid patch"); @@ -183,7 +193,7 @@ extern int patch_main(int argc, char **argv) printf("patching file %s\n", new_filename); /* Handle each hunk */ - patch_line = bb_get_line_from_file(stdin); + patch_line = bb_get_line_from_file(patch_file); while (patch_line) { unsigned int count; unsigned int src_beg_line; @@ -214,7 +224,7 @@ extern int patch_main(int argc, char **argv) } hunk_offset_start = src_cur_line; - while ((patch_line = bb_get_line_from_file(stdin)) != NULL) { + while ((patch_line = bb_get_line_from_file(patch_file)) != NULL) { if ((*patch_line == '-') || (*patch_line == ' ')) { char *src_line = NULL; if (src_stream) { diff --git a/include/usage.h b/include/usage.h index 662227818..9227025b2 100644 --- a/include/usage.h +++ b/include/usage.h @@ -2064,11 +2064,13 @@ "\t-u\tUnlocks (re-enables) the specified user account" #define patch_trivial_usage \ - "[-p<num>]" + "[-p<num>] [-i<patch.diff>]" #define patch_full_usage \ - "[-p<num>]" + "[-p<num>]\n" \ + "[-i<diff>]" #define patch_example_usage \ - "$ patch -p1 <example.diff" + "$ patch -p1 <example.diff\n" \ + "$ patch -p0 -i example.diff" #define pidof_trivial_usage \ "process-name [OPTION] [process-name ...]" |