Reorganise, make it just one function, remove -v option it didnt work properly anyway...
[oweals/busybox.git] / coreutils / ln.c
index e35bf7a033769ffc4ba2ca57943e89cdda9cf611..427ffcc6ee2d8f7d1447ef4c5021993f35593466 100644 (file)
@@ -2,8 +2,8 @@
 /*
  * Mini ln implementation for busybox
  *
- * Copyright (C) 1999,2000,2001 by Lineo, inc.
- * Written by Erik Andersen <andersen@lineo.com>, <andersee@debian.org>
+ * Copyright (C) 1999,2000 by Lineo, inc. and Erik Andersen
+ * Copyright (C) 1999,2000,2001 by Erik Andersen <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
  *
  */
 
-#include "busybox.h"
-#define BB_DECLARE_EXTERN
-#define bb_need_not_a_directory
-#include "messages.c"
-
 #include <stdio.h>
 #include <dirent.h>
 #include <string.h>
 #include <stdlib.h>
 #include <errno.h>
 #include <unistd.h>
+#include "busybox.h"
+
 
 static const int LN_SYMLINK = 1;
 static const int LN_FORCE = 2;
@@ -46,45 +43,47 @@ static int fs_link(const char *link_destname, const char *link_srcname,
 {
        int status;
        int src_is_dir;
-       char *src_name;
+       char *src_name = 0;
+       const char *src;
 
        if (link_destname==NULL)
                return(FALSE);
 
-       src_name = (char *) xmalloc(strlen(link_srcname)+strlen(link_destname)+1);
-
        if (link_srcname==NULL)
-               strcpy(src_name, link_destname);
+               src = link_destname;
        else
-               strcpy(src_name, link_srcname);
+               src = link_srcname;
 
        if (flag&LN_NODEREFERENCE)
-               src_is_dir = is_directory(src_name, TRUE, NULL);
+               src_is_dir = is_directory(src, TRUE, NULL);
        else
-               src_is_dir = is_directory(src_name, FALSE, NULL);       
+               src_is_dir = is_directory(src, FALSE, NULL);
        
        if ((src_is_dir==TRUE)&&((flag&LN_NODEREFERENCE)==0)) {
                char* srcdir_name;
 
                srcdir_name = xstrdup(link_destname);
-               strcat(src_name, "/");
-               strcat(src_name, get_last_path_component(srcdir_name));
+               src_name = concat_path_file(src, get_last_path_component(srcdir_name));
+               src = src_name;
                free(srcdir_name);
        }
        
        if (flag&LN_FORCE)
-               unlink(src_name);
+               unlink(src);
                
        if (flag&LN_SYMLINK)
-               status = symlink(link_destname, src_name);
+               status = symlink(link_destname, src);
        else
-               status = link(link_destname, src_name);
+               status = link(link_destname, src);
 
        if (status != 0) {
-               perror_msg(src_name);
-               return(FALSE);
+               perror_msg(src);
+               status = FALSE;
+       } else {
+               status = TRUE;
        }
-       return(TRUE);
+       free(src_name);
+       return status;
 }
 
 extern int ln_main(int argc, char **argv)
@@ -122,7 +121,7 @@ extern int ln_main(int argc, char **argv)
                        status = EXIT_FAILURE;
                optind++;
        }
-       exit(status);
+       return status;
 }
 
 /*