Changeset 1770 in MondoRescue for branches/stable/mindi-busybox/coreutils/ln.c
- Timestamp:
- Nov 6, 2007, 11:01:53 AM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/stable/mindi-busybox/coreutils/ln.c
r821 r1770 5 5 * Copyright (C) 1999-2004 by Erik Andersen <andersen@codepoet.org> 6 6 * 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. 21 8 */ 22 9 … … 25 12 /* http://www.opengroup.org/onlinepubs/007904975/utilities/ln.html */ 26 13 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 32 18 33 19 #define LN_SYMLINK 1 … … 37 23 #define LN_SUFFIX 16 38 24 25 int ln_main(int argc, char **argv); 39 26 int ln_main(int argc, char **argv) 40 27 { … … 44 31 char *src_name; 45 32 char *src; 46 char *suffix = "~";33 char *suffix = (char*)"~"; 47 34 struct stat statbuf; 48 35 int (*link_func)(const char *, const char *); 49 36 50 flag = bb_getopt_ulflags(argc,argv, "sfnbS:", &suffix);37 flag = getopt32(argv, "sfnbS:", &suffix); 51 38 52 39 if (argc == optind) { … … 59 46 if (argc == optind + 1) { 60 47 *--argv = last; 61 last = bb_get_last_path_component( bb_xstrdup(last));48 last = bb_get_last_path_component(xstrdup(last)); 62 49 } 63 50 … … 67 54 68 55 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); 72 60 src = concat_path_file(src, bb_get_last_path_component(src_name)); 73 61 free(src_name); … … 75 63 } 76 64 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 } 81 72 } 82 73 83 74 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; 92 80 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); 99 90 } else if (flag & LN_FORCE) { 100 91 unlink(src);
Note:
See TracChangeset
for help on using the changeset viewer.