Changeset 1765 in MondoRescue for branches/2.2.5/mindi-busybox/coreutils/ln.c


Ignore:
Timestamp:
Nov 4, 2007, 3:16:40 AM (16 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/coreutils/ln.c

    r821 r1765  
    55 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org>
    66 *
    7  * This program is free software; you can redistribute it and/or modify
    8  * it under the terms of the GNU General Public License as published by
    9  * the Free Software Foundation; either version 2 of the License, or
    10  * (at your option) any later version.
    11  *
    12  * This program is distributed in the hope that it will be useful,
    13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
    14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
    15  * General Public License for more details.
    16  *
    17  * You should have received a copy of the GNU General Public License
    18  * along with this program; if not, write to the Free Software
    19  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
    20  *
     7 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
    218 */
    229
     
    2512/* http://www.opengroup.org/onlinepubs/007904975/utilities/ln.html */
    2613
    27 #include <stdio.h>
    28 #include <stdlib.h>
    29 #include <unistd.h>
    30 #include <errno.h>
    31 #include "busybox.h"
     14#include "libbb.h"
     15
     16/* This is a NOEXEC applet. Be very careful! */
     17
    3218
    3319#define LN_SYMLINK          1
     
    3723#define LN_SUFFIX           16
    3824
     25int ln_main(int argc, char **argv);
    3926int ln_main(int argc, char **argv)
    4027{
     
    4431    char *src_name;
    4532    char *src;
    46     char *suffix = "~";
     33    char *suffix = (char*)"~";
    4734    struct stat statbuf;
    4835    int (*link_func)(const char *, const char *);
    4936
    50     flag = bb_getopt_ulflags(argc, argv, "sfnbS:", &suffix);
     37    flag = getopt32(argv, "sfnbS:", &suffix);
    5138
    5239    if (argc == optind) {
     
    5946    if (argc == optind + 1) {
    6047        *--argv = last;
    61         last = bb_get_last_path_component(bb_xstrdup(last));
     48        last = bb_get_last_path_component(xstrdup(last));
    6249    }
    6350
     
    6754
    6855        if (is_directory(src,
    69                          (flag & LN_NODEREFERENCE) ^ LN_NODEREFERENCE,
    70                          NULL)) {
    71             src_name = bb_xstrdup(*argv);
     56                        (flag & LN_NODEREFERENCE) ^ LN_NODEREFERENCE,
     57                        NULL)
     58        ) {
     59            src_name = xstrdup(*argv);
    7260            src = concat_path_file(src, bb_get_last_path_component(src_name));
    7361            free(src_name);
     
    7563        }
    7664        if (!(flag & LN_SYMLINK) && stat(*argv, &statbuf)) {
    77             bb_perror_msg("%s", *argv);
    78             status = EXIT_FAILURE;
    79             free(src_name);
    80             continue;
     65            // coreutils: "ln dangling_symlink new_hardlink" works
     66            if (lstat(*argv, &statbuf) || !S_ISLNK(statbuf.st_mode)) {
     67                bb_perror_msg("%s", *argv);
     68                status = EXIT_FAILURE;
     69                free(src_name);
     70                continue;
     71            }
    8172        }
    8273
    8374        if (flag & LN_BACKUP) {
    84                 char *backup;
    85                 backup = bb_xasprintf("%s%s", src, suffix);
    86                 if (rename(src, backup) < 0 && errno != ENOENT) {
    87                         bb_perror_msg("%s", src);
    88                         status = EXIT_FAILURE;
    89                         free(backup);
    90                         continue;
    91                 }
     75            char *backup;
     76            backup = xasprintf("%s%s", src, suffix);
     77            if (rename(src, backup) < 0 && errno != ENOENT) {
     78                bb_perror_msg("%s", src);
     79                status = EXIT_FAILURE;
    9280                free(backup);
    93                 /*
    94                  * When the source and dest are both hard links to the same
    95                  * inode, a rename may succeed even though nothing happened.
    96                  * Therefore, always unlink().
    97                  */
    98                 unlink(src);
     81                continue;
     82            }
     83            free(backup);
     84            /*
     85             * When the source and dest are both hard links to the same
     86             * inode, a rename may succeed even though nothing happened.
     87             * Therefore, always unlink().
     88             */
     89            unlink(src);
    9990        } else if (flag & LN_FORCE) {
    10091            unlink(src);
Note: See TracChangeset for help on using the changeset viewer.