echolineblah940901311 years agoHistory
193 lines · 3.6 KB · C
RawDownload
#ifdef __linux#include <stdlib.h>#include <string.h>#include "linux.h"#else#include <u.h>#include <libc.h>#endif #include "dat.h"#include "fns.h" extern char *bosaddr; voidparse (flap *f){	snac rs;	recvsnac(f, &rs);	tlv *t;	uchar len;	ushort s;	ushort channel;	int i;	char *p;	unsigned long long cookie; 	switch(rs.family << 16 | rs.subtype){	default:		print ("0x%04x 0x%04x\n", rs.family, rs.subtype);		write (1, f->data, f->length);		write (1, "\n\n", 2);		break; 	case 0x00010001:		print("error: %04x\n", get2(f));		while((t = recvtlv(f)) != nil) {			printtlv(t);			freetlv(t);		}		break; 	case 0x000D0009:		print ("0x%04x 0x%04x\n", rs.family, rs.subtype);		while ((t = recvtlv(f)) != nil) {			printtlv(t);			freetlv(t);		}		break; 	case 0x0001000f:/*		len = f->data[f->offset++];		write (1, "welcome, ", 9);#ifdef __linux		fflush(stdout);#endif		write (1, &f->data[f->offset], len);#ifdef __linux		fflush(stdout);#endif		write (1, "\n", 2);#ifdef __linux		fflush(stdout);#endif*/		print ("0x%04x 0x%04x\n", rs.family, rs.subtype);		break; 	case 0x00010005:		print ("0x%04x 0x%04x\n", rs.family, rs.subtype);		while ((t = recvtlv(f)) != nil) {			print("t: 0x%04x, l: %d\n", t->type, t->length); 			if(t->type == 0x0005){				bosaddr = calloc(1, t->length+10);				memcpy(bosaddr, "tcp!", 4);				if (t->length)					memcpy(&bosaddr[4], t->value, t->length);				if (p = strchr(bosaddr, ':')){					*p = '!';				}else{					memcpy(&bosaddr[strlen(bosaddr)], "!5190\0", 6);				}				print("t: %04x, l: %d\n", t->type, t->length);				print("bos: %s\n", bosaddr);			} 			freetlv(t);		}		break; 	case 0x00130006:/*		print ("0x%04x 0x%04x\n", rs.family, rs.subtype); 		print ("0x%02x\n", f->data[f->offset]);		f->offset++; 		s = get2(f);		for (i = 0; i < s; i++) {			recvssi(f);		} 		break;*/ 	case 0x00010021:	case 0x0001000a:	case 0x0004000c:	case 0x00130009:	case 0x00130011:	case 0x00130012:	case 0x00130018:		print ("0x%04x 0x%04x\n", rs.family, rs.subtype);		break; 	case 0x000b0002:		print ("stats interval: %d\n", get2(f));		break; 	case 0x0003000b:	case 0x0003000c:		print ("0x%04x 0x%04x\n", rs.family, rs.subtype);		do {			if (rs.subtype == 0x000c)				print ("offline: ");			else if (rs.subtype == 0x000b)				print ("online: ");#ifdef __linux			fflush(stdout);#endif			write (1, &f->data[f->offset + 1], f->data[f->offset]);#ifdef __linux			fflush(stdout);#endif			f->offset += f->data[f->offset] + 1;			s = get2(f);			print(", warn: 0x%02x\n", s);			s = get2(f); 			for (i = 0; i < s; i++) {				t = recvtlv(f);				if (t == nil)					break;//				printtlv(t);				freetlv(t);			}		} while (f->offset < f->length);		break; 	case 0x00040007:		print ("0x%04x 0x%04x\n", rs.family, rs.subtype);		cookie = get8(f);		channel = get2(f);		len = f->data[f->offset++];		print ("from: ");#ifdef __linux		fflush(stdout);#endif		write (1, &f->data[f->offset], len);		f->offset += len;#ifdef __linux		fflush(stdout);#endif		print(", warn: 0x%04x, channel: 0x%04x, cookie: 0x%016llx\n", get2(f), channel, cookie);		s = get2(f);		for (i = 0; i < s; i++) {			t = recvtlv(f);			if (t == nil)				break;//			printtlv(t);			freetlv(t);		}		while ((t = recvtlv(f)) != nil) {			switch (t->type) {			default:				break;			case 5:				f->offset -= t->length;				f->offset += 26;				freetlv(t);				continue;			case 2:				write(1, &t->value[13], t->length - 13);				print("\n");				break;			case 0x2711:				write(1, &t->value[4], t->length - 4);				print("\n");			}			freetlv(t);		} 		break;	}}