* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
*
- * $Id: s_serv.c 2723 2006-11-09 23:35:48Z jilles $
+ * $Id: s_serv.c 3550 2007-08-09 06:47:26Z nenolod $
*/
#include "stdinc.h"
#include "channel.h" /* chcap_usage_counts stuff... */
#include "hook.h"
#include "msg.h"
+#include "reject.h"
extern char *crypt();
* Assume it's me, if no server
*/
if(parc <= server || EmptyString(parv[server]) ||
- match(me.name, parv[server]) || match(parv[server], me.name) ||
- (strcmp(parv[server], me.id) == 0))
+ match(parv[server], me.name) || (strcmp(parv[server], me.id) == 0))
return (HUNTED_ISME);
new = LOCAL_COPY(parv[server]);
if(target_p->from == source_p->from && !MyConnect(target_p))
target_p = NULL;
- if(target_p == NULL && (target_p = find_server(source_p, new)))
- if(target_p->from == source_p->from && !MyConnect(target_p))
- target_p = NULL;
-
collapse(new);
wilds = (strchr(new, '?') || strchr(new, '*'));
return (HUNTED_PASS);
}
- if(!IsDigit(parv[server][0]))
+ if(MyClient(source_p) || !IsDigit(parv[server][0]))
sendto_one_numeric(source_p, ERR_NOSUCHSERVER,
form_str(ERR_NOSUCHSERVER), parv[server]);
return (HUNTED_NOSUCH);
target_p->name, target_p->hopcount + 1,
(long) target_p->tsinfo, ubuf,
target_p->username, target_p->host,
- target_p->user->server, target_p->info);
+ target_p->servptr->name, target_p->info);
if(IsDynSpoof(target_p))
sendto_one(client_p, ":%s ENCAP * REALHOST %s",
(long) target_p->tsinfo,
ubuf,
target_p->username, target_p->host,
- target_p->user->server, target_p->info);
+ target_p->servptr->name, target_p->info);
if(!has_id(target_p) || !IsCapable(client_p, CAP_EUID))
{
s_assert(NULL != client_p);
if(client_p == NULL)
return -1;
- ClearAccess(client_p);
host = client_p->name;
*/
if(!EmptyString(server_p->spasswd))
{
- /* kludge, if we're not using TS6, dont ever send
- * ourselves as being TS6 capable.
- */
- if(ServerInfo.use_ts6)
- sendto_one(client_p, "PASS %s TS %d :%s",
- server_p->spasswd, TS_CURRENT, me.id);
- else
- sendto_one(client_p, "PASS %s :TS",
- server_p->spasswd);
+ sendto_one(client_p, "PASS %s TS %d :%s",
+ server_p->spasswd, TS_CURRENT, me.id);
}
/* pass info to new server */
(me.info[0]) ? (me.info) : "IRCers United");
}
- if(!comm_set_buffers(client_p->localClient->fd, READBUF_SIZE))
+ if(!comm_set_buffers(client_p->localClient->F->fd, READBUF_SIZE))
report_error(SETBUF_ERROR_MSG,
get_server_name(client_p, SHOW_IP),
log_client_name(client_p, SHOW_IP), errno);
set_chcap_usage_counts(client_p);
dlinkAdd(client_p, &client_p->lnode, &me.serv->servers);
+ del_unknown_ip(client_p);
dlinkMoveNode(&client_p->localClient->tnode, &unknown_list, &serv_list);
dlinkAddTailAlloc(client_p, &global_serv_list);
add_to_client_hash(client_p->name, client_p);
/* doesnt duplicate client_p->serv if allocated this struct already */
make_server(client_p);
- client_p->serv->up = me.name;
- client_p->serv->upid = me.id;
client_p->serv->caps = client_p->localClient->caps;
client_p->localClient->fullcaps = NULL;
}
- /* add it to scache */
- find_or_add(client_p->name);
+ client_p->serv->nameinfo = scache_connect(client_p->name, client_p->info, IsHidden(client_p));
client_p->localClient->firsttime = CurrentTime;
/* fixing eob timings.. -gnp */
+ if((dlink_list_length(&lclient_list) + dlink_list_length(&serv_list)) >
+ (unsigned long)MaxConnectionCount)
+ MaxConnectionCount = dlink_list_length(&lclient_list) +
+ dlink_list_length(&serv_list);
+
/* Show the real host/IP to admins */
sendto_realops_snomask(SNO_GENERAL, L_ALL,
"Link with %s established: (%s) link",
/* we won't overflow FD_DESC_SZ here, as it can hold
* client_p->name + 64
*/
- comm_note(client_p->localClient->fd, "slink data: %s", client_p->name);
+ comm_note(client_p->localClient->F->fd, "slink data: %s", client_p->name);
comm_note(client_p->localClient->ctrlfd, "slink ctrl: %s", client_p->name);
}
else
- comm_note(client_p->localClient->fd, "Server: %s", client_p->name);
+ comm_note(client_p->localClient->F->fd, "Server: %s", client_p->name);
/*
** Old sendto_serv_but_one() call removed because we now
/* presumption, if target has an id, so does its uplink */
if(has_id(client_p) && has_id(target_p))
sendto_one(client_p, ":%s SID %s %d %s :%s%s",
- target_p->serv->upid, target_p->name,
+ target_p->servptr->id, target_p->name,
target_p->hopcount + 1, target_p->id,
IsHidden(target_p) ? "(H) " : "", target_p->info);
else
sendto_one(client_p, ":%s SERVER %s %d :%s%s",
- target_p->serv->up,
+ target_p->servptr->name,
target_p->name, target_p->hopcount + 1,
IsHidden(target_p) ? "(H) " : "", target_p->info);
goto fork_error;
else if(ret == 0)
{
+ int maxconn = comm_get_maxconnections();
+
/* set our fds as non blocking and close everything else */
- for (i = 0; i < HARD_FDLIMIT; i++)
+ for (i = 0; i < maxconn; i++)
{
- if((i == ctrl_fds[1]) || (i == data_fds[1]) || (i == server->localClient->fd))
+ if((i == ctrl_fds[1]) || (i == data_fds[1]) || (i == server->localClient->F->fd))
{
comm_set_nb(i);
}
ircsnprintf(fd_str[0], sizeof(fd_str[0]), "%d", ctrl_fds[1]);
ircsnprintf(fd_str[1], sizeof(fd_str[1]), "%d", data_fds[1]);
- ircsnprintf(fd_str[2], sizeof(fd_str[2]), "%d", server->localClient->fd);
+ ircsnprintf(fd_str[2], sizeof(fd_str[2]), "%d", server->localClient->F->fd);
kid_argv[0] = slink;
kid_argv[1] = fd_str[0];
kid_argv[2] = fd_str[1];
}
else
{
- comm_close(server->localClient->fd);
+ comm_close(server->localClient->F->fd);
/* close the childs end of the pipes */
close(ctrl_fds[1]);
s_assert(server->localClient);
server->localClient->ctrlfd = ctrl_fds[0];
- server->localClient->fd = data_fds[0];
+ server->localClient->F = comm_add_fd(data_fds[0]);
- if(!comm_set_nb(server->localClient->fd))
+ if(!comm_set_nb(server->localClient->F->fd))
{
report_error(NONB_ERROR_MSG,
get_server_name(server, SHOW_IP),
}
comm_open(server->localClient->ctrlfd, FD_SOCKET, NULL);
- comm_open(server->localClient->fd, FD_SOCKET, NULL);
+ comm_open(server->localClient->F->fd, FD_SOCKET, NULL);
read_ctrl_packet(server->localClient->ctrlfd, server);
- read_packet(server->localClient->fd, server);
+ read_packet(server->localClient->F->fd, server);
}
return 0;
struct Client *client_p;
struct irc_sockaddr_storage myipnum;
int fd;
+ char vhoststr[HOSTIPLEN];
s_assert(server_p != NULL);
if(server_p == NULL)
strlcpy(client_p->name, server_p->name, sizeof(client_p->name));
strlcpy(client_p->host, server_p->host, sizeof(client_p->host));
strlcpy(client_p->sockhost, server_p->host, sizeof(client_p->sockhost));
- client_p->localClient->fd = fd;
+ client_p->localClient->F = comm_add_fd(fd);
/*
* Set up the initial server evilness, ripped straight from
* -- adrian
*/
- if(!comm_set_buffers(client_p->localClient->fd, READBUF_SIZE))
+ if(!comm_set_buffers(client_p->localClient->F->fd, READBUF_SIZE))
{
report_error(SETBUF_ERROR_MSG,
get_server_name(client_p, SHOW_IP),
free_user(client_p->serv->user, NULL);
client_p->serv->user = NULL;
}
- client_p->serv->up = me.name;
- client_p->serv->upid = me.id;
SetConnecting(client_p);
dlinkAddTail(client_p, &client_p->node, &global_client_list);
- /* log */
- ilog(L_SERVER, "Connecting to %s[%s] port %d (%s)", server_p->name, server_p->host, server_p->port,
-#ifdef IPV6
- server_p->aftype == AF_INET6 ? "IPv6" :
-#endif
- (server_p->aftype == AF_INET ? "IPv4" : "?"));
-
if(ServerConfVhosted(server_p))
{
memcpy(&myipnum, &server_p->my_ipnum, sizeof(myipnum));
#endif
else
{
- comm_connect_tcp(client_p->localClient->fd, server_p->host,
+ /* log */
+ ilog(L_SERVER, "Connecting to %s[%s] port %d (%s)", server_p->name, server_p->host, server_p->port,
+#ifdef IPV6
+ server_p->aftype == AF_INET6 ? "IPv6" :
+#endif
+ (server_p->aftype == AF_INET ? "IPv4" : "?"));
+
+ comm_connect_tcp(client_p->localClient->F->fd, server_p->host,
server_p->port, NULL, 0, serv_connect_callback,
client_p, server_p->aftype,
ConfigFileEntry.connect_timeout);
return 1;
}
- comm_connect_tcp(client_p->localClient->fd, server_p->host,
+ /* log */
+ inetntop_sock((struct sockaddr *)&myipnum, vhoststr, sizeof vhoststr);
+ ilog(L_SERVER, "Connecting to %s[%s] port %d (%s) (vhost %s)", server_p->name, server_p->host, server_p->port,
+#ifdef IPV6
+ server_p->aftype == AF_INET6 ? "IPv6" :
+#endif
+ (server_p->aftype == AF_INET ? "IPv4" : "?"), vhoststr);
+
+
+ comm_connect_tcp(client_p->localClient->F->fd, server_p->host,
server_p->port, (struct sockaddr *) &myipnum,
GET_SS_LEN(myipnum), serv_connect_callback, client_p,
myipnum.ss_family, ConfigFileEntry.connect_timeout);
struct Client *client_p = data;
struct server_conf *server_p;
char *errstr;
+ fde_t *F = comm_locate_fd(fd);
/* First, make sure its a real client! */
s_assert(client_p != NULL);
- s_assert(client_p->localClient->fd == fd);
+ s_assert(client_p->localClient->F->fd == fd);
if(client_p == NULL)
return;
}
/* Next, for backward purposes, record the ip of the server */
- memcpy(&client_p->localClient->ip, &fd_table[fd].connect.hostaddr, sizeof client_p->localClient->ip);
+ memcpy(&client_p->localClient->ip, &F->connect.hostaddr, sizeof client_p->localClient->ip);
/* Set sockhost properly now -- jilles */
- inetntop_sock((struct sockaddr *)&fd_table[fd].connect.hostaddr,
+ inetntop_sock((struct sockaddr *)&F->connect.hostaddr,
client_p->sockhost, sizeof client_p->sockhost);
/* Check the status */
*/
if(!EmptyString(server_p->spasswd))
{
- if(ServerInfo.use_ts6)
- sendto_one(client_p, "PASS %s TS %d :%s",
- server_p->spasswd, TS_CURRENT, me.id);
- else
- sendto_one(client_p, "PASS %s :TS",
- server_p->spasswd);
+ sendto_one(client_p, "PASS %s TS %d :%s",
+ server_p->spasswd, TS_CURRENT, me.id);
}
/* pass my info to the new server */