1 /* `ln' program to create links between files.
2 Copyright (C) 1986, 1989-1991, 1995-2006 Free Software Foundation, Inc.
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2, or (at your option)
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software Foundation,
16 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
18 /* Written by Mike Parker and David MacKenzie. */
22 #include <sys/types.h>
27 #include "backupfile.h"
30 #include "filenamecat.h"
34 /* The official name of this program (e.g., no `g' prefix). */
35 #define PROGRAM_NAME "ln"
37 #define AUTHORS "Mike Parker", "David MacKenzie"
39 #ifndef ENABLE_HARD_LINK_TO_SYMLINK_WARNING
40 # define ENABLE_HARD_LINK_TO_SYMLINK_WARNING 0
43 /* In being careful not even to try to make hard links to directories,
44 we have to know whether link(2) follows symlinks. If it does, then
45 we have to *stat* the `source' to see if the resulting link would be
46 to a directory. Otherwise, we have to use *lstat* so that we allow
47 users to make hard links to symlinks-that-point-to-directories. */
49 #if LINK_FOLLOWS_SYMLINKS
50 # define STAT_LIKE_LINK(File, Stat_buf) \
53 # define STAT_LIKE_LINK(File, Stat_buf) \
54 lstat (File, Stat_buf)
57 /* The name by which the program was run, for error messages. */
61 static enum backup_type backup_type;
63 /* If true, make symbolic links; otherwise, make hard links. */
64 static bool symbolic_link;
66 /* If true, ask the user before removing existing files. */
67 static bool interactive;
69 /* If true, remove existing files unconditionally. */
70 static bool remove_existing_files;
72 /* If true, list each file as it is moved. */
75 /* If true, allow the superuser to *attempt* to make hard links
76 to directories. However, it appears that this option is not useful
77 in practice, since even the superuser is prohibited from hard-linking
78 directories on most (all?) existing systems. */
79 static bool hard_dir_link;
81 /* If nonzero, and the specified destination is a symbolic link to a
82 directory, treat it just as if it were a directory. Otherwise, the
83 command `ln --force --no-dereference file symlink-to-dir' deletes
84 symlink-to-dir before creating the new link. */
85 static bool dereference_dest_dir_symlinks = true;
87 static struct option const long_options[] =
89 {"backup", optional_argument, NULL, 'b'},
90 {"directory", no_argument, NULL, 'F'},
91 {"no-dereference", no_argument, NULL, 'n'},
92 {"no-target-directory", no_argument, NULL, 'T'},
93 {"force", no_argument, NULL, 'f'},
94 {"interactive", no_argument, NULL, 'i'},
95 {"suffix", required_argument, NULL, 'S'},
96 {"target-directory", required_argument, NULL, 't'},
97 {"symbolic", no_argument, NULL, 's'},
98 {"verbose", no_argument, NULL, 'v'},
99 {GETOPT_HELP_OPTION_DECL},
100 {GETOPT_VERSION_OPTION_DECL},
104 /* FILE is the last operand of this command. Return true if FILE is a
105 directory. But report an error there is a problem accessing FILE,
106 or if FILE does not exist but would have to refer to an existing
107 directory if it referred to anything at all. */
110 target_directory_operand (char const *file)
112 char const *b = last_component (file);
113 size_t blen = strlen (b);
114 bool looks_like_a_dir = (blen == 0 || ISSLASH (b[blen - 1]));
116 int err = ((dereference_dest_dir_symlinks ? stat : lstat) (file, &st) == 0
118 bool is_a_dir = !err && S_ISDIR (st.st_mode);
119 if (err && err != ENOENT)
120 error (EXIT_FAILURE, err, _("accessing %s"), quote (file));
121 if (is_a_dir < looks_like_a_dir)
122 error (EXIT_FAILURE, err, _("target %s is not a directory"), quote (file));
126 /* Make a link DEST to the (usually) existing file SOURCE.
127 Symbolic links to nonexistent files are allowed.
128 Return true if successful. */
131 do_link (const char *source, const char *dest)
133 struct stat source_stats;
134 struct stat dest_stats;
135 char *dest_backup = NULL;
136 bool lstat_ok = false;
137 bool source_is_dir = false;
140 /* Use stat here instead of lstat.
141 On SVR4, link does not follow symlinks, so this check disallows
142 making hard links to symlinks that point to directories. Big deal.
143 On other systems, link follows symlinks, so this check is right. */
146 if (STAT_LIKE_LINK (source, &source_stats) != 0)
148 error (0, errno, _("accessing %s"), quote (source));
152 if (ENABLE_HARD_LINK_TO_SYMLINK_WARNING
153 && S_ISLNK (source_stats.st_mode))
155 error (0, 0, _("%s: warning: making a hard link to a symbolic link\
160 if (S_ISDIR (source_stats.st_mode))
162 source_is_dir = true;
165 error (0, 0, _("%s: hard link not allowed for directory"),
172 if (remove_existing_files || interactive || backup_type != no_backups)
174 lstat_ok = (lstat (dest, &dest_stats) == 0);
175 if (!lstat_ok && errno != ENOENT)
177 error (0, errno, _("accessing %s"), quote (dest));
182 /* If --force (-f) has been specified without --backup, then before
183 making a link ln must remove the destination file if it exists.
184 (with --backup, it just renames any existing destination file)
185 But if the source and destination are the same, don't remove
186 anything and fail right here. */
187 if (remove_existing_files
189 /* Allow `ln -sf --backup k k' to succeed in creating the
190 self-referential symlink, but don't allow the hard-linking
191 equivalent: `ln -f k k' (with or without --backup) to get
192 beyond this point, because the error message you'd get is
194 && (backup_type == no_backups || !symbolic_link)
195 && (!symbolic_link || stat (source, &source_stats) == 0)
196 && SAME_INODE (source_stats, dest_stats)
197 /* The following detects whether removing DEST will also remove
198 SOURCE. If the file has only one link then both are surely
199 the same link. Otherwise check whether they point to the same
200 name in the same directory. */
201 && (source_stats.st_nlink == 1 || same_name (source, dest)))
203 error (0, 0, _("%s and %s are the same file"),
204 quote_n (0, source), quote_n (1, dest));
210 if (S_ISDIR (dest_stats.st_mode))
212 error (0, 0, _("%s: cannot overwrite directory"), quote (dest));
217 fprintf (stderr, _("%s: replace %s? "), program_name, quote (dest));
220 remove_existing_files = true;
223 if (backup_type != no_backups)
225 dest_backup = find_backup_file_name (dest, backup_type);
226 if (rename (dest, dest_backup) != 0)
228 int rename_errno = errno;
231 if (rename_errno != ENOENT)
233 error (0, rename_errno, _("cannot backup %s"), quote (dest));
240 ok = ((symbolic_link ? symlink (source, dest) : link (source, dest))
243 /* If the attempt to create a link failed and we are removing or
244 backing up destinations, unlink the destination and try again.
246 POSIX 1003.1-2004 requires that ln -f A B must unlink B even on
247 failure (e.g., when A does not exist). This is counterintuitive,
248 and we submitted a defect report
249 <http://www.opengroup.org/austin/mailarchives/ag-review/msg01794.html>
250 (2004-06-24). If the committee does not fix the standard we'll
251 have to change the behavior of ln -f, at least if POSIXLY_CORRECT
252 is set. In the meantime ln -f A B will not unlink B unless the
253 attempt to link A to B failed because B already existed.
255 Try to unlink DEST even if we may have backed it up successfully.
256 In some unusual cases (when DEST and DEST_BACKUP are hard-links
257 that refer to the same file), rename succeeds and DEST remains.
258 If we didn't remove DEST in that case, the subsequent LINKFUNC
261 if (!ok && errno == EEXIST && (remove_existing_files || dest_backup))
263 if (unlink (dest) != 0)
265 error (0, errno, _("cannot remove %s"), quote (dest));
270 ok = ((symbolic_link ? symlink (source, dest) : link (source, dest))
279 printf ("%s ~ ", quote (dest_backup));
280 printf ("%s %c> %s\n", quote_n (0, dest), (symbolic_link ? '-' : '='),
281 quote_n (1, source));
288 ? (errno != ENAMETOOLONG && *source
289 ? _("creating symbolic link %s")
290 : _("creating symbolic link %s -> %s"))
291 : (errno == EMLINK && !source_is_dir
292 ? _("creating hard link to %.0s%s")
293 : (errno == EDQUOT || errno == EEXIST || errno == ENOSPC
295 ? _("creating hard link %s")
296 : _("creating hard link %s => %s"))),
297 quote_n (0, dest), quote_n (1, source));
301 if (rename (dest_backup, dest) != 0)
302 error (0, errno, _("cannot un-backup %s"), quote (dest));
313 if (status != EXIT_SUCCESS)
314 fprintf (stderr, _("Try `%s --help' for more information.\n"),
319 Usage: %s [OPTION]... [-T] TARGET LINK_NAME (1st form)\n\
320 or: %s [OPTION]... TARGET (2nd form)\n\
321 or: %s [OPTION]... TARGET... DIRECTORY (3rd form)\n\
322 or: %s [OPTION]... -t DIRECTORY TARGET... (4th form)\n\
324 program_name, program_name, program_name, program_name);
326 In the 1st form, create a link to TARGET with the name LINK_NAME.\n\
327 In the 2nd form, create a link to TARGET in the current directory.\n\
328 In the 3rd and 4th forms, create links to each TARGET in DIRECTORY.\n\
329 Create hard links by default, symbolic links with --symbolic.\n\
330 When creating hard links, each TARGET must exist.\n\
334 Mandatory arguments to long options are mandatory for short options too.\n\
337 --backup[=CONTROL] make a backup of each existing destination file\n\
338 -b like --backup but does not accept an argument\n\
339 -d, -F, --directory allow the superuser to attempt to hard link\n\
340 directories (note: will probably fail due to\n\
341 system restrictions, even for the superuser)\n\
342 -f, --force remove existing destination files\n\
345 -n, --no-dereference treat destination that is a symlink to a\n\
346 directory as if it were a normal file\n\
347 -i, --interactive prompt whether to remove destinations\n\
348 -s, --symbolic make symbolic links instead of hard links\n\
351 -S, --suffix=SUFFIX override the usual backup suffix\n\
352 -t, --target-directory=DIRECTORY specify the DIRECTORY in which to create\n\
354 -T, --no-target-directory treat LINK_NAME as a normal file\n\
355 -v, --verbose print name of each linked file\n\
357 fputs (HELP_OPTION_DESCRIPTION, stdout);
358 fputs (VERSION_OPTION_DESCRIPTION, stdout);
361 The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.\n\
362 The version control method may be selected via the --backup option or through\n\
363 the VERSION_CONTROL environment variable. Here are the values:\n\
367 none, off never make backups (even if --backup is given)\n\
368 numbered, t make numbered backups\n\
369 existing, nil numbered if numbered backups exist, simple otherwise\n\
370 simple, never always make simple backups\n\
372 printf (_("\nReport bugs to <%s>.\n"), PACKAGE_BUGREPORT);
378 main (int argc, char **argv)
382 bool make_backups = false;
383 char *backup_suffix_string;
384 char *version_control_string = NULL;
385 char const *target_directory = NULL;
386 bool no_target_directory = false;
390 initialize_main (&argc, &argv);
391 program_name = argv[0];
392 setlocale (LC_ALL, "");
393 bindtextdomain (PACKAGE, LOCALEDIR);
394 textdomain (PACKAGE);
396 atexit (close_stdout);
398 /* FIXME: consider not calling getenv for SIMPLE_BACKUP_SUFFIX unless
399 we'll actually use backup_suffix_string. */
400 backup_suffix_string = getenv ("SIMPLE_BACKUP_SUFFIX");
402 symbolic_link = remove_existing_files = interactive = verbose
403 = hard_dir_link = false;
405 while ((c = getopt_long (argc, argv, "bdfinst:vFS:T", long_options, NULL))
413 version_control_string = optarg;
417 hard_dir_link = true;
420 remove_existing_files = true;
424 remove_existing_files = false;
428 dereference_dest_dir_symlinks = false;
431 symbolic_link = true;
434 if (target_directory)
435 error (EXIT_FAILURE, 0, _("multiple target directories specified"));
439 if (stat (optarg, &st) != 0)
440 error (EXIT_FAILURE, errno, _("accessing %s"), quote (optarg));
441 if (! S_ISDIR (st.st_mode))
442 error (EXIT_FAILURE, 0, _("target %s is not a directory"),
445 target_directory = optarg;
448 no_target_directory = true;
455 backup_suffix_string = optarg;
457 case_GETOPT_HELP_CHAR;
458 case_GETOPT_VERSION_CHAR (PROGRAM_NAME, AUTHORS);
460 usage (EXIT_FAILURE);
465 n_files = argc - optind;
466 file = argv + optind;
470 error (0, 0, _("missing file operand"));
471 usage (EXIT_FAILURE);
474 if (no_target_directory)
476 if (target_directory)
477 error (EXIT_FAILURE, 0,
478 _("Cannot combine --target-directory "
479 "and --no-target-directory"));
484 _("missing destination file operand after %s"),
487 error (0, 0, _("extra operand %s"), quote (file[2]));
488 usage (EXIT_FAILURE);
491 else if (!target_directory)
494 target_directory = ".";
495 else if (2 <= n_files && target_directory_operand (file[n_files - 1]))
496 target_directory = file[--n_files];
497 else if (2 < n_files)
498 error (EXIT_FAILURE, 0, _("target %s is not a directory"),
499 quote (file[n_files - 1]));
502 if (backup_suffix_string)
503 simple_backup_suffix = xstrdup (backup_suffix_string);
505 backup_type = (make_backups
506 ? xget_version (_("backup type"), version_control_string)
509 if (target_directory)
513 for (i = 0; i < n_files; ++i)
516 char *dest = file_name_concat (target_directory,
517 last_component (file[i]),
519 strip_trailing_slashes (dest_base);
520 ok &= do_link (file[i], dest);
525 ok = do_link (file[0], file[1]);
527 exit (ok ? EXIT_SUCCESS : EXIT_FAILURE);