Changeset 1765 in MondoRescue for branches/2.2.5/mindi-busybox/editors/patch.c


Ignore:
Timestamp:
Nov 4, 2007, 3:16:40 AM (17 years ago)
Author:
Bruno Cornec
Message:

Update to busybox 1.7.2

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/2.2.5/mindi-busybox/editors/patch.c

    r821 r1765  
    1616 *  Issues
    1717 *   - Non-interactive
    18  *   - Patches must apply cleanly or the hunk will fail.
     18 *   - Patches must apply cleanly or patch (not just one hunk) will fail.
    1919 *   - Reject file isnt saved
    20  *   -
    2120 */
    2221
    2322#include <getopt.h>
    24 #include <string.h>
    25 #include <stdlib.h>
    26 #include <unistd.h>
    27 #include "busybox.h"
     23
     24#include "libbb.h"
    2825
    2926static unsigned int copy_lines(FILE *src_stream, FILE *dest_stream, const unsigned int lines_count)
     
    3330    while (src_stream && (i < lines_count)) {
    3431        char *line;
    35         line = bb_get_line_from_file(src_stream);
     32        line = xmalloc_fgets(src_stream);
    3633        if (line == NULL) {
    3734            break;
    3835        }
    3936        if (fputs(line, dest_stream) == EOF) {
    40             bb_perror_msg_and_die("Error writing to new file");
     37            bb_perror_msg_and_die("error writing to new file");
    4138        }
    4239        free(line);
     
    4441        i++;
    4542    }
    46     return(i);
     43    return i;
    4744}
    4845
     
    5956
    6057    /* Terminate string at end of source filename */
    61     temp = strchr(filename_start_ptr, '\t');
    62     if (temp) *temp = 0;
    63 
    64     /* skip over (patch_level) number of leading directories */
     58    temp = strchrnul(filename_start_ptr, '\t');
     59    *temp = '\0';
     60
     61    /* Skip over (patch_level) number of leading directories */
     62    if (patch_level == -1)
     63        patch_level = INT_MAX;
    6564    for (i = 0; i < patch_level; i++) {
    66         if(!(temp = strchr(filename_start_ptr, '/'))) break;
     65        temp = strchr(filename_start_ptr, '/');
     66        if (!temp)
     67            break;
    6768        filename_start_ptr = temp + 1;
    6869    }
    6970
    70     return(bb_xstrdup(filename_start_ptr));
     71    return xstrdup(filename_start_ptr);
    7172}
    7273
     
    7475{
    7576    struct stat statbuf;
    76     return(stat(filename, &statbuf));
    77 }
    78 
     77    return stat(filename, &statbuf);
     78}
     79
     80int patch_main(int argc, char **argv);
    7981int patch_main(int argc, char **argv)
    8082{
     
    8688    {
    8789        char *p, *i;
    88         ret = bb_getopt_ulflags(argc, argv, "p:i:", &p, &i);
     90        ret = getopt32(argv, "p:i:", &p, &i);
    8991        if (ret & 1)
    90             patch_level = bb_xgetlarg(p, 10, -1, USHRT_MAX);
     92            patch_level = xatol_range(p, -1, USHRT_MAX);
    9193        if (ret & 2) {
    92             patch_file = bb_xfopen(i, "r");
     94            patch_file = xfopen(i, "r");
    9395        } else {
    9496            patch_file = stdin;
     
    9799    }
    98100
    99     patch_line = bb_get_line_from_file(patch_file);
     101    patch_line = xmalloc_getline(patch_file);
    100102    while (patch_line) {
    101103        FILE *src_stream;
     
    116118        while (patch_line && strncmp(patch_line, "--- ", 4) != 0) {
    117119            free(patch_line);
    118             patch_line = bb_get_line_from_file(patch_file);
    119         }
     120            patch_line = xmalloc_getline(patch_file);
     121        }
     122        /* FIXME: patch_line NULL check?? */
    120123
    121124        /* Extract the filename used before the patch was generated */
     
    123126        free(patch_line);
    124127
    125         patch_line = bb_get_line_from_file(patch_file);
     128        patch_line = xmalloc_getline(patch_file);
     129        /* FIXME: NULL check?? */
    126130        if (strncmp(patch_line, "+++ ", 4) != 0) {
    127131            ret = 2;
    128             bb_error_msg("Invalid patch");
     132            bb_error_msg("invalid patch");
    129133            continue;
    130134        }
     
    141145                *line_ptr = '/';
    142146            }
    143             dst_stream = bb_xfopen(new_filename, "w+");
     147            dst_stream = xfopen(new_filename, "w+");
    144148            backup_filename = NULL;
    145149        } else {
     
    148152            strcat(backup_filename, ".orig");
    149153            if (rename(new_filename, backup_filename) == -1) {
    150                 bb_perror_msg_and_die("Couldnt create file %s",
     154                bb_perror_msg_and_die("cannot create file %s",
    151155                        backup_filename);
    152156            }
    153             dst_stream = bb_xfopen(new_filename, "w");
     157            dst_stream = xfopen(new_filename, "w");
    154158        }
    155159
     
    158162        } else {
    159163            if (strcmp(original_filename, new_filename) == 0) {
    160                 src_stream = bb_xfopen(backup_filename, "r");
     164                src_stream = xfopen(backup_filename, "r");
    161165            } else {
    162                 src_stream = bb_xfopen(original_filename, "r");
     166                src_stream = xfopen(original_filename, "r");
    163167            }
    164168        }
     
    167171
    168172        /* Handle each hunk */
    169         patch_line = bb_get_line_from_file(patch_file);
     173        patch_line = xmalloc_fgets(patch_file);
    170174        while (patch_line) {
    171175            unsigned int count;
     
    190194                count = src_beg_line - src_cur_line;
    191195                if (copy_lines(src_stream, dst_stream, count) != count) {
    192                     bb_error_msg_and_die("Bad src file");
     196                    bb_error_msg_and_die("bad src file");
    193197                }
    194198                src_cur_line += count;
     
    198202            hunk_offset_start = src_cur_line;
    199203
    200             while ((patch_line = bb_get_line_from_file(patch_file)) != NULL) {
     204            while ((patch_line = xmalloc_fgets(patch_file)) != NULL) {
    201205                if ((*patch_line == '-') || (*patch_line == ' ')) {
    202206                    char *src_line = NULL;
    203207                    if (src_stream) {
    204                         src_line = bb_get_line_from_file(src_stream);
     208                        src_line = xmalloc_fgets(src_stream);
    205209                        if (!src_line) {
    206210                            hunk_error++;
     
    210214                        }
    211215                        if (strcmp(src_line, patch_line + 1) != 0) {
    212                             bb_error_msg("Hunk #%d FAILED at %d.", hunk_count, hunk_offset_start);
     216                            bb_error_msg("hunk #%d FAILED at %d", hunk_count, hunk_offset_start);
    213217                            hunk_error++;
    214218                            free(patch_line);
     219                            /* Probably need to find next hunk, etc... */
     220                            /* but for now we just bail out */
     221                            patch_line = NULL;
    215222                            break;
    216223                        }
     
    256263            if ((dest_cur_line == 0) || (dest_beg_line == 0)) {
    257264                /* The new patched file is empty, remove it */
    258                 if (unlink(new_filename) == -1) {
    259                     bb_perror_msg_and_die("Couldnt remove file %s", new_filename);
    260                 }
    261                 if (unlink(original_filename) == -1) {
    262                     bb_perror_msg_and_die("Couldnt remove original file %s", new_filename);
    263                 }
     265                xunlink(new_filename);
     266                if (strcmp(new_filename, original_filename) != 0)
     267                    xunlink(original_filename);
    264268            }
    265269        }
     
    270274     * 2 = More serious problems
    271275     */
    272     return(ret);
    273 }
     276    return ret;
     277}
Note: See TracChangeset for help on using the changeset viewer.