⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mkfs.minix.c

📁 Util-linux 软件包包含许多工具。其中比较重要的是加载、卸载、格式化、分区和管理硬盘驱动器
💻 C
📖 第 1 页 / 共 2 页
字号:
	unsigned long dind_block[BLOCK_SIZE >> 2];	if (!badblocks)		return;	mark_inode (MINIX_BAD_INO);	inode->i_nlinks = 1;	inode->i_atime = inode->i_mtime = inode->i_ctime = time (NULL);	inode->i_mode = S_IFREG + 0000;	inode->i_size = badblocks * BLOCK_SIZE;	zone = next (0);	for (i = 0; i < 7; i++) {		inode->i_zone[i] = zone;		if (!NEXT_BAD)			goto end_bad;	}	inode->i_zone[7] = ind = get_free_block ();	memset (ind_block, 0, BLOCK_SIZE);	for (i = 0; i < 256; i++) {		ind_block[i] = zone;		if (!NEXT_BAD)			goto end_bad;	}	inode->i_zone[8] = dind = get_free_block ();	memset (dind_block, 0, BLOCK_SIZE);	for (i = 0; i < 256; i++) {		write_block (ind, (char *) ind_block);		dind_block[i] = ind = get_free_block ();		memset (ind_block, 0, BLOCK_SIZE);		for (j = 0; j < 256; j++) {			ind_block[j] = zone;			if (!NEXT_BAD)				goto end_bad;		}	}	/* Could make triple indirect block here */	die (_("too many bad blocks")); end_bad:	if (ind)		write_block (ind, (char *) ind_block);	if (dind)		write_block (dind, (char *) dind_block);}static voidmake_root_inode(void) {	struct minix_inode * inode = &Inode[MINIX_ROOT_INO];	mark_inode(MINIX_ROOT_INO);	inode->i_zone[0] = get_free_block();	inode->i_nlinks = 2;	inode->i_time = time(NULL);	if (badblocks)		inode->i_size = 3*dirsize;	else {		root_block[2*dirsize] = '\0';		root_block[2*dirsize+1] = '\0';		inode->i_size = 2*dirsize;	}	inode->i_mode = S_IFDIR + 0755;	inode->i_uid = getuid();	if (inode->i_uid)		inode->i_gid = getgid();	write_block(inode->i_zone[0],root_block);}static voidmake_root_inode2 (void) {	struct minix2_inode *inode = &Inode2[MINIX_ROOT_INO];	mark_inode (MINIX_ROOT_INO);	inode->i_zone[0] = get_free_block ();	inode->i_nlinks = 2;	inode->i_atime = inode->i_mtime = inode->i_ctime = time (NULL);	if (badblocks)		inode->i_size = 3 * dirsize;	else {		root_block[2 * dirsize] = '\0';		root_block[2 * dirsize + 1] = '\0';		inode->i_size = 2 * dirsize;	}	inode->i_mode = S_IFDIR + 0755;	inode->i_uid = getuid();	if (inode->i_uid)		inode->i_gid = getgid();	write_block (inode->i_zone[0], root_block);}static voidsetup_tables(void) {	int i;	unsigned long inodes;	memset(super_block_buffer,0,BLOCK_SIZE);	memset(boot_block_buffer,0,512);	Super.s_magic = magic;	Super.s_log_zone_size = 0;	Super.s_max_size = version2 ? 0x7fffffff : (7+512+512*512)*1024;	if (version2)		Super.s_zones = BLOCKS;	else		Super.s_nzones = BLOCKS;/* some magic nrs: 1 inode / 3 blocks */	if ( req_nr_inodes == 0 ) 		inodes = BLOCKS/3;	else		inodes = req_nr_inodes;	/* Round up inode count to fill block size */	if (version2)		inodes = ((inodes + MINIX2_INODES_PER_BLOCK - 1) &			  ~(MINIX2_INODES_PER_BLOCK - 1));	else		inodes = ((inodes + MINIX_INODES_PER_BLOCK - 1) &			  ~(MINIX_INODES_PER_BLOCK - 1));	if (inodes > 65535)		inodes = 65535;	Super.s_ninodes = inodes;	/* The old code here	 * ZMAPS = 0;	 * while (ZMAPS != UPPER(BLOCKS - NORM_FIRSTZONE + 1,BITS_PER_BLOCK))	 *	  ZMAPS = UPPER(BLOCKS - NORM_FIRSTZONE + 1,BITS_PER_BLOCK);	 * was no good, since it may loop. - aeb	 */	Super.s_imap_blocks = UPPER(INODES + 1, BITS_PER_BLOCK);	Super.s_zmap_blocks = UPPER(BLOCKS - (1+IMAPS+INODE_BLOCKS),				    BITS_PER_BLOCK+1);	Super.s_firstdatazone = NORM_FIRSTZONE;	inode_map = malloc(IMAPS * BLOCK_SIZE);	zone_map = malloc(ZMAPS * BLOCK_SIZE);	if (!inode_map || !zone_map)		die(_("unable to allocate buffers for maps"));	memset(inode_map,0xff,IMAPS * BLOCK_SIZE);	memset(zone_map,0xff,ZMAPS * BLOCK_SIZE);	for (i = FIRSTZONE ; i<ZONES ; i++)		unmark_zone(i);	for (i = MINIX_ROOT_INO ; i<=INODES ; i++)		unmark_inode(i);	inode_buffer = malloc(INODE_BUFFER_SIZE);	if (!inode_buffer)		die(_("unable to allocate buffer for inodes"));	memset(inode_buffer,0,INODE_BUFFER_SIZE);	printf(_("%ld inodes\n"),INODES);	printf(_("%ld blocks\n"),ZONES);	printf(_("Firstdatazone=%ld (%ld)\n"),FIRSTZONE,NORM_FIRSTZONE);	printf(_("Zonesize=%d\n"),BLOCK_SIZE<<ZONESIZE);	printf(_("Maxsize=%ld\n\n"),MAXSIZE);}/* * Perform a test of a block; return the number of * blocks readable/writeable. */static longdo_check(char * buffer, int try, unsigned int current_block) {	long got;		/* Seek to the correct loc. */	if (lseek(DEV, current_block * BLOCK_SIZE, SEEK_SET) !=		       current_block * BLOCK_SIZE ) {		 die(_("seek failed during testing of blocks"));	}	/* Try the read */	got = read(DEV, buffer, try * BLOCK_SIZE);	if (got < 0) got = 0;		if (got & (BLOCK_SIZE - 1 )) {		printf(_("Weird values in do_check: probably bugs\n"));	}	got /= BLOCK_SIZE;	return got;}static unsigned int currently_testing = 0;static voidalarm_intr(int alnum) {	if (currently_testing >= ZONES)		return;	signal(SIGALRM,alarm_intr);	alarm(5);	if (!currently_testing)		return;	printf("%d ...", currently_testing);	fflush(stdout);}static voidcheck_blocks(void) {	int try,got;	static char buffer[BLOCK_SIZE * TEST_BUFFER_BLOCKS];	currently_testing=0;	signal(SIGALRM,alarm_intr);	alarm(5);	while (currently_testing < ZONES) {		if (lseek(DEV,currently_testing*BLOCK_SIZE,SEEK_SET) !=		currently_testing*BLOCK_SIZE)			die(_("seek failed in check_blocks"));		try = TEST_BUFFER_BLOCKS;		if (currently_testing + try > ZONES)			try = ZONES-currently_testing;		got = do_check(buffer, try, currently_testing);		currently_testing += got;		if (got == try)			continue;		if (currently_testing < FIRSTZONE)			die(_("bad blocks before data-area: cannot make fs"));		mark_zone(currently_testing);		badblocks++;		currently_testing++;	}	if (badblocks > 1)		printf(_("%d bad blocks\n"), badblocks);	else if (badblocks == 1)		printf(_("one bad block\n"));}static voidget_list_blocks(char *filename) {	FILE *listfile;	unsigned long blockno;	listfile = fopen(filename,"r");	if (listfile == NULL)		die(_("can't open file of bad blocks"));	while (!feof(listfile)) {		fscanf(listfile,"%ld\n", &blockno);		mark_zone(blockno);		badblocks++;	}	fclose(listfile);	if(badblocks > 1)		printf(_("%d bad blocks\n"), badblocks);	else if (badblocks == 1)		printf(_("one bad block\n"));}intmain(int argc, char ** argv) {  int i;  char * tmp;  struct stat statbuf;  char * listfile = NULL;  char * p;  if (argc && *argv)    program_name = *argv;  if ((p = strrchr(program_name, '/')) != NULL)    program_name = p+1;  setlocale(LC_ALL, "");  bindtextdomain(PACKAGE, LOCALEDIR);  textdomain(PACKAGE);  if (argc == 2 &&      (!strcmp(argv[1], "-V") || !strcmp(argv[1], "--version"))) {	  printf(_("%s from %s\n"), program_name, util_linux_version);	  exit(0);  }  if (INODE_SIZE * MINIX_INODES_PER_BLOCK != BLOCK_SIZE)    die(_("bad inode size"));  if (INODE_SIZE2 * MINIX2_INODES_PER_BLOCK != BLOCK_SIZE)    die(_("bad inode size"));  opterr = 0;  while ((i = getopt(argc, argv, "ci:l:n:v")) != -1)    switch (i) {      case 'c':	check=1; break;      case 'i':	req_nr_inodes = (unsigned long) atol(optarg);	break;      case 'l':	listfile = optarg; break;      case 'n':	i = strtoul(optarg,&tmp,0);	if (*tmp)	  usage();	if (i == 14)	  magic = MINIX_SUPER_MAGIC;	else if (i == 30)	  magic = MINIX_SUPER_MAGIC2;	else	  usage();	namelen = i;	dirsize = i+2;	break;      case 'v':	version2 = 1;	break;      default:	usage();    }  argc -= optind;  argv += optind;  if (argc > 0 && !device_name) {    device_name = argv[0];    argc--;    argv++;  }  if (argc > 0) {     BLOCKS = strtol(argv[0],&tmp,0);     if (*tmp) {       printf(_("strtol error: number of blocks not specified"));       usage();     }  }  if (device_name && !BLOCKS)    BLOCKS = get_size (device_name) / 1024;  if (!device_name || BLOCKS<10) {    usage();  }  if (version2) {    if (namelen == 14)      magic = MINIX2_SUPER_MAGIC;    else      magic = MINIX2_SUPER_MAGIC2;  } else    if (BLOCKS > 65535)      BLOCKS = 65535;  check_mount();		/* is it already mounted? */  tmp = root_block;  *(short *)tmp = 1;  strcpy(tmp+2,".");  tmp += dirsize;  *(short *)tmp = 1;  strcpy(tmp+2,"..");  tmp += dirsize;  *(short *)tmp = 2;  strcpy(tmp+2,".badblocks");  DEV = open(device_name,O_RDWR );  if (DEV<0)    die(_("unable to open %s"));  if (fstat(DEV,&statbuf)<0)    die(_("unable to stat %s"));  if (!S_ISBLK(statbuf.st_mode))    check=0;  else if (statbuf.st_rdev == 0x0300 || statbuf.st_rdev == 0x0340)    die(_("will not try to make filesystem on '%s'"));  setup_tables();  if (check)    check_blocks();  else if (listfile)    get_list_blocks(listfile);  if (version2) {    make_root_inode2 ();    make_bad_inode2 ();  } else {      make_root_inode();      make_bad_inode();  }  mark_good_blocks();  write_tables();  return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -