#
# ChangeLog for ircu2.10.11
#
-# $Id: ChangeLog,v 1.20 2000-03-22 04:43:59 bleep Exp $
+# $Id: ChangeLog,v 1.21 2000-03-24 10:14:20 bleep Exp $
#
# Insert new changes at beginning of the change list.
#
#-----------------------------------------------------------------------------
+2000-03-23 Thomas Helvey <tomh@inxpress.net>
+ * Merge in changes from production
2000-03-22 Thomas Helvey <tomh@inxpress.net>
* numicks.c: Tweak to numnick generator to reduce possibility of duplicates.
* rfc1459.unet: Add Maniac's documentation for /names 0
#
# ChangeLog for ircu2.10.10
#
-# $Id: ChangeLog.10,v 1.3 2000-03-21 00:33:29 bleep Exp $
+# $Id: ChangeLog.10,v 1.4 2000-03-24 10:14:20 bleep Exp $
#
# Insert new changes at beginning of the change list.
#
+* Fixed bogus errno return on Solaris --Bleep
+* Fixed core on RPING bug, tokenized RPING --Bleep
* Remove add_local_domain entirely, unused --Bleep
* Merge u2_10_10_beta06 create branch u2_10_10_beta07 --Bleep
* Remove size_t from socket calls, audit usage of size_t
#define RELEASE ".11.alpha."
-/*
- * Deliberate empty lines
- */
/* Do NOT edit those: */
if (chdir(dpath))
{
- fprintf(stderr, "chdir(\"%s\") : %s\n", dpath, strerror(errno));
+ fprintf(stderr, "chdir(\"%s\") : %s\n", dpath,
+ (strerror(errno)) ? strerror(errno) : "Unknown error");
exit(-1);
}
else if (debugflag > 1)
ircd_log(L_CRIT, "execv(%s,%s) failed: %m\n", SPATH, myargv[0]);
Debug((DEBUG_FATAL, "Couldn't restart server \"%s\": %s",
- SPATH, strerror(errno)));
+ SPATH, (strerror(errno)) ? strerror(errno) : ""));
exit(-1);
}
return;
}
Debug((DEBUG_NOTICE, "Error opening pid file \"%s\": %s",
- PPATH, strerror(errno)));
+ PPATH, (strerror(errno)) ? strerror(errno) : ""));
#endif
}
#ifdef CHROOTDIR
if (chdir(DPATH))
{
- fprintf(stderr, "Fail: Cannot chdir(%s): %s\n", DPATH, strerror(errno));
+ fprintf(stderr, "Fail: Cannot chdir(%s): %s\n", DPATH, (strerror(errno)) ? strerror(errno) : "");
exit(2);
}
if (chroot(DPATH))
{
- fprintf(stderr, "Fail: Cannot chroot(%s): %s\n", DPATH, strerror(errno));
+ fprintf(stderr, "Fail: Cannot chroot(%s): %s\n", DPATH, (strerror(errno)) ? strerror(errno) : "");
exit(5);
}
dpath = "/";
#if defined(HAVE_SETRLIMIT) && defined(RLIMIT_CORE)
if (getrlimit(RLIMIT_CORE, &corelim))
{
- fprintf(stderr, "Read of rlimit core size failed: %s\n", strerror(errno));
+ fprintf(stderr, "Read of rlimit core size failed: %s\n", (strerror(errno) ? strerror(errno) : "");
corelim.rlim_max = RLIM_INFINITY; /* Try to recover */
}
corelim.rlim_cur = corelim.rlim_max;
if (setrlimit(RLIMIT_CORE, &corelim))
- fprintf(stderr, "Setting rlimit core size failed: %s\n", strerror(errno));
+ fprintf(stderr, "Setting rlimit core size failed: %s\n", (strerror(errno) ? strerror(errno) : "");
#endif
/*
if (chdir(dpath))
{
- fprintf(stderr, "Fail: Cannot chdir(%s): %s\n", dpath, strerror(errno));
+ fprintf(stderr, "Fail: Cannot chdir(%s): %s\n", dpath, (strerror(errno)) ? strerror(errno) : "");
exit(2);
}
if (c)
{
fprintf(stderr, "Check on %cPATH (%s) failed: %s\n",
- c, path, strerror(errno));
+ c, path, (strerror(errno)) ? strerror(errno) : "");
fprintf(stderr,
"Please create file and/or rerun `make config' and recompile to correct this.\n");
#ifdef CHROOTDIR
#include <assert.h>
+
+/*
+ * Old P10:
+ * Sending [:defiant.atomicrevs.net RPING Z Gte- 953863987 524184 :<No client start time>] to
+ * alphatest.atomicrevs.net
+ * Full P10:
+ * Parsing: j RI Z jAA 953865133 0 :<No client start time>
+ */
+
/*
* ms_rping - server message handler
* -- by Run
*/
int ms_rping(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
{
- struct Client *acptr;
+ struct Client* destination = FindNServer(parv[1]);
+ assert(0 != cptr);
+ assert(0 != sptr);
+ assert(IsServer(cptr));
+ /*
+ * shouldn't happen
+ */
if (!IsPrivileged(sptr))
return 0;
- if (parc < (IsAnOper(sptr) ? (MyConnect(sptr) ? 2 : 3) : 6))
- {
- return need_more_params(sptr, "RPING");
- return 0;
- }
- if (MyUser(sptr))
- {
- if (parc == 2)
- parv[parc++] = me.name;
- else if (!(acptr = find_match_server(parv[2])))
- {
- parv[3] = parv[2];
- parv[2] = me.name;
- parc++;
+ if (IsServer(sptr)) {
+ if (parc < 6) {
+ /*
+ * PROTOCOL ERROR
+ */
+ return need_more_params(sptr, "RPING");
}
- else
- parv[2] = acptr->name;
- if (parc == 3)
- parv[parc++] = "<No client start time>";
- }
-
- if (IsAnOper(sptr))
- {
- if (hunt_server(1, cptr, sptr, "%s%s " TOK_RPING " %s %s :%s", 2, parc, parv) !=
- HUNTED_ISME)
- return 0;
- if (!(acptr = find_match_server(parv[1])) || !IsServer(acptr))
- {
- sendto_one(sptr, err_str(ERR_NOSUCHSERVER), me.name, parv[0], parv[1]);
- return 0;
+ if ((destination = FindNServer(parv[1]))) {
+ /*
+ * if it's not for me, pass it on
+ */
+ if (IsMe(destination))
+ sendto_one(cptr, "%s " TOK_RPONG " %s %s %s %s :%s", NumServ(&me),
+ parv[0], parv[2], parv[3], parv[4], parv[5]);
+ else
+ sendto_one(destination, "%s " TOK_RPING " %s %s %s %s :%s",
+ parv[0], parv[1], parv[2], parv[3], parv[4], parv[5]);
}
- sendto_one(acptr, ":%s RPING %s %s %s :%s",
- me.name, NumServ(acptr), sptr->name, militime(0, 0), parv[3]);
}
- else
- {
- if (hunt_server(1, cptr, sptr, "%s%s " TOK_RPING " %s %s %s %s :%s", 1, parc, parv)
- != HUNTED_ISME)
+ else {
+ if (parc < 3) {
+ /*
+ * PROTOCOL ERROR
+ */
+ return need_more_params(sptr, "RPING");
+ }
+ /*
+ * Haven't made it to the start server yet, if I'm not the start server
+ * pass it on.
+ */
+ if (hunt_server(1, cptr, sptr, "%s%s " TOK_RPING " %s %s :%s", 2, parc, parv) != HUNTED_ISME)
return 0;
- sendto_one(cptr, ":%s RPONG %s %s %s %s :%s", me.name, parv[0],
- parv[2], parv[3], parv[4], parv[5]);
+ /*
+ * otherwise ping the destination from here
+ */
+ if ((destination = find_match_server(parv[1]))) {
+ assert(IsServer(destination));
+ sendto_one(destination, "%s " TOK_RPING " %s %s%s %s :%s",
+ NumServ(&me), NumServ(destination), NumNick(sptr), militime(0, 0), parv[3]);
+ }
+ else
+ sendto_one(sptr, err_str(ERR_NOSUCHSERVER), me.name, parv[0], parv[1]);
}
return 0;
}
* mo_rping - oper message handler
* -- by Run
*
+ *
+ * Receive:
+ * RPING blah.*
+ * RPING blah.* :<start time>
+ * RPING blah.* server.* :<start time>
+ *
* parv[0] = sender (sptr->name thus)
- * if sender is a person: (traveling towards start server)
- * parv[1] = pinged server[mask]
- * parv[2] = start server (current target)
- * parv[3] = optional remark
- * if sender is a server: (traveling towards pinged server)
- * parv[1] = pinged server (current target)
- * parv[2] = original sender (person)
- * parv[3] = start time in s
- * parv[4] = start time in us
- * parv[5] = the optional remark
+ * parv[1] = pinged server name or mask (required)
+ * parv[2] = start server name or mask (optional, defaults to me)
+ * parv[3] = client start time (optional)
+ *
+ * Send: NumNick(sptr) RPING blah.* server.net :<start time> (hunt_server)
+ * NumServ(&me) RPING NumServ(blah.bar.net) NumNick(sptr) :<start time> (here)
*/
int mo_rping(struct Client* cptr, struct Client* sptr, int parc, char* parv[])
{
- struct Client *acptr;
+ struct Client* acptr = 0;
+ const char* start_time = "<No client start time>";
- if (!IsPrivileged(sptr))
- return 0;
+ assert(0 != cptr);
+ assert(0 != sptr);
+ assert(cptr == sptr);
+ assert(IsAnOper(sptr));
- if (parc < (IsAnOper(sptr) ? (MyConnect(sptr) ? 2 : 3) : 6))
- {
+ if (parc < 2)
return need_more_params(sptr, "RPING");
- return 0;
- }
- if (MyUser(sptr))
- {
- if (parc == 2)
- parv[parc++] = me.name;
- else if (!(acptr = find_match_server(parv[2])))
- {
- parv[3] = parv[2];
- parv[2] = me.name;
- parc++;
+
+ if (parc > 2) {
+ if ((acptr = find_match_server(parv[2])) && !IsMe(acptr)) {
+ parv[2] = acptr->name;
+ if (3 == parc) {
+ /*
+ * const_cast<char*>(start_time);
+ */
+ parv[parc++] = (char*) start_time;
+ }
+ hunt_server(1, cptr, sptr, "%s%s " TOK_RPING " %s %s :%s", 2, parc, parv);
+ return 0;
}
else
- parv[2] = acptr->name;
- if (parc == 3)
- parv[parc++] = "<No client start time>";
+ start_time = parv[2];
}
- if (IsAnOper(sptr))
- {
- if (hunt_server(1, cptr, sptr, "%s%s " TOK_RPING " %s %s :%s", 2, parc, parv) !=
- HUNTED_ISME)
- return 0;
- if (!(acptr = find_match_server(parv[1])) || !IsServer(acptr))
- {
- sendto_one(sptr, err_str(ERR_NOSUCHSERVER), me.name, parv[0], parv[1]);
- return 0;
- }
- sendto_one(acptr, ":%s RPING %s %s %s :%s",
- me.name, NumServ(acptr), sptr->name, militime(0, 0), parv[3]);
+ if ((acptr = find_match_server(parv[1]))) {
+ assert(IsServer(acptr));
+ sendto_one(acptr, "%s " TOK_RPING " %s %s%s %s :%s",
+ NumServ(&me), NumServ(acptr), NumNick(sptr), militime(0, 0), start_time);
}
else
- {
- if (hunt_server(1, cptr, sptr, "%s%s " TOK_RPING " %s %s %s %s :%s", 1, parc, parv)
- != HUNTED_ISME)
- return 0;
- sendto_one(cptr, ":%s RPONG %s %s %s %s :%s", me.name, parv[0],
- parv[2], parv[3], parv[4], parv[5]);
- }
+ sendto_one(sptr, err_str(ERR_NOSUCHSERVER), me.name, parv[0], parv[1]);
+
return 0;
}
#include "ircd.h"
#include "ircd_reply.h"
#include "ircd_string.h"
+#include "msg.h"
#include "numeric.h"
#include "numnicks.h"
#include "opercmds.h"
if (!IsServer(sptr))
return 0;
- if (parc < 5)
- return need_more_params(sptr, "RPING");
-
- if (!(acptr = FindClient(parv[1])))
- return 0;
-
- if (!IsMe(acptr))
- {
- if (IsServer(acptr) && parc > 5)
- {
- sendto_one(acptr, ":%s RPONG %s %s %s %s :%s",
- parv[0], parv[1], parv[2], parv[3], parv[4], parv[5]);
+ if (parc < 5) {
+ /*
+ * PROTOCOL ERROR
+ */
+ return need_more_params(sptr, "RPONG");
+ }
+ if (parc == 6) {
+ /*
+ * from pinged server to source server
+ */
+ if (!(acptr = FindNServer(parv[1])))
return 0;
+
+ if (IsMe(acptr)) {
+ if (!(acptr = findNUser(parv[2])))
+ return 0;
+ if (MyConnect(acptr))
+ sendto_one(acptr, ":%s " MSG_RPONG " %s %s %s :%s",
+ me.name, acptr->name, sptr->name,
+ militime(parv[3], parv[4]), parv[5]);
+ else
+ sendto_one(acptr, "%s " TOK_RPONG " %s%s %s %s :%s",
+ NumServ(&me), NumNick(acptr), sptr->name,
+ militime(parv[3], parv[4]), parv[5]);
}
+ else
+ sendto_one(acptr, "%s " TOK_RPONG " %s %s %s %s :%s",
+ parv[0], parv[1], parv[2], parv[3], parv[4], parv[5]);
}
- else
- {
- parv[1] = parv[2];
- parv[2] = sptr->name;
- parv[0] = me.name;
- parv[3] = militime(parv[3], parv[4]);
- parv[4] = parv[5];
- if (!(acptr = FindUser(parv[1])))
- return 0; /* No bouncing between servers ! */
+ else {
+ /*
+ * returned from source server to client
+ */
+ if (!(acptr = findNUser(parv[1])))
+ return 0;
+ if (MyConnect(acptr))
+ sendto_one(acptr, ":%s " MSG_RPONG " %s %s %s :%s",
+ sptr->name, acptr->name, parv[2], parv[3], parv[4]);
+ else
+ sendto_one(acptr, "%s " TOK_RPONG " %s %s %s :%s",
+ parv[0], parv[1], parv[2], parv[3], parv[4]);
}
-
- sendto_one(acptr, ":%s RPONG %s %s %s :%s",
- parv[0], parv[1], parv[2], parv[3], parv[4]);
return 0;
}
return acptr;
}
}
- return NULL;
+ return 0;
}
int err = 0;
int len = sizeof(err);
getsockopt(fd, SOL_SOCKET, SO_ERROR, (void*) &err, &len);
+ return err;
}
/*
errno = h_errno = 0;
start_resolver();
Debug((DEBUG_DNS, "Resolver: fd %d errno: %d h_errno: %d: %s",
- ResolverFileDescriptor, errno, h_errno, strerror(errno)));
+ ResolverFileDescriptor, errno, h_errno,
+ (strerror(errno)) ? strerror(errno) : "Unknown"));
return ResolverFileDescriptor;
}
++sent;
}
else
- ircd_log(L_ERROR, "Resolver: send failed %s", strerror(errno));
+ ircd_log(L_ERROR, "Resolver: send failed %s",
+ (strerror(errno)) ? strerror(errno) : "Unknown");
}
return sent;
}
return 0;
}
if (rc < sizeof(HEADER)) {
- Debug((DEBUG_DNS, "Resolver: short reply %d: %s", rc, strerror(errno)));
+ Debug((DEBUG_DNS, "Resolver: short reply %d: %s", rc,
+ (strerror(errno)) ? strerror(errno) : "Unknown"));
return 0;
}
/*
static time_t last_notice = 0;
int errtmp = errno; /* debug may change 'errno' */
const char* errmsg = (err) ? strerror(err) : "";
-
+ if (!errmsg)
+ errmsg = "Unknown error";
+
if (!who)
who = "unknown";
* connection actually succeeded
*/
if ((cptr->error = os_get_sockerr(cptr->fd))) {
- sendto_ops("Connection failed to %s: %s", cptr->name,
- strerror(cptr->error));
+ const char* msg = strerror(cptr->error);
+ if (!msg)
+ msg = "Unknown error";
+ sendto_ops("Connection failed to %s: %s", cptr->name, msg);
return 0;
}
if (!(aconf = find_conf_byname(cptr->confs, cptr->name, CONF_SERVER))) {
}
if (write_ready) {
if (!on_write_unblocked(cptr) || IsDead(cptr)) {
- exit_client(cptr, cptr, &me,
- cptr->error ? strerror(cptr->error) : LastDeadComment(cptr));
+ const char* msg = (cptr->error) ? strerror(cptr->error) : LastDeadComment(cptr);
+ if (!msg)
+ msg = "Unknown error";
+ exit_client(cptr, cptr, &me, (char*) msg);
continue;
}
}
flush_connections(poll_cptr[i]);
#endif
if (IsDead(cptr)) {
- exit_client(cptr, cptr, &me,
- cptr->error ? strerror(cptr->error) : LastDeadComment(cptr));
+ const char* msg = (cptr->error) ? strerror(cptr->error) : LastDeadComment(cptr);
+ if (!msg)
+ msg = "Unknown error";
+ exit_client(cptr, cptr, &me, (char*) msg);
continue;
}
if (length > 0)
if ((IsServer(cptr) || IsHandshake(cptr)) && cptr->error == 0 && length == 0)
exit_client_msg(cptr, cptr, &me, "Server %s closed the connection (%s)",
cptr->name, cptr->serv->last_error_msg);
- else
+ else {
+ const char* msg = (cptr->error) ? strerror(cptr->error) : "EOF from client";
+ if (!msg)
+ msg = "Unknown error";
exit_client_msg(cptr, cptr, &me, "Read error to %s: %s",
- get_client_name(cptr, HIDE_IP),
- (cptr->error) ? strerror(cptr->error) : "EOF from client");
+ get_client_name(cptr, HIDE_IP), msg);
+ }
}
return 0;
}
if (FD_ISSET(i, &write_set)) {
--nfds;
if (!on_write_unblocked(cptr) || IsDead(cptr)) {
+ const char* msg = (cptr->error) ? strerror(cptr->error) : LastDeadComment(cptr);
+ if (!msg)
+ msg = "Unknown error";
if (FD_ISSET(i, &read_set))
--nfds;
- exit_client(cptr, cptr, &me,
- cptr->error ? strerror(cptr->error) : LastDeadComment(cptr));
+ exit_client(cptr, cptr, &me, msg);
continue;
}
}
flush_connections(LocalClientArray[i]);
#endif
if (IsDead(cptr)) {
- exit_client(cptr, cptr, &me,
- cptr->error ? strerror(cptr->error) : LastDeadComment(cptr));
+ const char* msg = (cptr->error) ? strerror(cptr->error) : LastDeadComment(cptr);
+ if (!msg)
+ msg = "Unknown error";
+ exit_client(cptr, cptr, &me, msg);
continue;
}
if (length > 0)
if ((IsServer(cptr) || IsHandshake(cptr)) && cptr->error == 0 && length == 0)
exit_client_msg(cptr, cptr, &me, "Server %s closed the connection (%s)",
cptr->name, cptr->serv->last_error_msg);
- else
+ else {
+ const char* msg = (cptr->error) ? strerror(cptr->error) : "EOF from client";
+ if (!msg)
+ msg = "Unknown error";
exit_client_msg(cptr, cptr, &me, "Read error to %s: %s",
- get_client_name(cptr, HIDE_IP),
- cptr->error ? strerror(cptr->error) : "EOF from client");
+ get_client_name(cptr, HIDE_IP), msg);
+ }
}
return 0;
}
from.sin_family = AF_INET;
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
- Debug((DEBUG_ERROR, "UPING: UDP listener socket call failed: %s", strerror(errno)));
+ Debug((DEBUG_ERROR, "UPING: UDP listener socket call failed: %s",
+ (strerror(errno)) ? strerror(errno) : "Unknown error"));
return -1;
}
if (!os_set_reuseaddr(fd)) {
ircd_log(L_ERROR, "UPING: setsockopt UDP listener: fd %d", fd);
- Debug((DEBUG_ERROR, "UPING: set reuseaddr on UDP listener failed: %s", strerror(errno)));
+ Debug((DEBUG_ERROR, "UPING: set reuseaddr on UDP listener failed: %s",
+ (strerror(errno)) ? strerror(errno) : "Unknown error"));
close(fd);
return -1;
}
if (bind(fd, (struct sockaddr*) &from, sizeof(from)) == -1) {
ircd_log(L_ERROR, "UPING: bind UDP listener %d fd %d", htons(from.sin_port), fd);
- Debug((DEBUG_ERROR, "UPING: bind on UDP listener failed : %s", strerror(errno)));
+ Debug((DEBUG_ERROR, "UPING: bind on UDP listener failed : %s",
+ (strerror(errno)) ? strerror(errno) : "Unknown error"));
close(fd);
return -1;
}
if (!os_set_nonblocking(fd)) {
- Debug((DEBUG_ERROR, "UPING: set non-blocking: %s", strerror(errno)));
+ Debug((DEBUG_ERROR, "UPING: set non-blocking: %s",
+ (strerror(errno)) ? strerror(errno) : "Unknown error"));
close(fd);
return -1;
}
#endif
)
sendto_one(pptr->client, ":%s NOTICE %s :UPING: sendto() failed: %s",
- me.name, pptr->client->name, strerror(errno));
+ me.name, pptr->client->name,
+ (strerror(err)) ? strerror(err) : "Unknown error");
else
sendto_one(pptr->client, "%s NOTICE %s%s :UPING: sendto() failed: %s",
- NumServ(&me), NumNick(pptr->client), strerror(errno));
+ NumServ(&me), NumNick(pptr->client),
+ (strerror(err)) ? strerror(err) : "Unknown error");
}
- Debug((DEBUG_DEBUG, "UPING: send_ping: sendto failed on %d: %s", pptr->fd, strerror(err)));
+ Debug((DEBUG_DEBUG, "UPING: send_ping: sendto failed on %d: %s", pptr->fd,
+ (strerror(err)) ? strerror(err) : "Unknown error"));
end_ping(pptr);
return;
}
#endif
)
sendto_one(pptr->client, ":%s NOTICE %s :UPING: recvfrom: %s",
- me.name, pptr->client->name, strerror(err));
+ me.name, pptr->client->name,
+ (strerror(err)) ? strerror(err) : "Unknown error");
else
sendto_one(pptr->client, "%s NOTICE %s%s :UPING: recvfrom: %s",
- NumServ(&me), NumNick(pptr->client), strerror(err));
+ NumServ(&me), NumNick(pptr->client),
+ (strerror(err)) ? strerror(err) : "Unknown error");
Debug((DEBUG_SEND, "UPING: read_ping: recvfrom: %d", err));
end_ping(pptr);
return;
if ((fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {
int err = errno;
sendto_ops("m_uping: socket: %s", (err != EMFILE)
- ? strerror(err) : "No more sockets");
+ ? ((strerror(err)) ? strerror(err) : "Unknown error") : "No more sockets");
if (MyUser(sptr) || Protocol(cptr) < 10)
sendto_one(sptr,
":%s NOTICE %s :UPING: Unable to create udp ping socket",