#include "stdinc.h"
#include "ircd_defs.h"
-#include "common.h"
#include "s_conf.h"
#include "s_newconf.h"
#include "client.h"
#include "logger.h"
#include "dns.h"
-rb_dlink_list shared_conf_list;
rb_dlink_list cluster_conf_list;
rb_dlink_list oper_conf_list;
-rb_dlink_list hubleaf_conf_list;
rb_dlink_list server_conf_list;
rb_dlink_list xline_conf_list;
rb_dlink_list resv_conf_list; /* nicks only! */
rb_dlink_node *ptr;
rb_dlink_node *next_ptr;
- RB_DLINK_FOREACH_SAFE(ptr, next_ptr, shared_conf_list.head)
- {
- /* ptr here is ptr->data->node */
- rb_dlinkDelete(ptr, &shared_conf_list);
- free_remote_conf(ptr->data);
- }
-
RB_DLINK_FOREACH_SAFE(ptr, next_ptr, cluster_conf_list.head)
{
rb_dlinkDelete(ptr, &cluster_conf_list);
free_remote_conf(ptr->data);
}
- RB_DLINK_FOREACH_SAFE(ptr, next_ptr, hubleaf_conf_list.head)
- {
- rb_dlinkDelete(ptr, &hubleaf_conf_list);
- free_remote_conf(ptr->data);
- }
-
RB_DLINK_FOREACH_SAFE(ptr, next_ptr, oper_conf_list.head)
{
free_oper_conf(ptr->data);
rb_free(remote_p);
}
-int
-find_shared_conf(const char *username, const char *host,
- const char *server, int flags)
-{
- struct remote_conf *shared_p;
- rb_dlink_node *ptr;
-
- RB_DLINK_FOREACH(ptr, shared_conf_list.head)
- {
- shared_p = ptr->data;
-
- if(match(shared_p->username, username) &&
- match(shared_p->host, host) &&
- match(shared_p->server, server))
- {
- if(shared_p->flags & flags)
- return YES;
- else
- return NO;
- }
- }
-
- return NO;
-}
-
void
propagate_generic(struct Client *source_p, const char *command,
const char *target, int cap, const char *format, ...)
make_server_conf(void)
{
struct server_conf *server_p = rb_malloc(sizeof(struct server_conf));
- server_p->aftype = AF_INET;
+
+ SET_SS_FAMILY(&server_p->connect4, AF_UNSPEC);
+ SET_SS_LEN(&server_p->connect4, sizeof(struct sockaddr_in));
+
+ SET_SS_FAMILY(&server_p->bind4, AF_UNSPEC);
+ SET_SS_LEN(&server_p->bind4, sizeof(struct sockaddr_in));
+
+ SET_SS_FAMILY(&server_p->connect6, AF_UNSPEC);
+ SET_SS_LEN(&server_p->connect6, sizeof(struct sockaddr_in6));
+
+ SET_SS_FAMILY(&server_p->bind6, AF_UNSPEC);
+ SET_SS_LEN(&server_p->bind6, sizeof(struct sockaddr_in6));
+
+ server_p->aftype = AF_UNSPEC;
+
return server_p;
}
}
rb_free(server_p->name);
- rb_free(server_p->host);
+ rb_free(server_p->connect_host);
+ rb_free(server_p->bind_host);
rb_free(server_p->class_name);
+ rb_free(server_p->certfp);
rb_free(server_p);
}
/*
- * conf_dns_callback
+ * conf_connect_dns_callback
+ * inputs - pointer to struct ConfItem
+ * - pointer to adns reply
+ * output - none
+ * side effects - called when resolver query finishes
+ * if the query resulted in a successful search, hp will contain
+ * a non-null pointer, otherwise hp will be null.
+ * if successful save hp in the conf item it was called with
+ */
+static void
+conf_connect_dns_callback(const char *result, int status, int aftype, void *data)
+{
+ struct server_conf *server_p = data;
+
+ if(aftype == AF_INET)
+ {
+ if(status == 1)
+ rb_inet_pton_sock(result, &server_p->connect4);
+
+ server_p->dns_query_connect4 = 0;
+ }
+ else if(aftype == AF_INET6)
+ {
+ if(status == 1)
+ rb_inet_pton_sock(result, &server_p->connect6);
+
+ server_p->dns_query_connect6 = 0;
+ }
+}
+
+/*
+ * conf_bind_dns_callback
* inputs - pointer to struct ConfItem
* - pointer to adns reply
* output - none
* if successful save hp in the conf item it was called with
*/
static void
-conf_dns_callback(const char *result, int status, int aftype, void *data)
+conf_bind_dns_callback(const char *result, int status, int aftype, void *data)
{
struct server_conf *server_p = data;
- if(status == 1)
- rb_inet_pton_sock(result, (struct sockaddr *)&server_p->my_ipnum);
+ if(aftype == AF_INET)
+ {
+ if(status == 1)
+ rb_inet_pton_sock(result, &server_p->bind4);
- server_p->dns_query = 0;
+ server_p->dns_query_bind4 = 0;
+ }
+ else if(aftype == AF_INET6)
+ {
+ if(status == 1)
+ rb_inet_pton_sock(result, &server_p->bind6);
+
+ server_p->dns_query_bind6 = 0;
+ }
}
void
server_p->class_name = rb_strdup("default");
}
- if(strpbrk(server_p->host, "*?"))
- return;
+ if(server_p->connect_host && !strpbrk(server_p->connect_host, "*?"))
+ {
+ server_p->dns_query_connect4 =
+ lookup_hostname(server_p->connect_host, AF_INET, conf_connect_dns_callback, server_p);
+ server_p->dns_query_connect6 =
+ lookup_hostname(server_p->connect_host, AF_INET6, conf_connect_dns_callback, server_p);
+ }
- server_p->dns_query =
- lookup_hostname(server_p->host, GET_SS_FAMILY(&server_p->my_ipnum), conf_dns_callback, server_p);
+ if(server_p->bind_host)
+ {
+ server_p->dns_query_bind4 =
+ lookup_hostname(server_p->bind_host, AF_INET, conf_bind_dns_callback, server_p);
+ server_p->dns_query_bind6 =
+ lookup_hostname(server_p->bind_host, AF_INET6, conf_bind_dns_callback, server_p);
+ }
}
struct server_conf *
else
server_p->flags &= ~SERVER_AUTOCONN;
- sendto_realops_snomask(SNO_GENERAL, L_ALL,
+ sendto_realops_snomask(SNO_GENERAL, L_NETWIDE,
"%s has changed AUTOCONN for %s to %i",
get_oper_name(source_p), name, newval);
}
{
server_p->flags &= ~SERVER_AUTOCONN;
- sendto_realops_snomask(SNO_GENERAL, L_ALL,
+ sendto_realops_snomask(SNO_GENERAL, L_NETWIDE,
"Disabling AUTOCONN for %s because of error",
name);
ilog(L_SERVER, "Disabling AUTOCONN for %s because of error",
valid_temp_time(const char *p)
{
time_t result = 0;
+ long current = 0;
- while(*p)
- {
- if(IsDigit(*p))
- {
- result *= 10;
- result += ((*p) & 0xF);
- p++;
- }
- else
+ while (*p) {
+ char *endp;
+
+ errno = 0;
+ current = strtol(p, &endp, 10);
+
+ if (errno == ERANGE)
+ return -1;
+ if (endp == p)
+ return -1;
+ if (current < 0)
return -1;
- }
- if(result > (60 * 24 * 7 * 52))
- result = (60 * 24 * 7 * 52);
+ switch (*endp) {
+ case '\0': /* No unit was given so send it back as minutes */
+ case 'm':
+ result += current * 60;
+ break;
+ case 'h':
+ result += current * 3600;
+ break;
+ case 'd':
+ result += current * 86400;
+ break;
+ case 'w':
+ result += current * 604800;
+ break;
+ default:
+ return -1;
+ }
+
+ if (*endp == '\0')
+ break;
+
+ p = endp + 1;
+ }
- return(result * 60);
+ return MIN(result, 60 * 60 * 24 * 7 * 52);
}
/* Propagated bans are expired elsewhere. */
struct ConfItem *aconf;
rb_dlink_node *ptr;
rb_dlink_node *next_ptr;
- struct rb_radixtree_iteration_state state;
+ rb_radixtree_iteration_state state;
RB_RADIXTREE_FOREACH(aconf, &state, resv_tree)
{