diff options
| author | Lucas Castro <lucas@gnuabordo.com.br> | 2024-01-10 22:33:44 -0300 |
|---|---|---|
| committer | Lucas Castro <lucas@gnuabordo.com.br> | 2024-01-10 22:33:44 -0300 |
| commit | a4270020addc324fb60d2b1b446b41bc31e3baf8 (patch) | |
| tree | 8708f08c66a63f08c0cd88ab1a46faadcd3f4706 /save_statuses.c | |
Import Upstream version 1.0.4upstream/1.0.4
Diffstat (limited to 'save_statuses.c')
| -rw-r--r-- | save_statuses.c | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/save_statuses.c b/save_statuses.c new file mode 100644 index 0000000..d1178a4 --- /dev/null +++ b/save_statuses.c @@ -0,0 +1,93 @@ +/* + +(C) 2013 Mika Ilmaranta <ilmis@nullnet.fi> + +License: GPLv2 + +*/ + +#include <stdlib.h> +#include <syslog.h> +#include <string.h> + +#include "config.h" +#include "lsm.h" +#include "save_statuses.h" + +typedef struct status_data { + char *name; + STATUS status; + struct status_data *next; +} STATUS_DATA; + +static STATUS_DATA *first_status = NULL; +static STATUS_DATA *last_status = NULL; +static STATUS_DATA *cur_status = NULL; + +void save_statuses(CONFIG *first) +{ + CONFIG *cur; + + if(first_status != NULL) { + syslog(LOG_ERR, "%s: %s: statuses already saved?", __FILE__, __FUNCTION__); + return; + } + + /* store connection statuses temporarily */ + for(cur = first; cur; cur = cur->next) { + if((cur_status = malloc(sizeof(STATUS_DATA))) == NULL) { + syslog(LOG_ERR, "%s: %s: couldn't malloc for status_data", __FILE__, __FUNCTION__); + exit(1); + } + cur_status->name = strdup(cur->name); + cur_status->status = ((TARGET *)cur->data)->status; + + if(last_status) { + last_status->next = cur_status; + last_status = cur_status; + cur_status->next = NULL; + } else { + first_status = cur_status; + last_status = cur_status; + cur_status->next = NULL; + } + } +} + +void restore_statuses(CONFIG *first) +{ + CONFIG *cur; + + if(first_status == NULL) { + syslog(LOG_ERR, "%s: %s: can't restore statuses, none saved?", __FILE__, __FUNCTION__); + return; + } + + /* restore connection statuses */ + for(cur_status = first_status; cur_status; cur_status = cur_status->next) { + for(cur = first; cur; cur = cur->next) { + if(strcmp(cur_status->name, cur->name) == 0) { + ((TARGET *)cur->data)->status = cur_status->status; + } + } + } + + /* get rid of temporary statuses */ + cur_status = first_status; + while(cur_status) { + STATUS_DATA *tmp; + + tmp = cur_status->next; + + free(cur_status->name); + free(cur_status); + + cur_status = tmp; + } + + first_status = NULL; + last_status = NULL; + cur_status = NULL; +} + +/* EOF */ |
