Another patch from Matt Kraai <kraai@alumni.carnegiemellon.edu>:
>
> The following patch allows ln -n to function like GNU.  It also fixes a
> typo with my previous patch to add support for ln FILE DIRECTORY.  And
> it removes some code that checks the maximum length of the filenames.  I
> can't figure out why that code is necessary.  Anyone know?
>
> Matt
diff --git a/coreutils/ln.c b/coreutils/ln.c
index 3c45dee..71d84f06 100644
--- a/coreutils/ln.c
+++ b/coreutils/ln.c
@@ -92,13 +92,7 @@
 
 	linkName = argv[argc - 1];
 
-	if (strlen(linkName) > BUFSIZ) {
-		fprintf(stderr, name_too_long, "ln");
-		exit FALSE;
-	}
-
-	linkIntoDirFlag = isDirectory(linkName, TRUE, NULL);
-
+	linkIntoDirFlag = isDirectory(linkName, followLinks, NULL);
 	if ((argc >= 3) && linkIntoDirFlag == FALSE) {
 		fprintf(stderr, not_a_directory, "ln", linkName);
 		exit FALSE;
@@ -108,27 +102,8 @@
 		dirName = linkName;
 
 	while (argc-- >= 2) {
-#if 0
-		char srcName[BUFSIZ + 1];
-		int nChars;
-#endif
 		int status;
 
-		if (strlen(*argv) > BUFSIZ) {
-			fprintf(stderr, name_too_long, "ln");
-			exit FALSE;
-		}
-
-#if 0
-		if (followLinks == FALSE) {
-			strcpy(srcName, *argv);
-		} else {
-			/* Warning!  This can silently truncate if > BUFSIZ, but
-			   I don't think that there can be one > BUFSIZ anyway. */
-			nChars = readlink(*argv, srcName, BUFSIZ);
-			srcName[nChars] = '\0';
-		}
-#endif
 		if (linkIntoDirFlag == TRUE) {
 			char *baseName = get_last_path_component(*argv);
 			linkName = (char *)malloc(strlen(dirName)+strlen(baseName)+2);
@@ -155,7 +130,7 @@
 			exit FALSE;
 		}
 
-		if (linkIntoDirFlag)
+		if (linkIntoDirFlag == TRUE)
 			free(linkName);
 
 		argv++;
diff --git a/ln.c b/ln.c
index 3c45dee..71d84f06 100644
--- a/ln.c
+++ b/ln.c
@@ -92,13 +92,7 @@
 
 	linkName = argv[argc - 1];
 
-	if (strlen(linkName) > BUFSIZ) {
-		fprintf(stderr, name_too_long, "ln");
-		exit FALSE;
-	}
-
-	linkIntoDirFlag = isDirectory(linkName, TRUE, NULL);
-
+	linkIntoDirFlag = isDirectory(linkName, followLinks, NULL);
 	if ((argc >= 3) && linkIntoDirFlag == FALSE) {
 		fprintf(stderr, not_a_directory, "ln", linkName);
 		exit FALSE;
@@ -108,27 +102,8 @@
 		dirName = linkName;
 
 	while (argc-- >= 2) {
-#if 0
-		char srcName[BUFSIZ + 1];
-		int nChars;
-#endif
 		int status;
 
-		if (strlen(*argv) > BUFSIZ) {
-			fprintf(stderr, name_too_long, "ln");
-			exit FALSE;
-		}
-
-#if 0
-		if (followLinks == FALSE) {
-			strcpy(srcName, *argv);
-		} else {
-			/* Warning!  This can silently truncate if > BUFSIZ, but
-			   I don't think that there can be one > BUFSIZ anyway. */
-			nChars = readlink(*argv, srcName, BUFSIZ);
-			srcName[nChars] = '\0';
-		}
-#endif
 		if (linkIntoDirFlag == TRUE) {
 			char *baseName = get_last_path_component(*argv);
 			linkName = (char *)malloc(strlen(dirName)+strlen(baseName)+2);
@@ -155,7 +130,7 @@
 			exit FALSE;
 		}
 
-		if (linkIntoDirFlag)
+		if (linkIntoDirFlag == TRUE)
 			free(linkName);
 
 		argv++;