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

📄 devwd.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include	"u.h"#include	"../port/lib.h"#include	"mem.h"#include	"dat.h"#include	"fns.h"#include	"io.h"#include	"../port/error.h"enum {	Qdir,	Qwdctl,};static Watchdog *wd;static Dirtab wddir[] = {	".",		{ Qdir, 0, QTDIR },	0,		0550,	"wdctl",	{ Qwdctl, 0 },		0,		0660,};voidaddwatchdog(Watchdog *watchdog){	if(wd){		print("addwatchdog: watchdog already installed\n");		return;	}	wd = watchdog;	if(wd)		wd->disable();}static Chan*wdattach(char *spec){	return devattach('w', spec);}static Walkqid*wdwalk(Chan *c, Chan *nc, char **name, int nname){	return devwalk(c, nc, name, nname, wddir, nelem(wddir), devgen);}static intwdstat(Chan *c, uchar *dp, int n){	return devstat(c, dp, n, wddir, nelem(wddir), devgen);}static Chan*wdopen(Chan* c, int omode){	return devopen(c, omode, wddir, nelem(wddir), devgen);}static voidwdclose(Chan*){}static longwdread(Chan* c, void* a, long n, vlong off){	char *p;	ulong offset = off;	switch((ulong)c->qid.path){	case Qdir:		return devdirread(c, a, n, wddir, nelem(wddir), devgen);	case Qwdctl:		if(wd == nil || wd->stat == nil)			return 0;		p = malloc(READSTR);		if(waserror()){			free(p);			nexterror();		}		wd->stat(p, p + READSTR);		n = readstr(offset, a, n, p);		poperror();		free(p);		return n;	default:		error(Egreg);		break;	}	return 0;}static voidwdctl(char *a){	int n;	char *field[6];	n = tokenize(a, field, nelem(field));	if(n < 1)		error(Ebadarg);	if(!strcmp(field[0], "enable"))		wd->enable();	else if(!strcmp(field[0], "disable"))		wd->disable();	else if(!strcmp(field[0], "restart"))		wd->restart();	else		error(Ebadarg);}static longwdwrite(Chan* c, void* a, long n, vlong off){	char *p;	ulong offset = off;	switch((ulong)c->qid.path){	case Qdir:		error(Eperm);	case Qwdctl:		if(wd == nil)			return n;		if(offset || n >= READSTR)			error(Ebadarg);		p = malloc(READSTR);		if(waserror()){			free(p);			nexterror();		}		memmove(p, a, n);		p[n] = 0;		wdctl(p);		poperror();		free(p);		return n;	default:		error(Egreg);		break;	}	return 0;}Dev wddevtab = {	'w',	"watchdog",	devreset,	devinit,	devshutdown,	wdattach,	wdwalk,	wdstat,	wdopen,	devcreate,	wdclose,	wdread,	devbread,	wdwrite,	devbwrite,	devremove,	devwstat,	devpower,};

⌨️ 快捷键说明

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