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

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: }

unix.superglobalmegacorp.com

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