experimental areafix type thing

This commit is contained in:
Andrew Pamment
2018-05-24 14:05:00 +10:00
parent 99a7223a0a
commit 6fa4102e0c
5 changed files with 477 additions and 1 deletions

View File

@@ -10,6 +10,8 @@
char *baseindir = NULL;
char *baseoutdir = NULL;
char *config_file;
int imhub = 0;
struct msgarea_t {
@@ -28,6 +30,7 @@ struct msg_t {
uint32_t timedate;
int oaddr;
int daddr;
int type;
char reply[36];
} __attribute__ ((packed));
@@ -258,6 +261,48 @@ int isdupe(struct msg_t *msg, char *uuid) {
return 0;
}
void update_config_file_area(int areaid) {
char backup[PATH_MAX];
char buffer[256];
char bufferc[256];
char bufferw[256];
FILE *fptr1;
FILE *fptr2;
char *ptr;
int id;
int i;
snprintf(backup, "%s.bak", config_file);
fptr1 = fopen(config_file, "r");
fptr2 = fopen(backup, "w");
fgets(buffer, 256, fptr1);
while (!feof(fptr1)) {
if (strncasecmp(buffer, "MSGAREA", 7) == 0) {
strcpy(bufferc, buffer);
ptr = strtok(&bufferc[8], ",");
if (ptr != NULL) {
trimwhitespace(bufferw, 256, ptr);
id = atoi(bufferw);
if (id == areaid) {
fprintf(fptr2, "MSGAREA, %d, %d, %s", areas[areaid]->id, areas[areaid]->hub, areas[areaid]->basedir);
for (i=0;i<areas[areaid]->link_count;i++) {
fprintf(fptr2, ", %d", areas[areaid]->links[i]);
}
fprintf(fptr2, "\n");
} else {
fputs(buffer, fptr2);
}
}
} else {
fputs(buffer, fptr2);
}
fgets(buffer, 256, fptr1);
}
unlink(config_file);
rename(backup, config_file);
}
int import(char *filename) {
FILE *fptr;
char buffer[PATH_MAX];
@@ -269,6 +314,7 @@ int import(char *filename) {
struct stat st;
int z;
int i;
int j;
char *body;
s_JamBase *jb;
s_JamBaseHeader jbh;
@@ -316,6 +362,52 @@ int import(char *filename) {
}
if (areas[areaid]->hub == mynode) {
if (msg.type == 1) {
if (strncasecmp(body, "ADD", 3) == 0) {
for (i=0;i<areas[areaid]->link_count;i++) {
if (areas[areaid]->links[i] == msg.oaddr) {
// already subscribed
return 1;
}
}
if (areas[areaid]->link_count == 0) {
areas[areaid]->links = (int *)malloc(sizeof(int));
} else {
areas[areaid]->links = (int *)realloc(areas[areaid]->links, sizeof(int) * (areas[areaid]->link_count + 1));
}
areas[areaid]->links[areas[areaid]->link_count] = msg.oaddr;
areas[areaid]->link_count++;
//
update_config_file_area(areaid);
} else if (strncasecmp(body, "REMOVE", 6) == 0) {
for (i=0;i<areas[areaid]->link_count;i++) {
if (areas[areaid]->links[i] == msg.oaddr) {
if (areas[areaid]->link_count == 1) {
free(areas[areaid]->links);
areas[areaid]->link_count = 0;
} else {
for (j=i;j<areas[areaid]->link_count-1;j++) {
areas[areaid]->links[j] = areas[areaid]->links[j+1];
}
areas[areaid]->links = (int *)realloc(areas[areaid]->links, sizeof(int) * (areas[areaid]->link_count - 1));
areas[areaid]->link_count--;
}
update_config_file_area(areaid);
return 1;
}
}
}
return 1;
}
for (i=0;i<areas[areaid]->link_count;i++) {
if (areas[areaid]->links[i] == msg.oaddr) {
continue;
@@ -342,6 +434,7 @@ int import(char *filename) {
}
}
ret = isdupe(&msg, uuid);
if (ret == -1) {
free(body);
@@ -456,6 +549,8 @@ int main(int argc, char **argv) {
return -1;
}
config_file = argv[1];
if (baseoutdir == NULL) {
fprintf(stderr, "OUTDIR must be defined\n");
return -1;