Get rid of CONF_LEAF and CONF_HUB, and follow up with code cleanups.
[ircu2.10.12-pk.git] / ircd / s_err.c
index 32fcee0e0b9f2e6f64763ceb58c8304115306cff..ace809342266d97a5400218ba6642b342ed90e45 100644 (file)
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- *
- * $Id$
  */
+/** @file
+ * @brief Error handling support.
+ * @version $Id$
+ */
+#include "config.h"
+
 #include "numeric.h"
 #include "s_debug.h"
-#include "sprintf_irc.h"
 
 #include <assert.h>
+#include <string.h>
 
+/** Array of Numeric replies, indexed by numeric. */
 static Numeric replyTable[] = {
 /* 000 */
   { 0 },
 /* 001 */
-  { RPL_WELCOME, ":Welcome to the Internet Relay Network %s", "001" },
+  { RPL_WELCOME, ":Welcome to the %s IRC Network%s%s, %s", "001" },
 /* 002 */
   { RPL_YOURHOST, ":Your host is %s, running version %s", "002" },
 /* 003 */
   { RPL_CREATED, ":This server was created %s", "003" },
 /* 004 */
-  { RPL_MYINFO, "%s %s dioswkg biklmnopstv", "004" },
+  { RPL_MYINFO, "%s %s %s %s %s", "004" },
 /* 005 */
   { RPL_ISUPPORT, "%s :are supported by this server", "005" },
 /* 006 */
@@ -90,7 +95,7 @@ static Numeric replyTable[] = {
 /* 029 */
   { 0 },
 /* 030 */
-  { 0 },
+  { RPL_APASSWARN, ":%s%s%s%s%s", "030" },
 /* 031 */
   { 0 },
 /* 032 */
@@ -430,29 +435,25 @@ static Numeric replyTable[] = {
 /* 199 */
   { 0 },
 /* 200 */
-#ifndef GODMODE
-  { RPL_TRACELINK, "Link %s%s %s %s", "200" },
-#else /* GODMODE */
-  { RPL_TRACELINK, "Link %s%s %s %s " TIME_T_FMT, "200" },
-#endif /* GODMODE */
+  { RPL_TRACELINK, "Link %s.%s %s %s", "200" },
 /* 201 */
-  { RPL_TRACECONNECTING, "Try. %d %s", "201" },
+  { RPL_TRACECONNECTING, "Try. %s %s", "201" },
 /* 202 */
-  { RPL_TRACEHANDSHAKE, "H.S. %d %s", "202" },
+  { RPL_TRACEHANDSHAKE, "H.S. %s %s", "202" },
 /* 203 */
-  { RPL_TRACEUNKNOWN, "???? %d %s", "203" },
+  { RPL_TRACEUNKNOWN, "???? %s %s", "203" },
 /* 204 */
-  { RPL_TRACEOPERATOR, "Oper %d %s %ld", "204" },
+  { RPL_TRACEOPERATOR, "Oper %s %s %ld", "204" },
 /* 205 */
-  { RPL_TRACEUSER, "User %d %s %ld", "205" },
+  { RPL_TRACEUSER, "User %s %s %ld", "205" },
 /* 206 */
-  { RPL_TRACESERVER, "Serv %d %dS %dC %s %s!%s@%s %ld %ld", "206" },
+  { RPL_TRACESERVER, "Serv %s %dS %dC %s %s!%s@%s %ld %ld", "206" },
 /* 207 */
   { 0 },
 /* 208 */
   { RPL_TRACENEWTYPE, "<newtype> 0 %s", "208" },
 /* 209 */
-  { RPL_TRACECLASS, "Class %d %d", "209" },
+  { RPL_TRACECLASS, "Class %s %d", "209" },
 /* 210 */
   { 0 },
 /* 211 */
@@ -460,19 +461,19 @@ static Numeric replyTable[] = {
 /* 212 */
   { RPL_STATSCOMMANDS, "%s %u %u", "212" },
 /* 213 */
-  { RPL_STATSCLINE, "%c %s * %s %d %d", "213" },
+  { RPL_STATSCLINE, "C %s %d %s", "213" },
 /* 214 */
-  { RPL_STATSNLINE, "%c %s * %s %d %d", "214" },
+  { 0 },
 /* 215 */
-  { RPL_STATSILINE, "%c %s * %s %d %d", "215" },
+  { RPL_STATSILINE, "I %s %d %s %d %s", "215" },
 /* 216 */
-  { RPL_STATSKLINE, "%c %s %s %s %d %d", "216" },
+  { RPL_STATSKLINE, "%c %s \"%s\" %s 0 0", "216" },
 /* 217 */
   { RPL_STATSPLINE, "P %d %d %s %s", "217" },
 /* 218 */
-  { RPL_STATSYLINE, "%c %d %d %d %d %ld", "218" },
+  { RPL_STATSYLINE, "%c %s %d %d %d %ld %d", "218" },
 /* 219 */
-  { RPL_ENDOFSTATS, "%c :End of /STATS report", "219" },
+  { RPL_ENDOFSTATS, "%s :End of /STATS report", "219" },
 /* 220 */
   { 0 },
 /* 221 */
@@ -486,11 +487,11 @@ static Numeric replyTable[] = {
 /* 225 */
   { 0 },
 /* 226 */
-  { 0 },
+  { RPL_STATSALINE, "%s", "226" },
 /* 227 */
   { 0 },
 /* 228 */
-  { 0 },
+  { RPL_STATSQLINE, "Q %s :%s", "228" },
 /* 229 */
   { 0 },
 /* 230 */
@@ -506,33 +507,33 @@ static Numeric replyTable[] = {
 /* 235 */
   { RPL_SERVLISTEND, 0, "235" },
 /* 236 */
-  { 0 },
+  { RPL_STATSVERBOSE, "V :Sent as explicit", "236" },
 /* 237 */
-  { 0 },
+  { RPL_STATSENGINE, "%s :Event loop engine", "237" },
 /* 238 */
-  { 0 },
+  { RPL_STATSFLINE, "%c %s %s", "238" },
 /* 239 */
   { 0 },
 /* 240 */
   { 0 },
 /* 241 */
-  { RPL_STATSLLINE, "%c %s * %s %d %d", "241" },
+  { RPL_STATSLLINE, "Module Description EntryPoint", "241" },
 /* 242 */
   { RPL_STATSUPTIME, ":Server Up %d days, %d:%02d:%02d", "242" },
 /* 243 */
-  { RPL_STATSOLINE, "%c %s * %s %d %d", "243" },
+  { RPL_STATSOLINE, "O %s * %s %d %d", "243" },
 /* 244 */
-  { RPL_STATSHLINE, "%c %s * %s %d %d", "244" },
+  { 0 },
 /* 245 */
   { 0 },
 /* 246 */
   { RPL_STATSTLINE, "%c %s %s", "246" },
 /* 247 */
-  { RPL_STATSGLINE, "%c %s@%s " TIME_T_FMT " :%s", "247" },
+  { RPL_STATSGLINE, "%c %s%s%s %Tu :%s", "247" },
 /* 248 */
-  { RPL_STATSULINE, "%c %s %s %s %d %d", "248" },
+  { RPL_STATSULINE, "U %s", "248" },
 /* 249 */
-  { 0 },
+  { RPL_STATSDEBUG, 0, "249" },
 /* 250 */
   { RPL_STATSCONN, ":Highest connection count: %d (%d clients)", "250" },
 /* 251 */
@@ -558,7 +559,7 @@ static Numeric replyTable[] = {
 /* 261 */
   { RPL_TRACELOG, "File %s %d", "261" },
 /* 262 */
-  { RPL_TRACEPING, "Ping %s %s", "262" },
+  { RPL_TRACEEND, ":End of TRACE", "262" },
 /* 263 */
   { 0 },
 /* 264 */
@@ -574,7 +575,7 @@ static Numeric replyTable[] = {
 /* 269 */
   { 0 },
 /* 270 */
-  { 0 },
+  { RPL_PRIVS, "%s :", "270" },
 /* 271 */
   { RPL_SILELIST, "%s %s", "271" },
 /* 272 */
@@ -586,7 +587,7 @@ static Numeric replyTable[] = {
 /* 275 */
   { RPL_STATSDLINE, "%c %s %s", "275" },
 /* 276 */
-  { 0 },
+  { RPL_STATSRLINE, "%-9s %-9s %-10s %s", "276" },
 /* 277 */
   { 0 },
 /* 278 */
@@ -594,15 +595,15 @@ static Numeric replyTable[] = {
 /* 279 */
   { 0 },
 /* 280 */
-  { RPL_GLIST, "%s%s%s " TIME_T_FMT " %s %c :%s", "280" },
+  { RPL_GLIST, "%s%s%s %Tu %s %c :%s", "280" },
 /* 281 */
   { RPL_ENDOFGLIST, ":End of G-line List", "281" },
 /* 282 */
-  { RPL_JUPELIST, "%s " TIME_T_FMT " %s %c :%s", "282" },
+  { RPL_JUPELIST, "%s %Tu %s %c :%s", "282" },
 /* 283 */
   { RPL_ENDOFJUPELIST, ":End of Jupe List", "283" },
 /* 284 */
-  { 0 },
+  { RPL_FEATURE, 0, "284" },
 /* 285 */
   { 0 },
 /* 286 */
@@ -648,7 +649,7 @@ static Numeric replyTable[] = {
 /* 306 */
   { RPL_NOWAWAY, ":You have been marked as being away", "306" },
 /* 307 */
-  { RPL_USERIP, ":", "307" },
+  { 0 },
 /* 308 */
   { 0 },
 /* 309 */
@@ -692,15 +693,15 @@ static Numeric replyTable[] = {
 /* 328 */
   { 0 },
 /* 329 */
-  { RPL_CREATIONTIME, "%s " TIME_T_FMT, "329" },
+  { RPL_CREATIONTIME, "%s %Tu", "329" },
 /* 330 */
-  { 0 },
+  { RPL_WHOISACCOUNT, "%s %s :is logged in as", "330" },
 /* 331 */
   { RPL_NOTOPIC, "%s :No topic is set.", "331" },
 /* 332 */
   { RPL_TOPIC, "%s :%s", "332" },
 /* 333 */
-  { RPL_TOPICWHOTIME, "%s %s " TIME_T_FMT, "333" },
+  { RPL_TOPICWHOTIME, "%s %s %Tu", "333" },
 /* 334 */
   { RPL_LISTUSAGE, ":%s", "334" },
 /* 335 */
@@ -710,11 +711,11 @@ static Numeric replyTable[] = {
 /* 337 */
   { 0 },
 /* 338 */
-  { 0 },
+  { RPL_WHOISACTUALLY, "%s %s@%s %s :Actual user@host, Actual IP", "338" },
 /* 339 */
   { 0 },
 /* 340 */
-  { 0 },
+  { RPL_USERIP, ":", "340" },
 /* 341 */
   { RPL_INVITING, "%s %s", "341" },
 /* 342 */
@@ -724,7 +725,7 @@ static Numeric replyTable[] = {
 /* 344 */
   { 0 },
 /* 345 */
-  { 0 },
+  { RPL_ISSUEDINVITE, "%s %s %s :%s has been invited by %s", "345" },
 /* 346 */
   { RPL_INVITELIST, ":%s", "346" },
 /* 347 */
@@ -744,7 +745,7 @@ static Numeric replyTable[] = {
 /* 354 */
   { RPL_WHOSPCRPL, "%s", "354" },
 /* 355 */
-  { 0 },
+  { RPL_DELNAMREPLY, "%s", "355" },
 /* 356 */
   { 0 },
 /* 357 */
@@ -762,17 +763,13 @@ static Numeric replyTable[] = {
 /* 363 */
   { RPL_CLOSEEND, "%d :Connections Closed", "363" },
 /* 364 */
-#ifndef GODMODE
   { RPL_LINKS, "%s %s :%d P%u %s", "364" },
-#else /* GODMODE */
-  { RPL_LINKS, "%s %s :%d P%u " TIME_T_FMT " (%s) %s", "364" },
-#endif /* GODMODE */
 /* 365 */
   { RPL_ENDOFLINKS, "%s :End of /LINKS list.", "365" },
 /* 366 */
   { RPL_ENDOFNAMES, "%s :End of /NAMES list.", "366" },
 /* 367 */
-  { RPL_BANLIST, "%s %s %s " TIME_T_FMT, "367" },
+  { RPL_BANLIST, "%s %s %s %Tu", "367" },
 /* 368 */
   { RPL_ENDOFBANLIST, "%s :End of Channel Ban List", "368" },
 /* 369 */
@@ -820,7 +817,7 @@ static Numeric replyTable[] = {
 /* 390 */
   { 0 },
 /* 391 */
-  { RPL_TIME, "%s " TIME_T_FMT " %ld :%s", "391" },
+  { RPL_TIME, "%s %Tu %ld :%s", "391" },
 /* 392 */
   { 0 },
 /* 393 */
@@ -830,7 +827,7 @@ static Numeric replyTable[] = {
 /* 395 */
   { 0 },
 /* 396 */
-  { 0 },
+  { RPL_HOSTHIDDEN, "%s :is now your hidden host", "396" },
 /* 397 */
   { 0 },
 /* 398 */
@@ -912,13 +909,13 @@ static Numeric replyTable[] = {
 /* 436 */
   { ERR_NICKCOLLISION, "%s :Nickname collision KILL", "436" },
 /* 437 */
-  { ERR_BANNICKCHANGE, "%s :Cannot change nickname while banned on channel", "437" },
+  { ERR_BANNICKCHANGE, "%s :Cannot change nickname while banned on channel or channel is moderated", "437" },
 /* 438 */
   { ERR_NICKTOOFAST, "%s :Nick change too fast. Please wait %d seconds.", "438" },
 /* 439 */
   { ERR_TARGETTOOFAST, "%s :Target change too fast. Please wait %d seconds.", "439" },
 /* 440 */
-  { 0 },
+  { ERR_SERVICESDOWN, "%s :Services are currently unavailable.", "440" },
 /* 441 */
   { ERR_USERNOTINCHANNEL, "%s %s :They aren't on that channel", "441" },
 /* 442 */
@@ -974,7 +971,7 @@ static Numeric replyTable[] = {
 /* 467 */
   { ERR_KEYSET, "%s :Channel key already set", "467" },
 /* 468 */
-  { ERR_INVALIDUSERNAME, "", "468" },
+  { ERR_INVALIDUSERNAME, 0, "468" },
 /* 469 */
   { 0 },
 /* 470 */
@@ -992,7 +989,7 @@ static Numeric replyTable[] = {
 /* 476 */
   { ERR_BADCHANMASK, "%s :Bad Channel Mask", "476" },
 /* 477 */
-  { 0 },
+  { ERR_NEEDREGGEDNICK, "%s :Cannot join channel (+r)", "477" },
 /* 478 */
   { ERR_BANLISTFULL, "%s %s :Channel ban/ignore list is full", "478" },
 /* 479 */
@@ -1000,13 +997,13 @@ static Numeric replyTable[] = {
 /* 480 */
   { 0 },
 /* 481 */
-  { ERR_NOPRIVILEGES, ":Permission Denied: You're not an IRC operator", "481" },
+  { ERR_NOPRIVILEGES, ":Permission Denied: Insufficient privileges", "481" },
 /* 482 */
   { ERR_CHANOPRIVSNEEDED, "%s :You're not channel operator", "482" },
 /* 483 */
   { ERR_CANTKILLSERVER, ":You cant kill a server!", "483" },
 /* 484 */
-  { ERR_ISCHANSERVICE, "%s %s :Cannot kill, kick or deop channel service", "484" },
+  { ERR_ISCHANSERVICE, "%s %s :Cannot kill, kick or deop a network service", "484" },
 /* 485 */
   { 0 },
 /* 486 */
@@ -1024,15 +1021,15 @@ static Numeric replyTable[] = {
 /* 492 */
   { 0 },
 /* 493 */
-  { 0 },
+  { ERR_NOFEATURE, "%s :No such feature", "493" },
 /* 494 */
-  { 0 },
+  { ERR_BADFEATVALUE, "%s :Bad value for feature %s", "494" },
 /* 495 */
-  { 0 },
+  { ERR_BADLOGTYPE, "%s :No such log type", "495" },
 /* 496 */
-  { 0 },
+  { ERR_BADLOGSYS, "%s :No such log subsystem", "496" },
 /* 497 */
-  { 0 },
+  { ERR_BADLOGVALUE, "%s :Bad value for log type", "497" },
 /* 498 */
   { ERR_ISOPERLCHAN, "%s %s :Cannot kick or deop an IRC Operator on a local channel", "498" },
 /* 499 */
@@ -1040,7 +1037,7 @@ static Numeric replyTable[] = {
 /* 500 */
   { 0 },
 /* 501 */
-  { ERR_UMODEUNKNOWNFLAG, ":Unknown MODE flag", "501" },
+  { ERR_UMODEUNKNOWNFLAG, "%c :Unknown user MODE flag", "501" },
 /* 502 */
   { ERR_USERSDONTMATCH, ":Cant change mode for other users", "502" },
 /* 503 */
@@ -1064,21 +1061,21 @@ static Numeric replyTable[] = {
 /* 512 */
   { ERR_NOSUCHGLINE, "%s :No such gline", "512" },
 /* 513 */
-  { ERR_BADPING, "", "513" },
+  { ERR_BADPING, 0, "513" },
 /* 514 */
   { ERR_NOSUCHJUPE, "%s :No such jupe", "514" },
 /* 515 */
-  { ERR_BADEXPIRE, TIME_T_FMT " :Bad expire time", "515" },
+  { ERR_BADEXPIRE, "%Tu :Bad expire time", "515" },
 /* 516 */
   { ERR_DONTCHEAT, " :Don't Cheat.", "516" },
 /* 517 */
   { ERR_DISABLED, "%s :Command disabled.", "517" },
 /* 518 */
-  { 0 },
+  { ERR_LONGMASK, " :Mask is too long", "518" },
 /* 519 */
-  { 0 },
+  { ERR_TOOMANYUSERS, "%d :Too many users affected by mask", "519" },
 /* 520 */
-  { 0 },
+  { ERR_MASKTOOWIDE, "%s :Mask is too wide", "520" },
 /* 521 */
   { 0 },
 /* 522 */
@@ -1086,7 +1083,7 @@ static Numeric replyTable[] = {
 /* 523 */
   { 0 },
 /* 524 */
-  { 0 },
+  { ERR_QUARANTINED, "%s :Channel is quarantined : %s", "524" },
 /* 525 */
   { 0 },
 /* 526 */
@@ -1138,15 +1135,15 @@ static Numeric replyTable[] = {
 /* 549 */
   { 0 },
 /* 550 */
-  { 0 },
+  { ERR_NOTLOWEROPLEVEL, "%s %s %hu %hu :Cannot %s someone with %s op-level", "550" },
 /* 551 */
-  { 0 },
+  { ERR_NOTMANAGER, "%s :You must be channel Admin to add or remove a password. %s %s %s", "551" },
 /* 552 */
-  { 0 },
+  { ERR_CHANSECURED, "%s :Channel is older than 48 hours and secured. Cannot change Admin pass anymore", "552" },
 /* 553 */
-  { 0 },
+  { ERR_UPASSSET, "%s :Cannot remove Admin pass (+A) while User pass (+U) is still set.  First use /MODE %s -U <userpass>", "553" },
 /* 554 */
-  { 0 },
+  { ERR_UPASSNOTSET, "%s :Cannot set user pass (+U) until Admin pass (+A) is set.  First use /MODE %s +A <adminpass>", "554" },
 /* 555 */
   { 0 },
 /* 556 */
@@ -1239,6 +1236,10 @@ static Numeric replyTable[] = {
   { 0 }
 };
 
+/** Return a pointer to the Numeric for a particular code.
+ * @param n %Numeric to look up.
+ * @return Numeric structure.
+ */
 const struct Numeric* get_error_numeric(int n)
 {
   assert(0 < n);
@@ -1248,37 +1249,13 @@ const struct Numeric* get_error_numeric(int n)
   return &replyTable[n];
 }
 
-static char numbuff[512];
-
-/* "inline" */
-#define prepbuf(buffer, num, tail)                      \
-{                                                       \
-  char *s = buffer + 4;                 \
-  const char *ap = atoi_tab + (num << 2);       \
-                                                        \
-  strcpy(buffer, ":%s 000 %s ");                        \
-  *s++ = *ap++;                                         \
-  *s++ = *ap++;                                         \
-  *s = *ap;                                             \
-  strcpy(s + 5, tail);                                  \
-}
-
-char* err_str(int n)
-{
-  Numeric* p;
-
-  assert(0 < n);
-  assert(n < ERR_LASTERROR);
-  assert(0 != replyTable[n].value);
-
-  p = &replyTable[n];
-  prepbuf(numbuff, p->value, p->format);
-
-  return numbuff;
-}
-
+/** Return a format string for a numeric response.
+ * @param n %Numeric to look up.
+ * @return Pointer to a static buffer containing the format string.
+ */
 char* rpl_str(int n)
 {
+  static char numbuff[512];
   Numeric* p;
 
   assert(0 < n);
@@ -1286,7 +1263,13 @@ char* rpl_str(int n)
   assert(0 != replyTable[n].value);
 
   p = &replyTable[n];
-  prepbuf(numbuff, p->value, p->format);
+  strcpy(numbuff, ":%s 000 %s ");
+  if (p->str) {
+    numbuff[4] = p->str[0];
+    numbuff[5] = p->str[1];
+    numbuff[6] = p->str[2];
+    strcpy(numbuff + 11, p->format);
+  }
 
   return numbuff;
 }