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

📄 nbdgramconv.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
字号:
#include <u.h>#include <libc.h>#include <ip.h>#include <thread.h>#include "netbios.h"intnbdgramconvM2S(NbDgram *s, uchar *ap, uchar *ep){	uchar *p = ap;	int n;	ushort length;	if (ap + 6 + IPv4addrlen > ep)		return 0;	s->type = *p++;	s->flags = *p++;	s->id = nhgets(p); p+= 2;	v4tov6(s->srcip, p); p+= IPv4addrlen;	s->srcport = nhgets(p); p += 2;	switch (s->type) {	case NbDgramDirectUnique:	case NbDgramDirectGroup:	case NbDgramBroadcast:		if (p + 4 > ep)			return 0;		length = nhgets(p); p += 2;		s->datagram.offset = nhgets(p); p += 2;		if (p + length > ep)			return 0;		ep = p + length;		n = nbnamedecode(p, p, ep, s->datagram.srcname);		if (n == 0)			return 0;		p += n;		n = nbnamedecode(p, p, ep, s->datagram.dstname);		if (n == 0)			return 0;		p += n;		s->datagram.data = p;		s->datagram.length = ep - p;		p = ep;		break;	case NbDgramError:		if (p + 1 > ep)			return 0;		s->error.code = *p++;		break;	case NbDgramQueryRequest:	case NbDgramPositiveQueryResponse:	case NbDgramNegativeQueryResponse:		n = nbnamedecode(p, p, ep, s->query.dstname);		if (n == 0)			return 0;		p += n;		break;	default:		return 0;	}	return p - ap;}intnbdgramconvS2M(uchar *ap, uchar *ep, NbDgram *s){	uchar *p = ap;	uchar *fixup;	int n;	if (p + 6 + IPv4addrlen > ep)		return 0;	*p++ = s->type;	*p++ = s->flags;	hnputs(p, s->id); p+= 2;	v6tov4(p, s->srcip); p += IPv4addrlen;	hnputs(p, s->srcport); p+= 2;	switch (s->type) {	case NbDgramDirectUnique:	case NbDgramDirectGroup:	case NbDgramBroadcast:		if (p + 4 > ep)			return 0;		fixup = p;		hnputs(p, s->datagram.length); p += 2;		hnputs(p, s->datagram.offset); p += 2;		n = nbnameencode(p, ep, s->datagram.srcname);		if (n == 0)			return 0;		p += n;		n = nbnameencode(p, ep, s->datagram.dstname);		if (n == 0)			return 0;		p += n;		if (p + s->datagram.length > ep)			return 0;		memcpy(p, s->datagram.data, s->datagram.length); p += s->datagram.length;		hnputs(fixup, p - fixup - 4);		break;	case NbDgramError:		if (p + 1 > ep)			return 0;		*p++ = s->error.code;		break;	case NbDgramQueryRequest:	case NbDgramPositiveQueryResponse:	case NbDgramNegativeQueryResponse:		n = nbnameencode(p, ep, s->datagram.dstname);		if (n == 0)			return 0;		p += n;		break;	default:		return 0;	}	return p - ap;}

⌨️ 快捷键说明

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