* note: it is guaranteed that parv[0]..parv[parc-1] are all
* non-NULL pointers.
*/
+#include "config.h"
+
#if 0
/*
* No need to include handlers.h here the signatures must match
#include "handlers.h"
#endif /* 0 */
#include "client.h"
-#include "crule.h"
#include "hash.h"
#include "ircd.h"
#include "ircd_log.h"
+#include "ircd_features.h"
#include "ircd_reply.h"
#include "ircd_string.h"
#include "jupe.h"
* If cptr is P10:
* parv[6] = "YMM", where 'Y' is the server numeric and "MM" is the
* numeric nick mask of this server.
- * parv[7] = 0 (not used yet, mandatory unsigned int after u2.10.06)
+ * parv[7] = +hs (h == hub, s == service)
*/
int mr_server(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
{
struct Client* bcptr;
struct Client* LHcptr = 0;
struct ConfItem* aconf = 0;
- struct ConfItem* cconf;
struct ConfItem* lhconf = 0;
struct Jupe* ajupe = 0;
int hop;
if (parc < 7)
{
- return need_more_params(sptr, "SERVER");
+ need_more_params(sptr, "SERVER");
return exit_client(cptr, cptr, &me, "Need more parameters");
}
host = parv[1];
if ((ajupe = jupe_find(host)) && JupeIsActive(ajupe))
return exit_client_msg(cptr, sptr, &me, "Juped: %s", JupeReason(ajupe));
- ircd_log(L_NOTICE, "SERVER: %s %s[%s]", parv[1], cptr->sockhost, cptr->sock_ip);
+ log_write(LS_NETWORK, L_NOTICE, LOG_NOSNOTICE, "SERVER: %s %s[%s]", parv[1],
+ cli_sockhost(cptr), cli_sock_ip(cptr));
/*
* Detect protocol
if (!IsServer(cptr)) /* Don't allow silently connecting a server */
*parv[5] = 'J';
+ if (*parv[7] == '+') {
+ for (ch = parv[7] + 1; *ch; ch++)
+ switch (*ch) {
+ case 'h':
+ SetHub(cptr);
+ break;
+ case 's':
+ SetService(cptr);
+ break;
+ }
+ }
+
prot = atoi(parv[5] + 1);
if (prot > atoi(MAJOR_PROTOCOL))
prot = atoi(MAJOR_PROTOCOL);
hop = atoi(parv[2]);
start_timestamp = atoi(parv[3]);
timestamp = atoi(parv[4]);
- Debug((DEBUG_INFO, "Got SERVER %s with timestamp [%s] age " TIME_T_FMT " ("
- TIME_T_FMT ")", host, parv[4], start_timestamp, me.serv->timestamp));
+ Debug((DEBUG_INFO, "Got SERVER %s with timestamp [%s] age %Tu (%Tu)",
+ host, parv[4], start_timestamp, cli_serv(&me)->timestamp));
if ((timestamp < OLDEST_TS || (hop == 1 && start_timestamp < OLDEST_TS)))
{
info[REALLEN] = '\0';
if (prot < atoi(MINOR_PROTOCOL)) {
sendto_opmask_butone(0, SNO_OLDSNO, "Got incompatible protocol version "
- "(%s) from %s", parv[5], cptr->name);
+ "(%s) from %s", parv[5], cli_name(cptr));
return exit_new_server(cptr, sptr, host, timestamp,
"Incompatible protocol: %s", parv[5]);
}
}
if (*ch || !strchr(host, '.')) {
sendto_opmask_butone(0, SNO_OLDSNO, "Bogus server name (%s) from %s",
- host, cptr->name);
+ host, cli_name(cptr));
return exit_client_msg(cptr, cptr, &me, "Bogus server name (%s)", host);
}
* See if the newly found server is behind a guaranteed
* leaf (L-line). If so, close the link.
*/
- if ((lhconf = find_conf_byhost(cptr->confs, cptr->name, CONF_LEAF)) &&
+ if ((lhconf = find_conf_byhost(cli_confs(cptr), cli_name(cptr), CONF_LEAF)) &&
(!lhconf->port || (hop > lhconf->port)))
{
/*
* both.
*/
active_lh_line = 1;
- if (timestamp <= cptr->serv->timestamp)
+ if (timestamp <= cli_serv(cptr)->timestamp)
LHcptr = 0; /* Kill incoming server */
else
LHcptr = cptr; /* Squit ourselfs */
}
- else if (!(lhconf = find_conf_byname(cptr->confs, cptr->name, CONF_HUB)) ||
+ else if (!(lhconf = find_conf_byname(cli_confs(cptr), cli_name(cptr), CONF_HUB)) ||
(lhconf->port && (hop > lhconf->port)))
{
struct Client *ac3ptr;
/* Look for net junction causing this: */
LHcptr = 0; /* incoming server */
if (*parv[5] != 'J') {
- for (ac3ptr = sptr; ac3ptr != &me; ac3ptr = ac3ptr->serv->up) {
+ for (ac3ptr = sptr; ac3ptr != &me; ac3ptr = cli_serv(ac3ptr)->up) {
if (IsJunction(ac3ptr)) {
LHcptr = ac3ptr;
break;
* and not mess with hash internals.
* --Nemesi
*/
- if (!EmptyString(cptr->name) &&
+ if (!EmptyString(cli_name(cptr)) &&
(IsUnknown(cptr) || IsHandshake(cptr)) &&
- 0 != ircd_strcmp(cptr->name, host))
+ 0 != ircd_strcmp(cli_name(cptr), host))
hChangeClient(cptr, host);
- ircd_strncpy(cptr->name, host, HOSTLEN);
- ircd_strncpy(cptr->info, info[0] ? info : me.name, REALLEN);
- cptr->hopcount = hop;
+ ircd_strncpy(cli_name(cptr), host, HOSTLEN);
+ ircd_strncpy(cli_info(cptr), info[0] ? info : cli_name(&me), REALLEN);
+ cli_hopcount(cptr) = hop;
/* check connection rules */
- for (cconf = GlobalConfList; cconf; cconf = cconf->next) {
- if ((cconf->status == CONF_CRULEALL) && (match(cconf->host, host) == 0)) {
- if (crule_eval(cconf->passwd)) {
- ServerStats->is_ref++;
- sendto_opmask_butone(0, SNO_OLDSNO, "Refused connection from %s.",
- cptr->name);
- return exit_client(cptr, cptr, &me, "Disallowed by connection rule");
- }
- }
+ if (0 != conf_eval_crule(host, CRULE_ALL)) {
+ ServerStats->is_ref++;
+ sendto_opmask_butone(0, SNO_OLDSNO, "Refused connection from %s.", cli_name(cptr));
+ return exit_client(cptr, cptr, &me, "Disallowed by connection rule");
}
+
if (conf_check_server(cptr)) {
++ServerStats->is_ref;
sendto_opmask_butone(0, SNO_OLDSNO, "Received unauthorized connection "
- "from %s.", cptr->name);
+ "from %s.", cli_name(cptr));
return exit_client(cptr, cptr, &me, "No C:line");
}
- host = cptr->name;
+ host = cli_name(cptr);
update_load();
- if (!(aconf = find_conf_byname(cptr->confs, host, CONF_SERVER))) {
+ if (!(aconf = find_conf_byname(cli_confs(cptr), host, CONF_SERVER))) {
++ServerStats->is_ref;
-#ifndef GODMODE
sendto_opmask_butone(0, SNO_OLDSNO, "Access denied. No conf line for "
- "server %s", cptr->name);
+ "server %s", cli_name(cptr));
return exit_client_msg(cptr, cptr, &me,
- "Access denied. No conf line for server %s", cptr->name);
-#else /* GODMODE */
- sendto_opmask_butone(0, SNO_OLDSNO, "General C: line active: No line "
- "for server %s", cptr->name);
- aconf = find_conf_byname(cptr->confs, "general.undernet.org", CONF_SERVER);
- if (!aconf) {
- sendto_opmask_butone(0, SNO_OLDSNO, "Neither C lines for server %s "
- "nor \"general.undernet.org\"", cptr->name);
- return exit_client_msg(cptr, cptr, &me, "No C lines for server %s", cptr->name);
- }
-#endif /* GODMODE */
+ "Access denied. No conf line for server %s", cli_name(cptr));
}
-#ifdef CRYPT_LINK_PASSWORD
- /* passwd may be NULL. Head it off at the pass... */
- if (*cptr->passwd) {
- char salt[3];
+ encr = cli_passwd(cptr);
- salt[0] = aconf->passwd[0];
- salt[1] = aconf->passwd[1];
- salt[2] = '\0';
- encr = ircd_crypt(cptr->passwd, salt);
- }
- else
- encr = "";
-#else
- encr = cptr->passwd;
-#endif /* CRYPT_LINK_PASSWORD */
-#ifndef GODMODE
if (*aconf->passwd && !!strcmp(aconf->passwd, encr)) {
++ServerStats->is_ref;
sendto_opmask_butone(0, SNO_OLDSNO, "Access denied (passwd mismatch) %s",
- cptr->name);
+ cli_name(cptr));
return exit_client_msg(cptr, cptr, &me,
- "No Access (passwd mismatch) %s", cptr->name);
+ "No Access (passwd mismatch) %s", cli_name(cptr));
}
-#endif /* not GODMODE */
- memset(cptr->passwd, 0, sizeof(cptr->passwd));
-#ifndef HUB
- for (i = 0; i <= HighestFd; i++)
- if (LocalClientArray[i] && IsServer(LocalClientArray[i])) {
- active_lh_line = 3;
- LHcptr = 0;
- break;
- }
-#endif
+ memset(cli_passwd(cptr), 0, sizeof(cli_passwd(cptr)));
+
+ if (!feature_bool(FEAT_HUB)) {
+ for (i = 0; i <= HighestFd; i++)
+ if (LocalClientArray[i] && IsServer(LocalClientArray[i])) {
+ active_lh_line = 3;
+ LHcptr = 0;
+ break;
+ }
+ }
}
/*
/*
* Detect wrong numeric.
*/
- if (0 != ircd_strcmp(acptr->name, host)) {
+ if (0 != ircd_strcmp(cli_name(acptr), host)) {
sendcmdto_serv_butone(&me, CMD_WALLOPS, cptr,
":SERVER Numeric Collision: %s != %s",
- acptr->name, host);
+ cli_name(acptr), host);
return exit_client_msg(cptr, cptr, &me,
"NUMERIC collision between %s and %s."
- " Is your server numeric correct ?", host, acptr->name);
+ " Is your server numeric correct ?", host, cli_name(acptr));
}
/*
* Kill our try, if we had one.
* Our new server might be a juped server,
* or someone trying abuse a second Uworld:
*/
- else if (IsServer(acptr) && (0 == ircd_strncmp(acptr->info, "JUPE", 4) ||
- find_conf_byhost(cptr->confs, acptr->name, CONF_UWORLD)))
+ else if (IsServer(acptr) && (0 == ircd_strncmp(cli_info(acptr), "JUPE", 4) ||
+ find_conf_byhost(cli_confs(cptr), cli_name(acptr), CONF_UWORLD)))
{
if (!IsServer(sptr))
- return exit_client(cptr, sptr, &me, acptr->info);
+ return exit_client(cptr, sptr, &me, cli_info(acptr));
sendcmdto_serv_butone(&me, CMD_WALLOPS, cptr,
":Received :%s SERVER %s from %s !?!", parv[0],
- parv[1], cptr->name);
- return exit_new_server(cptr, sptr, host, timestamp, "%s", acptr->info);
+ parv[1], cli_name(cptr));
+ return exit_new_server(cptr, sptr, host, timestamp, "%s", cli_info(acptr));
}
/*
* Of course we find the handshake this link was before :)
struct Client* ac3ptr;
/* Search youngest link: */
- for (ac3ptr = acptr; ac3ptr != &me; ac3ptr = ac3ptr->serv->up)
- if (ac3ptr->serv->timestamp > c3ptr->serv->timestamp)
+ for (ac3ptr = acptr; ac3ptr != &me; ac3ptr = cli_serv(ac3ptr)->up)
+ if (cli_serv(ac3ptr)->timestamp > cli_serv(c3ptr)->timestamp)
c3ptr = ac3ptr;
if (IsServer(sptr))
{
- for (ac3ptr = sptr; ac3ptr != &me; ac3ptr = ac3ptr->serv->up)
- if (ac3ptr->serv->timestamp > c3ptr->serv->timestamp)
+ for (ac3ptr = sptr; ac3ptr != &me; ac3ptr = cli_serv(ac3ptr)->up)
+ if (cli_serv(ac3ptr)->timestamp > cli_serv(c3ptr)->timestamp)
c3ptr = ac3ptr;
}
- if (timestamp > c3ptr->serv->timestamp)
+ if (timestamp > cli_serv(c3ptr)->timestamp)
{
c3ptr = 0;
c2ptr = acptr; /* Make sure they differ */
}
/* Search second youngest link: */
- for (ac2ptr = acptr; ac2ptr != &me; ac2ptr = ac2ptr->serv->up)
+ for (ac2ptr = acptr; ac2ptr != &me; ac2ptr = cli_serv(ac2ptr)->up)
if (ac2ptr != c3ptr &&
- ac2ptr->serv->timestamp >
- (c2ptr ? c2ptr->serv->timestamp : timestamp))
+ cli_serv(ac2ptr)->timestamp >
+ (c2ptr ? cli_serv(c2ptr)->timestamp : timestamp))
c2ptr = ac2ptr;
if (IsServer(sptr))
{
- for (ac2ptr = sptr; ac2ptr != &me; ac2ptr = ac2ptr->serv->up)
+ for (ac2ptr = sptr; ac2ptr != &me; ac2ptr = cli_serv(ac2ptr)->up)
if (ac2ptr != c3ptr &&
- ac2ptr->serv->timestamp >
- (c2ptr ? c2ptr->serv->timestamp : timestamp))
+ cli_serv(ac2ptr)->timestamp >
+ (c2ptr ? cli_serv(c2ptr)->timestamp : timestamp))
c2ptr = ac2ptr;
}
- if (c3ptr && timestamp > (c2ptr ? c2ptr->serv->timestamp : timestamp))
+ if (c3ptr && timestamp > (c2ptr ? cli_serv(c2ptr)->timestamp : timestamp))
c2ptr = 0;
/* If timestamps are equal, decide which link to break
* by name.
*/
- if ((c2ptr ? c2ptr->serv->timestamp : timestamp) ==
- (c3ptr ? c3ptr->serv->timestamp : timestamp))
+ if ((c2ptr ? cli_serv(c2ptr)->timestamp : timestamp) ==
+ (c3ptr ? cli_serv(c3ptr)->timestamp : timestamp))
{
char* n2;
char* n2up;
char* n3up;
if (c2ptr)
{
- n2 = c2ptr->name;
- n2up = MyConnect(c2ptr) ? me.name : c2ptr->serv->up->name;
+ n2 = cli_name(c2ptr);
+ n2up = MyConnect(c2ptr) ? cli_name(&me) : cli_name(cli_serv(c2ptr)->up);
}
else
{
n2 = host;
- n2up = IsServer(sptr) ? sptr->name : me.name;
+ n2up = IsServer(sptr) ? cli_name(sptr) : cli_name(&me);
}
if (c3ptr)
{
- n3 = c3ptr->name;
- n3up = MyConnect(c3ptr) ? me.name : c3ptr->serv->up->name;
+ n3 = cli_name(c3ptr);
+ n3up = MyConnect(c3ptr) ? cli_name(&me) : cli_name(cli_serv(c3ptr)->up);
}
else
{
n3 = host;
- n3up = IsServer(sptr) ? sptr->name : me.name;
+ n3up = IsServer(sptr) ? cli_name(sptr) : cli_name(&me);
}
if (strcmp(n2, n2up) > 0)
n2 = n2up;
if (!c2ptr)
return exit_new_server(cptr, sptr, host, timestamp,
"server %s already exists and is %ld seconds younger.",
- host, (long)acptr->serv->timestamp - (long)timestamp);
- else if (c2ptr->from == cptr || IsServer(sptr))
+ host, (long)cli_serv(acptr)->timestamp - (long)timestamp);
+ else if (cli_from(c2ptr) == cptr || IsServer(sptr))
{
- struct Client *killedptrfrom = c2ptr->from;
+ struct Client *killedptrfrom = cli_from(c2ptr);
if (active_lh_line)
{
/*
* If breaking the loop here solves the L: or H:
* line problem, we don't squit that.
*/
- if (c2ptr->from == cptr || (LHcptr && a_kills_b_too(c2ptr, LHcptr)))
+ if (cli_from(c2ptr) == cptr || (LHcptr && a_kills_b_too(c2ptr, LHcptr)))
active_lh_line = 0;
else
{
* a Ghost... (20 seconds is more then enough because all
* SERVER messages are at the beginning of a net.burst). --Run
*/
- if (CurrentTime - cptr->serv->ghost < 20)
+ if (CurrentTime - cli_serv(cptr)->ghost < 20)
{
- killedptrfrom = acptr->from;
+ killedptrfrom = cli_from(acptr);
if (exit_client(cptr, acptr, &me, "Ghost loop") == CPTR_KILLED)
return CPTR_KILLED;
}
else if (exit_client_msg(cptr, c2ptr, &me,
"Loop <-- %s (new link is %ld seconds younger)", host,
- (c3ptr ? (long)c3ptr->serv->timestamp : timestamp) -
- (long)c2ptr->serv->timestamp) == CPTR_KILLED)
+ (c3ptr ? (long)cli_serv(c3ptr)->timestamp : timestamp) -
+ (long)cli_serv(c2ptr)->timestamp) == CPTR_KILLED)
return CPTR_KILLED;
/*
* Did we kill the incoming server off already ?
{
if (LHcptr && a_kills_b_too(LHcptr, acptr))
break;
- if (acptr->from == cptr || (LHcptr && a_kills_b_too(acptr, LHcptr)))
+ if (cli_from(acptr) == cptr || (LHcptr && a_kills_b_too(acptr, LHcptr)))
active_lh_line = 0;
else
{
return exit_new_server(cptr, sptr, host, timestamp,
(active_lh_line == 2) ? "Non-Hub link %s <- %s(%s), check H:" :
"Leaf-only link %s <- %s(%s), check L:",
- cptr->name, host,
+ cli_name(cptr), host,
lhconf ? (lhconf->name ? lhconf->name : "*") : "!");
}
else
if (exit_client_msg(cptr, LHcptr, &me,
(active_lh_line == 2) ? "Non-Hub link %s <- %s(%s), check H:" :
"Leaf-only link %s <- %s(%s), check L:",
- cptr->name, host,
+ cli_name(cptr), host,
lhconf ? (lhconf->name ? lhconf->name : "*") : "!") == CPTR_KILLED)
return CPTR_KILLED;
}
acptr = make_client(cptr, STAT_SERVER);
make_server(acptr);
- acptr->serv->prot = prot;
- acptr->serv->timestamp = timestamp;
- acptr->hopcount = hop;
- ircd_strncpy(acptr->name, host, HOSTLEN);
- ircd_strncpy(acptr->info, info, REALLEN);
- acptr->serv->up = sptr;
- acptr->serv->updown = add_dlink(&sptr->serv->down, acptr);
+ cli_serv(acptr)->prot = prot;
+ cli_serv(acptr)->timestamp = timestamp;
+ cli_hopcount(acptr) = hop;
+ ircd_strncpy(cli_name(acptr), host, HOSTLEN);
+ ircd_strncpy(cli_info(acptr), info, REALLEN);
+ cli_serv(acptr)->up = sptr;
+ cli_serv(acptr)->updown = add_dlink(&(cli_serv(sptr))->down, acptr);
/* Use cptr, because we do protocol 9 -> 10 translation
for numeric nicks ! */
SetServerYXX(cptr, acptr, parv[6]);
Count_newremoteserver(UserStats);
if (Protocol(acptr) < 10)
- acptr->flags |= FLAGS_TS8;
+ cli_flags(acptr) |= FLAGS_TS8;
add_client_to_list(acptr);
hAddClient(acptr);
if (*parv[5] == 'J')
{
SetBurst(acptr);
sendto_opmask_butone(0, SNO_NETWORK, "Net junction: %s %s",
- sptr->name, acptr->name);
+ cli_name(sptr), cli_name(acptr));
SetJunction(acptr);
}
/*
if (!(bcptr = LocalClientArray[i]) || !IsServer(bcptr) ||
bcptr == cptr || IsMe(bcptr))
continue;
- if (0 == match(me.name, acptr->name))
+ if (0 == match(cli_name(&me), cli_name(acptr)))
continue;
- sendcmdto_one(sptr, CMD_SERVER, bcptr, "%s %d 0 %s %s %s%s 0 :%s",
- acptr->name, hop + 1, parv[4], parv[5], NumServCap(acptr),
- acptr->info);
+ sendcmdto_one(sptr, CMD_SERVER, bcptr, "%s %d 0 %s %s %s%s +%s%s :%s",
+ cli_name(acptr), hop + 1, parv[4], parv[5],
+ NumServCap(acptr), IsHub(acptr) ? "h" : "",
+ IsService(acptr) ? "s" : "", cli_info(acptr));
}
return 0;
}
if (IsUnknown(cptr) || IsHandshake(cptr))
{
make_server(cptr);
- cptr->serv->timestamp = timestamp;
- cptr->serv->prot = prot;
- cptr->serv->ghost = ghost;
+ cli_serv(cptr)->timestamp = timestamp;
+ cli_serv(cptr)->prot = prot;
+ cli_serv(cptr)->ghost = ghost;
SetServerYXX(cptr, cptr, parv[6]);
if (start_timestamp > OLDEST_TS)
{
-#ifndef RELIABLE_CLOCK
-#ifdef TESTNET
- sendto_opmask_butone(0, SNO_OLDSNO, "Debug: my start time: %Tu ; "
- "others start time: %Tu", me.serv->timestamp,
- start_timestamp);
- sendto_opmask_butone(0, SNO_OLDSNO, "Debug: receive time: %Tu ; "
- "received timestamp: %Tu ; difference %ld",
- recv_time, timestamp, timestamp - recv_time);
-#endif
- if (start_timestamp < me.serv->timestamp)
- {
- sendto_opmask_butone(0, SNO_OLDSNO, "got earlier start time: "
- "%Tu < %Tu", start_timestamp, me.serv->timestamp);
- me.serv->timestamp = start_timestamp;
- TSoffset += timestamp - recv_time;
- sendto_opmask_butone(0, SNO_OLDSNO, "clock adjusted by adding %d",
- (int)(timestamp - recv_time));
- }
- else if ((start_timestamp > me.serv->timestamp) && IsUnknown(cptr))
- cptr->serv->timestamp = TStime();
-
- else if (timestamp != recv_time)
- {
- /*
- * Equal start times, we have a collision. Let the connected-to server
- * decide. This assumes leafs issue more than half of the connection
- * attempts.
- */
- if (IsUnknown(cptr))
- cptr->serv->timestamp = TStime();
- else if (IsHandshake(cptr))
- {
- sendto_opmask_butone(0, SNO_OLDSNO, "clock adjusted by adding %d",
+ Debug((DEBUG_DEBUG, "My start time: %Tu; other's start time: %Tu",
+ cli_serv(&me)->timestamp, start_timestamp));
+ Debug((DEBUG_DEBUG, "Receive time: %Tu; received timestamp: %Tu; "
+ "difference %ld", recv_time, timestamp, timestamp - recv_time));
+ if (feature_bool(FEAT_RELIABLE_CLOCK)) {
+ if (start_timestamp < cli_serv(&me)->timestamp)
+ cli_serv(&me)->timestamp = start_timestamp;
+ if (IsUnknown(cptr))
+ cli_serv(cptr)->timestamp = TStime();
+ } else {
+ if (start_timestamp < cli_serv(&me)->timestamp) {
+ sendto_opmask_butone(0, SNO_OLDSNO, "got earlier start time: "
+ "%Tu < %Tu", start_timestamp,
+ cli_serv(&me)->timestamp);
+ cli_serv(&me)->timestamp = start_timestamp;
+ TSoffset += timestamp - recv_time;
+ sendto_opmask_butone(0, SNO_OLDSNO, "clock adjusted by adding %d",
(int)(timestamp - recv_time));
- TSoffset += timestamp - recv_time;
- }
+ } else if ((start_timestamp > cli_serv(&me)->timestamp) &&
+ IsUnknown(cptr))
+ cli_serv(cptr)->timestamp = TStime();
+
+ else if (timestamp != recv_time) {
+ /*
+ * Equal start times, we have a collision. Let the connected-to
+ * server decide. This assumes leafs issue more than half of the
+ * connection attempts.
+ */
+ if (IsUnknown(cptr))
+ cli_serv(cptr)->timestamp = TStime();
+ else if (IsHandshake(cptr)) {
+ sendto_opmask_butone(0, SNO_OLDSNO, "clock adjusted by adding %d",
+ (int)(timestamp - recv_time));
+ TSoffset += timestamp - recv_time;
+ }
+ }
}
-#else /* RELIABLE CLOCK IS TRUE, we _always_ use our own clock */
- if (start_timestamp < me.serv->timestamp)
- me.serv->timestamp = start_timestamp;
- if (IsUnknown(cptr))
- cptr->serv->timestamp = TStime();
-#endif
}
ret = server_estab(cptr, aconf);
}
else
ret = 0;
-#ifdef RELIABLE_CLOCK
- if (abs(cptr->serv->timestamp - recv_time) > 30)
- {
+
+ if (feature_bool(FEAT_RELIABLE_CLOCK) &&
+ abs(cli_serv(cptr)->timestamp - recv_time) > 30) {
sendto_opmask_butone(0, SNO_OLDSNO, "Connected to a net with a "
"timestamp-clock difference of %Td seconds! "
"Used SETTIME to correct this.",
timestamp - recv_time);
- sendcmdto_one(&me, CMD_SETTIME, cptr, "%Tu :%s", TStime(), me.name);
+ sendcmdto_prio_one(&me, CMD_SETTIME, cptr, "%Tu :%s", TStime(),
+ cli_name(&me));
}
-#endif
return ret;
}
* If cptr is P10:
* parv[6] = "YMM", where 'Y' is the server numeric and "MM" is the
* numeric nick mask of this server.
- * parv[7] = 0 (not used yet, mandatory unsigned int after u2.10.06)
+ * parv[7] = +hs (h == hub, s == service)
*/
int ms_server(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
{
struct Client* bcptr;
struct Client* LHcptr = 0;
struct ConfItem* aconf = 0;
- struct ConfItem* cconf;
struct ConfItem* lhconf = 0;
- struct Jupe* ajupe = 0;
int hop;
int ret;
int active_lh_line = 0;
}
host = parv[1];
- if ((ajupe = jupe_find(host)) && JupeIsActive(ajupe))
- jupe_resend(cptr, ajupe);
-
/*
* Detect protocol
*/
if (!IsServer(cptr)) /* Don't allow silently connecting a server */
*parv[5] = 'J';
+ if (*parv[7] == '+') {
+ for (ch = parv[7] + 1; *ch; ch++)
+ switch (*ch) {
+ case 'h':
+ SetHub(cptr);
+ break;
+ case 's':
+ SetService(cptr);
+ break;
+ }
+ }
+
prot = atoi(parv[5] + 1);
if (prot > atoi(MAJOR_PROTOCOL))
prot = atoi(MAJOR_PROTOCOL);
hop = atoi(parv[2]);
start_timestamp = atoi(parv[3]);
timestamp = atoi(parv[4]);
- Debug((DEBUG_INFO, "Got SERVER %s with timestamp [%s] age " TIME_T_FMT " ("
- TIME_T_FMT ")", host, parv[4], start_timestamp, me.serv->timestamp));
+ Debug((DEBUG_INFO, "Got SERVER %s with timestamp [%s] age %Tu (%Tu)",
+ host, parv[4], start_timestamp, cli_serv(&me)->timestamp));
if ((timestamp < OLDEST_TS || (hop == 1 && start_timestamp < OLDEST_TS)))
{
return exit_client_msg(cptr, sptr, &me,
info[REALLEN] = '\0';
if (prot < atoi(MINOR_PROTOCOL)) {
sendto_opmask_butone(0, SNO_OLDSNO, "Got incompatible protocol version "
- "(%s) from %s", parv[5], cptr->name);
+ "(%s) from %s", parv[5], cli_name(cptr));
return exit_new_server(cptr, sptr, host, timestamp,
"Incompatible protocol: %s", parv[5]);
}
break;
if (*ch || !strchr(host, '.')) {
sendto_opmask_butone(0, SNO_OLDSNO, "Bogus server name (%s) from %s",
- host, cptr->name);
+ host, cli_name(cptr));
return exit_client_msg(cptr, cptr, &me, "Bogus server name (%s)", host);
}
* See if the newly found server is behind a guaranteed
* leaf (L-line). If so, close the link.
*/
- if ((lhconf = find_conf_byhost(cptr->confs, cptr->name, CONF_LEAF)) &&
+ if ((lhconf = find_conf_byhost(cli_confs(cptr), cli_name(cptr), CONF_LEAF)) &&
(!lhconf->port || (hop > lhconf->port)))
{
/*
* both.
*/
active_lh_line = 1;
- if (timestamp <= cptr->serv->timestamp)
+ if (timestamp <= cli_serv(cptr)->timestamp)
LHcptr = 0; /* Kill incoming server */
else
LHcptr = cptr; /* Squit ourselfs */
}
- else if (!(lhconf = find_conf_byname(cptr->confs, cptr->name, CONF_HUB)) ||
+ else if (!(lhconf = find_conf_byname(cli_confs(cptr), cli_name(cptr), CONF_HUB)) ||
(lhconf->port && (hop > lhconf->port)))
{
struct Client *ac3ptr;
/* Look for net junction causing this: */
LHcptr = 0; /* incoming server */
if (*parv[5] != 'J') {
- for (ac3ptr = sptr; ac3ptr != &me; ac3ptr = ac3ptr->serv->up) {
+ for (ac3ptr = sptr; ac3ptr != &me; ac3ptr = cli_serv(ac3ptr)->up) {
if (IsJunction(ac3ptr)) {
LHcptr = ac3ptr;
break;
* and not mess with hash internals.
* --Nemesi
*/
- if ((!(EmptyString(cptr->name)))
+ if ((!(EmptyString(cli_name(cptr))))
&& (IsUnknown(cptr) || IsHandshake(cptr))
- && 0 != ircd_strcmp(cptr->name, host))
+ && 0 != ircd_strcmp(cli_name(cptr), host))
hChangeClient(cptr, host);
- ircd_strncpy(cptr->name, host, HOSTLEN);
- ircd_strncpy(cptr->info, info[0] ? info : me.name, REALLEN);
- cptr->hopcount = hop;
+ ircd_strncpy(cli_name(cptr), host, HOSTLEN);
+ ircd_strncpy(cli_info(cptr), info[0] ? info : cli_name(&me), REALLEN);
+ cli_hopcount(cptr) = hop;
/* check connection rules */
- for (cconf = GlobalConfList; cconf; cconf = cconf->next) {
- if ((cconf->status == CONF_CRULEALL) && (match(cconf->host, host) == 0)) {
- if (crule_eval(cconf->passwd))
- {
- ServerStats->is_ref++;
- sendto_opmask_butone(0, SNO_OLDSNO, "Refused connection from %s.",
- cptr->name);
- return exit_client(cptr, cptr, &me, "Disallowed by connection rule");
- }
- }
+ if (0 != conf_eval_crule(host, CRULE_ALL)) {
+ ServerStats->is_ref++;
+ sendto_opmask_butone(0, SNO_OLDSNO, "Refused connection from %s.", cli_name(cptr));
+ return exit_client(cptr, cptr, &me, "Disallowed by connection rule");
}
if (conf_check_server(cptr)) {
++ServerStats->is_ref;
sendto_opmask_butone(0, SNO_OLDSNO, "Received unauthorized connection "
- "from %s.", cptr->name);
+ "from %s.", cli_name(cptr));
return exit_client(cptr, cptr, &me, "No C conf lines");
}
- host = cptr->name;
+ host = cli_name(cptr);
update_load();
- if (!(aconf = find_conf_byname(cptr->confs, host, CONF_SERVER))) {
+ if (!(aconf = find_conf_byname(cli_confs(cptr), host, CONF_SERVER))) {
++ServerStats->is_ref;
-#ifndef GODMODE
sendto_opmask_butone(0, SNO_OLDSNO, "Access denied. No conf line for "
- "server %s", cptr->name);
+ "server %s", cli_name(cptr));
return exit_client_msg(cptr, cptr, &me,
- "Access denied. No conf line for server %s", cptr->name);
-#else /* GODMODE */
- sendto_opmask_butone(0, SNO_OLDSNO, "General C line active: No line "
- "for server %s", cptr->name);
- aconf =
- find_conf_byname(cptr->confs, "general.undernet.org", CONF_SERVER);
- if (!aconf) {
- sendto_opmask_butone(0, SNO_OLDSNO, "Neither C lines for server %s "
- "nor \"general.undernet.org\"", cptr->name);
- return exit_client_msg(cptr, cptr, &me,
- "No C lines for server %s", cptr->name);
- }
-#endif /* GODMODE */
+ "Access denied. No conf line for server %s", cli_name(cptr));
}
-#ifdef CRYPT_LINK_PASSWORD
- /* passwd may be NULL. Head it off at the pass... */
- if (*cptr->passwd)
- {
- char salt[3];
+ encr = cli_passwd(cptr);
- salt[0] = aconf->passwd[0];
- salt[1] = aconf->passwd[1];
- salt[2] = '\0';
- encr = ircd_crypt(cptr->passwd, salt);
- }
- else
- encr = "";
-#else
- encr = cptr->passwd;
-#endif /* CRYPT_LINK_PASSWORD */
-#ifndef GODMODE
- if (*aconf->passwd && !!strcmp(aconf->passwd, encr)) {
+ if (*(aconf->passwd) && !!strcmp(aconf->passwd, encr)) {
++ServerStats->is_ref;
sendto_opmask_butone(0, SNO_OLDSNO, "Access denied (passwd mismatch) %s",
- cptr->name);
+ cli_name(cptr));
return exit_client_msg(cptr, cptr, &me,
- "No Access (passwd mismatch) %s", cptr->name);
+ "No Access (passwd mismatch) %s", cli_name(cptr));
+ }
+ memset(cli_passwd(cptr), 0, sizeof(cli_passwd(cptr)));
+
+ if (!feature_bool(FEAT_HUB)) {
+ for (i = 0; i <= HighestFd; i++)
+ if (LocalClientArray[i] && IsServer(LocalClientArray[i])) {
+ active_lh_line = 3;
+ LHcptr = 0;
+ break;
+ }
}
-#endif /* not GODMODE */
- memset(cptr->passwd, 0, sizeof(cptr->passwd));
-
-#ifndef HUB
- for (i = 0; i <= HighestFd; i++)
- if (LocalClientArray[i] && IsServer(LocalClientArray[i])) {
- active_lh_line = 3;
- LHcptr = 0;
- break;
- }
-#endif
}
/*
/*
* Detect wrong numeric.
*/
- if (0 != ircd_strcmp(acptr->name, host))
+ if (0 != ircd_strcmp(cli_name(acptr), host))
{
sendcmdto_serv_butone(&me, CMD_WALLOPS, cptr,
- ":SERVER Numeric Collision: %s != %s", acptr->name,
+ ":SERVER Numeric Collision: %s != %s", cli_name(acptr),
host);
return exit_client_msg(cptr, cptr, &me,
"NUMERIC collision between %s and %s."
- " Is your server numeric correct ?", host, acptr->name);
+ " Is your server numeric correct ?", host, cli_name(acptr));
}
/*
* Kill our try, if we had one.
* Our new server might be a juped server,
* or someone trying abuse a second Uworld:
*/
- else if (IsServer(acptr) && (0 == ircd_strncmp(acptr->info, "JUPE", 4) ||
- find_conf_byhost(cptr->confs, acptr->name, CONF_UWORLD)))
+ else if (IsServer(acptr) && (0 == ircd_strncmp(cli_info(acptr), "JUPE", 4) ||
+ find_conf_byhost(cli_confs(cptr), cli_name(acptr), CONF_UWORLD)))
{
if (!IsServer(sptr))
- return exit_client(cptr, sptr, &me, acptr->info);
+ return exit_client(cptr, sptr, &me, cli_info(acptr));
sendcmdto_one(&me, CMD_WALLOPS, cptr, ":Received :%s SERVER %s "
- "from %s !?!", parv[0], parv[1], cptr->name);
- return exit_new_server(cptr, sptr, host, timestamp, "%s", acptr->info);
+ "from %s !?!", parv[0], parv[1], cli_name(cptr));
+ return exit_new_server(cptr, sptr, host, timestamp, "%s", cli_info(acptr));
}
/*
* Of course we find the handshake this link was before :)
struct Client* ac3ptr;
/* Search youngest link: */
- for (ac3ptr = acptr; ac3ptr != &me; ac3ptr = ac3ptr->serv->up)
- if (ac3ptr->serv->timestamp > c3ptr->serv->timestamp)
+ for (ac3ptr = acptr; ac3ptr != &me; ac3ptr = cli_serv(ac3ptr)->up)
+ if (cli_serv(ac3ptr)->timestamp > cli_serv(c3ptr)->timestamp)
c3ptr = ac3ptr;
if (IsServer(sptr))
{
- for (ac3ptr = sptr; ac3ptr != &me; ac3ptr = ac3ptr->serv->up)
- if (ac3ptr->serv->timestamp > c3ptr->serv->timestamp)
+ for (ac3ptr = sptr; ac3ptr != &me; ac3ptr = cli_serv(ac3ptr)->up)
+ if (cli_serv(ac3ptr)->timestamp > cli_serv(c3ptr)->timestamp)
c3ptr = ac3ptr;
}
- if (timestamp > c3ptr->serv->timestamp)
+ if (timestamp > cli_serv(c3ptr)->timestamp)
{
c3ptr = 0;
c2ptr = acptr; /* Make sure they differ */
}
/* Search second youngest link: */
- for (ac2ptr = acptr; ac2ptr != &me; ac2ptr = ac2ptr->serv->up)
+ for (ac2ptr = acptr; ac2ptr != &me; ac2ptr = cli_serv(ac2ptr)->up)
if (ac2ptr != c3ptr &&
- ac2ptr->serv->timestamp >
- (c2ptr ? c2ptr->serv->timestamp : timestamp))
+ cli_serv(ac2ptr)->timestamp >
+ (c2ptr ? cli_serv(c2ptr)->timestamp : timestamp))
c2ptr = ac2ptr;
if (IsServer(sptr))
{
- for (ac2ptr = sptr; ac2ptr != &me; ac2ptr = ac2ptr->serv->up)
+ for (ac2ptr = sptr; ac2ptr != &me; ac2ptr = cli_serv(ac2ptr)->up)
if (ac2ptr != c3ptr &&
- ac2ptr->serv->timestamp >
- (c2ptr ? c2ptr->serv->timestamp : timestamp))
+ cli_serv(ac2ptr)->timestamp >
+ (c2ptr ? cli_serv(c2ptr)->timestamp : timestamp))
c2ptr = ac2ptr;
}
- if (c3ptr && timestamp > (c2ptr ? c2ptr->serv->timestamp : timestamp))
+ if (c3ptr && timestamp > (c2ptr ? cli_serv(c2ptr)->timestamp : timestamp))
c2ptr = 0;
/* If timestamps are equal, decide which link to break
* by name.
*/
- if ((c2ptr ? c2ptr->serv->timestamp : timestamp) ==
- (c3ptr ? c3ptr->serv->timestamp : timestamp))
+ if ((c2ptr ? cli_serv(c2ptr)->timestamp : timestamp) ==
+ (c3ptr ? cli_serv(c3ptr)->timestamp : timestamp))
{
char* n2;
char* n2up;
char* n3up;
if (c2ptr)
{
- n2 = c2ptr->name;
- n2up = MyConnect(c2ptr) ? me.name : c2ptr->serv->up->name;
+ n2 = cli_name(c2ptr);
+ n2up = MyConnect(c2ptr) ? cli_name(&me) : cli_name(cli_serv(c2ptr)->up);
}
else
{
n2 = host;
- n2up = IsServer(sptr) ? sptr->name : me.name;
+ n2up = IsServer(sptr) ? cli_name(sptr) : cli_name(&me);
}
if (c3ptr)
{
- n3 = c3ptr->name;
- n3up = MyConnect(c3ptr) ? me.name : c3ptr->serv->up->name;
+ n3 = cli_name(c3ptr);
+ n3up = MyConnect(c3ptr) ? cli_name(&me) : cli_name(cli_serv(c3ptr)->up);
}
else
{
n3 = host;
- n3up = IsServer(sptr) ? sptr->name : me.name;
+ n3up = IsServer(sptr) ? cli_name(sptr) : cli_name(&me);
}
if (strcmp(n2, n2up) > 0)
n2 = n2up;
if (!c2ptr)
return exit_new_server(cptr, sptr, host, timestamp,
"server %s already exists and is %ld seconds younger.",
- host, (long)acptr->serv->timestamp - (long)timestamp);
- else if (c2ptr->from == cptr || IsServer(sptr))
+ host, (long)cli_serv(acptr)->timestamp - (long)timestamp);
+ else if (cli_from(c2ptr) == cptr || IsServer(sptr))
{
- struct Client *killedptrfrom = c2ptr->from;
+ struct Client *killedptrfrom = cli_from(c2ptr);
if (active_lh_line)
{
/*
* If breaking the loop here solves the L: or H:
* line problem, we don't squit that.
*/
- if (c2ptr->from == cptr || (LHcptr && a_kills_b_too(c2ptr, LHcptr)))
+ if (cli_from(c2ptr) == cptr || (LHcptr && a_kills_b_too(c2ptr, LHcptr)))
active_lh_line = 0;
else
{
* a Ghost... (20 seconds is more then enough because all
* SERVER messages are at the beginning of a net.burst). --Run
*/
- if (CurrentTime - cptr->serv->ghost < 20)
+ if (CurrentTime - cli_serv(cptr)->ghost < 20)
{
- killedptrfrom = acptr->from;
+ killedptrfrom = cli_from(acptr);
if (exit_client(cptr, acptr, &me, "Ghost loop") == CPTR_KILLED)
return CPTR_KILLED;
}
else if (exit_client_msg(cptr, c2ptr, &me,
"Loop <-- %s (new link is %ld seconds younger)", host,
- (c3ptr ? (long)c3ptr->serv->timestamp : timestamp) -
- (long)c2ptr->serv->timestamp) == CPTR_KILLED)
+ (c3ptr ? (long)cli_serv(c3ptr)->timestamp : timestamp) -
+ (long)cli_serv(c2ptr)->timestamp) == CPTR_KILLED)
return CPTR_KILLED;
/*
* Did we kill the incoming server off already ?
{
if (LHcptr && a_kills_b_too(LHcptr, acptr))
break;
- if (acptr->from == cptr || (LHcptr && a_kills_b_too(acptr, LHcptr)))
+ if (cli_from(acptr) == cptr || (LHcptr && a_kills_b_too(acptr, LHcptr)))
active_lh_line = 0;
else
{
if (LHcptr == 0) {
return exit_new_server(cptr, sptr, host, timestamp,
(active_lh_line == 2) ? "Non-Hub link %s <- %s(%s)" : "Leaf-only link %s <- %s(%s)",
- cptr->name, host,
+ cli_name(cptr), host,
lhconf ? (lhconf->name ? lhconf->name : "*") : "!");
}
else
{
if (exit_client_msg(cptr, LHcptr, &me,
(active_lh_line == 2) ? "Non-Hub link %s <- %s(%s)" : "Leaf-only link %s <- %s(%s)",
- cptr->name, host,
+ cli_name(cptr), host,
lhconf ? (lhconf->name ? lhconf->name : "*") : "!") == CPTR_KILLED)
return CPTR_KILLED;
}
acptr = make_client(cptr, STAT_SERVER);
make_server(acptr);
- acptr->serv->prot = prot;
- acptr->serv->timestamp = timestamp;
- acptr->hopcount = hop;
- ircd_strncpy(acptr->name, host, HOSTLEN);
- ircd_strncpy(acptr->info, info, REALLEN);
- acptr->serv->up = sptr;
- acptr->serv->updown = add_dlink(&sptr->serv->down, acptr);
+ cli_serv(acptr)->prot = prot;
+ cli_serv(acptr)->timestamp = timestamp;
+ cli_hopcount(acptr) = hop;
+ ircd_strncpy(cli_name(acptr), host, HOSTLEN);
+ ircd_strncpy(cli_info(acptr), info, REALLEN);
+ cli_serv(acptr)->up = sptr;
+ cli_serv(acptr)->updown = add_dlink(&(cli_serv(sptr))->down, acptr);
/* Use cptr, because we do protocol 9 -> 10 translation
for numeric nicks ! */
SetServerYXX(cptr, acptr, parv[6]);
Count_newremoteserver(UserStats);
if (Protocol(acptr) < 10)
- acptr->flags |= FLAGS_TS8;
+ cli_flags(acptr) |= FLAGS_TS8;
add_client_to_list(acptr);
hAddClient(acptr);
if (*parv[5] == 'J')
{
SetBurst(acptr);
sendto_opmask_butone(0, SNO_NETWORK, "Net junction: %s %s",
- sptr->name, acptr->name);
+ cli_name(sptr), cli_name(acptr));
SetJunction(acptr);
}
/*
if (!(bcptr = LocalClientArray[i]) || !IsServer(bcptr) ||
bcptr == cptr || IsMe(bcptr))
continue;
- if (0 == match(me.name, acptr->name))
+ if (0 == match(cli_name(&me), cli_name(acptr)))
continue;
- sendcmdto_one(sptr, CMD_SERVER, bcptr, "%s %d 0 %s %s %s%s 0 :%s",
- acptr->name, hop + 1, parv[4], parv[5], NumServCap(acptr),
- acptr->info);
+ sendcmdto_one(sptr, CMD_SERVER, bcptr, "%s %d 0 %s %s %s%s +%s%s :%s",
+ cli_name(acptr), hop + 1, parv[4], parv[5],
+ NumServCap(acptr), IsHub(acptr) ? "h" : "",
+ IsService(acptr) ? "s" : "", cli_info(acptr));
}
return 0;
}
if (IsUnknown(cptr) || IsHandshake(cptr))
{
make_server(cptr);
- cptr->serv->timestamp = timestamp;
- cptr->serv->prot = prot;
- cptr->serv->ghost = ghost;
+ cli_serv(cptr)->timestamp = timestamp;
+ cli_serv(cptr)->prot = prot;
+ cli_serv(cptr)->ghost = ghost;
SetServerYXX(cptr, cptr, parv[6]);
if (start_timestamp > OLDEST_TS)
{
-#ifndef RELIABLE_CLOCK
-#ifdef TESTNET
- sendto_opmask_butone(0, SNO_OLDSNO, "Debug: my start time: %Tu ; "
- "others start time: %Tu", me.serv->timestamp,
- start_timestamp);
- sendto_opmask_butone(0, SNO_OLDSNO, "Debug: receive time: %Tu ; "
- "received timestamp: %Tu ; difference %ld",
- recv_time, timestamp, timestamp - recv_time);
-#endif
- if (start_timestamp < me.serv->timestamp)
- {
- sendto_opmask_butone(0, SNO_OLDSNO, "got earlier start time: "
- "%Tu < %Tu", start_timestamp, me.serv->timestamp);
- me.serv->timestamp = start_timestamp;
- TSoffset += timestamp - recv_time;
- sendto_opmask_butone(0, SNO_OLDSNO, "clock adjusted by adding %d",
- (int)(timestamp - recv_time));
- }
- else if ((start_timestamp > me.serv->timestamp) && IsUnknown(cptr))
- cptr->serv->timestamp = TStime();
-
- else if (timestamp != recv_time)
- {
- /*
- * Equal start times, we have a collision. Let the connected-to server
- * decide. This assumes leafs issue more than half of the connection
- * attempts.
- */
- if (IsUnknown(cptr))
- cptr->serv->timestamp = TStime();
- else if (IsHandshake(cptr))
- {
- sendto_opmask_butone(0, SNO_OLDSNO, "clock adjusted by adding %d",
+ Debug((DEBUG_DEBUG, "My start time: %Tu; other's start time: %Tu",
+ cli_serv(&me)->timestamp, start_timestamp));
+ Debug((DEBUG_DEBUG, "Receive time: %Tu; received timestamp: %Tu; "
+ "difference %ld", recv_time, timestamp, timestamp - recv_time));
+ if (feature_bool(FEAT_RELIABLE_CLOCK)) {
+ if (start_timestamp < cli_serv(&me)->timestamp)
+ cli_serv(&me)->timestamp = start_timestamp;
+ if (IsUnknown(cptr))
+ cli_serv(cptr)->timestamp = TStime();
+ } else {
+ if (start_timestamp < cli_serv(&me)->timestamp) {
+ sendto_opmask_butone(0, SNO_OLDSNO, "got earlier start time: "
+ "%Tu < %Tu", start_timestamp,
+ cli_serv(&me)->timestamp);
+ cli_serv(&me)->timestamp = start_timestamp;
+ TSoffset += timestamp - recv_time;
+ sendto_opmask_butone(0, SNO_OLDSNO, "clock adjusted by adding %d",
(int)(timestamp - recv_time));
- TSoffset += timestamp - recv_time;
- }
+ } else if ((start_timestamp > cli_serv(&me)->timestamp) &&
+ IsUnknown(cptr))
+ cli_serv(cptr)->timestamp = TStime();
+
+ else if (timestamp != recv_time) {
+ /*
+ * Equal start times, we have a collision. Let the connected-to
+ * server decide. This assumes leafs issue more than half of the
+ * connection attempts.
+ */
+ if (IsUnknown(cptr))
+ cli_serv(cptr)->timestamp = TStime();
+ else if (IsHandshake(cptr)) {
+ sendto_opmask_butone(0, SNO_OLDSNO, "clock adjusted by adding %d",
+ (int)(timestamp - recv_time));
+ TSoffset += timestamp - recv_time;
+ }
+ }
}
-#else /* RELIABLE CLOCK IS TRUE, we _always_ use our own clock */
- if (start_timestamp < me.serv->timestamp)
- me.serv->timestamp = start_timestamp;
- if (IsUnknown(cptr))
- cptr->serv->timestamp = TStime();
-#endif
}
ret = server_estab(cptr, aconf);
}
else
ret = 0;
-#ifdef RELIABLE_CLOCK
- if (abs(cptr->serv->timestamp - recv_time) > 30)
- {
+
+ if (feature_bool(FEAT_RELIABLE_CLOCK) &&
+ abs(cli_serv(cptr)->timestamp - recv_time) > 30) {
sendto_opmask_butone(0, SNO_OLDSNO, "Connected to a net with a "
"timestamp-clock difference of %Td seconds! Used "
"SETTIME to correct this.", timestamp - recv_time);
- sendcmdto_one(&me, CMD_SETTIME, cptr, "%Tu :%s", TStime(), me.name);
+ sendcmdto_prio_one(&me, CMD_SETTIME, cptr, "%Tu :%s", TStime(),
+ cli_name(&me));
}
-#endif
return ret;
}
struct Client* bcptr;
struct Client* LHcptr = 0;
struct ConfItem* aconf = 0;
- struct ConfItem* cconf;
struct ConfItem* lhconf = 0;
struct Jupe* ajupe = 0;
int hop;
cptr->hopcount = hop;
/* check connection rules */
- for (cconf = GlobalConfList; cconf; cconf = cconf->next) {
- if ((cconf->status == CONF_CRULEALL) && (match(cconf->host, host) == 0)) {
- if (crule_eval(cconf->passwd))
- {
- ServerStats->is_ref++;
- sendto_ops("Refused connection from %s.", cptr->name); /* XXX DEAD */
- return exit_client(cptr, cptr, &me, "Disallowed by connection rule");
- }
- }
+ if (0 != conf_eval_crule(host, CRULE_ALL)) {
+ ServerStats->is_ref++;
+ sendto_ops("Refused connection from %s.", cptr->name); /* XXX DEAD */
+ return exit_client(cptr, cptr, &me, "Disallowed by connection rule");
}
if (conf_check_server(cptr)) {
++ServerStats->is_ref;
/* passwd may be NULL. Head it off at the pass... */
if (*cptr->passwd)
{
- char salt[3];
-
- salt[0] = aconf->passwd[0];
- salt[1] = aconf->passwd[1];
- salt[2] = '\0';
- encr = ircd_crypt(cptr->passwd, salt);
+ encr = ircd_crypt(cptr->passwd, aconf->passwd);
}
else
encr = "";
#endif
}
- ret = server_estab(cptr, aconf);
+ ret = server_estab(cptr, aconf); /* XXX DEAD */
}
else
ret = 0;