mkfs_minix.c
上传用户:abc8836
上传日期:2007-11-09
资源大小:1273k
文件大小:21k
- /* vi: set sw=4 ts=4: */
- /*
- * mkfs.c - make a linux (minix) file-system.
- *
- * (C) 1991 Linus Torvalds. This file may be redistributed as per
- * the Linux copyright.
- */
- /*
- * DD.MM.YY
- *
- * 24.11.91 - Time began. Used the fsck sources to get started.
- *
- * 25.11.91 - Corrected some bugs. Added support for ".badblocks"
- * The algorithm for ".badblocks" is a bit weird, but
- * it should work. Oh, well.
- *
- * 25.01.92 - Added the -l option for getting the list of bad blocks
- * out of a named file. (Dave Rivers, rivers@ponds.uucp)
- *
- * 28.02.92 - Added %-information when using -c.
- *
- * 28.02.93 - Added support for other namelengths than the original
- * 14 characters so that I can test the new kernel routines..
- *
- * 09.10.93 - Make exit status conform to that required by fsutil
- * (Rik Faith, faith@cs.unc.edu)
- *
- * 31.10.93 - Added inode request feature, for backup floppies: use
- * 32 inodes, for a news partition use more.
- * (Scott Heavner, sdh@po.cwru.edu)
- *
- * 03.01.94 - Added support for file system valid flag.
- * (Dr. Wettstein, greg%wind.uucp@plains.nodak.edu)
- *
- * 30.10.94 - added support for v2 filesystem
- * (Andreas Schwab, schwab@issan.informatik.uni-dortmund.de)
- *
- * 09.11.94 - Added test to prevent overwrite of mounted fs adapted
- * from Theodore Ts'o's (tytso@athena.mit.edu) mke2fs
- * program. (Daniel Quinlan, quinlan@yggdrasil.com)
- *
- * 03.20.95 - Clear first 512 bytes of filesystem to make certain that
- * the filesystem is not misidentified as a MS-DOS FAT filesystem.
- * (Daniel Quinlan, quinlan@yggdrasil.com)
- *
- * 02.07.96 - Added small patch from Russell King to make the program a
- * good deal more portable (janl@math.uio.no)
- *
- * Usage: mkfs [-c | -l filename ] [-v] [-nXX] [-iXX] device [size-in-blocks]
- *
- * -c for readability checking (SLOW!)
- * -l for getting a list of bad blocks from a file.
- * -n for namelength (currently the kernel only uses 14 or 30)
- * -i for number of inodes
- * -v for v2 filesystem
- *
- * 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 :-).
- *
- * Modified for BusyBox by Erik Andersen <andersen@debian.org> --
- * removed getopt based parser and added a hand rolled one.
- */
- #include <stdio.h>
- #include <time.h>
- #include <unistd.h>
- #include <string.h>
- #include <signal.h>
- #include <fcntl.h>
- #include <ctype.h>
- #include <stdlib.h>
- #include <stdint.h>
- #include <termios.h>
- #include <sys/ioctl.h>
- #include <sys/param.h>
- #include <mntent.h>
- #include "busybox.h"
- #define MINIX_ROOT_INO 1
- #define MINIX_LINK_MAX 250
- #define MINIX2_LINK_MAX 65530
- #define MINIX_I_MAP_SLOTS 8
- #define MINIX_Z_MAP_SLOTS 64
- #define MINIX_SUPER_MAGIC 0x137F /* original minix fs */
- #define MINIX_SUPER_MAGIC2 0x138F /* minix fs, 30 char names */
- #define MINIX2_SUPER_MAGIC 0x2468 /* minix V2 fs */
- #define MINIX2_SUPER_MAGIC2 0x2478 /* minix V2 fs, 30 char names */
- #define MINIX_VALID_FS 0x0001 /* Clean fs. */
- #define MINIX_ERROR_FS 0x0002 /* fs has errors. */
- #define MINIX_INODES_PER_BLOCK ((BLOCK_SIZE)/(sizeof (struct minix_inode)))
- #define MINIX2_INODES_PER_BLOCK ((BLOCK_SIZE)/(sizeof (struct minix2_inode)))
- #define MINIX_V1 0x0001 /* original minix fs */
- #define MINIX_V2 0x0002 /* minix V2 fs */
- #define INODE_VERSION(inode) inode->i_sb->u.minix_sb.s_version
- /*
- * This is the original minix inode layout on disk.
- * Note the 8-bit gid and atime and ctime.
- */
- struct minix_inode {
- uint16_t i_mode;
- uint16_t i_uid;
- uint32_t i_size;
- uint32_t i_time;
- uint8_t i_gid;
- uint8_t i_nlinks;
- uint16_t i_zone[9];
- };
- /*
- * The new minix inode has all the time entries, as well as
- * long block numbers and a third indirect block (7+1+1+1
- * instead of 7+1+1). Also, some previously 8-bit values are
- * now 16-bit. The inode is now 64 bytes instead of 32.
- */
- struct minix2_inode {
- uint16_t i_mode;
- uint16_t i_nlinks;
- uint16_t i_uid;
- uint16_t i_gid;
- uint32_t i_size;
- uint32_t i_atime;
- uint32_t i_mtime;
- uint32_t i_ctime;
- uint32_t i_zone[10];
- };
- /*
- * minix super-block data on disk
- */
- struct minix_super_block {
- uint16_t s_ninodes;
- uint16_t s_nzones;
- uint16_t s_imap_blocks;
- uint16_t s_zmap_blocks;
- uint16_t s_firstdatazone;
- uint16_t s_log_zone_size;
- uint32_t s_max_size;
- uint16_t s_magic;
- uint16_t s_state;
- uint32_t s_zones;
- };
- struct minix_dir_entry {
- uint16_t inode;
- char name[0];
- };
- #define BLOCK_SIZE_BITS 10
- #define BLOCK_SIZE (1<<BLOCK_SIZE_BITS)
- #define NAME_MAX 255 /* # chars in a file name */
- #define MINIX_INODES_PER_BLOCK ((BLOCK_SIZE)/(sizeof (struct minix_inode)))
- #define MINIX_VALID_FS 0x0001 /* Clean fs. */
- #define MINIX_ERROR_FS 0x0002 /* fs has errors. */
- #define MINIX_SUPER_MAGIC 0x137F /* original minix fs */
- #define MINIX_SUPER_MAGIC2 0x138F /* minix fs, 30 char names */
- #ifndef BLKGETSIZE
- #define BLKGETSIZE _IO(0x12,96) /* return device size */
- #endif
- #ifndef __linux__
- #define volatile
- #endif
- #define MINIX_ROOT_INO 1
- #define MINIX_BAD_INO 2
- #define TEST_BUFFER_BLOCKS 16
- #define MAX_GOOD_BLOCKS 512
- #define UPPER(size,n) (((size)+((n)-1))/(n))
- #define INODE_SIZE (sizeof(struct minix_inode))
- #ifdef CONFIG_FEATURE_MINIX2
- #define INODE_SIZE2 (sizeof(struct minix2_inode))
- #define INODE_BLOCKS UPPER(INODES, (version2 ? MINIX2_INODES_PER_BLOCK
- : MINIX_INODES_PER_BLOCK))
- #else
- #define INODE_BLOCKS UPPER(INODES, (MINIX_INODES_PER_BLOCK))
- #endif
- #define INODE_BUFFER_SIZE (INODE_BLOCKS * BLOCK_SIZE)
- #define BITS_PER_BLOCK (BLOCK_SIZE<<3)
- static char *device_name = NULL;
- static int DEV = -1;
- static uint32_t BLOCKS = 0;
- static int check = 0;
- static int badblocks = 0;
- static int namelen = 30; /* default (changed to 30, per Linus's
- suggestion, Sun Nov 21 08:05:07 1993) */
- static int dirsize = 32;
- static int magic = MINIX_SUPER_MAGIC2;
- static int version2 = 0;
- static char root_block[BLOCK_SIZE] = "