Initial work on wwivnet tools
This commit is contained in:
parent
3e08583517
commit
13a7404194
19
utils/wwivnet/wwivnet.h
Normal file
19
utils/wwivnet/wwivnet.h
Normal file
@ -0,0 +1,19 @@
|
||||
#ifndef __WWIVNET_H__
|
||||
#define __WWIVNET_H__
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
struct net_header_rec {
|
||||
uint16_t tosys, /* destination system */
|
||||
touser, /* destination user */
|
||||
fromsys, /* originating system */
|
||||
fromuser, /* originating user */
|
||||
main_type, /* main message type */
|
||||
minor_type, /* minor message type */
|
||||
list_len; /* # of entries in system list */
|
||||
uint32_t daten, /* date/time sent */
|
||||
length; /* # of bytes of msg after header */
|
||||
uint16_t method; /* method of compression */
|
||||
} __attribute__((packed));
|
||||
|
||||
#endif
|
169
utils/wwivnet/wwivtoss.c
Normal file
169
utils/wwivnet/wwivtoss.c
Normal file
@ -0,0 +1,169 @@
|
||||
#include <limits.h>
|
||||
#include <dirent.h>
|
||||
#include "wwivnet.h"
|
||||
#include "../../deps/jamlib/jam.h"
|
||||
#include "../../src/inih/ini.h"
|
||||
|
||||
char *config_file;
|
||||
char *inbound_dir = NULL;
|
||||
char *outbound_dir = NULL;
|
||||
uint16_t wwivnet_node = 0;
|
||||
|
||||
static int handler(void* user, const char* section, const char* name,
|
||||
const char* value)
|
||||
{
|
||||
if (strcasecmp(section, "main") == 0) {
|
||||
if (strcasecmp(name, "inbound") == 0) {
|
||||
inbound_dir = strdup(value);
|
||||
} else if (strcasecmp(name, "outbound") == 0) {
|
||||
outbound_dir = strdup(value);
|
||||
} else if (strcasecmp(name, "wwiv node") == 0) {
|
||||
wwivnet_node = atoi(value);
|
||||
}
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
void main_type_new_post(struct net_header_rec *msg_hdr, char *msg_txt) {
|
||||
char *subtype;
|
||||
char *ptr;
|
||||
char *title;
|
||||
|
||||
subtype = strdup(msg_txt);
|
||||
|
||||
ptr = msg_txt;
|
||||
while (*ptr != '\0') {
|
||||
ptr++;
|
||||
}
|
||||
ptr++;
|
||||
|
||||
title = strdup(ptr);
|
||||
while (*ptr != '\0') {
|
||||
ptr++;
|
||||
}
|
||||
ptr++;
|
||||
|
||||
|
||||
}
|
||||
|
||||
int process_file(char *filename) {
|
||||
char buffer[PATH_MAX];
|
||||
FILE *fptr;
|
||||
struct net_header_rec msg_hdr;
|
||||
char *msg_txt;
|
||||
|
||||
snprintf(buffer, PATH_MAX, "%s/%s", inbound_dir, filename);
|
||||
|
||||
|
||||
|
||||
fptr = fopen(buffer, "rb");
|
||||
if (!fptr) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
while (!feof(fptr)) {
|
||||
if (fread(&msg_hdr, sizeof(struct net_header_rec), 1, fptr) != 1) {
|
||||
break;
|
||||
}
|
||||
|
||||
if (msg_hdr.length > 0) {
|
||||
msg_txt = (char *)malloc(msg_hdr.length);
|
||||
if (fread(msg_txt, 1, msg_hdr.length, fptr) != msg_hdr.length) {
|
||||
free(msg_txt);
|
||||
fprintf(stderr, "Short read on message.\n");
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
msg_txt = NULL;
|
||||
}
|
||||
|
||||
switch(msg_hdr.main_type) {
|
||||
case 0x0001:
|
||||
// main_type_net_info
|
||||
fprintf(stderr, "Got main_type_net_info\n");
|
||||
break;
|
||||
case 0x0002:
|
||||
// main_type_email
|
||||
fprintf(stderr, "Got main_type_email\n");
|
||||
break;
|
||||
case 0x0007:
|
||||
// main_type_email_name
|
||||
fprintf(stderr, "Got main_type_email_name\n");
|
||||
break;
|
||||
case 0x0009:
|
||||
// main_type_sub_list
|
||||
fprintf(stderr, "Got main_type_sub_list\n");
|
||||
break;
|
||||
case 0x000f:
|
||||
// main_type_ssm
|
||||
fprintf(stderr, "Got main_type_ssm\n");
|
||||
break;
|
||||
case 0x0010:
|
||||
// main_type_sub_add_req
|
||||
fprintf(stderr, "Got main_type_sub_add_req\n");
|
||||
break;
|
||||
case 0x0011:
|
||||
// main_type_sub_drop_req
|
||||
fprintf(stderr, "Got main_type_sub_drop_req\n");
|
||||
break;
|
||||
case 0x0012:
|
||||
// main_type_sub_add_resp
|
||||
fprintf(stderr, "Got main_type_sub_add_resp\n");
|
||||
break;
|
||||
case 0x0013:
|
||||
// main_type_sub_drop_resp
|
||||
fprintf(stderr, "Got main_type_sub_drop_resp\n");
|
||||
break;
|
||||
case 0x0014:
|
||||
// main_type_sub_list_info
|
||||
fprintf(stderr, "Got main_type_sub_list_info\n");
|
||||
break;
|
||||
case 0x001a:
|
||||
// main_type_new_post
|
||||
main_type_new_post(&msg_hdr, msg_txt);
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "Unsupported main type 0x%x\n", msg_hdr.main_type);
|
||||
break;
|
||||
}
|
||||
if (msg_txt != NULL) {
|
||||
free(msg_txt);
|
||||
}
|
||||
}
|
||||
|
||||
fclose(fptr);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
DIR *inb;
|
||||
struct dirent *dent;
|
||||
char buffer[256];
|
||||
|
||||
if (argc < 2) {
|
||||
fprintf(stderr, "Usage:\n ./wwivtoss config.ini\n");
|
||||
return -1;
|
||||
}
|
||||
config_file = argv[1];
|
||||
|
||||
if (ini_parse(config_file, handler, NULL) <0) {
|
||||
fprintf(stderr, "Unable to load configuration ini (%s)!\n", config_file);
|
||||
exit(-1);
|
||||
}
|
||||
|
||||
snprintf(buffer, 256, "s%d.net", wwivnet_node);
|
||||
|
||||
inb = opendir(inbound_dir);
|
||||
if (!inb) {
|
||||
fprintf(stderr, "Error opening inbound directory\n");
|
||||
return -1;
|
||||
}
|
||||
while ((dent = readdir(inb)) != NULL) {
|
||||
if (strncmp(dent->d_name, buffer, strlen(buffer)) == 0) {
|
||||
if(process_file(dent->d_name)) {
|
||||
rewinddir(inb);
|
||||
}
|
||||
}
|
||||
}
|
||||
closedir(inb);
|
||||
}
|
Reference in New Issue
Block a user