use perror_msg instead of perror to print the applet name.
 -Erik
diff --git a/ln.c b/ln.c
index 9dc7f5d..e35bf7a 100644
--- a/ln.c
+++ b/ln.c
@@ -41,42 +41,47 @@
  * linkDestName is where the link points to,
  * linkSrcName is the name of the link to be created.
  */
-static int fs_link(const char *link_DestName, const char *link_SrcName, const int flag)
+static int fs_link(const char *link_destname, const char *link_srcname, 
+		const int flag)
 {
 	int status;
-	int srcIsDir;
-	char *srcName;
+	int src_is_dir;
+	char *src_name;
 
-	if (link_DestName==NULL)
+	if (link_destname==NULL)
 		return(FALSE);
 
-	srcName = (char *) malloc(strlen(link_SrcName)+strlen(link_DestName)+1);
+	src_name = (char *) xmalloc(strlen(link_srcname)+strlen(link_destname)+1);
 
-	if (link_SrcName==NULL)
-		strcpy(srcName, link_DestName);
+	if (link_srcname==NULL)
+		strcpy(src_name, link_destname);
 	else
-		strcpy(srcName, link_SrcName);
+		strcpy(src_name, link_srcname);
 
 	if (flag&LN_NODEREFERENCE)
-		srcIsDir = is_directory(srcName, TRUE, NULL);
+		src_is_dir = is_directory(src_name, TRUE, NULL);
 	else
-		srcIsDir = is_directory(srcName, FALSE, NULL);	
+		src_is_dir = is_directory(src_name, FALSE, NULL);	
 	
-	if ((srcIsDir==TRUE)&&((flag&LN_NODEREFERENCE)==0)) {
-		strcat(srcName, "/");
-		strcat(srcName, link_DestName);
+	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));
+		free(srcdir_name);
 	}
 	
 	if (flag&LN_FORCE)
-		unlink(srcName);
+		unlink(src_name);
 		
 	if (flag&LN_SYMLINK)
-		status = symlink(link_DestName, srcName);
+		status = symlink(link_destname, src_name);
 	else
-		status = link(link_DestName, srcName);
+		status = link(link_destname, src_name);
 
 	if (status != 0) {
-		perror(srcName);
+		perror_msg(src_name);
 		return(FALSE);
 	}
 	return(TRUE);
@@ -104,12 +109,20 @@
 				show_usage();
 		}
 	}
+	if (optind > (argc-1)) {
+		show_usage();
+	} 
+	if (optind == (argc-1)) {
+		if (fs_link(argv[optind], 
+					get_last_path_component(argv[optind]), flag)==FALSE)
+			status = EXIT_FAILURE;
+	}
 	while(optind<(argc-1)) {
 		if (fs_link(argv[optind], argv[argc-1], flag)==FALSE)
 			status = EXIT_FAILURE;
 		optind++;
 	}
-	return(status);
+	exit(status);
 }
 
 /*