experimental areafix type thing
This commit is contained in:
@@ -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;
|
||||
|
Reference in New Issue
Block a user