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

📄 syscall.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include <sys.h>#include <fcall.h>char	buf[1048576];#define	NARG	5uintptr	arg[NARG];/* system calls not defined in libc.h */int	sysr1(void);int	_stat(char*, char*);int	_fstat(int, char*);int	_errstr(char*);int	_wstat(char*, char*);int	_fwstat(int, char*);int	_read(int, void*, int);int	_write(int, void*, int);int	_read9p(int, void*, int);int	_write9p(int, void*, int);int	brk_(void*);int	_nfstat(int, void*, int);int	_nstat(char*, void*, int);int	_nfwstat(int, void*, int);int	_nwstat(char*, void*, int);int	_fsession(char*, void*, int);int	_mount(int, char*, int, char*);int	_wait(void*);struct{	char	*name;	int	(*func)(...);}tab[]={#include "tab.h"	0,		0};uintptr parse(char *);void catch(void*, char*);char*xctime(ulong t){	char *buf, *s;	s = ctime(t);	s[strlen(s)-1] = '\0';	/* remove newline */	buf = malloc(512);	if(buf == nil)		sysfatal("can't malloc: %r");	snprint(buf, 512, "%s (%lud)", s, t);	return buf;}char*lstime(long l){	static char buf[32];	char *t;	long clk;	clk = time(0);	t = ctime(l);	/* 6 months in the past or a day in the future */	if(l<clk-180L*24*60*60 || clk+24L*60*60<l){		memmove(buf, t+4, 7);		/* month and day */		memmove(buf+7, t+23, 5);		/* year */	}else		memmove(buf, t+4, 12);		/* skip day of week */	buf[12] = 0;	return buf;}voidmain(int argc, char *argv[]){	int i, j, c;	int oflag, xflag, sflag;	vlong r;	Dir d;	char strs[1024];	char ebuf[1024];	fmtinstall('M', dirmodefmt);	oflag = 0;	xflag = 0;	sflag = 0;	ARGBEGIN{	case 'o':		oflag++;		break;	case 's':		sflag++;		break;	case 'x':		xflag++;		break;	default:		goto Usage;	}ARGEND	if(argc<1 || argc>1+NARG){    Usage:		fprint(2, "usage: syscall [-ox] entry [args; buf==8192 byte buffer]\n");		fprint(2, "\tsyscall write 1 hello 5\n");		fprint(2, "\tsyscall -o errstr buf 1024\n");		fprint(2, "\tsyscall -[xs] stat file buf 1024\n");		exits("usage");	}	for(i=1; i<argc; i++)		arg[i-1] = parse(argv[i]);	notify(catch);	for(i=0; tab[i].name; i++)		if(strcmp(tab[i].name, argv[0])==0){			/* special case for seek, pread, pwrite; vlongs are problematic */			if(strcmp(argv[0], "seek") == 0)				r=seek(arg[0], strtoll(argv[2], 0, 0), arg[2]);			else if(strcmp(argv[0], "pread") == 0)				r=pread(arg[0], (void*)arg[1], arg[2], strtoll(argv[4], 0, 0));			else if(strcmp(argv[0], "pwrite") == 0)				r=pwrite(arg[0], (void*)arg[1], arg[2], strtoll(argv[4], 0, 0));			else				r=(*tab[i].func)(arg[0], arg[1], arg[2], arg[3], arg[4]);			if(r == -1){				errstr(ebuf, sizeof ebuf);				fprint(2, "syscall: return %lld, error:%s\n", r, ebuf);			}else{				ebuf[0] = 0;				fprint(2, "syscall: return %lld, no error\n", r);			}			if(oflag)				print("%s\n", buf);			if(xflag){				for(j=0; j<r; j++){					if(j%16 == 0)						print("%.4x\t", j);					c = buf[j]&0xFF;					if('!'<=c && c<='~')						print(" %c ", c);					else						print("%.2ux ", c);					if(j%16 == 15)						print("\n");				}				print("\n");			}			if(sflag && r > 0){				r = convM2D((uchar*)buf, r, &d, strs);				if(r <= BIT16SZ)					print("short stat message\n");				else{					print("[%s] ", d.muid);					print("(%.16llux %lud %.2ux) ", d.qid.path, d.qid.vers, d.qid.type);					print("%M (%luo) ", d.mode, d.mode);					print("%c %d ", d.type, d.dev);					print("%s %s ", d.uid, d.gid);					print("%lld ", d.length);					print("%s ", lstime(d.mtime));					print("%s\n", d.name);					print("\tmtime: %s\n\tatime: %s\n", xctime(d.mtime), xctime(d.atime));				}			}			exits(ebuf);		}	fprint(2, "syscall: %s not known\n", argv[0]);	exits("unknown");}uintptrparse(char *s){	char *t;	uintptr l;	if(strcmp(s, "buf") == 0)		return (uintptr)buf;		l = strtoull(s, &t, 0);	if(t>s && *t==0)		return l;	return (uintptr)s; }voidcatch(void *, char *msg){	fprint(2, "syscall: received note='%s'\n", msg);	noted(NDFLT);}

⌨️ 快捷键说明

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