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

📄 df.c

📁 操作系统源代码
💻 C
字号:
/* df - disk free block printout	Author: Andy Tanenbaum */#include <sys/types.h>#include <sys/stat.h>#include <limits.h>#include <fcntl.h>#include <errno.h>#include <unistd.h>#include <stdlib.h>#include <string.h>#include <minix/minlib.h>#include <minix/config.h>#include <minix/const.h>#include <minix/type.h>#include "../../fs/const.h"#include "../../fs/type.h"#include "../../fs/super.h"#include <stdio.h>#define REPORT 0#define SILENT 1#define NL    12		/* name length */_PROTOTYPE(int main, (int argc, char *argv []));_PROTOTYPE(int df, (char *name, char *mnton, char *version, char *rw_flag, int silent ));_PROTOTYPE(bit_t bit_count, (int blocks, bit_t bits, int fd ));_PROTOTYPE(void defaults, (void ));int main(argc, argv)int argc;char *argv[];{  register int i;  int ex= 0;  sync();			/* have to make sure disk is up-to-date */  fprintf(stdout, "\nDevice     Inodes  Inodes  Inodes     Blocks  Blocks  Blocks");  if (argc == 1)	fprintf(stdout, "  Mounted      V Pr\n");  else	fprintf(stdout, "\n");  fprintf(stdout, "           total   used    free       total   used    free");  if (argc == 1)	fprintf(stdout, "      on\n");  else	fprintf(stdout, "\n");  fprintf(stdout, "           -----   -----   -----      -----   -----   -----");  if (argc == 1)	fprintf(stdout, "   -------      - --\n");  else	fprintf(stdout, "\n");  if (argc == 1) defaults();  for (i = 1; i < argc; i++) ex |= df(argv[i], "", "", "", SILENT);  return(ex);}#define percent(num, tot)  ((int) ((100L * (num) + ((tot) - 1)) / (tot)))int df(name, mnton, version, rw_flag, silent)char *name, *mnton, *version, *rw_flag;int silent;{  register int j, fd;  char devname[32];  bit_t i_count, z_count, b;  block_t totblocks, busyblocks;  struct super_block super, *sp;  if ((fd = open(name, O_RDONLY)) < 0) {	if (!silent) {		int e = errno;		fprintf(stderr, "df: ");		errno = e;		perror(name);	}	return(1);  }  lseek(fd, (off_t) BLOCK_SIZE, SEEK_SET);	/* skip boot block */  if (read(fd, (char *) &super, (unsigned) SUPER_SIZE) != SUPER_SIZE) {	fprintf(stderr, "df: Can't read super block of %s\n", name);	close(fd);	return(1);  }  lseek(fd, (off_t) BLOCK_SIZE * 2L, SEEK_SET);	/* skip rest of super block */  sp = &super;  if (sp->s_magic == SUPER_MAGIC)	sp->s_zones = sp->s_nzones;  else if (sp->s_magic != SUPER_V2) {	close(fd);	if (sp->s_magic == SUPER_REV || sp->s_magic == SUPER_V2_REV) 		fprintf(stderr, "df: %s: Foreign (byte-swapped) file system\n", name);	else		fprintf(stderr, "df: %s: Not a valid file system\n", name);	return(1);  }  i_count = bit_count(sp->s_imap_blocks, (bit_t) sp->s_ninodes + 1, fd);  if (i_count == -1) {	fprintf(stderr, "df: Can't find bit maps of %s\n", name);	close(fd);	return(1);  }  i_count--;			/* There is no inode 0. */  b = (bit_t) sp->s_zones - (sp->s_firstdatazone - 1);  z_count = bit_count(sp->s_zmap_blocks, b, fd);  if (z_count == -1) {	fprintf(stderr, "df: Can't find bit maps of %s\n", name);	close(fd);	return(1);  }  totblocks = (block_t) sp->s_zones << sp->s_log_zone_size;  z_count += sp->s_firstdatazone - 1;  busyblocks = (block_t) z_count << sp->s_log_zone_size;  /* Truncate device name to NL chars. */  for (j = 0; j < NL; j++) devname[j] = ' ';  strncpy(devname, mnton, (size_t)NL);  for (j = 0; j < NL; j++) if(devname[j] == '\0') devname[j] = ' ';  devname[NL] = '\0';  /* Print results. */  fprintf(stdout, "%s", name);  j = 10 - strlen(name);  while (j > 0) {	fprintf(stdout, " ");	j--;  }   fprintf(stdout, " %5u   %5ld   %5ld    %7ld %7ld %7ld   %s %s %s\n",	sp->s_ninodes,		/* total inodes */	i_count,		/* inodes used */	sp->s_ninodes - i_count,/* inodes free */	totblocks,		/* total blocks */	busyblocks,		/* blocks used */	totblocks - busyblocks,	/* blocks free */	devname,		/* mounted on */	version,		/* 1 or 2 */	rw_flag			/* rw or ro */	);  close(fd);  return(0);}bit_t bit_count(blocks, bits, fd)int blocks;bit_t bits;int fd;{  register char *wptr;  register int i;  register int b;  register bit_t busy;  register char *wlim;  static char buf[BLOCK_SIZE];  static unsigned bits_in_char[1 << CHAR_BIT];  /* Precalculate bitcount for each char. */  if (bits_in_char[1] != 1) {	for (b = (1 << 0); b < (1 << CHAR_BIT); b <<= 1)		for (i = 0; i < (1 << CHAR_BIT); i++)			if (i & b) bits_in_char[i]++;  }  /* Loop on blocks, reading one at a time and counting bits. */  busy = 0;  for (i = 0; i < blocks && bits != 0; i++) {	if (read(fd, buf, (unsigned) BLOCK_SIZE) != BLOCK_SIZE) return(-1);	wptr = &buf[0];	if (bits >= CHAR_BIT * BLOCK_SIZE) {		wlim = &buf[BLOCK_SIZE];		bits -= CHAR_BIT * BLOCK_SIZE;	} else {		b = (int) bits / CHAR_BIT;	/* whole chars in map */		wlim = &buf[b];		bits -= b * CHAR_BIT;	/* bits in last char, if any */		b = *wlim & ((1 << bits) - 1);	/* bit pattern from last ch */		busy += bits_in_char[b];		bits = 0;	}	/* Loop on the chars of a block. */	while (wptr != wlim)		busy += bits_in_char[*wptr++ & ((1 << CHAR_BIT) - 1)];  }  return(busy);}void defaults(){/* Use the root file system and all mounted file systems. */  char special[PATH_MAX+1], mounted_on[PATH_MAX+1], version[10], rw_flag[10];  int ex= 0;  /* Read in /etc/mtab. */  if (load_mtab("df") < 0) exit(1);  /* Read /etc/mtab and iterate on the lines. */  while (1) {	get_mtab_entry(special, mounted_on, version, rw_flag);	if (special[0] == '\0') exit(0);	ex |= df(special, mounted_on, version, rw_flag, REPORT);  }  exit(ex);}

⌨️ 快捷键说明

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