# HG changeset patch # User Rob Landley # Date 1329198213 21600 # Node ID 3947b397c328bd3003fae6492a202821d4e375ec # Parent ca74293f87f1994b8edbf3b71ed0cbf5b4feed47 Teach ln about multiple arguments. diff -r ca74293f87f1 -r 3947b397c328 toys/ln.c --- a/toys/ln.c Mon Feb 13 22:57:30 2012 -0600 +++ b/toys/ln.c Mon Feb 13 23:43:33 2012 -0600 @@ -6,18 +6,19 @@ * * See http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ln.html -USE_LN(NEWTOY(ln, "fs", TOYFLAG_BIN)) +USE_LN(NEWTOY(ln, "<1fs", TOYFLAG_BIN)) config LN bool "ln" - default n + default y help - usage: ln [-s] [-f] file1 file2 + usage: ln [-sf] [FROM...] TO - Create a link from file2 to file1 + Create a link between FROM and TO. + With only one argument, create link in current directory. -s Create a symbolic link - -f Force the creation of the link, even if file2 already exists + -f Force the creation of the link, even if TO already exists */ #include "toys.h" @@ -27,22 +28,40 @@ void ln_main(void) { - char *file1 = toys.optargs[0], *file2 = toys.optargs[1]; + char *dest = toys.optargs[--toys.optc], *new; + struct stat buf; + int i; + + // With one argument, create link in current directory. + if (!toys.optc) { + toys.optc++; + dest="."; + } + + // Is destination a directory? + if (stat(dest, &buf) || !S_ISDIR(buf.st_mode)) { + if (toys.optc>1) error_exit("'%s' not a directory"); + buf.st_mode = 0; + } - /* FIXME: How do we print out the usage info? */ - if (!file1 || !file2) - perror_exit("Usage: ln [-s] [-f] file1 file2"); - /* Silently unlink the existing target. If it doesn't exist, - * then we just move on */ - if (toys.optflags & FLAG_f) - unlink(file2); - if (toys.optflags & FLAG_s) { - if (symlink(file1, file2)) - perror_exit("cannot create symbolic link from %s to %s", - file1, file2); - } else { - if (link(file1, file2)) - perror_exit("cannot create hard link from %s to %s", - file1, file2); + for (i=0; i