convd2m.c

来自「这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易」· C语言 代码 · 共 94 行

C
94
字号
#include "lib.h"#include <string.h>#include "sys9.h"#include "dir.h"uint_convD2M(Dir *d, uchar *buf, uint nbuf){	uchar *p, *ebuf;	char *sv[4];	int i, ns, nsv[4], ss;	if(nbuf < BIT16SZ)		return 0;	p = buf;	ebuf = buf + nbuf;	sv[0] = d->name;	sv[1] = d->uid;	sv[2] = d->gid;	sv[3] = d->muid;	ns = 0;	for(i = 0; i < 4; i++){		nsv[i] = strlen(sv[i]);		ns += nsv[i];	}	ss = STATFIXLEN + ns;	/* set size befor erroring, so user can know how much is needed */	/* note that length excludes count field itself */	PBIT16(p, ss-BIT16SZ);	p += BIT16SZ;	if(ss > nbuf)		return BIT16SZ;	PBIT16(p, d->type);	p += BIT16SZ;	PBIT32(p, d->dev);	p += BIT32SZ;	PBIT8(p, d->qid.type);	p += BIT8SZ;	PBIT32(p, d->qid.vers);	p += BIT32SZ;	PBIT64(p, d->qid.path);	p += BIT64SZ;	PBIT32(p, d->mode);	p += BIT32SZ;	PBIT32(p, d->atime);	p += BIT32SZ;	PBIT32(p, d->mtime);	p += BIT32SZ;	PBIT64(p, d->length);	p += BIT64SZ;	for(i = 0; i < 4; i++){		ns = nsv[i];		if(p + ns + BIT16SZ > ebuf)			return 0;		PBIT16(p, ns);		p += BIT16SZ;		memmove(p, sv[i], ns);		p += ns;	}	if(ss != p - buf)		return 0;	return p - buf;}uint_sizeD2M(Dir *d){	char *sv[4];	int i, ns;	sv[0] = d->name;	sv[1] = d->uid;	sv[2] = d->gid;	sv[3] = d->muid;	ns = 0;	for(i = 0; i < 4; i++)		if(sv[i])			ns += strlen(sv[i]);	return STATFIXLEN + ns;}

⌨️ 快捷键说明

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