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

📄 init.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
字号:
#include <signal.h>#include <sys/types.h>#include <utmp.h>#include <setjmp.h>#define	TABSIZ	100#define	ALL	p = &itab[0]; p < &itab[TABSIZ]; p++#define	EVER	;;char	shell[]	= "/bin/sh";char	getty[]	 = "/etc/getty";char	minus[]	= "-";char	runc[]	= "/etc/rc";char	ifile[]	= "/etc/ttys";char	utmp[]	= "/etc/utmp";char	wtmpf[]	= "/usr/adm/wtmp";char	ctty[]	= "/dev/console";char	dev[]	= "/dev/";struct utmp wtmp;struct{	char	line[8];	char	comn;	char	flag;} line;struct	tab{	char	line[8];	char	comn;	int	pid;} itab[TABSIZ];int	fi;char	tty[20];jmp_buf	sjbuf;main(){	int reset();	setjmp(sjbuf);	signal(SIGHUP, reset);	for(EVER) {		shutdown();		single();		runcom();		merge();		multiple();	}}shutdown(){	register i;	register struct tab *p;	signal(SIGINT, SIG_IGN);	for(ALL)		term(p);	signal(SIGALRM, reset);	alarm(60);	for(i=0; i<5; i++)		kill(-1, SIGKILL);	while(wait((int *)0) != -1)		;	alarm(0);	signal(SIGALRM, SIG_DFL);	for(i=0; i<10; i++)		close(i);}single(){	register pid;	pid = fork();	if(pid == 0) {/*		alarm(300);*/		signal(SIGHUP, SIG_DFL);		signal(SIGINT, SIG_DFL);		signal(SIGALRM, SIG_DFL);		open(ctty, 2);		dup(0);		dup(0);		execl(shell, minus, (char *)0);		exit(0);	}	while(wait((int *)0) != pid)		;}runcom(){	register pid;	pid = fork();	if(pid == 0) {		open("/", 0);		dup(0);		dup(0);		execl(shell, shell, runc, (char *)0);		exit(0);	}	while(wait((int *)0) != pid)		;}multiple(){	register struct tab *p;	register pid;	for(EVER) {		pid = wait((int *)0);		if(pid == -1)			return;		for(ALL)			if(p->pid == pid || p->pid == -1) {				rmut(p);				dfork(p);			}	}}term(p)register struct tab *p;{	if(p->pid != 0) {		rmut(p);		kill(p->pid, SIGKILL);	}	p->pid = 0;	p->line[0] = 0;}rline(){	register c, i;	c = get();	if(c < 0)		return(0);	if(c == 0)		goto bad;	line.flag = c;	c = get();	if(c <= 0)		goto bad;	line.comn = c;	for(i=0; i<8; i++)		line.line[i] = 0;	for(i=0; i<7; i++) {		c = get();		if(c <= 0)			break;		line.line[i] = c;	}	while(c > 0)		c = get();	maktty(line.line);	if(access(tty, 06) < 0)		goto bad;	return(1);bad:	line.flag = '0';	return(1);}maktty(lin)char *lin;{	register i, j;	for(i=0; dev[i]; i++)		tty[i] = dev[i];	for(j=0; lin[j]; j++) {		tty[i] = lin[j];		i++;	}	tty[i] = 0;}get(){	char b;	if(read(fi, &b, 1) != 1)		return(-1);	if(b == '\n')		return(0);	return(b);}merge(){	register struct tab *p, *q;	register i;	close(creat(utmp, 0644));	signal(SIGINT, merge);	fi = open(ifile, 0);	if(fi < 0)		return;	q = &itab[0];	while(rline()) {		if(line.flag == '0')			continue;		for(ALL) {			if(p->line[0] != 0)			for(i=0; i<8; i++)				if(p->line[i] != line.line[i])					goto contin;			if(p >= q) {				i = p->pid;				p->pid = q->pid;				q->pid = i;				for(i=0; i<8; i++)					p->line[i] = q->line[i];				p->comn = q->comn;				for(i=0; i<8; i++)					q->line[i] = line.line[i];				q->comn = line.comn;				q++;			}			break;		contin:			;		}	}	close(fi);	for(; q < &itab[TABSIZ]; q++)		term(q);	for(ALL)		if(p->line[0] != 0 && p->pid == 0)			dfork(p);}dfork(p)struct tab *p;{	register pid;	pid = fork();	if(pid == 0) {		signal(SIGHUP, SIG_DFL);		signal(SIGINT, SIG_DFL);		maktty(p->line);		chown(tty, 0, 0);		chmod(tty, 0622);		open(tty, 2);		dup(0);		dup(0);		tty[0] = p->comn;		tty[1] = 0;		execl(getty, minus, tty, (char *)0);		exit(0);	}	p->pid = pid;}rmut(p)register struct tab *p;{	register i, f;	f = open(utmp, 2);	if(f >= 0) {		while(read(f, (char *)&wtmp, sizeof(wtmp)) == sizeof(wtmp)) {			for(i=0; i<8; i++)				if(wtmp.ut_line[i] != p->line[i])					goto contin;			lseek(f, -(long)sizeof(wtmp), 1);			for(i=0; i<8; i++)				wtmp.ut_name[i] = 0;			time(&wtmp.ut_time);			write(f, (char *)&wtmp, sizeof(wtmp));		contin:;		}		close(f);	}	f = open(wtmpf, 1);	if (f >= 0) {		for(i=0; i<8; i++) {			wtmp.ut_name[i] = 0;			wtmp.ut_line[i] = p->line[i];		}		time(&wtmp.ut_time);		lseek(f, (long)0, 2);		write(f, (char *)&wtmp, sizeof(wtmp));		close(f);	}}reset(){	longjmp(sjbuf, 1);}

⌨️ 快捷键说明

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