tls: in AES-GCM decoding, avoid memmove
[oweals/busybox.git] / util-linux / fsck_minix.c
index b53c97248981d3b6c3335bf460551f8ea9d8dbbd..c4612f251a6b049e2e138503c1a32c79218aec67 100644 (file)
@@ -13,7 +13,7 @@
  * 10.11.91  -  updated, does checking, no repairs yet.
  *             Sent out to the mailing-list for testing.
  *
- * 14.11.91  - Testing seems to have gone well. Added some
+ * 14.11.91  -  Testing seems to have gone well. Added some
  *             correction-code, and changed some functions.
  *
  * 15.11.91  -  More correction code. Hopefully it notices most
  * 16.11.91  -  More corrections (thanks to Mika Jalava). Most
  *             things seem to work now. Yeah, sure.
  *
- *
- * 19.04.92  - Had to start over again from this old version, as a
+ * 19.04.92  -  Had to start over again from this old version, as a
  *             kernel bug ate my enhanced fsck in february.
  *
- * 28.02.93  - added support for different directory entry sizes..
+ * 28.02.93  -  added support for different directory entry sizes..
  *
  * Sat Mar  6 18:59:42 1993, faith@cs.unc.edu: Output namelen with
  *                           superblock information
  *                           to that required by fsutil
  *
  * Mon Jan  3 11:06:52 1994 - Dr. Wettstein (greg%wind.uucp@plains.nodak.edu)
- *                           Added support for file system valid flag.  Also
- *                           added program_version variable and output of
- *                           program name and version number when program
- *                           is executed.
+ *                            Added support for file system valid flag.  Also
+ *                            added program_version variable and output of
+ *                            program name and version number when program
+ *                            is executed.
  *
- * 30.10.94 - added support for v2 filesystem
- *            (Andreas Schwab, schwab@issan.informatik.uni-dortmund.de)
+ * 30.10.94  - added support for v2 filesystem
+ *             (Andreas Schwab, schwab@issan.informatik.uni-dortmund.de)
  *
- * 10.12.94  -  added test to prevent checking of mounted fs adapted
- *              from Theodore Ts'o's (tytso@athena.mit.edu) e2fsck
- *              program.  (Daniel Quinlan, quinlan@yggdrasil.com)
+ * 10.12.94  - added test to prevent checking of mounted fs adapted
+ *             from Theodore Ts'o's (tytso@athena.mit.edu) e2fsck
+ *             program.  (Daniel Quinlan, quinlan@yggdrasil.com)
  *
  * 01.07.96  - Fixed the v2 fs stuff to use the right #defines and such
- *            for modern libcs (janl@math.uio.no, Nicolai Langfeldt)
+ *             for modern libcs (janl@math.uio.no, Nicolai Langfeldt)
  *
  * 02.07.96  - Added C bit fiddling routines from rmk@ecs.soton.ac.uk
  *             (Russell King).  He made them for ARM.  It would seem
- *            that the ARM is powerful enough to do this in C whereas
+ *             that the ARM is powerful enough to do this in C whereas
  *             i386 and m64k must use assembly to get it fast >:-)
- *            This should make minix fsck system-independent.
- *            (janl@math.uio.no, Nicolai Langfeldt)
+ *             This should make minix fsck system-independent.
+ *             (janl@math.uio.no, Nicolai Langfeldt)
  *
  * 04.11.96  - Added minor fixes from Andreas Schwab to avoid compiler
  *             warnings.  Added mc68k bitops from
- *            Joerg Dorchain <dorchain@mpi-sb.mpg.de>.
+ *             Joerg Dorchain <dorchain@mpi-sb.mpg.de>.
  *
  * 06.11.96  - Added v2 code submitted by Joerg Dorchain, but written by
  *             Andreas Schwab.
  * The device may be a block device or a image of one, but this isn't
  * enforced (but it's not much fun on a character device :-).
  */
+//config:config FSCK_MINIX
+//config:      bool "fsck_minix"
+//config:      default y
+//config:      help
+//config:      The minix filesystem is a nice, small, compact, read-write filesystem
+//config:      with little overhead. It is not a journaling filesystem however and
+//config:      can experience corruption if it is not properly unmounted or if the
+//config:      power goes off in the middle of a write. This utility allows you to
+//config:      check for and attempt to repair any corruption that occurs to a minix
+//config:      filesystem.
+
+//applet:IF_FSCK_MINIX(APPLET_ODDNAME(fsck.minix, fsck_minix, BB_DIR_SBIN, BB_SUID_DROP, fsck_minix))
+
+//kbuild:lib-$(CONFIG_FSCK_MINIX) += fsck_minix.o
 
 //usage:#define fsck_minix_trivial_usage
 //usage:       "[-larvsmf] BLOCKDEV"
 //usage:#define fsck_minix_full_usage "\n\n"
 //usage:       "Check MINIX filesystem\n"
-//usage:     "\nOptions:"
 //usage:     "\n       -l      List all filenames"
 //usage:     "\n       -r      Perform interactive repairs"
 //usage:     "\n       -a      Perform automatic repairs"
@@ -161,7 +173,10 @@ struct globals {
 
        /* Bigger stuff */
        struct termios sv_termios;
-       char superblock_buffer[BLOCK_SIZE];
+       union {
+               char superblock_buffer[BLOCK_SIZE];
+               struct minix_superblock Super;
+       } u;
        char add_zone_ind_blk[BLOCK_SIZE];
        char add_zone_dind_blk[BLOCK_SIZE];
        IF_FEATURE_MINIX2(char add_zone_tind_blk[BLOCK_SIZE];)
@@ -195,7 +210,7 @@ struct globals {
 #define name_depth         (G.name_depth         )
 #define name_component     (G.name_component     )
 #define sv_termios         (G.sv_termios         )
-#define superblock_buffer  (G.superblock_buffer )
+#define superblock_buffer  (G.u.superblock_buffer)
 #define add_zone_ind_blk   (G.add_zone_ind_blk   )
 #define add_zone_dind_blk  (G.add_zone_dind_blk  )
 #define add_zone_tind_blk  (G.add_zone_tind_blk  )
@@ -235,7 +250,7 @@ enum {
 #define Inode1 (((struct minix1_inode *) inode_buffer)-1)
 #define Inode2 (((struct minix2_inode *) inode_buffer)-1)
 
-#define Super (*(struct minix_superblock *)(superblock_buffer))
+#define Super (G.u.Super)
 
 #if ENABLE_FEATURE_MINIX2
 # define ZONES    ((unsigned)(version2 ? Super.s_zones : Super.s_nzones))
@@ -373,9 +388,9 @@ static int ask(const char *string, int def)
                }
        }
        if (def)
-               printf("y\n");
+               puts("y");
        else {
-               printf("n\n");
+               puts("n");
                errors_uncorrected = 1;
        }
        return def;
@@ -407,7 +422,7 @@ static void check_mount(void)
                if (isatty(0) && isatty(1))
                        cont = ask("Do you really want to continue", 0);
                if (!cont) {
-                       printf("Check aborted\n");
+                       puts("Check aborted");
                        exit(EXIT_SUCCESS);
                }
        }
@@ -472,8 +487,8 @@ static void write_block(unsigned nr, void *addr)
        if (!nr)
                return;
        if (nr < FIRSTZONE || nr >= ZONES) {
-               printf("Internal error: trying to write bad block\n"
-                          "Write request ignored\n");
+               puts("Internal error: trying to write bad block\n"
+                       "Write request ignored");
                errors_uncorrected = 1;
                return;
        }
@@ -661,7 +676,7 @@ static void read_tables(void)
        if (INODE_BUFFER_SIZE != read(dev_fd, inode_buffer, INODE_BUFFER_SIZE))
                die("can't read inodes");
        if (NORM_FIRSTZONE != FIRSTZONE) {
-               printf("warning: firstzone!=norm_firstzone\n");
+               puts("warning: firstzone!=norm_firstzone");
                errors_uncorrected = 1;
        }
        get_dirsize();
@@ -688,7 +703,7 @@ static void get_inode_common(unsigned nr, uint16_t i_mode)
        total++;
        if (!inode_count[nr]) {
                if (!inode_in_use(nr)) {
-                       printf("Inode %d is marked as 'unused', but it is used "
+                       printf("Inode %u is marked as 'unused', but it is used "
                                        "for file '%s'\n", nr, current_name);
                        if (OPT_repair) {
                                if (ask("Mark as 'in use'", 1))
@@ -715,7 +730,7 @@ static void get_inode_common(unsigned nr, uint16_t i_mode)
        } else
                links++;
        if (!++inode_count[nr]) {
-               printf("Warning: inode count too big\n");
+               puts("Warning: inode count too big");
                inode_count[nr]--;
                errors_uncorrected = 1;
        }
@@ -1132,7 +1147,7 @@ static void check_counts(void)
                        continue;
                }
                printf("Zone %d: %sin use, counted=%d\n",
-                          i, zone_in_use(i) ? "" : "not ", zone_count[i]);
+                       i, zone_in_use(i) ? "" : "not ", zone_count[i]);
        }
 }
 
@@ -1184,7 +1199,7 @@ static void check_counts2(void)
                        continue;
                }
                printf("Zone %d: %sin use, counted=%d\n",
-                          i, zone_in_use(i) ? "" : "not ", zone_count[i]);
+                       i, zone_in_use(i) ? "" : "not ", zone_count[i]);
        }
 }
 #endif
@@ -1214,15 +1229,13 @@ void check2(void);
 int fsck_minix_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
 int fsck_minix_main(int argc UNUSED_PARAM, char **argv)
 {
-       struct termios tmp;
        int retcode = 0;
 
        xfunc_error_retval = 8;
 
        INIT_G();
 
-       opt_complementary = "=1:ar"; /* one argument; -a assumes -r */
-       getopt32(argv, OPTION_STR);
+       getopt32(argv, "^" OPTION_STR "\0" "=1:ar" /* one arg; -a assumes -r */);
        argv += optind;
        device_name = argv[0];
 
@@ -1254,15 +1267,12 @@ int fsck_minix_main(int argc UNUSED_PARAM, char **argv)
                printf("Forcing filesystem check on %s\n", device_name);
        else if (OPT_repair)
                printf("Filesystem on %s is dirty, needs checking\n",
-                          device_name);
+                       device_name);
 
        read_tables();
 
        if (OPT_manual) {
-               tcgetattr(0, &sv_termios);
-               tmp = sv_termios;
-               tmp.c_lflag &= ~(ICANON | ECHO);
-               tcsetattr_stdin_TCSANOW(&tmp);
+               set_termios_to_raw(STDIN_FILENO, &sv_termios, 0);
                termios_set = 1;
        }
 
@@ -1281,27 +1291,27 @@ int fsck_minix_main(int argc UNUSED_PARAM, char **argv)
                        if (!inode_in_use(i))
                                free_cnt++;
                printf("\n%6u inodes used (%u%%)\n", (INODES - free_cnt),
-                          100 * (INODES - free_cnt) / INODES);
+                       100 * (INODES - free_cnt) / INODES);
                for (i = FIRSTZONE, free_cnt = 0; i < ZONES; i++)
                        if (!zone_in_use(i))
                                free_cnt++;
                printf("%6u zones used (%u%%)\n\n"
-                          "%6u regular files\n"
-                          "%6u directories\n"
-                          "%6u character device files\n"
-                          "%6u block device files\n"
-                          "%6u links\n"
-                          "%6u symbolic links\n"
-                          "------\n"
-                          "%6u files\n",
-                          (ZONES - free_cnt), 100 * (ZONES - free_cnt) / ZONES,
-                          regular, directory, chardev, blockdev,
-                          links - 2 * directory + 1, symlinks,
-                          total - 2 * directory + 1);
+                       "%6u regular files\n"
+                       "%6u directories\n"
+                       "%6u character device files\n"
+                       "%6u block device files\n"
+                       "%6u links\n"
+                       "%6u symbolic links\n"
+                       "------\n"
+                       "%6u files\n",
+                       (ZONES - free_cnt), 100 * (ZONES - free_cnt) / ZONES,
+                       regular, directory, chardev, blockdev,
+                       links - 2 * directory + 1, symlinks,
+                       total - 2 * directory + 1);
        }
        if (changed) {
                write_tables();
-               printf("FILE SYSTEM HAS BEEN CHANGED\n");
+               puts("FILE SYSTEM HAS BEEN CHANGED");
                sync();
        } else if (OPT_repair)
                write_superblock();