Making note of my changes
[oweals/busybox.git] / ln.c
diff --git a/ln.c b/ln.c
index 3e87b579e7e9a0a4fa15ef1d3624aa06fd18f6a4..60fe394386a8a7f7a3441da9e4f6ba8cb0dab6e2 100644 (file)
--- a/ln.c
+++ b/ln.c
@@ -1,52 +1,95 @@
+/*
+ * Mini ln implementation for busybox
+ *
+ *
+ * Copyright (C) 1999 by Lineo, inc.
+ * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ *
+ */
+
 #include "internal.h"
 #include <stdio.h>
-#include <sys/stat.h>
-#include <sys/param.h>
+#include <dirent.h>
 #include <errno.h>
 
-const char     ln_usage[] = "ln [-s] [-f] original-name additional-name\n"
-"\n"
-"\tAdd a new name that refers to the same file as \"original-name\"\n"
-"\n"
-"\t-s:\tUse a \"symbolic\" link, instead of a \"hard\" link.\n"
-"\t-f:\tRemove existing destination files.\n";
 
-int
-ln_fn(const struct FileInfo * i)
+static const char ln_usage[] = "ln [OPTION] TARGET... LINK_NAME|DIRECTORY\n\n"
+"Create a link named LINK_NAME or DIRECTORY to the specified TARGET\n\n"
+"Options:\n"
+"\t-s\tmake symbolic links instead of hard links\n"
+"\t-f\tremove existing destination files\n";
+
+
+static int symlinkFlag = FALSE;
+static int removeoldFlag = FALSE;
+
+
+extern int ln_main(int argc, char **argv)
 {
-       int                             status = 0;
-       char                    d[PATH_MAX];
-       const char *    destination = i->destination;
+    int status;
+    static char* linkName;
 
-       if ( !i->makeSymbolicLink && (i->stat.st_mode & S_IFMT) == S_IFDIR ) {
-               fprintf(stderr, "Please use \"ln -s\" to link directories.\n");
-               return 1;
-       }
+    if (argc < 3) {
+       usage (ln_usage);
+    }
+    argc--;
+    argv++;
 
-       /*
-        * If the destination is a directory, create a file within it.
-        */
-       if ( is_a_directory(i->destination) ) {
-                       destination = join_paths(
-                        d
-                       ,i->destination
-                       ,&i->source[i->directoryLength]);
-       }
+    /* Parse any options */
+    while (**argv == '-') {
+       while (*++(*argv))
+           switch (**argv) {
+           case 's':
+               symlinkFlag = TRUE;
+               break;
+           case 'f':
+               removeoldFlag = TRUE;
+               break;
+           default:
+               usage (ln_usage);
+           }
+       argc--;
+       argv++;
+    }
 
-       if ( i->force )
-               status = ( unlink(destination) && errno != ENOENT );
 
-       if ( status == 0 ) {
-               if ( i->makeSymbolicLink )
-                       status = symlink(i->source, destination);
-               else
-                       status = link(i->source, destination);
-       }
+    linkName = argv[argc - 1];
 
-       if ( status != 0 ) {
-               name_and_error(destination);
-               return 1;
+    if ((argc > 3) && !(isDirectory(linkName))) {
+       fprintf(stderr, "%s: not a directory\n", linkName);
+       exit (FALSE);
+    }
+
+    while (argc-- >= 2) {
+       if (removeoldFlag==TRUE ) {
+           status = ( unlink(linkName) && errno != ENOENT );
+           if ( status != 0 ) {
+               perror(linkName);
+               exit( FALSE);
+           }
        }
+       if ( symlinkFlag==TRUE)
+               status = symlink(*argv, linkName);
        else
-               return 0;
+               status = link(*argv, linkName);
+       if ( status != 0 ) {
+           perror(linkName);
+           exit( FALSE);
+       }
+    }
+    exit( TRUE);
 }