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

📄 mkfs.c

📁 Version 6 Unix 核心源代码 Version 6 Unix 核心源代码
💻 C
字号:
#struct{	char	*s_isize;	char	*s_fsize;	int	s_nfree;	int	s_free[100];	int	s_ninode;	int	s_inode[100];	char	s_flock;	char	s_ilock;	char	s_fmod;	int	s_time[2];} filsys;struct inode{	int	i_number;	int	i_mode;	char	i_nlink;	char	i_uid;	char	i_gid;	char	i_size0;	char	*i_size1;	int	i_addr[8];	int	i_time[4];};/* modes */#define	IALLOC	0100000#define	IFMT	060000#define		IFDIR	040000#define		IFCHR	020000#define		IFBLK	060000#define	ILARG	010000#define	ISUID	04000#define	ISGID	02000#define	IREAD	0400#define	IWRITE	0200#define	IEXEC	0100int	utime[2];int	fin;int	fsi;int	fso;char	*charp;int	buf[256];char	string[50];char	*fsys;char	*proto;int	f_n	1;int	f_m	1;main(argc, argv)char **argv;{	int f, n;	/*	 * open relevent files	 */	time(utime);	if(argc != 3) {		printf("arg count\n");		exit();	}	fsys = argv[1];	for(n=0; f=fsys[n+1]; n++)	if(fsys[n] == 'r') {		if(f == 'k') {			f_n = 24;			f_m = 3;		}		if(f == 'p') {			f_n = 10;			f_m = 4;		}	}	proto = argv[2];	fso = creat(fsys, 0666);	if(fso < 0) {		printf("%s: cannot create\n", fsys);		exit();	}	fsi = open(fsys, 0);	if(fsi < 0) {		printf("%s: cannot open\n", fsys);		exit();	}	fin = open(proto, 0);	if(fin < 0) {		n = 0;		for(f=0; proto[f]; f++) {			if(proto[f]<'0' || proto[f]>'9') {				printf("%s: cannot open\n", proto);				exit();			}			n = n*10 + proto[f]-'0';		}		filsys.s_fsize = n;		filsys.s_isize = ldiv(0, n, 43+ldiv(0, n, 1000));		printf("isize = %d\n", filsys.s_isize);		if(f_n != 1)			printf("free list %d/%d\n", f_m, f_n);		charp = "d--777 0 0 $ ";		goto f3;	}	/*	 * get name of boot load program	 * and read onto block 0	 */	getstr();	f = open(string, 0);	if(f < 0) {		printf("%s: cannot  open init\n", string);		goto f2;	}	read(f, buf, 020);	if(buf[0] != 0407) {		printf("%s: bad format\n", string);		goto f1;	}	n = buf[1]+buf[2];	if(n > 512) {		printf("%s: too big\n", string);		goto f1;	}	read(f, buf, n);	wtfs(0, buf);f1:	close(f);	/*	 * get total disk size	 * and inode block size	 */f2:	filsys.s_fsize = getnum();	filsys.s_isize = getnum();f3:	if(filsys.s_isize > filsys.s_fsize ||	   filsys.s_fsize-filsys.s_isize-2 < filsys.s_isize) {		printf("%l/%l: bad ratio\n", filsys.s_fsize, filsys.s_isize);		exit();	}	bflist();	/*	 * initialize files	 */	for(n=0; n<256; n++)		buf[n] = 0;	for(n=0; n!=filsys.s_isize; n++)		wtfs(n+2, buf);	cfile(0);	/*	 * write out super block	 */	for(n=0; n<256; n++)		buf[n] = 0;	filsys.s_time[0] = utime[0];	filsys.s_time[1] = utime[1];	wtfs(1, &filsys);}cfile(par)struct inode *par;{	struct inode in;	int db[256], ib[256];	int dbc, ibc;	static ino;	int i, f, *p1, *p2;	/*	 * get mode, uid and gid	 */	getstr();	in.i_mode = IALLOC;	in.i_mode =| gmode(string[0], "bcd", IFBLK, IFCHR, IFDIR);	in.i_mode =| gmode(string[1], "u", ISUID);	in.i_mode =| gmode(string[2], "g", ISGID);	for(i=3; i<6; i++) {		if(string[i]<'0' || string[i]>'7') {			printf("%c/%s: bad digit\n", string[i], string);			exit();		}		in.i_mode =| (string[i]-'0')<<(15-3*i);	}	in.i_uid = getnum();	in.i_gid = getnum();	/*	 * general initialization prior to	 * switching on format	 */	ino++;	in.i_number = ino;	if(ldiv(0, ino, 16) > filsys.s_isize) {		printf("too many inodes\n");		exit();	}	in.i_nlink = 1;	in.i_size0 = 0;	in.i_size1 = 0;	for(i=0; i<8; i++)		in.i_addr[i] = 0;	for(i=0; i<256; i++) {		db[i] = 0;		ib[i] = 0;	}	if(par == 0) {		par = &in;		in.i_nlink--;	}	dbc = 0;	ibc = 0;	switch(in.i_mode&IFMT) {	case 0:		/*		 * regular file		 * contents is a file name		 */		getstr();		f = open(string, 0);		if(f < 0) {			printf("%s: cannot open\n", string);			break;		}		while((i=read(f, db, 512)) > 0) {			in.i_size1 =+ i;			newblk(&dbc, db, &ibc, ib);		}		close(f);		break;	case IFBLK:	case IFCHR:		/*		 * special file		 * content is maj/min types		 */		in.i_addr[0] = getnum()<<8;		in.i_addr[0] =| getnum();		break;	case IFDIR:		/*		 * directory		 * put in extra links		 * call recursively until		 * name of "$" found		 */		par->i_nlink++;		entry(par->i_number, "..", &dbc, db, &ibc, ib);		in.i_nlink++;		entry(in.i_number, ".", &dbc, db, &ibc, ib);		in.i_size1 = 32;		for(;;) {			getstr();			if(string[0]=='$' && string[1]=='\0')				break;			entry(ino+1, string, &dbc, db, &ibc, ib);			in.i_size1 =+ 16;			cfile(&in);		}		break;	}	if(dbc != 0)		newblk(&dbc, db, &ibc, ib);	if(ibc > 8) {		in.i_mode =| ILARG;		dbc = alloc();		wtfs(dbc, ib);		in.i_addr[0] = dbc;	} else	for(i=0; i<ibc; i++)		in.i_addr[i] = ib[i];	in.i_time[0] = in.i_time[2] = utime[0];	in.i_time[1] = in.i_time[3] = utime[1];	i = in.i_number + 31;	dbc = ldiv(0, i, 16);	p1 = &buf[lrem(0, i, 16)*16];	p2 = &in.i_mode;	rdfs(dbc, buf);	for(i=0; i<16; i++)		*p1++ = *p2++;	wtfs(dbc, buf);}gmode(c, s, m0, m1, m2, m3)char c, *s;{	int i;	for(i=0; s[i]!='\0'; i++)		if(c == s[i])			return((&m0)[i]);	if(c == '-')		return(0);	printf("%c/%s: bad mode\n", c, string);	exit();}getnum(){	int n, i;	getstr();	n = 0;	i = 0;	for(i=0; string[i]!='\0'; i++) {		if(string[i]<'0' || string[i]>'9') {			printf("%s: bad number\n", string);			exit();		}		n = n*10 + string[i] - '0';	}	return(n);}getstr(){	int i, c;loop:	switch(c=getch()) {	case ' ':	case '\t':	case '\n':		goto loop;	case '\0':		printf("EOF\n");		exit();	case ':':		while(getch() != '\n');		goto loop;	}	i = 0;	do {		string[i++] = c;		c = getch();	} while(c!=' '&&c!='\t'&&c!='\n'&&c!='\0');	string[i] = '\0';}rdfs(bno, bf){	int n;	seek(fsi, bno, 3);	n = read(fsi, bf, 512);	if(n != 512) {		printf("read error: %l\n", bno);		exit();	}}wtfs(bno, bf){	int n;	seek(fso, bno, 3);	n = write(fso, bf, 512);	if(n != 512) {		printf("write error: %l\n", bno);		exit();	}}alloc(){	int bno, i;	filsys.s_nfree--;	bno = filsys.s_free[filsys.s_nfree];	filsys.s_free[filsys.s_nfree] = 0;	if(bno == 0) {		printf("out of free space\n");		exit();	}	if(filsys.s_nfree <= 0) {		rdfs(bno, buf);		filsys.s_nfree = buf[0];		for(i=0; i<100; i++)			filsys.s_free[i] = buf[i+1];	}	return(bno);}free(bno){	int i;	if(filsys.s_nfree >= 100) {		buf[0] = filsys.s_nfree;		for(i=0; i<100; i++)			buf[i+1] = filsys.s_free[i];		wtfs(bno, buf);		filsys.s_nfree = 0;	}	filsys.s_free[filsys.s_nfree] = bno;	filsys.s_nfree++;}entry(ino, str, adbc, db, aibc, ib)char *str;int *adbc, *db, *aibc, *ib;{	char *s;	int i;	db[*adbc] = ino;	(*adbc)++;	s = &db[*adbc];	for(i=0; i<14; i++) {		*s++ = *str;		if(*str != '\0')			str++;	}	*adbc =+ 7;	if(*adbc >= 256)		newblk(adbc, db, aibc, ib);}newblk(adbc, db, aibc, ib)int *adbc, *db, *aibc, *ib;{	int bno, i;	bno = alloc();	wtfs(bno, db);	for(i=0; i<256; i++)		db[i] = 0;	*adbc = 0;	ib[*aibc] = bno;	(*aibc)++;	if(*aibc >= 256) {		printf("indirect block full\n");		exit();	}}getch(){	if(charp)		return(*charp++);	return(getchar());}bflist(){	char flg[100], adr[100];	register i, j;	char *low, *high;	if(f_n > 100)		f_n = 100;	for(i=0; i<f_n; i++)		flg[i] = 0;	i = 0;	for(j=0; j<f_n; j++) {		while(flg[i])			i = (i+1)%f_n;		adr[j] = i;		flg[i]++;		i = (i+f_m)%f_n;	}	high = filsys.s_fsize-1;	low = filsys.s_isize+2;	free(0);	for(i=high; lrem(0,i+1,f_n); i--) {		if(i < low)			break;		free(i);	}	for(; i >= low+f_n; i =- f_n)		for(j=0; j<f_n; j++)			free(i-adr[j]);	for(;i >= low; i--)		free(i);}

⌨️ 快捷键说明

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