Basic support for syncronet's headers.dat
This commit is contained in:
@@ -145,12 +145,22 @@ int export_messages(int baseno, char *basefilename, int qwkidx) {
|
||||
int len;
|
||||
int lenbytes;
|
||||
char buffer[PATH_MAX];
|
||||
|
||||
struct QwkHeader qh;
|
||||
struct tm msgtm;
|
||||
FILE *fptr;
|
||||
FILE *hdrptr;
|
||||
char text[128];
|
||||
char *msgbuf;
|
||||
char *msgptr;
|
||||
|
||||
long offset;
|
||||
|
||||
char *msgsubj = NULL;
|
||||
char *msgto = NULL;
|
||||
char *msgfrom = NULL;
|
||||
char *msgid = NULL;
|
||||
char *msgreplyid = NULL;
|
||||
|
||||
snprintf(buffer, PATH_MAX, "%s/%s", message_base_path, basefilename);
|
||||
|
||||
@@ -178,6 +188,10 @@ int export_messages(int baseno, char *basefilename, int qwkidx) {
|
||||
// export message
|
||||
for (z=0;z<jsp->NumFields;z++) {
|
||||
if (jsp->Fields[z]->LoID == JAMSFLD_SUBJECT) {
|
||||
msgsubj = (char *)malloc(jsp->Fields[z]->DatLen + 1);
|
||||
memset(msgsubj, 0, jsp->Fields[z]->DatLen + 1);
|
||||
memcpy(msgsubj, jsp->Fields[z]->Buffer, jsp->Fields[z]->DatLen);
|
||||
|
||||
if (jsp->Fields[z]->DatLen > 24) {
|
||||
len = 24;
|
||||
} else {
|
||||
@@ -187,6 +201,9 @@ int export_messages(int baseno, char *basefilename, int qwkidx) {
|
||||
memcpy(qh.MsgSubj, jsp->Fields[z]->Buffer, len);
|
||||
}
|
||||
if (jsp->Fields[z]->LoID == JAMSFLD_SENDERNAME) {
|
||||
msgfrom = (char *)malloc(jsp->Fields[z]->DatLen + 1);
|
||||
memset(msgfrom, 0, jsp->Fields[z]->DatLen + 1);
|
||||
memcpy(msgfrom, jsp->Fields[z]->Buffer, jsp->Fields[z]->DatLen);
|
||||
if (jsp->Fields[z]->DatLen > 24) {
|
||||
len = 24;
|
||||
} else {
|
||||
@@ -196,6 +213,9 @@ int export_messages(int baseno, char *basefilename, int qwkidx) {
|
||||
memcpy(qh.MsgFrom, jsp->Fields[z]->Buffer, len);
|
||||
}
|
||||
if (jsp->Fields[z]->LoID == JAMSFLD_RECVRNAME) {
|
||||
msgto = (char *)malloc(jsp->Fields[z]->DatLen + 1);
|
||||
memset(msgto, 0, jsp->Fields[z]->DatLen + 1);
|
||||
memcpy(msgto, jsp->Fields[z]->Buffer, jsp->Fields[z]->DatLen);
|
||||
if (jsp->Fields[z]->DatLen > 24) {
|
||||
len = 24;
|
||||
} else {
|
||||
@@ -204,6 +224,16 @@ int export_messages(int baseno, char *basefilename, int qwkidx) {
|
||||
memset(qh.MsgTo, ' ', 25);
|
||||
memcpy(qh.MsgTo, jsp->Fields[z]->Buffer, len);
|
||||
}
|
||||
if (jsp->Fields[z]->LoID == JAMSFLD_MSGID) {
|
||||
msgid = (char *)malloc(jsp->Fields[z]->DatLen + 1);
|
||||
memset(msgid, 0, jsp->Fields[z]->DatLen + 1);
|
||||
memcpy(msgid, jsp->Fields[z]->Buffer, jsp->Fields[z]->DatLen);
|
||||
}
|
||||
if (jsp->Fields[z]->LoID == JAMSFLD_REPLYID) {
|
||||
msgreplyid = (char *)malloc(jsp->Fields[z]->DatLen + 1);
|
||||
memset(msgreplyid, 0, jsp->Fields[z]->DatLen + 1);
|
||||
memcpy(msgreplyid, jsp->Fields[z]->Buffer, jsp->Fields[z]->DatLen);
|
||||
}
|
||||
}
|
||||
qh.Msgstat = ' ';
|
||||
snprintf(buffer, 7, "%d", baseno);
|
||||
@@ -276,6 +306,41 @@ int export_messages(int baseno, char *basefilename, int qwkidx) {
|
||||
fseek(fptr, 0, SEEK_END);
|
||||
}
|
||||
|
||||
offset = ftell(fptr);
|
||||
|
||||
snprintf(buffer, PATH_MAX, "%s/HEADERS.DAT", temp_dir);
|
||||
hdrptr = fopen(buffer, "a");
|
||||
|
||||
fprintf(hdrptr, "[%x]\n", offset);
|
||||
if (msgid != NULL) {
|
||||
fprintf(hdrptr, "Message-ID: %s\n", msgid);
|
||||
free(msgid);
|
||||
msgid = NULL;
|
||||
}
|
||||
if (msgreplyid != NULL) {
|
||||
fprintf(hdrptr, "In-Reply-To: %s\n", msgreplyid);
|
||||
free(msgreplyid);
|
||||
msgreplyid = NULL;
|
||||
}
|
||||
if (msgsubj != NULL) {
|
||||
fprintf(hdrptr, "Subject: %s\n", msgsubj);
|
||||
free(msgsubj);
|
||||
msgsubj = NULL;
|
||||
}
|
||||
if (msgto != NULL) {
|
||||
fprintf(hdrptr, "To: %s\n", msgto);
|
||||
free(msgto);
|
||||
msgto = NULL;
|
||||
}
|
||||
if (msgfrom != NULL) {
|
||||
fprintf(hdrptr, "Sender: %s\n", msgfrom);
|
||||
free(msgfrom);
|
||||
msgfrom = NULL;
|
||||
}
|
||||
|
||||
fprintf(hdrptr, "\n");
|
||||
fclose(hdrptr);
|
||||
|
||||
fwrite(&qh, 128, 1, fptr);
|
||||
fwrite(msgbuf, lenbytes - 128, 1, fptr);
|
||||
fclose(fptr);
|
||||
@@ -362,7 +427,7 @@ int main(int argc, char **argv) {
|
||||
strncpy(b, archive, blen);
|
||||
alen = strlen(archive);
|
||||
} else if (*p == 'f') {
|
||||
snprintf(b, blen, "%s/%s.MSG", temp_dir, hostid);
|
||||
snprintf(b, blen, "%s/%s.MSG %s/HEADERS.DAT", temp_dir, hostid, temp_dir);
|
||||
alen = strlen(b);
|
||||
} else if (*p == '*') {
|
||||
*b++ = '*';
|
||||
|
@@ -24,6 +24,20 @@ struct msg_bases {
|
||||
char *path;
|
||||
};
|
||||
|
||||
struct header_t {
|
||||
char *key;
|
||||
char *value;
|
||||
};
|
||||
|
||||
struct msg_headers_t {
|
||||
long offset;
|
||||
struct header_t **headers;
|
||||
int header_count;
|
||||
};
|
||||
|
||||
struct msg_headers_t **msg_headers;
|
||||
int msg_count = 0;
|
||||
|
||||
struct msg_bases **msgbases;
|
||||
int msgbasecount = 0;
|
||||
|
||||
@@ -100,6 +114,59 @@ s_JamBase *open_jam_base(char *path) {
|
||||
return jb;
|
||||
}
|
||||
|
||||
static char *get_key_value(struct msg_headers_t *header, char *key) {
|
||||
if (header == NULL) return NULL;
|
||||
for (int i=0;i<header->header_count;i++) {
|
||||
if (strcmp(key, header->headers[i]->key) == 0) {
|
||||
fprintf(stderr, "%s\n", header->headers[i]->value);
|
||||
return header->headers[i]->value;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static struct msg_headers_t *get_header(long offset) {
|
||||
for (int i=0;i<msg_count;i++) {
|
||||
if (msg_headers[i]->offset == offset) {
|
||||
return msg_headers[i];
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int header_handler(void* user, const char* section, const char* name,
|
||||
const char* value)
|
||||
{
|
||||
for (int i=0;i<msg_count;i++) {
|
||||
if (msg_headers[i]->offset == strtol(section, NULL, 16)) {
|
||||
msg_headers[i]->headers = (struct header_t **)realloc(msg_headers[i]->headers, sizeof(struct header_t *) * (msg_headers[i]->header_count + 1));
|
||||
msg_headers[i]->headers[msg_headers[i]->header_count] = (struct header_t *)malloc(sizeof(struct header_t));
|
||||
msg_headers[i]->headers[msg_headers[i]->header_count]->key = strdup(name);
|
||||
msg_headers[i]->headers[msg_headers[i]->header_count]->value = strdup(value);
|
||||
msg_headers[i]->header_count++;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
if (msg_count == 0) {
|
||||
msg_headers = (struct msg_headers_t **)malloc(sizeof(struct msg_headers_t *));
|
||||
} else {
|
||||
msg_headers = (struct msg_headers_t **)realloc(msg_headers, sizeof(struct msg_headers_t *) * (msg_count + 1));
|
||||
}
|
||||
|
||||
msg_headers[msg_count] = (struct msg_headers_t *)malloc(sizeof(struct msg_headers_t));
|
||||
msg_headers[msg_count]->offset = strtol(section, NULL, 16);
|
||||
msg_headers[msg_count]->header_count = 1;
|
||||
msg_headers[msg_count]->headers = (struct header_t **)malloc(sizeof(struct header_t *));
|
||||
msg_headers[msg_count]->headers[0] = (struct header_t *)malloc(sizeof(struct header_t));
|
||||
msg_headers[msg_count]->headers[0]->key = strdup(name);
|
||||
msg_headers[msg_count]->headers[0]->value = strdup(value);
|
||||
|
||||
msg_count++;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int handler(void* user, const char* section, const char* name,
|
||||
const char* value)
|
||||
{
|
||||
@@ -155,7 +222,9 @@ size_t trimwhitespace(char *out, size_t len, const char *str) {
|
||||
int process_msgs_dat(char *msgsdat) {
|
||||
FILE *fptr;
|
||||
FILE *cfgfptr;
|
||||
|
||||
char buffer[PATH_MAX];
|
||||
char headerfile[PATH_MAX];
|
||||
struct QwkHeader qhdr;
|
||||
int msgrecs;
|
||||
char *msgbody;
|
||||
@@ -174,7 +243,16 @@ int process_msgs_dat(char *msgsdat) {
|
||||
s_JamSubfield jsf;
|
||||
int z;
|
||||
int basefound = 0;
|
||||
|
||||
long offset;
|
||||
char *ptr;
|
||||
|
||||
struct msg_headers_t *header = NULL;
|
||||
|
||||
|
||||
snprintf(headerfile, PATH_MAX, "%s/HEADERS.DAT", temp_dir);
|
||||
|
||||
ini_parse(headerfile, header_handler, NULL);
|
||||
|
||||
snprintf(buffer, PATH_MAX, "%s/%s", temp_dir, msgsdat);
|
||||
|
||||
fptr = fopen(buffer, "rb");
|
||||
@@ -183,11 +261,15 @@ int process_msgs_dat(char *msgsdat) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
||||
fread(&qhdr, sizeof(struct QwkHeader), 1, fptr);
|
||||
while (!feof(fptr)) {
|
||||
offset = ftell(fptr);
|
||||
header = get_header(offset);
|
||||
if (fread(&qhdr, sizeof(struct QwkHeader), 1, fptr) != 1) {
|
||||
break;
|
||||
}
|
||||
|
||||
msgrecs = atoi(qhdr.Msgrecs);
|
||||
msgbody = (char *)malloc((msgrecs * 128) + 1);
|
||||
memset(msgbody, 0, (msgrecs * 128) + 1);
|
||||
@@ -278,6 +360,7 @@ int process_msgs_dat(char *msgsdat) {
|
||||
if (!jb) {
|
||||
fprintf(stderr, "Unable to open JAM base: %s\n", buffer);
|
||||
free(msgbody);
|
||||
fclose(fptr);
|
||||
return -1;
|
||||
}
|
||||
JAM_ClearMsgHeader( &jmh );
|
||||
@@ -287,22 +370,60 @@ int process_msgs_dat(char *msgsdat) {
|
||||
|
||||
jsf.LoID = JAMSFLD_SENDERNAME;
|
||||
jsf.HiID = 0;
|
||||
jsf.DatLen = strlen(msgfrom);
|
||||
jsf.Buffer = (char *)msgfrom;
|
||||
|
||||
ptr = get_key_value(header, "Sender");
|
||||
if (ptr != NULL) {
|
||||
jsf.DatLen = strlen(ptr);
|
||||
jsf.Buffer = ptr;
|
||||
} else {
|
||||
jsf.DatLen = strlen(msgfrom);
|
||||
jsf.Buffer = (char *)msgfrom;
|
||||
}
|
||||
JAM_PutSubfield(jsp, &jsf);
|
||||
|
||||
jsf.LoID = JAMSFLD_RECVRNAME;
|
||||
jsf.LoID = JAMSFLD_RECVRNAME;
|
||||
jsf.HiID = 0;
|
||||
jsf.DatLen = strlen(msgto);
|
||||
jsf.Buffer = (char *)msgto;
|
||||
|
||||
ptr = get_key_value(header, "To");
|
||||
if (ptr != NULL) {
|
||||
jsf.DatLen = strlen(ptr);
|
||||
jsf.Buffer = (char *)ptr;
|
||||
} else {
|
||||
jsf.DatLen = strlen(msgto);
|
||||
jsf.Buffer = (char *)msgto;
|
||||
}
|
||||
JAM_PutSubfield(jsp, &jsf);
|
||||
|
||||
jsf.LoID = JAMSFLD_SUBJECT;
|
||||
jsf.HiID = 0;
|
||||
jsf.DatLen = strlen(msgsubj);
|
||||
jsf.Buffer = (char *)msgsubj;
|
||||
ptr = get_key_value(header, "Subject");
|
||||
if (ptr != NULL) {
|
||||
jsf.DatLen = strlen(ptr);
|
||||
jsf.Buffer = (char *)ptr;
|
||||
} else {
|
||||
jsf.DatLen = strlen(msgsubj);
|
||||
jsf.Buffer = (char *)msgsubj;
|
||||
}
|
||||
JAM_PutSubfield(jsp, &jsf);
|
||||
|
||||
ptr = get_key_value(header, "Message-ID");
|
||||
if (ptr != NULL) {
|
||||
jsf.LoID = JAMSFLD_MSGID;
|
||||
jsf.HiID = 0;
|
||||
jsf.DatLen = strlen(ptr);
|
||||
jsf.Buffer = (char *)ptr;
|
||||
JAM_PutSubfield(jsp, &jsf);
|
||||
}
|
||||
|
||||
ptr = get_key_value(header, "In-Reply-To");
|
||||
if (ptr != NULL) {
|
||||
jsf.LoID = JAMSFLD_REPLYID;
|
||||
jsf.HiID = 0;
|
||||
jsf.DatLen = strlen(ptr);
|
||||
jsf.Buffer = (char *)ptr;
|
||||
JAM_PutSubfield(jsp, &jsf);
|
||||
}
|
||||
|
||||
jmh.Attribute |= JAM_MSG_TYPEECHO;
|
||||
|
||||
while (1) {
|
||||
@@ -313,6 +434,7 @@ int process_msgs_dat(char *msgsdat) {
|
||||
sleep(1);
|
||||
} else {
|
||||
fprintf(stderr, "Failed to lock msg base!\n");
|
||||
fclose(fptr);
|
||||
JAM_CloseMB(jb);
|
||||
free(jb);
|
||||
free(msgbody);
|
||||
@@ -327,6 +449,7 @@ int process_msgs_dat(char *msgsdat) {
|
||||
JAM_CloseMB(jb);
|
||||
free(jb);
|
||||
free(msgbody);
|
||||
fclose(fptr);
|
||||
return -1;
|
||||
} else {
|
||||
JAM_UnlockMB(jb);
|
||||
|
Reference in New Issue
Block a user