|
|
1.1 root 1: /* pktdump.c */
2:
1.1.1.2 ! root 3: /* $Id: pktdump.c,v 1.5 2010/01/27 08:46:16 rswindell Exp $ */
1.1 root 4:
5: #include "fidodefs.h"
6: #include "sbbsdefs.h" /* faddr_t */
7:
8: FILE* nulfp;
9: FILE* bodyfp;
10:
11: /****************************************************************************/
12: /* Returns an ASCII string for FidoNet address 'addr' */
13: /****************************************************************************/
14: char *faddrtoa(faddr_t* addr, char* outstr)
15: {
16: static char str[64];
17: char point[25];
18:
19: if(addr==NULL)
20: return("0:0/0");
21: sprintf(str,"%hu:%hu/%hu",addr->zone,addr->net,addr->node);
22: if(addr->point) {
23: sprintf(point,".%hu",addr->point);
24: strcat(str,point); }
25: if(outstr==NULL)
26: return(str);
27: strcpy(outstr,str);
28: return(outstr);
29: }
30:
31: char* freadstr(FILE* fp, char* str, size_t maxlen)
32: {
33: int ch;
34: size_t len=0;
35:
36: while((ch=fgetc(fp))!=EOF && len<maxlen) {
37: str[len++]=ch;
38: if(ch==0)
39: break;
40: }
41:
42: str[maxlen-1]=0;
43:
44: return(str);
45: }
46:
47:
48: int pktdump(FILE* fp, const char* fname)
49: {
50: int ch,lastch;
51: char buf[128];
52: char origdomn[16]="";
53: char destdomn[16]="";
54: char to[FIDO_NAME_LEN];
55: char from[FIDO_NAME_LEN];
56: char subj[FIDO_SUBJ_LEN];
57: long offset;
58: faddr_t orig;
59: faddr_t dest;
60: fpkthdr_t pkthdr;
61: fpkdmsg_t pkdmsg;
62:
63: if(fread(&pkthdr,sizeof(BYTE),sizeof(pkthdr),fp)!=sizeof(pkthdr)) {
64: fprintf(stderr,"%s !Error reading pkthdr (%u bytes)\n"
65: ,fname,sizeof(pkthdr));
66: return(-1);
67: }
68:
69: fseek(fp,-2L,SEEK_END);
70: fread(buf,sizeof(BYTE),sizeof(buf),fp);
71: if(memcmp(buf,"\x00\x00",2)) {
72: fprintf(stderr,"%s !Packet missing terminating nulls: %02X %02X\n"
73: ,fname,buf[0],buf[1]);
74: // return(-2);
75: }
76:
77: orig.zone=pkthdr.origzone;
78: orig.net=pkthdr.orignet;
79: orig.node=pkthdr.orignode;
80: orig.point=0;
81:
82: dest.zone=pkthdr.destzone;
83: dest.net=pkthdr.destnet;
84: dest.node=pkthdr.destnode;
85: dest.point=0; /* No point info in the 2.0 hdr! */
86:
87: printf("%s Packet Type ", fname);
88:
89: if(pkthdr.fill.two_plus.cword==_rotr(pkthdr.fill.two_plus.cwcopy,8) /* 2+ Packet Header */
90: && pkthdr.fill.two_plus.cword&1) {
91: fprintf(stdout,"2+");
92: dest.point=pkthdr.fill.two_plus.destpoint;
1.1.1.2 ! root 93: if(pkthdr.fill.two_plus.origpoint!=0 && orig.net==0xffff) { /* see FSC-0048 for details */
! 94: orig.net=pkthdr.fill.two_plus.auxnet;
! 95: orig.point=pkthdr.fill.two_plus.origpoint;
! 96: }
1.1 root 97: } else if(pkthdr.baud==2) { /* Type 2.2 Packet Header */
98: fprintf(stdout,"2.2");
99: dest.point=pkthdr.month;
100: sprintf(origdomn,"@%s",pkthdr.fill.two_two.origdomn);
101: sprintf(destdomn,"@%s",pkthdr.fill.two_two.destdomn);
102: } else
103: fprintf(stdout,"2.0");
104:
105: printf(" from %s%s",faddrtoa(&orig,NULL),origdomn);
106: printf(" to %s%s\n" ,faddrtoa(&dest,NULL),destdomn);
107:
1.1.1.2 ! root 108: if(pkthdr.password[0])
! 109: fprintf(stdout,"Password: '%.*s'\n",sizeof(pkthdr.password),pkthdr.password);
! 110:
1.1 root 111: fseek(fp,sizeof(pkthdr),SEEK_SET);
112:
113: /* Read/Display packed messages */
114: while(!feof(fp)) {
115:
116: printf("%08lX\n",offset=ftell(fp));
117:
118: /* Read fixed-length header fields */
119: if(fread(&pkdmsg,sizeof(BYTE),sizeof(pkdmsg),fp)!=sizeof(pkdmsg))
120: break;
121: /* Display fixed-length fields */
122: printf("%s %06lX Packed Message Type: %d from %u/%u to %u/%u\n"
123: ,fname
124: ,offset
125: ,pkdmsg.type
126: ,pkdmsg.orignet, pkdmsg.orignode
127: ,pkdmsg.destnet, pkdmsg.destnode);
128: printf("Attribute: %04X\n",pkdmsg.attr);
129: printf("Date/Time: %s\n",pkdmsg.time);
130:
131: /* Read variable-length header fields */
132: freadstr(fp,to,sizeof(to));
133: freadstr(fp,from,sizeof(from));
134: freadstr(fp,subj,sizeof(subj));
135:
136: /* Display variable-length fields */
137: printf("%-4s : %s\n","To",to);
138: printf("%-4s : %s\n","From",from);
139: printf("%-4s : %s\n","Subj",subj);
140:
141: fprintf(bodyfp,"\n-start of message text-\n");
142:
143: while((ch=fgetc(fp))!=EOF && ch!=0) {
144: if(lastch=='\r' && ch!='\n')
145: fputc('\n',bodyfp);
146: fputc(lastch=ch,bodyfp);
147: }
148:
149: fprintf(bodyfp,"\n-end of message text-\n");
150: }
151:
152: return(0);
153: }
154:
1.1.1.2 ! root 155: char* usage = "usage: pktdump [-body] <file1.pkt> [file2.pkt] [...]\n";
! 156:
1.1 root 157: int main(int argc, char** argv)
158: {
159: FILE* fp;
160: int i;
1.1.1.2 ! root 161: char revision[16];
! 162:
! 163: sscanf("$Revision: 1.5 $", "%*s %s", revision);
! 164:
! 165: fprintf(stderr,"pktdump rev %s - Dump FidoNet Packets\n\n"
! 166: ,revision
! 167: );
! 168:
! 169: if(argc<2) {
! 170: fprintf(stderr,"%s",usage);
! 171: return -1;
! 172: }
1.1 root 173:
174: if((nulfp=fopen(_PATH_DEVNULL,"w+"))==NULL) {
175: perror(_PATH_DEVNULL);
176: return -1;
177: }
178: bodyfp=nulfp;
179:
180: if(sizeof(fpkthdr_t)!=FIDO_PACKET_HDR_LEN) {
181: printf("sizeof(fpkthdr_t)=%d, expected: %d\n",sizeof(fpkthdr_t),FIDO_PACKET_HDR_LEN);
182: return(-1);
183: }
184: if(sizeof(fpkdmsg_t)!=FIDO_PACKED_MSG_HDR_LEN) {
185: printf("sizeof(fpkdmsg_t)=%d, expected: %d\n",sizeof(fpkdmsg_t),FIDO_PACKED_MSG_HDR_LEN);
186: return(-1);
187: }
188: if(sizeof(fmsghdr_t)!=FIDO_STORED_MSG_HDR_LEN) {
189: printf("sizeof(fmsghdr_t)=%d, expected: %d\n",sizeof(fmsghdr_t),FIDO_STORED_MSG_HDR_LEN);
190: return(-1);
191: }
192:
193: for(i=1;i<argc;i++) {
194: if(argv[i][0]=='-') {
195: switch(tolower(argv[i][1])) {
196: case 'b':
197: bodyfp=stdout;;
198: break;
199: default:
1.1.1.2 ! root 200: printf("%s",usage);
1.1 root 201: return(0);
202: }
203: continue;
204: }
205: fprintf(stdout,"Opening %s\n",argv[i]);
206: if((fp=fopen(argv[i],"rb"))==NULL) {
207: perror(argv[i]);
208: continue;
209: }
210: pktdump(fp, argv[i]);
211: fclose(fp);
212: }
213:
214: return(0);
215: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.