Annotation of sbbs/src/sbbs3/pktdump.c, revision 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.