diff options
Diffstat (limited to 'src/conf_db.c')
-rw-r--r-- | src/conf_db.c | 489 |
1 files changed, 485 insertions, 4 deletions
diff --git a/src/conf_db.c b/src/conf_db.c index 9c1a70c..a888b56 100644 --- a/src/conf_db.c +++ b/src/conf_db.c @@ -32,6 +32,9 @@ #include "log.h" #include "send.h" #include "irc_string.h" +#include "conf.h" +#include "hostmask.h" +#include "resv.h" /*! \brief Return the version number on the file. Return 0 if there is no version @@ -101,7 +104,7 @@ open_db_read(const char *service, const char *filename) int errno_save = errno; if (errno != ENOENT) - ilog(LOG_TYPE_IRCD, "Can not read %s database %s", service, + ilog(LOG_TYPE_IRCD, "Can't read %s database %s", service, f->filename); MyFree(f); @@ -157,11 +160,11 @@ open_db_write(const char *service, const char *filename, if (!walloped++) sendto_realops_flags(UMODE_ALL, L_ALL, SEND_NOTICE, - "Can not back up %s database %s", + "Can't back up %s database %s", service, filename); errno = errno_save; - ilog(LOG_TYPE_IRCD, "Can not back up %s database %s", service, filename); + ilog(LOG_TYPE_IRCD, "Can't back up %s database %s", service, filename); if (f->backupfp) fclose(f->backupfp); @@ -198,7 +201,7 @@ open_db_write(const char *service, const char *filename, } if (f->backupname[0] && rename(f->backupname, filename) < 0) - ilog(LOG_TYPE_IRCD, "Cannot restore backup copy of %s", + ilog(LOG_TYPE_IRCD, "Can't restore backup copy of %s", filename); MyFree(f); @@ -592,3 +595,481 @@ write_string(const char *s, struct dbFILE *f) return 0; } + +#define SAFE_READ(x) do { \ + if ((x) < 0) { \ + break; \ + } \ +} while (0) + +#define SAFE_WRITE(x,db) do { \ + if ((x) < 0) { \ + restore_db(f); \ + ilog(LOG_TYPE_IRCD, "Write error on %s", db); \ + return; \ + } \ +} while (0) + +void +save_kline_database(void) +{ + unsigned int i = 0; + uint32_t cnt = 0, version = 0; + struct dbFILE *f = NULL; + dlink_node *ptr = NULL; + + if (!(f = open_db("kline", KPATH, "w", KLINE_DB_VERSION))) + return; + + for (i = 0; i < ATABLE_SIZE; ++i) + { + DLINK_FOREACH(ptr, atable[i].head) + { + struct AddressRec *arec = ptr->data; + + if (arec->type == CONF_KLINE && !IsConfMain(arec->aconf)) + ++cnt; + } + } + + SAFE_WRITE(write_uint32(cnt, f), KPATH); + + for (i = 0; i < ATABLE_SIZE; ++i) + { + DLINK_FOREACH(ptr, atable[i].head) + { + struct AddressRec *arec = ptr->data; + + if (arec->type == CONF_KLINE && !IsConfMain(arec->aconf)) + { + SAFE_WRITE(write_string(arec->aconf->user, f), KPATH); + SAFE_WRITE(write_string(arec->aconf->host, f), KPATH); + SAFE_WRITE(write_string(arec->aconf->reason, f), KPATH); + SAFE_WRITE(write_uint64(arec->aconf->setat, f), KPATH); + SAFE_WRITE(write_uint64(arec->aconf->hold, f), KPATH); + } + } + } + + close_db(f); +} + +void +load_kline_database(void) +{ + unsigned int i = 0; + uint32_t cnt = 0, version = 0; + uint64_t tmp64 = 0; + struct dbFILE *f = NULL; + dlink_node *ptr = NULL, *ptr_next = NULL; + + if (!(f = open_db("kline", KPATH, "r", KLINE_DB_VERSION))) + return; + + if ((version = get_file_version(f) < 1)) + { + close_db(f); + return; + } + + read_uint32(&cnt, f); + + for (i = 0; i < cnt; ++i) + { + struct AccessItem *aconf = map_to_conf(make_conf_item(KLINE_TYPE)); + + SAFE_READ(read_string(&aconf->user, f)); + SAFE_READ(read_string(&aconf->host, f)); + SAFE_READ(read_string(&aconf->reason, f)); + + SAFE_READ(read_uint64(&tmp64, f)); + aconf->setat = tmp64; + + SAFE_READ(read_uint64(&tmp64, f)); + aconf->hold = tmp64; + + if (aconf->hold) + SetConfTemporary(aconf); + + add_conf_by_address(CONF_KLINE, aconf); + } + + close_db(f); +} + +void +save_dline_database(void) +{ + unsigned int i = 0; + uint32_t cnt = 0, version = 0; + struct dbFILE *f = NULL; + dlink_node *ptr = NULL; + + if (!(f = open_db("dline", DLPATH, "w", KLINE_DB_VERSION))) + return; + + for (i = 0; i < ATABLE_SIZE; ++i) + { + DLINK_FOREACH(ptr, atable[i].head) + { + struct AddressRec *arec = ptr->data; + + if (arec->type == CONF_DLINE && !IsConfMain(arec->aconf)) + ++cnt; + } + } + + SAFE_WRITE(write_uint32(cnt, f), DLPATH); + + for (i = 0; i < ATABLE_SIZE; ++i) + { + DLINK_FOREACH(ptr, atable[i].head) + { + struct AddressRec *arec = ptr->data; + + if (arec->type == CONF_DLINE && !IsConfMain(arec->aconf)) + { + SAFE_WRITE(write_string(arec->aconf->host, f), DLPATH); + SAFE_WRITE(write_string(arec->aconf->reason, f), DLPATH); + SAFE_WRITE(write_uint64(arec->aconf->setat, f), DLPATH); + SAFE_WRITE(write_uint64(arec->aconf->hold, f), DLPATH); + } + } + } + + close_db(f); +} + +void +load_dline_database(void) +{ + unsigned int i = 0; + uint32_t cnt = 0, version = 0; + uint64_t tmp64 = 0; + struct dbFILE *f = NULL; + dlink_node *ptr = NULL, *ptr_next = NULL; + + if (!(f = open_db("dline", DLPATH, "r", KLINE_DB_VERSION))) + return; + + if ((version = get_file_version(f) < 1)) + { + close_db(f); + return; + } + + read_uint32(&cnt, f); + + for (i = 0; i < cnt; ++i) + { + struct AccessItem *aconf = map_to_conf(make_conf_item(DLINE_TYPE)); + + SAFE_READ(read_string(&aconf->host, f)); + SAFE_READ(read_string(&aconf->reason, f)); + + SAFE_READ(read_uint64(&tmp64, f)); + aconf->setat = tmp64; + + SAFE_READ(read_uint64(&tmp64, f)); + aconf->hold = tmp64; + + if (aconf->hold) + SetConfTemporary(aconf); + + add_conf_by_address(CONF_DLINE, aconf); + } + + close_db(f); +} + +void +save_gline_database(void) +{ + unsigned int i = 0; + uint32_t cnt = 0, version = 0; + struct dbFILE *f = NULL; + dlink_node *ptr = NULL; + + if (!(f = open_db("gline", GPATH, "w", KLINE_DB_VERSION))) + return; + + for (i = 0; i < ATABLE_SIZE; ++i) + { + DLINK_FOREACH(ptr, atable[i].head) + { + struct AddressRec *arec = ptr->data; + + if (arec->type == CONF_GLINE && !IsConfMain(arec->aconf)) + ++cnt; + } + } + + SAFE_WRITE(write_uint32(cnt, f), GPATH); + + for (i = 0; i < ATABLE_SIZE; ++i) + { + DLINK_FOREACH(ptr, atable[i].head) + { + struct AddressRec *arec = ptr->data; + + if (arec->type == CONF_GLINE && !IsConfMain(arec->aconf)) + { + SAFE_WRITE(write_string(arec->aconf->user, f), GPATH); + SAFE_WRITE(write_string(arec->aconf->host, f), GPATH); + SAFE_WRITE(write_string(arec->aconf->reason, f), GPATH); + SAFE_WRITE(write_uint64(arec->aconf->setat, f), GPATH); + SAFE_WRITE(write_uint64(arec->aconf->hold, f), GPATH); + } + } + } + + close_db(f); +} + +void +load_gline_database(void) +{ + unsigned int i = 0; + uint32_t cnt = 0, version = 0; + uint64_t tmp64 = 0; + struct dbFILE *f = NULL; + dlink_node *ptr = NULL, *ptr_next = NULL; + + if (!(f = open_db("gline", GPATH, "r", KLINE_DB_VERSION))) + return; + + if ((version = get_file_version(f) < 1)) + { + close_db(f); + return; + } + + read_uint32(&cnt, f); + + for (i = 0; i < cnt; ++i) + { + struct AccessItem *aconf = map_to_conf(make_conf_item(GLINE_TYPE)); + + SAFE_READ(read_string(&aconf->user, f)); + SAFE_READ(read_string(&aconf->host, f)); + SAFE_READ(read_string(&aconf->reason, f)); + + SAFE_READ(read_uint64(&tmp64, f)); + aconf->setat = tmp64; + + SAFE_READ(read_uint64(&tmp64, f)); + aconf->hold = tmp64; + + if (aconf->hold) + SetConfTemporary(aconf); + + add_conf_by_address(CONF_GLINE, aconf); + } + + close_db(f); +} + +void +save_resv_database(void) +{ + unsigned int i = 0; + uint32_t cnt = 0, version = 0; + struct dbFILE *f = NULL; + dlink_node *ptr = NULL; + struct ConfItem *conf; + struct ResvChannel *resv_cp; + struct MatchItem *resv_np; + + if (!(f = open_db("resv", RESVPATH, "w", KLINE_DB_VERSION))) + return; + + DLINK_FOREACH(ptr, resv_channel_list.head) + { + resv_cp = ptr->data; + + if (!resv_cp->conf) + ++cnt; + } + + DLINK_FOREACH(ptr, nresv_items.head) + { + resv_np = map_to_conf(ptr->data); + + if (!resv_np->action) + ++cnt; + } + + SAFE_WRITE(write_uint32(cnt, f), RESVPATH); + + + DLINK_FOREACH(ptr, resv_channel_list.head) + { + resv_cp = ptr->data; + + SAFE_WRITE(write_string(resv_cp->name, f), RESVPATH); + SAFE_WRITE(write_string(resv_cp->reason, f), RESVPATH); + SAFE_WRITE(write_uint64(resv_cp->setat, f), RESVPATH); + SAFE_WRITE(write_uint64(resv_cp->hold, f), RESVPATH); + } + + DLINK_FOREACH(ptr, nresv_items.head) + { + conf = ptr->data; + resv_np = map_to_conf(conf); + + SAFE_WRITE(write_string(conf->name, f), RESVPATH); + SAFE_WRITE(write_string(resv_np->reason, f), RESVPATH); + SAFE_WRITE(write_uint64(resv_np->setat, f), RESVPATH); + SAFE_WRITE(write_uint64(resv_np->hold, f), RESVPATH); + } + + close_db(f); +} + +void +load_resv_database(void) +{ + unsigned int i = 0; + uint32_t cnt = 0, version = 0; + uint64_t tmp64_hold = 0, tmp64_setat = 0; + struct dbFILE *f = NULL; + dlink_node *ptr = NULL, *ptr_next = NULL; + char *name = NULL; + char *reason = NULL; + struct ConfItem *conf; + struct ResvChannel *resv_cp; + struct MatchItem *resv_np; + + if (!(f = open_db("resv", RESVPATH, "r", KLINE_DB_VERSION))) + return; + + if ((version = get_file_version(f) < 1)) + { + close_db(f); + return; + } + + read_uint32(&cnt, f); + + for (i = 0; i < cnt; ++i) + { + SAFE_READ(read_string(&name, f)); + SAFE_READ(read_string(&reason, f)); + SAFE_READ(read_uint64(&tmp64_setat, f)); + SAFE_READ(read_uint64(&tmp64_hold, f)); + + if (IsChanPrefix(*name)) + { + if ((conf = create_channel_resv(name, reason, 0)) == NULL) + continue; + + resv_cp = map_to_conf(conf); + resv_cp->setat = tmp64_setat; + resv_cp->hold = tmp64_hold; + + if (resv_cp->hold) + add_temp_line(conf); + } + else + { + if ((conf = create_nick_resv(name, reason, 0)) == NULL) + continue; + + resv_np = map_to_conf(conf); + resv_np->setat = tmp64_setat; + resv_np->hold = tmp64_hold; + + if (resv_np->hold) + add_temp_line(conf); + } + + MyFree(name); + MyFree(reason); + } + + close_db(f); +} + +void +save_xline_database(void) +{ + unsigned int i = 0; + uint32_t cnt = 0, version = 0; + struct dbFILE *f = NULL; + dlink_node *ptr = NULL; + struct ConfItem *conf = NULL; + struct MatchItem *xconf = NULL; + + if (!(f = open_db("xline", XPATH, "w", KLINE_DB_VERSION))) + return; + + DLINK_FOREACH(ptr, xconf_items.head) + { + conf = ptr->data; + + if (!IsConfMain(conf)) + ++cnt; + } + + SAFE_WRITE(write_uint32(cnt, f), XPATH); + + + DLINK_FOREACH(ptr, xconf_items.head) + { + conf = ptr->data; + xconf = map_to_conf(conf); + + SAFE_WRITE(write_string(conf->name, f), XPATH); + SAFE_WRITE(write_string(xconf->reason, f), XPATH); + SAFE_WRITE(write_uint64(xconf->setat, f), XPATH); + SAFE_WRITE(write_uint64(xconf->hold, f), XPATH); + } + + close_db(f); +} + +void +load_xline_database(void) +{ + unsigned int i = 0; + uint32_t cnt = 0, version = 0; + uint64_t tmp64_hold = 0, tmp64_setat = 0; + struct dbFILE *f = NULL; + dlink_node *ptr = NULL, *ptr_next = NULL; + char *name = NULL; + char *reason = NULL; + struct ConfItem *conf = NULL; + struct MatchItem *xconf = NULL; + + if (!(f = open_db("xline", XPATH, "r", KLINE_DB_VERSION))) + return; + + if ((version = get_file_version(f) < 1)) + { + close_db(f); + return; + } + + read_uint32(&cnt, f); + + for (i = 0; i < cnt; ++i) + { + SAFE_READ(read_string(&name, f)); + SAFE_READ(read_string(&reason, f)); + SAFE_READ(read_uint64(&tmp64_setat, f)); + SAFE_READ(read_uint64(&tmp64_hold, f)); + + conf = make_conf_item(XLINE_TYPE); + xconf = map_to_conf(conf); + + conf->name = name; + xconf->reason = reason; + xconf->setat = tmp64_setat; + xconf->hold = tmp64_hold; + + if (xconf->hold) + SetConfTemporary(conf); + } + + close_db(f); +} |