dos2unix: tiny shrink
login,su: fix setup_environment() so that it works as intended
          (parameter names were a bit misleading)
fdisk: shrink
help text: shrink

function                                             old     new   delta
login_main                                          1658    1701     +43
setup_environment                                    206     203      -3
dos_compatible_flag                                    4       1      -3
dos2unix_main                                        383     375      -8
get_boot                                            1724    1702     -22
fdisk_main                                          2949    2889     -60
packed_usage                                       24250   23948    -302
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/6 up/down: 43/-398)          Total: -355 bytes
   text    data     bss     dec     hex filename
 798768     661    7428  806857   c4fc9 busybox_old
 798327     658    7428  806413   c4e0d busybox_unstripped

diff --git a/util-linux/fdisk.c b/util-linux/fdisk.c
index 827ea21..a75b4f8 100644
--- a/util-linux/fdisk.c
+++ b/util-linux/fdisk.c
@@ -318,6 +318,23 @@
 } while (0)
 
 
+/* TODO: move to libbb? */
+static ullong bb_BLKGETSIZE_sectors(void)
+{
+	uint64_t v64;
+	unsigned long longsectors;
+
+	if (ioctl(fd, BLKGETSIZE64, &v64) == 0) {
+		/* got bytes, convert to 512 byte sectors */
+		return (v64 >> 9);
+	}
+	/* Needs temp of type long */
+	if (ioctl(fd, BLKGETSIZE, &longsectors))
+		longsectors = 0;
+	return longsectors;
+}
+
+
 #define IS_EXTENDED(i) \
 	((i) == EXTENDED || (i) == WIN98_EXTENDED || (i) == LINUX_EXTENDED)
 
@@ -624,12 +641,12 @@
 /* normally O_RDWR, -l option gives O_RDONLY */
 static int type_open = O_RDWR;
 
-static int ext_index;               /* the prime extended partition */
-static smallint listing;                 /* no aborts for fdisk -l */
-static int dos_compatible_flag = ~0;
+static int ext_index;                   /* the prime extended partition */
+static smallint listing;                /* no aborts for fdisk -l */
+static smallint dos_compatible_flag = 1;
 #if ENABLE_FEATURE_FDISK_WRITABLE
 //static int dos_changed;
-static smallint nowarn;            /* no warnings for fdisk -l/-s */
+static smallint nowarn;                 /* no warnings for fdisk -l/-s */
 #endif
 
 static unsigned user_cylinders, user_heads, user_sectors;
@@ -1184,7 +1201,6 @@
 get_geometry(void)
 {
 	int sec_fac;
-	uint64_t v64;
 
 	get_sectorsize();
 	sec_fac = sector_size / 512;
@@ -1204,15 +1220,7 @@
 	g_sectors = user_sectors ? user_sectors :
 		pt_sectors ? pt_sectors :
 		kern_sectors ? kern_sectors : 63;
-	if (ioctl(fd, BLKGETSIZE64, &v64) == 0) {
-		/* got bytes, convert to 512 byte sectors */
-		total_number_of_sectors = (v64 >> 9);
-	} else {
-		unsigned long longsectors; /* need temp of type long */
-		if (ioctl(fd, BLKGETSIZE, &longsectors))
-			longsectors = 0;
-		total_number_of_sectors = longsectors;
-	}
+	total_number_of_sectors = bb_BLKGETSIZE_sectors();
 
 	sector_offset = 1;
 	if (dos_compatible_flag)
@@ -1576,7 +1584,7 @@
 static void
 toggle_dos_compatibility_flag(void)
 {
-	dos_compatible_flag = ~dos_compatible_flag;
+	dos_compatible_flag = 1 - dos_compatible_flag;
 	if (dos_compatible_flag) {
 		sector_offset = g_sectors;
 		printf("DOS Compatibility flag is set\n");
@@ -2732,7 +2740,8 @@
 		if (sscanf(line, " %d %d %d %[^\n ]",
 				&ma, &mi, &sz, ptname) != 4)
 			continue;
-		for (s = ptname; *s; s++);
+		for (s = ptname; *s; s++)
+			continue;
 		if (isdigit(s[-1]))
 			continue;
 		sprintf(devname, "/dev/%s", ptname);
@@ -2798,28 +2807,19 @@
 	if (opt & OPT_u)
 		display_in_cyl_units = 0; // -u
 
-	if (user_set_sector_size && argc != 1)
-		printf("Warning: the -b (set sector size) option should"
-			 " be used with one specified device\n");
-
 #if ENABLE_FEATURE_FDISK_WRITABLE
 	if (opt & OPT_l) {
 		nowarn = 1;
 #endif
 		type_open = O_RDONLY;
-		if (argc > 0) {
-			int k;
-#if defined(__GNUC__)
-			/* avoid gcc warning:
-			   variable `k' might be clobbered by `longjmp' */
-			(void)&k;
-#endif
+		if (*argv) {
 			listing = 1;
-			for (k = 0; k < argc; k++)
-				trydev(argv[k], 1);
+			do {
+				trydev(*argv, 1);
+			} while (*++argv);
 		} else {
-			/* we no longer have default device names */
-			/* but, we can use /proc/partitions instead */
+			/* we don't have device names, */
+			/* use /proc/partitions instead */
 			tryprocpt();
 		}
 		return 0;
@@ -2829,27 +2829,20 @@
 
 #if ENABLE_FEATURE_FDISK_BLKSIZE
 	if (opt & OPT_s) {
-		long size;
 		int j;
 
 		nowarn = 1;
-		type_open = O_RDONLY;
-
 		if (argc <= 0)
 			bb_show_usage();
-
 		for (j = 0; j < argc; j++) {
-			disk_device = argv[j];
-			fd = open(disk_device, type_open);
-			if (fd < 0)
-				fdisk_fatal(unable_to_open);
-			if (ioctl(fd, BLKGETSIZE, &size))
-				fdisk_fatal(ioctl_error);
+			unsigned long long size;
+			fd = xopen(argv[j], O_RDONLY);
+			size = bb_BLKGETSIZE_sectors() / 2;
 			close(fd);
 			if (argc == 1)
-				printf("%ld\n", size/2);
+				printf("%lld\n", size);
 			else
-				printf("%s: %ld\n", argv[j], size/2);
+				printf("%s: %lld\n", argv[j], size);
 		}
 		return 0;
 	}