* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
- *
- * $Id: s_newconf.c 3508 2007-06-04 16:04:49Z jilles $
*/
#include "stdinc.h"
#include "ircd_defs.h"
-#include "common.h"
#include "s_conf.h"
#include "s_newconf.h"
#include "client.h"
#include "hostmask.h"
#include "newconf.h"
#include "hash.h"
-#include "irc_dictionary.h"
+#include "rb_dictionary.h"
+#include "rb_radixtree.h"
#include "s_assert.h"
#include "logger.h"
+#include "dns.h"
rb_dlink_list shared_conf_list;
rb_dlink_list cluster_conf_list;
rb_free(remote_p);
}
-int
+bool
find_shared_conf(const char *username, const char *host,
const char *server, int flags)
{
match(shared_p->server, server))
{
if(shared_p->flags & flags)
- return YES;
+ return true;
else
- return NO;
+ return false;
}
}
- return NO;
+ return false;
}
void
va_list args;
va_start(args, format);
- rb_vsnprintf(buffer, sizeof(buffer), format, args);
+ vsnprintf(buffer, sizeof(buffer), format, args);
va_end(args);
sendto_match_servs(source_p, target, cap, NOCAPS,
rb_dlink_node *ptr;
va_start(args, format);
- rb_vsnprintf(buffer, sizeof(buffer), format, args);
+ vsnprintf(buffer, sizeof(buffer), format, args);
va_end(args);
RB_DLINK_FOREACH(ptr, cluster_conf_list.head)
if(parse_netmask(addr, &ip, &bits) != HM_HOST)
{
- if(ip.ss_family == cip.ss_family &&
+ if(GET_SS_FAMILY(&ip) == GET_SS_FAMILY(&cip) &&
comp_with_mask_sock((struct sockaddr *)&ip, (struct sockaddr *)&cip, bits))
return oper_p;
}
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_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
+ * 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_bind_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->bind4);
+
+ 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
add_server_conf(struct server_conf *server_p)
{
server_p->class_name = rb_strdup("default");
}
- if(strchr(server_p->host, '*') || strchr(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);
+ }
+
+ 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 *
struct ConfItem *aconf;
rb_dlink_node *ptr;
rb_dlink_node *next_ptr;
- int i;
+ rb_radixtree_iteration_state state;
- HASH_WALK_SAFE(i, R_MAX, ptr, next_ptr, resvTable)
+ RB_RADIXTREE_FOREACH(aconf, &state, resv_tree)
{
- aconf = ptr->data;
-
if(aconf->lifetime != 0)
continue;
if(aconf->hold && aconf->hold <= rb_current_time())
"Temporary RESV for [%s] expired",
aconf->host);
+ rb_radixtree_delete(resv_tree, aconf->host);
free_conf(aconf);
- rb_dlinkDestroy(ptr, &resvTable[i]);
}
}
- HASH_WALK_END
RB_DLINK_FOREACH_SAFE(ptr, next_ptr, resv_conf_list.head)
{
{
struct nd_entry *nd;
- if(irc_dictionary_find(nd_dict, name) != NULL)
+ if(rb_dictionary_find(nd_dict, name) != NULL)
return;
nd = rb_bh_alloc(nd_heap);
/* this list is ordered */
rb_dlinkAddTail(nd, &nd->lnode, &nd_list);
- irc_dictionary_add(nd_dict, nd->name, nd);
+ rb_dictionary_add(nd_dict, nd->name, nd);
}
void
free_nd_entry(struct nd_entry *nd)
{
- irc_dictionary_delete(nd_dict, nd->name);
+ rb_dictionary_delete(nd_dict, nd->name);
rb_dlinkDelete(&nd->lnode, &nd_list);
rb_bh_free(nd_heap, nd);
return NULL;
}
-