Annotation of sbbs/src/sbbs3/pktdump.c, revision 1.1.1.1

1.1       root        1: /* pktdump.c */
                      2: 
                      3: /* $Id: pktdump.c,v 1.1 2006/12/28 08:36:00 rswindell Exp $ */
                      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;
                     93:        } else if(pkthdr.baud==2) {                                     /* Type 2.2 Packet Header */
                     94:                fprintf(stdout,"2.2");
                     95:                dest.point=pkthdr.month; 
                     96:                sprintf(origdomn,"@%s",pkthdr.fill.two_two.origdomn);
                     97:                sprintf(destdomn,"@%s",pkthdr.fill.two_two.destdomn);
                     98:        } else
                     99:                fprintf(stdout,"2.0");
                    100: 
                    101:        printf(" from %s%s",faddrtoa(&orig,NULL),origdomn);
                    102:        printf(" to %s%s\n"     ,faddrtoa(&dest,NULL),destdomn);
                    103: 
                    104:        fseek(fp,sizeof(pkthdr),SEEK_SET);
                    105: 
                    106:        /* Read/Display packed messages */
                    107:        while(!feof(fp)) {
                    108: 
                    109:                printf("%08lX\n",offset=ftell(fp));
                    110: 
                    111:                /* Read fixed-length header fields */
                    112:                if(fread(&pkdmsg,sizeof(BYTE),sizeof(pkdmsg),fp)!=sizeof(pkdmsg))
                    113:                        break;
                    114:                /* Display fixed-length fields */
                    115:                printf("%s %06lX Packed Message Type: %d from %u/%u to %u/%u\n"
                    116:                        ,fname
                    117:                        ,offset
                    118:                        ,pkdmsg.type
                    119:                        ,pkdmsg.orignet, pkdmsg.orignode
                    120:                        ,pkdmsg.destnet, pkdmsg.destnode);
                    121:                printf("Attribute: %04X\n",pkdmsg.attr);
                    122:                printf("Date/Time: %s\n",pkdmsg.time);
                    123: 
                    124:                /* Read variable-length header fields */
                    125:                freadstr(fp,to,sizeof(to));
                    126:                freadstr(fp,from,sizeof(from));
                    127:                freadstr(fp,subj,sizeof(subj));
                    128:        
                    129:                /* Display variable-length fields */
                    130:                printf("%-4s : %s\n","To",to);
                    131:                printf("%-4s : %s\n","From",from);
                    132:                printf("%-4s : %s\n","Subj",subj);
                    133: 
                    134:                fprintf(bodyfp,"\n-start of message text-\n");
                    135: 
                    136:                while((ch=fgetc(fp))!=EOF && ch!=0) {
                    137:                        if(lastch=='\r' && ch!='\n')
                    138:                                fputc('\n',bodyfp);
                    139:                        fputc(lastch=ch,bodyfp);
                    140:                }
                    141: 
                    142:                fprintf(bodyfp,"\n-end of message text-\n");
                    143:        }
                    144: 
                    145:        return(0);
                    146: }
                    147: 
                    148: int main(int argc, char** argv)
                    149: {
                    150:        FILE*   fp;
                    151:        int             i;
                    152: 
                    153:        if((nulfp=fopen(_PATH_DEVNULL,"w+"))==NULL) {
                    154:                perror(_PATH_DEVNULL);
                    155:                return -1;
                    156:        }
                    157:        bodyfp=nulfp;
                    158: 
                    159:        if(sizeof(fpkthdr_t)!=FIDO_PACKET_HDR_LEN) {
                    160:                printf("sizeof(fpkthdr_t)=%d, expected: %d\n",sizeof(fpkthdr_t),FIDO_PACKET_HDR_LEN);
                    161:                return(-1);
                    162:        }
                    163:        if(sizeof(fpkdmsg_t)!=FIDO_PACKED_MSG_HDR_LEN) {
                    164:                printf("sizeof(fpkdmsg_t)=%d, expected: %d\n",sizeof(fpkdmsg_t),FIDO_PACKED_MSG_HDR_LEN);
                    165:                return(-1);
                    166:        }
                    167:        if(sizeof(fmsghdr_t)!=FIDO_STORED_MSG_HDR_LEN) {
                    168:                printf("sizeof(fmsghdr_t)=%d, expected: %d\n",sizeof(fmsghdr_t),FIDO_STORED_MSG_HDR_LEN);
                    169:                return(-1);
                    170:        }
                    171: 
                    172:        for(i=1;i<argc;i++) {
                    173:                if(argv[i][0]=='-') {
                    174:                        switch(tolower(argv[i][1])) {
                    175:                                case 'b':
                    176:                                        bodyfp=stdout;;
                    177:                                        break;
                    178:                                default:
                    179:                                        printf("usage: pktdump [-text] <files.pkt>\n");
                    180:                                        return(0);
                    181:                        }
                    182:                        continue;
                    183:                }
                    184:                fprintf(stdout,"Opening %s\n",argv[i]);
                    185:                if((fp=fopen(argv[i],"rb"))==NULL) {
                    186:                        perror(argv[i]);
                    187:                        continue;
                    188:                }
                    189:                pktdump(fp, argv[i]);
                    190:                fclose(fp);
                    191:        }
                    192: 
                    193:        return(0);
                    194: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.