Commit Graph

30 Commits

Author SHA1 Message Date
Michael Forney a211649cfd ln: Only fail if same inode without -f flag 2016-07-09 10:17:16 +01:00
sin 2366164de7 No need for semicolon after ARGEND
This is also the style used in Plan 9.
2015-11-01 10:18:55 +00:00
Eivind Uggedal 9e04a4fcdc ln: allow dangling symlinks 2015-06-07 09:09:42 +01:00
FRIGN 78b285deb6 Fix ln(1) symbolic link handling
This was broken in multiple ways. For instance, the overlay-
check of identical files (name and target) was omitted for
symbolic links for some reason.
While at it, I fixed the stat-handling, improved the error-
messages so the right paths were shown and removed the
illegimite bail-out when the target-fstatat failed (we want
only a warning here as well).
2015-05-29 12:08:37 +01:00
Eivind Uggedal f5f43dbd5b ln: exit non-zero when errors accured 2015-05-08 10:06:58 +01:00
Eivind Uggedal 8f4b2e8689 ln: only check existence of src/to for hardlinks
This allows for creating dangling symlinks with force applied:

    # Before:
    $ ln -sf non-existant target
    ln: stat non-existent: No such file or directory
    $ ls -l target
    ls: lstat target: No such file or directory

    # After:
    $ ln -sf non-existant target
    $ ls -l target
    lrwxrwxrwx    1 eu    users   12 May 08 07:50 target -> non-existent

This also allows creating relative non-dangling symlinks with force applied:

    touch existant; mkdir dir

    # Before
    $ ln -sf ../existant dir
    ln: stat ../existant: No such file or directory
    $ ls -l dir

    # After
    $ ln -sf ../existant dir
    $ ls -l dir
    lrwxrwxrwx    1 eu    users   11 May 08 07:53 existant -> ../existant

The check for whether each src and to pairs are on the same device with the
same inode are only needed for hardlinks so that a forcefull link does
not remove the underlying file:

    touch f; mkdir dir

    # Before:
    $ ln -f f f dir
    ln: f and f are the same file
    $ ls -i f dir/f
    3670611 dir/f
    3670611 f

    # After:
    $ ln -f f f dir
    ln: f and f are the same file
    $ ls -i f dir/f
    4332236 dir/f
    4332236 f
2015-05-08 10:06:58 +01:00
FRIGN ab26b5583e Audit ln(1)
1) Clarify behaviour when the f-flag is given and a target is in its
   own way.
2) Fix usage()-style.
3) Group local variable declarations.
4) reorder args
5) argc style, other boolean style changes
6) improve error messages
7) set argv[argc - 1] to NULL to allow argv-centric loop later
8) BUGFIX: POSIX specifies that when with the f-flag there's a
   situation where a file stands in its own way for linking it
   should be ignored.
9) Add weprintf() where possible, so we don't pussy out when there's
   a small issue. This is sbase ffs!
2015-03-05 21:14:43 +01:00
FRIGN 31572c8b0e Clean up #includes 2015-02-14 21:12:23 +01:00
Hiltjo Posthuma 0e01a2db9b ln: usage, just use %s 2015-01-31 15:23:59 +01:00
FRIGN 00e7f4e38a Add mandoc-manpage for ln(1)
and mark it as finished in the README.
2015-01-26 14:54:22 +01:00
sin d475a6bdf2 Handle ln -sf a foo/ correctly
Previously it would not delete foo/a if it already existed.  Use
unlinkat() instead to do that.
2015-01-22 16:26:30 +00:00
Michael Forney 94ef670b27 ln: Add support for target directories
Also, now that we are using {sym,}linkat, implement the trivial -L and
-P options.
2014-11-23 20:58:15 +00:00
FRIGN ec8246bbc6 Un-boolify sbase
It actually makes the binaries smaller, the code easier to read
(gems like "val == true", "val == false" are gone) and actually
predictable in the sense of that we actually know what we're
working with (one bitwise operator was quite adventurous and
should now be fixed).

This is also more consistent with the other suckless projects
around which don't use boolean types.
2014-11-14 10:54:20 +00:00
FRIGN eee98ed3a4 Fix coding style
It was about damn time. Consistency is very important in such a
big codebase.
2014-11-13 18:08:43 +00:00
sin 353ac69a93 Fix a completely broken ln(1) 2014-10-17 16:08:16 +01:00
sin 0c5b7b9155 Stop using EXIT_{SUCCESS,FAILURE} 2014-10-02 23:46:59 +01:00
Hiltjo Posthuma 81bb8422a5 ln: allow with one argument
Signed-off-by: Hiltjo Posthuma <>
2014-07-21 16:44:06 +01:00
Hiltjo Posthuma 953ebf3573 code style
Signed-off-by: Hiltjo Posthuma <>
2014-06-01 18:02:30 +01:00
sin c6f59aadbd Simplify ln(1) 2014-02-17 11:44:18 +00:00
sin 7309302e25 Don't check remove() return value 2014-02-14 11:49:39 +00:00
sin ac47a21b9b Don't complain if we use -f in ln(1) 2014-02-14 11:25:12 +00:00
sin b5a511dacf Exit with EXIT_SUCCESS/EXIT_FAILURE instead of 0 and 1
Fixed for consistency purposes.
2013-10-07 16:44:22 +01:00
stateless 7216a53a7e Remove unnecessary exit(1) in usage()
Signed-off-by: Christoph Lohmann <>
2013-06-19 19:58:19 +02:00
Christoph Lohmann 4d38f60685 Eliminating the getopt disgrace. 2013-06-14 20:20:47 +02:00
Connor Lane Smith 807d45aa80 ln: try link first 2011-06-22 23:45:03 +01:00
Connor Lane Smith d90ced2047 consistent error check 2011-06-04 12:20:41 +01:00
Connor Lane Smith e565522068 ln -f 2011-06-04 02:56:18 +01:00
Connor Lane Smith f458397d5a no, getopt.h is gnu specific 2011-05-24 18:58:36 +01:00
pancake da547fb294 add missing #include <getopt.h>
do not override CC in
2011-05-24 14:34:26 +02:00
Connor Lane Smith fbb80983ce add ln, util.a 2011-05-24 13:00:30 +01:00