nbdgramconv.c

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

C
117
字号
#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 + =
减小字号Ctrl + -
显示快捷键?