Skip to content
Snippets Groups Projects
Commit e94bc44f authored by rswindell's avatar rswindell
Browse files

Replaced (renamed to) fmsgdump.c

parent d0eb7f51
No related branches found
No related tags found
No related merge requests found
/* $Id$ */
// vi: tabstop=4
#include "gen_defs.h"
#include "fidodefs.h"
#include "xpendian.h" /* swap */
#include "dirwrap.h" /* _PATH_DEVNULL */
#include <stdio.h>
#include <string.h>
FILE* nulfp;
FILE* bodyfp;
char* freadstr(FILE* fp, char* str, size_t maxlen)
{
int ch;
size_t len=0;
while((ch=fgetc(fp))!=EOF && len<maxlen) {
str[len++]=ch;
if(ch==0)
break;
}
str[maxlen-1]=0;
return(str);
}
int msgdump(FILE* fp, const char* fname)
{
int ch,lastch=0;
char buf[128];
char origdomn[16]="";
char destdomn[16]="";
char to[FIDO_NAME_LEN];
char from[FIDO_NAME_LEN];
char subj[FIDO_SUBJ_LEN];
long end;
fmsghdr_t hdr;
if(fread(&hdr,sizeof(hdr),1,fp) != 1) {
fprintf(stderr,"%s !Error reading msg hdr (%" XP_PRIsize_t "u bytes)\n"
,fname,sizeof(hdr));
return(__COUNTER__);
}
fseek(fp,-1L,SEEK_END);
ch = fgetc(fp);
end = ftell(fp);
if(ch != FIDO_STORED_MSG_TERMINATOR) {
fprintf(stderr,"%s !Message missing terminator (%02X instead of %02X)\n"
,fname, (uchar)ch, FIDO_STORED_MSG_TERMINATOR);
// return(-2);
}
if(hdr.from[sizeof(hdr.from)-1] != 0)
fprintf(stderr,"%s Unterminated 'from' field\n", fname);
if(hdr.to[sizeof(hdr.to)-1] != 0)
fprintf(stderr,"%s Unterminated 'to' field\n", fname);
if(hdr.subj[sizeof(hdr.subj)-1] != 0)
fprintf(stderr,"%s Unterminated 'subj' field\n", fname);
if(hdr.time[sizeof(hdr.time)-1] != 0)
fprintf(stderr,"%s Untermianted 'time' field\n", fname);
printf("Subj: %.*s\n", sizeof(hdr.subj)-1, hdr.subj);
printf("Attr: %04hX\n", hdr.attr);
printf("To : %.*s (%u.%u/%u.%u)\n", sizeof(hdr.to)-1, hdr.to
,hdr.destzone, hdr.destnet, hdr.destnode, hdr.destpoint);
printf("From: %.*s (%u.%u/%u.%u)\n", sizeof(hdr.from)-1, hdr.from
,hdr.origzone, hdr.orignet, hdr.orignode, hdr.origpoint);
printf("Time: %.*s\n", sizeof(hdr.time)-1, hdr.time);
if(end <= sizeof(hdr)+1) {
fprintf(stderr, "!No body text\n");
return(__COUNTER__);
}
char* body = calloc((end - sizeof(hdr)) + 1, 1);
fseek(fp, sizeof(hdr), SEEK_SET);
fread(body, end - sizeof(hdr), 1, fp);
char* tp;
REPLACE_CHARS(body, '\r', '\n', tp);
REPLACE_CHARS(body, '\1', '@', tp);
fprintf(bodyfp,"\n-start of message text-\n");
fprintf(bodyfp,body);
fprintf(bodyfp,"\n-end of message text-\n");
printf("\n");
return(0);
}
char* usage = "usage: msgdump [-body] <file1.msg> [file2.msg] [...]\n";
int main(int argc, char** argv)
{
FILE* fp;
int i;
char revision[16];
sscanf("$Revision$", "%*s %s", revision);
fprintf(stderr,"msgdump rev %s - Dump FidoNet Stored Messages\n\n"
,revision
);
if(argc<2) {
fprintf(stderr,"%s",usage);
return -1;
}
if((nulfp=fopen(_PATH_DEVNULL,"w+"))==NULL) {
perror(_PATH_DEVNULL);
return -1;
}
bodyfp=nulfp;
if(sizeof(fmsghdr_t)!=FIDO_STORED_MSG_HDR_LEN) {
printf("sizeof(fmsghdr_t)=%" XP_PRIsize_t "u, expected: %d\n",sizeof(fmsghdr_t),FIDO_STORED_MSG_HDR_LEN);
return(-1);
}
for(i=1;i<argc;i++) {
if(argv[i][0]=='-') {
switch(tolower(argv[i][1])) {
case 'b':
bodyfp=stdout;;
break;
default:
printf("%s",usage);
return(0);
}
continue;
}
fprintf(stdout,"Opening %s\n",argv[i]);
if((fp=fopen(argv[i],"rb"))==NULL) {
perror(argv[i]);
continue;
}
msgdump(fp, argv[i]);
fclose(fp);
}
return(0);
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment