ls: do not follow links with -s (closes bug 33),
 display unsigned data with %XXu, not %XXd.

diff --git a/coreutils/ls.c b/coreutils/ls.c
index f4e71bc..8aa0550 100644
--- a/coreutils/ls.c
+++ b/coreutils/ls.c
@@ -604,16 +604,16 @@
 	for (i = 0; i <= 31; i++) {
 		switch (all_fmt & (1 << i)) {
 		case LIST_INO:
-			column += printf("%7ld ", (long) dn->dstat.st_ino);
+			column += printf("%7lu ", (long) dn->dstat.st_ino);
 			break;
 		case LIST_BLOCKS:
-			column += printf("%4"OFF_FMT"d ", (off_t) dn->dstat.st_blocks >> 1);
+			column += printf("%4"OFF_FMT"u ", (off_t) dn->dstat.st_blocks >> 1);
 			break;
 		case LIST_MODEBITS:
 			column += printf("%-10s ", (char *) bb_mode_string(dn->dstat.st_mode));
 			break;
 		case LIST_NLINKS:
-			column += printf("%4ld ", (long) dn->dstat.st_nlink);
+			column += printf("%4lu ", (long) dn->dstat.st_nlink);
 			break;
 		case LIST_ID_NAME:
 #if ENABLE_FEATURE_LS_USERNAME
@@ -624,19 +624,19 @@
 			break;
 #endif
 		case LIST_ID_NUMERIC:
-			column += printf("%-8d %-8d", dn->dstat.st_uid, dn->dstat.st_gid);
+			column += printf("%-8u %-8u", dn->dstat.st_uid, dn->dstat.st_gid);
 			break;
 		case LIST_SIZE:
 		case LIST_DEV:
 			if (S_ISBLK(dn->dstat.st_mode) || S_ISCHR(dn->dstat.st_mode)) {
-				column += printf("%4d, %3d ", (int) major(dn->dstat.st_rdev),
+				column += printf("%4u, %3u ", (int) major(dn->dstat.st_rdev),
 					   (int) minor(dn->dstat.st_rdev));
 			} else {
 				if (all_fmt & LS_DISP_HR) {
 					column += printf("%9s ",
 						make_human_readable_str(dn->dstat.st_size, 1, 0));
 				} else {
-					column += printf("%9"OFF_FMT"d ", (off_t) dn->dstat.st_size);
+					column += printf("%9"OFF_FMT"u ", (off_t) dn->dstat.st_size);
 				}
 			}
 			break;
@@ -683,7 +683,7 @@
 			errno = 0;
 #if ENABLE_FEATURE_LS_COLOR
 			if (show_color && !lstat(dn->fullname, &info)) {
-				printf("\033[%d;%dm", bgcolor(info.st_mode),
+				printf("\033[%u;%um", bgcolor(info.st_mode),
 						fgcolor(info.st_mode));
 			}
 #endif
@@ -710,7 +710,7 @@
 #if ENABLE_FEATURE_LS_COLOR
 				if (show_color) {
 					errno = 0;
-					printf("\033[%d;%dm", bgcolor(info.st_mode),
+					printf("\033[%u;%um", bgcolor(info.st_mode),
 						   fgcolor(info.st_mode));
 				}
 #endif
@@ -932,8 +932,8 @@
 	dn = NULL;
 	nfiles = 0;
 	do {
-		/* ls w/o -l follows links on command line */
-		cur = my_stat(*argv, *argv, !(all_fmt & STYLE_LONG));
+		/* NB: follow links on command line unless -l or -s */
+		cur = my_stat(*argv, *argv, !(all_fmt & (STYLE_LONG|LIST_BLOCKS)));
 		argv++;
 		if (!cur)
 			continue;