Basic support for syncronet's headers.dat

This commit is contained in:
Andrew Pamment 2018-10-31 08:42:35 +10:00
parent d719141f68
commit 0b0078b1e7
7 changed files with 267 additions and 12 deletions

View File

@ -151,6 +151,7 @@ struct bbs_config {
gid_t gid;
int codepage;
int ipv6;
char *external_address;
char *bbs_name;
char *bwave_name;
char *sysop_name;

View File

@ -698,6 +698,16 @@ int bwave_add_message(int confr, int area, unsigned int dwritten, char *to, char
jsf.DatLen = strlen(conf.bwave_name);
jsf.Buffer = (char *)conf.bwave_name;
JAM_PutSubfield(jsp, &jsf);
if (conf.external_address != NULL) {
snprintf(buffer, sizeof buffer, "<%lx.%s@%s>", generate_msgid(), basename(ma->path), conf.external_address);
jsf.LoID = JAMSFLD_MSGID;
jsf.HiID = 0;
jsf.DatLen = strlen(buffer);
jsf.Buffer = (char *)buffer;
JAM_PutSubfield(jsp, &jsf);
}
}
} else if (ma->type == TYPE_NETMAIL_AREA && mc->nettype == NETWORK_FIDO) {
jmh.Attribute |= JAM_MSG_TYPENET;

View File

@ -1731,6 +1731,25 @@ int read_message(struct user_record *user, struct msg_headers *msghs, int mailno
jsf.DatLen = strlen(conf.bwave_name);
jsf.Buffer = (char *)conf.bwave_name;
JAM_PutSubfield(jsp, &jsf);
if (conf.external_address != NULL) {
snprintf(buffer, sizeof buffer, "<%lx.%s@%s>", generate_msgid(), basename(ma->path), conf.external_address);
jsf.LoID = JAMSFLD_MSGID;
jsf.HiID = 0;
jsf.DatLen = strlen(buffer);
jsf.Buffer = (char *)buffer;
JAM_PutSubfield(jsp, &jsf);
if (msghs->msgs[mailno]->msgid != NULL) {
strlcpy(buffer, msghs->msgs[mailno]->msgid, sizeof buffer);
jsf.LoID = JAMSFLD_REPLYID;
jsf.HiID = 0;
jsf.DatLen = strlen(buffer);
jsf.Buffer = (char *)buffer;
JAM_PutSubfield(jsp, &jsf);
jmh.ReplyCRC = JAM_Crc32(buffer, strlen(buffer));
}
}
}
} else if (ma->type == TYPE_NETMAIL_AREA) {
jmh.Attribute |= JAM_MSG_TYPENET;
@ -2181,6 +2200,16 @@ void post_message(struct user_record *user) {
jsf.DatLen = strlen(conf.bwave_name);
jsf.Buffer = (char *)conf.bwave_name;
JAM_PutSubfield(jsp, &jsf);
if (conf.external_address != NULL) {
snprintf(buffer, sizeof buffer, "<%lx.%s@%s>", generate_msgid(), basename(ma->path), conf.external_address);
jsf.LoID = JAMSFLD_MSGID;
jsf.HiID = 0;
jsf.DatLen = strlen(buffer);
jsf.Buffer = (char *)buffer;
JAM_PutSubfield(jsp, &jsf);
}
}
} else if (ma->type == TYPE_NETMAIL_AREA) {
jmh.Attribute |= JAM_MSG_TYPENET;

View File

@ -308,6 +308,8 @@ static int handler(void *user, const char *section, const char *name,
if (strcasecmp(section, "main") == 0) {
if (strcasecmp(name, "bbs name") == 0) {
conf->bbs_name = strdup(value);
} else if (strcasecmp(name, "external address") == 0) {
conf->external_address = strdup(value);
} else if (strcasecmp(name, "telnet port") == 0) {
conf->telnet_port = atoi(value);
} else if (strcasecmp(name, "enable ssh") == 0) {
@ -1178,7 +1180,8 @@ int main(int argc, char **argv) {
conf.ipv6 = 0;
conf.uid = getuid();
conf.gid = getgid();
conf.external_address = NULL;
// Load BBS data
if (ini_parse(argv[1], handler, &conf) < 0) {
fprintf(stderr, "Unable to load configuration ini (%s)!\n", argv[1]);

View File

@ -1049,7 +1049,7 @@ int www_send_msg(struct user_record *user, char *to, char *subj, int conference,
jsf.DatLen = strlen(replyid);
jsf.Buffer = (char *)replyid;
JAM_PutSubfield(jsp, &jsf);
jmh.ReplyCRC = JAM_Crc32(buffer, strlen(replyid));
jmh.ReplyCRC = JAM_Crc32(replyid, strlen(replyid));
}
} else if (mc->nettype == NETWORK_MAGI) {
snprintf(buffer, sizeof buffer, "%d", mc->maginode);
@ -1075,7 +1075,31 @@ int www_send_msg(struct user_record *user, char *to, char *subj, int conference,
jsf.DatLen = strlen(replyid);
jsf.Buffer = (char *)replyid;
JAM_PutSubfield(jsp, &jsf);
jmh.ReplyCRC = JAM_Crc32(buffer, strlen(replyid));
jmh.ReplyCRC = JAM_Crc32(replyid, strlen(replyid));
}
} else if (mc->nettype == NETWORK_QWK) {
jsf.LoID = JAMSFLD_OADDRESS;
jsf.HiID = 0;
jsf.DatLen = strlen(conf.bwave_name);
jsf.Buffer = (char *)conf.bwave_name;
JAM_PutSubfield(jsp, &jsf);
if (conf.external_address != NULL) {
snprintf(buffer, sizeof buffer, "<%lx.%s@%s>", generate_msgid(), basename(ma->path), conf.external_address);
jsf.LoID = JAMSFLD_MSGID;
jsf.HiID = 0;
jsf.DatLen = strlen(buffer);
jsf.Buffer = (char *)buffer;
JAM_PutSubfield(jsp, &jsf);
if (strcasecmp(replyid, "NULL") != 0) {
jsf.LoID = JAMSFLD_REPLYID;
jsf.HiID = 0;
jsf.DatLen = strlen(replyid);
jsf.Buffer = (char *)replyid;
JAM_PutSubfield(jsp, &jsf);
jmh.ReplyCRC = JAM_Crc32(replyid, strlen(replyid));
}
}
}
}

View File

@ -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++ = '*';

View File

@ -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);