*
* $Id$
*/
-#include "s_conf.h"
+#include "config.h"
+#include "s_conf.h"
#include "IPcheck.h"
#include "class.h"
#include "client.h"
#include "crule.h"
+#include "ircd_features.h"
#include "fileio.h"
#include "gline.h"
#include "hash.h"
#include "s_debug.h"
#include "s_misc.h"
#include "send.h"
-#include "sprintf_irc.h"
#include "struct.h"
#include "support.h"
#include "sys.h"
#include <errno.h>
#include <fcntl.h>
#include <netdb.h>
-#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
struct ConfItem* GlobalConfList = 0;
int GlobalConfCount = 0;
-static struct LocalConf localConf;
-static struct CRuleConf* cruleConfList;
-static struct ServerConf* serverConfList;
-static struct DenyConf* denyConfList;
+void yyparse(void);
+int conf_fd, lineno;
+
+struct LocalConf localConf;
+struct CRuleConf* cruleConfList;
+/* struct ServerConf* serverConfList; */
+struct DenyConf* denyConfList;
/*
* output the reason for being k lined from a file - Mmmm
assert(0 != cptr);
assert(0 < aconf->clients);
- lp = &(cptr->confs);
+ lp = &(cli_confs(cptr));
while (*lp) {
if ((*lp)->value.aconf == aconf) {
* Do (start) DNS lookups of all hostnames in the conf line and convert
* an IP addresses in a.b.c.d number for to IP#s.
*/
-static void lookup_confhost(struct ConfItem *aconf)
+void lookup_confhost(struct ConfItem *aconf)
{
struct DNSReply* reply;
struct SLink* next;
assert(0 != cptr);
- for (link = cptr->confs; link; link = next) {
+ for (link = cli_confs(cptr); link; link = next) {
next = link->next;
if ((link->value.aconf->status & mask) == 0)
detach_conf(cptr, link->value.aconf);
assert(0 != cptr);
- if (cptr->dns_reply)
- hp = cptr->dns_reply->hp;
+ if (cli_dns_reply(cptr))
+ hp = cli_dns_reply(cptr)->hp;
for (aconf = GlobalConfList; aconf; aconf = aconf->next) {
if (aconf->status != CONF_CLIENT)
continue;
- if (aconf->port && aconf->port != cptr->listener->port)
+ if (aconf->port && aconf->port != cli_listener(cptr)->port)
continue;
if (!aconf->host || !aconf->name)
continue;
ircd_strncpy(fullname, hname, HOSTLEN);
fullname[HOSTLEN] = '\0';
- Debug((DEBUG_DNS, "a_il: %s->%s", cptr->sockhost, fullname));
+ Debug((DEBUG_DNS, "a_il: %s->%s", cli_sockhost(cptr), fullname));
if (strchr(aconf->name, '@')) {
- strcpy(uhost, cptr->username);
+ strcpy(uhost, cli_username(cptr));
strcat(uhost, "@");
}
else
uhost[sizeof(uhost) - 1] = 0;
if (0 == match(aconf->name, uhost)) {
if (strchr(uhost, '@'))
- cptr->flags |= FLAGS_DOID;
+ cli_flags(cptr) |= FLAGS_DOID;
return check_limit_and_attach(cptr, aconf);
}
}
}
if (strchr(aconf->host, '@')) {
- ircd_strncpy(uhost, cptr->username, sizeof(uhost) - 2);
+ ircd_strncpy(uhost, cli_username(cptr), sizeof(uhost) - 2);
uhost[sizeof(uhost) - 2] = 0;
strcat(uhost, "@");
}
else
*uhost = '\0';
- strncat(uhost, cptr->sock_ip, sizeof(uhost) - 1 - strlen(uhost));
+ strncat(uhost, cli_sock_ip(cptr), sizeof(uhost) - 1 - strlen(uhost));
uhost[sizeof(uhost) - 1] = 0;
if (match(aconf->host, uhost))
continue;
if (strchr(uhost, '@'))
- cptr->flags |= FLAGS_DOID;
+ cli_flags(cptr) |= FLAGS_DOID;
return check_limit_and_attach(cptr, aconf);
}
{
struct SLink *lp;
- for (lp = cptr->confs; lp; lp = lp->next) {
+ for (lp = cli_confs(cptr); lp; lp = lp->next) {
if (lp->value.aconf == aconf)
return 1;
}
ConfLinks(aconf) >= ConfMaxLinks(aconf) && ConfMaxLinks(aconf) > 0)
return ACR_TOO_MANY_IN_CLASS; /* Use this for printing error message */
lp = make_link();
- lp->next = cptr->confs;
+ lp->next = cli_confs(cptr);
lp->value.aconf = aconf;
- cptr->confs = lp;
+ cli_confs(cptr) = lp;
++aconf->clients;
if (aconf->status & CONF_CLIENT_MASK)
ConfLinks(aconf)++;
*
* - looks for a match on all given fields.
*/
+#if 0
static struct ConfItem *find_conf_entry(struct ConfItem *aconf,
unsigned int mask)
{
(EmptyString(aconf->passwd) && !EmptyString(bconf->passwd)))
continue;
if (!EmptyString(bconf->passwd) && (!IsDigit(*bconf->passwd) || bconf->passwd[1])
-#ifdef USEONE
- && 0 != ircd_strcmp(bconf->passwd, "ONE")
-#endif
&& 0 != ircd_strcmp(bconf->passwd, aconf->passwd))
continue;
return bconf;
}
-
/*
* If conf line is a class definition, create a class entry
* for it and make the conf_line illegal and delete it.
void conf_add_local(const char* const* fields, int count)
{
if (count < 6 || EmptyString(fields[1]) || EmptyString(fields[5])) {
- ircd_log(L_CRIT, "Your M: line must have 6 fields!\n");
+ log_write(LS_CONFIG, L_CRIT, 0, "Your M: line must have 6 fields!");
return;
}
/*
if (0 == localConf.numeric) {
localConf.numeric = atoi(fields[5]);
if (0 == localConf.numeric)
- ircd_log(L_WARNING, "Your M: line must have a Numeric value greater than 0\n");
+ log_write(LS_CONFIG, L_WARNING, 0,
+ "Your M: line must have a Numeric value greater than 0");
}
/*
* these two can be changed while the server is running
/*
* XXX - shouldn't be setting these directly here
*/
- ircd_strncpy(me.info, fields[3], REALLEN);
+ ircd_strncpy(cli_info(&me), fields[3], REALLEN);
set_virtual_host(localConf.vhost_address);
}
* if you have one, it MUST have 3 lines
*/
if (count < 4) {
- ircd_log(L_CRIT, "Your A: line must have 4 fields!\n");
+ log_write(LS_CONFIG, L_CRIT, 0, "Your A: line must have 4 fields!");
return;
}
MyFree(localConf.location1);
cruleConfList = p;
}
}
+#endif
void conf_erase_crule_list(void)
{
return cruleConfList;
}
+#if 0
void conf_add_server(const char* const* fields, int count)
{
struct ServerConf* server;
server->next = serverConfList;
serverConfList = server;
- // if (INADDR_NONE == server->address.s_addr)
- // lookup_confhost(server);
+ /* if (INADDR_NONE == server->address.s_addr) */
+ /* lookup_confhost(server); */
}
void conf_add_deny(const char* const* fields, int count, int ip_kill)
assert(0 != conf);
memset(conf, 0, sizeof(struct DenyConf));
+ if (fields[1][0] == '$' && fields[1][1] == 'R')
+ conf->flags |= DENY_FLAGS_REALNAME;
+
DupString(conf->hostmask, fields[1]);
collapse(conf->hostmask);
if (!EmptyString(fields[2])) {
const char* p = fields[2];
if ('!' == *p) {
- conf->is_file = 1;
+ conf->flags |= DENY_FLAGS_FILE;
++p;
}
DupString(conf->message, p);
else {
conf->bits = bits2;
}
- sprintf_irc(ipname, "%d.%d.%d.%d", ad[0], ad[1], ad[2], ad[3]);
+ ircd_snprintf(0, ipname, sizeof(ipname), "%d.%d.%d.%d", ad[0], ad[1],
+ ad[2], ad[3]);
/*
* This ensures endian correctness
*/
- conf->s_addr = inet_addr(ipname);
+ conf->address = inet_addr(ipname);
Debug((DEBUG_DEBUG, "IPkill: %s = %08x/%i (%08x)", ipname,
- conf->s_addr, conf->bits, NETMASK(conf->bits)));
+ conf->address, conf->bits, NETMASK(conf->bits)));
+ conf->flags |= DENY_FLAGS_IP;
}
conf->next = denyConfList;
denyConfList = conf;
}
+#endif
+
void conf_erase_deny_list(void)
{
int read_configuration_file(void)
{
- enum { MAX_FIELDS = 15 };
-
- char* src;
- char* dest;
- int quoted;
- FBFILE *file;
- char line[512];
- int ccount = 0;
- struct ConfItem *aconf = 0;
-
- int field_count = 0;
- const char* field_vector[MAX_FIELDS + 1];
-
- Debug((DEBUG_DEBUG, "read_configuration_file: ircd.conf = %s", configfile));
- if (0 == (file = fbopen(configfile, "r"))) {
- return 0;
- }
-
+ feature_unmark(); /* unmark all features for resetting later */
+ /* Now just open an fd. The buffering isn't really needed... */
+ if ((conf_fd = open(configfile, O_RDONLY)) < 0)
+ return 0;
+ lineno = 1;
+ yyparse();
+ close(conf_fd);
+#if 0
while (fbgets(line, sizeof(line) - 1, file)) {
if ('#' == *line || IsSpace(*line))
continue;
if (':' != line[1]) {
Debug((DEBUG_ERROR, "Bad config line: %s", line));
- sendto_op_mask(SNO_OLDSNO,"Bad Config line");
+ sendto_opmask_butone(0, SNO_OLDSNO,"Bad Config line");
continue;
}
conf_add_crule(field_vector, field_count, CRULE_AUTO);
aconf->status = CONF_ILLEGAL;
break;
+ case 'F': /* Feature line */
+ case 'f':
+ feature_set(0, &field_vector[1], field_count - 1);
+ aconf->status = CONF_ILLEGAL;
+ break;
case 'H': /* Hub server line */
case 'h':
aconf->status = CONF_HUB;
break;
default:
Debug((DEBUG_ERROR, "Error in config file: %s", line));
- sendto_op_mask(SNO_OLDSNO,"Unknown prefix in config file: %c", *field_vector[0]);
+ sendto_opmask_butone(0, SNO_OLDSNO, "Unknown prefix in config file: %c",
+ *field_vector[0]);
aconf->status = CONF_ILLEGAL;
break;
}
if (aconf)
free_conf(aconf);
fbclose(file);
- nextping = nextconnect = CurrentTime;
+/* nextping = nextconnect = CurrentTime; */
+#endif
+ feature_mark(); /* reset unmarked features */
return 1;
}
+void
+yyerror(const char *msg)
+{
+ sendto_opmask_butone(0, SNO_ALL, "Config file parse error line %d: %s",
+ lineno, msg);
+ log_write(LS_CONFIG, L_ERROR, 0, "Config file parse error line %d: %s",
+ lineno, msg);
+}
+
/*
* rehash
*
else
tmp = &tmp2->next;
}
+
for (i = 0; i <= HighestFd; i++) {
if ((acptr = LocalClientArray[i])) {
assert(!IsMe(acptr));
if (IsServer(acptr)) {
det_confs_butmask(acptr,
~(CONF_HUB | CONF_LEAF | CONF_UWORLD | CONF_ILLEGAL));
- attach_confs_byname(acptr, acptr->name,
+ attach_confs_byname(acptr, cli_name(acptr),
CONF_HUB | CONF_LEAF | CONF_UWORLD);
}
/* Because admin's are getting so uppity about people managing to
}
}
}
+
return ret;
}
{
const char* host;
const char* name;
+ const char* realname;
struct DenyConf* deny;
struct Gline* agline = NULL;
assert(0 != cptr);
- if (!cptr->user)
+ if (!cli_user(cptr))
return 0;
- host = cptr->sockhost;
- name = cptr->user->username;
+ host = cli_sockhost(cptr);
+ name = cli_user(cptr)->username;
+ realname = cli_info(cptr);
assert(strlen(host) <= HOSTLEN);
assert((name ? strlen(name) : 0) <= HOSTLEN);
-
+ assert((realname ? strlen(realname) : 0) <= REALLEN);
+
/* 2000-07-14: Rewrote this loop for massive speed increases.
* -- Isomer
*/
for (deny = denyConfList; deny; deny = deny->next) {
if (0 != match(deny->usermask, name))
continue;
-
+
if (EmptyString(deny->hostmask))
break;
-
- if (deny->ip_kill) { /* k: by IP */
+
+ if (deny->flags & DENY_FLAGS_REALNAME) { /* K: by real name */
+ if (0 == match(deny->hostmask, realname))
+ break;
+ } else if (deny->flags & DENY_FLAGS_IP) { /* k: by IP */
Debug((DEBUG_DEBUG, "ip: %08x network: %08x/%i mask: %08x",
- cptr->ip.s_addr, deny->s_addr, deny->bits, NETMASK(deny->bits)));
- if ((cptr->ip.s_addr & NETMASK(deny->bits)) == deny->s_addr)
+ cli_ip(cptr).s_addr, deny->address, deny->bits, NETMASK(deny->bits)));
+ if ((cli_ip(cptr).s_addr & NETMASK(deny->bits)) == deny->address)
break;
}
else if (0 == match(deny->hostmask, host))
send_reply(cptr, SND_EXPLICIT | ERR_YOUREBANNEDCREEP,
":Connection from your host is refused on this server.");
else {
- if (deny->is_file)
+ if (deny->flags & DENY_FLAGS_FILE)
killcomment(cptr, deny->message);
else
send_reply(cptr, SND_EXPLICIT | ERR_YOUREBANNEDCREEP, ":%s.", deny->message);
if ((acr = attach_iline(cptr))) {
Debug((DEBUG_DNS, "ch_cl: access denied: %s[%s]",
- cptr->name, cptr->sockhost));
+ cli_name(cptr), cli_sockhost(cptr)));
return acr;
}
return ACR_OK;
struct SLink* lp;
Debug((DEBUG_DNS, "sv_cl: check access for %s[%s]",
- cptr->name, cptr->sockhost));
+ cli_name(cptr), cli_sockhost(cptr)));
- if (IsUnknown(cptr) && !attach_confs_byname(cptr, cptr->name, CONF_SERVER)) {
- Debug((DEBUG_DNS, "No C/N lines for %s", cptr->sockhost));
+ if (IsUnknown(cptr) && !attach_confs_byname(cptr, cli_name(cptr), CONF_SERVER)) {
+ Debug((DEBUG_DNS, "No C/N lines for %s", cli_sockhost(cptr)));
return -1;
}
- lp = cptr->confs;
+ lp = cli_confs(cptr);
/*
* We initiated this connection so the client should have a C and N
* line already attached after passing through the connect_server()
* function earlier.
*/
if (IsConnecting(cptr) || IsHandshake(cptr)) {
- c_conf = find_conf_byname(lp, cptr->name, CONF_SERVER);
+ c_conf = find_conf_byname(lp, cli_name(cptr), CONF_SERVER);
if (!c_conf) {
sendto_opmask_butone(0, SNO_OLDSNO, "Connect Error: lost C:line for %s",
- cptr->name);
+ cli_name(cptr));
det_confs_butmask(cptr, 0);
return -1;
}
ClearAccess(cptr);
if (!c_conf) {
- if (cptr->dns_reply) {
+ if (cli_dns_reply(cptr)) {
int i;
- struct hostent* hp = cptr->dns_reply->hp;
+ struct hostent* hp = cli_dns_reply(cptr)->hp;
const char* name = hp->h_name;
/*
* If we are missing a C or N line from above, search for
*/
for (i = 0; name; name = hp->h_aliases[i++]) {
if ((c_conf = find_conf_byhost(lp, name, CONF_SERVER))) {
- ircd_strncpy(cptr->sockhost, name, HOSTLEN);
+ ircd_strncpy(cli_sockhost(cptr), name, HOSTLEN);
break;
}
}
* of the host the server runs on. This also checks the case where
* there is a server connecting from 'localhost'.
*/
- c_conf = find_conf_byhost(lp, cptr->sockhost, CONF_SERVER);
+ c_conf = find_conf_byhost(lp, cli_sockhost(cptr), CONF_SERVER);
}
}
/*
* happen when using DNS in the way the irc server does. -avalon
*/
if (!c_conf)
- c_conf = find_conf_byip(lp, (const char*) &cptr->ip, CONF_SERVER);
+ c_conf = find_conf_byip(lp, (const char*) &(cli_ip(cptr)), CONF_SERVER);
/*
* detach all conf lines that got attached by attach_confs()
*/
*/
if (!c_conf) {
Debug((DEBUG_DNS, "sv_cl: access denied: %s[%s@%s]",
- cptr->name, cptr->username, cptr->sockhost));
+ cli_name(cptr), cli_username(cptr), cli_sockhost(cptr)));
return -1;
}
- ircd_strncpy(cptr->name, c_conf->name, HOSTLEN);
+ ircd_strncpy(cli_name(cptr), c_conf->name, HOSTLEN);
/*
* attach the C and N lines to the client structure for later use.
*/
attach_conf(cptr, c_conf);
- attach_confs_byname(cptr, cptr->name, CONF_HUB | CONF_LEAF | CONF_UWORLD);
+ attach_confs_byname(cptr, cli_name(cptr), CONF_HUB | CONF_LEAF | CONF_UWORLD);
if (INADDR_NONE == c_conf->ipnum.s_addr)
- c_conf->ipnum.s_addr = cptr->ip.s_addr;
+ c_conf->ipnum.s_addr = cli_ip(cptr).s_addr;
- Debug((DEBUG_DNS, "sv_cl: access ok: %s[%s]", cptr->name, cptr->sockhost));
+ Debug((DEBUG_DNS, "sv_cl: access ok: %s[%s]", cli_name(cptr), cli_sockhost(cptr)));
return 0;
}