./common/struct_def.h
=== struct.h FLAGS_ ===
common/struct_def.h:183:#define FLAGS_LISTENINACTIVE 0x8000000 /* Listener does not listen() */
common/struct_def.h:192:#define FLAGS_RESTRICT	0x0010 /* restricted user */
common/struct_def.h:193:#define FLAGS_AWAY	0x0020 /* user is away */
common/struct_def.h:194:#define FLAGS_EXEMPT    0x0040 /* user is exempted from k-lines */
common/struct_def.h:196:#define FLAGS_XLINED	0x0100	/* X-lined client */
common/struct_def.h:198:#define FLAGS_TLS       0x0200 /* user is on a secure connection port (SSL/TLS) -- mh 2020-04-27 */
.claude/sessions/9d816741-a8bf-45f4-8d9d-98ce540cb727.jsonl:118:{"parentUuid":"7b2c6618-3d40-4e84-bea2-79d4eacdcfa2","isSidechain":false,"message":{"model":"claude-opus-4-8","id":"msg_01UTRTEqBbHCJZC8eF5MTa1e","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01NT67vAmR6EzNfygVXFLiRZ","name":"Bash","input":{"command":"cd /home/xe/Code/xeiaso.net/ircd.rs\necho \"=== SetMe/SetEOB/SetX patterns in ported rust ===\"\ngrep -rn \"SetMe\\|SetEOB\\|set_me\\|set_eob\\|FLAGS_OPER\\|SV_UID\\|status |=\\|STAT_ME\" ircd-common/src/*.rs | head\necho \"=== macros.rs SetX helpers ===\"\ngrep -niE \"Set[A-Z]|fn set_|flags \\|=|status =\" ircd-common/src/macros.rs 2>/dev/null | head -30\necho \"=== struct istat_t fields ===\"\nsed -n '855,870p' common/struct_def.h\necho \"=== SetMe/SetEOB/SV_UID defines ===\"\ngrep -rn \"define SetMe\\|define SetEOB\\|define SV_UID\\|define FLAGS_OPER\\|define SetX\" common/*.h | head","description":"Find macro equivalents and istat fields"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":3331,"cache_read_input_tokens":91513,"output_tokens":1158,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":3331,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":1158,"cache_read_input_tokens":91513,"cache_creation_input_tokens":3331,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":3331},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CbnxDiBPoPfHWeNzTfpsZ","type":"assistant","uuid":"e68f834c-cc8a-439b-91a2-7bc1ed9b2159","timestamp":"2026-06-07T00:28:43.496Z","userType":"external","entrypoint":"cli","cwd":"/home/xe/Code/xeiaso.net/ircd.rs","sessionId":"9d816741-a8bf-45f4-8d9d-98ce540cb727","version":"2.1.167","gitBranch":"master"}
.claude/sessions/74074e34-c77d-4932-b819-3d09ecb15f4e.jsonl:59:{"parentUuid":"6d209008-6278-46a5-be7b-126b6d413d19","isSidechain":false,"promptId":"2dbc6e3b-65f6-41d8-bfab-0add069e092d","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01B3c4pwagpvqNcnRx2ddtZV","type":"tool_result","content":"cbuild/config.h:622:#define LISTENQUEUE 128\ncommon/struct_def.h:183:#define FLAGS_LISTENINACTIVE 0x8000000 /* Listener does not listen() */\ncommon/struct_def.h:219:#define IsListenerInactive(x)\t((x)->flags & FLAGS_LISTENINACTIVE)\ncommon/struct_def.h:240:#define SetListenerInactive(x)\t((x)->flags |= FLAGS_LISTENINACTIVE)\ncommon/struct_def.h:261:#define ClearListenerInactive(x) ((x)->flags &= ~FLAGS_LISTENINACTIVE)\n=== bindgen consts ===\ntarget/debug/build/ircd-sys-a7189432d0680283/out/bindings.rs:202:pub const FLAGS_LISTEN: u32 = 64;\ntarget/debug/build/ircd-sys-a7189432d0680283/out/bindings.rs:222:pub const FLAGS_LISTENINACTIVE: u32 = 134217728;\ntarget/debug/build/ircd-sys-a7189432d0680283/out/bindings.rs:1782:pub const ServerChannels_SCH_NOTICE: ServerChannels = 1;\ntarget/debug/build/ircd-sys-fdb30e3711df1b8f/out/bindings.rs:202:pub const FLAGS_LISTEN: u32 = 64;\ntarget/debug/build/ircd-sys-fdb30e3711df1b8f/out/bindings.rs:222:pub const FLAGS_LISTENINACTIVE: u32 = 134217728;\ntarget/debug/build/ircd-sys-fdb30e3711df1b8f/out/bindings.rs:1782:pub const ServerChannels_SCH_NOTICE: ServerChannels = 1;\ntarget/debug/build/ircd-sys-13c8f93b73eeb53f/out/bindings.rs:202:pub const FLAGS_LISTEN: u32 = 64;\ntarget/debug/build/ircd-sys-13c8f93b73eeb53f/out/bindings.rs:222:pub const FLAGS_LISTENINACTIVE: u32 = 134217728;\ntarget/debug/build/ircd-sys-13c8f93b73eeb53f/out/bindings.rs:1782:pub const ServerChannels_SCH_NOTICE: ServerChannels = 1;\ntarget/debug/build/ircd-sys-925aebfa1082f150/out/bindings.rs:202:pub const FLAGS_LISTEN: u32 = 64;","is_error":false}]},"uuid":"c49ad41a-9594-414f-a985-b7410db8b838","timestamp":"2026-06-06T05:16:51.312Z","toolUseResult":{"stdout":"cbuild/config.h:622:#define LISTENQUEUE 128\ncommon/struct_def.h:183:#define FLAGS_LISTENINACTIVE 0x8000000 /* Listener does not listen() */\ncommon/struct_def.h:219:#define IsListenerInactive(x)\t((x)->flags & FLAGS_LISTENINACTIVE)\ncommon/struct_def.h:240:#define SetListenerInactive(x)\t((x)->flags |= FLAGS_LISTENINACTIVE)\ncommon/struct_def.h:261:#define ClearListenerInactive(x) ((x)->flags &= ~FLAGS_LISTENINACTIVE)\n=== bindgen consts ===\ntarget/debug/build/ircd-sys-a7189432d0680283/out/bindings.rs:202:pub const FLAGS_LISTEN: u32 = 64;\ntarget/debug/build/ircd-sys-a7189432d0680283/out/bindings.rs:222:pub const FLAGS_LISTENINACTIVE: u32 = 134217728;\ntarget/debug/build/ircd-sys-a7189432d0680283/out/bindings.rs:1782:pub const ServerChannels_SCH_NOTICE: ServerChannels = 1;\ntarget/debug/build/ircd-sys-fdb30e3711df1b8f/out/bindings.rs:202:pub const FLAGS_LISTEN: u32 = 64;\ntarget/debug/build/ircd-sys-fdb30e3711df1b8f/out/bindings.rs:222:pub const FLAGS_LISTENINACTIVE: u32 = 134217728;\ntarget/debug/build/ircd-sys-fdb30e3711df1b8f/out/bindings.rs:1782:pub const ServerChannels_SCH_NOTICE: ServerChannels = 1;\ntarget/debug/build/ircd-sys-13c8f93b73eeb53f/out/bindings.rs:202:pub const FLAGS_LISTEN: u32 = 64;\ntarget/debug/build/ircd-sys-13c8f93b73eeb53f/out/bindings.rs:222:pub const FLAGS_LISTENINACTIVE: u32 = 134217728;\ntarget/debug/build/ircd-sys-13c8f93b73eeb53f/out/bindings.rs:1782:pub const ServerChannels_SCH_NOTICE: ServerChannels = 1;\ntarget/debug/build/ircd-sys-925aebfa1082f150/out/bindings.rs:202:pub const FLAGS_LISTEN: u32 = 64;","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false},"sourceToolAssistantUUID":"6d209008-6278-46a5-be7b-126b6d413d19","userType":"external","entrypoint":"cli","cwd":"/home/xe/Code/xeiaso.net/ircd.rs","sessionId":"74074e34-c77d-4932-b819-3d09ecb15f4e","version":"2.1.165","gitBranch":"master"}
.claude/sessions/6acd819d-6e4f-4ce9-bb96-891bf100bbd1.jsonl:61:{"parentUuid":"05680eee-6e8f-4e02-876e-cce6309419ff","isSidechain":false,"promptId":"d946db8d-3695-4fc6-b3b1-ff8683aa040c","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_017cDgKQwmipAfwgLxLWyW44","type":"tool_result","content":"ircd/ircd_ext.h:35:extern int firstrejoindone;\ncommon/struct_def.h:183:#define FLAGS_LISTENINACTIVE 0x8000000 /* Listener does not listen() */\ncommon/struct_def.h:219:#define IsListenerInactive(x)\t((x)->flags & FLAGS_LISTENINACTIVE)\ncommon/struct_def.h:240:#define SetListenerInactive(x)\t((x)->flags |= FLAGS_LISTENINACTIVE)\ncommon/struct_def.h:261:#define ClearListenerInactive(x) ((x)->flags &= ~FLAGS_LISTENINACTIVE)\ncommon/struct_def.h:396:#define IsConfDelayed(x)\t((x)->flags & PFLAG_DELAYED)","is_error":false}]},"uuid":"b00583c9-3f87-4c21-9044-1320d07e2b8f","timestamp":"2026-06-06T14:16:09.569Z","toolUseResult":{"stdout":"ircd/ircd_ext.h:35:extern int firstrejoindone;\ncommon/struct_def.h:183:#define FLAGS_LISTENINACTIVE 0x8000000 /* Listener does not listen() */\ncommon/struct_def.h:219:#define IsListenerInactive(x)\t((x)->flags & FLAGS_LISTENINACTIVE)\ncommon/struct_def.h:240:#define SetListenerInactive(x)\t((x)->flags |= FLAGS_LISTENINACTIVE)\ncommon/struct_def.h:261:#define ClearListenerInactive(x) ((x)->flags &= ~FLAGS_LISTENINACTIVE)\ncommon/struct_def.h:396:#define IsConfDelayed(x)\t((x)->flags & PFLAG_DELAYED)","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false},"sourceToolAssistantUUID":"05680eee-6e8f-4e02-876e-cce6309419ff","userType":"external","entrypoint":"cli","cwd":"/home/xe/Code/xeiaso.net/ircd.rs","sessionId":"6acd819d-6e4f-4ce9-bb96-891bf100bbd1","version":"2.1.165","gitBranch":"master"}
.claude/sessions/83d912ac-5e1e-4525-89a0-e5166a07c355/subagents/workflows/wf_14f560c3-63f/agent-a252c3f5768dc6c34.jsonl:22:{"parentUuid":"a248177f-c4c9-4366-8583-812d8bab7ba4","isSidechain":true,"promptId":"0f4a6818-24c2-4d73-8cd5-b20cc55b2869","agentId":"a252c3f5768dc6c34","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01TqoWs6oNk4hQiN9FPEfaKd","type":"tool_result","content":"1\t/************************************************************************\n2\t *   IRC - Internet Relay Chat, common/struct_def.h\n3\t *   Copyright (C) 1990 Jarkko Oikarinen and\n4\t *                      University of Oulu, Computing Center\n5\t *\n6\t *   This program is free software; you can redistribute it and/or modify\n7\t *   it under the terms of the GNU General Public License as published by\n8\t *   the Free Software Foundation; either version 1, or (at your option)\n9\t *   any later version.\n10\t *\n11\t *   This program is distributed in the hope that it will be useful,\n12\t *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n13\t *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n14\t *   GNU General Public License for more details.\n15\t *\n16\t *   You should have received a copy of the GNU General Public License\n17\t *   along with this program; if not, write to the Free Software\n18\t *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n19\t *\n20\t *   $Id: struct_def.h,v 1.152 2011/01/20 14:26:56 bif Exp $\n21\t */\n22\t\n23\ttypedef\tstruct\tConfItem aConfItem;\n24\ttypedef\tstruct\tListItem aListItem;\n25\ttypedef\tstruct \tClient\taClient;\n26\ttypedef\tstruct\tChannel\taChannel;\n27\ttypedef\tstruct\tUser\tanUser;\n28\ttypedef\tstruct\tServer\taServer;\n29\ttypedef\tstruct\tService\taService;\n30\ttypedef\tstruct\tSLink\tLink;\n31\ttypedef\tstruct\tinvSLink\tinvLink;\n32\ttypedef\tstruct\tSMode\tMode;\n33\ttypedef\tstruct\tfdarray\tFdAry;\n34\ttypedef\tstruct\tCPing\taCPing;\n35\ttypedef\tstruct\tZdata\taZdata;\n36\ttypedef struct        LineItem aMotd;\n37\t#if defined(USE_IAUTH)\n38\ttypedef struct        LineItem aExtCf;\n39\ttypedef struct        LineItem aExtData;\n40\t#endif\n41\t\n42\t#define\tHOSTLEN\t\t63\t/* Length of hostname.  Updated to         */\n43\t\t\t\t\t/* comply with RFC1123                     */\n44\t\n45\t#if (INET6_ADDRSTRLEN > HOSTLEN)\n46\t#error HOSTLEN must not be smaller than INET6_ADDRSTRLEN\n47\t#endif\n48\t\n49\t#define\tNICKLEN\t\t15\t/* Must be the same network-wide. */\n50\t#define UIDLEN\t\t9\t/* must not be bigger than NICKLEN --Beeth */\n51\t#define\tUSERLEN\t\t10\n52\t#define\tREALLEN\t \t50\n53\t#define\tTOPICLEN\t255\n54\t#define\tCHANNELLEN\t50\n55\t#define\tPASSWDLEN \t20\n56\t#define\tKEYLEN\t\t23\n57\t#define\tBUFSIZE\t\t512\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n58\t#define\tMAXRECIPIENTS \t20\n59\t#define\tMAXBANS\t\t64\n60\t#define\tMAXBANLENGTH\t2048\n61\t#define\tBANLEN\t\t(USERLEN + NICKLEN + HOSTLEN + 3)\n62\t#define MAXPENALTY\t10\n63\t#define\tCHIDLEN\t\t5\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n64\t#define\tSIDLEN\t\t4\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n65\t#define\tMAXMODEPARAMS\t3\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n66\t#define\tDELAYCHASETIMELIMIT\t1800\t/* WARNING: *DONT* CHANGE THIS!!!! */\n67\t#define\tLDELAYCHASETIMELIMIT\t5400\t/* WARNING: *DONT* CHANGE THIS!!!! */\n68\t\n69\t#define\tREADBUF_SIZE\t16384\t/* used in s_bsd.c *AND* s_zip.c ! */\n70\t \n71\t/*\n72\t * Make up some numbers which should reflect average leaf server connect\n73\t * queue max size.\n74\t * queue=(<# of channels> * <channel size> + <user size> * <# of users>) * 2\n75\t * pool=<queue per client> * <avg. # of clients having data in queue>\n76\t */\n77\t#define\tQUEUELEN\t(((MAXCONNECTIONS / 10) * (CHANNELLEN + BANLEN + 16) +\\\n78\t\t\t\t  (HOSTLEN * 4 + REALLEN + NICKLEN + USERLEN + 24) *\\\n79\t\t\t\t  (MAXCONNECTIONS / 2)) * 2)\n80\t\n81\t#define\tBUFFERPOOL\t(DBUFSIZ * MAXCONNECTIONS * 2) + \\\n82\t\t\t\t(QUEUELEN * MAXSERVERS)\n83\t\n84\t#define\tUSERHOST_REPLYLEN\t(NICKLEN+HOSTLEN+USERLEN+5)\n85\t\n86\t/*\n87\t** 'offsetof' is defined in ANSI-C. The following definition\n88\t** is not absolutely portable (I have been told), but so far\n89\t** it has worked on all machines I have needed it. The type\n90\t** should be size_t but...  --msa\n91\t*/\n92\t#ifndef offsetof\n93\t#define\toffsetof(t,m) (int)((&((t *)0L)->m))\n94\t#endif\n95\t\n96\t#define\telementsof(x) (sizeof(x)/sizeof(x[0]))\n97\t\n98\t/*\n99\t** flags for bootup options (command line flags)\n100\t*/\n101\t#define\tBOOT_CONSOLE\t0x001\n102\t#define\tBOOT_QUICK\t0x002\n103\t#define\tBOOT_DEBUG\t0x004\n104\t#define\tBOOT_INETD\t0x008\n105\t#define\tBOOT_TTY\t0x010\n106\t\n107\t#define\tBOOT_AUTODIE\t0x040\n108\t#define\tBOOT_BADTUNE\t0x080\n109\t#define\tBOOT_PROT\t0x100\n110\t#define\tBOOT_STRICTPROT\t0x200\n111\t#define\tBOOT_NOIAUTH\t0x400\n112\t#define\tBOOT_STANDALONE\t0x800\n113\t\n114\ttypedef enum Status {\n115\t\tSTAT_CONNECTING = -4,\n116\t\tSTAT_HANDSHAKE, /* -3 */\n117\t\tSTAT_UNKNOWN,\t/* -2 */\n118\t\tSTAT_ME,\t/* -1 */\n119\t\tSTAT_SERVER,\t/* 0 */\n120\t\tSTAT_CLIENT,\t/* 1 */\n121\t\tSTAT_OPER,\t/* 2 */\n122\t\tSTAT_SERVICE,\t/* 3 */\n123\t\tSTAT_UNREG,\t/* 4 */\n124\t\tSTAT_MAX\t/* 5 -- size of handler[] table we need */\n125\t} Status;\n126\t\n127\t/*\n128\t * status macros.\n129\t */\n130\t#define\tIsRegisteredUser(x)\t(((x)->status == STAT_CLIENT || \\\n131\t\t\t\t\t (x)->status == STAT_OPER) && (x)->user)\n132\t#define\tIsRegistered(x)\t\t((x)->status >= STAT_SERVER || \\\n133\t\t\t\t\t (x)->status == STAT_ME)\n134\t#define\tIsConnecting(x)\t\t((x)->status == STAT_CONNECTING)\n135\t#define\tIsHandshake(x)\t\t((x)->status == STAT_HANDSHAKE)\n136\t#define\tIsMe(x)\t\t\t((x)->status == STAT_ME)\n137\t#define\tIsUnknown(x)\t\t((x)->status == STAT_UNKNOWN)\n138\t#define\tIsServer(x)\t\t((x)->status == STAT_SERVER)\n139\t#define\tIsClient(x)\t\t((x)->status == STAT_CLIENT || \\\n140\t\t\t\t\t (x)->status == STAT_OPER)\n141\t#define\tIsService(x)\t\t((x)->status == STAT_SERVICE && (x)->service)\n142\t\n143\t#define\tSetConnecting(x)\t((x)->status = STAT_CONNECTING)\n144\t#define\tSetHandshake(x)\t\t((x)->status = STAT_HANDSHAKE)\n145\t#define\tSetMe(x)\t\t((x)->status = STAT_ME)\n146\t#define\tSetUnknown(x)\t\t((x)->status = STAT_UNKNOWN)\n147\t#define\tSetServer(x)\t\t((x)->status = STAT_SERVER)\n148\t#define\tSetClient(x)\t\t((x)->status = IsAnOper((x)) ? STAT_OPER : STAT_CLIENT)\n149\t#define\tSetService(x)\t\t((x)->status = STAT_SERVICE)\n150\t\n151\t#define\tFLAGS_PINGSENT\t0x0000001 /* Unreplied ping sent */\n152\t#define\tFLAGS_DEADSOCK\t0x0000002 /* Local socket is dead--Exiting soon */\n153\t#define\tFLAGS_KILLED\t0x0000004 /* Prevents \"QUIT\" from being sent for this */\n154\t#define\tFLAGS_BLOCKED\t0x0000008 /* socket is in blocked condition [unused] */\n155\t#ifdef UNIXPORT\n156\t#define\tFLAGS_UNIX\t0x0000010 /* socket is in the unix domain, not inet */\n157\t#endif\n158\t#define\tFLAGS_CLOSING\t0x0000020 /* set when closing to suppress errors */\n159\t#define\tFLAGS_LISTEN\t0x0000040 /* used to mark clients which we listen() on */\n160\t#define\tFLAGS_XAUTHDONE\t0x0000080 /* iauth is finished with this client */\n161\t#define\tFLAGS_DOINGDNS\t0x0000100 /* client is waiting for a DNS response */\n162\t#define\tFLAGS_AUTH\t0x0000200 /* client is waiting on rfc931 response */\n163\t#define\tFLAGS_WRAUTH\t0x0000400 /* set if we havent writen to ident server */\n164\t#define\tFLAGS_LOCAL\t0x0000800 /* set for local clients */\n165\t#define\tFLAGS_GOTID\t0x0001000 /* successful ident lookup achieved */\n166\t#define\tFLAGS_XAUTH\t0x0002000 /* waiting on external authentication */\n167\t#define\tFLAGS_WXAUTH\t0x0004000 /* same as above, but also prevent parsing */\n168\t#define\tFLAGS_NONL\t0x0008000 /* No \\n in buffer */\n169\t#define\tFLAGS_CBURST\t0x0010000 /* set to mark connection burst being sent */\n170\t#define\tFLAGS_QUIT\t0x0040000 /* QUIT :comment shows it's not a split */\n171\t#define\tFLAGS_SPLIT\t0x0080000 /* client QUITting because of a netsplit */\n172\t#define\tFLAGS_HIDDEN\t0x0100000 /* netsplit is behind a hostmask,\n173\t\t\t\t\t     also used for marking clients in who_find\n174\t\t\t\t\t   */\n175\t#define\tFLAGS_UNKCMD\t0x0200000 /* has sent an unknown command */\n176\t#define\tFLAGS_ZIP\t0x0400000 /* link is zipped */\n177\t#define\tFLAGS_ZIPRQ\t0x0800000 /* zip requested */\n178\t#define\tFLAGS_ZIPSTART\t0x1000000 /* start of zip (ignore any CRLF) */\n179\t#define\tFLAGS_SQUIT\t0x2000000 /* This is set when we send the last\n180\t\t\t\t\t  ** server, so we know we have to send\n181\t\t\t\t\t  ** a SQUIT. */\n182\t#define\tFLAGS_EOB\t0x4000000 /* EOB received */\n183\t#define FLAGS_LISTENINACTIVE 0x8000000 /* Listener does not listen() */\n184\t#ifdef JAPANESE\n185\t#define\tFLAGS_JP\t0x10000000 /* jp version, used both for chans and servs */\n186\t#endif\n187\t\t\n188\t#define\tFLAGS_OPER\t0x0001 /* operator */\n189\t#define\tFLAGS_LOCOP\t0x0002 /* local operator -- SRB */\n190\t#define\tFLAGS_WALLOP\t0x0004 /* send wallops to them */\n191\t#define\tFLAGS_INVISIBLE\t0x0008 /* makes user invisible */\n192\t#define FLAGS_RESTRICT\t0x0010 /* restricted user */\n193\t#define FLAGS_AWAY\t0x0020 /* user is away */\n194\t#define FLAGS_EXEMPT    0x0040 /* user is exempted from k-lines */\n195\t#ifdef XLINE\n196\t#define FLAGS_XLINED\t0x0100\t/* X-lined client */\n197\t#endif\n198\t#define FLAGS_TLS       0x0200 /* user is on a secure connection port (SSL/TLS) -- mh 2020-04-27 */\n199\t#define\tSEND_UMODES\t(FLAGS_INVISIBLE|FLAGS_OPER|FLAGS_WALLOP|FLAGS_AWAY|FLAGS_RESTRICT)\n200\t#define\tALL_UMODES\t(SEND_UMODES|FLAGS_LOCOP)"}]},"uuid":"8767e54f-6993-4b1a-b593-019517aa9e48","timestamp":"2026-06-01T23:55:31.681Z","sourceToolAssistantUUID":"a248177f-c4c9-4366-8583-812d8bab7ba4","userType":"external","entrypoint":"cli","cwd":"/home/xe/code/xeiaso.net/ircd.rs","sessionId":"83d912ac-5e1e-4525-89a0-e5166a07c355","version":"2.1.160","gitBranch":"master","slug":"i-would-like-to-humming-curry"}
.claude/sessions/83d912ac-5e1e-4525-89a0-e5166a07c355/subagents/workflows/wf_14f560c3-63f/agent-a4b11b4ad1b63af01.jsonl:29:{"parentUuid":"16b25b95-8e5f-44fa-b585-9205ac36f8fc","isSidechain":true,"promptId":"0f4a6818-24c2-4d73-8cd5-b20cc55b2869","agentId":"a4b11b4ad1b63af01","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01KZCgthsrC1ARBrPVAha5AE","type":"tool_result","content":"1\t/************************************************************************\n2\t *   IRC - Internet Relay Chat, common/struct_def.h\n3\t *   Copyright (C) 1990 Jarkko Oikarinen and\n4\t *                      University of Oulu, Computing Center\n5\t *\n6\t *   This program is free software; you can redistribute it and/or modify\n7\t *   it under the terms of the GNU General Public License as published by\n8\t *   the Free Software Foundation; either version 1, or (at your option)\n9\t *   any later version.\n10\t *\n11\t *   This program is distributed in the hope that it will be useful,\n12\t *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n13\t *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n14\t *   GNU General Public License for more details.\n15\t *\n16\t *   You should have received a copy of the GNU General Public License\n17\t *   along with this program; if not, write to the Free Software\n18\t *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n19\t *\n20\t *   $Id: struct_def.h,v 1.152 2011/01/20 14:26:56 bif Exp $\n21\t */\n22\t\n23\ttypedef\tstruct\tConfItem aConfItem;\n24\ttypedef\tstruct\tListItem aListItem;\n25\ttypedef\tstruct \tClient\taClient;\n26\ttypedef\tstruct\tChannel\taChannel;\n27\ttypedef\tstruct\tUser\tanUser;\n28\ttypedef\tstruct\tServer\taServer;\n29\ttypedef\tstruct\tService\taService;\n30\ttypedef\tstruct\tSLink\tLink;\n31\ttypedef\tstruct\tinvSLink\tinvLink;\n32\ttypedef\tstruct\tSMode\tMode;\n33\ttypedef\tstruct\tfdarray\tFdAry;\n34\ttypedef\tstruct\tCPing\taCPing;\n35\ttypedef\tstruct\tZdata\taZdata;\n36\ttypedef struct        LineItem aMotd;\n37\t#if defined(USE_IAUTH)\n38\ttypedef struct        LineItem aExtCf;\n39\ttypedef struct        LineItem aExtData;\n40\t#endif\n41\t\n42\t#define\tHOSTLEN\t\t63\t/* Length of hostname.  Updated to         */\n43\t\t\t\t\t/* comply with RFC1123                     */\n44\t\n45\t#if (INET6_ADDRSTRLEN > HOSTLEN)\n46\t#error HOSTLEN must not be smaller than INET6_ADDRSTRLEN\n47\t#endif\n48\t\n49\t#define\tNICKLEN\t\t15\t/* Must be the same network-wide. */\n50\t#define UIDLEN\t\t9\t/* must not be bigger than NICKLEN --Beeth */\n51\t#define\tUSERLEN\t\t10\n52\t#define\tREALLEN\t \t50\n53\t#define\tTOPICLEN\t255\n54\t#define\tCHANNELLEN\t50\n55\t#define\tPASSWDLEN \t20\n56\t#define\tKEYLEN\t\t23\n57\t#define\tBUFSIZE\t\t512\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n58\t#define\tMAXRECIPIENTS \t20\n59\t#define\tMAXBANS\t\t64\n60\t#define\tMAXBANLENGTH\t2048\n61\t#define\tBANLEN\t\t(USERLEN + NICKLEN + HOSTLEN + 3)\n62\t#define MAXPENALTY\t10\n63\t#define\tCHIDLEN\t\t5\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n64\t#define\tSIDLEN\t\t4\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n65\t#define\tMAXMODEPARAMS\t3\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n66\t#define\tDELAYCHASETIMELIMIT\t1800\t/* WARNING: *DONT* CHANGE THIS!!!! */\n67\t#define\tLDELAYCHASETIMELIMIT\t5400\t/* WARNING: *DONT* CHANGE THIS!!!! */\n68\t\n69\t#define\tREADBUF_SIZE\t16384\t/* used in s_bsd.c *AND* s_zip.c ! */\n70\t \n71\t/*\n72\t * Make up some numbers which should reflect average leaf server connect\n73\t * queue max size.\n74\t * queue=(<# of channels> * <channel size> + <user size> * <# of users>) * 2\n75\t * pool=<queue per client> * <avg. # of clients having data in queue>\n76\t */\n77\t#define\tQUEUELEN\t(((MAXCONNECTIONS / 10) * (CHANNELLEN + BANLEN + 16) +\\\n78\t\t\t\t  (HOSTLEN * 4 + REALLEN + NICKLEN + USERLEN + 24) *\\\n79\t\t\t\t  (MAXCONNECTIONS / 2)) * 2)\n80\t\n81\t#define\tBUFFERPOOL\t(DBUFSIZ * MAXCONNECTIONS * 2) + \\\n82\t\t\t\t(QUEUELEN * MAXSERVERS)\n83\t\n84\t#define\tUSERHOST_REPLYLEN\t(NICKLEN+HOSTLEN+USERLEN+5)\n85\t\n86\t/*\n87\t** 'offsetof' is defined in ANSI-C. The following definition\n88\t** is not absolutely portable (I have been told), but so far\n89\t** it has worked on all machines I have needed it. The type\n90\t** should be size_t but...  --msa\n91\t*/\n92\t#ifndef offsetof\n93\t#define\toffsetof(t,m) (int)((&((t *)0L)->m))\n94\t#endif\n95\t\n96\t#define\telementsof(x) (sizeof(x)/sizeof(x[0]))\n97\t\n98\t/*\n99\t** flags for bootup options (command line flags)\n100\t*/\n101\t#define\tBOOT_CONSOLE\t0x001\n102\t#define\tBOOT_QUICK\t0x002\n103\t#define\tBOOT_DEBUG\t0x004\n104\t#define\tBOOT_INETD\t0x008\n105\t#define\tBOOT_TTY\t0x010\n106\t\n107\t#define\tBOOT_AUTODIE\t0x040\n108\t#define\tBOOT_BADTUNE\t0x080\n109\t#define\tBOOT_PROT\t0x100\n110\t#define\tBOOT_STRICTPROT\t0x200\n111\t#define\tBOOT_NOIAUTH\t0x400\n112\t#define\tBOOT_STANDALONE\t0x800\n113\t\n114\ttypedef enum Status {\n115\t\tSTAT_CONNECTING = -4,\n116\t\tSTAT_HANDSHAKE, /* -3 */\n117\t\tSTAT_UNKNOWN,\t/* -2 */\n118\t\tSTAT_ME,\t/* -1 */\n119\t\tSTAT_SERVER,\t/* 0 */\n120\t\tSTAT_CLIENT,\t/* 1 */\n121\t\tSTAT_OPER,\t/* 2 */\n122\t\tSTAT_SERVICE,\t/* 3 */\n123\t\tSTAT_UNREG,\t/* 4 */\n124\t\tSTAT_MAX\t/* 5 -- size of handler[] table we need */\n125\t} Status;\n126\t\n127\t/*\n128\t * status macros.\n129\t */\n130\t#define\tIsRegisteredUser(x)\t(((x)->status == STAT_CLIENT || \\\n131\t\t\t\t\t (x)->status == STAT_OPER) && (x)->user)\n132\t#define\tIsRegistered(x)\t\t((x)->status >= STAT_SERVER || \\\n133\t\t\t\t\t (x)->status == STAT_ME)\n134\t#define\tIsConnecting(x)\t\t((x)->status == STAT_CONNECTING)\n135\t#define\tIsHandshake(x)\t\t((x)->status == STAT_HANDSHAKE)\n136\t#define\tIsMe(x)\t\t\t((x)->status == STAT_ME)\n137\t#define\tIsUnknown(x)\t\t((x)->status == STAT_UNKNOWN)\n138\t#define\tIsServer(x)\t\t((x)->status == STAT_SERVER)\n139\t#define\tIsClient(x)\t\t((x)->status == STAT_CLIENT || \\\n140\t\t\t\t\t (x)->status == STAT_OPER)\n141\t#define\tIsService(x)\t\t((x)->status == STAT_SERVICE && (x)->service)\n142\t\n143\t#define\tSetConnecting(x)\t((x)->status = STAT_CONNECTING)\n144\t#define\tSetHandshake(x)\t\t((x)->status = STAT_HANDSHAKE)\n145\t#define\tSetMe(x)\t\t((x)->status = STAT_ME)\n146\t#define\tSetUnknown(x)\t\t((x)->status = STAT_UNKNOWN)\n147\t#define\tSetServer(x)\t\t((x)->status = STAT_SERVER)\n148\t#define\tSetClient(x)\t\t((x)->status = IsAnOper((x)) ? STAT_OPER : STAT_CLIENT)\n149\t#define\tSetService(x)\t\t((x)->status = STAT_SERVICE)\n150\t\n151\t#define\tFLAGS_PINGSENT\t0x0000001 /* Unreplied ping sent */\n152\t#define\tFLAGS_DEADSOCK\t0x0000002 /* Local socket is dead--Exiting soon */\n153\t#define\tFLAGS_KILLED\t0x0000004 /* Prevents \"QUIT\" from being sent for this */\n154\t#define\tFLAGS_BLOCKED\t0x0000008 /* socket is in blocked condition [unused] */\n155\t#ifdef UNIXPORT\n156\t#define\tFLAGS_UNIX\t0x0000010 /* socket is in the unix domain, not inet */\n157\t#endif\n158\t#define\tFLAGS_CLOSING\t0x0000020 /* set when closing to suppress errors */\n159\t#define\tFLAGS_LISTEN\t0x0000040 /* used to mark clients which we listen() on */\n160\t#define\tFLAGS_XAUTHDONE\t0x0000080 /* iauth is finished with this client */\n161\t#define\tFLAGS_DOINGDNS\t0x0000100 /* client is waiting for a DNS response */\n162\t#define\tFLAGS_AUTH\t0x0000200 /* client is waiting on rfc931 response */\n163\t#define\tFLAGS_WRAUTH\t0x0000400 /* set if we havent writen to ident server */\n164\t#define\tFLAGS_LOCAL\t0x0000800 /* set for local clients */\n165\t#define\tFLAGS_GOTID\t0x0001000 /* successful ident lookup achieved */\n166\t#define\tFLAGS_XAUTH\t0x0002000 /* waiting on external authentication */\n167\t#define\tFLAGS_WXAUTH\t0x0004000 /* same as above, but also prevent parsing */\n168\t#define\tFLAGS_NONL\t0x0008000 /* No \\n in buffer */\n169\t#define\tFLAGS_CBURST\t0x0010000 /* set to mark connection burst being sent */\n170\t#define\tFLAGS_QUIT\t0x0040000 /* QUIT :comment shows it's not a split */\n171\t#define\tFLAGS_SPLIT\t0x0080000 /* client QUITting because of a netsplit */\n172\t#define\tFLAGS_HIDDEN\t0x0100000 /* netsplit is behind a hostmask,\n173\t\t\t\t\t     also used for marking clients in who_find\n174\t\t\t\t\t   */\n175\t#define\tFLAGS_UNKCMD\t0x0200000 /* has sent an unknown command */\n176\t#define\tFLAGS_ZIP\t0x0400000 /* link is zipped */\n177\t#define\tFLAGS_ZIPRQ\t0x0800000 /* zip requested */\n178\t#define\tFLAGS_ZIPSTART\t0x1000000 /* start of zip (ignore any CRLF) */\n179\t#define\tFLAGS_SQUIT\t0x2000000 /* This is set when we send the last\n180\t\t\t\t\t  ** server, so we know we have to send\n181\t\t\t\t\t  ** a SQUIT. */\n182\t#define\tFLAGS_EOB\t0x4000000 /* EOB received */\n183\t#define FLAGS_LISTENINACTIVE 0x8000000 /* Listener does not listen() */\n184\t#ifdef JAPANESE\n185\t#define\tFLAGS_JP\t0x10000000 /* jp version, used both for chans and servs */\n186\t#endif\n187\t\t\n188\t#define\tFLAGS_OPER\t0x0001 /* operator */\n189\t#define\tFLAGS_LOCOP\t0x0002 /* local operator -- SRB */\n190\t#define\tFLAGS_WALLOP\t0x0004 /* send wallops to them */\n191\t#define\tFLAGS_INVISIBLE\t0x0008 /* makes user invisible */\n192\t#define FLAGS_RESTRICT\t0x0010 /* restricted user */\n193\t#define FLAGS_AWAY\t0x0020 /* user is away */\n194\t#define FLAGS_EXEMPT    0x0040 /* user is exempted from k-lines */\n195\t#ifdef XLINE\n196\t#define FLAGS_XLINED\t0x0100\t/* X-lined client */\n197\t#endif\n198\t#define FLAGS_TLS       0x0200 /* user is on a secure connection port (SSL/TLS) -- mh 2020-04-27 */\n199\t#define\tSEND_UMODES\t(FLAGS_INVISIBLE|FLAGS_OPER|FLAGS_WALLOP|FLAGS_AWAY|FLAGS_RESTRICT)\n200\t#define\tALL_UMODES\t(SEND_UMODES|FLAGS_LOCOP)\n201\t\n202\t/*\n203\t * user flags macros.\n204\t */\n205\t#define\tIsOper(x)\t\t((x)->user && (x)->user->flags & FLAGS_OPER)\n206\t#define\tIsLocOp(x)\t\t((x)->user && (x)->user->flags & FLAGS_LOCOP)\n207\t#define\tIsInvisible(x)\t\t((x)->user->flags & FLAGS_INVISIBLE)\n208\t#define IsRestricted(x)         ((x)->user && \\\n209\t\t\t\t\t (x)->user->flags & FLAGS_RESTRICT)\n210\t#define\tIsAnOper(x)\t\t((x)->user && \\\n211\t\t\t\t\t (x)->user->flags & (FLAGS_OPER|FLAGS_LOCOP))\n212\t#define\tIsPerson(x)\t\t((x)->user && IsClient(x))\n213\t#define\tIsPrivileged(x)\t\t(IsServer(x) || IsAnOper(x))\n214\t#define\tSendWallops(x)\t\t((x)->user->flags & FLAGS_WALLOP)\n215\t#ifdef UNIXPORT\n216\t#define\tIsUnixSocket(x)\t\t((x)->flags & FLAGS_UNIX)\n217\t#endif\n218\t#define\tIsListener(x)\t\t((x)->flags & FLAGS_LISTEN)\n219\t#define IsListenerInactive(x)\t((x)->flags & FLAGS_LISTENINACTIVE)\n220\t#define\tIsLocal(x)\t\t(MyConnect(x) && (x)->flags & FLAGS_LOCAL)\n221\t#define\tIsDead(x)\t\t((x)->flags & FLAGS_DEADSOCK)\n222\t#define\tIsBursting(x)\t\t(!((x)->flags & FLAGS_EOB))\n223\t#define IsKlineExempt(x)        ((x)->user && (x)->user->flags & FLAGS_EXEMPT)\n224\t\n225\t#define\tSetDead(x)\t\t((x)->flags |= FLAGS_DEADSOCK)\n226\t#define\tCBurst(x)\t\t((x)->flags & FLAGS_CBURST)\n227\t#define\tSetOper(x)\t\t((x)->user->flags |= FLAGS_OPER, \\\n228\t\t\t\t\t (x)->status = STAT_OPER)\n229\t#define\tSetLocOp(x)\t\t((x)->user->flags |= FLAGS_LOCOP, \\\n230\t\t\t\t\t (x)->status = STAT_OPER)\n231\t#define\tSetInvisible(x)\t\t((x)->user->flags |= FLAGS_INVISIBLE)\n232\t#define SetRestricted(x)\t((x)->user->flags |= FLAGS_RESTRICT)\n233\t#define\tSetWallops(x)\t\t((x)->user->flags |= FLAGS_WALLOP)\n234\t#ifdef UNIXPORT\n235\t#define\tSetUnixSock(x)\t\t((x)->flags |= FLAGS_UNIX)\n236\t#endif\n237\t#define\tSetDNS(x)\t\t((x)->flags |= FLAGS_DOINGDNS)\n238\t#define\tSetDoneXAuth(x)\t\t((x)->flags |= FLAGS_XAUTHDONE)\n239\t#define\tSetEOB(x)\t\t((x)->flags |= FLAGS_EOB)\n240\t#define SetListenerInactive(x)\t((x)->flags |= FLAGS_LISTENINACTIVE)\n241\t#define SetKlineExempt(x)\t((x)->user->flags |= FLAGS_EXEMPT)\n242\t\n243\t#define\tDoingDNS(x)\t\t((x)->flags & FLAGS_DOINGDNS)\n244\t#define\tDoingAuth(x)\t\t((x)->flags & FLAGS_AUTH)\n245\t#define\tDoingXAuth(x)\t\t((x)->flags & FLAGS_XAUTH)\n246\t#define\tWaitingXAuth(x)\t\t((x)->flags & FLAGS_WXAUTH)\n247\t#define\tDoneXAuth(x)\t\t((x)->flags & FLAGS_XAUTHDONE)\n248\t#define\tNoNewLine(x)\t\t((x)->flags & FLAGS_NONL)\n249\t\n250\t#define\tClearOper(x)\t\t((x)->user->flags &= ~FLAGS_OPER, \\\n251\t\t\t\t\t (x)->status = STAT_CLIENT)\n252\t#define\tClearLocOp(x)\t\t((x)->user->flags &= ~FLAGS_LOCOP, \\\n253\t\t\t\t\t (x)->status = STAT_CLIENT)\n254\t#define\tClearInvisible(x)\t((x)->user->flags &= ~FLAGS_INVISIBLE)\n255\t#define ClearRestricted(x)      ((x)->user->flags &= ~FLAGS_RESTRICT)\n256\t#define\tClearWallops(x)\t\t((x)->user->flags &= ~FLAGS_WALLOP)\n257\t#define\tClearDNS(x)\t\t((x)->flags &= ~FLAGS_DOINGDNS)\n258\t#define\tClearAuth(x)\t\t((x)->flags &= ~FLAGS_AUTH)\n259\t#define\tClearXAuth(x)\t\t((x)->flags &= ~FLAGS_XAUTH)\n260\t#define\tClearWXAuth(x)\t\t((x)->flags &= ~FLAGS_WXAUTH)\n261\t#define ClearListenerInactive(x) ((x)->flags &= ~FLAGS_LISTENINACTIVE)\n262\t#ifdef XLINE\n263\t#define IsXlined(x)\t\t((x)->user && (x)->user->flags & FLAGS_XLINED)\n264\t#define SetXlined(x)\t\t((x)->user->flags |= FLAGS_XLINED)\n265\t#define ClearXlined(x)\t\t((x)->user->flags &= ~FLAGS_XLINED)\n266\t#endif\n267\t#define IsTLS(x)        ((x)->user && (x)->user->flags & FLAGS_TLS)\n268\t#define SetTLS(x)       ((x)->user->flags |= FLAGS_TLS)\n269\t\n270\t/*\n271\t * defined debugging levels\n272\t */\n273\t#define\tDEBUG_FATAL  0\n274\t#define\tDEBUG_ERROR  1\t/* report_error() and other errors that are found */\n275\t#define\tDEBUG_READ   2\n276\t#define\tDEBUG_WRITE  2\n277\t#define\tDEBUG_NOTICE 3\n278\t#define\tDEBUG_DNS    4\t/* used by all DNS related routines - a *lot* */\n279\t#define\tDEBUG_INFO   5\t/* general usful info */\n280\t#define\tDEBUG_NUM    6\t/* numerics */\n281\t#define\tDEBUG_SEND   7\t/* everything that is sent out */\n282\t#define\tDEBUG_DEBUG  8\t/* anything to do with debugging, ie unimportant :) */\n283\t#define\tDEBUG_MALLOC 9\t/* malloc/free calls */\n284\t#define\tDEBUG_LIST  10\t/* debug list use */\n285\t#define\tDEBUG_L10   10\n286\t#define\tDEBUG_L11   11\n287\t\n288\t/*\n289\t * defines for curses in client\n290\t */\n291\t#define\tDUMMY_TERM\t0\n292\t#define\tCURSES_TERM\t1\n293\t#define\tTERMCAP_TERM\t2\n294\t\n295\tstruct\tCPing\t{\n296\t\tu_short\tport;\t\t/* port to send pings to */\n297\t\tu_long\trtt;\t\t/* average RTT */\n298\t\tu_long\tping;\n299\t\tu_long\tseq;\t\t/* # sent still in the \"window\" */\n300\t\tu_long\tlseq;\t\t/* sequence # of last sent */\n301\t\tu_long\trecvd;\t\t/* # received still in the \"window\" */\n302\t\tu_long\tlrecvd;\t\t/* # received */\n303\t};\n304\t\n305\tstruct\tConfItem\t{\n306\t\tu_int\tstatus;\t\t/* If CONF_ILLEGAL, delete when no clients */\n307\t\tint\tclients;\t/* Number of *LOCAL* clients using this */\n308\t\tstruct\tIN_ADDR ipnum;\t/* ip number of host field */\n309\t\tchar\t*host;\n310\t\tchar\t*passwd;\n311\t\tchar\t*name;\n312\t\tchar\t*name2;\n313\t#ifdef XLINE\n314\t\tchar\t*name3;\n315\t#endif\n316\t\tint\tport;\n317\t\tlong\tflags;\t\t/* I-line flags */\n318\t\tint\tpref;\t\t/* preference value */\n319\t\tstruct\tCPing\t*ping;\n320\t\ttime_t\thold;\t/* Hold action until this time (calendar time) */\n321\t\tchar\t*source_ip;\n322\t#ifndef VMSP\n323\t\taClass\t*class;  /* Class of connection */\n324\t#endif\n325\t\tstruct\tConfItem *next;\n326\t};\n327\t\n328\tstruct\tListItem\t{\n329\t\tchar\t*nick;\n330\t\tchar\t*user;\n331\t\tchar\t*host;\n332\t};\n333\t\n334\t/* these define configuration lines (A:, M:, I:, K:, etc.) */\n335\t#define\tCONF_ILLEGAL\t\t0x80000000\n336\t#define\tCONF_MATCH\t\t0x40000000\n337\t#define\tCONF_QUARANTINED_SERVER\t0x000001\n338\t#define\tCONF_CLIENT\t\t0x000002\n339\t\n340\t#define\tCONF_CONNECT_SERVER\t0x000008\n341\t#define\tCONF_NOCONNECT_SERVER\t0x000010\n342\t#define\tCONF_ZCONNECT_SERVER\t0x000020\n343\t\n344\t#define\tCONF_OPERATOR\t\t0x000080\n345\t#define\tCONF_ME\t\t\t0x000100\n346\t#define\tCONF_KILL\t\t0x000200\n347\t#define\tCONF_ADMIN\t\t0x000400\n348\t#define\tCONF_CLASS\t\t0x001000\n349\t#define\tCONF_SERVICE\t\t0x002000\n350\t#define\tCONF_LEAF\t\t0x004000\n351\t#define\tCONF_LISTEN_PORT\t0x008000\n352\t#define\tCONF_HUB\t\t0x010000\n353\t#define\tCONF_VER\t\t0x020000\n354\t#define\tCONF_BOUNCE\t\t0x040000\n355\t#define\tCONF_OTHERKILL\t\t0x080000\n356\t#define\tCONF_DENY\t\t0x100000\n357\t#ifdef TKLINE\n358\t#define\tCONF_TKILL\t\t0x200000\n359\t#define\tCONF_TOTHERKILL\t\t0x400000\n360\t#endif\n361\t#ifdef XLINE\n362\t#define CONF_XLINE\t\t0x800000\n363\t#endif\n364\t#define\tCONF_OPS\t\tCONF_OPERATOR\n365\t#define\tCONF_SERVER_MASK\t(CONF_CONNECT_SERVER | CONF_NOCONNECT_SERVER |\\\n366\t\t\t\t\t CONF_ZCONNECT_SERVER)\n367\t#define\tCONF_CLIENT_MASK\t(CONF_CLIENT | CONF_SERVICE | CONF_OPS | \\\n368\t\t\t\t\t CONF_SERVER_MASK)\n369\t\n370\t#define CFLAG_RESTRICTED\t0x00001\n371\t#define CFLAG_RNODNS\t\t0x00002\n372\t#define CFLAG_RNOIDENT\t\t0x00004\n373\t#define CFLAG_KEXEMPT\t\t0x00008\n374\t#define CFLAG_NORESOLVE\t\t0x00010\n375\t#define CFLAG_FALL\t\t0x00020\n376\t#define CFLAG_NORESOLVEMATCH\t0x00040\n377\t#ifdef XLINE\n378\t#define CFLAG_XEXEMPT\t\t0x00080\n379\t#endif\n380\t\n381\t#define IsConfRestricted(x)\t((x)->flags & CFLAG_RESTRICTED)\n382\t#define IsConfRNoDNS(x)\t\t((x)->flags & CFLAG_RNODNS)\n383\t#define IsConfRNoIdent(x)\t((x)->flags & CFLAG_RNOIDENT)\n384\t#define IsConfKlineExempt(x)\t((x)->flags & CFLAG_KEXEMPT)\n385\t#define IsConfNoResolve(x)\t((x)->flags & CFLAG_NORESOLVE)\n386\t#define IsConfNoResolveMatch(x)\t((x)->flags & CFLAG_NORESOLVEMATCH)\n387\t#define IsConfFallThrough(x)\t((x)->flags & CFLAG_FALL)\n388\t#ifdef XLINE\n389\t#define IsConfXlineExempt(x)\t((x)->flags & CFLAG_XEXEMPT)\n390\t#endif\n391\t\n392\t#define PFLAG_DELAYED\t\t0x00001\n393\t#define PFLAG_SERVERONLY\t0x00002\n394\t#define PFLAG_TLS           0x00004\n395\t\n396\t#define IsConfDelayed(x)\t((x)->flags & PFLAG_DELAYED)\n397\t#define IsConfServeronly(x)\t((x)->flags & PFLAG_SERVERONLY)\n398\t#define IsConfTLS(x)        ((x)->flags & PFLAG_TLS)\n399\t\n400\t#define\tIsIllegal(x)\t((x)->status & CONF_ILLEGAL)"}]},"uuid":"57293cc2-4932-4f1d-9fac-6184dae840cd","timestamp":"2026-06-01T23:55:35.855Z","sourceToolAssistantUUID":"16b25b95-8e5f-44fa-b585-9205ac36f8fc","userType":"external","entrypoint":"cli","cwd":"/home/xe/code/xeiaso.net/ircd.rs","sessionId":"83d912ac-5e1e-4525-89a0-e5166a07c355","version":"2.1.160","gitBranch":"master","slug":"i-would-like-to-humming-curry"}
.claude/sessions/83d912ac-5e1e-4525-89a0-e5166a07c355/subagents/workflows/wf_14f560c3-63f/agent-abaac5023b4055be5.jsonl:13:{"parentUuid":"6c2305fe-4afb-4d42-8a27-7318d471f7a0","isSidechain":true,"promptId":"0f4a6818-24c2-4d73-8cd5-b20cc55b2869","agentId":"abaac5023b4055be5","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Q7CuYYvzBtegFkKLaibAT5","type":"tool_result","content":"1\t/************************************************************************\n2\t *   IRC - Internet Relay Chat, common/struct_def.h\n3\t *   Copyright (C) 1990 Jarkko Oikarinen and\n4\t *                      University of Oulu, Computing Center\n5\t *\n6\t *   This program is free software; you can redistribute it and/or modify\n7\t *   it under the terms of the GNU General Public License as published by\n8\t *   the Free Software Foundation; either version 1, or (at your option)\n9\t *   any later version.\n10\t *\n11\t *   This program is distributed in the hope that it will be useful,\n12\t *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n13\t *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n14\t *   GNU General Public License for more details.\n15\t *\n16\t *   You should have received a copy of the GNU General Public License\n17\t *   along with this program; if not, write to the Free Software\n18\t *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n19\t *\n20\t *   $Id: struct_def.h,v 1.152 2011/01/20 14:26:56 bif Exp $\n21\t */\n22\t\n23\ttypedef\tstruct\tConfItem aConfItem;\n24\ttypedef\tstruct\tListItem aListItem;\n25\ttypedef\tstruct \tClient\taClient;\n26\ttypedef\tstruct\tChannel\taChannel;\n27\ttypedef\tstruct\tUser\tanUser;\n28\ttypedef\tstruct\tServer\taServer;\n29\ttypedef\tstruct\tService\taService;\n30\ttypedef\tstruct\tSLink\tLink;\n31\ttypedef\tstruct\tinvSLink\tinvLink;\n32\ttypedef\tstruct\tSMode\tMode;\n33\ttypedef\tstruct\tfdarray\tFdAry;\n34\ttypedef\tstruct\tCPing\taCPing;\n35\ttypedef\tstruct\tZdata\taZdata;\n36\ttypedef struct        LineItem aMotd;\n37\t#if defined(USE_IAUTH)\n38\ttypedef struct        LineItem aExtCf;\n39\ttypedef struct        LineItem aExtData;\n40\t#endif\n41\t\n42\t#define\tHOSTLEN\t\t63\t/* Length of hostname.  Updated to         */\n43\t\t\t\t\t/* comply with RFC1123                     */\n44\t\n45\t#if (INET6_ADDRSTRLEN > HOSTLEN)\n46\t#error HOSTLEN must not be smaller than INET6_ADDRSTRLEN\n47\t#endif\n48\t\n49\t#define\tNICKLEN\t\t15\t/* Must be the same network-wide. */\n50\t#define UIDLEN\t\t9\t/* must not be bigger than NICKLEN --Beeth */\n51\t#define\tUSERLEN\t\t10\n52\t#define\tREALLEN\t \t50\n53\t#define\tTOPICLEN\t255\n54\t#define\tCHANNELLEN\t50\n55\t#define\tPASSWDLEN \t20\n56\t#define\tKEYLEN\t\t23\n57\t#define\tBUFSIZE\t\t512\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n58\t#define\tMAXRECIPIENTS \t20\n59\t#define\tMAXBANS\t\t64\n60\t#define\tMAXBANLENGTH\t2048\n61\t#define\tBANLEN\t\t(USERLEN + NICKLEN + HOSTLEN + 3)\n62\t#define MAXPENALTY\t10\n63\t#define\tCHIDLEN\t\t5\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n64\t#define\tSIDLEN\t\t4\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n65\t#define\tMAXMODEPARAMS\t3\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n66\t#define\tDELAYCHASETIMELIMIT\t1800\t/* WARNING: *DONT* CHANGE THIS!!!! */\n67\t#define\tLDELAYCHASETIMELIMIT\t5400\t/* WARNING: *DONT* CHANGE THIS!!!! */\n68\t\n69\t#define\tREADBUF_SIZE\t16384\t/* used in s_bsd.c *AND* s_zip.c ! */\n70\t \n71\t/*\n72\t * Make up some numbers which should reflect average leaf server connect\n73\t * queue max size.\n74\t * queue=(<# of channels> * <channel size> + <user size> * <# of users>) * 2\n75\t * pool=<queue per client> * <avg. # of clients having data in queue>\n76\t */\n77\t#define\tQUEUELEN\t(((MAXCONNECTIONS / 10) * (CHANNELLEN + BANLEN + 16) +\\\n78\t\t\t\t  (HOSTLEN * 4 + REALLEN + NICKLEN + USERLEN + 24) *\\\n79\t\t\t\t  (MAXCONNECTIONS / 2)) * 2)\n80\t\n81\t#define\tBUFFERPOOL\t(DBUFSIZ * MAXCONNECTIONS * 2) + \\\n82\t\t\t\t(QUEUELEN * MAXSERVERS)\n83\t\n84\t#define\tUSERHOST_REPLYLEN\t(NICKLEN+HOSTLEN+USERLEN+5)\n85\t\n86\t/*\n87\t** 'offsetof' is defined in ANSI-C. The following definition\n88\t** is not absolutely portable (I have been told), but so far\n89\t** it has worked on all machines I have needed it. The type\n90\t** should be size_t but...  --msa\n91\t*/\n92\t#ifndef offsetof\n93\t#define\toffsetof(t,m) (int)((&((t *)0L)->m))\n94\t#endif\n95\t\n96\t#define\telementsof(x) (sizeof(x)/sizeof(x[0]))\n97\t\n98\t/*\n99\t** flags for bootup options (command line flags)\n100\t*/\n101\t#define\tBOOT_CONSOLE\t0x001\n102\t#define\tBOOT_QUICK\t0x002\n103\t#define\tBOOT_DEBUG\t0x004\n104\t#define\tBOOT_INETD\t0x008\n105\t#define\tBOOT_TTY\t0x010\n106\t\n107\t#define\tBOOT_AUTODIE\t0x040\n108\t#define\tBOOT_BADTUNE\t0x080\n109\t#define\tBOOT_PROT\t0x100\n110\t#define\tBOOT_STRICTPROT\t0x200\n111\t#define\tBOOT_NOIAUTH\t0x400\n112\t#define\tBOOT_STANDALONE\t0x800\n113\t\n114\ttypedef enum Status {\n115\t\tSTAT_CONNECTING = -4,\n116\t\tSTAT_HANDSHAKE, /* -3 */\n117\t\tSTAT_UNKNOWN,\t/* -2 */\n118\t\tSTAT_ME,\t/* -1 */\n119\t\tSTAT_SERVER,\t/* 0 */\n120\t\tSTAT_CLIENT,\t/* 1 */\n121\t\tSTAT_OPER,\t/* 2 */\n122\t\tSTAT_SERVICE,\t/* 3 */\n123\t\tSTAT_UNREG,\t/* 4 */\n124\t\tSTAT_MAX\t/* 5 -- size of handler[] table we need */\n125\t} Status;\n126\t\n127\t/*\n128\t * status macros.\n129\t */\n130\t#define\tIsRegisteredUser(x)\t(((x)->status == STAT_CLIENT || \\\n131\t\t\t\t\t (x)->status == STAT_OPER) && (x)->user)\n132\t#define\tIsRegistered(x)\t\t((x)->status >= STAT_SERVER || \\\n133\t\t\t\t\t (x)->status == STAT_ME)\n134\t#define\tIsConnecting(x)\t\t((x)->status == STAT_CONNECTING)\n135\t#define\tIsHandshake(x)\t\t((x)->status == STAT_HANDSHAKE)\n136\t#define\tIsMe(x)\t\t\t((x)->status == STAT_ME)\n137\t#define\tIsUnknown(x)\t\t((x)->status == STAT_UNKNOWN)\n138\t#define\tIsServer(x)\t\t((x)->status == STAT_SERVER)\n139\t#define\tIsClient(x)\t\t((x)->status == STAT_CLIENT || \\\n140\t\t\t\t\t (x)->status == STAT_OPER)\n141\t#define\tIsService(x)\t\t((x)->status == STAT_SERVICE && (x)->service)\n142\t\n143\t#define\tSetConnecting(x)\t((x)->status = STAT_CONNECTING)\n144\t#define\tSetHandshake(x)\t\t((x)->status = STAT_HANDSHAKE)\n145\t#define\tSetMe(x)\t\t((x)->status = STAT_ME)\n146\t#define\tSetUnknown(x)\t\t((x)->status = STAT_UNKNOWN)\n147\t#define\tSetServer(x)\t\t((x)->status = STAT_SERVER)\n148\t#define\tSetClient(x)\t\t((x)->status = IsAnOper((x)) ? STAT_OPER : STAT_CLIENT)\n149\t#define\tSetService(x)\t\t((x)->status = STAT_SERVICE)\n150\t\n151\t#define\tFLAGS_PINGSENT\t0x0000001 /* Unreplied ping sent */\n152\t#define\tFLAGS_DEADSOCK\t0x0000002 /* Local socket is dead--Exiting soon */\n153\t#define\tFLAGS_KILLED\t0x0000004 /* Prevents \"QUIT\" from being sent for this */\n154\t#define\tFLAGS_BLOCKED\t0x0000008 /* socket is in blocked condition [unused] */\n155\t#ifdef UNIXPORT\n156\t#define\tFLAGS_UNIX\t0x0000010 /* socket is in the unix domain, not inet */\n157\t#endif\n158\t#define\tFLAGS_CLOSING\t0x0000020 /* set when closing to suppress errors */\n159\t#define\tFLAGS_LISTEN\t0x0000040 /* used to mark clients which we listen() on */\n160\t#define\tFLAGS_XAUTHDONE\t0x0000080 /* iauth is finished with this client */\n161\t#define\tFLAGS_DOINGDNS\t0x0000100 /* client is waiting for a DNS response */\n162\t#define\tFLAGS_AUTH\t0x0000200 /* client is waiting on rfc931 response */\n163\t#define\tFLAGS_WRAUTH\t0x0000400 /* set if we havent writen to ident server */\n164\t#define\tFLAGS_LOCAL\t0x0000800 /* set for local clients */\n165\t#define\tFLAGS_GOTID\t0x0001000 /* successful ident lookup achieved */\n166\t#define\tFLAGS_XAUTH\t0x0002000 /* waiting on external authentication */\n167\t#define\tFLAGS_WXAUTH\t0x0004000 /* same as above, but also prevent parsing */\n168\t#define\tFLAGS_NONL\t0x0008000 /* No \\n in buffer */\n169\t#define\tFLAGS_CBURST\t0x0010000 /* set to mark connection burst being sent */\n170\t#define\tFLAGS_QUIT\t0x0040000 /* QUIT :comment shows it's not a split */\n171\t#define\tFLAGS_SPLIT\t0x0080000 /* client QUITting because of a netsplit */\n172\t#define\tFLAGS_HIDDEN\t0x0100000 /* netsplit is behind a hostmask,\n173\t\t\t\t\t     also used for marking clients in who_find\n174\t\t\t\t\t   */\n175\t#define\tFLAGS_UNKCMD\t0x0200000 /* has sent an unknown command */\n176\t#define\tFLAGS_ZIP\t0x0400000 /* link is zipped */\n177\t#define\tFLAGS_ZIPRQ\t0x0800000 /* zip requested */\n178\t#define\tFLAGS_ZIPSTART\t0x1000000 /* start of zip (ignore any CRLF) */\n179\t#define\tFLAGS_SQUIT\t0x2000000 /* This is set when we send the last\n180\t\t\t\t\t  ** server, so we know we have to send\n181\t\t\t\t\t  ** a SQUIT. */\n182\t#define\tFLAGS_EOB\t0x4000000 /* EOB received */\n183\t#define FLAGS_LISTENINACTIVE 0x8000000 /* Listener does not listen() */\n184\t#ifdef JAPANESE\n185\t#define\tFLAGS_JP\t0x10000000 /* jp version, used both for chans and servs */\n186\t#endif\n187\t\t\n188\t#define\tFLAGS_OPER\t0x0001 /* operator */\n189\t#define\tFLAGS_LOCOP\t0x0002 /* local operator -- SRB */\n190\t#define\tFLAGS_WALLOP\t0x0004 /* send wallops to them */\n191\t#define\tFLAGS_INVISIBLE\t0x0008 /* makes user invisible */\n192\t#define FLAGS_RESTRICT\t0x0010 /* restricted user */\n193\t#define FLAGS_AWAY\t0x0020 /* user is away */\n194\t#define FLAGS_EXEMPT    0x0040 /* user is exempted from k-lines */\n195\t#ifdef XLINE\n196\t#define FLAGS_XLINED\t0x0100\t/* X-lined client */\n197\t#endif\n198\t#define FLAGS_TLS       0x0200 /* user is on a secure connection port (SSL/TLS) -- mh 2020-04-27 */\n199\t#define\tSEND_UMODES\t(FLAGS_INVISIBLE|FLAGS_OPER|FLAGS_WALLOP|FLAGS_AWAY|FLAGS_RESTRICT)\n200\t#define\tALL_UMODES\t(SEND_UMODES|FLAGS_LOCOP)"}]},"uuid":"3dde9d67-8acc-44b7-9050-0d6569df30e2","timestamp":"2026-06-01T23:55:21.429Z","sourceToolAssistantUUID":"6c2305fe-4afb-4d42-8a27-7318d471f7a0","userType":"external","entrypoint":"cli","cwd":"/home/xe/code/xeiaso.net/ircd.rs","sessionId":"83d912ac-5e1e-4525-89a0-e5166a07c355","version":"2.1.160","gitBranch":"master","slug":"i-would-like-to-humming-curry"}
.claude/sessions/79b95458-bd77-4de4-885f-4a89b4e4df0a.jsonl:158:{"parentUuid":"553d79cc-061c-4030-b999-4f8093ae8837","isSidechain":false,"promptId":"2fa06e3f-70c5-4f62-b4dc-6ea4e9820c15","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01EawDkPYx3baWeL6Lr4MUJW","type":"tool_result","content":"198:#define FLAGS_TLS       0x0200 /* user is on a secure connection port (SSL/TLS) -- mh 2020-04-27 */\n296:\tu_short\tport;\t\t/* port to send pings to */\n308:\tstruct\tIN_ADDR ipnum;\t/* ip number of host field */\n316:\tint\tport;\n471:\tchar\tsip[1];\t\t/* ip as a string, big enough for ipv6\n528:\tchar\tusername[USERLEN+1]; /* username here now for auth stuff */\n545:\tlong\tsendM;\t\t/* Statistics: protocol messages send */\n546:\tlong\treceiveM;\t/* Statistics: protocol messages received */\n547:\tunsigned long long\tsendB;\t\t/* Statistics: total bytes send */\n548:\tunsigned long long\treceiveB;\t/* Statistics: total bytes received */\n550:\ttime_t\tfirsttime;\t/* time client was created */\n552:\taClient\t*acpt;\t\t/* listening client which we accepted from */\n556:\tchar\t*auth;\n557:\tu_short\tport;\t\t/* and the remote port# too :-) */\n558:\tstruct\tIN_ADDR\tip;\t/* keep real ip# too */\n560:\tchar\tsockhost[HOSTLEN+1]; /* This is the host name from the socket\n565:\tchar\texitc;\n606:\tu_int\tis_asuc; /* successful auth requests */\n607:\tu_int\tis_abad; /* bad auth requests */\n608:\tu_int\tis_udpok;\t/* packets recv'd on udp port */\n609:\tu_int\tis_udperr;\t/* packets recvfrom errors on udp port */\n610:\tu_int\tis_udpdrop;\t/* packets recv'd but dropped on udp port */","is_error":false}]},"uuid":"90aef73a-bb3e-438d-88bf-7173a35211bc","timestamp":"2026-06-07T23:42:59.015Z","toolUseResult":{"stdout":"198:#define FLAGS_TLS       0x0200 /* user is on a secure connection port (SSL/TLS) -- mh 2020-04-27 */\n296:\tu_short\tport;\t\t/* port to send pings to */\n308:\tstruct\tIN_ADDR ipnum;\t/* ip number of host field */\n316:\tint\tport;\n471:\tchar\tsip[1];\t\t/* ip as a string, big enough for ipv6\n528:\tchar\tusername[USERLEN+1]; /* username here now for auth stuff */\n545:\tlong\tsendM;\t\t/* Statistics: protocol messages send */\n546:\tlong\treceiveM;\t/* Statistics: protocol messages received */\n547:\tunsigned long long\tsendB;\t\t/* Statistics: total bytes send */\n548:\tunsigned long long\treceiveB;\t/* Statistics: total bytes received */\n550:\ttime_t\tfirsttime;\t/* time client was created */\n552:\taClient\t*acpt;\t\t/* listening client which we accepted from */\n556:\tchar\t*auth;\n557:\tu_short\tport;\t\t/* and the remote port# too :-) */\n558:\tstruct\tIN_ADDR\tip;\t/* keep real ip# too */\n560:\tchar\tsockhost[HOSTLEN+1]; /* This is the host name from the socket\n565:\tchar\texitc;\n606:\tu_int\tis_asuc; /* successful auth requests */\n607:\tu_int\tis_abad; /* bad auth requests */\n608:\tu_int\tis_udpok;\t/* packets recv'd on udp port */\n609:\tu_int\tis_udperr;\t/* packets recvfrom errors on udp port */\n610:\tu_int\tis_udpdrop;\t/* packets recv'd but dropped on udp port */","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false},"sourceToolAssistantUUID":"553d79cc-061c-4030-b999-4f8093ae8837","userType":"external","entrypoint":"cli","cwd":"/home/xe/Code/xeiaso.net/ircd.rs","sessionId":"79b95458-bd77-4de4-885f-4a89b4e4df0a","version":"2.1.167","gitBranch":"master"}
.claude/sessions/83d912ac-5e1e-4525-89a0-e5166a07c355/subagents/workflows/wf_14f560c3-63f/agent-aa0d8de3a92400836.jsonl:19:{"parentUuid":"410fae9d-871c-416d-b3d2-d7b22797f2cf","isSidechain":true,"promptId":"0f4a6818-24c2-4d73-8cd5-b20cc55b2869","agentId":"aa0d8de3a92400836","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01SfwVGmAwR5jt35yDu5XMCu","type":"tool_result","content":"/home/xe/code/xeiaso.net/ircd.rs/common/numeric_def.h:#define RPL_WHOISTLS         RPL_WHOISEXTRA /* client is connected with SSL/TLS -- mh 2020-04-27 */\n/home/xe/code/xeiaso.net/ircd.rs/common/numeric_def.h:#define\tRPL_STATSSLINE       245\n/home/xe/code/xeiaso.net/ircd.rs/ircd/s_err.c:/* 245 RPL_STATSSLINE */\t\":%s 245 %s %c %s %s %s 0x%X %d\", \n/home/xe/code/xeiaso.net/ircd.rs/common/struct_def.h:#define FLAGS_TLS       0x0200 /* user is on a secure connection port (SSL/TLS) -- mh 2020-04-27 */\n/home/xe/code/xeiaso.net/ircd.rs/common/struct_def.h:#define IsTLS(x)        ((x)->user && (x)->user->flags & FLAGS_TLS)\n/home/xe/code/xeiaso.net/ircd.rs/common/struct_def.h:#define SetTLS(x)       ((x)->user->flags |= FLAGS_TLS)\n/home/xe/code/xeiaso.net/ircd.rs/common/struct_def.h:#define PFLAG_TLS           0x00004\n/home/xe/code/xeiaso.net/ircd.rs/common/struct_def.h:#define IsConfTLS(x)        ((x)->flags & PFLAG_TLS)\n/home/xe/code/xeiaso.net/ircd.rs/ircd/s_auth.c:\t// Check if a source IP has been set in P-Line (usually if an SSL proxy is used)\n/home/xe/code/xeiaso.net/ircd.rs/ircd/s_auth.c:\tif (cptr->acpt->confs && IsConfTLS(cptr->acpt->confs->value.aconf)\n/home/xe/code/xeiaso.net/ircd.rs/ircd/s_serv.c:\t\t{ CONF_SERVICE,\t\t  RPL_STATSSLINE, 'S'},\n/home/xe/code/xeiaso.net/ircd.rs/ircd/s_conf.c: * T - secure (SSL/TLS) port\n/home/xe/code/xeiaso.net/ircd.rs/ircd/s_conf.c:\t\ttmp |= PFLAG_TLS;\n/home/xe/code/xeiaso.net/ircd.rs/ircd/s_conf.c:\tif (flags & PFLAG_TLS)\n/home/xe/code/xeiaso.net/ircd.rs/ircd/s_user.c:#ifdef WHOISTLS_NOTICE\n/home/xe/code/xeiaso.net/ircd.rs/ircd/s_user.c:\t\t/* send a notice to client if the connection is secure (SSL/TLS).\n/home/xe/code/xeiaso.net/ircd.rs/ircd/s_user.c:\t\t * notice is defined as WHOISTLS_NOTICE in config.h -- mh 2020-04-27 */\n/home/xe/code/xeiaso.net/ircd.rs/ircd/s_user.c:\t\tif (IsTLS(sptr))\n/home/xe/code/xeiaso.net/ircd.rs/ircd/s_user.c:\t\t\tsendto_one(sptr, \":%s NOTICE %s :%s\", ME, nick, WHOISTLS_NOTICE);\n/home/xe/code/xeiaso.net/ircd.rs/ircd/s_user.c:\t/* send a 320 numeric RPL_WHOISTLS reply if client is connected with SSL/TLS.","is_error":false}]},"uuid":"5cf02d2f-bb43-4cd1-8463-9d6d47a4324a","timestamp":"2026-06-01T23:57:03.289Z","sourceToolAssistantUUID":"410fae9d-871c-416d-b3d2-d7b22797f2cf","userType":"external","entrypoint":"cli","cwd":"/home/xe/code/xeiaso.net/ircd.rs","sessionId":"83d912ac-5e1e-4525-89a0-e5166a07c355","version":"2.1.160","gitBranch":"master","slug":"i-would-like-to-humming-curry"}
.claude/sessions/7dc19f4d-fcdf-4220-950a-fee45d6ee74a.jsonl:49:{"parentUuid":"54d83eaf-8f81-4e3f-8988-cb168c67fa87","isSidechain":false,"message":{"model":"claude-opus-4-8","id":"msg_01H45TsVbFnDfqE8N2PJQeHY","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01BBboezVkSKeQpbybvQuhHH","name":"Bash","input":{"command":"cd /home/xe/Code/xeiaso.net/ircd.rs\necho \"=== USE_SYSLOG / DEBUGMODE in setup/config ===\"\ngrep -rEn 'USE_SYSLOG|DEBUGMODE' cbuild/setup.h cbuild/config.h 2>/dev/null | head\ngrep -rn \"define USE_SYSLOG\\|undef USE_SYSLOG\" ircd/ include/ 2>/dev/null | head\necho \"=== strncpyzt def ===\"\ngrep -rn \"strncpyzt\" include/*.h | head\necho \"=== who calls send_authports/read_authports ===\"\ngrep -rn \"send_authports\\|read_authports\" ircd/*.c | grep -v \"s_auth.c\"\necho \"=== ClearAuth macro ===\"\ngrep -rn \"define ClearAuth\\|define FLAGS_WRAUTH\\|define FLAGS_AUTH\" include/*.h","description":"Scope config gates and dependencies"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":2521,"cache_read_input_tokens":59092,"output_tokens":2418,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":2521,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":2418,"cache_read_input_tokens":59092,"cache_creation_input_tokens":2521,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":2521},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CbnNkzTLtqJYjP1Rin8Kn","type":"assistant","uuid":"61848fcd-b7e4-425c-9b08-d404e6d46a63","timestamp":"2026-06-06T17:10:11.672Z","userType":"external","entrypoint":"cli","cwd":"/home/xe/Code/xeiaso.net/ircd.rs","sessionId":"7dc19f4d-fcdf-4220-950a-fee45d6ee74a","version":"2.1.167","gitBranch":"master"}
.claude/sessions/7dc19f4d-fcdf-4220-950a-fee45d6ee74a.jsonl:52:{"parentUuid":"3e54c248-4923-4a5f-8276-b74cfa62f3df","isSidechain":false,"message":{"model":"claude-opus-4-8","id":"msg_015ppYzdcx7WtVxhbc4pAsFJ","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_017QU9z55fvMRbnMrdBhBXbZ","name":"Bash","input":{"command":"cd /home/xe/Code/xeiaso.net/ircd.rs\necho \"=== include dir ===\"\nls include common 2>/dev/null | head\necho \"=== strncpyzt ===\"\ngrep -rn \"strncpyzt\" common/*.h ircd/*.h 2>/dev/null | head\necho \"=== ClearAuth / FLAGS_WRAUTH / FLAGS_AUTH / FLAGS_GOTID ===\"\ngrep -rn \"define ClearAuth\\b\\|define FLAGS_WRAUTH\\|define FLAGS_AUTH\\b\\|define FLAGS_GOTID\" common/*.h ircd/*.h 2>/dev/null\necho \"=== istat type / is_authmem ===\"\ngrep -rn \"is_authmem\\|struct.*istat\\|} istat\\|istat;\" common/*.h ircd/*.h 2>/dev/null | head","description":"Find include layout and macros"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":2841,"cache_read_input_tokens":61613,"output_tokens":478,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":2841,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":478,"cache_read_input_tokens":61613,"cache_creation_input_tokens":2841,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":2841},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CbnNoVDH1XDF332MxdxEF","type":"assistant","uuid":"f68c5aa4-789f-4588-9be4-289a9b685ae9","timestamp":"2026-06-06T17:10:19.084Z","userType":"external","entrypoint":"cli","cwd":"/home/xe/Code/xeiaso.net/ircd.rs","sessionId":"7dc19f4d-fcdf-4220-950a-fee45d6ee74a","version":"2.1.167","gitBranch":"master"}
.claude/sessions/83d912ac-5e1e-4525-89a0-e5166a07c355/subagents/workflows/wf_14f560c3-63f/agent-ac1749a0b7faef118.jsonl:8:{"parentUuid":"4242de6b-4035-45a0-b7da-96b752b03134","isSidechain":true,"promptId":"0f4a6818-24c2-4d73-8cd5-b20cc55b2869","agentId":"ac1749a0b7faef118","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_011Vh2BZQZuVsbr2c7Psi5zy","type":"tool_result","content":"1\t/************************************************************************\n2\t *   IRC - Internet Relay Chat, common/struct_def.h\n3\t *   Copyright (C) 1990 Jarkko Oikarinen and\n4\t *                      University of Oulu, Computing Center\n5\t *\n6\t *   This program is free software; you can redistribute it and/or modify\n7\t *   it under the terms of the GNU General Public License as published by\n8\t *   the Free Software Foundation; either version 1, or (at your option)\n9\t *   any later version.\n10\t *\n11\t *   This program is distributed in the hope that it will be useful,\n12\t *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n13\t *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n14\t *   GNU General Public License for more details.\n15\t *\n16\t *   You should have received a copy of the GNU General Public License\n17\t *   along with this program; if not, write to the Free Software\n18\t *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n19\t *\n20\t *   $Id: struct_def.h,v 1.152 2011/01/20 14:26:56 bif Exp $\n21\t */\n22\t\n23\ttypedef\tstruct\tConfItem aConfItem;\n24\ttypedef\tstruct\tListItem aListItem;\n25\ttypedef\tstruct \tClient\taClient;\n26\ttypedef\tstruct\tChannel\taChannel;\n27\ttypedef\tstruct\tUser\tanUser;\n28\ttypedef\tstruct\tServer\taServer;\n29\ttypedef\tstruct\tService\taService;\n30\ttypedef\tstruct\tSLink\tLink;\n31\ttypedef\tstruct\tinvSLink\tinvLink;\n32\ttypedef\tstruct\tSMode\tMode;\n33\ttypedef\tstruct\tfdarray\tFdAry;\n34\ttypedef\tstruct\tCPing\taCPing;\n35\ttypedef\tstruct\tZdata\taZdata;\n36\ttypedef struct        LineItem aMotd;\n37\t#if defined(USE_IAUTH)\n38\ttypedef struct        LineItem aExtCf;\n39\ttypedef struct        LineItem aExtData;\n40\t#endif\n41\t\n42\t#define\tHOSTLEN\t\t63\t/* Length of hostname.  Updated to         */\n43\t\t\t\t\t/* comply with RFC1123                     */\n44\t\n45\t#if (INET6_ADDRSTRLEN > HOSTLEN)\n46\t#error HOSTLEN must not be smaller than INET6_ADDRSTRLEN\n47\t#endif\n48\t\n49\t#define\tNICKLEN\t\t15\t/* Must be the same network-wide. */\n50\t#define UIDLEN\t\t9\t/* must not be bigger than NICKLEN --Beeth */\n51\t#define\tUSERLEN\t\t10\n52\t#define\tREALLEN\t \t50\n53\t#define\tTOPICLEN\t255\n54\t#define\tCHANNELLEN\t50\n55\t#define\tPASSWDLEN \t20\n56\t#define\tKEYLEN\t\t23\n57\t#define\tBUFSIZE\t\t512\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n58\t#define\tMAXRECIPIENTS \t20\n59\t#define\tMAXBANS\t\t64\n60\t#define\tMAXBANLENGTH\t2048\n61\t#define\tBANLEN\t\t(USERLEN + NICKLEN + HOSTLEN + 3)\n62\t#define MAXPENALTY\t10\n63\t#define\tCHIDLEN\t\t5\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n64\t#define\tSIDLEN\t\t4\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n65\t#define\tMAXMODEPARAMS\t3\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n66\t#define\tDELAYCHASETIMELIMIT\t1800\t/* WARNING: *DONT* CHANGE THIS!!!! */\n67\t#define\tLDELAYCHASETIMELIMIT\t5400\t/* WARNING: *DONT* CHANGE THIS!!!! */\n68\t\n69\t#define\tREADBUF_SIZE\t16384\t/* used in s_bsd.c *AND* s_zip.c ! */\n70\t \n71\t/*\n72\t * Make up some numbers which should reflect average leaf server connect\n73\t * queue max size.\n74\t * queue=(<# of channels> * <channel size> + <user size> * <# of users>) * 2\n75\t * pool=<queue per client> * <avg. # of clients having data in queue>\n76\t */\n77\t#define\tQUEUELEN\t(((MAXCONNECTIONS / 10) * (CHANNELLEN + BANLEN + 16) +\\\n78\t\t\t\t  (HOSTLEN * 4 + REALLEN + NICKLEN + USERLEN + 24) *\\\n79\t\t\t\t  (MAXCONNECTIONS / 2)) * 2)\n80\t\n81\t#define\tBUFFERPOOL\t(DBUFSIZ * MAXCONNECTIONS * 2) + \\\n82\t\t\t\t(QUEUELEN * MAXSERVERS)\n83\t\n84\t#define\tUSERHOST_REPLYLEN\t(NICKLEN+HOSTLEN+USERLEN+5)\n85\t\n86\t/*\n87\t** 'offsetof' is defined in ANSI-C. The following definition\n88\t** is not absolutely portable (I have been told), but so far\n89\t** it has worked on all machines I have needed it. The type\n90\t** should be size_t but...  --msa\n91\t*/\n92\t#ifndef offsetof\n93\t#define\toffsetof(t,m) (int)((&((t *)0L)->m))\n94\t#endif\n95\t\n96\t#define\telementsof(x) (sizeof(x)/sizeof(x[0]))\n97\t\n98\t/*\n99\t** flags for bootup options (command line flags)\n100\t*/\n101\t#define\tBOOT_CONSOLE\t0x001\n102\t#define\tBOOT_QUICK\t0x002\n103\t#define\tBOOT_DEBUG\t0x004\n104\t#define\tBOOT_INETD\t0x008\n105\t#define\tBOOT_TTY\t0x010\n106\t\n107\t#define\tBOOT_AUTODIE\t0x040\n108\t#define\tBOOT_BADTUNE\t0x080\n109\t#define\tBOOT_PROT\t0x100\n110\t#define\tBOOT_STRICTPROT\t0x200\n111\t#define\tBOOT_NOIAUTH\t0x400\n112\t#define\tBOOT_STANDALONE\t0x800\n113\t\n114\ttypedef enum Status {\n115\t\tSTAT_CONNECTING = -4,\n116\t\tSTAT_HANDSHAKE, /* -3 */\n117\t\tSTAT_UNKNOWN,\t/* -2 */\n118\t\tSTAT_ME,\t/* -1 */\n119\t\tSTAT_SERVER,\t/* 0 */\n120\t\tSTAT_CLIENT,\t/* 1 */\n121\t\tSTAT_OPER,\t/* 2 */\n122\t\tSTAT_SERVICE,\t/* 3 */\n123\t\tSTAT_UNREG,\t/* 4 */\n124\t\tSTAT_MAX\t/* 5 -- size of handler[] table we need */\n125\t} Status;\n126\t\n127\t/*\n128\t * status macros.\n129\t */\n130\t#define\tIsRegisteredUser(x)\t(((x)->status == STAT_CLIENT || \\\n131\t\t\t\t\t (x)->status == STAT_OPER) && (x)->user)\n132\t#define\tIsRegistered(x)\t\t((x)->status >= STAT_SERVER || \\\n133\t\t\t\t\t (x)->status == STAT_ME)\n134\t#define\tIsConnecting(x)\t\t((x)->status == STAT_CONNECTING)\n135\t#define\tIsHandshake(x)\t\t((x)->status == STAT_HANDSHAKE)\n136\t#define\tIsMe(x)\t\t\t((x)->status == STAT_ME)\n137\t#define\tIsUnknown(x)\t\t((x)->status == STAT_UNKNOWN)\n138\t#define\tIsServer(x)\t\t((x)->status == STAT_SERVER)\n139\t#define\tIsClient(x)\t\t((x)->status == STAT_CLIENT || \\\n140\t\t\t\t\t (x)->status == STAT_OPER)\n141\t#define\tIsService(x)\t\t((x)->status == STAT_SERVICE && (x)->service)\n142\t\n143\t#define\tSetConnecting(x)\t((x)->status = STAT_CONNECTING)\n144\t#define\tSetHandshake(x)\t\t((x)->status = STAT_HANDSHAKE)\n145\t#define\tSetMe(x)\t\t((x)->status = STAT_ME)\n146\t#define\tSetUnknown(x)\t\t((x)->status = STAT_UNKNOWN)\n147\t#define\tSetServer(x)\t\t((x)->status = STAT_SERVER)\n148\t#define\tSetClient(x)\t\t((x)->status = IsAnOper((x)) ? STAT_OPER : STAT_CLIENT)\n149\t#define\tSetService(x)\t\t((x)->status = STAT_SERVICE)\n150\t\n151\t#define\tFLAGS_PINGSENT\t0x0000001 /* Unreplied ping sent */\n152\t#define\tFLAGS_DEADSOCK\t0x0000002 /* Local socket is dead--Exiting soon */\n153\t#define\tFLAGS_KILLED\t0x0000004 /* Prevents \"QUIT\" from being sent for this */\n154\t#define\tFLAGS_BLOCKED\t0x0000008 /* socket is in blocked condition [unused] */\n155\t#ifdef UNIXPORT\n156\t#define\tFLAGS_UNIX\t0x0000010 /* socket is in the unix domain, not inet */\n157\t#endif\n158\t#define\tFLAGS_CLOSING\t0x0000020 /* set when closing to suppress errors */\n159\t#define\tFLAGS_LISTEN\t0x0000040 /* used to mark clients which we listen() on */\n160\t#define\tFLAGS_XAUTHDONE\t0x0000080 /* iauth is finished with this client */\n161\t#define\tFLAGS_DOINGDNS\t0x0000100 /* client is waiting for a DNS response */\n162\t#define\tFLAGS_AUTH\t0x0000200 /* client is waiting on rfc931 response */\n163\t#define\tFLAGS_WRAUTH\t0x0000400 /* set if we havent writen to ident server */\n164\t#define\tFLAGS_LOCAL\t0x0000800 /* set for local clients */\n165\t#define\tFLAGS_GOTID\t0x0001000 /* successful ident lookup achieved */\n166\t#define\tFLAGS_XAUTH\t0x0002000 /* waiting on external authentication */\n167\t#define\tFLAGS_WXAUTH\t0x0004000 /* same as above, but also prevent parsing */\n168\t#define\tFLAGS_NONL\t0x0008000 /* No \\n in buffer */\n169\t#define\tFLAGS_CBURST\t0x0010000 /* set to mark connection burst being sent */\n170\t#define\tFLAGS_QUIT\t0x0040000 /* QUIT :comment shows it's not a split */\n171\t#define\tFLAGS_SPLIT\t0x0080000 /* client QUITting because of a netsplit */\n172\t#define\tFLAGS_HIDDEN\t0x0100000 /* netsplit is behind a hostmask,\n173\t\t\t\t\t     also used for marking clients in who_find\n174\t\t\t\t\t   */\n175\t#define\tFLAGS_UNKCMD\t0x0200000 /* has sent an unknown command */\n176\t#define\tFLAGS_ZIP\t0x0400000 /* link is zipped */\n177\t#define\tFLAGS_ZIPRQ\t0x0800000 /* zip requested */\n178\t#define\tFLAGS_ZIPSTART\t0x1000000 /* start of zip (ignore any CRLF) */\n179\t#define\tFLAGS_SQUIT\t0x2000000 /* This is set when we send the last\n180\t\t\t\t\t  ** server, so we know we have to send\n181\t\t\t\t\t  ** a SQUIT. */\n182\t#define\tFLAGS_EOB\t0x4000000 /* EOB received */\n183\t#define FLAGS_LISTENINACTIVE 0x8000000 /* Listener does not listen() */\n184\t#ifdef JAPANESE\n185\t#define\tFLAGS_JP\t0x10000000 /* jp version, used both for chans and servs */\n186\t#endif\n187\t\t\n188\t#define\tFLAGS_OPER\t0x0001 /* operator */\n189\t#define\tFLAGS_LOCOP\t0x0002 /* local operator -- SRB */\n190\t#define\tFLAGS_WALLOP\t0x0004 /* send wallops to them */\n191\t#define\tFLAGS_INVISIBLE\t0x0008 /* makes user invisible */\n192\t#define FLAGS_RESTRICT\t0x0010 /* restricted user */\n193\t#define FLAGS_AWAY\t0x0020 /* user is away */\n194\t#define FLAGS_EXEMPT    0x0040 /* user is exempted from k-lines */\n195\t#ifdef XLINE\n196\t#define FLAGS_XLINED\t0x0100\t/* X-lined client */\n197\t#endif\n198\t#define FLAGS_TLS       0x0200 /* user is on a secure connection port (SSL/TLS) -- mh 2020-04-27 */\n199\t#define\tSEND_UMODES\t(FLAGS_INVISIBLE|FLAGS_OPER|FLAGS_WALLOP|FLAGS_AWAY|FLAGS_RESTRICT)\n200\t#define\tALL_UMODES\t(SEND_UMODES|FLAGS_LOCOP)\n201\t\n202\t/*\n203\t * user flags macros.\n204\t */\n205\t#define\tIsOper(x)\t\t((x)->user && (x)->user->flags & FLAGS_OPER)\n206\t#define\tIsLocOp(x)\t\t((x)->user && (x)->user->flags & FLAGS_LOCOP)\n207\t#define\tIsInvisible(x)\t\t((x)->user->flags & FLAGS_INVISIBLE)\n208\t#define IsRestricted(x)         ((x)->user && \\\n209\t\t\t\t\t (x)->user->flags & FLAGS_RESTRICT)\n210\t#define\tIsAnOper(x)\t\t((x)->user && \\\n211\t\t\t\t\t (x)->user->flags & (FLAGS_OPER|FLAGS_LOCOP))\n212\t#define\tIsPerson(x)\t\t((x)->user && IsClient(x))\n213\t#define\tIsPrivileged(x)\t\t(IsServer(x) || IsAnOper(x))\n214\t#define\tSendWallops(x)\t\t((x)->user->flags & FLAGS_WALLOP)\n215\t#ifdef UNIXPORT\n216\t#define\tIsUnixSocket(x)\t\t((x)->flags & FLAGS_UNIX)\n217\t#endif\n218\t#define\tIsListener(x)\t\t((x)->flags & FLAGS_LISTEN)\n219\t#define IsListenerInactive(x)\t((x)->flags & FLAGS_LISTENINACTIVE)\n220\t#define\tIsLocal(x)\t\t(MyConnect(x) && (x)->flags & FLAGS_LOCAL)\n221\t#define\tIsDead(x)\t\t((x)->flags & FLAGS_DEADSOCK)\n222\t#define\tIsBursting(x)\t\t(!((x)->flags & FLAGS_EOB))\n223\t#define IsKlineExempt(x)        ((x)->user && (x)->user->flags & FLAGS_EXEMPT)\n224\t\n225\t#define\tSetDead(x)\t\t((x)->flags |= FLAGS_DEADSOCK)\n226\t#define\tCBurst(x)\t\t((x)->flags & FLAGS_CBURST)\n227\t#define\tSetOper(x)\t\t((x)->user->flags |= FLAGS_OPER, \\\n228\t\t\t\t\t (x)->status = STAT_OPER)\n229\t#define\tSetLocOp(x)\t\t((x)->user->flags |= FLAGS_LOCOP, \\\n230\t\t\t\t\t (x)->status = STAT_OPER)\n231\t#define\tSetInvisible(x)\t\t((x)->user->flags |= FLAGS_INVISIBLE)\n232\t#define SetRestricted(x)\t((x)->user->flags |= FLAGS_RESTRICT)\n233\t#define\tSetWallops(x)\t\t((x)->user->flags |= FLAGS_WALLOP)\n234\t#ifdef UNIXPORT\n235\t#define\tSetUnixSock(x)\t\t((x)->flags |= FLAGS_UNIX)\n236\t#endif\n237\t#define\tSetDNS(x)\t\t((x)->flags |= FLAGS_DOINGDNS)\n238\t#define\tSetDoneXAuth(x)\t\t((x)->flags |= FLAGS_XAUTHDONE)\n239\t#define\tSetEOB(x)\t\t((x)->flags |= FLAGS_EOB)\n240\t#define SetListenerInactive(x)\t((x)->flags |= FLAGS_LISTENINACTIVE)\n241\t#define SetKlineExempt(x)\t((x)->user->flags |= FLAGS_EXEMPT)\n242\t\n243\t#define\tDoingDNS(x)\t\t((x)->flags & FLAGS_DOINGDNS)\n244\t#define\tDoingAuth(x)\t\t((x)->flags & FLAGS_AUTH)\n245\t#define\tDoingXAuth(x)\t\t((x)->flags & FLAGS_XAUTH)\n246\t#define\tWaitingXAuth(x)\t\t((x)->flags & FLAGS_WXAUTH)\n247\t#define\tDoneXAuth(x)\t\t((x)->flags & FLAGS_XAUTHDONE)\n248\t#define\tNoNewLine(x)\t\t((x)->flags & FLAGS_NONL)\n249\t\n250\t#define\tClearOper(x)\t\t((x)->user->flags &= ~FLAGS_OPER, \\\n251\t\t\t\t\t (x)->status = STAT_CLIENT)\n252\t#define\tClearLocOp(x)\t\t((x)->user->flags &= ~FLAGS_LOCOP, \\\n253\t\t\t\t\t (x)->status = STAT_CLIENT)\n254\t#define\tClearInvisible(x)\t((x)->user->flags &= ~FLAGS_INVISIBLE)\n255\t#define ClearRestricted(x)      ((x)->user->flags &= ~FLAGS_RESTRICT)\n256\t#define\tClearWallops(x)\t\t((x)->user->flags &= ~FLAGS_WALLOP)\n257\t#define\tClearDNS(x)\t\t((x)->flags &= ~FLAGS_DOINGDNS)\n258\t#define\tClearAuth(x)\t\t((x)->flags &= ~FLAGS_AUTH)\n259\t#define\tClearXAuth(x)\t\t((x)->flags &= ~FLAGS_XAUTH)\n260\t#define\tClearWXAuth(x)\t\t((x)->flags &= ~FLAGS_WXAUTH)\n261\t#define ClearListenerInactive(x) ((x)->flags &= ~FLAGS_LISTENINACTIVE)\n262\t#ifdef XLINE\n263\t#define IsXlined(x)\t\t((x)->user && (x)->user->flags & FLAGS_XLINED)\n264\t#define SetXlined(x)\t\t((x)->user->flags |= FLAGS_XLINED)\n265\t#define ClearXlined(x)\t\t((x)->user->flags &= ~FLAGS_XLINED)\n266\t#endif\n267\t#define IsTLS(x)        ((x)->user && (x)->user->flags & FLAGS_TLS)\n268\t#define SetTLS(x)       ((x)->user->flags |= FLAGS_TLS)\n269\t\n270\t/*\n271\t * defined debugging levels\n272\t */\n273\t#define\tDEBUG_FATAL  0\n274\t#define\tDEBUG_ERROR  1\t/* report_error() and other errors that are found */\n275\t#define\tDEBUG_READ   2\n276\t#define\tDEBUG_WRITE  2\n277\t#define\tDEBUG_NOTICE 3\n278\t#define\tDEBUG_DNS    4\t/* used by all DNS related routines - a *lot* */\n279\t#define\tDEBUG_INFO   5\t/* general usful info */\n280\t#define\tDEBUG_NUM    6\t/* numerics */\n281\t#define\tDEBUG_SEND   7\t/* everything that is sent out */\n282\t#define\tDEBUG_DEBUG  8\t/* anything to do with debugging, ie unimportant :) */\n283\t#define\tDEBUG_MALLOC 9\t/* malloc/free calls */\n284\t#define\tDEBUG_LIST  10\t/* debug list use */\n285\t#define\tDEBUG_L10   10\n286\t#define\tDEBUG_L11   11\n287\t\n288\t/*\n289\t * defines for curses in client\n290\t */\n291\t#define\tDUMMY_TERM\t0\n292\t#define\tCURSES_TERM\t1\n293\t#define\tTERMCAP_TERM\t2\n294\t\n295\tstruct\tCPing\t{\n296\t\tu_short\tport;\t\t/* port to send pings to */\n297\t\tu_long\trtt;\t\t/* average RTT */\n298\t\tu_long\tping;\n299\t\tu_long\tseq;\t\t/* # sent still in the \"window\" */\n300\t\tu_long\tlseq;\t\t/* sequence # of last sent */\n301\t\tu_long\trecvd;\t\t/* # received still in the \"window\" */\n302\t\tu_long\tlrecvd;\t\t/* # received */\n303\t};\n304\t\n305\tstruct\tConfItem\t{\n306\t\tu_int\tstatus;\t\t/* If CONF_ILLEGAL, delete when no clients */\n307\t\tint\tclients;\t/* Number of *LOCAL* clients using this */\n308\t\tstruct\tIN_ADDR ipnum;\t/* ip number of host field */\n309\t\tchar\t*host;\n310\t\tchar\t*passwd;\n311\t\tchar\t*name;\n312\t\tchar\t*name2;\n313\t#ifdef XLINE\n314\t\tchar\t*name3;\n315\t#endif\n316\t\tint\tport;\n317\t\tlong\tflags;\t\t/* I-line flags */\n318\t\tint\tpref;\t\t/* preference value */\n319\t\tstruct\tCPing\t*ping;\n320\t\ttime_t\thold;\t/* Hold action until this time (calendar time) */\n321\t\tchar\t*source_ip;\n322\t#ifndef VMSP\n323\t\taClass\t*class;  /* Class of connection */\n324\t#endif\n325\t\tstruct\tConfItem *next;\n326\t};\n327\t\n328\tstruct\tListItem\t{\n329\t\tchar\t*nick;\n330\t\tchar\t*user;\n331\t\tchar\t*host;\n332\t};\n333\t\n334\t/* these define configuration lines (A:, M:, I:, K:, etc.) */\n335\t#define\tCONF_ILLEGAL\t\t0x80000000\n336\t#define\tCONF_MATCH\t\t0x40000000\n337\t#define\tCONF_QUARANTINED_SERVER\t0x000001\n338\t#define\tCONF_CLIENT\t\t0x000002\n339\t\n340\t#define\tCONF_CONNECT_SERVER\t0x000008\n341\t#define\tCONF_NOCONNECT_SERVER\t0x000010\n342\t#define\tCONF_ZCONNECT_SERVER\t0x000020\n343\t\n344\t#define\tCONF_OPERATOR\t\t0x000080\n345\t#define\tCONF_ME\t\t\t0x000100\n346\t#define\tCONF_KILL\t\t0x000200\n347\t#define\tCONF_ADMIN\t\t0x000400\n348\t#define\tCONF_CLASS\t\t0x001000\n349\t#define\tCONF_SERVICE\t\t0x002000\n350\t#define\tCONF_LEAF\t\t0x004000\n351\t#define\tCONF_LISTEN_PORT\t0x008000\n352\t#define\tCONF_HUB\t\t0x010000\n353\t#define\tCONF_VER\t\t0x020000\n354\t#define\tCONF_BOUNCE\t\t0x040000\n355\t#define\tCONF_OTHERKILL\t\t0x080000\n356\t#define\tCONF_DENY\t\t0x100000\n357\t#ifdef TKLINE\n358\t#define\tCONF_TKILL\t\t0x200000\n359\t#define\tCONF_TOTHERKILL\t\t0x400000\n360\t#endif\n361\t#ifdef XLINE\n362\t#define CONF_XLINE\t\t0x800000\n363\t#endif\n364\t#define\tCONF_OPS\t\tCONF_OPERATOR\n365\t#define\tCONF_SERVER_MASK\t(CONF_CONNECT_SERVER | CONF_NOCONNECT_SERVER |\\\n366\t\t\t\t\t CONF_ZCONNECT_SERVER)\n367\t#define\tCONF_CLIENT_MASK\t(CONF_CLIENT | CONF_SERVICE | CONF_OPS | \\\n368\t\t\t\t\t CONF_SERVER_MASK)\n369\t\n370\t#define CFLAG_RESTRICTED\t0x00001\n371\t#define CFLAG_RNODNS\t\t0x00002\n372\t#define CFLAG_RNOIDENT\t\t0x00004\n373\t#define CFLAG_KEXEMPT\t\t0x00008\n374\t#define CFLAG_NORESOLVE\t\t0x00010\n375\t#define CFLAG_FALL\t\t0x00020\n376\t#define CFLAG_NORESOLVEMATCH\t0x00040\n377\t#ifdef XLINE\n378\t#define CFLAG_XEXEMPT\t\t0x00080\n379\t#endif\n380\t\n381\t#define IsConfRestricted(x)\t((x)->flags & CFLAG_RESTRICTED)\n382\t#define IsConfRNoDNS(x)\t\t((x)->flags & CFLAG_RNODNS)\n383\t#define IsConfRNoIdent(x)\t((x)->flags & CFLAG_RNOIDENT)\n384\t#define IsConfKlineExempt(x)\t((x)->flags & CFLAG_KEXEMPT)\n385\t#define IsConfNoResolve(x)\t((x)->flags & CFLAG_NORESOLVE)\n386\t#define IsConfNoResolveMatch(x)\t((x)->flags & CFLAG_NORESOLVEMATCH)\n387\t#define IsConfFallThrough(x)\t((x)->flags & CFLAG_FALL)\n388\t#ifdef XLINE\n389\t#define IsConfXlineExempt(x)\t((x)->flags & CFLAG_XEXEMPT)\n390\t#endif\n391\t\n392\t#define PFLAG_DELAYED\t\t0x00001\n393\t#define PFLAG_SERVERONLY\t0x00002\n394\t#define PFLAG_TLS           0x00004\n395\t\n396\t#define IsConfDelayed(x)\t((x)->flags & PFLAG_DELAYED)\n397\t#define IsConfServeronly(x)\t((x)->flags & PFLAG_SERVERONLY)\n398\t#define IsConfTLS(x)        ((x)->flags & PFLAG_TLS)\n399\t\n400\t#define\tIsIllegal(x)\t((x)->status & CONF_ILLEGAL)\n401\t\n402\ttypedef\tstruct\t{\n403\t\tu_long\tpi_id;\n404\t\tu_long\tpi_seq;\n405\t\tstruct\ttimeval\tpi_tv;\n406\t\taConfItem *pi_cp;\n407\t} Ping;\n408\t\n409\t\n410\t#define\tPING_REPLY\t0x01\n411\t#define\tPING_CPING\t0x02\n412\t\n413\t#ifdef\tZIP_LINKS\n414\t/* the minimum amount of data needed to trigger compression */\n415\t# define\tZIP_MINIMUM\t4096\n416\t\n417\t/* the maximum amount of data to be compressed (can actually be a bit more) */\n418\t# define\tZIP_MAXIMUM\t8192\t/* WARNING: *DON'T* CHANGE THIS!!!! */\n419\t\n420\tstruct Zdata {\n421\t\tz_stream\t*in;\t\t/* input zip stream data */\n422\t\tz_stream\t*out;\t\t/* output zip stream data */\n423\t\tBytef\t\toutbuf[ZIP_MAXIMUM]; /* outgoing (unzipped) buffer */\n424\t\tint\t\toutcount;\t/* size of outbuf content */\n425\t};\n426\t#endif\n427\t\n428\tstruct LineItem\n429\t{ \n430\t    char    *line;\n431\t    struct  LineItem *next;\n432\t};\n433\t\n434\t/*\n435\t * Client structures\n436\t */\n437\tstruct\tUser\t{\n438\t\tLink\t*channel;\t/* chain of channel pointer blocks */\n439\t\tinvLink\t*invited;\t/* chain of invite pointer blocks */\n440\t\tLink\t*uwas;\t\t/* chain of whowas pointer blocks */\n441\t\tchar\t*away;\t\t/* pointer to away message */\n442\t\ttime_t\tlast;\t\t/* \"idle\" time */\n443\t\tint\trefcnt;\t\t/* Number of times this block is referenced\n444\t\t\t\t\t** from aClient (field user), aServer (field\n445\t\t\t\t\t** by) and whowas array (field ww_user).\n446\t\t\t\t\t*/\n447\t\tint\tjoined;\t\t/* number of channels joined */\n448\t\tint\tflags;\t\t/* user modes */\n449\t        struct\tServer\t*servp;\n450\t\t\t\t\t/*\n451\t\t\t\t\t** In a perfect world the 'server' name\n452\t\t\t\t\t** should not be needed, a pointer to the\n453\t\t\t\t\t** client describing the server is enough.\n454\t\t\t\t\t** Unfortunately, in reality, server may\n455\t\t\t\t\t** not yet be in links while USER is\n456\t\t\t\t\t** introduced... --msa\n457\t\t\t\t\t** I think it's not true anymore --Beeth\n458\t\t\t\t\t*/\n459\t\tu_int\thashv;\n460\t\taClient\t*uhnext;\n461\t\taClient\t*bcptr;\n462\t\tchar\tusername[USERLEN+1];\n463\t\tchar\tuid[UIDLEN+1];\n464\t\tchar\thost[HOSTLEN+1];\n465\t\tchar\t*server;\n466\t\tu_int\thhashv;\t\t/* hostname hash value */\n467\t\tu_int\tiphashv;\t/* IP hash value */\n468\t\tstruct User *hhnext;\t/* next entry in hostname hash */\n469\t\tstruct User *iphnext;\t/* next entry in IP hash */\n470\t\t\t\t\t/* sip MUST be the last in this struct!!! */\n471\t\tchar\tsip[1];\t\t/* ip as a string, big enough for ipv6\n472\t\t\t\t\t * allocated to real size in make_user */\n473\t\n474\t};\n475\t\n476\tstruct\tServer\t{\n477\t\tchar\tnamebuf[HOSTLEN+1];\n478\t\tanUser\t*user;\t\t/* who activated this connection */\n479\t\taClient\t*up;\t\t/* uplink for this server */\n480\t\taConfItem *nline;\t/* N-line pointer for this server */\n481\t\tint\tversion;        /* version id for local client */\n482\t\tint\tsnum;\n483\t\tint\trefcnt;\t\t/* Number of times this block is referenced\n484\t\t\t\t\t** from anUser (field servp), aService (field\n485\t\t\t\t\t** servp) and aClient (field serv) */\n486\t\tint\tusercnt[3];\t/* # of clients - visible, invisible, opers */\n487\t\tstruct\tServer\t*nexts, *prevs, *shnext;\n488\t\taClient\t*bcptr;\n489\t\taClient\t*maskedby;\t/* Pointer to server masking this server.\n490\t\t\t\t\t** Self if not masked, *NEVER* NULL. */\n491\t\tchar\tby[NICKLEN+1];\n492\t\tchar\tbyuid[UIDLEN + 1];\n493\t\tchar\tsid[SIDLEN + 1];/* The Server ID. */\n494\t\tchar\tverstr[11];\t/* server version, PATCHLEVEL format */\n495\t\tu_int\tsidhashv;\t/* Raw hash value. */\n496\t\taServer\t*sidhnext;\t/* Next server in the sid hash. */\n497\t\ttime_t\tlastload;\t/* penalty like counters, see s_serv.c\n498\t\t\t\t\t** should be in the local part, but.. */\n499\t\tint\tservers;\t/* Number of downlinks of this server. */\n500\t\taClient\t*left, *right;\t/* Left and right nodes in server tree. */\n501\t\taClient\t*down;\t\t/* Ptr to first downlink of this server. */\n502\t};\n503\t\n504\tstruct\tService\t{\n505\t\tchar\tnamebuf[HOSTLEN+1];\n506\t\tint\twants;\n507\t\tint\ttype;\n508\t\tchar\t*server;\n509\t\taServer\t*servp;\n510\t\tstruct\tService\t*nexts, *prevs;\n511\t\taClient\t*bcptr;\n512\t\tchar\tdist[HOSTLEN+1];\n513\t};\n514\t\n515\tstruct Client\t{\n516\t\tstruct\tClient *next,*prev, *hnext;\n517\t\tanUser\t*user;\t\t/* ...defined, if this is a User */\n518\t\taServer\t*serv;\t\t/* ...defined, if this is a server */\n519\t\taService *service;\n520\t\tu_int\thashv;\t\t/* raw hash value */\n521\t\tlong\tflags;\t\t/* client flags */\n522\t\taClient\t*from;\t\t/* == self, if Local Client, *NEVER* NULL! */\n523\t\tint\tfd;\t\t/* >= 0, for local clients */\n524\t\tint\thopcount;\t/* number of servers to this 0 = local */\n525\t\tshort\tstatus;\t\t/* Client type */\n526\t\tchar\t*name;\t\t/* Pointer to unique name of the client */\n527\t\tchar\tnamebuf[NICKLEN+1]; /* nick of the client */\n528\t\tchar\tusername[USERLEN+1]; /* username here now for auth stuff */\n529\t\tchar\t*info;\t\t/* Free form additional client information */\n530\t\t/*\n531\t\t** The following fields are allocated only for local clients\n532\t\t** (directly connected to *this* server with a socket.\n533\t\t** The first of them *MUST* be the \"count\"--it is the field\n534\t\t** to which the allocation is tied to! *Never* refer to\n535\t\t** these fields, if (from != self).\n536\t\t*/\n537\t\tint\tcount;\t\t/* Amount of data in buffer */\n538\t\tchar\tbuffer[BUFSIZE]; /* Incoming message buffer */\n539\t#ifdef\tZIP_LINKS\n540\t\taZdata\t*zip;\t\t/* zip data */\n541\t#endif\n542\t\tshort\tlastsq;\t\t/* # of 2k blocks when sendqueued called last*/\n543\t\tdbuf\tsendQ;\t\t/* Outgoing message queue--if socket full */\n544\t\tdbuf\trecvQ;\t\t/* Hold for data incoming yet to be parsed */\n545\t\tlong\tsendM;\t\t/* Statistics: protocol messages send */\n546\t\tlong\treceiveM;\t/* Statistics: protocol messages received */\n547\t\tunsigned long long\tsendB;\t\t/* Statistics: total bytes send */\n548\t\tunsigned long long\treceiveB;\t/* Statistics: total bytes received */\n549\t\ttime_t\tlasttime;\t/* last time we received data */\n550\t\ttime_t\tfirsttime;\t/* time client was created */\n551\t\ttime_t\tsince;\t\t/* last time we parsed something */\n552\t\taClient\t*acpt;\t\t/* listening client which we accepted from */\n553\t\tLink\t*confs;\t\t/* Configuration record associated */\n554\t\tint\tping;\n555\t\tint\tauthfd;\t\t/* fd for rfc931 authentication */\n556\t\tchar\t*auth;\n557\t\tu_short\tport;\t\t/* and the remote port# too :-) */\n558\t\tstruct\tIN_ADDR\tip;\t/* keep real ip# too */\n559\t\tstruct\thostent\t*hostp;\n560\t\tchar\tsockhost[HOSTLEN+1]; /* This is the host name from the socket\n561\t\t\t\t\t  ** and after which the connection was\n562\t\t\t\t\t  ** accepted.\n563\t\t\t\t\t  */\n564\t\tchar\tpasswd[PASSWDLEN+1];\n565\t\tchar\texitc;\n566\t\tchar\t*reason;\t/* additional exit message */\n567\t#ifdef XLINE\n568\t\t/* Those logically should be in anUser struct, but would be null for\n569\t\t** all remote users... so better waste two pointers for all local\n570\t\t** non-users than two pointers for all remote users. --B. */\n571\t\tchar\t*user2;\t/* 2nd param of USER */\n572\t\tchar\t*user3;\t/* 3rd param of USER */\n573\t#endif\n574\t\n575\t};\n576\t\n577\t#define\tCLIENT_LOCAL_SIZE sizeof(aClient)\n578\t#define\tCLIENT_REMOTE_SIZE offsetof(aClient,count)\n579\t\n580\t/*\n581\t * statistics structures\n582\t */\n583\tstruct\tstats {\n584\t\tu_int\tis_cl;\t/* number of client connections */\n585\t\tu_int\tis_sv;\t/* number of server connections */\n586\t\tu_int\tis_ni;\t/* connection but no idea who it was\n587\t\t\t\t * (can be a P: line that has been removed -krys) */\n588\t\tunsigned long long\tis_cbs;\t/* bytes sent to clients */\n589\t\tunsigned long long\tis_cbr;\t/* bytes received to clients */\n590\t\tunsigned long long\tis_sbs;\t/* bytes sent to servers */\n591\t\tunsigned long long\tis_sbr;\t/* bytes received to servers */\n592\t\ttime_t\tis_cti;\t/* time spent connected by clients */\n593\t\ttime_t\tis_sti;\t/* time spent connected by servers */\n594\t\tu_int\tis_ac;\t/* connections accepted */\n595\t\tu_int\tis_ref;\t/* accepts refused */\n596\t\tu_int\tis_unco; /* unknown commands */\n597\t\tu_int\tis_wrdi; /* command going in wrong direction */\n598\t\tu_int\tis_unpf; /* unknown prefix */\n599\t\tu_int\tis_empt; /* empty message */\n600\t\tu_int\tis_num;\t/* numeric message */\n601\t\tu_int\tis_kill; /* number of kills generated on collisions */\n602\t\tu_int\tis_save; /* number of saved clients */\n603\t\tu_int\tis_fake; /* MODE 'fakes' */\n604\t\tu_int\tis_reop; /* number of local reops */\n605\t\tu_int\tis_rreop; /* number of remote reops */\n606\t\tu_int\tis_asuc; /* successful auth requests */\n607\t\tu_int\tis_abad; /* bad auth requests */\n608\t\tu_int\tis_udpok;\t/* packets recv'd on udp port */\n609\t\tu_int\tis_udperr;\t/* packets recvfrom errors on udp port */\n610\t\tu_int\tis_udpdrop;\t/* packets recv'd but dropped on udp port */\n611\t\tu_int\tis_loc;\t/* local connections made */\n612\t\tu_int\tis_nosrv; /* user without server */\n613\t\tu_long\tis_wwcnt; /* number of nicks overwritten in whowas[] */\n614\t\tunsigned long long\tis_wwt;\t/* sum of elapsed time on when \n615\t\t\t\t\t\t** overwriting whowas[] */\n616\t\tu_long\tis_wwMt;  /* max elapsed time on when overwriting whowas[] */\n617\t\tu_long\tis_wwmt;  /* min elapsed time on when overwriting whowas[] */\n618\t\tu_long\tis_lkcnt; /* number of nicks overwritten in locked[] */\n619\t\tunsigned long long\tis_lkt;\t/* sum of elapsed time on when\n620\t\t\t\t\t\t** overwriting locked[]*/\n621\t\tu_long\tis_lkMt;  /* max elapsed time on when overwriting locked[] */\n622\t\tu_long\tis_lkmt;  /* min elapsed time on when overwriting locked[] */\n623\t\tu_int\tis_ckl;   /* calls to check_link() */\n624\t\tu_int\tis_cklQ;  /* rejected: SendQ too high */\n625\t\tu_int\tis_ckly;  /* rejected: link too young */\n626\t\tu_int\tis_cklno; /* rejected: \"flood\" */\n627\t\tu_int\tis_cklok; /* accepted */\n628\t\tu_int\tis_cklq;  /* accepted early */\n629\t};\n630\t\n631\t/* mode structure for channels */\n632\t\n633\tstruct\tSMode\t{\n634\t\tu_int\tmode;\n635\t\tint\tlimit;\n636\t\tchar\tkey[KEYLEN+1];\n637\t};\n638\t\n639\t/* Message table structure */\n640\t\n641\ttypedef\tint\t(*CmdHandler)(aClient *, aClient *, int, char **);\n642\t\n643\tstruct\tCmd {\n644\t\tCmdHandler\thandler;\t/* command */\n645\t\tu_int\t\tcount;\t\t/* total count */\n646\t\tu_int\t\trcount;\t\t/* remote count */\n647\t\tu_long\t\tbytes;\n648\t\tu_long\t\trbytes;\n649\t};\n650\t\n651\tstruct\tMessage\t{\n652\t\tchar\t*cmd;\n653\t\tint\tminparams;\n654\t\tint\tmaxparams;\n655\t\tstruct Cmd\thandlers[STAT_MAX];\n656\t};\n657\t\n658\t/* fd array structure */\n659\t\n660\tstruct\tfdarray\t{\n661\t\tint\tfd[MAXCONNECTIONS];\n662\t\tint\thighest;\n663\t};\n664\t\n665\t/* general link structure used for chains */\n666\t\n667\tstruct\tSLink\t{\n668\t\tstruct\tSLink\t*next;\n669\t\tunion {\n670\t\t\taClient\t*cptr;\n671\t\t\taChannel *chptr;\n672\t\t\taConfItem *aconf;\n673\t\t\taListItem *alist;\n674\t\t\tchar\t*cp;\n675\t\t\tint\ti;\n676\t\t} value;\n677\t\tint\tflags;\n678\t};\n679\t\n680\t/* link structure used for invites */\n681\t\n682\tstruct\tinvSLink\t{\n683\t\tstruct\tinvSLink\t*next;\n684\t\taChannel\t\t*chptr;\n685\t\tchar\t\t\t*who;\n686\t\tint\t\t\tflags;\n687\t};\n688\t\n689\t/* channel structure */\n690\t\n691\tstruct Channel\t{\n692\t\tstruct\tChannel *nextch, *prevch, *hnextch;\n693\t\tu_int\thashv;\t\t/* raw hash value */\n694\t\tMode\tmode;\n695\t\tchar\ttopic[TOPICLEN+1];\n696\t#ifdef TOPIC_WHO_TIME\n697\t\tchar\ttopic_nuh[BANLEN+1];\n698\t\ttime_t\ttopic_t;\n699\t#endif\n700\t\tint\tusers;\t\t/* current membership total */\n701\t\tLink\t*members;\t/* channel members */\n702\t\tLink\t*invites;\t/* outstanding invitations */\n703\t\tLink\t*mlist;\t\t/* list of extended modes: +b/+e/+I */\n704\t\tLink\t*clist;\t\t/* list of local! connections which are members */\n705\t\ttime_t\thistory;\t/* channel history (aka channel delay) */\n706\t\ttime_t\treop;\t\t/* server reop stamp for !channels */\n707\t#ifdef JAPANESE\n708\t\tint flags;\n709\t#endif\n710\t\tchar\tchname[1];\n711\t};\n712\t\n713\t/*\n714\t** Channel Related macros follow\n715\t*/\n716\t\n717\t/* Channel related flags */\n718\t\n719\t#define\tCHFL_UNIQOP     0x0001 /* Channel creator */\n720\t#define\tCHFL_CHANOP     0x0002 /* Channel operator */\n721\t#define\tCHFL_VOICE      0x0004 /* the power to speak */\n722\t#define\tCHFL_BAN\t0x0008 /* ban channel flag */\n723\t#define\tCHFL_EXCEPTION\t0x0010 /* exception channel flag */\n724\t#define\tCHFL_INVITE\t0x0020 /* invite channel flag */\n725\t#define\tCHFL_REOPLIST\t0x0040 /* reoplist channel flag */\n726\t\n727\t/* Channel Visibility macros */\n728\t\n729\t#define\tMODE_UNIQOP\tCHFL_UNIQOP\n730\t#define\tMODE_CHANOP\tCHFL_CHANOP\n731\t#define\tMODE_VOICE\tCHFL_VOICE\n732\t#define\tMODE_PRIVATE\t0x00008\n733\t#define\tMODE_SECRET\t0x00010\n734\t#define\tMODE_MODERATED  0x00020\n735\t#define\tMODE_TOPICLIMIT 0x00040\n736\t#define\tMODE_INVITEONLY 0x00080\n737\t#define\tMODE_NOPRIVMSGS 0x00100\n738\t#define\tMODE_KEY\t0x00200\n739\t#define\tMODE_BAN\t0x00400\n740\t#define\tMODE_LIMIT\t0x00800\n741\t#define\tMODE_ANONYMOUS\t0x01000\n742\t#define\tMODE_QUIET\t0x02000\n743\t#define\tMODE_EXCEPTION\t0x04000\n744\t#define\tMODE_INVITE\t0x08000\n745\t#define\tMODE_REOP\t0x10000\n746\t#define\tMODE_REOPLIST\t0x20000\n747\t#define\tMODE_FLAGS\t0x3ffff\n748\t/*\n749\t * mode flags which take another parameter (With PARAmeterS)\n750\t */\n751\t#define\tMODE_WPARAS\t(MODE_UNIQOP|MODE_CHANOP|MODE_VOICE|MODE_BAN|MODE_KEY\\\n752\t\t\t\t |MODE_LIMIT|MODE_INVITE|MODE_EXCEPTION|MODE_REOPLIST)\n753\t/*\n754\t * Undefined here, these are used in conjunction with the above modes in\n755\t * the source.\n756\t#define\tMODE_DEL       0x40000000\n757\t#define\tMODE_ADD       0x80000000\n758\t */\n759\t\n760\t#define\tHoldChannel(x)\t\t(!(x))\n761\t/* name invisible */\n762\t#define\tSecretChannel(x)\t((x) && ((x)->mode.mode & MODE_SECRET))\n763\t/* channel not shown but names are */\n764\t#define\tHiddenChannel(x)\t((x) && ((x)->mode.mode & MODE_PRIVATE))\n765\t/* channel visible */\n766\t#define\tShowChannel(v,c)\t(PubChannel(c) || IsMember((v),(c)))\n767\t#define\tIsAnonymous(c)\t\t((c) && ((c)->mode.mode & MODE_ANONYMOUS))\n768\t#define\tPubChannel(x)\t\t((!x) || ((x)->mode.mode &\\\n769\t\t\t\t\t (MODE_PRIVATE | MODE_SECRET)) == 0)\n770\t\n771\t/*\n772\t#define\tIsMember(u, c)\t\t(assert(*(c)->chname != '\\0'), find_user_link((c)->members, u) ? 1 : 0)\n773\t#define\tIsMember(u, c)\t\t(find_user_link((c)->members, u) ? 1 : 0)\n774\t*/\n775\t#define       IsMember(u, c)          (u && (u)->user && \\\n776\t\t\t       find_channel_link((u)->user->channel, c) ? 1 : 0)\n777\t# define\tIsChannelName(n)\t((n) && (*(n) == '#' || *(n) == '&' ||\\\n778\t\t\t\t\t\t*(n) == '+' || \\\n779\t\t\t\t\t\t(*(n) == '!' && cid_ok(n, CHIDLEN))))\n780\t#define\tIsQuiet(x)\t\t((x)->mode.mode & MODE_QUIET)\n781\t#define\tUseModes(n)\t\t((n) && (*(n) == '#' || *(n) == '&' || \\\n782\t\t\t\t\t\t *(n) == '!'))\n783\t\n784\t/* Misc macros */\n785\t\n786\t#define\tBadPtr(x) (!(x) || (*(x) == '\\0'))\n787\t#define\tBadTo(x) (BadPtr((x)) ? \"*\" : (x))\n788\t\n789\t#define\tMyConnect(x)\t\t\t((x)->fd >= 0)\n790\t#define\tMyClient(x)\t\t\t(MyConnect(x) && IsClient(x))\n791\t#define\tMyPerson(x)\t\t\t(MyConnect(x) && IsPerson(x))\n792\t#define\tMyOper(x)\t\t\t(MyConnect(x) && IsOper(x))\n793\t#define\tMyService(x)\t\t\t(MyConnect(x) && IsService(x))\n794\t#define\tME\tme.name\n795\t#define\tMES\tme.serv->sid\n796\t\n797\t#define\tGotDependantClient(x)\t(x->prev &&\t\t\t\t\\\n798\t\t\t \t\t ((IsRegisteredUser(x->prev) &&\t\t\\\n799\t\t\t\t\t  x->prev->user->servp == x->serv) ||\t\\\n800\t\t\t\t\t  (IsService(x->prev) &&\t\t\\\n801\t\t\t\t\t  x->prev->service->servp == x->serv)))\n802\t\n803\t#define\tIsMasked(x)\t\t(x && x->serv && x->serv->maskedby != x)\n804\t\n805\t#define IsSplit()\t\t(iconf.split > 0)\n806\t\n807\ttypedef\tstruct\t{\n808\t\tu_long\tis_user[2];\t/* users, non[0] invis and invis[1] */\n809\t\tu_long\tis_serv;\t/* servers */\n810\t\tu_long\tis_eobservers;  /* number of servers which sent EOB */\n811\t\tu_long\tis_masked;\t/* masked servers. */\n812\t\tu_long\tis_service;\t/* services */\n813\t\tu_long\tis_chan;\t/* channels */\n814\t\tu_long\tis_chanmem;\n815\t\tu_long\tis_chanusers;\t/* channels users */\n816\t\tu_long\tis_hchan;\t/* channels in history */\n817\t\tu_long\tis_hchanmem;\n818\t\tu_long\tis_cchan;\t/* channels in cache */\n819\t\tu_long\tis_cchanmem;\n820\t\tu_long\tis_away;\t/* away sets */\n821\t\tu_long\tis_awaymem;\n822\t\tu_long\tis_oper;\t/* opers */\n823\t\tu_long\tis_bans;\t/* bans */\n824\t\tu_long\tis_banmem;\n825\t\tu_long\tis_invite;\t/* invites */\n826\t\tu_long\tis_class;\t/* classes */\n827\t\tu_long\tis_conf;\t/* conf lines */\n828\t\tu_long\tis_confmem;\n829\t\tu_long\tis_conflink;\t/* attached conf lines */\n830\t\tu_long\tis_myclnt;\t/* local clients */\n831\t\tu_long\tis_myserv;\t/* local servers */\n832\t\tu_long\tis_myservice;\t/* local services */\n833\t\tu_long\tis_unknown;\t/* unknown (local) connections */\n834\t\tu_long\tis_wwusers;\t/* users kept for whowas[] */\n835\t\tu_long\tis_wwaways;\t/* aways in users in whowas[] */\n836\t\tu_long\tis_wwawaysmem;\n837\t\tu_long\tis_wwuwas;\t/* uwas links */\n838\t\tu_long\tis_localc;\t/* local items (serv+service+client+..) */\n839\t\tu_long\tis_remc;\t/* remote clients */\n840\t\tu_long\tis_users;\t/* user structs */\n841\t\tu_long\tis_useri;\t/* user invites */\n842\t\tu_long\tis_userc;\t/* user links to channels */\n843\t\tu_long\tis_auth;\t/* OTHER ident reply block */\n844\t\tu_long\tis_authmem;\n845\t\tu_int\tis_dbuf;\t/* number of dbuf allocated (originally) */\n846\t\tu_int\tis_dbufnow;\t/* number of dbuf allocated */\n847\t\tu_int\tis_dbufuse;\t/* number of dbuf in use */\n848\t\tu_int\tis_dbufmin;\t/* min number of dbuf in use */\n849\t\tu_int\tis_dbufmax;\t/* max number of dbuf in use */\n850\t\tu_int\tis_dbufmore;\t/* how many times we increased the bufferpool*/\n851\t\tu_long\tis_m_users;\t/* maximum users connected */\n852\t\ttime_t\tis_m_users_t;\t/* timestamp of last maximum users */\n853\t\tu_long\tis_m_serv;\t/* maximum servers connected */\n854\t\tu_long\tis_m_service;\t/* maximum services connected */\n855\t\tu_long\tis_m_myclnt;\t/* maximum local clients */\n856\t\ttime_t\tis_m_myclnt_t;\t/* timestamp of last maximum local clients */\n857\t\tu_long\tis_m_myserv;\t/* maximum local servers */\n858\t\tu_long\tis_m_myservice;\t/* maximum local services */\n859\t\tu_long\tis_l_myclnt;\t/* last local user count */\n860\t\ttime_t\tis_l_myclnt_t;\t/* timestamp for last count */\n861\t#ifdef DELAY_CLOSE\n862\t\tu_long\tis_delayclose;\t/* number of fds that got delayed close() */\n863\t\tu_int\tis_delayclosewait;\t/* number of fds that wait for delayed close() */\n864\t#endif\n865\t} istat_t;\n866\t\n867\t/* String manipulation macros */\n868\t\n869\t/* strncopynt --> strncpyzt to avoid confusion, sematics changed\n870\t   N must be now the number of bytes in the array --msa */\n871\t#define\tstrncpyzt(x, y, N) do{(void)strncpy(x,y,N);x[N-1]='\\0';}while(0)\n872\t#define\tStrEq(x,y)\t(!strcmp((x),(y)))\n873\t\n874\t/* used in SetMode() in channel.c and m_umode() in s_msg.c */\n875\t\n876\t#define\tMODE_NULL      0\n877\t#define\tMODE_ADD       0x40000000\n878\t#define\tMODE_DEL       0x20000000\n879\t\n880\t/* return values for hunt_server() */\n881\t\n882\t#define\tHUNTED_NOSUCH\t(-1)\t/* if the hunted server is not found */\n883\t#define\tHUNTED_ISME\t0\t/* if this server should execute the command */\n884\t#define\tHUNTED_PASS\t1\t/* if message passed onwards successfully */\n885\t\n886\t/* used when sending to $#mask or $$mask */\n887\t\n888\t#define\tMATCH_SERVER\t1\n889\t#define\tMATCH_HOST\t2\n890\t\n891\t/* used for sendto_serv */\n892\t\n893\t#define\tSV_OLD\t\t0x0000\n894\t#define SV_UID\t\t0x0001\n895\t#define\tSV_2_11\t\tSV_UID\n896\t\n897\t/* used for sendto_flag */\n898\t\n899\ttypedef\tstruct\t{\n900\t\tint\tsvc_chan;\n901\t\tchar\t*svc_chname;\n902\t\tstruct\tChannel\t*svc_ptr;\n903\t\tint\tfd;\n904\t}\tSChan;\n905\t\n906\ttypedef enum ServerChannels {\n907\t\tSCH_ERROR,\n908\t\tSCH_NOTICE,\n909\t\tSCH_KILL,\n910\t\tSCH_CHAN,\n911\t\tSCH_NUM,\n912\t\tSCH_SERVER,\n913\t\tSCH_HASH,\n914\t\tSCH_LOCAL,\n915\t\tSCH_SERVICE,\n916\t\tSCH_DEBUG,\n917\t\tSCH_AUTH,\n918\t\tSCH_SAVE,\n919\t\tSCH_WALLOP,\n920\t#ifdef CLIENTS_CHANNEL\n921\t\tSCH_CLIENT,\n922\t#endif\n923\t\tSCH_OPER,\n924\t\tSCH_MAX\t\n925\t} ServerChannels;\n926\t\n927\t/* used for async dns values */\n928\t\n929\t#define\tASYNC_NONE\t(-1)\n930\t#define\tASYNC_CLIENT\t0\n931\t#define\tASYNC_CONNECT\t1\n932\t#define\tASYNC_CONF\t2\n933\t#define\tASYNC_SERVER\t3\n934\t\n935\t/* Client exit codes for log file */\n936\t#define EXITC_UNDEF\t'-'\t/* unregistered client */\n937\t#define EXITC_REG\t'0'\t/* normal exit */\n938\t#define EXITC_AUTHFAIL\t'A'\t/* Authentication failure (iauth problem) */\n939\t#define EXITC_AUTHTOUT\t'a'\t/* Authentication time out */\n940\t#define EXITC_CLONE\t'C'\t/* CLONE_CHECK */\n941\t#define EXITC_DIE\t'd'\t/* server died */\n942\t#define EXITC_DEAD\t'D'\t/* socket died */\n943\t#define EXITC_ERROR\t'E'\t/* socket error */\n944\t#define EXITC_FLOOD\t'F'\t/* client flooding */\n945\t#define EXITC_FAILURE\t'f'\t/* connect failure */\n946\t#define EXITC_GHMAX\t'G'\t/* global clients per host max limit */\n947\t#define EXITC_GUHMAX\t'g'\t/* global clients per user@host max limit */\n948\t#define EXITC_NOILINE\t'I'\t/* No matching I:line */\n949\t#define EXITC_KLINE\t'k'\t/* K-lined */\n950\t#define EXITC_KILL\t'K'\t/* KILLed */\n951\t#define EXITC_LHMAX\t'L'\t/* local clients per host max limit */\n952\t#define EXITC_LUHMAX\t'l'\t/* local clients per user@host max limit */\n953\t#define EXITC_MBUF\t'M'\t/* mem alloc error */\n954\t#define EXITC_PING\t'P'\t/* ping timeout */\n955\t#define EXITC_BADPASS\t'p'\t/* bad password */\n956\t#define EXITC_SENDQ\t'Q'\t/* send queue exceeded */\n957\t#define EXITC_REF\t'R'\t/* Refused */\n958\t#ifdef TKLINE\n959\t#define EXITC_TKLINE\t't'\t/* tkline */\n960\t#endif\n961\t#define EXITC_AREF\t'U'\t/* Unauthorized by iauth */\n962\t#define EXITC_AREFQ\t'u'\t/* Unauthorized by iauth, be quiet */\n963\t#define EXITC_VIRUS\t'v'\t/* joined a channel used by PrettyPark virus */\n964\t#ifdef XLINE\n965\t#define EXITC_XLINE\t'X'\t/* Forbidden GECOS */\n966\t#endif\n967\t#define EXITC_YLINEMAX\t'Y'\t/* Y:line max clients limit */\n968\t\n969\t/* eXternal authentication slave OPTions */\n970\t#define\tXOPT_REQUIRED\t0x01\t/* require authentication be done by iauth */\n971\t#define\tXOPT_NOTIMEOUT\t0x02\t/* disallow iauth time outs */\n972\t#define XOPT_EXTWAIT\t0x10\t/* extend registration ping timeout */\n973\t#define XOPT_EARLYPARSE\t0x20\t/* allow early parsing and send USER/PASS\n974\t\t\t\t\t   information to iauth */\n975\t\n976\t/* misc defines */\n977\t\n978\t#define\tFLUSH_BUFFER\t-2\n979\t#define\tUTMP\t\t\"/etc/utmp\"\n980\t#define\tCOMMA\t\t\",\"\n981\t\n982\t#define\tSAP\tstruct SOCKADDR *\n983\t\n984\t/* safety checks */\n985\t#if ! (UIDLEN <= NICKLEN)\n986\t#   error UIDLEN must not be bigger than NICKLEN\n987\t#endif\n988\t#if ! (UIDLEN > SIDLEN)\n989\t#   error UIDLEN must be bigger than SIDLEN\n990\t#endif\n991\t#if (NICKLEN < LOCALNICKLEN)\n992\t#   error LOCALNICKLEN must not be bigger than NICKLEN\n993\t#endif\n994\t\n995\t/* WHO parameter flags */\n996\t#define WHO_FLAG_OPERS_ONLY\t0x0001\n997\t#define WHO_FLAG_CHANNEL\t0x0002\n998\t#define WHO_FLAG_HOP\t\t0x0004\n999\t#define WHO_FLAG_FLAGS\t\t0x0008\n1000\t#define WHO_FLAG_HOST\t\t0x0010\n1001\t#define WHO_FLAG_IP\t\t\t0x0020\n1002\t#define WHO_FLAG_IDLE\t\t0x0040\n1003\t#define WHO_FLAG_NICK\t\t0x0080\n1004\t#define WHO_FLAG_INFO\t\t0x0100\n1005\t#define WHO_FLAG_SERVER\t\t0x0200\n1006\t#define WHO_FLAG_TOKEN\t\t0x0400\n1007\t#define WHO_FLAG_USER\t\t0x0800\n1008\t#define WHO_FLAG_ACCOUNT\t0x1000\n1009\t#define WHO_FLAG_OP_LEVEL\t0x2000\n1010\t#define WHO_FLAG_SID\t\t0x4000\n1011\t#define WHO_FLAG_UID\t\t0x8000\n1012\t\n1013\tstruct who_opts\n1014\t{\n1015\t\tint flags;\n1016\t\tconst char *token;\n1017\t};\n1018\t\n1019\t/*\n1020\t * base for channel IDs and UIDs\n1021\t */\n1022\t#define CHIDNB 36\n1023\t\n1024\t\n1025\t/* Defines used for SET command */\n1026\t#define TSET_ACONNECT 0x001\n1027\t#define TSET_POOLSIZE 0x002\n1028\t#define TSET_CACCEPT 0x004\n1029\t#define TSET_SHOWALL (int) ~0\n1030\t\n1031\t/* Runtime configuration structure */\n1032\ttypedef struct\n1033\t{\n1034\t\tint aconnect;\t/* 0 - OFF 1 - ON */\n1035\t\t/* standalone splitmode is -1 not 3 */\n1036\t\tint split;\t/* -1: standalone, 0: no, >0 yes (and since when) */\n1037\t\tint split_minservers;\n1038\t\tint split_minusers;\n1039\t\tint caccept;\t/* 0 - OFF 1 - ON 2 - SPLIT */\n1040\t} iconf_t;\n1041\t\n1042\t/* O:line flags, used also in is_allowed() */\n1043\t#define ACL_LOCOP\t\t0x00001\n1044\t#define ACL_KILLLOCAL\t\t0x00002\n1045\t#define ACL_KILLREMOTE\t\t0x00004\n1046\t#define ACL_KILL\t\t(ACL_KILLLOCAL|ACL_KILLREMOTE)\n1047\t#define ACL_SQUITLOCAL\t\t0x00008\n1048\t#define ACL_SQUITREMOTE\t\t0x00010\n1049\t#define ACL_SQUIT\t\t(ACL_SQUITLOCAL|ACL_SQUITREMOTE)\n1050\t#define ACL_CONNECTLOCAL\t0x00020\n1051\t#define ACL_CONNECTREMOTE\t0x00040\n1052\t#define ACL_CONNECT\t\t(ACL_CONNECTLOCAL|ACL_CONNECTREMOTE)\n1053\t#define ACL_CLOSE\t\t0x00080\n1054\t#define ACL_HAZH\t\t0x00100\n1055\t#define ACL_DNS\t\t\t0x00200\n1056\t#define ACL_REHASH\t\t0x00400\n1057\t#define ACL_RESTART\t\t0x00800\n1058\t#define ACL_DIE\t\t\t0x01000\n1059\t#define ACL_SET\t\t\t0x02000\n1060\t#define ACL_TKLINE\t\t0x04000\n1061\t#define ACL_UNTKLINE\t\tACL_TKLINE\n1062\t#define ACL_CLIENTS\t\t0x08000\n1063\t#define ACL_CANFLOOD\t\t0x10000\n1064\t#define ACL_NOPENALTY\t\t0x20000\n1065\t#define ACL_TRACE\t\t0x40000\n1066\t#define ACL_KLINE\t\t0x80000\n1067\t#define ACL_SIDTRACE\t\t0x100000\n1068\t\n1069\t#define ACL_ALL_REMOTE\t\t(ACL_KILLREMOTE|ACL_SQUITREMOTE|ACL_CONNECTREMOTE)\n1070\t#define ACL_ALL\t\t\t0x1FFFFF\n1071\t\n1072\t#ifdef CLIENTS_CHANNEL\n1073\t/* information scope of &CLIENTS channel. */\n1074\t#define CCL_CONN     0x01\t/* connections */\n1075\t#define CCL_CONNINFO 0x02\t/* if connections, then with realname */\n1076\t#define CCL_QUIT     0x04\t/* quits */\n1077\t#define CCL_QUITINFO 0x08\t/* if quits, then with quit message */\n1078\t#define CCL_NICK     0x10\t/* nick changes */\n1079\t#endif\n1080\t\n1081\t"}]},"uuid":"f96bc59b-b3ee-4179-b54b-c866b2eef250","timestamp":"2026-06-01T23:56:37.749Z","sourceToolAssistantUUID":"4242de6b-4035-45a0-b7da-96b752b03134","userType":"external","entrypoint":"cli","cwd":"/home/xe/code/xeiaso.net/ircd.rs","sessionId":"83d912ac-5e1e-4525-89a0-e5166a07c355","version":"2.1.160","gitBranch":"master","slug":"i-would-like-to-humming-curry"}
.claude/sessions/277b9a26-7584-4a52-af24-e273145ff744.jsonl:72:{"parentUuid":"b9745a22-c9c9-4e85-8b67-343a8aaa66fb","isSidechain":false,"promptId":"6ad9476f-93bc-4638-8b66-8496e2f95f39","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01EttTosd7iJWSrKJKHitUf1","type":"tool_result","content":"=== how MODE reaches m_umode ===\n1042: * m_mode\n1049:int\tm_mode(aClient *cptr, aClient *sptr, int parc, char *parv[])\n1069:\t\t\tpenalty += m_umode(cptr, sptr, parc, parv);\n=== constants ===\ncommon/struct_def.h:188:#define\tFLAGS_OPER\t0x0001 /* operator */\ncommon/struct_def.h:189:#define\tFLAGS_LOCOP\t0x0002 /* local operator -- SRB */\ncommon/struct_def.h:190:#define\tFLAGS_WALLOP\t0x0004 /* send wallops to them */\ncommon/struct_def.h:191:#define\tFLAGS_INVISIBLE\t0x0008 /* makes user invisible */\ncommon/struct_def.h:192:#define FLAGS_RESTRICT\t0x0010 /* restricted user */\ncommon/struct_def.h:193:#define FLAGS_AWAY\t0x0020 /* user is away */\ncommon/struct_def.h:199:#define\tSEND_UMODES\t(FLAGS_INVISIBLE|FLAGS_OPER|FLAGS_WALLOP|FLAGS_AWAY|FLAGS_RESTRICT)\ncommon/struct_def.h:200:#define\tALL_UMODES\t(SEND_UMODES|FLAGS_LOCOP)\ncommon/struct_def.h:756:#define\tMODE_DEL       0x40000000\ncommon/struct_def.h:757:#define\tMODE_ADD       0x80000000\ncommon/struct_def.h:876:#define\tMODE_NULL      0\ncommon/struct_def.h:877:#define\tMODE_ADD       0x40000000\ncommon/struct_def.h:878:#define\tMODE_DEL       0x20000000\n=== msgtab MODE row in parse.rs ===\n13://! on, KLINE off, ENABLE_SIDTRACE off, MOTD_UNREG off, IDLE_FROM_MSG on, DEBUGMODE\n42:    m_map, m_mode, m_motd, m_names, m_nick, m_njoin, m_notice, m_oper, m_part, m_pass, m_ping,\n45:    m_trace, m_umode, m_unick, m_untkline, m_user, m_userhost, m_users, m_version, m_wallops,\n161:    row!(c\"MODE\", 1, MPAR, [m_mode, m_mode, m_mode, m_nop, m_unreg]),\n181:    row!(c\"UMODE\", 1, MPAR, [m_nop, m_umode, m_umode, m_nop, m_unreg]),","is_error":false}]},"uuid":"fdd32e64-9b58-4305-9a31-09eae0b211e8","timestamp":"2026-06-03T02:44:11.197Z","toolUseResult":{"stdout":"=== how MODE reaches m_umode ===\n1042: * m_mode\n1049:int\tm_mode(aClient *cptr, aClient *sptr, int parc, char *parv[])\n1069:\t\t\tpenalty += m_umode(cptr, sptr, parc, parv);\n=== constants ===\ncommon/struct_def.h:188:#define\tFLAGS_OPER\t0x0001 /* operator */\ncommon/struct_def.h:189:#define\tFLAGS_LOCOP\t0x0002 /* local operator -- SRB */\ncommon/struct_def.h:190:#define\tFLAGS_WALLOP\t0x0004 /* send wallops to them */\ncommon/struct_def.h:191:#define\tFLAGS_INVISIBLE\t0x0008 /* makes user invisible */\ncommon/struct_def.h:192:#define FLAGS_RESTRICT\t0x0010 /* restricted user */\ncommon/struct_def.h:193:#define FLAGS_AWAY\t0x0020 /* user is away */\ncommon/struct_def.h:199:#define\tSEND_UMODES\t(FLAGS_INVISIBLE|FLAGS_OPER|FLAGS_WALLOP|FLAGS_AWAY|FLAGS_RESTRICT)\ncommon/struct_def.h:200:#define\tALL_UMODES\t(SEND_UMODES|FLAGS_LOCOP)\ncommon/struct_def.h:756:#define\tMODE_DEL       0x40000000\ncommon/struct_def.h:757:#define\tMODE_ADD       0x80000000\ncommon/struct_def.h:876:#define\tMODE_NULL      0\ncommon/struct_def.h:877:#define\tMODE_ADD       0x40000000\ncommon/struct_def.h:878:#define\tMODE_DEL       0x20000000\n=== msgtab MODE row in parse.rs ===\n13://! on, KLINE off, ENABLE_SIDTRACE off, MOTD_UNREG off, IDLE_FROM_MSG on, DEBUGMODE\n42:    m_map, m_mode, m_motd, m_names, m_nick, m_njoin, m_notice, m_oper, m_part, m_pass, m_ping,\n45:    m_trace, m_umode, m_unick, m_untkline, m_user, m_userhost, m_users, m_version, m_wallops,\n161:    row!(c\"MODE\", 1, MPAR, [m_mode, m_mode, m_mode, m_nop, m_unreg]),\n181:    row!(c\"UMODE\", 1, MPAR, [m_nop, m_umode, m_umode, m_nop, m_unreg]),","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false},"sourceToolAssistantUUID":"b9745a22-c9c9-4e85-8b67-343a8aaa66fb","userType":"external","entrypoint":"cli","cwd":"/home/xe/code/xeiaso.net/ircd.rs","sessionId":"277b9a26-7584-4a52-af24-e273145ff744","version":"2.1.161","gitBranch":"master"}
.claude/sessions/024bb80b-bf76-483a-ab1e-dc6f4fce9ffb.jsonl:196:{"parentUuid":"2d73c8e9-6b1a-4674-9a93-4e6cadc9b786","isSidechain":false,"promptId":"f5aaa00e-ed08-4478-9a40-408683869837","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_012NGXw9coi2JCk6x4Q6aoEs","type":"tool_result","content":"192:#define FLAGS_RESTRICT\t0x0010 /* restricted user */\n117:\tSTAT_UNKNOWN,\t/* -2 */\n119:\tSTAT_SERVER,\t/* 0 */\n120:\tSTAT_CLIENT,\t/* 1 */\n130:#define\tIsRegisteredUser(x)\t(((x)->status == STAT_CLIENT || \\\n132:#define\tIsRegistered(x)\t\t((x)->status >= STAT_SERVER || \\\n137:#define\tIsUnknown(x)\t\t((x)->status == STAT_UNKNOWN)\n138:#define\tIsServer(x)\t\t((x)->status == STAT_SERVER)\n139:#define\tIsClient(x)\t\t((x)->status == STAT_CLIENT || \\\n146:#define\tSetUnknown(x)\t\t((x)->status = STAT_UNKNOWN)\n147:#define\tSetServer(x)\t\t((x)->status = STAT_SERVER)\n=== make_user available? ===\n3188:    pub fn make_user(cptr: *mut aClient, iplen: ::std::os::raw::c_int) -> *mut anUser;","is_error":false}]},"uuid":"e45e920a-9fbd-4dab-ad2b-fb31b6ff4966","timestamp":"2026-06-03T13:44:38.797Z","toolUseResult":{"stdout":"192:#define FLAGS_RESTRICT\t0x0010 /* restricted user */\n117:\tSTAT_UNKNOWN,\t/* -2 */\n119:\tSTAT_SERVER,\t/* 0 */\n120:\tSTAT_CLIENT,\t/* 1 */\n130:#define\tIsRegisteredUser(x)\t(((x)->status == STAT_CLIENT || \\\n132:#define\tIsRegistered(x)\t\t((x)->status >= STAT_SERVER || \\\n137:#define\tIsUnknown(x)\t\t((x)->status == STAT_UNKNOWN)\n138:#define\tIsServer(x)\t\t((x)->status == STAT_SERVER)\n139:#define\tIsClient(x)\t\t((x)->status == STAT_CLIENT || \\\n146:#define\tSetUnknown(x)\t\t((x)->status = STAT_UNKNOWN)\n147:#define\tSetServer(x)\t\t((x)->status = STAT_SERVER)\n=== make_user available? ===\n3188:    pub fn make_user(cptr: *mut aClient, iplen: ::std::os::raw::c_int) -> *mut anUser;","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false},"sourceToolAssistantUUID":"2d73c8e9-6b1a-4674-9a93-4e6cadc9b786","userType":"external","entrypoint":"cli","cwd":"/home/xe/code/xeiaso.net/ircd.rs","sessionId":"024bb80b-bf76-483a-ab1e-dc6f4fce9ffb","version":"2.1.161","gitBranch":"master"}
.claude/sessions/49190db7-41f9-426f-9140-ca85ca026e94.jsonl:67:{"parentUuid":"9bdc43db-9642-4e73-b94c-6210e01c286f","isSidechain":false,"message":{"model":"claude-opus-4-8","id":"msg_01RX7YH7quPEngrhaXovQKCX","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_017YfoC5Y4cPS7ANv1tDVeLY","name":"Bash","input":{"command":"cd /home/xe/Code/xeiaso.net/ircd.rs\ngrep -rn \"define XOPT_EARLYPARSE\\|define XOPT_REQUIRED\\|define XOPT_NOTIMEOUT\\|define XOPT_EXTWAIT\\|define EXITC_AREF\\|define EXITC_AREFQ\\|define READBUF_SIZE\\|define SCH_AUTH\\|define SCH_LOCAL\\|define FLAGS_GOTID\" common/*.h ircd/*.h\necho \"--- X-auth macros ---\"\ngrep -rn \"define WaitingXAuth\\|define ClearXAuth\\|define SetDoneXAuth\\|define ClearWXAuth\\|define IsRegisteredUser\\|define ClearWXAuth\\|WaitingXAuth\\|FLAGS_WXAUTH\\|FLAGS_XAUTH\\|FLAGS_DXAUTH\" common/struct_def.h | head -30","description":"Find macros and flag constants"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":599,"cache_read_input_tokens":71308,"output_tokens":538,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":599,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":538,"cache_read_input_tokens":71308,"cache_creation_input_tokens":599,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":599},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CbnRGvBBbhDofq17CJiws","type":"assistant","uuid":"9a3d27aa-c2e6-4f53-8426-f398d0a82ece","timestamp":"2026-06-06T17:42:46.078Z","userType":"external","entrypoint":"cli","cwd":"/home/xe/Code/xeiaso.net/ircd.rs","sessionId":"49190db7-41f9-426f-9140-ca85ca026e94","version":"2.1.167","gitBranch":"master"}
.claude/sessions/49190db7-41f9-426f-9140-ca85ca026e94.jsonl:70:{"parentUuid":"87ad37fe-c361-455d-a494-8c71e548a8d3","isSidechain":false,"message":{"model":"claude-opus-4-8","id":"msg_01T3HqT9NEWecesYkTh4pNoD","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01SXq4nMebTocPPFWSuqDByn","name":"Bash","input":{"command":"cd /home/xe/Code/xeiaso.net/ircd.rs\ngrep -rn \"define XOPT_REQUIRED\\|define XOPT_NOTIMEOUT\\|define READBUF_SIZE\\|define SCH_AUTH\\|define SCH_LOCAL\\|define FLAGS_GOTID\\|define IsRegisteredUser\\|define SetDoneXAuth\" common/*.h ircd/*.h | head\necho \"--- READBUF_SIZE location ---\"\ngrep -rn \"READBUF_SIZE\" common/*.h ircd/*.h | head\necho \"--- BUFSIZ usage / index func ---\"\ngrep -rn \"register_user\" ircd/s_user_ext.h","description":"Find remaining constants"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":1161,"cache_read_input_tokens":71907,"output_tokens":315,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":1161,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":315,"cache_read_input_tokens":71907,"cache_creation_input_tokens":1161,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":1161},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CbnRHUhXcEmuKEvBuc9Uk","type":"assistant","uuid":"42d342b8-0ef8-4960-8a09-d5e5e506d36e","timestamp":"2026-06-06T17:42:50.384Z","userType":"external","entrypoint":"cli","cwd":"/home/xe/Code/xeiaso.net/ircd.rs","sessionId":"49190db7-41f9-426f-9140-ca85ca026e94","version":"2.1.167","gitBranch":"master"}
.claude/sessions/49190db7-41f9-426f-9140-ca85ca026e94.jsonl:73:{"parentUuid":"e454314c-b077-47cf-8aa9-b07aa8dc9630","isSidechain":false,"message":{"model":"claude-opus-4-8","id":"msg_01YVNjbG5NpZJdyBr3guAGNw","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01PQsB6civoo2T2VsXyQKt3g","name":"Bash","input":{"command":"cd /home/xe/Code/xeiaso.net/ircd.rs\ngrep -rn \"define XOPT_REQUIRED\\|define XOPT_NOTIMEOUT\\|define SCH_AUTH\\|define SCH_LOCAL\\|define FLAGS_GOTID\\|define IsRegisteredUser\" common/*.h | head\necho \"--- check bindgen exposes these consts/funcs ---\"\nB=$(find target -name bindings.rs -path '*ircd-sys*' 2>/dev/null | head -1); echo \"bindings: $B\"\ngrep -E \"XOPT_REQUIRED|XOPT_NOTIMEOUT|XOPT_EARLYPARSE|XOPT_EXTWAIT|SCH_AUTH|SCH_LOCAL|FLAGS_GOTID|EXITC_AREF|READBUF_SIZE|iauth_options|iauth_spawn|iauth_version|pub fn register_user|pub fn start_iauth|pub fn myctime|pub fn inetntop|ipv6string|pub static.*timeofday|pub fn register_user\" \"$B\" 2>/dev/null | head -40","description":"Check bindgen exposure"},"caller":{"type":"direct"}}],"stop_reason":"tool_use","stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":445,"cache_read_input_tokens":73068,"output_tokens":470,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":445,"ephemeral_5m_input_tokens":0},"inference_geo":"not_available","iterations":[{"input_tokens":2,"output_tokens":470,"cache_read_input_tokens":73068,"cache_creation_input_tokens":445,"cache_creation":{"ephemeral_5m_input_tokens":0,"ephemeral_1h_input_tokens":445},"type":"message"}],"speed":"standard"},"diagnostics":null},"requestId":"req_011CbnRHo2bjy7qGfr8omvQZ","type":"assistant","uuid":"860395f0-df3c-4d5a-a7a6-6488ba5bb024","timestamp":"2026-06-06T17:42:56.235Z","userType":"external","entrypoint":"cli","cwd":"/home/xe/Code/xeiaso.net/ircd.rs","sessionId":"49190db7-41f9-426f-9140-ca85ca026e94","version":"2.1.167","gitBranch":"master"}
.claude/sessions/c6b4a4be-e06f-459f-94dd-5b5e8c91fda5.jsonl:262:{"parentUuid":"3d721ecd-cfbb-468e-8e80-72bf8c467bd2","isSidechain":false,"promptId":"b2fcc085-839c-4744-a3d0-03872e08a83e","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01LDoQsHLsidREphzmvaYyad","type":"tool_result","content":"192:#define FLAGS_RESTRICT\t0x0010 /* restricted user */\n194:#define FLAGS_EXEMPT    0x0040 /* user is exempted from k-lines */\n370:#define CFLAG_RESTRICTED\t0x00001\n373:#define CFLAG_KEXEMPT\t\t0x00008\n375:#define CFLAG_FALL\t\t0x00020","is_error":false}]},"uuid":"139cc5be-55da-4015-a1c4-7c92f192a363","timestamp":"2026-06-05T14:57:24.732Z","toolUseResult":{"stdout":"192:#define FLAGS_RESTRICT\t0x0010 /* restricted user */\n194:#define FLAGS_EXEMPT    0x0040 /* user is exempted from k-lines */\n370:#define CFLAG_RESTRICTED\t0x00001\n373:#define CFLAG_KEXEMPT\t\t0x00008\n375:#define CFLAG_FALL\t\t0x00020","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false},"sourceToolAssistantUUID":"3d721ecd-cfbb-468e-8e80-72bf8c467bd2","userType":"external","entrypoint":"cli","cwd":"/home/xe/Code/xeiaso.net/ircd.rs","sessionId":"c6b4a4be-e06f-459f-94dd-5b5e8c91fda5","version":"2.1.165","gitBranch":"master"}
.claude/sessions/8e8e9d99-ffcf-4e19-bf2b-eb05032f9d86.jsonl:75:{"parentUuid":"0cf48a4c-d68d-4d7f-b8fa-a491903c49b9","isSidechain":false,"promptId":"e642c2ef-47cd-477a-ac1f-8f050620576c","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01AJX69XxnGR8rDbZTaErcxt","type":"tool_result","content":"file: ./common/struct_def.h\n=== ConfItem struct fields ===\n20:#define\tHOSTLEN\t\t63\t/* Length of hostname.  Updated to         */\n66:** is not absolutely portable (I have been told), but so far\n106: * status macros.\n108:#define\tIsRegisteredUser(x)\t(((x)->status == STAT_CLIENT || \\\n109:\t\t\t\t (x)->status == STAT_OPER) && (x)->user)\n110:#define\tIsRegistered(x)\t\t((x)->status >= STAT_SERVER || \\\n111:\t\t\t\t (x)->status == STAT_ME)\n112:#define\tIsConnecting(x)\t\t((x)->status == STAT_CONNECTING)\n113:#define\tIsHandshake(x)\t\t((x)->status == STAT_HANDSHAKE)\n114:#define\tIsMe(x)\t\t\t((x)->status == STAT_ME)\n115:#define\tIsUnknown(x)\t\t((x)->status == STAT_UNKNOWN)\n116:#define\tIsServer(x)\t\t((x)->status == STAT_SERVER)\n117:#define\tIsClient(x)\t\t((x)->status == STAT_CLIENT || \\\n118:\t\t\t\t (x)->status == STAT_OPER)\n119:#define\tIsService(x)\t\t((x)->status == STAT_SERVICE && (x)->service)\n121:#define\tSetConnecting(x)\t((x)->status = STAT_CONNECTING)\n122:#define\tSetHandshake(x)\t\t((x)->status = STAT_HANDSHAKE)\n123:#define\tSetMe(x)\t\t((x)->status = STAT_ME)\n124:#define\tSetUnknown(x)\t\t((x)->status = STAT_UNKNOWN)\n125:#define\tSetServer(x)\t\t((x)->status = STAT_SERVER)\n126:#define\tSetClient(x)\t\t((x)->status = IsAnOper((x)) ? STAT_OPER : STAT_CLIENT)\n127:#define\tSetService(x)\t\t((x)->status = STAT_SERVICE)\n150:#define\tFLAGS_HIDDEN\t0x0100000 /* netsplit is behind a hostmask,\n176:#define FLAGS_TLS       0x0200 /* user is on a secure connection port (SSL/TLS) -- mh 2020-04-27 */\n206:\t\t\t\t (x)->status = STAT_OPER)\n208:\t\t\t\t (x)->status = STAT_OPER)\n229:\t\t\t\t (x)->status = STAT_CLIENT)\n231:\t\t\t\t (x)->status = STAT_CLIENT)\n252:#define\tDEBUG_ERROR  1\t/* report_error() and other errors that are found */\n260:#define\tDEBUG_DEBUG  8\t/* anything to do with debugging, ie unimportant :) */\n274:\tu_short\tport;\t\t/* port to send pings to */\n283:\tu_int\tstatus;\t\t/* If CONF_ILLEGAL, delete when no clients */\n285:\tstruct\tIN_ADDR ipnum;\t/* ip number of host field */\n286:\tchar\t*host;\n287:\tchar\t*passwd;\n288:\tchar\t*name;\n289:\tchar\t*name2;\n291:\tchar\t*name3;\n293:\tint\tport;\n297:\ttime_t\thold;\t/* Hold action until this time (calendar time) */\n300:\taClass\t*class;  /* Class of connection */\n302:\tstruct\tConfItem *next;","is_error":false}]},"uuid":"9ff0edab-d1f1-404e-a652-5ed0574b2a0a","timestamp":"2026-06-05T04:00:48.211Z","toolUseResult":{"stdout":"file: ./common/struct_def.h\n=== ConfItem struct fields ===\n20:#define\tHOSTLEN\t\t63\t/* Length of hostname.  Updated to         */\n66:** is not absolutely portable (I have been told), but so far\n106: * status macros.\n108:#define\tIsRegisteredUser(x)\t(((x)->status == STAT_CLIENT || \\\n109:\t\t\t\t (x)->status == STAT_OPER) && (x)->user)\n110:#define\tIsRegistered(x)\t\t((x)->status >= STAT_SERVER || \\\n111:\t\t\t\t (x)->status == STAT_ME)\n112:#define\tIsConnecting(x)\t\t((x)->status == STAT_CONNECTING)\n113:#define\tIsHandshake(x)\t\t((x)->status == STAT_HANDSHAKE)\n114:#define\tIsMe(x)\t\t\t((x)->status == STAT_ME)\n115:#define\tIsUnknown(x)\t\t((x)->status == STAT_UNKNOWN)\n116:#define\tIsServer(x)\t\t((x)->status == STAT_SERVER)\n117:#define\tIsClient(x)\t\t((x)->status == STAT_CLIENT || \\\n118:\t\t\t\t (x)->status == STAT_OPER)\n119:#define\tIsService(x)\t\t((x)->status == STAT_SERVICE && (x)->service)\n121:#define\tSetConnecting(x)\t((x)->status = STAT_CONNECTING)\n122:#define\tSetHandshake(x)\t\t((x)->status = STAT_HANDSHAKE)\n123:#define\tSetMe(x)\t\t((x)->status = STAT_ME)\n124:#define\tSetUnknown(x)\t\t((x)->status = STAT_UNKNOWN)\n125:#define\tSetServer(x)\t\t((x)->status = STAT_SERVER)\n126:#define\tSetClient(x)\t\t((x)->status = IsAnOper((x)) ? STAT_OPER : STAT_CLIENT)\n127:#define\tSetService(x)\t\t((x)->status = STAT_SERVICE)\n150:#define\tFLAGS_HIDDEN\t0x0100000 /* netsplit is behind a hostmask,\n176:#define FLAGS_TLS       0x0200 /* user is on a secure connection port (SSL/TLS) -- mh 2020-04-27 */\n206:\t\t\t\t (x)->status = STAT_OPER)\n208:\t\t\t\t (x)->status = STAT_OPER)\n229:\t\t\t\t (x)->status = STAT_CLIENT)\n231:\t\t\t\t (x)->status = STAT_CLIENT)\n252:#define\tDEBUG_ERROR  1\t/* report_error() and other errors that are found */\n260:#define\tDEBUG_DEBUG  8\t/* anything to do with debugging, ie unimportant :) */\n274:\tu_short\tport;\t\t/* port to send pings to */\n283:\tu_int\tstatus;\t\t/* If CONF_ILLEGAL, delete when no clients */\n285:\tstruct\tIN_ADDR ipnum;\t/* ip number of host field */\n286:\tchar\t*host;\n287:\tchar\t*passwd;\n288:\tchar\t*name;\n289:\tchar\t*name2;\n291:\tchar\t*name3;\n293:\tint\tport;\n297:\ttime_t\thold;\t/* Hold action until this time (calendar time) */\n300:\taClass\t*class;  /* Class of connection */\n302:\tstruct\tConfItem *next;","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false},"sourceToolAssistantUUID":"0cf48a4c-d68d-4d7f-b8fa-a491903c49b9","userType":"external","entrypoint":"cli","cwd":"/home/xe/Code/xeiaso.net/ircd.rs","sessionId":"8e8e9d99-ffcf-4e19-bf2b-eb05032f9d86","version":"2.1.163","gitBranch":"master"}
.claude/sessions/83d912ac-5e1e-4525-89a0-e5166a07c355/subagents/workflows/wf_14f560c3-63f/agent-aee23577a739f1267.jsonl:17:{"parentUuid":"461fbcc1-af00-4c7d-8122-ba9fdddd7ff5","isSidechain":true,"promptId":"0f4a6818-24c2-4d73-8cd5-b20cc55b2869","agentId":"aee23577a739f1267","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01V5wybHnT6fhxNhPz4SL7uv","type":"tool_result","content":"100\t*/\n101\t#define\tBOOT_CONSOLE\t0x001\n102\t#define\tBOOT_QUICK\t0x002\n103\t#define\tBOOT_DEBUG\t0x004\n104\t#define\tBOOT_INETD\t0x008\n105\t#define\tBOOT_TTY\t0x010\n106\t\n107\t#define\tBOOT_AUTODIE\t0x040\n108\t#define\tBOOT_BADTUNE\t0x080\n109\t#define\tBOOT_PROT\t0x100\n110\t#define\tBOOT_STRICTPROT\t0x200\n111\t#define\tBOOT_NOIAUTH\t0x400\n112\t#define\tBOOT_STANDALONE\t0x800\n113\t\n114\ttypedef enum Status {\n115\t\tSTAT_CONNECTING = -4,\n116\t\tSTAT_HANDSHAKE, /* -3 */\n117\t\tSTAT_UNKNOWN,\t/* -2 */\n118\t\tSTAT_ME,\t/* -1 */\n119\t\tSTAT_SERVER,\t/* 0 */\n120\t\tSTAT_CLIENT,\t/* 1 */\n121\t\tSTAT_OPER,\t/* 2 */\n122\t\tSTAT_SERVICE,\t/* 3 */\n123\t\tSTAT_UNREG,\t/* 4 */\n124\t\tSTAT_MAX\t/* 5 -- size of handler[] table we need */\n125\t} Status;\n126\t\n127\t/*\n128\t * status macros.\n129\t */\n130\t#define\tIsRegisteredUser(x)\t(((x)->status == STAT_CLIENT || \\\n131\t\t\t\t\t (x)->status == STAT_OPER) && (x)->user)\n132\t#define\tIsRegistered(x)\t\t((x)->status >= STAT_SERVER || \\\n133\t\t\t\t\t (x)->status == STAT_ME)\n134\t#define\tIsConnecting(x)\t\t((x)->status == STAT_CONNECTING)\n135\t#define\tIsHandshake(x)\t\t((x)->status == STAT_HANDSHAKE)\n136\t#define\tIsMe(x)\t\t\t((x)->status == STAT_ME)\n137\t#define\tIsUnknown(x)\t\t((x)->status == STAT_UNKNOWN)\n138\t#define\tIsServer(x)\t\t((x)->status == STAT_SERVER)\n139\t#define\tIsClient(x)\t\t((x)->status == STAT_CLIENT || \\\n140\t\t\t\t\t (x)->status == STAT_OPER)\n141\t#define\tIsService(x)\t\t((x)->status == STAT_SERVICE && (x)->service)\n142\t\n143\t#define\tSetConnecting(x)\t((x)->status = STAT_CONNECTING)\n144\t#define\tSetHandshake(x)\t\t((x)->status = STAT_HANDSHAKE)\n145\t#define\tSetMe(x)\t\t((x)->status = STAT_ME)\n146\t#define\tSetUnknown(x)\t\t((x)->status = STAT_UNKNOWN)\n147\t#define\tSetServer(x)\t\t((x)->status = STAT_SERVER)\n148\t#define\tSetClient(x)\t\t((x)->status = IsAnOper((x)) ? STAT_OPER : STAT_CLIENT)\n149\t#define\tSetService(x)\t\t((x)->status = STAT_SERVICE)\n150\t\n151\t#define\tFLAGS_PINGSENT\t0x0000001 /* Unreplied ping sent */\n152\t#define\tFLAGS_DEADSOCK\t0x0000002 /* Local socket is dead--Exiting soon */\n153\t#define\tFLAGS_KILLED\t0x0000004 /* Prevents \"QUIT\" from being sent for this */\n154\t#define\tFLAGS_BLOCKED\t0x0000008 /* socket is in blocked condition [unused] */\n155\t#ifdef UNIXPORT\n156\t#define\tFLAGS_UNIX\t0x0000010 /* socket is in the unix domain, not inet */\n157\t#endif\n158\t#define\tFLAGS_CLOSING\t0x0000020 /* set when closing to suppress errors */\n159\t#define\tFLAGS_LISTEN\t0x0000040 /* used to mark clients which we listen() on */\n160\t#define\tFLAGS_XAUTHDONE\t0x0000080 /* iauth is finished with this client */\n161\t#define\tFLAGS_DOINGDNS\t0x0000100 /* client is waiting for a DNS response */\n162\t#define\tFLAGS_AUTH\t0x0000200 /* client is waiting on rfc931 response */\n163\t#define\tFLAGS_WRAUTH\t0x0000400 /* set if we havent writen to ident server */\n164\t#define\tFLAGS_LOCAL\t0x0000800 /* set for local clients */\n165\t#define\tFLAGS_GOTID\t0x0001000 /* successful ident lookup achieved */\n166\t#define\tFLAGS_XAUTH\t0x0002000 /* waiting on external authentication */\n167\t#define\tFLAGS_WXAUTH\t0x0004000 /* same as above, but also prevent parsing */\n168\t#define\tFLAGS_NONL\t0x0008000 /* No \\n in buffer */\n169\t#define\tFLAGS_CBURST\t0x0010000 /* set to mark connection burst being sent */\n170\t#define\tFLAGS_QUIT\t0x0040000 /* QUIT :comment shows it's not a split */\n171\t#define\tFLAGS_SPLIT\t0x0080000 /* client QUITting because of a netsplit */\n172\t#define\tFLAGS_HIDDEN\t0x0100000 /* netsplit is behind a hostmask,\n173\t\t\t\t\t     also used for marking clients in who_find\n174\t\t\t\t\t   */\n175\t#define\tFLAGS_UNKCMD\t0x0200000 /* has sent an unknown command */\n176\t#define\tFLAGS_ZIP\t0x0400000 /* link is zipped */\n177\t#define\tFLAGS_ZIPRQ\t0x0800000 /* zip requested */\n178\t#define\tFLAGS_ZIPSTART\t0x1000000 /* start of zip (ignore any CRLF) */\n179\t#define\tFLAGS_SQUIT\t0x2000000 /* This is set when we send the last\n180\t\t\t\t\t  ** server, so we know we have to send\n181\t\t\t\t\t  ** a SQUIT. */\n182\t#define\tFLAGS_EOB\t0x4000000 /* EOB received */\n183\t#define FLAGS_LISTENINACTIVE 0x8000000 /* Listener does not listen() */\n184\t#ifdef JAPANESE\n185\t#define\tFLAGS_JP\t0x10000000 /* jp version, used both for chans and servs */\n186\t#endif\n187\t\t\n188\t#define\tFLAGS_OPER\t0x0001 /* operator */\n189\t#define\tFLAGS_LOCOP\t0x0002 /* local operator -- SRB */\n190\t#define\tFLAGS_WALLOP\t0x0004 /* send wallops to them */\n191\t#define\tFLAGS_INVISIBLE\t0x0008 /* makes user invisible */\n192\t#define FLAGS_RESTRICT\t0x0010 /* restricted user */\n193\t#define FLAGS_AWAY\t0x0020 /* user is away */\n194\t#define FLAGS_EXEMPT    0x0040 /* user is exempted from k-lines */\n195\t#ifdef XLINE\n196\t#define FLAGS_XLINED\t0x0100\t/* X-lined client */\n197\t#endif\n198\t#define FLAGS_TLS       0x0200 /* user is on a secure connection port (SSL/TLS) -- mh 2020-04-27 */\n199\t#define\tSEND_UMODES\t(FLAGS_INVISIBLE|FLAGS_OPER|FLAGS_WALLOP|FLAGS_AWAY|FLAGS_RESTRICT)\n200\t#define\tALL_UMODES\t(SEND_UMODES|FLAGS_LOCOP)\n201\t\n202\t/*\n203\t * user flags macros.\n204\t */\n205\t#define\tIsOper(x)\t\t((x)->user && (x)->user->flags & FLAGS_OPER)\n206\t#define\tIsLocOp(x)\t\t((x)->user && (x)->user->flags & FLAGS_LOCOP)\n207\t#define\tIsInvisible(x)\t\t((x)->user->flags & FLAGS_INVISIBLE)\n208\t#define IsRestricted(x)         ((x)->user && \\\n209\t\t\t\t\t (x)->user->flags & FLAGS_RESTRICT)\n210\t#define\tIsAnOper(x)\t\t((x)->user && \\\n211\t\t\t\t\t (x)->user->flags & (FLAGS_OPER|FLAGS_LOCOP))\n212\t#define\tIsPerson(x)\t\t((x)->user && IsClient(x))\n213\t#define\tIsPrivileged(x)\t\t(IsServer(x) || IsAnOper(x))\n214\t#define\tSendWallops(x)\t\t((x)->user->flags & FLAGS_WALLOP)\n215\t#ifdef UNIXPORT\n216\t#define\tIsUnixSocket(x)\t\t((x)->flags & FLAGS_UNIX)\n217\t#endif\n218\t#define\tIsListener(x)\t\t((x)->flags & FLAGS_LISTEN)\n219\t#define IsListenerInactive(x)\t((x)->flags & FLAGS_LISTENINACTIVE)\n220\t#define\tIsLocal(x)\t\t(MyConnect(x) && (x)->flags & FLAGS_LOCAL)\n221\t#define\tIsDead(x)\t\t((x)->flags & FLAGS_DEADSOCK)\n222\t#define\tIsBursting(x)\t\t(!((x)->flags & FLAGS_EOB))\n223\t#define IsKlineExempt(x)        ((x)->user && (x)->user->flags & FLAGS_EXEMPT)\n224\t\n225\t#define\tSetDead(x)\t\t((x)->flags |= FLAGS_DEADSOCK)\n226\t#define\tCBurst(x)\t\t((x)->flags & FLAGS_CBURST)\n227\t#define\tSetOper(x)\t\t((x)->user->flags |= FLAGS_OPER, \\\n228\t\t\t\t\t (x)->status = STAT_OPER)\n229\t#define\tSetLocOp(x)\t\t((x)->user->flags |= FLAGS_LOCOP, \\\n230\t\t\t\t\t (x)->status = STAT_OPER)\n231\t#define\tSetInvisible(x)\t\t((x)->user->flags |= FLAGS_INVISIBLE)\n232\t#define SetRestricted(x)\t((x)->user->flags |= FLAGS_RESTRICT)\n233\t#define\tSetWallops(x)\t\t((x)->user->flags |= FLAGS_WALLOP)\n234\t#ifdef UNIXPORT\n235\t#define\tSetUnixSock(x)\t\t((x)->flags |= FLAGS_UNIX)\n236\t#endif\n237\t#define\tSetDNS(x)\t\t((x)->flags |= FLAGS_DOINGDNS)\n238\t#define\tSetDoneXAuth(x)\t\t((x)->flags |= FLAGS_XAUTHDONE)\n239\t#define\tSetEOB(x)\t\t((x)->flags |= FLAGS_EOB)\n240\t#define SetListenerInactive(x)\t((x)->flags |= FLAGS_LISTENINACTIVE)\n241\t#define SetKlineExempt(x)\t((x)->user->flags |= FLAGS_EXEMPT)\n242\t\n243\t#define\tDoingDNS(x)\t\t((x)->flags & FLAGS_DOINGDNS)\n244\t#define\tDoingAuth(x)\t\t((x)->flags & FLAGS_AUTH)\n245\t#define\tDoingXAuth(x)\t\t((x)->flags & FLAGS_XAUTH)\n246\t#define\tWaitingXAuth(x)\t\t((x)->flags & FLAGS_WXAUTH)\n247\t#define\tDoneXAuth(x)\t\t((x)->flags & FLAGS_XAUTHDONE)\n248\t#define\tNoNewLine(x)\t\t((x)->flags & FLAGS_NONL)\n249\t\n250\t#define\tClearOper(x)\t\t((x)->user->flags &= ~FLAGS_OPER, \\\n251\t\t\t\t\t (x)->status = STAT_CLIENT)\n252\t#define\tClearLocOp(x)\t\t((x)->user->flags &= ~FLAGS_LOCOP, \\\n253\t\t\t\t\t (x)->status = STAT_CLIENT)\n254\t#define\tClearInvisible(x)\t((x)->user->flags &= ~FLAGS_INVISIBLE)\n255\t#define ClearRestricted(x)      ((x)->user->flags &= ~FLAGS_RESTRICT)\n256\t#define\tClearWallops(x)\t\t((x)->user->flags &= ~FLAGS_WALLOP)\n257\t#define\tClearDNS(x)\t\t((x)->flags &= ~FLAGS_DOINGDNS)\n258\t#define\tClearAuth(x)\t\t((x)->flags &= ~FLAGS_AUTH)\n259\t#define\tClearXAuth(x)\t\t((x)->flags &= ~FLAGS_XAUTH)\n260\t#define\tClearWXAuth(x)\t\t((x)->flags &= ~FLAGS_WXAUTH)\n261\t#define ClearListenerInactive(x) ((x)->flags &= ~FLAGS_LISTENINACTIVE)\n262\t#ifdef XLINE\n263\t#define IsXlined(x)\t\t((x)->user && (x)->user->flags & FLAGS_XLINED)\n264\t#define SetXlined(x)\t\t((x)->user->flags |= FLAGS_XLINED)\n265\t#define ClearXlined(x)\t\t((x)->user->flags &= ~FLAGS_XLINED)\n266\t#endif\n267\t#define IsTLS(x)        ((x)->user && (x)->user->flags & FLAGS_TLS)\n268\t#define SetTLS(x)       ((x)->user->flags |= FLAGS_TLS)\n269\t\n270\t/*\n271\t * defined debugging levels\n272\t */\n273\t#define\tDEBUG_FATAL  0\n274\t#define\tDEBUG_ERROR  1\t/* report_error() and other errors that are found */\n275\t#define\tDEBUG_READ   2\n276\t#define\tDEBUG_WRITE  2\n277\t#define\tDEBUG_NOTICE 3\n278\t#define\tDEBUG_DNS    4\t/* used by all DNS related routines - a *lot* */\n279\t#define\tDEBUG_INFO   5\t/* general usful info */\n280\t#define\tDEBUG_NUM    6\t/* numerics */\n281\t#define\tDEBUG_SEND   7\t/* everything that is sent out */\n282\t#define\tDEBUG_DEBUG  8\t/* anything to do with debugging, ie unimportant :) */\n283\t#define\tDEBUG_MALLOC 9\t/* malloc/free calls */\n284\t#define\tDEBUG_LIST  10\t/* debug list use */\n285\t#define\tDEBUG_L10   10\n286\t#define\tDEBUG_L11   11\n287\t\n288\t/*\n289\t * defines for curses in client\n290\t */\n291\t#define\tDUMMY_TERM\t0\n292\t#define\tCURSES_TERM\t1\n293\t#define\tTERMCAP_TERM\t2\n294\t\n295\tstruct\tCPing\t{\n296\t\tu_short\tport;\t\t/* port to send pings to */\n297\t\tu_long\trtt;\t\t/* average RTT */\n298\t\tu_long\tping;\n299\t\tu_long\tseq;\t\t/* # sent still in the \"window\" */\n300\t\tu_long\tlseq;\t\t/* sequence # of last sent */\n301\t\tu_long\trecvd;\t\t/* # received still in the \"window\" */\n302\t\tu_long\tlrecvd;\t\t/* # received */\n303\t};\n304\t\n305\tstruct\tConfItem\t{\n306\t\tu_int\tstatus;\t\t/* If CONF_ILLEGAL, delete when no clients */\n307\t\tint\tclients;\t/* Number of *LOCAL* clients using this */\n308\t\tstruct\tIN_ADDR ipnum;\t/* ip number of host field */\n309\t\tchar\t*host;\n310\t\tchar\t*passwd;\n311\t\tchar\t*name;\n312\t\tchar\t*name2;\n313\t#ifdef XLINE\n314\t\tchar\t*name3;\n315\t#endif\n316\t\tint\tport;\n317\t\tlong\tflags;\t\t/* I-line flags */\n318\t\tint\tpref;\t\t/* preference value */\n319\t\tstruct\tCPing\t*ping;\n320\t\ttime_t\thold;\t/* Hold action until this time (calendar time) */\n321\t\tchar\t*source_ip;\n322\t#ifndef VMSP\n323\t\taClass\t*class;  /* Class of connection */\n324\t#endif\n325\t\tstruct\tConfItem *next;\n326\t};\n327\t\n328\tstruct\tListItem\t{\n329\t\tchar\t*nick;\n330\t\tchar\t*user;\n331\t\tchar\t*host;\n332\t};\n333\t\n334\t/* these define configuration lines (A:, M:, I:, K:, etc.) */\n335\t#define\tCONF_ILLEGAL\t\t0x80000000\n336\t#define\tCONF_MATCH\t\t0x40000000\n337\t#define\tCONF_QUARANTINED_SERVER\t0x000001\n338\t#define\tCONF_CLIENT\t\t0x000002\n339\t\n340\t#define\tCONF_CONNECT_SERVER\t0x000008\n341\t#define\tCONF_NOCONNECT_SERVER\t0x000010\n342\t#define\tCONF_ZCONNECT_SERVER\t0x000020\n343\t\n344\t#define\tCONF_OPERATOR\t\t0x000080\n345\t#define\tCONF_ME\t\t\t0x000100\n346\t#define\tCONF_KILL\t\t0x000200\n347\t#define\tCONF_ADMIN\t\t0x000400\n348\t#define\tCONF_CLASS\t\t0x001000\n349\t#define\tCONF_SERVICE\t\t0x002000\n350\t#define\tCONF_LEAF\t\t0x004000\n351\t#define\tCONF_LISTEN_PORT\t0x008000\n352\t#define\tCONF_HUB\t\t0x010000\n353\t#define\tCONF_VER\t\t0x020000\n354\t#define\tCONF_BOUNCE\t\t0x040000\n355\t#define\tCONF_OTHERKILL\t\t0x080000\n356\t#define\tCONF_DENY\t\t0x100000\n357\t#ifdef TKLINE\n358\t#define\tCONF_TKILL\t\t0x200000\n359\t#define\tCONF_TOTHERKILL\t\t0x400000\n360\t#endif\n361\t#ifdef XLINE\n362\t#define CONF_XLINE\t\t0x800000\n363\t#endif\n364\t#define\tCONF_OPS\t\tCONF_OPERATOR\n365\t#define\tCONF_SERVER_MASK\t(CONF_CONNECT_SERVER | CONF_NOCONNECT_SERVER |\\\n366\t\t\t\t\t CONF_ZCONNECT_SERVER)\n367\t#define\tCONF_CLIENT_MASK\t(CONF_CLIENT | CONF_SERVICE | CONF_OPS | \\\n368\t\t\t\t\t CONF_SERVER_MASK)\n369\t\n370\t#define CFLAG_RESTRICTED\t0x00001\n371\t#define CFLAG_RNODNS\t\t0x00002\n372\t#define CFLAG_RNOIDENT\t\t0x00004\n373\t#define CFLAG_KEXEMPT\t\t0x00008\n374\t#define CFLAG_NORESOLVE\t\t0x00010\n375\t#define CFLAG_FALL\t\t0x00020\n376\t#define CFLAG_NORESOLVEMATCH\t0x00040\n377\t#ifdef XLINE\n378\t#define CFLAG_XEXEMPT\t\t0x00080\n379\t#endif\n380\t\n381\t#define IsConfRestricted(x)\t((x)->flags & CFLAG_RESTRICTED)\n382\t#define IsConfRNoDNS(x)\t\t((x)->flags & CFLAG_RNODNS)\n383\t#define IsConfRNoIdent(x)\t((x)->flags & CFLAG_RNOIDENT)\n384\t#define IsConfKlineExempt(x)\t((x)->flags & CFLAG_KEXEMPT)\n385\t#define IsConfNoResolve(x)\t((x)->flags & CFLAG_NORESOLVE)\n386\t#define IsConfNoResolveMatch(x)\t((x)->flags & CFLAG_NORESOLVEMATCH)\n387\t#define IsConfFallThrough(x)\t((x)->flags & CFLAG_FALL)\n388\t#ifdef XLINE\n389\t#define IsConfXlineExempt(x)\t((x)->flags & CFLAG_XEXEMPT)\n390\t#endif\n391\t\n392\t#define PFLAG_DELAYED\t\t0x00001\n393\t#define PFLAG_SERVERONLY\t0x00002\n394\t#define PFLAG_TLS           0x00004\n395\t\n396\t#define IsConfDelayed(x)\t((x)->flags & PFLAG_DELAYED)\n397\t#define IsConfServeronly(x)\t((x)->flags & PFLAG_SERVERONLY)\n398\t#define IsConfTLS(x)        ((x)->flags & PFLAG_TLS)\n399\t"}]},"uuid":"5028b915-b1eb-4ed0-a0ed-ea2114b040db","timestamp":"2026-06-01T23:56:50.874Z","sourceToolAssistantUUID":"461fbcc1-af00-4c7d-8122-ba9fdddd7ff5","userType":"external","entrypoint":"cli","cwd":"/home/xe/code/xeiaso.net/ircd.rs","sessionId":"83d912ac-5e1e-4525-89a0-e5166a07c355","version":"2.1.160","gitBranch":"master","slug":"i-would-like-to-humming-curry"}
.claude/sessions/4a1dfdd3-50fa-443c-bb6b-cf4917447b9c.jsonl:199:{"parentUuid":"20e3d5a9-ff0b-4a25-bf2d-eaa6ab5fa917","isSidechain":false,"promptId":"2cc43181-a24f-4376-a2f9-a715c5b4bcb3","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01PxP7xCkGRszAzdjkrVpD9F","type":"tool_result","content":"=== anUser struct ===\n462:\tchar\tusername[USERLEN+1];\n463:\tchar\tuid[UIDLEN+1];\n464:\tchar\thost[HOSTLEN+1];\n468:\tstruct User *hhnext;\t/* next entry in hostname hash */\n469:\tstruct User *iphnext;\t/* next entry in IP hash */\n528:\tchar\tusername[USERLEN+1]; /* username here now for auth stuff */\n=== macros: IsAnOper IsAnonymous IsMember SecretChannel ShowChannel IsInvisible IsTLS ShowChannel CHFL_ has_voice IsChannelName PubChannel HiddenChannel ===\n193:#define FLAGS_AWAY\t0x0020 /* user is away */\n267:#define IsTLS(x)        ((x)->user && (x)->user->flags & FLAGS_TLS)","is_error":false}]},"uuid":"2016a096-5212-40d4-8a86-e5262cf206f0","timestamp":"2026-06-03T01:25:46.387Z","toolUseResult":{"stdout":"=== anUser struct ===\n462:\tchar\tusername[USERLEN+1];\n463:\tchar\tuid[UIDLEN+1];\n464:\tchar\thost[HOSTLEN+1];\n468:\tstruct User *hhnext;\t/* next entry in hostname hash */\n469:\tstruct User *iphnext;\t/* next entry in IP hash */\n528:\tchar\tusername[USERLEN+1]; /* username here now for auth stuff */\n=== macros: IsAnOper IsAnonymous IsMember SecretChannel ShowChannel IsInvisible IsTLS ShowChannel CHFL_ has_voice IsChannelName PubChannel HiddenChannel ===\n193:#define FLAGS_AWAY\t0x0020 /* user is away */\n267:#define IsTLS(x)        ((x)->user && (x)->user->flags & FLAGS_TLS)","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false},"sourceToolAssistantUUID":"20e3d5a9-ff0b-4a25-bf2d-eaa6ab5fa917","userType":"external","entrypoint":"cli","cwd":"/home/xe/code/xeiaso.net/ircd.rs","sessionId":"4a1dfdd3-50fa-443c-bb6b-cf4917447b9c","version":"2.1.161","gitBranch":"master"}
.claude/sessions/83d912ac-5e1e-4525-89a0-e5166a07c355/subagents/workflows/wf_14f560c3-63f/agent-a7bcc04ed052736c4.jsonl:24:{"parentUuid":"054eded6-df0c-4316-80b4-f097d256d021","isSidechain":true,"promptId":"0f4a6818-24c2-4d73-8cd5-b20cc55b2869","agentId":"a7bcc04ed052736c4","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01EGxBk7mjMt6eGpyXahjzgP","type":"tool_result","content":"1\t/************************************************************************\n2\t *   IRC - Internet Relay Chat, common/struct_def.h\n3\t *   Copyright (C) 1990 Jarkko Oikarinen and\n4\t *                      University of Oulu, Computing Center\n5\t *\n6\t *   This program is free software; you can redistribute it and/or modify\n7\t *   it under the terms of the GNU General Public License as published by\n8\t *   the Free Software Foundation; either version 1, or (at your option)\n9\t *   any later version.\n10\t *\n11\t *   This program is distributed in the hope that it will be useful,\n12\t *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n13\t *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n14\t *   GNU General Public License for more details.\n15\t *\n16\t *   You should have received a copy of the GNU General Public License\n17\t *   along with this program; if not, write to the Free Software\n18\t *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n19\t *\n20\t *   $Id: struct_def.h,v 1.152 2011/01/20 14:26:56 bif Exp $\n21\t */\n22\t\n23\ttypedef\tstruct\tConfItem aConfItem;\n24\ttypedef\tstruct\tListItem aListItem;\n25\ttypedef\tstruct \tClient\taClient;\n26\ttypedef\tstruct\tChannel\taChannel;\n27\ttypedef\tstruct\tUser\tanUser;\n28\ttypedef\tstruct\tServer\taServer;\n29\ttypedef\tstruct\tService\taService;\n30\ttypedef\tstruct\tSLink\tLink;\n31\ttypedef\tstruct\tinvSLink\tinvLink;\n32\ttypedef\tstruct\tSMode\tMode;\n33\ttypedef\tstruct\tfdarray\tFdAry;\n34\ttypedef\tstruct\tCPing\taCPing;\n35\ttypedef\tstruct\tZdata\taZdata;\n36\ttypedef struct        LineItem aMotd;\n37\t#if defined(USE_IAUTH)\n38\ttypedef struct        LineItem aExtCf;\n39\ttypedef struct        LineItem aExtData;\n40\t#endif\n41\t\n42\t#define\tHOSTLEN\t\t63\t/* Length of hostname.  Updated to         */\n43\t\t\t\t\t/* comply with RFC1123                     */\n44\t\n45\t#if (INET6_ADDRSTRLEN > HOSTLEN)\n46\t#error HOSTLEN must not be smaller than INET6_ADDRSTRLEN\n47\t#endif\n48\t\n49\t#define\tNICKLEN\t\t15\t/* Must be the same network-wide. */\n50\t#define UIDLEN\t\t9\t/* must not be bigger than NICKLEN --Beeth */\n51\t#define\tUSERLEN\t\t10\n52\t#define\tREALLEN\t \t50\n53\t#define\tTOPICLEN\t255\n54\t#define\tCHANNELLEN\t50\n55\t#define\tPASSWDLEN \t20\n56\t#define\tKEYLEN\t\t23\n57\t#define\tBUFSIZE\t\t512\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n58\t#define\tMAXRECIPIENTS \t20\n59\t#define\tMAXBANS\t\t64\n60\t#define\tMAXBANLENGTH\t2048\n61\t#define\tBANLEN\t\t(USERLEN + NICKLEN + HOSTLEN + 3)\n62\t#define MAXPENALTY\t10\n63\t#define\tCHIDLEN\t\t5\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n64\t#define\tSIDLEN\t\t4\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n65\t#define\tMAXMODEPARAMS\t3\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n66\t#define\tDELAYCHASETIMELIMIT\t1800\t/* WARNING: *DONT* CHANGE THIS!!!! */\n67\t#define\tLDELAYCHASETIMELIMIT\t5400\t/* WARNING: *DONT* CHANGE THIS!!!! */\n68\t\n69\t#define\tREADBUF_SIZE\t16384\t/* used in s_bsd.c *AND* s_zip.c ! */\n70\t \n71\t/*\n72\t * Make up some numbers which should reflect average leaf server connect\n73\t * queue max size.\n74\t * queue=(<# of channels> * <channel size> + <user size> * <# of users>) * 2\n75\t * pool=<queue per client> * <avg. # of clients having data in queue>\n76\t */\n77\t#define\tQUEUELEN\t(((MAXCONNECTIONS / 10) * (CHANNELLEN + BANLEN + 16) +\\\n78\t\t\t\t  (HOSTLEN * 4 + REALLEN + NICKLEN + USERLEN + 24) *\\\n79\t\t\t\t  (MAXCONNECTIONS / 2)) * 2)\n80\t\n81\t#define\tBUFFERPOOL\t(DBUFSIZ * MAXCONNECTIONS * 2) + \\\n82\t\t\t\t(QUEUELEN * MAXSERVERS)\n83\t\n84\t#define\tUSERHOST_REPLYLEN\t(NICKLEN+HOSTLEN+USERLEN+5)\n85\t\n86\t/*\n87\t** 'offsetof' is defined in ANSI-C. The following definition\n88\t** is not absolutely portable (I have been told), but so far\n89\t** it has worked on all machines I have needed it. The type\n90\t** should be size_t but...  --msa\n91\t*/\n92\t#ifndef offsetof\n93\t#define\toffsetof(t,m) (int)((&((t *)0L)->m))\n94\t#endif\n95\t\n96\t#define\telementsof(x) (sizeof(x)/sizeof(x[0]))\n97\t\n98\t/*\n99\t** flags for bootup options (command line flags)\n100\t*/\n101\t#define\tBOOT_CONSOLE\t0x001\n102\t#define\tBOOT_QUICK\t0x002\n103\t#define\tBOOT_DEBUG\t0x004\n104\t#define\tBOOT_INETD\t0x008\n105\t#define\tBOOT_TTY\t0x010\n106\t\n107\t#define\tBOOT_AUTODIE\t0x040\n108\t#define\tBOOT_BADTUNE\t0x080\n109\t#define\tBOOT_PROT\t0x100\n110\t#define\tBOOT_STRICTPROT\t0x200\n111\t#define\tBOOT_NOIAUTH\t0x400\n112\t#define\tBOOT_STANDALONE\t0x800\n113\t\n114\ttypedef enum Status {\n115\t\tSTAT_CONNECTING = -4,\n116\t\tSTAT_HANDSHAKE, /* -3 */\n117\t\tSTAT_UNKNOWN,\t/* -2 */\n118\t\tSTAT_ME,\t/* -1 */\n119\t\tSTAT_SERVER,\t/* 0 */\n120\t\tSTAT_CLIENT,\t/* 1 */\n121\t\tSTAT_OPER,\t/* 2 */\n122\t\tSTAT_SERVICE,\t/* 3 */\n123\t\tSTAT_UNREG,\t/* 4 */\n124\t\tSTAT_MAX\t/* 5 -- size of handler[] table we need */\n125\t} Status;\n126\t\n127\t/*\n128\t * status macros.\n129\t */\n130\t#define\tIsRegisteredUser(x)\t(((x)->status == STAT_CLIENT || \\\n131\t\t\t\t\t (x)->status == STAT_OPER) && (x)->user)\n132\t#define\tIsRegistered(x)\t\t((x)->status >= STAT_SERVER || \\\n133\t\t\t\t\t (x)->status == STAT_ME)\n134\t#define\tIsConnecting(x)\t\t((x)->status == STAT_CONNECTING)\n135\t#define\tIsHandshake(x)\t\t((x)->status == STAT_HANDSHAKE)\n136\t#define\tIsMe(x)\t\t\t((x)->status == STAT_ME)\n137\t#define\tIsUnknown(x)\t\t((x)->status == STAT_UNKNOWN)\n138\t#define\tIsServer(x)\t\t((x)->status == STAT_SERVER)\n139\t#define\tIsClient(x)\t\t((x)->status == STAT_CLIENT || \\\n140\t\t\t\t\t (x)->status == STAT_OPER)\n141\t#define\tIsService(x)\t\t((x)->status == STAT_SERVICE && (x)->service)\n142\t\n143\t#define\tSetConnecting(x)\t((x)->status = STAT_CONNECTING)\n144\t#define\tSetHandshake(x)\t\t((x)->status = STAT_HANDSHAKE)\n145\t#define\tSetMe(x)\t\t((x)->status = STAT_ME)\n146\t#define\tSetUnknown(x)\t\t((x)->status = STAT_UNKNOWN)\n147\t#define\tSetServer(x)\t\t((x)->status = STAT_SERVER)\n148\t#define\tSetClient(x)\t\t((x)->status = IsAnOper((x)) ? STAT_OPER : STAT_CLIENT)\n149\t#define\tSetService(x)\t\t((x)->status = STAT_SERVICE)\n150\t\n151\t#define\tFLAGS_PINGSENT\t0x0000001 /* Unreplied ping sent */\n152\t#define\tFLAGS_DEADSOCK\t0x0000002 /* Local socket is dead--Exiting soon */\n153\t#define\tFLAGS_KILLED\t0x0000004 /* Prevents \"QUIT\" from being sent for this */\n154\t#define\tFLAGS_BLOCKED\t0x0000008 /* socket is in blocked condition [unused] */\n155\t#ifdef UNIXPORT\n156\t#define\tFLAGS_UNIX\t0x0000010 /* socket is in the unix domain, not inet */\n157\t#endif\n158\t#define\tFLAGS_CLOSING\t0x0000020 /* set when closing to suppress errors */\n159\t#define\tFLAGS_LISTEN\t0x0000040 /* used to mark clients which we listen() on */\n160\t#define\tFLAGS_XAUTHDONE\t0x0000080 /* iauth is finished with this client */\n161\t#define\tFLAGS_DOINGDNS\t0x0000100 /* client is waiting for a DNS response */\n162\t#define\tFLAGS_AUTH\t0x0000200 /* client is waiting on rfc931 response */\n163\t#define\tFLAGS_WRAUTH\t0x0000400 /* set if we havent writen to ident server */\n164\t#define\tFLAGS_LOCAL\t0x0000800 /* set for local clients */\n165\t#define\tFLAGS_GOTID\t0x0001000 /* successful ident lookup achieved */\n166\t#define\tFLAGS_XAUTH\t0x0002000 /* waiting on external authentication */\n167\t#define\tFLAGS_WXAUTH\t0x0004000 /* same as above, but also prevent parsing */\n168\t#define\tFLAGS_NONL\t0x0008000 /* No \\n in buffer */\n169\t#define\tFLAGS_CBURST\t0x0010000 /* set to mark connection burst being sent */\n170\t#define\tFLAGS_QUIT\t0x0040000 /* QUIT :comment shows it's not a split */\n171\t#define\tFLAGS_SPLIT\t0x0080000 /* client QUITting because of a netsplit */\n172\t#define\tFLAGS_HIDDEN\t0x0100000 /* netsplit is behind a hostmask,\n173\t\t\t\t\t     also used for marking clients in who_find\n174\t\t\t\t\t   */\n175\t#define\tFLAGS_UNKCMD\t0x0200000 /* has sent an unknown command */\n176\t#define\tFLAGS_ZIP\t0x0400000 /* link is zipped */\n177\t#define\tFLAGS_ZIPRQ\t0x0800000 /* zip requested */\n178\t#define\tFLAGS_ZIPSTART\t0x1000000 /* start of zip (ignore any CRLF) */\n179\t#define\tFLAGS_SQUIT\t0x2000000 /* This is set when we send the last\n180\t\t\t\t\t  ** server, so we know we have to send\n181\t\t\t\t\t  ** a SQUIT. */\n182\t#define\tFLAGS_EOB\t0x4000000 /* EOB received */\n183\t#define FLAGS_LISTENINACTIVE 0x8000000 /* Listener does not listen() */\n184\t#ifdef JAPANESE\n185\t#define\tFLAGS_JP\t0x10000000 /* jp version, used both for chans and servs */\n186\t#endif\n187\t\t\n188\t#define\tFLAGS_OPER\t0x0001 /* operator */\n189\t#define\tFLAGS_LOCOP\t0x0002 /* local operator -- SRB */\n190\t#define\tFLAGS_WALLOP\t0x0004 /* send wallops to them */\n191\t#define\tFLAGS_INVISIBLE\t0x0008 /* makes user invisible */\n192\t#define FLAGS_RESTRICT\t0x0010 /* restricted user */\n193\t#define FLAGS_AWAY\t0x0020 /* user is away */\n194\t#define FLAGS_EXEMPT    0x0040 /* user is exempted from k-lines */\n195\t#ifdef XLINE\n196\t#define FLAGS_XLINED\t0x0100\t/* X-lined client */\n197\t#endif\n198\t#define FLAGS_TLS       0x0200 /* user is on a secure connection port (SSL/TLS) -- mh 2020-04-27 */\n199\t#define\tSEND_UMODES\t(FLAGS_INVISIBLE|FLAGS_OPER|FLAGS_WALLOP|FLAGS_AWAY|FLAGS_RESTRICT)\n200\t#define\tALL_UMODES\t(SEND_UMODES|FLAGS_LOCOP)\n201\t\n202\t/*\n203\t * user flags macros.\n204\t */\n205\t#define\tIsOper(x)\t\t((x)->user && (x)->user->flags & FLAGS_OPER)\n206\t#define\tIsLocOp(x)\t\t((x)->user && (x)->user->flags & FLAGS_LOCOP)\n207\t#define\tIsInvisible(x)\t\t((x)->user->flags & FLAGS_INVISIBLE)\n208\t#define IsRestricted(x)         ((x)->user && \\\n209\t\t\t\t\t (x)->user->flags & FLAGS_RESTRICT)\n210\t#define\tIsAnOper(x)\t\t((x)->user && \\\n211\t\t\t\t\t (x)->user->flags & (FLAGS_OPER|FLAGS_LOCOP))\n212\t#define\tIsPerson(x)\t\t((x)->user && IsClient(x))\n213\t#define\tIsPrivileged(x)\t\t(IsServer(x) || IsAnOper(x))\n214\t#define\tSendWallops(x)\t\t((x)->user->flags & FLAGS_WALLOP)\n215\t#ifdef UNIXPORT\n216\t#define\tIsUnixSocket(x)\t\t((x)->flags & FLAGS_UNIX)\n217\t#endif\n218\t#define\tIsListener(x)\t\t((x)->flags & FLAGS_LISTEN)\n219\t#define IsListenerInactive(x)\t((x)->flags & FLAGS_LISTENINACTIVE)\n220\t#define\tIsLocal(x)\t\t(MyConnect(x) && (x)->flags & FLAGS_LOCAL)\n221\t#define\tIsDead(x)\t\t((x)->flags & FLAGS_DEADSOCK)\n222\t#define\tIsBursting(x)\t\t(!((x)->flags & FLAGS_EOB))\n223\t#define IsKlineExempt(x)        ((x)->user && (x)->user->flags & FLAGS_EXEMPT)\n224\t\n225\t#define\tSetDead(x)\t\t((x)->flags |= FLAGS_DEADSOCK)\n226\t#define\tCBurst(x)\t\t((x)->flags & FLAGS_CBURST)\n227\t#define\tSetOper(x)\t\t((x)->user->flags |= FLAGS_OPER, \\\n228\t\t\t\t\t (x)->status = STAT_OPER)\n229\t#define\tSetLocOp(x)\t\t((x)->user->flags |= FLAGS_LOCOP, \\\n230\t\t\t\t\t (x)->status = STAT_OPER)\n231\t#define\tSetInvisible(x)\t\t((x)->user->flags |= FLAGS_INVISIBLE)\n232\t#define SetRestricted(x)\t((x)->user->flags |= FLAGS_RESTRICT)\n233\t#define\tSetWallops(x)\t\t((x)->user->flags |= FLAGS_WALLOP)\n234\t#ifdef UNIXPORT\n235\t#define\tSetUnixSock(x)\t\t((x)->flags |= FLAGS_UNIX)\n236\t#endif\n237\t#define\tSetDNS(x)\t\t((x)->flags |= FLAGS_DOINGDNS)\n238\t#define\tSetDoneXAuth(x)\t\t((x)->flags |= FLAGS_XAUTHDONE)\n239\t#define\tSetEOB(x)\t\t((x)->flags |= FLAGS_EOB)\n240\t#define SetListenerInactive(x)\t((x)->flags |= FLAGS_LISTENINACTIVE)\n241\t#define SetKlineExempt(x)\t((x)->user->flags |= FLAGS_EXEMPT)\n242\t\n243\t#define\tDoingDNS(x)\t\t((x)->flags & FLAGS_DOINGDNS)\n244\t#define\tDoingAuth(x)\t\t((x)->flags & FLAGS_AUTH)\n245\t#define\tDoingXAuth(x)\t\t((x)->flags & FLAGS_XAUTH)\n246\t#define\tWaitingXAuth(x)\t\t((x)->flags & FLAGS_WXAUTH)\n247\t#define\tDoneXAuth(x)\t\t((x)->flags & FLAGS_XAUTHDONE)\n248\t#define\tNoNewLine(x)\t\t((x)->flags & FLAGS_NONL)\n249\t\n250\t#define\tClearOper(x)\t\t((x)->user->flags &= ~FLAGS_OPER, \\\n251\t\t\t\t\t (x)->status = STAT_CLIENT)\n252\t#define\tClearLocOp(x)\t\t((x)->user->flags &= ~FLAGS_LOCOP, \\\n253\t\t\t\t\t (x)->status = STAT_CLIENT)\n254\t#define\tClearInvisible(x)\t((x)->user->flags &= ~FLAGS_INVISIBLE)\n255\t#define ClearRestricted(x)      ((x)->user->flags &= ~FLAGS_RESTRICT)\n256\t#define\tClearWallops(x)\t\t((x)->user->flags &= ~FLAGS_WALLOP)\n257\t#define\tClearDNS(x)\t\t((x)->flags &= ~FLAGS_DOINGDNS)\n258\t#define\tClearAuth(x)\t\t((x)->flags &= ~FLAGS_AUTH)\n259\t#define\tClearXAuth(x)\t\t((x)->flags &= ~FLAGS_XAUTH)\n260\t#define\tClearWXAuth(x)\t\t((x)->flags &= ~FLAGS_WXAUTH)\n261\t#define ClearListenerInactive(x) ((x)->flags &= ~FLAGS_LISTENINACTIVE)\n262\t#ifdef XLINE\n263\t#define IsXlined(x)\t\t((x)->user && (x)->user->flags & FLAGS_XLINED)\n264\t#define SetXlined(x)\t\t((x)->user->flags |= FLAGS_XLINED)\n265\t#define ClearXlined(x)\t\t((x)->user->flags &= ~FLAGS_XLINED)\n266\t#endif\n267\t#define IsTLS(x)        ((x)->user && (x)->user->flags & FLAGS_TLS)\n268\t#define SetTLS(x)       ((x)->user->flags |= FLAGS_TLS)\n269\t\n270\t/*\n271\t * defined debugging levels\n272\t */\n273\t#define\tDEBUG_FATAL  0\n274\t#define\tDEBUG_ERROR  1\t/* report_error() and other errors that are found */\n275\t#define\tDEBUG_READ   2\n276\t#define\tDEBUG_WRITE  2\n277\t#define\tDEBUG_NOTICE 3\n278\t#define\tDEBUG_DNS    4\t/* used by all DNS related routines - a *lot* */\n279\t#define\tDEBUG_INFO   5\t/* general usful info */\n280\t#define\tDEBUG_NUM    6\t/* numerics */\n281\t#define\tDEBUG_SEND   7\t/* everything that is sent out */\n282\t#define\tDEBUG_DEBUG  8\t/* anything to do with debugging, ie unimportant :) */\n283\t#define\tDEBUG_MALLOC 9\t/* malloc/free calls */\n284\t#define\tDEBUG_LIST  10\t/* debug list use */\n285\t#define\tDEBUG_L10   10\n286\t#define\tDEBUG_L11   11\n287\t\n288\t/*\n289\t * defines for curses in client\n290\t */\n291\t#define\tDUMMY_TERM\t0\n292\t#define\tCURSES_TERM\t1\n293\t#define\tTERMCAP_TERM\t2\n294\t\n295\tstruct\tCPing\t{\n296\t\tu_short\tport;\t\t/* port to send pings to */\n297\t\tu_long\trtt;\t\t/* average RTT */\n298\t\tu_long\tping;\n299\t\tu_long\tseq;\t\t/* # sent still in the \"window\" */\n300\t\tu_long\tlseq;\t\t/* sequence # of last sent */"}]},"uuid":"8bd85450-5ec6-4276-8081-d839cbbc960c","timestamp":"2026-06-01T23:55:35.750Z","sourceToolAssistantUUID":"054eded6-df0c-4316-80b4-f097d256d021","userType":"external","entrypoint":"cli","cwd":"/home/xe/code/xeiaso.net/ircd.rs","sessionId":"83d912ac-5e1e-4525-89a0-e5166a07c355","version":"2.1.160","gitBranch":"master","slug":"i-would-like-to-humming-curry"}
.claude/sessions/83d912ac-5e1e-4525-89a0-e5166a07c355/subagents/workflows/wf_14f560c3-63f/agent-a3038e5743a148167.jsonl:20:{"parentUuid":"f6853a60-fc7b-4d55-bfb9-bd0703456619","isSidechain":true,"promptId":"0f4a6818-24c2-4d73-8cd5-b20cc55b2869","agentId":"a3038e5743a148167","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Uz6iBRZ3N16U4YaBmPbpYA","type":"tool_result","content":"1\t/************************************************************************\n2\t *   IRC - Internet Relay Chat, common/struct_def.h\n3\t *   Copyright (C) 1990 Jarkko Oikarinen and\n4\t *                      University of Oulu, Computing Center\n5\t *\n6\t *   This program is free software; you can redistribute it and/or modify\n7\t *   it under the terms of the GNU General Public License as published by\n8\t *   the Free Software Foundation; either version 1, or (at your option)\n9\t *   any later version.\n10\t *\n11\t *   This program is distributed in the hope that it will be useful,\n12\t *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n13\t *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n14\t *   GNU General Public License for more details.\n15\t *\n16\t *   You should have received a copy of the GNU General Public License\n17\t *   along with this program; if not, write to the Free Software\n18\t *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n19\t *\n20\t *   $Id: struct_def.h,v 1.152 2011/01/20 14:26:56 bif Exp $\n21\t */\n22\t\n23\ttypedef\tstruct\tConfItem aConfItem;\n24\ttypedef\tstruct\tListItem aListItem;\n25\ttypedef\tstruct \tClient\taClient;\n26\ttypedef\tstruct\tChannel\taChannel;\n27\ttypedef\tstruct\tUser\tanUser;\n28\ttypedef\tstruct\tServer\taServer;\n29\ttypedef\tstruct\tService\taService;\n30\ttypedef\tstruct\tSLink\tLink;\n31\ttypedef\tstruct\tinvSLink\tinvLink;\n32\ttypedef\tstruct\tSMode\tMode;\n33\ttypedef\tstruct\tfdarray\tFdAry;\n34\ttypedef\tstruct\tCPing\taCPing;\n35\ttypedef\tstruct\tZdata\taZdata;\n36\ttypedef struct        LineItem aMotd;\n37\t#if defined(USE_IAUTH)\n38\ttypedef struct        LineItem aExtCf;\n39\ttypedef struct        LineItem aExtData;\n40\t#endif\n41\t\n42\t#define\tHOSTLEN\t\t63\t/* Length of hostname.  Updated to         */\n43\t\t\t\t\t/* comply with RFC1123                     */\n44\t\n45\t#if (INET6_ADDRSTRLEN > HOSTLEN)\n46\t#error HOSTLEN must not be smaller than INET6_ADDRSTRLEN\n47\t#endif\n48\t\n49\t#define\tNICKLEN\t\t15\t/* Must be the same network-wide. */\n50\t#define UIDLEN\t\t9\t/* must not be bigger than NICKLEN --Beeth */\n51\t#define\tUSERLEN\t\t10\n52\t#define\tREALLEN\t \t50\n53\t#define\tTOPICLEN\t255\n54\t#define\tCHANNELLEN\t50\n55\t#define\tPASSWDLEN \t20\n56\t#define\tKEYLEN\t\t23\n57\t#define\tBUFSIZE\t\t512\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n58\t#define\tMAXRECIPIENTS \t20\n59\t#define\tMAXBANS\t\t64\n60\t#define\tMAXBANLENGTH\t2048\n61\t#define\tBANLEN\t\t(USERLEN + NICKLEN + HOSTLEN + 3)\n62\t#define MAXPENALTY\t10\n63\t#define\tCHIDLEN\t\t5\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n64\t#define\tSIDLEN\t\t4\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n65\t#define\tMAXMODEPARAMS\t3\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n66\t#define\tDELAYCHASETIMELIMIT\t1800\t/* WARNING: *DONT* CHANGE THIS!!!! */\n67\t#define\tLDELAYCHASETIMELIMIT\t5400\t/* WARNING: *DONT* CHANGE THIS!!!! */\n68\t\n69\t#define\tREADBUF_SIZE\t16384\t/* used in s_bsd.c *AND* s_zip.c ! */\n70\t \n71\t/*\n72\t * Make up some numbers which should reflect average leaf server connect\n73\t * queue max size.\n74\t * queue=(<# of channels> * <channel size> + <user size> * <# of users>) * 2\n75\t * pool=<queue per client> * <avg. # of clients having data in queue>\n76\t */\n77\t#define\tQUEUELEN\t(((MAXCONNECTIONS / 10) * (CHANNELLEN + BANLEN + 16) +\\\n78\t\t\t\t  (HOSTLEN * 4 + REALLEN + NICKLEN + USERLEN + 24) *\\\n79\t\t\t\t  (MAXCONNECTIONS / 2)) * 2)\n80\t\n81\t#define\tBUFFERPOOL\t(DBUFSIZ * MAXCONNECTIONS * 2) + \\\n82\t\t\t\t(QUEUELEN * MAXSERVERS)\n83\t\n84\t#define\tUSERHOST_REPLYLEN\t(NICKLEN+HOSTLEN+USERLEN+5)\n85\t\n86\t/*\n87\t** 'offsetof' is defined in ANSI-C. The following definition\n88\t** is not absolutely portable (I have been told), but so far\n89\t** it has worked on all machines I have needed it. The type\n90\t** should be size_t but...  --msa\n91\t*/\n92\t#ifndef offsetof\n93\t#define\toffsetof(t,m) (int)((&((t *)0L)->m))\n94\t#endif\n95\t\n96\t#define\telementsof(x) (sizeof(x)/sizeof(x[0]))\n97\t\n98\t/*\n99\t** flags for bootup options (command line flags)\n100\t*/\n101\t#define\tBOOT_CONSOLE\t0x001\n102\t#define\tBOOT_QUICK\t0x002\n103\t#define\tBOOT_DEBUG\t0x004\n104\t#define\tBOOT_INETD\t0x008\n105\t#define\tBOOT_TTY\t0x010\n106\t\n107\t#define\tBOOT_AUTODIE\t0x040\n108\t#define\tBOOT_BADTUNE\t0x080\n109\t#define\tBOOT_PROT\t0x100\n110\t#define\tBOOT_STRICTPROT\t0x200\n111\t#define\tBOOT_NOIAUTH\t0x400\n112\t#define\tBOOT_STANDALONE\t0x800\n113\t\n114\ttypedef enum Status {\n115\t\tSTAT_CONNECTING = -4,\n116\t\tSTAT_HANDSHAKE, /* -3 */\n117\t\tSTAT_UNKNOWN,\t/* -2 */\n118\t\tSTAT_ME,\t/* -1 */\n119\t\tSTAT_SERVER,\t/* 0 */\n120\t\tSTAT_CLIENT,\t/* 1 */\n121\t\tSTAT_OPER,\t/* 2 */\n122\t\tSTAT_SERVICE,\t/* 3 */\n123\t\tSTAT_UNREG,\t/* 4 */\n124\t\tSTAT_MAX\t/* 5 -- size of handler[] table we need */\n125\t} Status;\n126\t\n127\t/*\n128\t * status macros.\n129\t */\n130\t#define\tIsRegisteredUser(x)\t(((x)->status == STAT_CLIENT || \\\n131\t\t\t\t\t (x)->status == STAT_OPER) && (x)->user)\n132\t#define\tIsRegistered(x)\t\t((x)->status >= STAT_SERVER || \\\n133\t\t\t\t\t (x)->status == STAT_ME)\n134\t#define\tIsConnecting(x)\t\t((x)->status == STAT_CONNECTING)\n135\t#define\tIsHandshake(x)\t\t((x)->status == STAT_HANDSHAKE)\n136\t#define\tIsMe(x)\t\t\t((x)->status == STAT_ME)\n137\t#define\tIsUnknown(x)\t\t((x)->status == STAT_UNKNOWN)\n138\t#define\tIsServer(x)\t\t((x)->status == STAT_SERVER)\n139\t#define\tIsClient(x)\t\t((x)->status == STAT_CLIENT || \\\n140\t\t\t\t\t (x)->status == STAT_OPER)\n141\t#define\tIsService(x)\t\t((x)->status == STAT_SERVICE && (x)->service)\n142\t\n143\t#define\tSetConnecting(x)\t((x)->status = STAT_CONNECTING)\n144\t#define\tSetHandshake(x)\t\t((x)->status = STAT_HANDSHAKE)\n145\t#define\tSetMe(x)\t\t((x)->status = STAT_ME)\n146\t#define\tSetUnknown(x)\t\t((x)->status = STAT_UNKNOWN)\n147\t#define\tSetServer(x)\t\t((x)->status = STAT_SERVER)\n148\t#define\tSetClient(x)\t\t((x)->status = IsAnOper((x)) ? STAT_OPER : STAT_CLIENT)\n149\t#define\tSetService(x)\t\t((x)->status = STAT_SERVICE)\n150\t\n151\t#define\tFLAGS_PINGSENT\t0x0000001 /* Unreplied ping sent */\n152\t#define\tFLAGS_DEADSOCK\t0x0000002 /* Local socket is dead--Exiting soon */\n153\t#define\tFLAGS_KILLED\t0x0000004 /* Prevents \"QUIT\" from being sent for this */\n154\t#define\tFLAGS_BLOCKED\t0x0000008 /* socket is in blocked condition [unused] */\n155\t#ifdef UNIXPORT\n156\t#define\tFLAGS_UNIX\t0x0000010 /* socket is in the unix domain, not inet */\n157\t#endif\n158\t#define\tFLAGS_CLOSING\t0x0000020 /* set when closing to suppress errors */\n159\t#define\tFLAGS_LISTEN\t0x0000040 /* used to mark clients which we listen() on */\n160\t#define\tFLAGS_XAUTHDONE\t0x0000080 /* iauth is finished with this client */\n161\t#define\tFLAGS_DOINGDNS\t0x0000100 /* client is waiting for a DNS response */\n162\t#define\tFLAGS_AUTH\t0x0000200 /* client is waiting on rfc931 response */\n163\t#define\tFLAGS_WRAUTH\t0x0000400 /* set if we havent writen to ident server */\n164\t#define\tFLAGS_LOCAL\t0x0000800 /* set for local clients */\n165\t#define\tFLAGS_GOTID\t0x0001000 /* successful ident lookup achieved */\n166\t#define\tFLAGS_XAUTH\t0x0002000 /* waiting on external authentication */\n167\t#define\tFLAGS_WXAUTH\t0x0004000 /* same as above, but also prevent parsing */\n168\t#define\tFLAGS_NONL\t0x0008000 /* No \\n in buffer */\n169\t#define\tFLAGS_CBURST\t0x0010000 /* set to mark connection burst being sent */\n170\t#define\tFLAGS_QUIT\t0x0040000 /* QUIT :comment shows it's not a split */\n171\t#define\tFLAGS_SPLIT\t0x0080000 /* client QUITting because of a netsplit */\n172\t#define\tFLAGS_HIDDEN\t0x0100000 /* netsplit is behind a hostmask,\n173\t\t\t\t\t     also used for marking clients in who_find\n174\t\t\t\t\t   */\n175\t#define\tFLAGS_UNKCMD\t0x0200000 /* has sent an unknown command */\n176\t#define\tFLAGS_ZIP\t0x0400000 /* link is zipped */\n177\t#define\tFLAGS_ZIPRQ\t0x0800000 /* zip requested */\n178\t#define\tFLAGS_ZIPSTART\t0x1000000 /* start of zip (ignore any CRLF) */\n179\t#define\tFLAGS_SQUIT\t0x2000000 /* This is set when we send the last\n180\t\t\t\t\t  ** server, so we know we have to send\n181\t\t\t\t\t  ** a SQUIT. */\n182\t#define\tFLAGS_EOB\t0x4000000 /* EOB received */\n183\t#define FLAGS_LISTENINACTIVE 0x8000000 /* Listener does not listen() */\n184\t#ifdef JAPANESE\n185\t#define\tFLAGS_JP\t0x10000000 /* jp version, used both for chans and servs */\n186\t#endif\n187\t\t\n188\t#define\tFLAGS_OPER\t0x0001 /* operator */\n189\t#define\tFLAGS_LOCOP\t0x0002 /* local operator -- SRB */\n190\t#define\tFLAGS_WALLOP\t0x0004 /* send wallops to them */\n191\t#define\tFLAGS_INVISIBLE\t0x0008 /* makes user invisible */\n192\t#define FLAGS_RESTRICT\t0x0010 /* restricted user */\n193\t#define FLAGS_AWAY\t0x0020 /* user is away */\n194\t#define FLAGS_EXEMPT    0x0040 /* user is exempted from k-lines */\n195\t#ifdef XLINE\n196\t#define FLAGS_XLINED\t0x0100\t/* X-lined client */\n197\t#endif\n198\t#define FLAGS_TLS       0x0200 /* user is on a secure connection port (SSL/TLS) -- mh 2020-04-27 */\n199\t#define\tSEND_UMODES\t(FLAGS_INVISIBLE|FLAGS_OPER|FLAGS_WALLOP|FLAGS_AWAY|FLAGS_RESTRICT)\n200\t#define\tALL_UMODES\t(SEND_UMODES|FLAGS_LOCOP)\n201\t\n202\t/*\n203\t * user flags macros.\n204\t */\n205\t#define\tIsOper(x)\t\t((x)->user && (x)->user->flags & FLAGS_OPER)\n206\t#define\tIsLocOp(x)\t\t((x)->user && (x)->user->flags & FLAGS_LOCOP)\n207\t#define\tIsInvisible(x)\t\t((x)->user->flags & FLAGS_INVISIBLE)\n208\t#define IsRestricted(x)         ((x)->user && \\\n209\t\t\t\t\t (x)->user->flags & FLAGS_RESTRICT)\n210\t#define\tIsAnOper(x)\t\t((x)->user && \\\n211\t\t\t\t\t (x)->user->flags & (FLAGS_OPER|FLAGS_LOCOP))\n212\t#define\tIsPerson(x)\t\t((x)->user && IsClient(x))\n213\t#define\tIsPrivileged(x)\t\t(IsServer(x) || IsAnOper(x))\n214\t#define\tSendWallops(x)\t\t((x)->user->flags & FLAGS_WALLOP)\n215\t#ifdef UNIXPORT\n216\t#define\tIsUnixSocket(x)\t\t((x)->flags & FLAGS_UNIX)\n217\t#endif\n218\t#define\tIsListener(x)\t\t((x)->flags & FLAGS_LISTEN)\n219\t#define IsListenerInactive(x)\t((x)->flags & FLAGS_LISTENINACTIVE)\n220\t#define\tIsLocal(x)\t\t(MyConnect(x) && (x)->flags & FLAGS_LOCAL)\n221\t#define\tIsDead(x)\t\t((x)->flags & FLAGS_DEADSOCK)\n222\t#define\tIsBursting(x)\t\t(!((x)->flags & FLAGS_EOB))\n223\t#define IsKlineExempt(x)        ((x)->user && (x)->user->flags & FLAGS_EXEMPT)\n224\t\n225\t#define\tSetDead(x)\t\t((x)->flags |= FLAGS_DEADSOCK)\n226\t#define\tCBurst(x)\t\t((x)->flags & FLAGS_CBURST)\n227\t#define\tSetOper(x)\t\t((x)->user->flags |= FLAGS_OPER, \\\n228\t\t\t\t\t (x)->status = STAT_OPER)\n229\t#define\tSetLocOp(x)\t\t((x)->user->flags |= FLAGS_LOCOP, \\\n230\t\t\t\t\t (x)->status = STAT_OPER)\n231\t#define\tSetInvisible(x)\t\t((x)->user->flags |= FLAGS_INVISIBLE)\n232\t#define SetRestricted(x)\t((x)->user->flags |= FLAGS_RESTRICT)\n233\t#define\tSetWallops(x)\t\t((x)->user->flags |= FLAGS_WALLOP)\n234\t#ifdef UNIXPORT\n235\t#define\tSetUnixSock(x)\t\t((x)->flags |= FLAGS_UNIX)\n236\t#endif\n237\t#define\tSetDNS(x)\t\t((x)->flags |= FLAGS_DOINGDNS)\n238\t#define\tSetDoneXAuth(x)\t\t((x)->flags |= FLAGS_XAUTHDONE)\n239\t#define\tSetEOB(x)\t\t((x)->flags |= FLAGS_EOB)\n240\t#define SetListenerInactive(x)\t((x)->flags |= FLAGS_LISTENINACTIVE)\n241\t#define SetKlineExempt(x)\t((x)->user->flags |= FLAGS_EXEMPT)\n242\t\n243\t#define\tDoingDNS(x)\t\t((x)->flags & FLAGS_DOINGDNS)\n244\t#define\tDoingAuth(x)\t\t((x)->flags & FLAGS_AUTH)\n245\t#define\tDoingXAuth(x)\t\t((x)->flags & FLAGS_XAUTH)\n246\t#define\tWaitingXAuth(x)\t\t((x)->flags & FLAGS_WXAUTH)\n247\t#define\tDoneXAuth(x)\t\t((x)->flags & FLAGS_XAUTHDONE)\n248\t#define\tNoNewLine(x)\t\t((x)->flags & FLAGS_NONL)\n249\t\n250\t#define\tClearOper(x)\t\t((x)->user->flags &= ~FLAGS_OPER, \\\n251\t\t\t\t\t (x)->status = STAT_CLIENT)\n252\t#define\tClearLocOp(x)\t\t((x)->user->flags &= ~FLAGS_LOCOP, \\\n253\t\t\t\t\t (x)->status = STAT_CLIENT)\n254\t#define\tClearInvisible(x)\t((x)->user->flags &= ~FLAGS_INVISIBLE)\n255\t#define ClearRestricted(x)      ((x)->user->flags &= ~FLAGS_RESTRICT)\n256\t#define\tClearWallops(x)\t\t((x)->user->flags &= ~FLAGS_WALLOP)\n257\t#define\tClearDNS(x)\t\t((x)->flags &= ~FLAGS_DOINGDNS)\n258\t#define\tClearAuth(x)\t\t((x)->flags &= ~FLAGS_AUTH)\n259\t#define\tClearXAuth(x)\t\t((x)->flags &= ~FLAGS_XAUTH)\n260\t#define\tClearWXAuth(x)\t\t((x)->flags &= ~FLAGS_WXAUTH)\n261\t#define ClearListenerInactive(x) ((x)->flags &= ~FLAGS_LISTENINACTIVE)\n262\t#ifdef XLINE\n263\t#define IsXlined(x)\t\t((x)->user && (x)->user->flags & FLAGS_XLINED)\n264\t#define SetXlined(x)\t\t((x)->user->flags |= FLAGS_XLINED)\n265\t#define ClearXlined(x)\t\t((x)->user->flags &= ~FLAGS_XLINED)\n266\t#endif\n267\t#define IsTLS(x)        ((x)->user && (x)->user->flags & FLAGS_TLS)\n268\t#define SetTLS(x)       ((x)->user->flags |= FLAGS_TLS)\n269\t\n270\t/*\n271\t * defined debugging levels\n272\t */\n273\t#define\tDEBUG_FATAL  0\n274\t#define\tDEBUG_ERROR  1\t/* report_error() and other errors that are found */\n275\t#define\tDEBUG_READ   2\n276\t#define\tDEBUG_WRITE  2\n277\t#define\tDEBUG_NOTICE 3\n278\t#define\tDEBUG_DNS    4\t/* used by all DNS related routines - a *lot* */\n279\t#define\tDEBUG_INFO   5\t/* general usful info */\n280\t#define\tDEBUG_NUM    6\t/* numerics */\n281\t#define\tDEBUG_SEND   7\t/* everything that is sent out */\n282\t#define\tDEBUG_DEBUG  8\t/* anything to do with debugging, ie unimportant :) */\n283\t#define\tDEBUG_MALLOC 9\t/* malloc/free calls */\n284\t#define\tDEBUG_LIST  10\t/* debug list use */\n285\t#define\tDEBUG_L10   10\n286\t#define\tDEBUG_L11   11\n287\t\n288\t/*\n289\t * defines for curses in client\n290\t */\n291\t#define\tDUMMY_TERM\t0\n292\t#define\tCURSES_TERM\t1\n293\t#define\tTERMCAP_TERM\t2\n294\t\n295\tstruct\tCPing\t{\n296\t\tu_short\tport;\t\t/* port to send pings to */\n297\t\tu_long\trtt;\t\t/* average RTT */\n298\t\tu_long\tping;\n299\t\tu_long\tseq;\t\t/* # sent still in the \"window\" */\n300\t\tu_long\tlseq;\t\t/* sequence # of last sent */"}]},"uuid":"59e6f62e-769d-4528-81f7-7daf87944bf1","timestamp":"2026-06-01T23:55:36.823Z","sourceToolAssistantUUID":"f6853a60-fc7b-4d55-bfb9-bd0703456619","userType":"external","entrypoint":"cli","cwd":"/home/xe/code/xeiaso.net/ircd.rs","sessionId":"83d912ac-5e1e-4525-89a0-e5166a07c355","version":"2.1.160","gitBranch":"master","slug":"i-would-like-to-humming-curry"}
.claude/sessions/83d912ac-5e1e-4525-89a0-e5166a07c355/subagents/workflows/wf_14f560c3-63f/agent-abd24ff8893347f63.jsonl:19:{"parentUuid":"a21d8307-5559-4c4e-8b52-7e3ff260b6aa","isSidechain":true,"promptId":"0f4a6818-24c2-4d73-8cd5-b20cc55b2869","agentId":"abd24ff8893347f63","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_014kbMzNbjaMeKDcgNc1FGJ4","type":"tool_result","content":"1\t/************************************************************************\n2\t *   IRC - Internet Relay Chat, common/struct_def.h\n3\t *   Copyright (C) 1990 Jarkko Oikarinen and\n4\t *                      University of Oulu, Computing Center\n5\t *\n6\t *   This program is free software; you can redistribute it and/or modify\n7\t *   it under the terms of the GNU General Public License as published by\n8\t *   the Free Software Foundation; either version 1, or (at your option)\n9\t *   any later version.\n10\t *\n11\t *   This program is distributed in the hope that it will be useful,\n12\t *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n13\t *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n14\t *   GNU General Public License for more details.\n15\t *\n16\t *   You should have received a copy of the GNU General Public License\n17\t *   along with this program; if not, write to the Free Software\n18\t *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n19\t *\n20\t *   $Id: struct_def.h,v 1.152 2011/01/20 14:26:56 bif Exp $\n21\t */\n22\t\n23\ttypedef\tstruct\tConfItem aConfItem;\n24\ttypedef\tstruct\tListItem aListItem;\n25\ttypedef\tstruct \tClient\taClient;\n26\ttypedef\tstruct\tChannel\taChannel;\n27\ttypedef\tstruct\tUser\tanUser;\n28\ttypedef\tstruct\tServer\taServer;\n29\ttypedef\tstruct\tService\taService;\n30\ttypedef\tstruct\tSLink\tLink;\n31\ttypedef\tstruct\tinvSLink\tinvLink;\n32\ttypedef\tstruct\tSMode\tMode;\n33\ttypedef\tstruct\tfdarray\tFdAry;\n34\ttypedef\tstruct\tCPing\taCPing;\n35\ttypedef\tstruct\tZdata\taZdata;\n36\ttypedef struct        LineItem aMotd;\n37\t#if defined(USE_IAUTH)\n38\ttypedef struct        LineItem aExtCf;\n39\ttypedef struct        LineItem aExtData;\n40\t#endif\n41\t\n42\t#define\tHOSTLEN\t\t63\t/* Length of hostname.  Updated to         */\n43\t\t\t\t\t/* comply with RFC1123                     */\n44\t\n45\t#if (INET6_ADDRSTRLEN > HOSTLEN)\n46\t#error HOSTLEN must not be smaller than INET6_ADDRSTRLEN\n47\t#endif\n48\t\n49\t#define\tNICKLEN\t\t15\t/* Must be the same network-wide. */\n50\t#define UIDLEN\t\t9\t/* must not be bigger than NICKLEN --Beeth */\n51\t#define\tUSERLEN\t\t10\n52\t#define\tREALLEN\t \t50\n53\t#define\tTOPICLEN\t255\n54\t#define\tCHANNELLEN\t50\n55\t#define\tPASSWDLEN \t20\n56\t#define\tKEYLEN\t\t23\n57\t#define\tBUFSIZE\t\t512\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n58\t#define\tMAXRECIPIENTS \t20\n59\t#define\tMAXBANS\t\t64\n60\t#define\tMAXBANLENGTH\t2048\n61\t#define\tBANLEN\t\t(USERLEN + NICKLEN + HOSTLEN + 3)\n62\t#define MAXPENALTY\t10\n63\t#define\tCHIDLEN\t\t5\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n64\t#define\tSIDLEN\t\t4\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n65\t#define\tMAXMODEPARAMS\t3\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n66\t#define\tDELAYCHASETIMELIMIT\t1800\t/* WARNING: *DONT* CHANGE THIS!!!! */\n67\t#define\tLDELAYCHASETIMELIMIT\t5400\t/* WARNING: *DONT* CHANGE THIS!!!! */\n68\t\n69\t#define\tREADBUF_SIZE\t16384\t/* used in s_bsd.c *AND* s_zip.c ! */\n70\t \n71\t/*\n72\t * Make up some numbers which should reflect average leaf server connect\n73\t * queue max size.\n74\t * queue=(<# of channels> * <channel size> + <user size> * <# of users>) * 2\n75\t * pool=<queue per client> * <avg. # of clients having data in queue>\n76\t */\n77\t#define\tQUEUELEN\t(((MAXCONNECTIONS / 10) * (CHANNELLEN + BANLEN + 16) +\\\n78\t\t\t\t  (HOSTLEN * 4 + REALLEN + NICKLEN + USERLEN + 24) *\\\n79\t\t\t\t  (MAXCONNECTIONS / 2)) * 2)\n80\t\n81\t#define\tBUFFERPOOL\t(DBUFSIZ * MAXCONNECTIONS * 2) + \\\n82\t\t\t\t(QUEUELEN * MAXSERVERS)\n83\t\n84\t#define\tUSERHOST_REPLYLEN\t(NICKLEN+HOSTLEN+USERLEN+5)\n85\t\n86\t/*\n87\t** 'offsetof' is defined in ANSI-C. The following definition\n88\t** is not absolutely portable (I have been told), but so far\n89\t** it has worked on all machines I have needed it. The type\n90\t** should be size_t but...  --msa\n91\t*/\n92\t#ifndef offsetof\n93\t#define\toffsetof(t,m) (int)((&((t *)0L)->m))\n94\t#endif\n95\t\n96\t#define\telementsof(x) (sizeof(x)/sizeof(x[0]))\n97\t\n98\t/*\n99\t** flags for bootup options (command line flags)\n100\t*/\n101\t#define\tBOOT_CONSOLE\t0x001\n102\t#define\tBOOT_QUICK\t0x002\n103\t#define\tBOOT_DEBUG\t0x004\n104\t#define\tBOOT_INETD\t0x008\n105\t#define\tBOOT_TTY\t0x010\n106\t\n107\t#define\tBOOT_AUTODIE\t0x040\n108\t#define\tBOOT_BADTUNE\t0x080\n109\t#define\tBOOT_PROT\t0x100\n110\t#define\tBOOT_STRICTPROT\t0x200\n111\t#define\tBOOT_NOIAUTH\t0x400\n112\t#define\tBOOT_STANDALONE\t0x800\n113\t\n114\ttypedef enum Status {\n115\t\tSTAT_CONNECTING = -4,\n116\t\tSTAT_HANDSHAKE, /* -3 */\n117\t\tSTAT_UNKNOWN,\t/* -2 */\n118\t\tSTAT_ME,\t/* -1 */\n119\t\tSTAT_SERVER,\t/* 0 */\n120\t\tSTAT_CLIENT,\t/* 1 */\n121\t\tSTAT_OPER,\t/* 2 */\n122\t\tSTAT_SERVICE,\t/* 3 */\n123\t\tSTAT_UNREG,\t/* 4 */\n124\t\tSTAT_MAX\t/* 5 -- size of handler[] table we need */\n125\t} Status;\n126\t\n127\t/*\n128\t * status macros.\n129\t */\n130\t#define\tIsRegisteredUser(x)\t(((x)->status == STAT_CLIENT || \\\n131\t\t\t\t\t (x)->status == STAT_OPER) && (x)->user)\n132\t#define\tIsRegistered(x)\t\t((x)->status >= STAT_SERVER || \\\n133\t\t\t\t\t (x)->status == STAT_ME)\n134\t#define\tIsConnecting(x)\t\t((x)->status == STAT_CONNECTING)\n135\t#define\tIsHandshake(x)\t\t((x)->status == STAT_HANDSHAKE)\n136\t#define\tIsMe(x)\t\t\t((x)->status == STAT_ME)\n137\t#define\tIsUnknown(x)\t\t((x)->status == STAT_UNKNOWN)\n138\t#define\tIsServer(x)\t\t((x)->status == STAT_SERVER)\n139\t#define\tIsClient(x)\t\t((x)->status == STAT_CLIENT || \\\n140\t\t\t\t\t (x)->status == STAT_OPER)\n141\t#define\tIsService(x)\t\t((x)->status == STAT_SERVICE && (x)->service)\n142\t\n143\t#define\tSetConnecting(x)\t((x)->status = STAT_CONNECTING)\n144\t#define\tSetHandshake(x)\t\t((x)->status = STAT_HANDSHAKE)\n145\t#define\tSetMe(x)\t\t((x)->status = STAT_ME)\n146\t#define\tSetUnknown(x)\t\t((x)->status = STAT_UNKNOWN)\n147\t#define\tSetServer(x)\t\t((x)->status = STAT_SERVER)\n148\t#define\tSetClient(x)\t\t((x)->status = IsAnOper((x)) ? STAT_OPER : STAT_CLIENT)\n149\t#define\tSetService(x)\t\t((x)->status = STAT_SERVICE)\n150\t\n151\t#define\tFLAGS_PINGSENT\t0x0000001 /* Unreplied ping sent */\n152\t#define\tFLAGS_DEADSOCK\t0x0000002 /* Local socket is dead--Exiting soon */\n153\t#define\tFLAGS_KILLED\t0x0000004 /* Prevents \"QUIT\" from being sent for this */\n154\t#define\tFLAGS_BLOCKED\t0x0000008 /* socket is in blocked condition [unused] */\n155\t#ifdef UNIXPORT\n156\t#define\tFLAGS_UNIX\t0x0000010 /* socket is in the unix domain, not inet */\n157\t#endif\n158\t#define\tFLAGS_CLOSING\t0x0000020 /* set when closing to suppress errors */\n159\t#define\tFLAGS_LISTEN\t0x0000040 /* used to mark clients which we listen() on */\n160\t#define\tFLAGS_XAUTHDONE\t0x0000080 /* iauth is finished with this client */\n161\t#define\tFLAGS_DOINGDNS\t0x0000100 /* client is waiting for a DNS response */\n162\t#define\tFLAGS_AUTH\t0x0000200 /* client is waiting on rfc931 response */\n163\t#define\tFLAGS_WRAUTH\t0x0000400 /* set if we havent writen to ident server */\n164\t#define\tFLAGS_LOCAL\t0x0000800 /* set for local clients */\n165\t#define\tFLAGS_GOTID\t0x0001000 /* successful ident lookup achieved */\n166\t#define\tFLAGS_XAUTH\t0x0002000 /* waiting on external authentication */\n167\t#define\tFLAGS_WXAUTH\t0x0004000 /* same as above, but also prevent parsing */\n168\t#define\tFLAGS_NONL\t0x0008000 /* No \\n in buffer */\n169\t#define\tFLAGS_CBURST\t0x0010000 /* set to mark connection burst being sent */\n170\t#define\tFLAGS_QUIT\t0x0040000 /* QUIT :comment shows it's not a split */\n171\t#define\tFLAGS_SPLIT\t0x0080000 /* client QUITting because of a netsplit */\n172\t#define\tFLAGS_HIDDEN\t0x0100000 /* netsplit is behind a hostmask,\n173\t\t\t\t\t     also used for marking clients in who_find\n174\t\t\t\t\t   */\n175\t#define\tFLAGS_UNKCMD\t0x0200000 /* has sent an unknown command */\n176\t#define\tFLAGS_ZIP\t0x0400000 /* link is zipped */\n177\t#define\tFLAGS_ZIPRQ\t0x0800000 /* zip requested */\n178\t#define\tFLAGS_ZIPSTART\t0x1000000 /* start of zip (ignore any CRLF) */\n179\t#define\tFLAGS_SQUIT\t0x2000000 /* This is set when we send the last\n180\t\t\t\t\t  ** server, so we know we have to send\n181\t\t\t\t\t  ** a SQUIT. */\n182\t#define\tFLAGS_EOB\t0x4000000 /* EOB received */\n183\t#define FLAGS_LISTENINACTIVE 0x8000000 /* Listener does not listen() */\n184\t#ifdef JAPANESE\n185\t#define\tFLAGS_JP\t0x10000000 /* jp version, used both for chans and servs */\n186\t#endif\n187\t\t\n188\t#define\tFLAGS_OPER\t0x0001 /* operator */\n189\t#define\tFLAGS_LOCOP\t0x0002 /* local operator -- SRB */\n190\t#define\tFLAGS_WALLOP\t0x0004 /* send wallops to them */\n191\t#define\tFLAGS_INVISIBLE\t0x0008 /* makes user invisible */\n192\t#define FLAGS_RESTRICT\t0x0010 /* restricted user */\n193\t#define FLAGS_AWAY\t0x0020 /* user is away */\n194\t#define FLAGS_EXEMPT    0x0040 /* user is exempted from k-lines */\n195\t#ifdef XLINE\n196\t#define FLAGS_XLINED\t0x0100\t/* X-lined client */\n197\t#endif\n198\t#define FLAGS_TLS       0x0200 /* user is on a secure connection port (SSL/TLS) -- mh 2020-04-27 */\n199\t#define\tSEND_UMODES\t(FLAGS_INVISIBLE|FLAGS_OPER|FLAGS_WALLOP|FLAGS_AWAY|FLAGS_RESTRICT)\n200\t#define\tALL_UMODES\t(SEND_UMODES|FLAGS_LOCOP)"}]},"uuid":"b38d59cb-be5a-4166-b657-144c087673a4","timestamp":"2026-06-01T23:55:26.603Z","sourceToolAssistantUUID":"a21d8307-5559-4c4e-8b52-7e3ff260b6aa","userType":"external","entrypoint":"cli","cwd":"/home/xe/code/xeiaso.net/ircd.rs","sessionId":"83d912ac-5e1e-4525-89a0-e5166a07c355","version":"2.1.160","gitBranch":"master","slug":"i-would-like-to-humming-curry"}
.claude/sessions/83d912ac-5e1e-4525-89a0-e5166a07c355/subagents/workflows/wf_14f560c3-63f/agent-af363933c01b7f212.jsonl:11:{"parentUuid":"aaf37c7e-07b7-4b1e-8049-c9499a76bee2","isSidechain":true,"promptId":"0f4a6818-24c2-4d73-8cd5-b20cc55b2869","agentId":"af363933c01b7f212","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_013ryUm6XUPipZLCi3VuDSCC","type":"tool_result","content":"1\t/************************************************************************\n2\t *   IRC - Internet Relay Chat, common/struct_def.h\n3\t *   Copyright (C) 1990 Jarkko Oikarinen and\n4\t *                      University of Oulu, Computing Center\n5\t *\n6\t *   This program is free software; you can redistribute it and/or modify\n7\t *   it under the terms of the GNU General Public License as published by\n8\t *   the Free Software Foundation; either version 1, or (at your option)\n9\t *   any later version.\n10\t *\n11\t *   This program is distributed in the hope that it will be useful,\n12\t *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n13\t *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n14\t *   GNU General Public License for more details.\n15\t *\n16\t *   You should have received a copy of the GNU General Public License\n17\t *   along with this program; if not, write to the Free Software\n18\t *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n19\t *\n20\t *   $Id: struct_def.h,v 1.152 2011/01/20 14:26:56 bif Exp $\n21\t */\n22\t\n23\ttypedef\tstruct\tConfItem aConfItem;\n24\ttypedef\tstruct\tListItem aListItem;\n25\ttypedef\tstruct \tClient\taClient;\n26\ttypedef\tstruct\tChannel\taChannel;\n27\ttypedef\tstruct\tUser\tanUser;\n28\ttypedef\tstruct\tServer\taServer;\n29\ttypedef\tstruct\tService\taService;\n30\ttypedef\tstruct\tSLink\tLink;\n31\ttypedef\tstruct\tinvSLink\tinvLink;\n32\ttypedef\tstruct\tSMode\tMode;\n33\ttypedef\tstruct\tfdarray\tFdAry;\n34\ttypedef\tstruct\tCPing\taCPing;\n35\ttypedef\tstruct\tZdata\taZdata;\n36\ttypedef struct        LineItem aMotd;\n37\t#if defined(USE_IAUTH)\n38\ttypedef struct        LineItem aExtCf;\n39\ttypedef struct        LineItem aExtData;\n40\t#endif\n41\t\n42\t#define\tHOSTLEN\t\t63\t/* Length of hostname.  Updated to         */\n43\t\t\t\t\t/* comply with RFC1123                     */\n44\t\n45\t#if (INET6_ADDRSTRLEN > HOSTLEN)\n46\t#error HOSTLEN must not be smaller than INET6_ADDRSTRLEN\n47\t#endif\n48\t\n49\t#define\tNICKLEN\t\t15\t/* Must be the same network-wide. */\n50\t#define UIDLEN\t\t9\t/* must not be bigger than NICKLEN --Beeth */\n51\t#define\tUSERLEN\t\t10\n52\t#define\tREALLEN\t \t50\n53\t#define\tTOPICLEN\t255\n54\t#define\tCHANNELLEN\t50\n55\t#define\tPASSWDLEN \t20\n56\t#define\tKEYLEN\t\t23\n57\t#define\tBUFSIZE\t\t512\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n58\t#define\tMAXRECIPIENTS \t20\n59\t#define\tMAXBANS\t\t64\n60\t#define\tMAXBANLENGTH\t2048\n61\t#define\tBANLEN\t\t(USERLEN + NICKLEN + HOSTLEN + 3)\n62\t#define MAXPENALTY\t10\n63\t#define\tCHIDLEN\t\t5\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n64\t#define\tSIDLEN\t\t4\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n65\t#define\tMAXMODEPARAMS\t3\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n66\t#define\tDELAYCHASETIMELIMIT\t1800\t/* WARNING: *DONT* CHANGE THIS!!!! */\n67\t#define\tLDELAYCHASETIMELIMIT\t5400\t/* WARNING: *DONT* CHANGE THIS!!!! */\n68\t\n69\t#define\tREADBUF_SIZE\t16384\t/* used in s_bsd.c *AND* s_zip.c ! */\n70\t \n71\t/*\n72\t * Make up some numbers which should reflect average leaf server connect\n73\t * queue max size.\n74\t * queue=(<# of channels> * <channel size> + <user size> * <# of users>) * 2\n75\t * pool=<queue per client> * <avg. # of clients having data in queue>\n76\t */\n77\t#define\tQUEUELEN\t(((MAXCONNECTIONS / 10) * (CHANNELLEN + BANLEN + 16) +\\\n78\t\t\t\t  (HOSTLEN * 4 + REALLEN + NICKLEN + USERLEN + 24) *\\\n79\t\t\t\t  (MAXCONNECTIONS / 2)) * 2)\n80\t\n81\t#define\tBUFFERPOOL\t(DBUFSIZ * MAXCONNECTIONS * 2) + \\\n82\t\t\t\t(QUEUELEN * MAXSERVERS)\n83\t\n84\t#define\tUSERHOST_REPLYLEN\t(NICKLEN+HOSTLEN+USERLEN+5)\n85\t\n86\t/*\n87\t** 'offsetof' is defined in ANSI-C. The following definition\n88\t** is not absolutely portable (I have been told), but so far\n89\t** it has worked on all machines I have needed it. The type\n90\t** should be size_t but...  --msa\n91\t*/\n92\t#ifndef offsetof\n93\t#define\toffsetof(t,m) (int)((&((t *)0L)->m))\n94\t#endif\n95\t\n96\t#define\telementsof(x) (sizeof(x)/sizeof(x[0]))\n97\t\n98\t/*\n99\t** flags for bootup options (command line flags)\n100\t*/\n101\t#define\tBOOT_CONSOLE\t0x001\n102\t#define\tBOOT_QUICK\t0x002\n103\t#define\tBOOT_DEBUG\t0x004\n104\t#define\tBOOT_INETD\t0x008\n105\t#define\tBOOT_TTY\t0x010\n106\t\n107\t#define\tBOOT_AUTODIE\t0x040\n108\t#define\tBOOT_BADTUNE\t0x080\n109\t#define\tBOOT_PROT\t0x100\n110\t#define\tBOOT_STRICTPROT\t0x200\n111\t#define\tBOOT_NOIAUTH\t0x400\n112\t#define\tBOOT_STANDALONE\t0x800\n113\t\n114\ttypedef enum Status {\n115\t\tSTAT_CONNECTING = -4,\n116\t\tSTAT_HANDSHAKE, /* -3 */\n117\t\tSTAT_UNKNOWN,\t/* -2 */\n118\t\tSTAT_ME,\t/* -1 */\n119\t\tSTAT_SERVER,\t/* 0 */\n120\t\tSTAT_CLIENT,\t/* 1 */\n121\t\tSTAT_OPER,\t/* 2 */\n122\t\tSTAT_SERVICE,\t/* 3 */\n123\t\tSTAT_UNREG,\t/* 4 */\n124\t\tSTAT_MAX\t/* 5 -- size of handler[] table we need */\n125\t} Status;\n126\t\n127\t/*\n128\t * status macros.\n129\t */\n130\t#define\tIsRegisteredUser(x)\t(((x)->status == STAT_CLIENT || \\\n131\t\t\t\t\t (x)->status == STAT_OPER) && (x)->user)\n132\t#define\tIsRegistered(x)\t\t((x)->status >= STAT_SERVER || \\\n133\t\t\t\t\t (x)->status == STAT_ME)\n134\t#define\tIsConnecting(x)\t\t((x)->status == STAT_CONNECTING)\n135\t#define\tIsHandshake(x)\t\t((x)->status == STAT_HANDSHAKE)\n136\t#define\tIsMe(x)\t\t\t((x)->status == STAT_ME)\n137\t#define\tIsUnknown(x)\t\t((x)->status == STAT_UNKNOWN)\n138\t#define\tIsServer(x)\t\t((x)->status == STAT_SERVER)\n139\t#define\tIsClient(x)\t\t((x)->status == STAT_CLIENT || \\\n140\t\t\t\t\t (x)->status == STAT_OPER)\n141\t#define\tIsService(x)\t\t((x)->status == STAT_SERVICE && (x)->service)\n142\t\n143\t#define\tSetConnecting(x)\t((x)->status = STAT_CONNECTING)\n144\t#define\tSetHandshake(x)\t\t((x)->status = STAT_HANDSHAKE)\n145\t#define\tSetMe(x)\t\t((x)->status = STAT_ME)\n146\t#define\tSetUnknown(x)\t\t((x)->status = STAT_UNKNOWN)\n147\t#define\tSetServer(x)\t\t((x)->status = STAT_SERVER)\n148\t#define\tSetClient(x)\t\t((x)->status = IsAnOper((x)) ? STAT_OPER : STAT_CLIENT)\n149\t#define\tSetService(x)\t\t((x)->status = STAT_SERVICE)\n150\t\n151\t#define\tFLAGS_PINGSENT\t0x0000001 /* Unreplied ping sent */\n152\t#define\tFLAGS_DEADSOCK\t0x0000002 /* Local socket is dead--Exiting soon */\n153\t#define\tFLAGS_KILLED\t0x0000004 /* Prevents \"QUIT\" from being sent for this */\n154\t#define\tFLAGS_BLOCKED\t0x0000008 /* socket is in blocked condition [unused] */\n155\t#ifdef UNIXPORT\n156\t#define\tFLAGS_UNIX\t0x0000010 /* socket is in the unix domain, not inet */\n157\t#endif\n158\t#define\tFLAGS_CLOSING\t0x0000020 /* set when closing to suppress errors */\n159\t#define\tFLAGS_LISTEN\t0x0000040 /* used to mark clients which we listen() on */\n160\t#define\tFLAGS_XAUTHDONE\t0x0000080 /* iauth is finished with this client */\n161\t#define\tFLAGS_DOINGDNS\t0x0000100 /* client is waiting for a DNS response */\n162\t#define\tFLAGS_AUTH\t0x0000200 /* client is waiting on rfc931 response */\n163\t#define\tFLAGS_WRAUTH\t0x0000400 /* set if we havent writen to ident server */\n164\t#define\tFLAGS_LOCAL\t0x0000800 /* set for local clients */\n165\t#define\tFLAGS_GOTID\t0x0001000 /* successful ident lookup achieved */\n166\t#define\tFLAGS_XAUTH\t0x0002000 /* waiting on external authentication */\n167\t#define\tFLAGS_WXAUTH\t0x0004000 /* same as above, but also prevent parsing */\n168\t#define\tFLAGS_NONL\t0x0008000 /* No \\n in buffer */\n169\t#define\tFLAGS_CBURST\t0x0010000 /* set to mark connection burst being sent */\n170\t#define\tFLAGS_QUIT\t0x0040000 /* QUIT :comment shows it's not a split */\n171\t#define\tFLAGS_SPLIT\t0x0080000 /* client QUITting because of a netsplit */\n172\t#define\tFLAGS_HIDDEN\t0x0100000 /* netsplit is behind a hostmask,\n173\t\t\t\t\t     also used for marking clients in who_find\n174\t\t\t\t\t   */\n175\t#define\tFLAGS_UNKCMD\t0x0200000 /* has sent an unknown command */\n176\t#define\tFLAGS_ZIP\t0x0400000 /* link is zipped */\n177\t#define\tFLAGS_ZIPRQ\t0x0800000 /* zip requested */\n178\t#define\tFLAGS_ZIPSTART\t0x1000000 /* start of zip (ignore any CRLF) */\n179\t#define\tFLAGS_SQUIT\t0x2000000 /* This is set when we send the last\n180\t\t\t\t\t  ** server, so we know we have to send\n181\t\t\t\t\t  ** a SQUIT. */\n182\t#define\tFLAGS_EOB\t0x4000000 /* EOB received */\n183\t#define FLAGS_LISTENINACTIVE 0x8000000 /* Listener does not listen() */\n184\t#ifdef JAPANESE\n185\t#define\tFLAGS_JP\t0x10000000 /* jp version, used both for chans and servs */\n186\t#endif\n187\t\t\n188\t#define\tFLAGS_OPER\t0x0001 /* operator */\n189\t#define\tFLAGS_LOCOP\t0x0002 /* local operator -- SRB */\n190\t#define\tFLAGS_WALLOP\t0x0004 /* send wallops to them */\n191\t#define\tFLAGS_INVISIBLE\t0x0008 /* makes user invisible */\n192\t#define FLAGS_RESTRICT\t0x0010 /* restricted user */\n193\t#define FLAGS_AWAY\t0x0020 /* user is away */\n194\t#define FLAGS_EXEMPT    0x0040 /* user is exempted from k-lines */\n195\t#ifdef XLINE\n196\t#define FLAGS_XLINED\t0x0100\t/* X-lined client */\n197\t#endif\n198\t#define FLAGS_TLS       0x0200 /* user is on a secure connection port (SSL/TLS) -- mh 2020-04-27 */\n199\t#define\tSEND_UMODES\t(FLAGS_INVISIBLE|FLAGS_OPER|FLAGS_WALLOP|FLAGS_AWAY|FLAGS_RESTRICT)\n200\t#define\tALL_UMODES\t(SEND_UMODES|FLAGS_LOCOP)\n201\t\n202\t/*\n203\t * user flags macros.\n204\t */\n205\t#define\tIsOper(x)\t\t((x)->user && (x)->user->flags & FLAGS_OPER)\n206\t#define\tIsLocOp(x)\t\t((x)->user && (x)->user->flags & FLAGS_LOCOP)\n207\t#define\tIsInvisible(x)\t\t((x)->user->flags & FLAGS_INVISIBLE)\n208\t#define IsRestricted(x)         ((x)->user && \\\n209\t\t\t\t\t (x)->user->flags & FLAGS_RESTRICT)\n210\t#define\tIsAnOper(x)\t\t((x)->user && \\\n211\t\t\t\t\t (x)->user->flags & (FLAGS_OPER|FLAGS_LOCOP))\n212\t#define\tIsPerson(x)\t\t((x)->user && IsClient(x))\n213\t#define\tIsPrivileged(x)\t\t(IsServer(x) || IsAnOper(x))\n214\t#define\tSendWallops(x)\t\t((x)->user->flags & FLAGS_WALLOP)\n215\t#ifdef UNIXPORT\n216\t#define\tIsUnixSocket(x)\t\t((x)->flags & FLAGS_UNIX)\n217\t#endif\n218\t#define\tIsListener(x)\t\t((x)->flags & FLAGS_LISTEN)\n219\t#define IsListenerInactive(x)\t((x)->flags & FLAGS_LISTENINACTIVE)\n220\t#define\tIsLocal(x)\t\t(MyConnect(x) && (x)->flags & FLAGS_LOCAL)\n221\t#define\tIsDead(x)\t\t((x)->flags & FLAGS_DEADSOCK)\n222\t#define\tIsBursting(x)\t\t(!((x)->flags & FLAGS_EOB))\n223\t#define IsKlineExempt(x)        ((x)->user && (x)->user->flags & FLAGS_EXEMPT)\n224\t\n225\t#define\tSetDead(x)\t\t((x)->flags |= FLAGS_DEADSOCK)\n226\t#define\tCBurst(x)\t\t((x)->flags & FLAGS_CBURST)\n227\t#define\tSetOper(x)\t\t((x)->user->flags |= FLAGS_OPER, \\\n228\t\t\t\t\t (x)->status = STAT_OPER)\n229\t#define\tSetLocOp(x)\t\t((x)->user->flags |= FLAGS_LOCOP, \\\n230\t\t\t\t\t (x)->status = STAT_OPER)\n231\t#define\tSetInvisible(x)\t\t((x)->user->flags |= FLAGS_INVISIBLE)\n232\t#define SetRestricted(x)\t((x)->user->flags |= FLAGS_RESTRICT)\n233\t#define\tSetWallops(x)\t\t((x)->user->flags |= FLAGS_WALLOP)\n234\t#ifdef UNIXPORT\n235\t#define\tSetUnixSock(x)\t\t((x)->flags |= FLAGS_UNIX)\n236\t#endif\n237\t#define\tSetDNS(x)\t\t((x)->flags |= FLAGS_DOINGDNS)\n238\t#define\tSetDoneXAuth(x)\t\t((x)->flags |= FLAGS_XAUTHDONE)\n239\t#define\tSetEOB(x)\t\t((x)->flags |= FLAGS_EOB)\n240\t#define SetListenerInactive(x)\t((x)->flags |= FLAGS_LISTENINACTIVE)\n241\t#define SetKlineExempt(x)\t((x)->user->flags |= FLAGS_EXEMPT)\n242\t\n243\t#define\tDoingDNS(x)\t\t((x)->flags & FLAGS_DOINGDNS)\n244\t#define\tDoingAuth(x)\t\t((x)->flags & FLAGS_AUTH)\n245\t#define\tDoingXAuth(x)\t\t((x)->flags & FLAGS_XAUTH)\n246\t#define\tWaitingXAuth(x)\t\t((x)->flags & FLAGS_WXAUTH)\n247\t#define\tDoneXAuth(x)\t\t((x)->flags & FLAGS_XAUTHDONE)\n248\t#define\tNoNewLine(x)\t\t((x)->flags & FLAGS_NONL)\n249\t\n250\t#define\tClearOper(x)\t\t((x)->user->flags &= ~FLAGS_OPER, \\\n251\t\t\t\t\t (x)->status = STAT_CLIENT)\n252\t#define\tClearLocOp(x)\t\t((x)->user->flags &= ~FLAGS_LOCOP, \\\n253\t\t\t\t\t (x)->status = STAT_CLIENT)\n254\t#define\tClearInvisible(x)\t((x)->user->flags &= ~FLAGS_INVISIBLE)\n255\t#define ClearRestricted(x)      ((x)->user->flags &= ~FLAGS_RESTRICT)\n256\t#define\tClearWallops(x)\t\t((x)->user->flags &= ~FLAGS_WALLOP)\n257\t#define\tClearDNS(x)\t\t((x)->flags &= ~FLAGS_DOINGDNS)\n258\t#define\tClearAuth(x)\t\t((x)->flags &= ~FLAGS_AUTH)\n259\t#define\tClearXAuth(x)\t\t((x)->flags &= ~FLAGS_XAUTH)\n260\t#define\tClearWXAuth(x)\t\t((x)->flags &= ~FLAGS_WXAUTH)\n261\t#define ClearListenerInactive(x) ((x)->flags &= ~FLAGS_LISTENINACTIVE)\n262\t#ifdef XLINE\n263\t#define IsXlined(x)\t\t((x)->user && (x)->user->flags & FLAGS_XLINED)\n264\t#define SetXlined(x)\t\t((x)->user->flags |= FLAGS_XLINED)\n265\t#define ClearXlined(x)\t\t((x)->user->flags &= ~FLAGS_XLINED)\n266\t#endif\n267\t#define IsTLS(x)        ((x)->user && (x)->user->flags & FLAGS_TLS)\n268\t#define SetTLS(x)       ((x)->user->flags |= FLAGS_TLS)\n269\t\n270\t/*\n271\t * defined debugging levels\n272\t */\n273\t#define\tDEBUG_FATAL  0\n274\t#define\tDEBUG_ERROR  1\t/* report_error() and other errors that are found */\n275\t#define\tDEBUG_READ   2\n276\t#define\tDEBUG_WRITE  2\n277\t#define\tDEBUG_NOTICE 3\n278\t#define\tDEBUG_DNS    4\t/* used by all DNS related routines - a *lot* */\n279\t#define\tDEBUG_INFO   5\t/* general usful info */\n280\t#define\tDEBUG_NUM    6\t/* numerics */\n281\t#define\tDEBUG_SEND   7\t/* everything that is sent out */\n282\t#define\tDEBUG_DEBUG  8\t/* anything to do with debugging, ie unimportant :) */\n283\t#define\tDEBUG_MALLOC 9\t/* malloc/free calls */\n284\t#define\tDEBUG_LIST  10\t/* debug list use */\n285\t#define\tDEBUG_L10   10\n286\t#define\tDEBUG_L11   11\n287\t\n288\t/*\n289\t * defines for curses in client\n290\t */\n291\t#define\tDUMMY_TERM\t0\n292\t#define\tCURSES_TERM\t1\n293\t#define\tTERMCAP_TERM\t2\n294\t\n295\tstruct\tCPing\t{\n296\t\tu_short\tport;\t\t/* port to send pings to */\n297\t\tu_long\trtt;\t\t/* average RTT */\n298\t\tu_long\tping;\n299\t\tu_long\tseq;\t\t/* # sent still in the \"window\" */\n300\t\tu_long\tlseq;\t\t/* sequence # of last sent */\n301\t\tu_long\trecvd;\t\t/* # received still in the \"window\" */\n302\t\tu_long\tlrecvd;\t\t/* # received */\n303\t};\n304\t\n305\tstruct\tConfItem\t{\n306\t\tu_int\tstatus;\t\t/* If CONF_ILLEGAL, delete when no clients */\n307\t\tint\tclients;\t/* Number of *LOCAL* clients using this */\n308\t\tstruct\tIN_ADDR ipnum;\t/* ip number of host field */\n309\t\tchar\t*host;\n310\t\tchar\t*passwd;\n311\t\tchar\t*name;\n312\t\tchar\t*name2;\n313\t#ifdef XLINE\n314\t\tchar\t*name3;\n315\t#endif\n316\t\tint\tport;\n317\t\tlong\tflags;\t\t/* I-line flags */\n318\t\tint\tpref;\t\t/* preference value */\n319\t\tstruct\tCPing\t*ping;\n320\t\ttime_t\thold;\t/* Hold action until this time (calendar time) */\n321\t\tchar\t*source_ip;\n322\t#ifndef VMSP\n323\t\taClass\t*class;  /* Class of connection */\n324\t#endif\n325\t\tstruct\tConfItem *next;\n326\t};\n327\t\n328\tstruct\tListItem\t{\n329\t\tchar\t*nick;\n330\t\tchar\t*user;\n331\t\tchar\t*host;\n332\t};\n333\t\n334\t/* these define configuration lines (A:, M:, I:, K:, etc.) */\n335\t#define\tCONF_ILLEGAL\t\t0x80000000\n336\t#define\tCONF_MATCH\t\t0x40000000\n337\t#define\tCONF_QUARANTINED_SERVER\t0x000001\n338\t#define\tCONF_CLIENT\t\t0x000002\n339\t\n340\t#define\tCONF_CONNECT_SERVER\t0x000008\n341\t#define\tCONF_NOCONNECT_SERVER\t0x000010\n342\t#define\tCONF_ZCONNECT_SERVER\t0x000020\n343\t\n344\t#define\tCONF_OPERATOR\t\t0x000080\n345\t#define\tCONF_ME\t\t\t0x000100\n346\t#define\tCONF_KILL\t\t0x000200\n347\t#define\tCONF_ADMIN\t\t0x000400\n348\t#define\tCONF_CLASS\t\t0x001000\n349\t#define\tCONF_SERVICE\t\t0x002000\n350\t#define\tCONF_LEAF\t\t0x004000\n351\t#define\tCONF_LISTEN_PORT\t0x008000\n352\t#define\tCONF_HUB\t\t0x010000\n353\t#define\tCONF_VER\t\t0x020000\n354\t#define\tCONF_BOUNCE\t\t0x040000\n355\t#define\tCONF_OTHERKILL\t\t0x080000\n356\t#define\tCONF_DENY\t\t0x100000\n357\t#ifdef TKLINE\n358\t#define\tCONF_TKILL\t\t0x200000\n359\t#define\tCONF_TOTHERKILL\t\t0x400000\n360\t#endif\n361\t#ifdef XLINE\n362\t#define CONF_XLINE\t\t0x800000\n363\t#endif\n364\t#define\tCONF_OPS\t\tCONF_OPERATOR\n365\t#define\tCONF_SERVER_MASK\t(CONF_CONNECT_SERVER | CONF_NOCONNECT_SERVER |\\\n366\t\t\t\t\t CONF_ZCONNECT_SERVER)\n367\t#define\tCONF_CLIENT_MASK\t(CONF_CLIENT | CONF_SERVICE | CONF_OPS | \\\n368\t\t\t\t\t CONF_SERVER_MASK)\n369\t\n370\t#define CFLAG_RESTRICTED\t0x00001\n371\t#define CFLAG_RNODNS\t\t0x00002\n372\t#define CFLAG_RNOIDENT\t\t0x00004\n373\t#define CFLAG_KEXEMPT\t\t0x00008\n374\t#define CFLAG_NORESOLVE\t\t0x00010\n375\t#define CFLAG_FALL\t\t0x00020\n376\t#define CFLAG_NORESOLVEMATCH\t0x00040\n377\t#ifdef XLINE\n378\t#define CFLAG_XEXEMPT\t\t0x00080\n379\t#endif\n380\t\n381\t#define IsConfRestricted(x)\t((x)->flags & CFLAG_RESTRICTED)\n382\t#define IsConfRNoDNS(x)\t\t((x)->flags & CFLAG_RNODNS)\n383\t#define IsConfRNoIdent(x)\t((x)->flags & CFLAG_RNOIDENT)\n384\t#define IsConfKlineExempt(x)\t((x)->flags & CFLAG_KEXEMPT)\n385\t#define IsConfNoResolve(x)\t((x)->flags & CFLAG_NORESOLVE)\n386\t#define IsConfNoResolveMatch(x)\t((x)->flags & CFLAG_NORESOLVEMATCH)\n387\t#define IsConfFallThrough(x)\t((x)->flags & CFLAG_FALL)\n388\t#ifdef XLINE\n389\t#define IsConfXlineExempt(x)\t((x)->flags & CFLAG_XEXEMPT)\n390\t#endif\n391\t\n392\t#define PFLAG_DELAYED\t\t0x00001\n393\t#define PFLAG_SERVERONLY\t0x00002\n394\t#define PFLAG_TLS           0x00004\n395\t\n396\t#define IsConfDelayed(x)\t((x)->flags & PFLAG_DELAYED)\n397\t#define IsConfServeronly(x)\t((x)->flags & PFLAG_SERVERONLY)\n398\t#define IsConfTLS(x)        ((x)->flags & PFLAG_TLS)\n399\t\n400\t#define\tIsIllegal(x)\t((x)->status & CONF_ILLEGAL)\n401\t\n402\ttypedef\tstruct\t{\n403\t\tu_long\tpi_id;\n404\t\tu_long\tpi_seq;\n405\t\tstruct\ttimeval\tpi_tv;\n406\t\taConfItem *pi_cp;\n407\t} Ping;\n408\t\n409\t\n410\t#define\tPING_REPLY\t0x01\n411\t#define\tPING_CPING\t0x02\n412\t\n413\t#ifdef\tZIP_LINKS\n414\t/* the minimum amount of data needed to trigger compression */\n415\t# define\tZIP_MINIMUM\t4096\n416\t\n417\t/* the maximum amount of data to be compressed (can actually be a bit more) */\n418\t# define\tZIP_MAXIMUM\t8192\t/* WARNING: *DON'T* CHANGE THIS!!!! */\n419\t\n420\tstruct Zdata {\n421\t\tz_stream\t*in;\t\t/* input zip stream data */\n422\t\tz_stream\t*out;\t\t/* output zip stream data */\n423\t\tBytef\t\toutbuf[ZIP_MAXIMUM]; /* outgoing (unzipped) buffer */\n424\t\tint\t\toutcount;\t/* size of outbuf content */\n425\t};\n426\t#endif\n427\t\n428\tstruct LineItem\n429\t{ \n430\t    char    *line;\n431\t    struct  LineItem *next;\n432\t};\n433\t\n434\t/*\n435\t * Client structures\n436\t */\n437\tstruct\tUser\t{\n438\t\tLink\t*channel;\t/* chain of channel pointer blocks */\n439\t\tinvLink\t*invited;\t/* chain of invite pointer blocks */\n440\t\tLink\t*uwas;\t\t/* chain of whowas pointer blocks */\n441\t\tchar\t*away;\t\t/* pointer to away message */\n442\t\ttime_t\tlast;\t\t/* \"idle\" time */\n443\t\tint\trefcnt;\t\t/* Number of times this block is referenced\n444\t\t\t\t\t** from aClient (field user), aServer (field\n445\t\t\t\t\t** by) and whowas array (field ww_user).\n446\t\t\t\t\t*/\n447\t\tint\tjoined;\t\t/* number of channels joined */\n448\t\tint\tflags;\t\t/* user modes */\n449\t        struct\tServer\t*servp;\n450\t\t\t\t\t/*\n451\t\t\t\t\t** In a perfect world the 'server' name\n452\t\t\t\t\t** should not be needed, a pointer to the\n453\t\t\t\t\t** client describing the server is enough.\n454\t\t\t\t\t** Unfortunately, in reality, server may\n455\t\t\t\t\t** not yet be in links while USER is\n456\t\t\t\t\t** introduced... --msa\n457\t\t\t\t\t** I think it's not true anymore --Beeth\n458\t\t\t\t\t*/\n459\t\tu_int\thashv;\n460\t\taClient\t*uhnext;\n461\t\taClient\t*bcptr;\n462\t\tchar\tusername[USERLEN+1];\n463\t\tchar\tuid[UIDLEN+1];\n464\t\tchar\thost[HOSTLEN+1];\n465\t\tchar\t*server;\n466\t\tu_int\thhashv;\t\t/* hostname hash value */\n467\t\tu_int\tiphashv;\t/* IP hash value */\n468\t\tstruct User *hhnext;\t/* next entry in hostname hash */\n469\t\tstruct User *iphnext;\t/* next entry in IP hash */\n470\t\t\t\t\t/* sip MUST be the last in this struct!!! */\n471\t\tchar\tsip[1];\t\t/* ip as a string, big enough for ipv6\n472\t\t\t\t\t * allocated to real size in make_user */\n473\t\n474\t};\n475\t\n476\tstruct\tServer\t{\n477\t\tchar\tnamebuf[HOSTLEN+1];\n478\t\tanUser\t*user;\t\t/* who activated this connection */\n479\t\taClient\t*up;\t\t/* uplink for this server */\n480\t\taConfItem *nline;\t/* N-line pointer for this server */\n481\t\tint\tversion;        /* version id for local client */\n482\t\tint\tsnum;\n483\t\tint\trefcnt;\t\t/* Number of times this block is referenced\n484\t\t\t\t\t** from anUser (field servp), aService (field\n485\t\t\t\t\t** servp) and aClient (field serv) */\n486\t\tint\tusercnt[3];\t/* # of clients - visible, invisible, opers */\n487\t\tstruct\tServer\t*nexts, *prevs, *shnext;\n488\t\taClient\t*bcptr;\n489\t\taClient\t*maskedby;\t/* Pointer to server masking this server.\n490\t\t\t\t\t** Self if not masked, *NEVER* NULL. */\n491\t\tchar\tby[NICKLEN+1];\n492\t\tchar\tbyuid[UIDLEN + 1];\n493\t\tchar\tsid[SIDLEN + 1];/* The Server ID. */\n494\t\tchar\tverstr[11];\t/* server version, PATCHLEVEL format */\n495\t\tu_int\tsidhashv;\t/* Raw hash value. */\n496\t\taServer\t*sidhnext;\t/* Next server in the sid hash. */\n497\t\ttime_t\tlastload;\t/* penalty like counters, see s_serv.c\n498\t\t\t\t\t** should be in the local part, but.. */\n499\t\tint\tservers;\t/* Number of downlinks of this server. */\n500\t\taClient\t*left, *right;\t/* Left and right nodes in server tree. */\n501\t\taClient\t*down;\t\t/* Ptr to first downlink of this server. */\n502\t};\n503\t\n504\tstruct\tService\t{\n505\t\tchar\tnamebuf[HOSTLEN+1];\n506\t\tint\twants;\n507\t\tint\ttype;\n508\t\tchar\t*server;\n509\t\taServer\t*servp;\n510\t\tstruct\tService\t*nexts, *prevs;\n511\t\taClient\t*bcptr;\n512\t\tchar\tdist[HOSTLEN+1];\n513\t};\n514\t\n515\tstruct Client\t{\n516\t\tstruct\tClient *next,*prev, *hnext;\n517\t\tanUser\t*user;\t\t/* ...defined, if this is a User */\n518\t\taServer\t*serv;\t\t/* ...defined, if this is a server */\n519\t\taService *service;\n520\t\tu_int\thashv;\t\t/* raw hash value */\n521\t\tlong\tflags;\t\t/* client flags */\n522\t\taClient\t*from;\t\t/* == self, if Local Client, *NEVER* NULL! */\n523\t\tint\tfd;\t\t/* >= 0, for local clients */\n524\t\tint\thopcount;\t/* number of servers to this 0 = local */\n525\t\tshort\tstatus;\t\t/* Client type */\n526\t\tchar\t*name;\t\t/* Pointer to unique name of the client */\n527\t\tchar\tnamebuf[NICKLEN+1]; /* nick of the client */\n528\t\tchar\tusername[USERLEN+1]; /* username here now for auth stuff */\n529\t\tchar\t*info;\t\t/* Free form additional client information */\n530\t\t/*\n531\t\t** The following fields are allocated only for local clients\n532\t\t** (directly connected to *this* server with a socket.\n533\t\t** The first of them *MUST* be the \"count\"--it is the field\n534\t\t** to which the allocation is tied to! *Never* refer to\n535\t\t** these fields, if (from != self).\n536\t\t*/\n537\t\tint\tcount;\t\t/* Amount of data in buffer */\n538\t\tchar\tbuffer[BUFSIZE]; /* Incoming message buffer */\n539\t#ifdef\tZIP_LINKS\n540\t\taZdata\t*zip;\t\t/* zip data */\n541\t#endif\n542\t\tshort\tlastsq;\t\t/* # of 2k blocks when sendqueued called last*/\n543\t\tdbuf\tsendQ;\t\t/* Outgoing message queue--if socket full */\n544\t\tdbuf\trecvQ;\t\t/* Hold for data incoming yet to be parsed */\n545\t\tlong\tsendM;\t\t/* Statistics: protocol messages send */\n546\t\tlong\treceiveM;\t/* Statistics: protocol messages received */\n547\t\tunsigned long long\tsendB;\t\t/* Statistics: total bytes send */\n548\t\tunsigned long long\treceiveB;\t/* Statistics: total bytes received */\n549\t\ttime_t\tlasttime;\t/* last time we received data */\n550\t\ttime_t\tfirsttime;\t/* time client was created */\n551\t\ttime_t\tsince;\t\t/* last time we parsed something */\n552\t\taClient\t*acpt;\t\t/* listening client which we accepted from */\n553\t\tLink\t*confs;\t\t/* Configuration record associated */\n554\t\tint\tping;\n555\t\tint\tauthfd;\t\t/* fd for rfc931 authentication */\n556\t\tchar\t*auth;\n557\t\tu_short\tport;\t\t/* and the remote port# too :-) */\n558\t\tstruct\tIN_ADDR\tip;\t/* keep real ip# too */\n559\t\tstruct\thostent\t*hostp;\n560\t\tchar\tsockhost[HOSTLEN+1]; /* This is the host name from the socket\n561\t\t\t\t\t  ** and after which the connection was\n562\t\t\t\t\t  ** accepted.\n563\t\t\t\t\t  */\n564\t\tchar\tpasswd[PASSWDLEN+1];\n565\t\tchar\texitc;\n566\t\tchar\t*reason;\t/* additional exit message */\n567\t#ifdef XLINE\n568\t\t/* Those logically should be in anUser struct, but would be null for\n569\t\t** all remote users... so better waste two pointers for all local\n570\t\t** non-users than two pointers for all remote users. --B. */\n571\t\tchar\t*user2;\t/* 2nd param of USER */\n572\t\tchar\t*user3;\t/* 3rd param of USER */\n573\t#endif\n574\t\n575\t};\n576\t\n577\t#define\tCLIENT_LOCAL_SIZE sizeof(aClient)\n578\t#define\tCLIENT_REMOTE_SIZE offsetof(aClient,count)\n579\t\n580\t/*\n581\t * statistics structures\n582\t */\n583\tstruct\tstats {\n584\t\tu_int\tis_cl;\t/* number of client connections */\n585\t\tu_int\tis_sv;\t/* number of server connections */\n586\t\tu_int\tis_ni;\t/* connection but no idea who it was\n587\t\t\t\t * (can be a P: line that has been removed -krys) */\n588\t\tunsigned long long\tis_cbs;\t/* bytes sent to clients */\n589\t\tunsigned long long\tis_cbr;\t/* bytes received to clients */\n590\t\tunsigned long long\tis_sbs;\t/* bytes sent to servers */\n591\t\tunsigned long long\tis_sbr;\t/* bytes received to servers */\n592\t\ttime_t\tis_cti;\t/* time spent connected by clients */\n593\t\ttime_t\tis_sti;\t/* time spent connected by servers */\n594\t\tu_int\tis_ac;\t/* connections accepted */\n595\t\tu_int\tis_ref;\t/* accepts refused */\n596\t\tu_int\tis_unco; /* unknown commands */\n597\t\tu_int\tis_wrdi; /* command going in wrong direction */\n598\t\tu_int\tis_unpf; /* unknown prefix */\n599\t\tu_int\tis_empt; /* empty message */\n600\t\tu_int\tis_num;\t/* numeric message */\n601\t\tu_int\tis_kill; /* number of kills generated on collisions */\n602\t\tu_int\tis_save; /* number of saved clients */\n603\t\tu_int\tis_fake; /* MODE 'fakes' */\n604\t\tu_int\tis_reop; /* number of local reops */\n605\t\tu_int\tis_rreop; /* number of remote reops */\n606\t\tu_int\tis_asuc; /* successful auth requests */\n607\t\tu_int\tis_abad; /* bad auth requests */\n608\t\tu_int\tis_udpok;\t/* packets recv'd on udp port */\n609\t\tu_int\tis_udperr;\t/* packets recvfrom errors on udp port */\n610\t\tu_int\tis_udpdrop;\t/* packets recv'd but dropped on udp port */\n611\t\tu_int\tis_loc;\t/* local connections made */\n612\t\tu_int\tis_nosrv; /* user without server */\n613\t\tu_long\tis_wwcnt; /* number of nicks overwritten in whowas[] */\n614\t\tunsigned long long\tis_wwt;\t/* sum of elapsed time on when \n615\t\t\t\t\t\t** overwriting whowas[] */\n616\t\tu_long\tis_wwMt;  /* max elapsed time on when overwriting whowas[] */\n617\t\tu_long\tis_wwmt;  /* min elapsed time on when overwriting whowas[] */\n618\t\tu_long\tis_lkcnt; /* number of nicks overwritten in locked[] */\n619\t\tunsigned long long\tis_lkt;\t/* sum of elapsed time on when\n620\t\t\t\t\t\t** overwriting locked[]*/\n621\t\tu_long\tis_lkMt;  /* max elapsed time on when overwriting locked[] */\n622\t\tu_long\tis_lkmt;  /* min elapsed time on when overwriting locked[] */\n623\t\tu_int\tis_ckl;   /* calls to check_link() */\n624\t\tu_int\tis_cklQ;  /* rejected: SendQ too high */\n625\t\tu_int\tis_ckly;  /* rejected: link too young */\n626\t\tu_int\tis_cklno; /* rejected: \"flood\" */\n627\t\tu_int\tis_cklok; /* accepted */\n628\t\tu_int\tis_cklq;  /* accepted early */\n629\t};\n630\t\n631\t/* mode structure for channels */\n632\t\n633\tstruct\tSMode\t{\n634\t\tu_int\tmode;\n635\t\tint\tlimit;\n636\t\tchar\tkey[KEYLEN+1];\n637\t};\n638\t\n639\t/* Message table structure */\n640\t\n641\ttypedef\tint\t(*CmdHandler)(aClient *, aClient *, int, char **);\n642\t\n643\tstruct\tCmd {\n644\t\tCmdHandler\thandler;\t/* command */\n645\t\tu_int\t\tcount;\t\t/* total count */\n646\t\tu_int\t\trcount;\t\t/* remote count */\n647\t\tu_long\t\tbytes;\n648\t\tu_long\t\trbytes;\n649\t};\n650\t\n651\tstruct\tMessage\t{\n652\t\tchar\t*cmd;\n653\t\tint\tminparams;\n654\t\tint\tmaxparams;\n655\t\tstruct Cmd\thandlers[STAT_MAX];\n656\t};\n657\t\n658\t/* fd array structure */\n659\t\n660\tstruct\tfdarray\t{\n661\t\tint\tfd[MAXCONNECTIONS];\n662\t\tint\thighest;\n663\t};\n664\t\n665\t/* general link structure used for chains */\n666\t\n667\tstruct\tSLink\t{\n668\t\tstruct\tSLink\t*next;\n669\t\tunion {\n670\t\t\taClient\t*cptr;\n671\t\t\taChannel *chptr;\n672\t\t\taConfItem *aconf;\n673\t\t\taListItem *alist;\n674\t\t\tchar\t*cp;\n675\t\t\tint\ti;\n676\t\t} value;\n677\t\tint\tflags;\n678\t};\n679\t\n680\t/* link structure used for invites */\n681\t\n682\tstruct\tinvSLink\t{\n683\t\tstruct\tinvSLink\t*next;\n684\t\taChannel\t\t*chptr;\n685\t\tchar\t\t\t*who;\n686\t\tint\t\t\tflags;\n687\t};\n688\t\n689\t/* channel structure */\n690\t\n691\tstruct Channel\t{\n692\t\tstruct\tChannel *nextch, *prevch, *hnextch;\n693\t\tu_int\thashv;\t\t/* raw hash value */\n694\t\tMode\tmode;\n695\t\tchar\ttopic[TOPICLEN+1];\n696\t#ifdef TOPIC_WHO_TIME\n697\t\tchar\ttopic_nuh[BANLEN+1];\n698\t\ttime_t\ttopic_t;\n699\t#endif\n700\t\tint\tusers;\t\t/* current membership total */\n701\t\tLink\t*members;\t/* channel members */\n702\t\tLink\t*invites;\t/* outstanding invitations */\n703\t\tLink\t*mlist;\t\t/* list of extended modes: +b/+e/+I */\n704\t\tLink\t*clist;\t\t/* list of local! connections which are members */\n705\t\ttime_t\thistory;\t/* channel history (aka channel delay) */\n706\t\ttime_t\treop;\t\t/* server reop stamp for !channels */\n707\t#ifdef JAPANESE\n708\t\tint flags;\n709\t#endif\n710\t\tchar\tchname[1];\n711\t};\n712\t\n713\t/*\n714\t** Channel Related macros follow\n715\t*/\n716\t\n717\t/* Channel related flags */\n718\t\n719\t#define\tCHFL_UNIQOP     0x0001 /* Channel creator */\n720\t#define\tCHFL_CHANOP     0x0002 /* Channel operator */\n721\t#define\tCHFL_VOICE      0x0004 /* the power to speak */\n722\t#define\tCHFL_BAN\t0x0008 /* ban channel flag */\n723\t#define\tCHFL_EXCEPTION\t0x0010 /* exception channel flag */\n724\t#define\tCHFL_INVITE\t0x0020 /* invite channel flag */\n725\t#define\tCHFL_REOPLIST\t0x0040 /* reoplist channel flag */\n726\t\n727\t/* Channel Visibility macros */\n728\t\n729\t#define\tMODE_UNIQOP\tCHFL_UNIQOP\n730\t#define\tMODE_CHANOP\tCHFL_CHANOP\n731\t#define\tMODE_VOICE\tCHFL_VOICE\n732\t#define\tMODE_PRIVATE\t0x00008\n733\t#define\tMODE_SECRET\t0x00010\n734\t#define\tMODE_MODERATED  0x00020\n735\t#define\tMODE_TOPICLIMIT 0x00040\n736\t#define\tMODE_INVITEONLY 0x00080\n737\t#define\tMODE_NOPRIVMSGS 0x00100\n738\t#define\tMODE_KEY\t0x00200\n739\t#define\tMODE_BAN\t0x00400\n740\t#define\tMODE_LIMIT\t0x00800\n741\t#define\tMODE_ANONYMOUS\t0x01000\n742\t#define\tMODE_QUIET\t0x02000\n743\t#define\tMODE_EXCEPTION\t0x04000\n744\t#define\tMODE_INVITE\t0x08000\n745\t#define\tMODE_REOP\t0x10000\n746\t#define\tMODE_REOPLIST\t0x20000\n747\t#define\tMODE_FLAGS\t0x3ffff\n748\t/*\n749\t * mode flags which take another parameter (With PARAmeterS)\n750\t */\n751\t#define\tMODE_WPARAS\t(MODE_UNIQOP|MODE_CHANOP|MODE_VOICE|MODE_BAN|MODE_KEY\\\n752\t\t\t\t |MODE_LIMIT|MODE_INVITE|MODE_EXCEPTION|MODE_REOPLIST)\n753\t/*\n754\t * Undefined here, these are used in conjunction with the above modes in\n755\t * the source.\n756\t#define\tMODE_DEL       0x40000000\n757\t#define\tMODE_ADD       0x80000000\n758\t */\n759\t\n760\t#define\tHoldChannel(x)\t\t(!(x))\n761\t/* name invisible */\n762\t#define\tSecretChannel(x)\t((x) && ((x)->mode.mode & MODE_SECRET))\n763\t/* channel not shown but names are */\n764\t#define\tHiddenChannel(x)\t((x) && ((x)->mode.mode & MODE_PRIVATE))\n765\t/* channel visible */\n766\t#define\tShowChannel(v,c)\t(PubChannel(c) || IsMember((v),(c)))\n767\t#define\tIsAnonymous(c)\t\t((c) && ((c)->mode.mode & MODE_ANONYMOUS))\n768\t#define\tPubChannel(x)\t\t((!x) || ((x)->mode.mode &\\\n769\t\t\t\t\t (MODE_PRIVATE | MODE_SECRET)) == 0)\n770\t\n771\t/*\n772\t#define\tIsMember(u, c)\t\t(assert(*(c)->chname != '\\0'), find_user_link((c)->members, u) ? 1 : 0)\n773\t#define\tIsMember(u, c)\t\t(find_user_link((c)->members, u) ? 1 : 0)\n774\t*/\n775\t#define       IsMember(u, c)          (u && (u)->user && \\\n776\t\t\t       find_channel_link((u)->user->channel, c) ? 1 : 0)\n777\t# define\tIsChannelName(n)\t((n) && (*(n) == '#' || *(n) == '&' ||\\\n778\t\t\t\t\t\t*(n) == '+' || \\\n779\t\t\t\t\t\t(*(n) == '!' && cid_ok(n, CHIDLEN))))\n780\t#define\tIsQuiet(x)\t\t((x)->mode.mode & MODE_QUIET)\n781\t#define\tUseModes(n)\t\t((n) && (*(n) == '#' || *(n) == '&' || \\\n782\t\t\t\t\t\t *(n) == '!'))\n783\t\n784\t/* Misc macros */\n785\t\n786\t#define\tBadPtr(x) (!(x) || (*(x) == '\\0'))\n787\t#define\tBadTo(x) (BadPtr((x)) ? \"*\" : (x))\n788\t\n789\t#define\tMyConnect(x)\t\t\t((x)->fd >= 0)\n790\t#define\tMyClient(x)\t\t\t(MyConnect(x) && IsClient(x))\n791\t#define\tMyPerson(x)\t\t\t(MyConnect(x) && IsPerson(x))\n792\t#define\tMyOper(x)\t\t\t(MyConnect(x) && IsOper(x))\n793\t#define\tMyService(x)\t\t\t(MyConnect(x) && IsService(x))\n794\t#define\tME\tme.name\n795\t#define\tMES\tme.serv->sid\n796\t\n797\t#define\tGotDependantClient(x)\t(x->prev &&\t\t\t\t\\\n798\t\t\t \t\t ((IsRegisteredUser(x->prev) &&\t\t\\\n799\t\t\t\t\t  x->prev->user->servp == x->serv) ||\t\\\n800\t\t\t\t\t  (IsService(x->prev) &&\t\t\\\n801\t\t\t\t\t  x->prev->service->servp == x->serv)))\n802\t\n803\t#define\tIsMasked(x)\t\t(x && x->serv && x->serv->maskedby != x)\n804\t\n805\t#define IsSplit()\t\t(iconf.split > 0)\n806\t\n807\ttypedef\tstruct\t{\n808\t\tu_long\tis_user[2];\t/* users, non[0] invis and invis[1] */\n809\t\tu_long\tis_serv;\t/* servers */\n810\t\tu_long\tis_eobservers;  /* number of servers which sent EOB */\n811\t\tu_long\tis_masked;\t/* masked servers. */\n812\t\tu_long\tis_service;\t/* services */\n813\t\tu_long\tis_chan;\t/* channels */\n814\t\tu_long\tis_chanmem;\n815\t\tu_long\tis_chanusers;\t/* channels users */\n816\t\tu_long\tis_hchan;\t/* channels in history */\n817\t\tu_long\tis_hchanmem;\n818\t\tu_long\tis_cchan;\t/* channels in cache */\n819\t\tu_long\tis_cchanmem;\n820\t\tu_long\tis_away;\t/* away sets */\n821\t\tu_long\tis_awaymem;\n822\t\tu_long\tis_oper;\t/* opers */\n823\t\tu_long\tis_bans;\t/* bans */\n824\t\tu_long\tis_banmem;\n825\t\tu_long\tis_invite;\t/* invites */\n826\t\tu_long\tis_class;\t/* classes */\n827\t\tu_long\tis_conf;\t/* conf lines */\n828\t\tu_long\tis_confmem;\n829\t\tu_long\tis_conflink;\t/* attached conf lines */\n830\t\tu_long\tis_myclnt;\t/* local clients */\n831\t\tu_long\tis_myserv;\t/* local servers */\n832\t\tu_long\tis_myservice;\t/* local services */\n833\t\tu_long\tis_unknown;\t/* unknown (local) connections */\n834\t\tu_long\tis_wwusers;\t/* users kept for whowas[] */\n835\t\tu_long\tis_wwaways;\t/* aways in users in whowas[] */\n836\t\tu_long\tis_wwawaysmem;\n837\t\tu_long\tis_wwuwas;\t/* uwas links */\n838\t\tu_long\tis_localc;\t/* local items (serv+service+client+..) */\n839\t\tu_long\tis_remc;\t/* remote clients */\n840\t\tu_long\tis_users;\t/* user structs */\n841\t\tu_long\tis_useri;\t/* user invites */\n842\t\tu_long\tis_userc;\t/* user links to channels */\n843\t\tu_long\tis_auth;\t/* OTHER ident reply block */\n844\t\tu_long\tis_authmem;\n845\t\tu_int\tis_dbuf;\t/* number of dbuf allocated (originally) */\n846\t\tu_int\tis_dbufnow;\t/* number of dbuf allocated */\n847\t\tu_int\tis_dbufuse;\t/* number of dbuf in use */\n848\t\tu_int\tis_dbufmin;\t/* min number of dbuf in use */\n849\t\tu_int\tis_dbufmax;\t/* max number of dbuf in use */\n850\t\tu_int\tis_dbufmore;\t/* how many times we increased the bufferpool*/\n851\t\tu_long\tis_m_users;\t/* maximum users connected */\n852\t\ttime_t\tis_m_users_t;\t/* timestamp of last maximum users */\n853\t\tu_long\tis_m_serv;\t/* maximum servers connected */\n854\t\tu_long\tis_m_service;\t/* maximum services connected */\n855\t\tu_long\tis_m_myclnt;\t/* maximum local clients */\n856\t\ttime_t\tis_m_myclnt_t;\t/* timestamp of last maximum local clients */\n857\t\tu_long\tis_m_myserv;\t/* maximum local servers */\n858\t\tu_long\tis_m_myservice;\t/* maximum local services */\n859\t\tu_long\tis_l_myclnt;\t/* last local user count */\n860\t\ttime_t\tis_l_myclnt_t;\t/* timestamp for last count */\n861\t#ifdef DELAY_CLOSE\n862\t\tu_long\tis_delayclose;\t/* number of fds that got delayed close() */\n863\t\tu_int\tis_delayclosewait;\t/* number of fds that wait for delayed close() */\n864\t#endif\n865\t} istat_t;\n866\t\n867\t/* String manipulation macros */\n868\t\n869\t/* strncopynt --> strncpyzt to avoid confusion, sematics changed\n870\t   N must be now the number of bytes in the array --msa */\n871\t#define\tstrncpyzt(x, y, N) do{(void)strncpy(x,y,N);x[N-1]='\\0';}while(0)\n872\t#define\tStrEq(x,y)\t(!strcmp((x),(y)))\n873\t\n874\t/* used in SetMode() in channel.c and m_umode() in s_msg.c */\n875\t\n876\t#define\tMODE_NULL      0\n877\t#define\tMODE_ADD       0x40000000\n878\t#define\tMODE_DEL       0x20000000\n879\t\n880\t/* return values for hunt_server() */\n881\t\n882\t#define\tHUNTED_NOSUCH\t(-1)\t/* if the hunted server is not found */\n883\t#define\tHUNTED_ISME\t0\t/* if this server should execute the command */\n884\t#define\tHUNTED_PASS\t1\t/* if message passed onwards successfully */\n885\t\n886\t/* used when sending to $#mask or $$mask */\n887\t\n888\t#define\tMATCH_SERVER\t1\n889\t#define\tMATCH_HOST\t2\n890\t\n891\t/* used for sendto_serv */\n892\t\n893\t#define\tSV_OLD\t\t0x0000\n894\t#define SV_UID\t\t0x0001\n895\t#define\tSV_2_11\t\tSV_UID\n896\t\n897\t/* used for sendto_flag */\n898\t\n899\ttypedef\tstruct\t{\n900\t\tint\tsvc_chan;\n901\t\tchar\t*svc_chname;\n902\t\tstruct\tChannel\t*svc_ptr;\n903\t\tint\tfd;\n904\t}\tSChan;\n905\t\n906\ttypedef enum ServerChannels {\n907\t\tSCH_ERROR,\n908\t\tSCH_NOTICE,\n909\t\tSCH_KILL,\n910\t\tSCH_CHAN,\n911\t\tSCH_NUM,\n912\t\tSCH_SERVER,\n913\t\tSCH_HASH,\n914\t\tSCH_LOCAL,\n915\t\tSCH_SERVICE,\n916\t\tSCH_DEBUG,\n917\t\tSCH_AUTH,\n918\t\tSCH_SAVE,\n919\t\tSCH_WALLOP,\n920\t#ifdef CLIENTS_CHANNEL\n921\t\tSCH_CLIENT,\n922\t#endif\n923\t\tSCH_OPER,\n924\t\tSCH_MAX\t\n925\t} ServerChannels;\n926\t\n927\t/* used for async dns values */\n928\t\n929\t#define\tASYNC_NONE\t(-1)\n930\t#define\tASYNC_CLIENT\t0\n931\t#define\tASYNC_CONNECT\t1\n932\t#define\tASYNC_CONF\t2\n933\t#define\tASYNC_SERVER\t3\n934\t\n935\t/* Client exit codes for log file */\n936\t#define EXITC_UNDEF\t'-'\t/* unregistered client */\n937\t#define EXITC_REG\t'0'\t/* normal exit */\n938\t#define EXITC_AUTHFAIL\t'A'\t/* Authentication failure (iauth problem) */\n939\t#define EXITC_AUTHTOUT\t'a'\t/* Authentication time out */\n940\t#define EXITC_CLONE\t'C'\t/* CLONE_CHECK */\n941\t#define EXITC_DIE\t'd'\t/* server died */\n942\t#define EXITC_DEAD\t'D'\t/* socket died */\n943\t#define EXITC_ERROR\t'E'\t/* socket error */\n944\t#define EXITC_FLOOD\t'F'\t/* client flooding */\n945\t#define EXITC_FAILURE\t'f'\t/* connect failure */\n946\t#define EXITC_GHMAX\t'G'\t/* global clients per host max limit */\n947\t#define EXITC_GUHMAX\t'g'\t/* global clients per user@host max limit */\n948\t#define EXITC_NOILINE\t'I'\t/* No matching I:line */\n949\t#define EXITC_KLINE\t'k'\t/* K-lined */\n950\t#define EXITC_KILL\t'K'\t/* KILLed */\n951\t#define EXITC_LHMAX\t'L'\t/* local clients per host max limit */\n952\t#define EXITC_LUHMAX\t'l'\t/* local clients per user@host max limit */\n953\t#define EXITC_MBUF\t'M'\t/* mem alloc error */\n954\t#define EXITC_PING\t'P'\t/* ping timeout */\n955\t#define EXITC_BADPASS\t'p'\t/* bad password */\n956\t#define EXITC_SENDQ\t'Q'\t/* send queue exceeded */\n957\t#define EXITC_REF\t'R'\t/* Refused */\n958\t#ifdef TKLINE\n959\t#define EXITC_TKLINE\t't'\t/* tkline */\n960\t#endif\n961\t#define EXITC_AREF\t'U'\t/* Unauthorized by iauth */\n962\t#define EXITC_AREFQ\t'u'\t/* Unauthorized by iauth, be quiet */\n963\t#define EXITC_VIRUS\t'v'\t/* joined a channel used by PrettyPark virus */\n964\t#ifdef XLINE\n965\t#define EXITC_XLINE\t'X'\t/* Forbidden GECOS */\n966\t#endif\n967\t#define EXITC_YLINEMAX\t'Y'\t/* Y:line max clients limit */\n968\t\n969\t/* eXternal authentication slave OPTions */\n970\t#define\tXOPT_REQUIRED\t0x01\t/* require authentication be done by iauth */\n971\t#define\tXOPT_NOTIMEOUT\t0x02\t/* disallow iauth time outs */\n972\t#define XOPT_EXTWAIT\t0x10\t/* extend registration ping timeout */\n973\t#define XOPT_EARLYPARSE\t0x20\t/* allow early parsing and send USER/PASS\n974\t\t\t\t\t   information to iauth */\n975\t\n976\t/* misc defines */\n977\t\n978\t#define\tFLUSH_BUFFER\t-2\n979\t#define\tUTMP\t\t\"/etc/utmp\"\n980\t#define\tCOMMA\t\t\",\"\n981\t\n982\t#define\tSAP\tstruct SOCKADDR *\n983\t\n984\t/* safety checks */\n985\t#if ! (UIDLEN <= NICKLEN)\n986\t#   error UIDLEN must not be bigger than NICKLEN\n987\t#endif\n988\t#if ! (UIDLEN > SIDLEN)\n989\t#   error UIDLEN must be bigger than SIDLEN\n990\t#endif\n991\t#if (NICKLEN < LOCALNICKLEN)\n992\t#   error LOCALNICKLEN must not be bigger than NICKLEN\n993\t#endif\n994\t\n995\t/* WHO parameter flags */\n996\t#define WHO_FLAG_OPERS_ONLY\t0x0001\n997\t#define WHO_FLAG_CHANNEL\t0x0002\n998\t#define WHO_FLAG_HOP\t\t0x0004\n999\t#define WHO_FLAG_FLAGS\t\t0x0008\n1000\t#define WHO_FLAG_HOST\t\t0x0010\n1001\t#define WHO_FLAG_IP\t\t\t0x0020\n1002\t#define WHO_FLAG_IDLE\t\t0x0040\n1003\t#define WHO_FLAG_NICK\t\t0x0080\n1004\t#define WHO_FLAG_INFO\t\t0x0100\n1005\t#define WHO_FLAG_SERVER\t\t0x0200\n1006\t#define WHO_FLAG_TOKEN\t\t0x0400\n1007\t#define WHO_FLAG_USER\t\t0x0800\n1008\t#define WHO_FLAG_ACCOUNT\t0x1000\n1009\t#define WHO_FLAG_OP_LEVEL\t0x2000\n1010\t#define WHO_FLAG_SID\t\t0x4000\n1011\t#define WHO_FLAG_UID\t\t0x8000\n1012\t\n1013\tstruct who_opts\n1014\t{\n1015\t\tint flags;\n1016\t\tconst char *token;\n1017\t};\n1018\t\n1019\t/*\n1020\t * base for channel IDs and UIDs\n1021\t */\n1022\t#define CHIDNB 36\n1023\t\n1024\t\n1025\t/* Defines used for SET command */\n1026\t#define TSET_ACONNECT 0x001\n1027\t#define TSET_POOLSIZE 0x002\n1028\t#define TSET_CACCEPT 0x004\n1029\t#define TSET_SHOWALL (int) ~0\n1030\t\n1031\t/* Runtime configuration structure */\n1032\ttypedef struct\n1033\t{\n1034\t\tint aconnect;\t/* 0 - OFF 1 - ON */\n1035\t\t/* standalone splitmode is -1 not 3 */\n1036\t\tint split;\t/* -1: standalone, 0: no, >0 yes (and since when) */\n1037\t\tint split_minservers;\n1038\t\tint split_minusers;\n1039\t\tint caccept;\t/* 0 - OFF 1 - ON 2 - SPLIT */\n1040\t} iconf_t;\n1041\t\n1042\t/* O:line flags, used also in is_allowed() */\n1043\t#define ACL_LOCOP\t\t0x00001\n1044\t#define ACL_KILLLOCAL\t\t0x00002\n1045\t#define ACL_KILLREMOTE\t\t0x00004\n1046\t#define ACL_KILL\t\t(ACL_KILLLOCAL|ACL_KILLREMOTE)\n1047\t#define ACL_SQUITLOCAL\t\t0x00008\n1048\t#define ACL_SQUITREMOTE\t\t0x00010\n1049\t#define ACL_SQUIT\t\t(ACL_SQUITLOCAL|ACL_SQUITREMOTE)\n1050\t#define ACL_CONNECTLOCAL\t0x00020\n1051\t#define ACL_CONNECTREMOTE\t0x00040\n1052\t#define ACL_CONNECT\t\t(ACL_CONNECTLOCAL|ACL_CONNECTREMOTE)\n1053\t#define ACL_CLOSE\t\t0x00080\n1054\t#define ACL_HAZH\t\t0x00100\n1055\t#define ACL_DNS\t\t\t0x00200\n1056\t#define ACL_REHASH\t\t0x00400\n1057\t#define ACL_RESTART\t\t0x00800\n1058\t#define ACL_DIE\t\t\t0x01000\n1059\t#define ACL_SET\t\t\t0x02000\n1060\t#define ACL_TKLINE\t\t0x04000\n1061\t#define ACL_UNTKLINE\t\tACL_TKLINE\n1062\t#define ACL_CLIENTS\t\t0x08000\n1063\t#define ACL_CANFLOOD\t\t0x10000\n1064\t#define ACL_NOPENALTY\t\t0x20000\n1065\t#define ACL_TRACE\t\t0x40000\n1066\t#define ACL_KLINE\t\t0x80000\n1067\t#define ACL_SIDTRACE\t\t0x100000\n1068\t\n1069\t#define ACL_ALL_REMOTE\t\t(ACL_KILLREMOTE|ACL_SQUITREMOTE|ACL_CONNECTREMOTE)\n1070\t#define ACL_ALL\t\t\t0x1FFFFF\n1071\t\n1072\t#ifdef CLIENTS_CHANNEL\n1073\t/* information scope of &CLIENTS channel. */\n1074\t#define CCL_CONN     0x01\t/* connections */\n1075\t#define CCL_CONNINFO 0x02\t/* if connections, then with realname */\n1076\t#define CCL_QUIT     0x04\t/* quits */\n1077\t#define CCL_QUITINFO 0x08\t/* if quits, then with quit message */\n1078\t#define CCL_NICK     0x10\t/* nick changes */\n1079\t#endif\n1080\t\n1081\t"}]},"uuid":"8de8193e-a80c-43eb-a9b0-5ed023440753","timestamp":"2026-06-01T23:56:29.468Z","sourceToolAssistantUUID":"aaf37c7e-07b7-4b1e-8049-c9499a76bee2","userType":"external","entrypoint":"cli","cwd":"/home/xe/code/xeiaso.net/ircd.rs","sessionId":"83d912ac-5e1e-4525-89a0-e5166a07c355","version":"2.1.160","gitBranch":"master","slug":"i-would-like-to-humming-curry"}
.claude/sessions/7cd8bcef-cfca-430c-ac4e-8fe05137aba7/subagents/agent-ab40b605277d462e8.jsonl:55:{"parentUuid":"37c19e51-8984-45b2-9a5f-f64ea3d1eb61","isSidechain":true,"promptId":"a161063d-c181-4293-93b7-372308ff24b6","agentId":"ab40b605277d462e8","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_011i5wr1cbPtcPetnkQecWGT","type":"tool_result","content":"1\t/************************************************************************\n2\t *   IRC - Internet Relay Chat, common/struct_def.h\n3\t *   Copyright (C) 1990 Jarkko Oikarinen and\n4\t *                      University of Oulu, Computing Center\n5\t *\n6\t *   This program is free software; you can redistribute it and/or modify\n7\t *   it under the terms of the GNU General Public License as published by\n8\t *   the Free Software Foundation; either version 1, or (at your option)\n9\t *   any later version.\n10\t *\n11\t *   This program is distributed in the hope that it will be useful,\n12\t *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n13\t *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n14\t *   GNU General Public License for more details.\n15\t *\n16\t *   You should have received a copy of the GNU General Public License\n17\t *   along with this program; if not, write to the Free Software\n18\t *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n19\t *\n20\t *   $Id: struct_def.h,v 1.152 2011/01/20 14:26:56 bif Exp $\n21\t */\n22\t\n23\ttypedef\tstruct\tConfItem aConfItem;\n24\ttypedef\tstruct\tListItem aListItem;\n25\ttypedef\tstruct \tClient\taClient;\n26\ttypedef\tstruct\tChannel\taChannel;\n27\ttypedef\tstruct\tUser\tanUser;\n28\ttypedef\tstruct\tServer\taServer;\n29\ttypedef\tstruct\tService\taService;\n30\ttypedef\tstruct\tSLink\tLink;\n31\ttypedef\tstruct\tinvSLink\tinvLink;\n32\ttypedef\tstruct\tSMode\tMode;\n33\ttypedef\tstruct\tfdarray\tFdAry;\n34\ttypedef\tstruct\tCPing\taCPing;\n35\ttypedef\tstruct\tZdata\taZdata;\n36\ttypedef struct        LineItem aMotd;\n37\t#if defined(USE_IAUTH)\n38\ttypedef struct        LineItem aExtCf;\n39\ttypedef struct        LineItem aExtData;\n40\t#endif\n41\t\n42\t#define\tHOSTLEN\t\t63\t/* Length of hostname.  Updated to         */\n43\t\t\t\t\t/* comply with RFC1123                     */\n44\t\n45\t#if (INET6_ADDRSTRLEN > HOSTLEN)\n46\t#error HOSTLEN must not be smaller than INET6_ADDRSTRLEN\n47\t#endif\n48\t\n49\t#define\tNICKLEN\t\t15\t/* Must be the same network-wide. */\n50\t#define UIDLEN\t\t9\t/* must not be bigger than NICKLEN --Beeth */\n51\t#define\tUSERLEN\t\t10\n52\t#define\tREALLEN\t \t50\n53\t#define\tTOPICLEN\t255\n54\t#define\tCHANNELLEN\t50\n55\t#define\tPASSWDLEN \t20\n56\t#define\tKEYLEN\t\t23\n57\t#define\tBUFSIZE\t\t512\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n58\t#define\tMAXRECIPIENTS \t20\n59\t#define\tMAXBANS\t\t64\n60\t#define\tMAXBANLENGTH\t2048\n61\t#define\tBANLEN\t\t(USERLEN + NICKLEN + HOSTLEN + 3)\n62\t#define MAXPENALTY\t10\n63\t#define\tCHIDLEN\t\t5\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n64\t#define\tSIDLEN\t\t4\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n65\t#define\tMAXMODEPARAMS\t3\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n66\t#define\tDELAYCHASETIMELIMIT\t1800\t/* WARNING: *DONT* CHANGE THIS!!!! */\n67\t#define\tLDELAYCHASETIMELIMIT\t5400\t/* WARNING: *DONT* CHANGE THIS!!!! */\n68\t\n69\t#define\tREADBUF_SIZE\t16384\t/* used in s_bsd.c *AND* s_zip.c ! */\n70\t \n71\t/*\n72\t * Make up some numbers which should reflect average leaf server connect\n73\t * queue max size.\n74\t * queue=(<# of channels> * <channel size> + <user size> * <# of users>) * 2\n75\t * pool=<queue per client> * <avg. # of clients having data in queue>\n76\t */\n77\t#define\tQUEUELEN\t(((MAXCONNECTIONS / 10) * (CHANNELLEN + BANLEN + 16) +\\\n78\t\t\t\t  (HOSTLEN * 4 + REALLEN + NICKLEN + USERLEN + 24) *\\\n79\t\t\t\t  (MAXCONNECTIONS / 2)) * 2)\n80\t\n81\t#define\tBUFFERPOOL\t(DBUFSIZ * MAXCONNECTIONS * 2) + \\\n82\t\t\t\t(QUEUELEN * MAXSERVERS)\n83\t\n84\t#define\tUSERHOST_REPLYLEN\t(NICKLEN+HOSTLEN+USERLEN+5)\n85\t\n86\t/*\n87\t** 'offsetof' is defined in ANSI-C. The following definition\n88\t** is not absolutely portable (I have been told), but so far\n89\t** it has worked on all machines I have needed it. The type\n90\t** should be size_t but...  --msa\n91\t*/\n92\t#ifndef offsetof\n93\t#define\toffsetof(t,m) (int)((&((t *)0L)->m))\n94\t#endif\n95\t\n96\t#define\telementsof(x) (sizeof(x)/sizeof(x[0]))\n97\t\n98\t/*\n99\t** flags for bootup options (command line flags)\n100\t*/\n101\t#define\tBOOT_CONSOLE\t0x001\n102\t#define\tBOOT_QUICK\t0x002\n103\t#define\tBOOT_DEBUG\t0x004\n104\t#define\tBOOT_INETD\t0x008\n105\t#define\tBOOT_TTY\t0x010\n106\t\n107\t#define\tBOOT_AUTODIE\t0x040\n108\t#define\tBOOT_BADTUNE\t0x080\n109\t#define\tBOOT_PROT\t0x100\n110\t#define\tBOOT_STRICTPROT\t0x200\n111\t#define\tBOOT_NOIAUTH\t0x400\n112\t#define\tBOOT_STANDALONE\t0x800\n113\t\n114\ttypedef enum Status {\n115\t\tSTAT_CONNECTING = -4,\n116\t\tSTAT_HANDSHAKE, /* -3 */\n117\t\tSTAT_UNKNOWN,\t/* -2 */\n118\t\tSTAT_ME,\t/* -1 */\n119\t\tSTAT_SERVER,\t/* 0 */\n120\t\tSTAT_CLIENT,\t/* 1 */\n121\t\tSTAT_OPER,\t/* 2 */\n122\t\tSTAT_SERVICE,\t/* 3 */\n123\t\tSTAT_UNREG,\t/* 4 */\n124\t\tSTAT_MAX\t/* 5 -- size of handler[] table we need */\n125\t} Status;\n126\t\n127\t/*\n128\t * status macros.\n129\t */\n130\t#define\tIsRegisteredUser(x)\t(((x)->status == STAT_CLIENT || \\\n131\t\t\t\t\t (x)->status == STAT_OPER) && (x)->user)\n132\t#define\tIsRegistered(x)\t\t((x)->status >= STAT_SERVER || \\\n133\t\t\t\t\t (x)->status == STAT_ME)\n134\t#define\tIsConnecting(x)\t\t((x)->status == STAT_CONNECTING)\n135\t#define\tIsHandshake(x)\t\t((x)->status == STAT_HANDSHAKE)\n136\t#define\tIsMe(x)\t\t\t((x)->status == STAT_ME)\n137\t#define\tIsUnknown(x)\t\t((x)->status == STAT_UNKNOWN)\n138\t#define\tIsServer(x)\t\t((x)->status == STAT_SERVER)\n139\t#define\tIsClient(x)\t\t((x)->status == STAT_CLIENT || \\\n140\t\t\t\t\t (x)->status == STAT_OPER)\n141\t#define\tIsService(x)\t\t((x)->status == STAT_SERVICE && (x)->service)\n142\t\n143\t#define\tSetConnecting(x)\t((x)->status = STAT_CONNECTING)\n144\t#define\tSetHandshake(x)\t\t((x)->status = STAT_HANDSHAKE)\n145\t#define\tSetMe(x)\t\t((x)->status = STAT_ME)\n146\t#define\tSetUnknown(x)\t\t((x)->status = STAT_UNKNOWN)\n147\t#define\tSetServer(x)\t\t((x)->status = STAT_SERVER)\n148\t#define\tSetClient(x)\t\t((x)->status = IsAnOper((x)) ? STAT_OPER : STAT_CLIENT)\n149\t#define\tSetService(x)\t\t((x)->status = STAT_SERVICE)\n150\t\n151\t#define\tFLAGS_PINGSENT\t0x0000001 /* Unreplied ping sent */\n152\t#define\tFLAGS_DEADSOCK\t0x0000002 /* Local socket is dead--Exiting soon */\n153\t#define\tFLAGS_KILLED\t0x0000004 /* Prevents \"QUIT\" from being sent for this */\n154\t#define\tFLAGS_BLOCKED\t0x0000008 /* socket is in blocked condition [unused] */\n155\t#ifdef UNIXPORT\n156\t#define\tFLAGS_UNIX\t0x0000010 /* socket is in the unix domain, not inet */\n157\t#endif\n158\t#define\tFLAGS_CLOSING\t0x0000020 /* set when closing to suppress errors */\n159\t#define\tFLAGS_LISTEN\t0x0000040 /* used to mark clients which we listen() on */\n160\t#define\tFLAGS_XAUTHDONE\t0x0000080 /* iauth is finished with this client */\n161\t#define\tFLAGS_DOINGDNS\t0x0000100 /* client is waiting for a DNS response */\n162\t#define\tFLAGS_AUTH\t0x0000200 /* client is waiting on rfc931 response */\n163\t#define\tFLAGS_WRAUTH\t0x0000400 /* set if we havent writen to ident server */\n164\t#define\tFLAGS_LOCAL\t0x0000800 /* set for local clients */\n165\t#define\tFLAGS_GOTID\t0x0001000 /* successful ident lookup achieved */\n166\t#define\tFLAGS_XAUTH\t0x0002000 /* waiting on external authentication */\n167\t#define\tFLAGS_WXAUTH\t0x0004000 /* same as above, but also prevent parsing */\n168\t#define\tFLAGS_NONL\t0x0008000 /* No \\n in buffer */\n169\t#define\tFLAGS_CBURST\t0x0010000 /* set to mark connection burst being sent */\n170\t#define\tFLAGS_QUIT\t0x0040000 /* QUIT :comment shows it's not a split */\n171\t#define\tFLAGS_SPLIT\t0x0080000 /* client QUITting because of a netsplit */\n172\t#define\tFLAGS_HIDDEN\t0x0100000 /* netsplit is behind a hostmask,\n173\t\t\t\t\t     also used for marking clients in who_find\n174\t\t\t\t\t   */\n175\t#define\tFLAGS_UNKCMD\t0x0200000 /* has sent an unknown command */\n176\t#define\tFLAGS_ZIP\t0x0400000 /* link is zipped */\n177\t#define\tFLAGS_ZIPRQ\t0x0800000 /* zip requested */\n178\t#define\tFLAGS_ZIPSTART\t0x1000000 /* start of zip (ignore any CRLF) */\n179\t#define\tFLAGS_SQUIT\t0x2000000 /* This is set when we send the last\n180\t\t\t\t\t  ** server, so we know we have to send\n181\t\t\t\t\t  ** a SQUIT. */\n182\t#define\tFLAGS_EOB\t0x4000000 /* EOB received */\n183\t#define FLAGS_LISTENINACTIVE 0x8000000 /* Listener does not listen() */\n184\t#ifdef JAPANESE\n185\t#define\tFLAGS_JP\t0x10000000 /* jp version, used both for chans and servs */\n186\t#endif\n187\t\t\n188\t#define\tFLAGS_OPER\t0x0001 /* operator */\n189\t#define\tFLAGS_LOCOP\t0x0002 /* local operator -- SRB */\n190\t#define\tFLAGS_WALLOP\t0x0004 /* send wallops to them */\n191\t#define\tFLAGS_INVISIBLE\t0x0008 /* makes user invisible */\n192\t#define FLAGS_RESTRICT\t0x0010 /* restricted user */\n193\t#define FLAGS_AWAY\t0x0020 /* user is away */\n194\t#define FLAGS_EXEMPT    0x0040 /* user is exempted from k-lines */\n195\t#ifdef XLINE\n196\t#define FLAGS_XLINED\t0x0100\t/* X-lined client */\n197\t#endif\n198\t#define FLAGS_TLS       0x0200 /* user is on a secure connection port (SSL/TLS) -- mh 2020-04-27 */\n199\t#define\tSEND_UMODES\t(FLAGS_INVISIBLE|FLAGS_OPER|FLAGS_WALLOP|FLAGS_AWAY|FLAGS_RESTRICT)\n200\t#define\tALL_UMODES\t(SEND_UMODES|FLAGS_LOCOP)"}]},"uuid":"019e683b-d4b6-455c-bf10-5bc8ec0c348e","timestamp":"2026-06-03T04:42:22.619Z","sourceToolAssistantUUID":"37c19e51-8984-45b2-9a5f-f64ea3d1eb61","userType":"external","entrypoint":"cli","cwd":"/home/xe/code/xeiaso.net/ircd.rs","sessionId":"7cd8bcef-cfca-430c-ac4e-8fe05137aba7","version":"2.1.161","gitBranch":"master","slug":"please-write-a-detailed-hazy-fox"}
.claude/sessions/becc4174-eaeb-44af-ba37-798ccb4c128e/subagents/agent-a6b5b0c7553644ad7.jsonl:200:{"parentUuid":"de176a9d-dc34-4bdf-ab99-bcca2f50955e","isSidechain":true,"promptId":"1f56fad9-bf09-45aa-9803-159db475535f","agentId":"a6b5b0c7553644ad7","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01296hSHnoYtSQ5zBNHUACrY","type":"tool_result","content":"60\t#define\tMAXBANLENGTH\t2048\n61\t#define\tBANLEN\t\t(USERLEN + NICKLEN + HOSTLEN + 3)\n62\t#define MAXPENALTY\t10\n63\t#define\tCHIDLEN\t\t5\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n64\t#define\tSIDLEN\t\t4\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n65\t#define\tMAXMODEPARAMS\t3\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n66\t#define\tDELAYCHASETIMELIMIT\t1800\t/* WARNING: *DONT* CHANGE THIS!!!! */\n67\t#define\tLDELAYCHASETIMELIMIT\t5400\t/* WARNING: *DONT* CHANGE THIS!!!! */\n68\t\n69\t#define\tREADBUF_SIZE\t16384\t/* used in s_bsd.c *AND* s_zip.c ! */\n70\t \n71\t/*\n72\t * Make up some numbers which should reflect average leaf server connect\n73\t * queue max size.\n74\t * queue=(<# of channels> * <channel size> + <user size> * <# of users>) * 2\n75\t * pool=<queue per client> * <avg. # of clients having data in queue>\n76\t */\n77\t#define\tQUEUELEN\t(((MAXCONNECTIONS / 10) * (CHANNELLEN + BANLEN + 16) +\\\n78\t\t\t\t  (HOSTLEN * 4 + REALLEN + NICKLEN + USERLEN + 24) *\\\n79\t\t\t\t  (MAXCONNECTIONS / 2)) * 2)\n80\t\n81\t#define\tBUFFERPOOL\t(DBUFSIZ * MAXCONNECTIONS * 2) + \\\n82\t\t\t\t(QUEUELEN * MAXSERVERS)\n83\t\n84\t#define\tUSERHOST_REPLYLEN\t(NICKLEN+HOSTLEN+USERLEN+5)\n85\t\n86\t/*\n87\t** 'offsetof' is defined in ANSI-C. The following definition\n88\t** is not absolutely portable (I have been told), but so far\n89\t** it has worked on all machines I have needed it. The type\n90\t** should be size_t but...  --msa\n91\t*/\n92\t#ifndef offsetof\n93\t#define\toffsetof(t,m) (int)((&((t *)0L)->m))\n94\t#endif\n95\t\n96\t#define\telementsof(x) (sizeof(x)/sizeof(x[0]))\n97\t\n98\t/*\n99\t** flags for bootup options (command line flags)\n100\t*/\n101\t#define\tBOOT_CONSOLE\t0x001\n102\t#define\tBOOT_QUICK\t0x002\n103\t#define\tBOOT_DEBUG\t0x004\n104\t#define\tBOOT_INETD\t0x008\n105\t#define\tBOOT_TTY\t0x010\n106\t\n107\t#define\tBOOT_AUTODIE\t0x040\n108\t#define\tBOOT_BADTUNE\t0x080\n109\t#define\tBOOT_PROT\t0x100\n110\t#define\tBOOT_STRICTPROT\t0x200\n111\t#define\tBOOT_NOIAUTH\t0x400\n112\t#define\tBOOT_STANDALONE\t0x800\n113\t\n114\ttypedef enum Status {\n115\t\tSTAT_CONNECTING = -4,\n116\t\tSTAT_HANDSHAKE, /* -3 */\n117\t\tSTAT_UNKNOWN,\t/* -2 */\n118\t\tSTAT_ME,\t/* -1 */\n119\t\tSTAT_SERVER,\t/* 0 */\n120\t\tSTAT_CLIENT,\t/* 1 */\n121\t\tSTAT_OPER,\t/* 2 */\n122\t\tSTAT_SERVICE,\t/* 3 */\n123\t\tSTAT_UNREG,\t/* 4 */\n124\t\tSTAT_MAX\t/* 5 -- size of handler[] table we need */\n125\t} Status;\n126\t\n127\t/*\n128\t * status macros.\n129\t */\n130\t#define\tIsRegisteredUser(x)\t(((x)->status == STAT_CLIENT || \\\n131\t\t\t\t\t (x)->status == STAT_OPER) && (x)->user)\n132\t#define\tIsRegistered(x)\t\t((x)->status >= STAT_SERVER || \\\n133\t\t\t\t\t (x)->status == STAT_ME)\n134\t#define\tIsConnecting(x)\t\t((x)->status == STAT_CONNECTING)\n135\t#define\tIsHandshake(x)\t\t((x)->status == STAT_HANDSHAKE)\n136\t#define\tIsMe(x)\t\t\t((x)->status == STAT_ME)\n137\t#define\tIsUnknown(x)\t\t((x)->status == STAT_UNKNOWN)\n138\t#define\tIsServer(x)\t\t((x)->status == STAT_SERVER)\n139\t#define\tIsClient(x)\t\t((x)->status == STAT_CLIENT || \\\n140\t\t\t\t\t (x)->status == STAT_OPER)\n141\t#define\tIsService(x)\t\t((x)->status == STAT_SERVICE && (x)->service)\n142\t\n143\t#define\tSetConnecting(x)\t((x)->status = STAT_CONNECTING)\n144\t#define\tSetHandshake(x)\t\t((x)->status = STAT_HANDSHAKE)\n145\t#define\tSetMe(x)\t\t((x)->status = STAT_ME)\n146\t#define\tSetUnknown(x)\t\t((x)->status = STAT_UNKNOWN)\n147\t#define\tSetServer(x)\t\t((x)->status = STAT_SERVER)\n148\t#define\tSetClient(x)\t\t((x)->status = IsAnOper((x)) ? STAT_OPER : STAT_CLIENT)\n149\t#define\tSetService(x)\t\t((x)->status = STAT_SERVICE)\n150\t\n151\t#define\tFLAGS_PINGSENT\t0x0000001 /* Unreplied ping sent */\n152\t#define\tFLAGS_DEADSOCK\t0x0000002 /* Local socket is dead--Exiting soon */\n153\t#define\tFLAGS_KILLED\t0x0000004 /* Prevents \"QUIT\" from being sent for this */\n154\t#define\tFLAGS_BLOCKED\t0x0000008 /* socket is in blocked condition [unused] */\n155\t#ifdef UNIXPORT\n156\t#define\tFLAGS_UNIX\t0x0000010 /* socket is in the unix domain, not inet */\n157\t#endif\n158\t#define\tFLAGS_CLOSING\t0x0000020 /* set when closing to suppress errors */\n159\t#define\tFLAGS_LISTEN\t0x0000040 /* used to mark clients which we listen() on */\n160\t#define\tFLAGS_XAUTHDONE\t0x0000080 /* iauth is finished with this client */\n161\t#define\tFLAGS_DOINGDNS\t0x0000100 /* client is waiting for a DNS response */\n162\t#define\tFLAGS_AUTH\t0x0000200 /* client is waiting on rfc931 response */\n163\t#define\tFLAGS_WRAUTH\t0x0000400 /* set if we havent writen to ident server */\n164\t#define\tFLAGS_LOCAL\t0x0000800 /* set for local clients */\n165\t#define\tFLAGS_GOTID\t0x0001000 /* successful ident lookup achieved */\n166\t#define\tFLAGS_XAUTH\t0x0002000 /* waiting on external authentication */\n167\t#define\tFLAGS_WXAUTH\t0x0004000 /* same as above, but also prevent parsing */\n168\t#define\tFLAGS_NONL\t0x0008000 /* No \\n in buffer */\n169\t#define\tFLAGS_CBURST\t0x0010000 /* set to mark connection burst being sent */\n170\t#define\tFLAGS_QUIT\t0x0040000 /* QUIT :comment shows it's not a split */\n171\t#define\tFLAGS_SPLIT\t0x0080000 /* client QUITting because of a netsplit */\n172\t#define\tFLAGS_HIDDEN\t0x0100000 /* netsplit is behind a hostmask,\n173\t\t\t\t\t     also used for marking clients in who_find\n174\t\t\t\t\t   */\n175\t#define\tFLAGS_UNKCMD\t0x0200000 /* has sent an unknown command */\n176\t#define\tFLAGS_ZIP\t0x0400000 /* link is zipped */\n177\t#define\tFLAGS_ZIPRQ\t0x0800000 /* zip requested */\n178\t#define\tFLAGS_ZIPSTART\t0x1000000 /* start of zip (ignore any CRLF) */\n179\t#define\tFLAGS_SQUIT\t0x2000000 /* This is set when we send the last\n180\t\t\t\t\t  ** server, so we know we have to send\n181\t\t\t\t\t  ** a SQUIT. */\n182\t#define\tFLAGS_EOB\t0x4000000 /* EOB received */\n183\t#define FLAGS_LISTENINACTIVE 0x8000000 /* Listener does not listen() */\n184\t#ifdef JAPANESE\n185\t#define\tFLAGS_JP\t0x10000000 /* jp version, used both for chans and servs */\n186\t#endif\n187\t\t\n188\t#define\tFLAGS_OPER\t0x0001 /* operator */\n189\t#define\tFLAGS_LOCOP\t0x0002 /* local operator -- SRB */\n190\t#define\tFLAGS_WALLOP\t0x0004 /* send wallops to them */\n191\t#define\tFLAGS_INVISIBLE\t0x0008 /* makes user invisible */\n192\t#define FLAGS_RESTRICT\t0x0010 /* restricted user */\n193\t#define FLAGS_AWAY\t0x0020 /* user is away */\n194\t#define FLAGS_EXEMPT    0x0040 /* user is exempted from k-lines */\n195\t#ifdef XLINE\n196\t#define FLAGS_XLINED\t0x0100\t/* X-lined client */\n197\t#endif\n198\t#define FLAGS_TLS       0x0200 /* user is on a secure connection port (SSL/TLS) -- mh 2020-04-27 */\n199\t#define\tSEND_UMODES\t(FLAGS_INVISIBLE|FLAGS_OPER|FLAGS_WALLOP|FLAGS_AWAY|FLAGS_RESTRICT)\n200\t#define\tALL_UMODES\t(SEND_UMODES|FLAGS_LOCOP)\n201\t\n202\t/*\n203\t * user flags macros.\n204\t */\n205\t#define\tIsOper(x)\t\t((x)->user && (x)->user->flags & FLAGS_OPER)\n206\t#define\tIsLocOp(x)\t\t((x)->user && (x)->user->flags & FLAGS_LOCOP)\n207\t#define\tIsInvisible(x)\t\t((x)->user->flags & FLAGS_INVISIBLE)\n208\t#define IsRestricted(x)         ((x)->user && \\\n209\t\t\t\t\t (x)->user->flags & FLAGS_RESTRICT)"}]},"uuid":"9210f4b5-b68a-4c92-bf59-215e9975af46","timestamp":"2026-06-02T02:39:52.605Z","sourceToolAssistantUUID":"de176a9d-dc34-4bdf-ab99-bcca2f50955e","userType":"external","entrypoint":"cli","cwd":"/home/xe/code/xeiaso.net/ircd.rs","sessionId":"becc4174-eaeb-44af-ba37-798ccb4c128e","version":"2.1.160","gitBranch":"p0b-bindgen-layout"}
.claude/sessions/e83e5713-2d2e-41ff-8d3c-a19f61254d0c/subagents/agent-a4302537b1f8ae6ce.jsonl:10:{"parentUuid":"d50b1cd5-a5f0-4f9d-94f8-223a88490b4b","isSidechain":true,"promptId":"905332eb-c706-44b1-932d-ae42756842a3","agentId":"a4302537b1f8ae6ce","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01UghWrogmGgD4pJBEAra3Et","type":"tool_result","content":"1\t/************************************************************************\n2\t *   IRC - Internet Relay Chat, common/struct_def.h\n3\t *   Copyright (C) 1990 Jarkko Oikarinen and\n4\t *                      University of Oulu, Computing Center\n5\t *\n6\t *   This program is free software; you can redistribute it and/or modify\n7\t *   it under the terms of the GNU General Public License as published by\n8\t *   the Free Software Foundation; either version 1, or (at your option)\n9\t *   any later version.\n10\t *\n11\t *   This program is distributed in the hope that it will be useful,\n12\t *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n13\t *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n14\t *   GNU General Public License for more details.\n15\t *\n16\t *   You should have received a copy of the GNU General Public License\n17\t *   along with this program; if not, write to the Free Software\n18\t *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n19\t *\n20\t *   $Id: struct_def.h,v 1.152 2011/01/20 14:26:56 bif Exp $\n21\t */\n22\t\n23\ttypedef\tstruct\tConfItem aConfItem;\n24\ttypedef\tstruct\tListItem aListItem;\n25\ttypedef\tstruct \tClient\taClient;\n26\ttypedef\tstruct\tChannel\taChannel;\n27\ttypedef\tstruct\tUser\tanUser;\n28\ttypedef\tstruct\tServer\taServer;\n29\ttypedef\tstruct\tService\taService;\n30\ttypedef\tstruct\tSLink\tLink;\n31\ttypedef\tstruct\tinvSLink\tinvLink;\n32\ttypedef\tstruct\tSMode\tMode;\n33\ttypedef\tstruct\tfdarray\tFdAry;\n34\ttypedef\tstruct\tCPing\taCPing;\n35\ttypedef\tstruct\tZdata\taZdata;\n36\ttypedef struct        LineItem aMotd;\n37\t#if defined(USE_IAUTH)\n38\ttypedef struct        LineItem aExtCf;\n39\ttypedef struct        LineItem aExtData;\n40\t#endif\n41\t\n42\t#define\tHOSTLEN\t\t63\t/* Length of hostname.  Updated to         */\n43\t\t\t\t\t/* comply with RFC1123                     */\n44\t\n45\t#if (INET6_ADDRSTRLEN > HOSTLEN)\n46\t#error HOSTLEN must not be smaller than INET6_ADDRSTRLEN\n47\t#endif\n48\t\n49\t#define\tNICKLEN\t\t15\t/* Must be the same network-wide. */\n50\t#define UIDLEN\t\t9\t/* must not be bigger than NICKLEN --Beeth */\n51\t#define\tUSERLEN\t\t10\n52\t#define\tREALLEN\t \t50\n53\t#define\tTOPICLEN\t255\n54\t#define\tCHANNELLEN\t50\n55\t#define\tPASSWDLEN \t20\n56\t#define\tKEYLEN\t\t23\n57\t#define\tBUFSIZE\t\t512\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n58\t#define\tMAXRECIPIENTS \t20\n59\t#define\tMAXBANS\t\t64\n60\t#define\tMAXBANLENGTH\t2048\n61\t#define\tBANLEN\t\t(USERLEN + NICKLEN + HOSTLEN + 3)\n62\t#define MAXPENALTY\t10\n63\t#define\tCHIDLEN\t\t5\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n64\t#define\tSIDLEN\t\t4\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n65\t#define\tMAXMODEPARAMS\t3\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n66\t#define\tDELAYCHASETIMELIMIT\t1800\t/* WARNING: *DONT* CHANGE THIS!!!! */\n67\t#define\tLDELAYCHASETIMELIMIT\t5400\t/* WARNING: *DONT* CHANGE THIS!!!! */\n68\t\n69\t#define\tREADBUF_SIZE\t16384\t/* used in s_bsd.c *AND* s_zip.c ! */\n70\t \n71\t/*\n72\t * Make up some numbers which should reflect average leaf server connect\n73\t * queue max size.\n74\t * queue=(<# of channels> * <channel size> + <user size> * <# of users>) * 2\n75\t * pool=<queue per client> * <avg. # of clients having data in queue>\n76\t */\n77\t#define\tQUEUELEN\t(((MAXCONNECTIONS / 10) * (CHANNELLEN + BANLEN + 16) +\\\n78\t\t\t\t  (HOSTLEN * 4 + REALLEN + NICKLEN + USERLEN + 24) *\\\n79\t\t\t\t  (MAXCONNECTIONS / 2)) * 2)\n80\t\n81\t#define\tBUFFERPOOL\t(DBUFSIZ * MAXCONNECTIONS * 2) + \\\n82\t\t\t\t(QUEUELEN * MAXSERVERS)\n83\t\n84\t#define\tUSERHOST_REPLYLEN\t(NICKLEN+HOSTLEN+USERLEN+5)\n85\t\n86\t/*\n87\t** 'offsetof' is defined in ANSI-C. The following definition\n88\t** is not absolutely portable (I have been told), but so far\n89\t** it has worked on all machines I have needed it. The type\n90\t** should be size_t but...  --msa\n91\t*/\n92\t#ifndef offsetof\n93\t#define\toffsetof(t,m) (int)((&((t *)0L)->m))\n94\t#endif\n95\t\n96\t#define\telementsof(x) (sizeof(x)/sizeof(x[0]))\n97\t\n98\t/*\n99\t** flags for bootup options (command line flags)\n100\t*/\n101\t#define\tBOOT_CONSOLE\t0x001\n102\t#define\tBOOT_QUICK\t0x002\n103\t#define\tBOOT_DEBUG\t0x004\n104\t#define\tBOOT_INETD\t0x008\n105\t#define\tBOOT_TTY\t0x010\n106\t\n107\t#define\tBOOT_AUTODIE\t0x040\n108\t#define\tBOOT_BADTUNE\t0x080\n109\t#define\tBOOT_PROT\t0x100\n110\t#define\tBOOT_STRICTPROT\t0x200\n111\t#define\tBOOT_NOIAUTH\t0x400\n112\t#define\tBOOT_STANDALONE\t0x800\n113\t\n114\ttypedef enum Status {\n115\t\tSTAT_CONNECTING = -4,\n116\t\tSTAT_HANDSHAKE, /* -3 */\n117\t\tSTAT_UNKNOWN,\t/* -2 */\n118\t\tSTAT_ME,\t/* -1 */\n119\t\tSTAT_SERVER,\t/* 0 */\n120\t\tSTAT_CLIENT,\t/* 1 */\n121\t\tSTAT_OPER,\t/* 2 */\n122\t\tSTAT_SERVICE,\t/* 3 */\n123\t\tSTAT_UNREG,\t/* 4 */\n124\t\tSTAT_MAX\t/* 5 -- size of handler[] table we need */\n125\t} Status;\n126\t\n127\t/*\n128\t * status macros.\n129\t */\n130\t#define\tIsRegisteredUser(x)\t(((x)->status == STAT_CLIENT || \\\n131\t\t\t\t\t (x)->status == STAT_OPER) && (x)->user)\n132\t#define\tIsRegistered(x)\t\t((x)->status >= STAT_SERVER || \\\n133\t\t\t\t\t (x)->status == STAT_ME)\n134\t#define\tIsConnecting(x)\t\t((x)->status == STAT_CONNECTING)\n135\t#define\tIsHandshake(x)\t\t((x)->status == STAT_HANDSHAKE)\n136\t#define\tIsMe(x)\t\t\t((x)->status == STAT_ME)\n137\t#define\tIsUnknown(x)\t\t((x)->status == STAT_UNKNOWN)\n138\t#define\tIsServer(x)\t\t((x)->status == STAT_SERVER)\n139\t#define\tIsClient(x)\t\t((x)->status == STAT_CLIENT || \\\n140\t\t\t\t\t (x)->status == STAT_OPER)\n141\t#define\tIsService(x)\t\t((x)->status == STAT_SERVICE && (x)->service)\n142\t\n143\t#define\tSetConnecting(x)\t((x)->status = STAT_CONNECTING)\n144\t#define\tSetHandshake(x)\t\t((x)->status = STAT_HANDSHAKE)\n145\t#define\tSetMe(x)\t\t((x)->status = STAT_ME)\n146\t#define\tSetUnknown(x)\t\t((x)->status = STAT_UNKNOWN)\n147\t#define\tSetServer(x)\t\t((x)->status = STAT_SERVER)\n148\t#define\tSetClient(x)\t\t((x)->status = IsAnOper((x)) ? STAT_OPER : STAT_CLIENT)\n149\t#define\tSetService(x)\t\t((x)->status = STAT_SERVICE)\n150\t\n151\t#define\tFLAGS_PINGSENT\t0x0000001 /* Unreplied ping sent */\n152\t#define\tFLAGS_DEADSOCK\t0x0000002 /* Local socket is dead--Exiting soon */\n153\t#define\tFLAGS_KILLED\t0x0000004 /* Prevents \"QUIT\" from being sent for this */\n154\t#define\tFLAGS_BLOCKED\t0x0000008 /* socket is in blocked condition [unused] */\n155\t#ifdef UNIXPORT\n156\t#define\tFLAGS_UNIX\t0x0000010 /* socket is in the unix domain, not inet */\n157\t#endif\n158\t#define\tFLAGS_CLOSING\t0x0000020 /* set when closing to suppress errors */\n159\t#define\tFLAGS_LISTEN\t0x0000040 /* used to mark clients which we listen() on */\n160\t#define\tFLAGS_XAUTHDONE\t0x0000080 /* iauth is finished with this client */\n161\t#define\tFLAGS_DOINGDNS\t0x0000100 /* client is waiting for a DNS response */\n162\t#define\tFLAGS_AUTH\t0x0000200 /* client is waiting on rfc931 response */\n163\t#define\tFLAGS_WRAUTH\t0x0000400 /* set if we havent writen to ident server */\n164\t#define\tFLAGS_LOCAL\t0x0000800 /* set for local clients */\n165\t#define\tFLAGS_GOTID\t0x0001000 /* successful ident lookup achieved */\n166\t#define\tFLAGS_XAUTH\t0x0002000 /* waiting on external authentication */\n167\t#define\tFLAGS_WXAUTH\t0x0004000 /* same as above, but also prevent parsing */\n168\t#define\tFLAGS_NONL\t0x0008000 /* No \\n in buffer */\n169\t#define\tFLAGS_CBURST\t0x0010000 /* set to mark connection burst being sent */\n170\t#define\tFLAGS_QUIT\t0x0040000 /* QUIT :comment shows it's not a split */\n171\t#define\tFLAGS_SPLIT\t0x0080000 /* client QUITting because of a netsplit */\n172\t#define\tFLAGS_HIDDEN\t0x0100000 /* netsplit is behind a hostmask,\n173\t\t\t\t\t     also used for marking clients in who_find\n174\t\t\t\t\t   */\n175\t#define\tFLAGS_UNKCMD\t0x0200000 /* has sent an unknown command */\n176\t#define\tFLAGS_ZIP\t0x0400000 /* link is zipped */\n177\t#define\tFLAGS_ZIPRQ\t0x0800000 /* zip requested */\n178\t#define\tFLAGS_ZIPSTART\t0x1000000 /* start of zip (ignore any CRLF) */\n179\t#define\tFLAGS_SQUIT\t0x2000000 /* This is set when we send the last\n180\t\t\t\t\t  ** server, so we know we have to send\n181\t\t\t\t\t  ** a SQUIT. */\n182\t#define\tFLAGS_EOB\t0x4000000 /* EOB received */\n183\t#define FLAGS_LISTENINACTIVE 0x8000000 /* Listener does not listen() */\n184\t#ifdef JAPANESE\n185\t#define\tFLAGS_JP\t0x10000000 /* jp version, used both for chans and servs */\n186\t#endif\n187\t\t\n188\t#define\tFLAGS_OPER\t0x0001 /* operator */\n189\t#define\tFLAGS_LOCOP\t0x0002 /* local operator -- SRB */\n190\t#define\tFLAGS_WALLOP\t0x0004 /* send wallops to them */\n191\t#define\tFLAGS_INVISIBLE\t0x0008 /* makes user invisible */\n192\t#define FLAGS_RESTRICT\t0x0010 /* restricted user */\n193\t#define FLAGS_AWAY\t0x0020 /* user is away */\n194\t#define FLAGS_EXEMPT    0x0040 /* user is exempted from k-lines */\n195\t#ifdef XLINE\n196\t#define FLAGS_XLINED\t0x0100\t/* X-lined client */\n197\t#endif\n198\t#define FLAGS_TLS       0x0200 /* user is on a secure connection port (SSL/TLS) -- mh 2020-04-27 */\n199\t#define\tSEND_UMODES\t(FLAGS_INVISIBLE|FLAGS_OPER|FLAGS_WALLOP|FLAGS_AWAY|FLAGS_RESTRICT)\n200\t#define\tALL_UMODES\t(SEND_UMODES|FLAGS_LOCOP)\n201\t\n202\t/*\n203\t * user flags macros.\n204\t */\n205\t#define\tIsOper(x)\t\t((x)->user && (x)->user->flags & FLAGS_OPER)\n206\t#define\tIsLocOp(x)\t\t((x)->user && (x)->user->flags & FLAGS_LOCOP)\n207\t#define\tIsInvisible(x)\t\t((x)->user->flags & FLAGS_INVISIBLE)\n208\t#define IsRestricted(x)         ((x)->user && \\\n209\t\t\t\t\t (x)->user->flags & FLAGS_RESTRICT)\n210\t#define\tIsAnOper(x)\t\t((x)->user && \\\n211\t\t\t\t\t (x)->user->flags & (FLAGS_OPER|FLAGS_LOCOP))\n212\t#define\tIsPerson(x)\t\t((x)->user && IsClient(x))\n213\t#define\tIsPrivileged(x)\t\t(IsServer(x) || IsAnOper(x))\n214\t#define\tSendWallops(x)\t\t((x)->user->flags & FLAGS_WALLOP)\n215\t#ifdef UNIXPORT\n216\t#define\tIsUnixSocket(x)\t\t((x)->flags & FLAGS_UNIX)\n217\t#endif\n218\t#define\tIsListener(x)\t\t((x)->flags & FLAGS_LISTEN)\n219\t#define IsListenerInactive(x)\t((x)->flags & FLAGS_LISTENINACTIVE)\n220\t#define\tIsLocal(x)\t\t(MyConnect(x) && (x)->flags & FLAGS_LOCAL)\n221\t#define\tIsDead(x)\t\t((x)->flags & FLAGS_DEADSOCK)\n222\t#define\tIsBursting(x)\t\t(!((x)->flags & FLAGS_EOB))\n223\t#define IsKlineExempt(x)        ((x)->user && (x)->user->flags & FLAGS_EXEMPT)\n224\t\n225\t#define\tSetDead(x)\t\t((x)->flags |= FLAGS_DEADSOCK)\n226\t#define\tCBurst(x)\t\t((x)->flags & FLAGS_CBURST)\n227\t#define\tSetOper(x)\t\t((x)->user->flags |= FLAGS_OPER, \\\n228\t\t\t\t\t (x)->status = STAT_OPER)\n229\t#define\tSetLocOp(x)\t\t((x)->user->flags |= FLAGS_LOCOP, \\\n230\t\t\t\t\t (x)->status = STAT_OPER)\n231\t#define\tSetInvisible(x)\t\t((x)->user->flags |= FLAGS_INVISIBLE)\n232\t#define SetRestricted(x)\t((x)->user->flags |= FLAGS_RESTRICT)\n233\t#define\tSetWallops(x)\t\t((x)->user->flags |= FLAGS_WALLOP)\n234\t#ifdef UNIXPORT\n235\t#define\tSetUnixSock(x)\t\t((x)->flags |= FLAGS_UNIX)\n236\t#endif\n237\t#define\tSetDNS(x)\t\t((x)->flags |= FLAGS_DOINGDNS)\n238\t#define\tSetDoneXAuth(x)\t\t((x)->flags |= FLAGS_XAUTHDONE)\n239\t#define\tSetEOB(x)\t\t((x)->flags |= FLAGS_EOB)\n240\t#define SetListenerInactive(x)\t((x)->flags |= FLAGS_LISTENINACTIVE)\n241\t#define SetKlineExempt(x)\t((x)->user->flags |= FLAGS_EXEMPT)\n242\t\n243\t#define\tDoingDNS(x)\t\t((x)->flags & FLAGS_DOINGDNS)\n244\t#define\tDoingAuth(x)\t\t((x)->flags & FLAGS_AUTH)\n245\t#define\tDoingXAuth(x)\t\t((x)->flags & FLAGS_XAUTH)\n246\t#define\tWaitingXAuth(x)\t\t((x)->flags & FLAGS_WXAUTH)\n247\t#define\tDoneXAuth(x)\t\t((x)->flags & FLAGS_XAUTHDONE)\n248\t#define\tNoNewLine(x)\t\t((x)->flags & FLAGS_NONL)\n249\t\n250\t#define\tClearOper(x)\t\t((x)->user->flags &= ~FLAGS_OPER, \\\n251\t\t\t\t\t (x)->status = STAT_CLIENT)\n252\t#define\tClearLocOp(x)\t\t((x)->user->flags &= ~FLAGS_LOCOP, \\\n253\t\t\t\t\t (x)->status = STAT_CLIENT)\n254\t#define\tClearInvisible(x)\t((x)->user->flags &= ~FLAGS_INVISIBLE)\n255\t#define ClearRestricted(x)      ((x)->user->flags &= ~FLAGS_RESTRICT)\n256\t#define\tClearWallops(x)\t\t((x)->user->flags &= ~FLAGS_WALLOP)\n257\t#define\tClearDNS(x)\t\t((x)->flags &= ~FLAGS_DOINGDNS)\n258\t#define\tClearAuth(x)\t\t((x)->flags &= ~FLAGS_AUTH)\n259\t#define\tClearXAuth(x)\t\t((x)->flags &= ~FLAGS_XAUTH)\n260\t#define\tClearWXAuth(x)\t\t((x)->flags &= ~FLAGS_WXAUTH)\n261\t#define ClearListenerInactive(x) ((x)->flags &= ~FLAGS_LISTENINACTIVE)\n262\t#ifdef XLINE\n263\t#define IsXlined(x)\t\t((x)->user && (x)->user->flags & FLAGS_XLINED)\n264\t#define SetXlined(x)\t\t((x)->user->flags |= FLAGS_XLINED)\n265\t#define ClearXlined(x)\t\t((x)->user->flags &= ~FLAGS_XLINED)\n266\t#endif\n267\t#define IsTLS(x)        ((x)->user && (x)->user->flags & FLAGS_TLS)\n268\t#define SetTLS(x)       ((x)->user->flags |= FLAGS_TLS)\n269\t\n270\t/*\n271\t * defined debugging levels\n272\t */\n273\t#define\tDEBUG_FATAL  0\n274\t#define\tDEBUG_ERROR  1\t/* report_error() and other errors that are found */\n275\t#define\tDEBUG_READ   2\n276\t#define\tDEBUG_WRITE  2\n277\t#define\tDEBUG_NOTICE 3\n278\t#define\tDEBUG_DNS    4\t/* used by all DNS related routines - a *lot* */\n279\t#define\tDEBUG_INFO   5\t/* general usful info */\n280\t#define\tDEBUG_NUM    6\t/* numerics */\n281\t#define\tDEBUG_SEND   7\t/* everything that is sent out */\n282\t#define\tDEBUG_DEBUG  8\t/* anything to do with debugging, ie unimportant :) */\n283\t#define\tDEBUG_MALLOC 9\t/* malloc/free calls */\n284\t#define\tDEBUG_LIST  10\t/* debug list use */\n285\t#define\tDEBUG_L10   10\n286\t#define\tDEBUG_L11   11\n287\t\n288\t/*\n289\t * defines for curses in client\n290\t */\n291\t#define\tDUMMY_TERM\t0\n292\t#define\tCURSES_TERM\t1\n293\t#define\tTERMCAP_TERM\t2\n294\t\n295\tstruct\tCPing\t{\n296\t\tu_short\tport;\t\t/* port to send pings to */\n297\t\tu_long\trtt;\t\t/* average RTT */\n298\t\tu_long\tping;\n299\t\tu_long\tseq;\t\t/* # sent still in the \"window\" */\n300\t\tu_long\tlseq;\t\t/* sequence # of last sent */\n301\t\tu_long\trecvd;\t\t/* # received still in the \"window\" */\n302\t\tu_long\tlrecvd;\t\t/* # received */\n303\t};\n304\t\n305\tstruct\tConfItem\t{\n306\t\tu_int\tstatus;\t\t/* If CONF_ILLEGAL, delete when no clients */\n307\t\tint\tclients;\t/* Number of *LOCAL* clients using this */\n308\t\tstruct\tIN_ADDR ipnum;\t/* ip number of host field */\n309\t\tchar\t*host;\n310\t\tchar\t*passwd;\n311\t\tchar\t*name;\n312\t\tchar\t*name2;\n313\t#ifdef XLINE\n314\t\tchar\t*name3;\n315\t#endif\n316\t\tint\tport;\n317\t\tlong\tflags;\t\t/* I-line flags */\n318\t\tint\tpref;\t\t/* preference value */\n319\t\tstruct\tCPing\t*ping;\n320\t\ttime_t\thold;\t/* Hold action until this time (calendar time) */\n321\t\tchar\t*source_ip;\n322\t#ifndef VMSP\n323\t\taClass\t*class;  /* Class of connection */\n324\t#endif\n325\t\tstruct\tConfItem *next;\n326\t};\n327\t\n328\tstruct\tListItem\t{\n329\t\tchar\t*nick;\n330\t\tchar\t*user;\n331\t\tchar\t*host;\n332\t};\n333\t\n334\t/* these define configuration lines (A:, M:, I:, K:, etc.) */\n335\t#define\tCONF_ILLEGAL\t\t0x80000000\n336\t#define\tCONF_MATCH\t\t0x40000000\n337\t#define\tCONF_QUARANTINED_SERVER\t0x000001\n338\t#define\tCONF_CLIENT\t\t0x000002\n339\t\n340\t#define\tCONF_CONNECT_SERVER\t0x000008\n341\t#define\tCONF_NOCONNECT_SERVER\t0x000010\n342\t#define\tCONF_ZCONNECT_SERVER\t0x000020\n343\t\n344\t#define\tCONF_OPERATOR\t\t0x000080\n345\t#define\tCONF_ME\t\t\t0x000100\n346\t#define\tCONF_KILL\t\t0x000200\n347\t#define\tCONF_ADMIN\t\t0x000400\n348\t#define\tCONF_CLASS\t\t0x001000\n349\t#define\tCONF_SERVICE\t\t0x002000\n350\t#define\tCONF_LEAF\t\t0x004000\n351\t#define\tCONF_LISTEN_PORT\t0x008000\n352\t#define\tCONF_HUB\t\t0x010000\n353\t#define\tCONF_VER\t\t0x020000\n354\t#define\tCONF_BOUNCE\t\t0x040000\n355\t#define\tCONF_OTHERKILL\t\t0x080000\n356\t#define\tCONF_DENY\t\t0x100000\n357\t#ifdef TKLINE\n358\t#define\tCONF_TKILL\t\t0x200000\n359\t#define\tCONF_TOTHERKILL\t\t0x400000\n360\t#endif\n361\t#ifdef XLINE\n362\t#define CONF_XLINE\t\t0x800000\n363\t#endif\n364\t#define\tCONF_OPS\t\tCONF_OPERATOR\n365\t#define\tCONF_SERVER_MASK\t(CONF_CONNECT_SERVER | CONF_NOCONNECT_SERVER |\\\n366\t\t\t\t\t CONF_ZCONNECT_SERVER)\n367\t#define\tCONF_CLIENT_MASK\t(CONF_CLIENT | CONF_SERVICE | CONF_OPS | \\\n368\t\t\t\t\t CONF_SERVER_MASK)\n369\t\n370\t#define CFLAG_RESTRICTED\t0x00001\n371\t#define CFLAG_RNODNS\t\t0x00002\n372\t#define CFLAG_RNOIDENT\t\t0x00004\n373\t#define CFLAG_KEXEMPT\t\t0x00008\n374\t#define CFLAG_NORESOLVE\t\t0x00010\n375\t#define CFLAG_FALL\t\t0x00020\n376\t#define CFLAG_NORESOLVEMATCH\t0x00040\n377\t#ifdef XLINE\n378\t#define CFLAG_XEXEMPT\t\t0x00080\n379\t#endif\n380\t\n381\t#define IsConfRestricted(x)\t((x)->flags & CFLAG_RESTRICTED)\n382\t#define IsConfRNoDNS(x)\t\t((x)->flags & CFLAG_RNODNS)\n383\t#define IsConfRNoIdent(x)\t((x)->flags & CFLAG_RNOIDENT)\n384\t#define IsConfKlineExempt(x)\t((x)->flags & CFLAG_KEXEMPT)\n385\t#define IsConfNoResolve(x)\t((x)->flags & CFLAG_NORESOLVE)\n386\t#define IsConfNoResolveMatch(x)\t((x)->flags & CFLAG_NORESOLVEMATCH)\n387\t#define IsConfFallThrough(x)\t((x)->flags & CFLAG_FALL)\n388\t#ifdef XLINE\n389\t#define IsConfXlineExempt(x)\t((x)->flags & CFLAG_XEXEMPT)\n390\t#endif\n391\t\n392\t#define PFLAG_DELAYED\t\t0x00001\n393\t#define PFLAG_SERVERONLY\t0x00002\n394\t#define PFLAG_TLS           0x00004\n395\t\n396\t#define IsConfDelayed(x)\t((x)->flags & PFLAG_DELAYED)\n397\t#define IsConfServeronly(x)\t((x)->flags & PFLAG_SERVERONLY)\n398\t#define IsConfTLS(x)        ((x)->flags & PFLAG_TLS)\n399\t\n400\t#define\tIsIllegal(x)\t((x)->status & CONF_ILLEGAL)\n401\t\n402\ttypedef\tstruct\t{\n403\t\tu_long\tpi_id;\n404\t\tu_long\tpi_seq;\n405\t\tstruct\ttimeval\tpi_tv;\n406\t\taConfItem *pi_cp;\n407\t} Ping;\n408\t\n409\t\n410\t#define\tPING_REPLY\t0x01\n411\t#define\tPING_CPING\t0x02\n412\t\n413\t#ifdef\tZIP_LINKS\n414\t/* the minimum amount of data needed to trigger compression */\n415\t# define\tZIP_MINIMUM\t4096\n416\t\n417\t/* the maximum amount of data to be compressed (can actually be a bit more) */\n418\t# define\tZIP_MAXIMUM\t8192\t/* WARNING: *DON'T* CHANGE THIS!!!! */\n419\t\n420\tstruct Zdata {\n421\t\tz_stream\t*in;\t\t/* input zip stream data */\n422\t\tz_stream\t*out;\t\t/* output zip stream data */\n423\t\tBytef\t\toutbuf[ZIP_MAXIMUM]; /* outgoing (unzipped) buffer */\n424\t\tint\t\toutcount;\t/* size of outbuf content */\n425\t};\n426\t#endif\n427\t\n428\tstruct LineItem\n429\t{ \n430\t    char    *line;\n431\t    struct  LineItem *next;\n432\t};\n433\t\n434\t/*\n435\t * Client structures\n436\t */\n437\tstruct\tUser\t{\n438\t\tLink\t*channel;\t/* chain of channel pointer blocks */\n439\t\tinvLink\t*invited;\t/* chain of invite pointer blocks */\n440\t\tLink\t*uwas;\t\t/* chain of whowas pointer blocks */\n441\t\tchar\t*away;\t\t/* pointer to away message */\n442\t\ttime_t\tlast;\t\t/* \"idle\" time */\n443\t\tint\trefcnt;\t\t/* Number of times this block is referenced\n444\t\t\t\t\t** from aClient (field user), aServer (field\n445\t\t\t\t\t** by) and whowas array (field ww_user).\n446\t\t\t\t\t*/\n447\t\tint\tjoined;\t\t/* number of channels joined */\n448\t\tint\tflags;\t\t/* user modes */\n449\t        struct\tServer\t*servp;\n450\t\t\t\t\t/*\n451\t\t\t\t\t** In a perfect world the 'server' name\n452\t\t\t\t\t** should not be needed, a pointer to the\n453\t\t\t\t\t** client describing the server is enough.\n454\t\t\t\t\t** Unfortunately, in reality, server may\n455\t\t\t\t\t** not yet be in links while USER is\n456\t\t\t\t\t** introduced... --msa\n457\t\t\t\t\t** I think it's not true anymore --Beeth\n458\t\t\t\t\t*/\n459\t\tu_int\thashv;\n460\t\taClient\t*uhnext;\n461\t\taClient\t*bcptr;\n462\t\tchar\tusername[USERLEN+1];\n463\t\tchar\tuid[UIDLEN+1];\n464\t\tchar\thost[HOSTLEN+1];\n465\t\tchar\t*server;\n466\t\tu_int\thhashv;\t\t/* hostname hash value */\n467\t\tu_int\tiphashv;\t/* IP hash value */\n468\t\tstruct User *hhnext;\t/* next entry in hostname hash */\n469\t\tstruct User *iphnext;\t/* next entry in IP hash */\n470\t\t\t\t\t/* sip MUST be the last in this struct!!! */\n471\t\tchar\tsip[1];\t\t/* ip as a string, big enough for ipv6\n472\t\t\t\t\t * allocated to real size in make_user */\n473\t\n474\t};\n475\t\n476\tstruct\tServer\t{\n477\t\tchar\tnamebuf[HOSTLEN+1];\n478\t\tanUser\t*user;\t\t/* who activated this connection */\n479\t\taClient\t*up;\t\t/* uplink for this server */\n480\t\taConfItem *nline;\t/* N-line pointer for this server */\n481\t\tint\tversion;        /* version id for local client */\n482\t\tint\tsnum;\n483\t\tint\trefcnt;\t\t/* Number of times this block is referenced\n484\t\t\t\t\t** from anUser (field servp), aService (field\n485\t\t\t\t\t** servp) and aClient (field serv) */\n486\t\tint\tusercnt[3];\t/* # of clients - visible, invisible, opers */\n487\t\tstruct\tServer\t*nexts, *prevs, *shnext;\n488\t\taClient\t*bcptr;\n489\t\taClient\t*maskedby;\t/* Pointer to server masking this server.\n490\t\t\t\t\t** Self if not masked, *NEVER* NULL. */\n491\t\tchar\tby[NICKLEN+1];\n492\t\tchar\tbyuid[UIDLEN + 1];\n493\t\tchar\tsid[SIDLEN + 1];/* The Server ID. */\n494\t\tchar\tverstr[11];\t/* server version, PATCHLEVEL format */\n495\t\tu_int\tsidhashv;\t/* Raw hash value. */\n496\t\taServer\t*sidhnext;\t/* Next server in the sid hash. */\n497\t\ttime_t\tlastload;\t/* penalty like counters, see s_serv.c\n498\t\t\t\t\t** should be in the local part, but.. */\n499\t\tint\tservers;\t/* Number of downlinks of this server. */\n500\t\taClient\t*left, *right;\t/* Left and right nodes in server tree. */\n501\t\taClient\t*down;\t\t/* Ptr to first downlink of this server. */\n502\t};\n503\t\n504\tstruct\tService\t{\n505\t\tchar\tnamebuf[HOSTLEN+1];\n506\t\tint\twants;\n507\t\tint\ttype;\n508\t\tchar\t*server;\n509\t\taServer\t*servp;\n510\t\tstruct\tService\t*nexts, *prevs;\n511\t\taClient\t*bcptr;\n512\t\tchar\tdist[HOSTLEN+1];\n513\t};\n514\t\n515\tstruct Client\t{\n516\t\tstruct\tClient *next,*prev, *hnext;\n517\t\tanUser\t*user;\t\t/* ...defined, if this is a User */\n518\t\taServer\t*serv;\t\t/* ...defined, if this is a server */\n519\t\taService *service;\n520\t\tu_int\thashv;\t\t/* raw hash value */\n521\t\tlong\tflags;\t\t/* client flags */\n522\t\taClient\t*from;\t\t/* == self, if Local Client, *NEVER* NULL! */\n523\t\tint\tfd;\t\t/* >= 0, for local clients */\n524\t\tint\thopcount;\t/* number of servers to this 0 = local */\n525\t\tshort\tstatus;\t\t/* Client type */\n526\t\tchar\t*name;\t\t/* Pointer to unique name of the client */\n527\t\tchar\tnamebuf[NICKLEN+1]; /* nick of the client */\n528\t\tchar\tusername[USERLEN+1]; /* username here now for auth stuff */\n529\t\tchar\t*info;\t\t/* Free form additional client information */\n530\t\t/*\n531\t\t** The following fields are allocated only for local clients\n532\t\t** (directly connected to *this* server with a socket.\n533\t\t** The first of them *MUST* be the \"count\"--it is the field\n534\t\t** to which the allocation is tied to! *Never* refer to\n535\t\t** these fields, if (from != self).\n536\t\t*/\n537\t\tint\tcount;\t\t/* Amount of data in buffer */\n538\t\tchar\tbuffer[BUFSIZE]; /* Incoming message buffer */\n539\t#ifdef\tZIP_LINKS\n540\t\taZdata\t*zip;\t\t/* zip data */\n541\t#endif\n542\t\tshort\tlastsq;\t\t/* # of 2k blocks when sendqueued called last*/\n543\t\tdbuf\tsendQ;\t\t/* Outgoing message queue--if socket full */\n544\t\tdbuf\trecvQ;\t\t/* Hold for data incoming yet to be parsed */\n545\t\tlong\tsendM;\t\t/* Statistics: protocol messages send */\n546\t\tlong\treceiveM;\t/* Statistics: protocol messages received */\n547\t\tunsigned long long\tsendB;\t\t/* Statistics: total bytes send */\n548\t\tunsigned long long\treceiveB;\t/* Statistics: total bytes received */\n549\t\ttime_t\tlasttime;\t/* last time we received data */\n550\t\ttime_t\tfirsttime;\t/* time client was created */\n551\t\ttime_t\tsince;\t\t/* last time we parsed something */\n552\t\taClient\t*acpt;\t\t/* listening client which we accepted from */\n553\t\tLink\t*confs;\t\t/* Configuration record associated */\n554\t\tint\tping;\n555\t\tint\tauthfd;\t\t/* fd for rfc931 authentication */\n556\t\tchar\t*auth;\n557\t\tu_short\tport;\t\t/* and the remote port# too :-) */\n558\t\tstruct\tIN_ADDR\tip;\t/* keep real ip# too */\n559\t\tstruct\thostent\t*hostp;\n560\t\tchar\tsockhost[HOSTLEN+1]; /* This is the host name from the socket\n561\t\t\t\t\t  ** and after which the connection was\n562\t\t\t\t\t  ** accepted.\n563\t\t\t\t\t  */\n564\t\tchar\tpasswd[PASSWDLEN+1];\n565\t\tchar\texitc;\n566\t\tchar\t*reason;\t/* additional exit message */\n567\t#ifdef XLINE\n568\t\t/* Those logically should be in anUser struct, but would be null for\n569\t\t** all remote users... so better waste two pointers for all local\n570\t\t** non-users than two pointers for all remote users. --B. */\n571\t\tchar\t*user2;\t/* 2nd param of USER */\n572\t\tchar\t*user3;\t/* 3rd param of USER */\n573\t#endif\n574\t\n575\t};\n576\t\n577\t#define\tCLIENT_LOCAL_SIZE sizeof(aClient)\n578\t#define\tCLIENT_REMOTE_SIZE offsetof(aClient,count)\n579\t\n580\t/*\n581\t * statistics structures\n582\t */\n583\tstruct\tstats {\n584\t\tu_int\tis_cl;\t/* number of client connections */\n585\t\tu_int\tis_sv;\t/* number of server connections */\n586\t\tu_int\tis_ni;\t/* connection but no idea who it was\n587\t\t\t\t * (can be a P: line that has been removed -krys) */\n588\t\tunsigned long long\tis_cbs;\t/* bytes sent to clients */\n589\t\tunsigned long long\tis_cbr;\t/* bytes received to clients */\n590\t\tunsigned long long\tis_sbs;\t/* bytes sent to servers */\n591\t\tunsigned long long\tis_sbr;\t/* bytes received to servers */\n592\t\ttime_t\tis_cti;\t/* time spent connected by clients */\n593\t\ttime_t\tis_sti;\t/* time spent connected by servers */\n594\t\tu_int\tis_ac;\t/* connections accepted */\n595\t\tu_int\tis_ref;\t/* accepts refused */\n596\t\tu_int\tis_unco; /* unknown commands */\n597\t\tu_int\tis_wrdi; /* command going in wrong direction */\n598\t\tu_int\tis_unpf; /* unknown prefix */\n599\t\tu_int\tis_empt; /* empty message */\n600\t\tu_int\tis_num;\t/* numeric message */\n601\t\tu_int\tis_kill; /* number of kills generated on collisions */\n602\t\tu_int\tis_save; /* number of saved clients */\n603\t\tu_int\tis_fake; /* MODE 'fakes' */\n604\t\tu_int\tis_reop; /* number of local reops */\n605\t\tu_int\tis_rreop; /* number of remote reops */\n606\t\tu_int\tis_asuc; /* successful auth requests */\n607\t\tu_int\tis_abad; /* bad auth requests */\n608\t\tu_int\tis_udpok;\t/* packets recv'd on udp port */\n609\t\tu_int\tis_udperr;\t/* packets recvfrom errors on udp port */\n610\t\tu_int\tis_udpdrop;\t/* packets recv'd but dropped on udp port */\n611\t\tu_int\tis_loc;\t/* local connections made */\n612\t\tu_int\tis_nosrv; /* user without server */\n613\t\tu_long\tis_wwcnt; /* number of nicks overwritten in whowas[] */\n614\t\tunsigned long long\tis_wwt;\t/* sum of elapsed time on when \n615\t\t\t\t\t\t** overwriting whowas[] */\n616\t\tu_long\tis_wwMt;  /* max elapsed time on when overwriting whowas[] */\n617\t\tu_long\tis_wwmt;  /* min elapsed time on when overwriting whowas[] */\n618\t\tu_long\tis_lkcnt; /* number of nicks overwritten in locked[] */\n619\t\tunsigned long long\tis_lkt;\t/* sum of elapsed time on when\n620\t\t\t\t\t\t** overwriting locked[]*/\n621\t\tu_long\tis_lkMt;  /* max elapsed time on when overwriting locked[] */\n622\t\tu_long\tis_lkmt;  /* min elapsed time on when overwriting locked[] */\n623\t\tu_int\tis_ckl;   /* calls to check_link() */\n624\t\tu_int\tis_cklQ;  /* rejected: SendQ too high */\n625\t\tu_int\tis_ckly;  /* rejected: link too young */\n626\t\tu_int\tis_cklno; /* rejected: \"flood\" */\n627\t\tu_int\tis_cklok; /* accepted */\n628\t\tu_int\tis_cklq;  /* accepted early */\n629\t};\n630\t\n631\t/* mode structure for channels */\n632\t\n633\tstruct\tSMode\t{\n634\t\tu_int\tmode;\n635\t\tint\tlimit;\n636\t\tchar\tkey[KEYLEN+1];\n637\t};\n638\t\n639\t/* Message table structure */\n640\t\n641\ttypedef\tint\t(*CmdHandler)(aClient *, aClient *, int, char **);\n642\t\n643\tstruct\tCmd {\n644\t\tCmdHandler\thandler;\t/* command */\n645\t\tu_int\t\tcount;\t\t/* total count */\n646\t\tu_int\t\trcount;\t\t/* remote count */\n647\t\tu_long\t\tbytes;\n648\t\tu_long\t\trbytes;\n649\t};\n650\t\n651\tstruct\tMessage\t{\n652\t\tchar\t*cmd;\n653\t\tint\tminparams;\n654\t\tint\tmaxparams;\n655\t\tstruct Cmd\thandlers[STAT_MAX];\n656\t};\n657\t\n658\t/* fd array structure */\n659\t\n660\tstruct\tfdarray\t{\n661\t\tint\tfd[MAXCONNECTIONS];\n662\t\tint\thighest;\n663\t};\n664\t\n665\t/* general link structure used for chains */\n666\t\n667\tstruct\tSLink\t{\n668\t\tstruct\tSLink\t*next;\n669\t\tunion {\n670\t\t\taClient\t*cptr;\n671\t\t\taChannel *chptr;\n672\t\t\taConfItem *aconf;\n673\t\t\taListItem *alist;\n674\t\t\tchar\t*cp;\n675\t\t\tint\ti;\n676\t\t} value;\n677\t\tint\tflags;\n678\t};\n679\t\n680\t/* link structure used for invites */\n681\t\n682\tstruct\tinvSLink\t{\n683\t\tstruct\tinvSLink\t*next;\n684\t\taChannel\t\t*chptr;\n685\t\tchar\t\t\t*who;\n686\t\tint\t\t\tflags;\n687\t};\n688\t\n689\t/* channel structure */\n690\t\n691\tstruct Channel\t{\n692\t\tstruct\tChannel *nextch, *prevch, *hnextch;\n693\t\tu_int\thashv;\t\t/* raw hash value */\n694\t\tMode\tmode;\n695\t\tchar\ttopic[TOPICLEN+1];\n696\t#ifdef TOPIC_WHO_TIME\n697\t\tchar\ttopic_nuh[BANLEN+1];\n698\t\ttime_t\ttopic_t;\n699\t#endif\n700\t\tint\tusers;\t\t/* current membership total */\n701\t\tLink\t*members;\t/* channel members */\n702\t\tLink\t*invites;\t/* outstanding invitations */\n703\t\tLink\t*mlist;\t\t/* list of extended modes: +b/+e/+I */\n704\t\tLink\t*clist;\t\t/* list of local! connections which are members */\n705\t\ttime_t\thistory;\t/* channel history (aka channel delay) */\n706\t\ttime_t\treop;\t\t/* server reop stamp for !channels */\n707\t#ifdef JAPANESE\n708\t\tint flags;\n709\t#endif\n710\t\tchar\tchname[1];\n711\t};\n712\t\n713\t/*\n714\t** Channel Related macros follow\n715\t*/\n716\t\n717\t/* Channel related flags */\n718\t\n719\t#define\tCHFL_UNIQOP     0x0001 /* Channel creator */\n720\t#define\tCHFL_CHANOP     0x0002 /* Channel operator */\n721\t#define\tCHFL_VOICE      0x0004 /* the power to speak */\n722\t#define\tCHFL_BAN\t0x0008 /* ban channel flag */\n723\t#define\tCHFL_EXCEPTION\t0x0010 /* exception channel flag */\n724\t#define\tCHFL_INVITE\t0x0020 /* invite channel flag */\n725\t#define\tCHFL_REOPLIST\t0x0040 /* reoplist channel flag */\n726\t\n727\t/* Channel Visibility macros */\n728\t\n729\t#define\tMODE_UNIQOP\tCHFL_UNIQOP\n730\t#define\tMODE_CHANOP\tCHFL_CHANOP\n731\t#define\tMODE_VOICE\tCHFL_VOICE\n732\t#define\tMODE_PRIVATE\t0x00008\n733\t#define\tMODE_SECRET\t0x00010\n734\t#define\tMODE_MODERATED  0x00020\n735\t#define\tMODE_TOPICLIMIT 0x00040\n736\t#define\tMODE_INVITEONLY 0x00080\n737\t#define\tMODE_NOPRIVMSGS 0x00100\n738\t#define\tMODE_KEY\t0x00200\n739\t#define\tMODE_BAN\t0x00400\n740\t#define\tMODE_LIMIT\t0x00800\n741\t#define\tMODE_ANONYMOUS\t0x01000\n742\t#define\tMODE_QUIET\t0x02000\n743\t#define\tMODE_EXCEPTION\t0x04000\n744\t#define\tMODE_INVITE\t0x08000\n745\t#define\tMODE_REOP\t0x10000\n746\t#define\tMODE_REOPLIST\t0x20000\n747\t#define\tMODE_FLAGS\t0x3ffff\n748\t/*\n749\t * mode flags which take another parameter (With PARAmeterS)\n750\t */\n751\t#define\tMODE_WPARAS\t(MODE_UNIQOP|MODE_CHANOP|MODE_VOICE|MODE_BAN|MODE_KEY\\\n752\t\t\t\t |MODE_LIMIT|MODE_INVITE|MODE_EXCEPTION|MODE_REOPLIST)\n753\t/*\n754\t * Undefined here, these are used in conjunction with the above modes in\n755\t * the source.\n756\t#define\tMODE_DEL       0x40000000\n757\t#define\tMODE_ADD       0x80000000\n758\t */\n759\t\n760\t#define\tHoldChannel(x)\t\t(!(x))\n761\t/* name invisible */\n762\t#define\tSecretChannel(x)\t((x) && ((x)->mode.mode & MODE_SECRET))\n763\t/* channel not shown but names are */\n764\t#define\tHiddenChannel(x)\t((x) && ((x)->mode.mode & MODE_PRIVATE))\n765\t/* channel visible */\n766\t#define\tShowChannel(v,c)\t(PubChannel(c) || IsMember((v),(c)))\n767\t#define\tIsAnonymous(c)\t\t((c) && ((c)->mode.mode & MODE_ANONYMOUS))\n768\t#define\tPubChannel(x)\t\t((!x) || ((x)->mode.mode &\\\n769\t\t\t\t\t (MODE_PRIVATE | MODE_SECRET)) == 0)\n770\t\n771\t/*\n772\t#define\tIsMember(u, c)\t\t(assert(*(c)->chname != '\\0'), find_user_link((c)->members, u) ? 1 : 0)\n773\t#define\tIsMember(u, c)\t\t(find_user_link((c)->members, u) ? 1 : 0)\n774\t*/\n775\t#define       IsMember(u, c)          (u && (u)->user && \\\n776\t\t\t       find_channel_link((u)->user->channel, c) ? 1 : 0)\n777\t# define\tIsChannelName(n)\t((n) && (*(n) == '#' || *(n) == '&' ||\\\n778\t\t\t\t\t\t*(n) == '+' || \\\n779\t\t\t\t\t\t(*(n) == '!' && cid_ok(n, CHIDLEN))))\n780\t#define\tIsQuiet(x)\t\t((x)->mode.mode & MODE_QUIET)\n781\t#define\tUseModes(n)\t\t((n) && (*(n) == '#' || *(n) == '&' || \\\n782\t\t\t\t\t\t *(n) == '!'))\n783\t\n784\t/* Misc macros */\n785\t\n786\t#define\tBadPtr(x) (!(x) || (*(x) == '\\0'))\n787\t#define\tBadTo(x) (BadPtr((x)) ? \"*\" : (x))\n788\t\n789\t#define\tMyConnect(x)\t\t\t((x)->fd >= 0)\n790\t#define\tMyClient(x)\t\t\t(MyConnect(x) && IsClient(x))\n791\t#define\tMyPerson(x)\t\t\t(MyConnect(x) && IsPerson(x))\n792\t#define\tMyOper(x)\t\t\t(MyConnect(x) && IsOper(x))\n793\t#define\tMyService(x)\t\t\t(MyConnect(x) && IsService(x))\n794\t#define\tME\tme.name\n795\t#define\tMES\tme.serv->sid\n796\t\n797\t#define\tGotDependantClient(x)\t(x->prev &&\t\t\t\t\\\n798\t\t\t \t\t ((IsRegisteredUser(x->prev) &&\t\t\\\n799\t\t\t\t\t  x->prev->user->servp == x->serv) ||\t\\\n800\t\t\t\t\t  (IsService(x->prev) &&\t\t\\\n801\t\t\t\t\t  x->prev->service->servp == x->serv)))\n802\t\n803\t#define\tIsMasked(x)\t\t(x && x->serv && x->serv->maskedby != x)\n804\t\n805\t#define IsSplit()\t\t(iconf.split > 0)\n806\t\n807\ttypedef\tstruct\t{\n808\t\tu_long\tis_user[2];\t/* users, non[0] invis and invis[1] */\n809\t\tu_long\tis_serv;\t/* servers */\n810\t\tu_long\tis_eobservers;  /* number of servers which sent EOB */\n811\t\tu_long\tis_masked;\t/* masked servers. */\n812\t\tu_long\tis_service;\t/* services */\n813\t\tu_long\tis_chan;\t/* channels */\n814\t\tu_long\tis_chanmem;\n815\t\tu_long\tis_chanusers;\t/* channels users */\n816\t\tu_long\tis_hchan;\t/* channels in history */\n817\t\tu_long\tis_hchanmem;\n818\t\tu_long\tis_cchan;\t/* channels in cache */\n819\t\tu_long\tis_cchanmem;\n820\t\tu_long\tis_away;\t/* away sets */\n821\t\tu_long\tis_awaymem;\n822\t\tu_long\tis_oper;\t/* opers */\n823\t\tu_long\tis_bans;\t/* bans */\n824\t\tu_long\tis_banmem;\n825\t\tu_long\tis_invite;\t/* invites */\n826\t\tu_long\tis_class;\t/* classes */\n827\t\tu_long\tis_conf;\t/* conf lines */\n828\t\tu_long\tis_confmem;\n829\t\tu_long\tis_conflink;\t/* attached conf lines */\n830\t\tu_long\tis_myclnt;\t/* local clients */\n831\t\tu_long\tis_myserv;\t/* local servers */\n832\t\tu_long\tis_myservice;\t/* local services */\n833\t\tu_long\tis_unknown;\t/* unknown (local) connections */\n834\t\tu_long\tis_wwusers;\t/* users kept for whowas[] */\n835\t\tu_long\tis_wwaways;\t/* aways in users in whowas[] */\n836\t\tu_long\tis_wwawaysmem;\n837\t\tu_long\tis_wwuwas;\t/* uwas links */\n838\t\tu_long\tis_localc;\t/* local items (serv+service+client+..) */\n839\t\tu_long\tis_remc;\t/* remote clients */\n840\t\tu_long\tis_users;\t/* user structs */\n841\t\tu_long\tis_useri;\t/* user invites */\n842\t\tu_long\tis_userc;\t/* user links to channels */\n843\t\tu_long\tis_auth;\t/* OTHER ident reply block */\n844\t\tu_long\tis_authmem;\n845\t\tu_int\tis_dbuf;\t/* number of dbuf allocated (originally) */\n846\t\tu_int\tis_dbufnow;\t/* number of dbuf allocated */\n847\t\tu_int\tis_dbufuse;\t/* number of dbuf in use */\n848\t\tu_int\tis_dbufmin;\t/* min number of dbuf in use */\n849\t\tu_int\tis_dbufmax;\t/* max number of dbuf in use */\n850\t\tu_int\tis_dbufmore;\t/* how many times we increased the bufferpool*/\n851\t\tu_long\tis_m_users;\t/* maximum users connected */\n852\t\ttime_t\tis_m_users_t;\t/* timestamp of last maximum users */\n853\t\tu_long\tis_m_serv;\t/* maximum servers connected */\n854\t\tu_long\tis_m_service;\t/* maximum services connected */\n855\t\tu_long\tis_m_myclnt;\t/* maximum local clients */\n856\t\ttime_t\tis_m_myclnt_t;\t/* timestamp of last maximum local clients */\n857\t\tu_long\tis_m_myserv;\t/* maximum local servers */\n858\t\tu_long\tis_m_myservice;\t/* maximum local services */\n859\t\tu_long\tis_l_myclnt;\t/* last local user count */\n860\t\ttime_t\tis_l_myclnt_t;\t/* timestamp for last count */\n861\t#ifdef DELAY_CLOSE\n862\t\tu_long\tis_delayclose;\t/* number of fds that got delayed close() */\n863\t\tu_int\tis_delayclosewait;\t/* number of fds that wait for delayed close() */\n864\t#endif\n865\t} istat_t;\n866\t\n867\t/* String manipulation macros */\n868\t\n869\t/* strncopynt --> strncpyzt to avoid confusion, sematics changed\n870\t   N must be now the number of bytes in the array --msa */\n871\t#define\tstrncpyzt(x, y, N) do{(void)strncpy(x,y,N);x[N-1]='\\0';}while(0)\n872\t#define\tStrEq(x,y)\t(!strcmp((x),(y)))\n873\t\n874\t/* used in SetMode() in channel.c and m_umode() in s_msg.c */\n875\t\n876\t#define\tMODE_NULL      0\n877\t#define\tMODE_ADD       0x40000000\n878\t#define\tMODE_DEL       0x20000000\n879\t\n880\t/* return values for hunt_server() */\n881\t\n882\t#define\tHUNTED_NOSUCH\t(-1)\t/* if the hunted server is not found */\n883\t#define\tHUNTED_ISME\t0\t/* if this server should execute the command */\n884\t#define\tHUNTED_PASS\t1\t/* if message passed onwards successfully */\n885\t\n886\t/* used when sending to $#mask or $$mask */\n887\t\n888\t#define\tMATCH_SERVER\t1\n889\t#define\tMATCH_HOST\t2\n890\t\n891\t/* used for sendto_serv */\n892\t\n893\t#define\tSV_OLD\t\t0x0000\n894\t#define SV_UID\t\t0x0001\n895\t#define\tSV_2_11\t\tSV_UID\n896\t\n897\t/* used for sendto_flag */\n898\t\n899\ttypedef\tstruct\t{\n900\t\tint\tsvc_chan;\n901\t\tchar\t*svc_chname;\n902\t\tstruct\tChannel\t*svc_ptr;\n903\t\tint\tfd;\n904\t}\tSChan;\n905\t\n906\ttypedef enum ServerChannels {\n907\t\tSCH_ERROR,\n908\t\tSCH_NOTICE,\n909\t\tSCH_KILL,\n910\t\tSCH_CHAN,\n911\t\tSCH_NUM,\n912\t\tSCH_SERVER,\n913\t\tSCH_HASH,\n914\t\tSCH_LOCAL,\n915\t\tSCH_SERVICE,\n916\t\tSCH_DEBUG,\n917\t\tSCH_AUTH,\n918\t\tSCH_SAVE,\n919\t\tSCH_WALLOP,\n920\t#ifdef CLIENTS_CHANNEL\n921\t\tSCH_CLIENT,\n922\t#endif\n923\t\tSCH_OPER,\n924\t\tSCH_MAX\t\n925\t} ServerChannels;\n926\t\n927\t/* used for async dns values */\n928\t\n929\t#define\tASYNC_NONE\t(-1)\n930\t#define\tASYNC_CLIENT\t0\n931\t#define\tASYNC_CONNECT\t1\n932\t#define\tASYNC_CONF\t2\n933\t#define\tASYNC_SERVER\t3\n934\t\n935\t/* Client exit codes for log file */\n936\t#define EXITC_UNDEF\t'-'\t/* unregistered client */\n937\t#define EXITC_REG\t'0'\t/* normal exit */\n938\t#define EXITC_AUTHFAIL\t'A'\t/* Authentication failure (iauth problem) */\n939\t#define EXITC_AUTHTOUT\t'a'\t/* Authentication time out */\n940\t#define EXITC_CLONE\t'C'\t/* CLONE_CHECK */\n941\t#define EXITC_DIE\t'd'\t/* server died */\n942\t#define EXITC_DEAD\t'D'\t/* socket died */\n943\t#define EXITC_ERROR\t'E'\t/* socket error */\n944\t#define EXITC_FLOOD\t'F'\t/* client flooding */\n945\t#define EXITC_FAILURE\t'f'\t/* connect failure */\n946\t#define EXITC_GHMAX\t'G'\t/* global clients per host max limit */\n947\t#define EXITC_GUHMAX\t'g'\t/* global clients per user@host max limit */\n948\t#define EXITC_NOILINE\t'I'\t/* No matching I:line */\n949\t#define EXITC_KLINE\t'k'\t/* K-lined */\n950\t#define EXITC_KILL\t'K'\t/* KILLed */\n951\t#define EXITC_LHMAX\t'L'\t/* local clients per host max limit */\n952\t#define EXITC_LUHMAX\t'l'\t/* local clients per user@host max limit */\n953\t#define EXITC_MBUF\t'M'\t/* mem alloc error */\n954\t#define EXITC_PING\t'P'\t/* ping timeout */\n955\t#define EXITC_BADPASS\t'p'\t/* bad password */\n956\t#define EXITC_SENDQ\t'Q'\t/* send queue exceeded */\n957\t#define EXITC_REF\t'R'\t/* Refused */\n958\t#ifdef TKLINE\n959\t#define EXITC_TKLINE\t't'\t/* tkline */\n960\t#endif\n961\t#define EXITC_AREF\t'U'\t/* Unauthorized by iauth */\n962\t#define EXITC_AREFQ\t'u'\t/* Unauthorized by iauth, be quiet */\n963\t#define EXITC_VIRUS\t'v'\t/* joined a channel used by PrettyPark virus */\n964\t#ifdef XLINE\n965\t#define EXITC_XLINE\t'X'\t/* Forbidden GECOS */\n966\t#endif\n967\t#define EXITC_YLINEMAX\t'Y'\t/* Y:line max clients limit */\n968\t\n969\t/* eXternal authentication slave OPTions */\n970\t#define\tXOPT_REQUIRED\t0x01\t/* require authentication be done by iauth */\n971\t#define\tXOPT_NOTIMEOUT\t0x02\t/* disallow iauth time outs */\n972\t#define XOPT_EXTWAIT\t0x10\t/* extend registration ping timeout */\n973\t#define XOPT_EARLYPARSE\t0x20\t/* allow early parsing and send USER/PASS\n974\t\t\t\t\t   information to iauth */\n975\t\n976\t/* misc defines */\n977\t\n978\t#define\tFLUSH_BUFFER\t-2\n979\t#define\tUTMP\t\t\"/etc/utmp\"\n980\t#define\tCOMMA\t\t\",\"\n981\t\n982\t#define\tSAP\tstruct SOCKADDR *\n983\t\n984\t/* safety checks */\n985\t#if ! (UIDLEN <= NICKLEN)\n986\t#   error UIDLEN must not be bigger than NICKLEN\n987\t#endif\n988\t#if ! (UIDLEN > SIDLEN)\n989\t#   error UIDLEN must be bigger than SIDLEN\n990\t#endif\n991\t#if (NICKLEN < LOCALNICKLEN)\n992\t#   error LOCALNICKLEN must not be bigger than NICKLEN\n993\t#endif\n994\t\n995\t/* WHO parameter flags */\n996\t#define WHO_FLAG_OPERS_ONLY\t0x0001\n997\t#define WHO_FLAG_CHANNEL\t0x0002\n998\t#define WHO_FLAG_HOP\t\t0x0004\n999\t#define WHO_FLAG_FLAGS\t\t0x0008\n1000\t#define WHO_FLAG_HOST\t\t0x0010\n1001\t#define WHO_FLAG_IP\t\t\t0x0020\n1002\t#define WHO_FLAG_IDLE\t\t0x0040\n1003\t#define WHO_FLAG_NICK\t\t0x0080\n1004\t#define WHO_FLAG_INFO\t\t0x0100\n1005\t#define WHO_FLAG_SERVER\t\t0x0200\n1006\t#define WHO_FLAG_TOKEN\t\t0x0400\n1007\t#define WHO_FLAG_USER\t\t0x0800\n1008\t#define WHO_FLAG_ACCOUNT\t0x1000\n1009\t#define WHO_FLAG_OP_LEVEL\t0x2000\n1010\t#define WHO_FLAG_SID\t\t0x4000\n1011\t#define WHO_FLAG_UID\t\t0x8000\n1012\t\n1013\tstruct who_opts\n1014\t{\n1015\t\tint flags;\n1016\t\tconst char *token;\n1017\t};\n1018\t\n1019\t/*\n1020\t * base for channel IDs and UIDs\n1021\t */\n1022\t#define CHIDNB 36\n1023\t\n1024\t\n1025\t/* Defines used for SET command */\n1026\t#define TSET_ACONNECT 0x001\n1027\t#define TSET_POOLSIZE 0x002\n1028\t#define TSET_CACCEPT 0x004\n1029\t#define TSET_SHOWALL (int) ~0\n1030\t\n1031\t/* Runtime configuration structure */\n1032\ttypedef struct\n1033\t{\n1034\t\tint aconnect;\t/* 0 - OFF 1 - ON */\n1035\t\t/* standalone splitmode is -1 not 3 */\n1036\t\tint split;\t/* -1: standalone, 0: no, >0 yes (and since when) */\n1037\t\tint split_minservers;\n1038\t\tint split_minusers;\n1039\t\tint caccept;\t/* 0 - OFF 1 - ON 2 - SPLIT */\n1040\t} iconf_t;\n1041\t\n1042\t/* O:line flags, used also in is_allowed() */\n1043\t#define ACL_LOCOP\t\t0x00001\n1044\t#define ACL_KILLLOCAL\t\t0x00002\n1045\t#define ACL_KILLREMOTE\t\t0x00004\n1046\t#define ACL_KILL\t\t(ACL_KILLLOCAL|ACL_KILLREMOTE)\n1047\t#define ACL_SQUITLOCAL\t\t0x00008\n1048\t#define ACL_SQUITREMOTE\t\t0x00010\n1049\t#define ACL_SQUIT\t\t(ACL_SQUITLOCAL|ACL_SQUITREMOTE)\n1050\t#define ACL_CONNECTLOCAL\t0x00020\n1051\t#define ACL_CONNECTREMOTE\t0x00040\n1052\t#define ACL_CONNECT\t\t(ACL_CONNECTLOCAL|ACL_CONNECTREMOTE)\n1053\t#define ACL_CLOSE\t\t0x00080\n1054\t#define ACL_HAZH\t\t0x00100\n1055\t#define ACL_DNS\t\t\t0x00200\n1056\t#define ACL_REHASH\t\t0x00400\n1057\t#define ACL_RESTART\t\t0x00800\n1058\t#define ACL_DIE\t\t\t0x01000\n1059\t#define ACL_SET\t\t\t0x02000\n1060\t#define ACL_TKLINE\t\t0x04000\n1061\t#define ACL_UNTKLINE\t\tACL_TKLINE\n1062\t#define ACL_CLIENTS\t\t0x08000\n1063\t#define ACL_CANFLOOD\t\t0x10000\n1064\t#define ACL_NOPENALTY\t\t0x20000\n1065\t#define ACL_TRACE\t\t0x40000\n1066\t#define ACL_KLINE\t\t0x80000\n1067\t#define ACL_SIDTRACE\t\t0x100000\n1068\t\n1069\t#define ACL_ALL_REMOTE\t\t(ACL_KILLREMOTE|ACL_SQUITREMOTE|ACL_CONNECTREMOTE)\n1070\t#define ACL_ALL\t\t\t0x1FFFFF\n1071\t\n1072\t#ifdef CLIENTS_CHANNEL\n1073\t/* information scope of &CLIENTS channel. */\n1074\t#define CCL_CONN     0x01\t/* connections */\n1075\t#define CCL_CONNINFO 0x02\t/* if connections, then with realname */\n1076\t#define CCL_QUIT     0x04\t/* quits */\n1077\t#define CCL_QUITINFO 0x08\t/* if quits, then with quit message */\n1078\t#define CCL_NICK     0x10\t/* nick changes */\n1079\t#endif\n1080\t\n1081\t"}]},"uuid":"44706794-deeb-4d90-9849-d885e99f093c","timestamp":"2026-06-02T18:19:18.035Z","sourceToolAssistantUUID":"d50b1cd5-a5f0-4f9d-94f8-223a88490b4b","userType":"external","entrypoint":"cli","cwd":"/home/xe/code/xeiaso.net/ircd.rs","sessionId":"e83e5713-2d2e-41ff-8d3c-a19f61254d0c","version":"2.1.160","gitBranch":"master"}
.claude/sessions/6a99d21a-e41e-4a2c-9a95-861f1388f253/subagents/agent-a94bf3f8629d31db8.jsonl:20:{"parentUuid":"8e306a1e-4fe1-4668-a4f3-ef431a6b8de3","isSidechain":true,"promptId":"64d42066-aea2-4684-8374-6a75716e1c80","agentId":"a94bf3f8629d31db8","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01ScGHBxjiuxNcynkRh77dAe","type":"tool_result","content":"1\t/************************************************************************\n2\t *   IRC - Internet Relay Chat, common/struct_def.h\n3\t *   Copyright (C) 1990 Jarkko Oikarinen and\n4\t *                      University of Oulu, Computing Center\n5\t *\n6\t *   This program is free software; you can redistribute it and/or modify\n7\t *   it under the terms of the GNU General Public License as published by\n8\t *   the Free Software Foundation; either version 1, or (at your option)\n9\t *   any later version.\n10\t *\n11\t *   This program is distributed in the hope that it will be useful,\n12\t *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n13\t *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n14\t *   GNU General Public License for more details.\n15\t *\n16\t *   You should have received a copy of the GNU General Public License\n17\t *   along with this program; if not, write to the Free Software\n18\t *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n19\t *\n20\t *   $Id: struct_def.h,v 1.152 2011/01/20 14:26:56 bif Exp $\n21\t */\n22\t\n23\ttypedef\tstruct\tConfItem aConfItem;\n24\ttypedef\tstruct\tListItem aListItem;\n25\ttypedef\tstruct \tClient\taClient;\n26\ttypedef\tstruct\tChannel\taChannel;\n27\ttypedef\tstruct\tUser\tanUser;\n28\ttypedef\tstruct\tServer\taServer;\n29\ttypedef\tstruct\tService\taService;\n30\ttypedef\tstruct\tSLink\tLink;\n31\ttypedef\tstruct\tinvSLink\tinvLink;\n32\ttypedef\tstruct\tSMode\tMode;\n33\ttypedef\tstruct\tfdarray\tFdAry;\n34\ttypedef\tstruct\tCPing\taCPing;\n35\ttypedef\tstruct\tZdata\taZdata;\n36\ttypedef struct        LineItem aMotd;\n37\t#if defined(USE_IAUTH)\n38\ttypedef struct        LineItem aExtCf;\n39\ttypedef struct        LineItem aExtData;\n40\t#endif\n41\t\n42\t#define\tHOSTLEN\t\t63\t/* Length of hostname.  Updated to         */\n43\t\t\t\t\t/* comply with RFC1123                     */\n44\t\n45\t#if (INET6_ADDRSTRLEN > HOSTLEN)\n46\t#error HOSTLEN must not be smaller than INET6_ADDRSTRLEN\n47\t#endif\n48\t\n49\t#define\tNICKLEN\t\t15\t/* Must be the same network-wide. */\n50\t#define UIDLEN\t\t9\t/* must not be bigger than NICKLEN --Beeth */\n51\t#define\tUSERLEN\t\t10\n52\t#define\tREALLEN\t \t50\n53\t#define\tTOPICLEN\t255\n54\t#define\tCHANNELLEN\t50\n55\t#define\tPASSWDLEN \t20\n56\t#define\tKEYLEN\t\t23\n57\t#define\tBUFSIZE\t\t512\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n58\t#define\tMAXRECIPIENTS \t20\n59\t#define\tMAXBANS\t\t64\n60\t#define\tMAXBANLENGTH\t2048\n61\t#define\tBANLEN\t\t(USERLEN + NICKLEN + HOSTLEN + 3)\n62\t#define MAXPENALTY\t10\n63\t#define\tCHIDLEN\t\t5\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n64\t#define\tSIDLEN\t\t4\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n65\t#define\tMAXMODEPARAMS\t3\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n66\t#define\tDELAYCHASETIMELIMIT\t1800\t/* WARNING: *DONT* CHANGE THIS!!!! */\n67\t#define\tLDELAYCHASETIMELIMIT\t5400\t/* WARNING: *DONT* CHANGE THIS!!!! */\n68\t\n69\t#define\tREADBUF_SIZE\t16384\t/* used in s_bsd.c *AND* s_zip.c ! */\n70\t \n71\t/*\n72\t * Make up some numbers which should reflect average leaf server connect\n73\t * queue max size.\n74\t * queue=(<# of channels> * <channel size> + <user size> * <# of users>) * 2\n75\t * pool=<queue per client> * <avg. # of clients having data in queue>\n76\t */\n77\t#define\tQUEUELEN\t(((MAXCONNECTIONS / 10) * (CHANNELLEN + BANLEN + 16) +\\\n78\t\t\t\t  (HOSTLEN * 4 + REALLEN + NICKLEN + USERLEN + 24) *\\\n79\t\t\t\t  (MAXCONNECTIONS / 2)) * 2)\n80\t\n81\t#define\tBUFFERPOOL\t(DBUFSIZ * MAXCONNECTIONS * 2) + \\\n82\t\t\t\t(QUEUELEN * MAXSERVERS)\n83\t\n84\t#define\tUSERHOST_REPLYLEN\t(NICKLEN+HOSTLEN+USERLEN+5)\n85\t\n86\t/*\n87\t** 'offsetof' is defined in ANSI-C. The following definition\n88\t** is not absolutely portable (I have been told), but so far\n89\t** it has worked on all machines I have needed it. The type\n90\t** should be size_t but...  --msa\n91\t*/\n92\t#ifndef offsetof\n93\t#define\toffsetof(t,m) (int)((&((t *)0L)->m))\n94\t#endif\n95\t\n96\t#define\telementsof(x) (sizeof(x)/sizeof(x[0]))\n97\t\n98\t/*\n99\t** flags for bootup options (command line flags)\n100\t*/\n101\t#define\tBOOT_CONSOLE\t0x001\n102\t#define\tBOOT_QUICK\t0x002\n103\t#define\tBOOT_DEBUG\t0x004\n104\t#define\tBOOT_INETD\t0x008\n105\t#define\tBOOT_TTY\t0x010\n106\t\n107\t#define\tBOOT_AUTODIE\t0x040\n108\t#define\tBOOT_BADTUNE\t0x080\n109\t#define\tBOOT_PROT\t0x100\n110\t#define\tBOOT_STRICTPROT\t0x200\n111\t#define\tBOOT_NOIAUTH\t0x400\n112\t#define\tBOOT_STANDALONE\t0x800\n113\t\n114\ttypedef enum Status {\n115\t\tSTAT_CONNECTING = -4,\n116\t\tSTAT_HANDSHAKE, /* -3 */\n117\t\tSTAT_UNKNOWN,\t/* -2 */\n118\t\tSTAT_ME,\t/* -1 */\n119\t\tSTAT_SERVER,\t/* 0 */\n120\t\tSTAT_CLIENT,\t/* 1 */\n121\t\tSTAT_OPER,\t/* 2 */\n122\t\tSTAT_SERVICE,\t/* 3 */\n123\t\tSTAT_UNREG,\t/* 4 */\n124\t\tSTAT_MAX\t/* 5 -- size of handler[] table we need */\n125\t} Status;\n126\t\n127\t/*\n128\t * status macros.\n129\t */\n130\t#define\tIsRegisteredUser(x)\t(((x)->status == STAT_CLIENT || \\\n131\t\t\t\t\t (x)->status == STAT_OPER) && (x)->user)\n132\t#define\tIsRegistered(x)\t\t((x)->status >= STAT_SERVER || \\\n133\t\t\t\t\t (x)->status == STAT_ME)\n134\t#define\tIsConnecting(x)\t\t((x)->status == STAT_CONNECTING)\n135\t#define\tIsHandshake(x)\t\t((x)->status == STAT_HANDSHAKE)\n136\t#define\tIsMe(x)\t\t\t((x)->status == STAT_ME)\n137\t#define\tIsUnknown(x)\t\t((x)->status == STAT_UNKNOWN)\n138\t#define\tIsServer(x)\t\t((x)->status == STAT_SERVER)\n139\t#define\tIsClient(x)\t\t((x)->status == STAT_CLIENT || \\\n140\t\t\t\t\t (x)->status == STAT_OPER)\n141\t#define\tIsService(x)\t\t((x)->status == STAT_SERVICE && (x)->service)\n142\t\n143\t#define\tSetConnecting(x)\t((x)->status = STAT_CONNECTING)\n144\t#define\tSetHandshake(x)\t\t((x)->status = STAT_HANDSHAKE)\n145\t#define\tSetMe(x)\t\t((x)->status = STAT_ME)\n146\t#define\tSetUnknown(x)\t\t((x)->status = STAT_UNKNOWN)\n147\t#define\tSetServer(x)\t\t((x)->status = STAT_SERVER)\n148\t#define\tSetClient(x)\t\t((x)->status = IsAnOper((x)) ? STAT_OPER : STAT_CLIENT)\n149\t#define\tSetService(x)\t\t((x)->status = STAT_SERVICE)\n150\t\n151\t#define\tFLAGS_PINGSENT\t0x0000001 /* Unreplied ping sent */\n152\t#define\tFLAGS_DEADSOCK\t0x0000002 /* Local socket is dead--Exiting soon */\n153\t#define\tFLAGS_KILLED\t0x0000004 /* Prevents \"QUIT\" from being sent for this */\n154\t#define\tFLAGS_BLOCKED\t0x0000008 /* socket is in blocked condition [unused] */\n155\t#ifdef UNIXPORT\n156\t#define\tFLAGS_UNIX\t0x0000010 /* socket is in the unix domain, not inet */\n157\t#endif\n158\t#define\tFLAGS_CLOSING\t0x0000020 /* set when closing to suppress errors */\n159\t#define\tFLAGS_LISTEN\t0x0000040 /* used to mark clients which we listen() on */\n160\t#define\tFLAGS_XAUTHDONE\t0x0000080 /* iauth is finished with this client */\n161\t#define\tFLAGS_DOINGDNS\t0x0000100 /* client is waiting for a DNS response */\n162\t#define\tFLAGS_AUTH\t0x0000200 /* client is waiting on rfc931 response */\n163\t#define\tFLAGS_WRAUTH\t0x0000400 /* set if we havent writen to ident server */\n164\t#define\tFLAGS_LOCAL\t0x0000800 /* set for local clients */\n165\t#define\tFLAGS_GOTID\t0x0001000 /* successful ident lookup achieved */\n166\t#define\tFLAGS_XAUTH\t0x0002000 /* waiting on external authentication */\n167\t#define\tFLAGS_WXAUTH\t0x0004000 /* same as above, but also prevent parsing */\n168\t#define\tFLAGS_NONL\t0x0008000 /* No \\n in buffer */\n169\t#define\tFLAGS_CBURST\t0x0010000 /* set to mark connection burst being sent */\n170\t#define\tFLAGS_QUIT\t0x0040000 /* QUIT :comment shows it's not a split */\n171\t#define\tFLAGS_SPLIT\t0x0080000 /* client QUITting because of a netsplit */\n172\t#define\tFLAGS_HIDDEN\t0x0100000 /* netsplit is behind a hostmask,\n173\t\t\t\t\t     also used for marking clients in who_find\n174\t\t\t\t\t   */\n175\t#define\tFLAGS_UNKCMD\t0x0200000 /* has sent an unknown command */\n176\t#define\tFLAGS_ZIP\t0x0400000 /* link is zipped */\n177\t#define\tFLAGS_ZIPRQ\t0x0800000 /* zip requested */\n178\t#define\tFLAGS_ZIPSTART\t0x1000000 /* start of zip (ignore any CRLF) */\n179\t#define\tFLAGS_SQUIT\t0x2000000 /* This is set when we send the last\n180\t\t\t\t\t  ** server, so we know we have to send\n181\t\t\t\t\t  ** a SQUIT. */\n182\t#define\tFLAGS_EOB\t0x4000000 /* EOB received */\n183\t#define FLAGS_LISTENINACTIVE 0x8000000 /* Listener does not listen() */\n184\t#ifdef JAPANESE\n185\t#define\tFLAGS_JP\t0x10000000 /* jp version, used both for chans and servs */\n186\t#endif\n187\t\t\n188\t#define\tFLAGS_OPER\t0x0001 /* operator */\n189\t#define\tFLAGS_LOCOP\t0x0002 /* local operator -- SRB */\n190\t#define\tFLAGS_WALLOP\t0x0004 /* send wallops to them */\n191\t#define\tFLAGS_INVISIBLE\t0x0008 /* makes user invisible */\n192\t#define FLAGS_RESTRICT\t0x0010 /* restricted user */\n193\t#define FLAGS_AWAY\t0x0020 /* user is away */\n194\t#define FLAGS_EXEMPT    0x0040 /* user is exempted from k-lines */\n195\t#ifdef XLINE\n196\t#define FLAGS_XLINED\t0x0100\t/* X-lined client */\n197\t#endif\n198\t#define FLAGS_TLS       0x0200 /* user is on a secure connection port (SSL/TLS) -- mh 2020-04-27 */\n199\t#define\tSEND_UMODES\t(FLAGS_INVISIBLE|FLAGS_OPER|FLAGS_WALLOP|FLAGS_AWAY|FLAGS_RESTRICT)\n200\t#define\tALL_UMODES\t(SEND_UMODES|FLAGS_LOCOP)\n201\t\n202\t/*\n203\t * user flags macros.\n204\t */\n205\t#define\tIsOper(x)\t\t((x)->user && (x)->user->flags & FLAGS_OPER)\n206\t#define\tIsLocOp(x)\t\t((x)->user && (x)->user->flags & FLAGS_LOCOP)\n207\t#define\tIsInvisible(x)\t\t((x)->user->flags & FLAGS_INVISIBLE)\n208\t#define IsRestricted(x)         ((x)->user && \\\n209\t\t\t\t\t (x)->user->flags & FLAGS_RESTRICT)\n210\t#define\tIsAnOper(x)\t\t((x)->user && \\\n211\t\t\t\t\t (x)->user->flags & (FLAGS_OPER|FLAGS_LOCOP))\n212\t#define\tIsPerson(x)\t\t((x)->user && IsClient(x))\n213\t#define\tIsPrivileged(x)\t\t(IsServer(x) || IsAnOper(x))\n214\t#define\tSendWallops(x)\t\t((x)->user->flags & FLAGS_WALLOP)\n215\t#ifdef UNIXPORT\n216\t#define\tIsUnixSocket(x)\t\t((x)->flags & FLAGS_UNIX)\n217\t#endif\n218\t#define\tIsListener(x)\t\t((x)->flags & FLAGS_LISTEN)\n219\t#define IsListenerInactive(x)\t((x)->flags & FLAGS_LISTENINACTIVE)\n220\t#define\tIsLocal(x)\t\t(MyConnect(x) && (x)->flags & FLAGS_LOCAL)\n221\t#define\tIsDead(x)\t\t((x)->flags & FLAGS_DEADSOCK)\n222\t#define\tIsBursting(x)\t\t(!((x)->flags & FLAGS_EOB))\n223\t#define IsKlineExempt(x)        ((x)->user && (x)->user->flags & FLAGS_EXEMPT)\n224\t\n225\t#define\tSetDead(x)\t\t((x)->flags |= FLAGS_DEADSOCK)\n226\t#define\tCBurst(x)\t\t((x)->flags & FLAGS_CBURST)\n227\t#define\tSetOper(x)\t\t((x)->user->flags |= FLAGS_OPER, \\\n228\t\t\t\t\t (x)->status = STAT_OPER)\n229\t#define\tSetLocOp(x)\t\t((x)->user->flags |= FLAGS_LOCOP, \\\n230\t\t\t\t\t (x)->status = STAT_OPER)\n231\t#define\tSetInvisible(x)\t\t((x)->user->flags |= FLAGS_INVISIBLE)\n232\t#define SetRestricted(x)\t((x)->user->flags |= FLAGS_RESTRICT)\n233\t#define\tSetWallops(x)\t\t((x)->user->flags |= FLAGS_WALLOP)\n234\t#ifdef UNIXPORT\n235\t#define\tSetUnixSock(x)\t\t((x)->flags |= FLAGS_UNIX)\n236\t#endif\n237\t#define\tSetDNS(x)\t\t((x)->flags |= FLAGS_DOINGDNS)\n238\t#define\tSetDoneXAuth(x)\t\t((x)->flags |= FLAGS_XAUTHDONE)\n239\t#define\tSetEOB(x)\t\t((x)->flags |= FLAGS_EOB)\n240\t#define SetListenerInactive(x)\t((x)->flags |= FLAGS_LISTENINACTIVE)\n241\t#define SetKlineExempt(x)\t((x)->user->flags |= FLAGS_EXEMPT)\n242\t\n243\t#define\tDoingDNS(x)\t\t((x)->flags & FLAGS_DOINGDNS)\n244\t#define\tDoingAuth(x)\t\t((x)->flags & FLAGS_AUTH)\n245\t#define\tDoingXAuth(x)\t\t((x)->flags & FLAGS_XAUTH)\n246\t#define\tWaitingXAuth(x)\t\t((x)->flags & FLAGS_WXAUTH)\n247\t#define\tDoneXAuth(x)\t\t((x)->flags & FLAGS_XAUTHDONE)\n248\t#define\tNoNewLine(x)\t\t((x)->flags & FLAGS_NONL)\n249\t\n250\t#define\tClearOper(x)\t\t((x)->user->flags &= ~FLAGS_OPER, \\\n251\t\t\t\t\t (x)->status = STAT_CLIENT)\n252\t#define\tClearLocOp(x)\t\t((x)->user->flags &= ~FLAGS_LOCOP, \\\n253\t\t\t\t\t (x)->status = STAT_CLIENT)\n254\t#define\tClearInvisible(x)\t((x)->user->flags &= ~FLAGS_INVISIBLE)\n255\t#define ClearRestricted(x)      ((x)->user->flags &= ~FLAGS_RESTRICT)\n256\t#define\tClearWallops(x)\t\t((x)->user->flags &= ~FLAGS_WALLOP)\n257\t#define\tClearDNS(x)\t\t((x)->flags &= ~FLAGS_DOINGDNS)\n258\t#define\tClearAuth(x)\t\t((x)->flags &= ~FLAGS_AUTH)\n259\t#define\tClearXAuth(x)\t\t((x)->flags &= ~FLAGS_XAUTH)\n260\t#define\tClearWXAuth(x)\t\t((x)->flags &= ~FLAGS_WXAUTH)\n261\t#define ClearListenerInactive(x) ((x)->flags &= ~FLAGS_LISTENINACTIVE)\n262\t#ifdef XLINE\n263\t#define IsXlined(x)\t\t((x)->user && (x)->user->flags & FLAGS_XLINED)\n264\t#define SetXlined(x)\t\t((x)->user->flags |= FLAGS_XLINED)\n265\t#define ClearXlined(x)\t\t((x)->user->flags &= ~FLAGS_XLINED)\n266\t#endif\n267\t#define IsTLS(x)        ((x)->user && (x)->user->flags & FLAGS_TLS)\n268\t#define SetTLS(x)       ((x)->user->flags |= FLAGS_TLS)\n269\t\n270\t/*\n271\t * defined debugging levels\n272\t */\n273\t#define\tDEBUG_FATAL  0\n274\t#define\tDEBUG_ERROR  1\t/* report_error() and other errors that are found */\n275\t#define\tDEBUG_READ   2\n276\t#define\tDEBUG_WRITE  2\n277\t#define\tDEBUG_NOTICE 3\n278\t#define\tDEBUG_DNS    4\t/* used by all DNS related routines - a *lot* */\n279\t#define\tDEBUG_INFO   5\t/* general usful info */\n280\t#define\tDEBUG_NUM    6\t/* numerics */\n281\t#define\tDEBUG_SEND   7\t/* everything that is sent out */\n282\t#define\tDEBUG_DEBUG  8\t/* anything to do with debugging, ie unimportant :) */\n283\t#define\tDEBUG_MALLOC 9\t/* malloc/free calls */\n284\t#define\tDEBUG_LIST  10\t/* debug list use */\n285\t#define\tDEBUG_L10   10\n286\t#define\tDEBUG_L11   11\n287\t\n288\t/*\n289\t * defines for curses in client\n290\t */\n291\t#define\tDUMMY_TERM\t0\n292\t#define\tCURSES_TERM\t1\n293\t#define\tTERMCAP_TERM\t2\n294\t\n295\tstruct\tCPing\t{\n296\t\tu_short\tport;\t\t/* port to send pings to */\n297\t\tu_long\trtt;\t\t/* average RTT */\n298\t\tu_long\tping;\n299\t\tu_long\tseq;\t\t/* # sent still in the \"window\" */\n300\t\tu_long\tlseq;\t\t/* sequence # of last sent */\n301\t\tu_long\trecvd;\t\t/* # received still in the \"window\" */\n302\t\tu_long\tlrecvd;\t\t/* # received */\n303\t};\n304\t\n305\tstruct\tConfItem\t{\n306\t\tu_int\tstatus;\t\t/* If CONF_ILLEGAL, delete when no clients */\n307\t\tint\tclients;\t/* Number of *LOCAL* clients using this */\n308\t\tstruct\tIN_ADDR ipnum;\t/* ip number of host field */\n309\t\tchar\t*host;\n310\t\tchar\t*passwd;\n311\t\tchar\t*name;\n312\t\tchar\t*name2;\n313\t#ifdef XLINE\n314\t\tchar\t*name3;\n315\t#endif\n316\t\tint\tport;\n317\t\tlong\tflags;\t\t/* I-line flags */\n318\t\tint\tpref;\t\t/* preference value */\n319\t\tstruct\tCPing\t*ping;\n320\t\ttime_t\thold;\t/* Hold action until this time (calendar time) */\n321\t\tchar\t*source_ip;\n322\t#ifndef VMSP\n323\t\taClass\t*class;  /* Class of connection */\n324\t#endif\n325\t\tstruct\tConfItem *next;\n326\t};\n327\t\n328\tstruct\tListItem\t{\n329\t\tchar\t*nick;\n330\t\tchar\t*user;\n331\t\tchar\t*host;\n332\t};\n333\t\n334\t/* these define configuration lines (A:, M:, I:, K:, etc.) */\n335\t#define\tCONF_ILLEGAL\t\t0x80000000\n336\t#define\tCONF_MATCH\t\t0x40000000\n337\t#define\tCONF_QUARANTINED_SERVER\t0x000001\n338\t#define\tCONF_CLIENT\t\t0x000002\n339\t\n340\t#define\tCONF_CONNECT_SERVER\t0x000008\n341\t#define\tCONF_NOCONNECT_SERVER\t0x000010\n342\t#define\tCONF_ZCONNECT_SERVER\t0x000020\n343\t\n344\t#define\tCONF_OPERATOR\t\t0x000080\n345\t#define\tCONF_ME\t\t\t0x000100\n346\t#define\tCONF_KILL\t\t0x000200\n347\t#define\tCONF_ADMIN\t\t0x000400\n348\t#define\tCONF_CLASS\t\t0x001000\n349\t#define\tCONF_SERVICE\t\t0x002000\n350\t#define\tCONF_LEAF\t\t0x004000\n351\t#define\tCONF_LISTEN_PORT\t0x008000\n352\t#define\tCONF_HUB\t\t0x010000\n353\t#define\tCONF_VER\t\t0x020000\n354\t#define\tCONF_BOUNCE\t\t0x040000\n355\t#define\tCONF_OTHERKILL\t\t0x080000\n356\t#define\tCONF_DENY\t\t0x100000\n357\t#ifdef TKLINE\n358\t#define\tCONF_TKILL\t\t0x200000\n359\t#define\tCONF_TOTHERKILL\t\t0x400000\n360\t#endif\n361\t#ifdef XLINE\n362\t#define CONF_XLINE\t\t0x800000\n363\t#endif\n364\t#define\tCONF_OPS\t\tCONF_OPERATOR\n365\t#define\tCONF_SERVER_MASK\t(CONF_CONNECT_SERVER | CONF_NOCONNECT_SERVER |\\\n366\t\t\t\t\t CONF_ZCONNECT_SERVER)\n367\t#define\tCONF_CLIENT_MASK\t(CONF_CLIENT | CONF_SERVICE | CONF_OPS | \\\n368\t\t\t\t\t CONF_SERVER_MASK)\n369\t\n370\t#define CFLAG_RESTRICTED\t0x00001\n371\t#define CFLAG_RNODNS\t\t0x00002\n372\t#define CFLAG_RNOIDENT\t\t0x00004\n373\t#define CFLAG_KEXEMPT\t\t0x00008\n374\t#define CFLAG_NORESOLVE\t\t0x00010\n375\t#define CFLAG_FALL\t\t0x00020\n376\t#define CFLAG_NORESOLVEMATCH\t0x00040\n377\t#ifdef XLINE\n378\t#define CFLAG_XEXEMPT\t\t0x00080\n379\t#endif\n380\t\n381\t#define IsConfRestricted(x)\t((x)->flags & CFLAG_RESTRICTED)\n382\t#define IsConfRNoDNS(x)\t\t((x)->flags & CFLAG_RNODNS)\n383\t#define IsConfRNoIdent(x)\t((x)->flags & CFLAG_RNOIDENT)\n384\t#define IsConfKlineExempt(x)\t((x)->flags & CFLAG_KEXEMPT)\n385\t#define IsConfNoResolve(x)\t((x)->flags & CFLAG_NORESOLVE)\n386\t#define IsConfNoResolveMatch(x)\t((x)->flags & CFLAG_NORESOLVEMATCH)\n387\t#define IsConfFallThrough(x)\t((x)->flags & CFLAG_FALL)\n388\t#ifdef XLINE\n389\t#define IsConfXlineExempt(x)\t((x)->flags & CFLAG_XEXEMPT)\n390\t#endif\n391\t\n392\t#define PFLAG_DELAYED\t\t0x00001\n393\t#define PFLAG_SERVERONLY\t0x00002\n394\t#define PFLAG_TLS           0x00004\n395\t\n396\t#define IsConfDelayed(x)\t((x)->flags & PFLAG_DELAYED)\n397\t#define IsConfServeronly(x)\t((x)->flags & PFLAG_SERVERONLY)\n398\t#define IsConfTLS(x)        ((x)->flags & PFLAG_TLS)\n399\t\n400\t#define\tIsIllegal(x)\t((x)->status & CONF_ILLEGAL)\n401\t\n402\ttypedef\tstruct\t{\n403\t\tu_long\tpi_id;\n404\t\tu_long\tpi_seq;\n405\t\tstruct\ttimeval\tpi_tv;\n406\t\taConfItem *pi_cp;\n407\t} Ping;\n408\t\n409\t\n410\t#define\tPING_REPLY\t0x01\n411\t#define\tPING_CPING\t0x02\n412\t\n413\t#ifdef\tZIP_LINKS\n414\t/* the minimum amount of data needed to trigger compression */\n415\t# define\tZIP_MINIMUM\t4096\n416\t\n417\t/* the maximum amount of data to be compressed (can actually be a bit more) */\n418\t# define\tZIP_MAXIMUM\t8192\t/* WARNING: *DON'T* CHANGE THIS!!!! */\n419\t\n420\tstruct Zdata {\n421\t\tz_stream\t*in;\t\t/* input zip stream data */\n422\t\tz_stream\t*out;\t\t/* output zip stream data */\n423\t\tBytef\t\toutbuf[ZIP_MAXIMUM]; /* outgoing (unzipped) buffer */\n424\t\tint\t\toutcount;\t/* size of outbuf content */\n425\t};\n426\t#endif\n427\t\n428\tstruct LineItem\n429\t{ \n430\t    char    *line;\n431\t    struct  LineItem *next;\n432\t};\n433\t\n434\t/*\n435\t * Client structures\n436\t */\n437\tstruct\tUser\t{\n438\t\tLink\t*channel;\t/* chain of channel pointer blocks */\n439\t\tinvLink\t*invited;\t/* chain of invite pointer blocks */\n440\t\tLink\t*uwas;\t\t/* chain of whowas pointer blocks */\n441\t\tchar\t*away;\t\t/* pointer to away message */\n442\t\ttime_t\tlast;\t\t/* \"idle\" time */\n443\t\tint\trefcnt;\t\t/* Number of times this block is referenced\n444\t\t\t\t\t** from aClient (field user), aServer (field\n445\t\t\t\t\t** by) and whowas array (field ww_user).\n446\t\t\t\t\t*/\n447\t\tint\tjoined;\t\t/* number of channels joined */\n448\t\tint\tflags;\t\t/* user modes */\n449\t        struct\tServer\t*servp;\n450\t\t\t\t\t/*\n451\t\t\t\t\t** In a perfect world the 'server' name\n452\t\t\t\t\t** should not be needed, a pointer to the\n453\t\t\t\t\t** client describing the server is enough.\n454\t\t\t\t\t** Unfortunately, in reality, server may\n455\t\t\t\t\t** not yet be in links while USER is\n456\t\t\t\t\t** introduced... --msa\n457\t\t\t\t\t** I think it's not true anymore --Beeth\n458\t\t\t\t\t*/\n459\t\tu_int\thashv;\n460\t\taClient\t*uhnext;\n461\t\taClient\t*bcptr;\n462\t\tchar\tusername[USERLEN+1];\n463\t\tchar\tuid[UIDLEN+1];\n464\t\tchar\thost[HOSTLEN+1];\n465\t\tchar\t*server;\n466\t\tu_int\thhashv;\t\t/* hostname hash value */\n467\t\tu_int\tiphashv;\t/* IP hash value */\n468\t\tstruct User *hhnext;\t/* next entry in hostname hash */\n469\t\tstruct User *iphnext;\t/* next entry in IP hash */\n470\t\t\t\t\t/* sip MUST be the last in this struct!!! */\n471\t\tchar\tsip[1];\t\t/* ip as a string, big enough for ipv6\n472\t\t\t\t\t * allocated to real size in make_user */\n473\t\n474\t};\n475\t\n476\tstruct\tServer\t{\n477\t\tchar\tnamebuf[HOSTLEN+1];\n478\t\tanUser\t*user;\t\t/* who activated this connection */\n479\t\taClient\t*up;\t\t/* uplink for this server */\n480\t\taConfItem *nline;\t/* N-line pointer for this server */\n481\t\tint\tversion;        /* version id for local client */\n482\t\tint\tsnum;\n483\t\tint\trefcnt;\t\t/* Number of times this block is referenced\n484\t\t\t\t\t** from anUser (field servp), aService (field\n485\t\t\t\t\t** servp) and aClient (field serv) */\n486\t\tint\tusercnt[3];\t/* # of clients - visible, invisible, opers */\n487\t\tstruct\tServer\t*nexts, *prevs, *shnext;\n488\t\taClient\t*bcptr;\n489\t\taClient\t*maskedby;\t/* Pointer to server masking this server.\n490\t\t\t\t\t** Self if not masked, *NEVER* NULL. */\n491\t\tchar\tby[NICKLEN+1];\n492\t\tchar\tbyuid[UIDLEN + 1];\n493\t\tchar\tsid[SIDLEN + 1];/* The Server ID. */\n494\t\tchar\tverstr[11];\t/* server version, PATCHLEVEL format */\n495\t\tu_int\tsidhashv;\t/* Raw hash value. */\n496\t\taServer\t*sidhnext;\t/* Next server in the sid hash. */\n497\t\ttime_t\tlastload;\t/* penalty like counters, see s_serv.c\n498\t\t\t\t\t** should be in the local part, but.. */\n499\t\tint\tservers;\t/* Number of downlinks of this server. */\n500\t\taClient\t*left, *right;\t/* Left and right nodes in server tree. */\n501\t\taClient\t*down;\t\t/* Ptr to first downlink of this server. */\n502\t};\n503\t\n504\tstruct\tService\t{\n505\t\tchar\tnamebuf[HOSTLEN+1];\n506\t\tint\twants;\n507\t\tint\ttype;\n508\t\tchar\t*server;\n509\t\taServer\t*servp;\n510\t\tstruct\tService\t*nexts, *prevs;\n511\t\taClient\t*bcptr;\n512\t\tchar\tdist[HOSTLEN+1];\n513\t};\n514\t\n515\tstruct Client\t{\n516\t\tstruct\tClient *next,*prev, *hnext;\n517\t\tanUser\t*user;\t\t/* ...defined, if this is a User */\n518\t\taServer\t*serv;\t\t/* ...defined, if this is a server */\n519\t\taService *service;\n520\t\tu_int\thashv;\t\t/* raw hash value */\n521\t\tlong\tflags;\t\t/* client flags */\n522\t\taClient\t*from;\t\t/* == self, if Local Client, *NEVER* NULL! */\n523\t\tint\tfd;\t\t/* >= 0, for local clients */\n524\t\tint\thopcount;\t/* number of servers to this 0 = local */\n525\t\tshort\tstatus;\t\t/* Client type */\n526\t\tchar\t*name;\t\t/* Pointer to unique name of the client */\n527\t\tchar\tnamebuf[NICKLEN+1]; /* nick of the client */\n528\t\tchar\tusername[USERLEN+1]; /* username here now for auth stuff */\n529\t\tchar\t*info;\t\t/* Free form additional client information */\n530\t\t/*\n531\t\t** The following fields are allocated only for local clients\n532\t\t** (directly connected to *this* server with a socket.\n533\t\t** The first of them *MUST* be the \"count\"--it is the field\n534\t\t** to which the allocation is tied to! *Never* refer to\n535\t\t** these fields, if (from != self).\n536\t\t*/\n537\t\tint\tcount;\t\t/* Amount of data in buffer */\n538\t\tchar\tbuffer[BUFSIZE]; /* Incoming message buffer */\n539\t#ifdef\tZIP_LINKS\n540\t\taZdata\t*zip;\t\t/* zip data */\n541\t#endif\n542\t\tshort\tlastsq;\t\t/* # of 2k blocks when sendqueued called last*/\n543\t\tdbuf\tsendQ;\t\t/* Outgoing message queue--if socket full */\n544\t\tdbuf\trecvQ;\t\t/* Hold for data incoming yet to be parsed */\n545\t\tlong\tsendM;\t\t/* Statistics: protocol messages send */\n546\t\tlong\treceiveM;\t/* Statistics: protocol messages received */\n547\t\tunsigned long long\tsendB;\t\t/* Statistics: total bytes send */\n548\t\tunsigned long long\treceiveB;\t/* Statistics: total bytes received */\n549\t\ttime_t\tlasttime;\t/* last time we received data */\n550\t\ttime_t\tfirsttime;\t/* time client was created */\n551\t\ttime_t\tsince;\t\t/* last time we parsed something */\n552\t\taClient\t*acpt;\t\t/* listening client which we accepted from */\n553\t\tLink\t*confs;\t\t/* Configuration record associated */\n554\t\tint\tping;\n555\t\tint\tauthfd;\t\t/* fd for rfc931 authentication */\n556\t\tchar\t*auth;\n557\t\tu_short\tport;\t\t/* and the remote port# too :-) */\n558\t\tstruct\tIN_ADDR\tip;\t/* keep real ip# too */\n559\t\tstruct\thostent\t*hostp;\n560\t\tchar\tsockhost[HOSTLEN+1]; /* This is the host name from the socket\n561\t\t\t\t\t  ** and after which the connection was\n562\t\t\t\t\t  ** accepted.\n563\t\t\t\t\t  */\n564\t\tchar\tpasswd[PASSWDLEN+1];\n565\t\tchar\texitc;\n566\t\tchar\t*reason;\t/* additional exit message */\n567\t#ifdef XLINE\n568\t\t/* Those logically should be in anUser struct, but would be null for\n569\t\t** all remote users... so better waste two pointers for all local\n570\t\t** non-users than two pointers for all remote users. --B. */\n571\t\tchar\t*user2;\t/* 2nd param of USER */\n572\t\tchar\t*user3;\t/* 3rd param of USER */\n573\t#endif\n574\t\n575\t};\n576\t\n577\t#define\tCLIENT_LOCAL_SIZE sizeof(aClient)\n578\t#define\tCLIENT_REMOTE_SIZE offsetof(aClient,count)\n579\t\n580\t/*\n581\t * statistics structures\n582\t */\n583\tstruct\tstats {\n584\t\tu_int\tis_cl;\t/* number of client connections */\n585\t\tu_int\tis_sv;\t/* number of server connections */\n586\t\tu_int\tis_ni;\t/* connection but no idea who it was\n587\t\t\t\t * (can be a P: line that has been removed -krys) */\n588\t\tunsigned long long\tis_cbs;\t/* bytes sent to clients */\n589\t\tunsigned long long\tis_cbr;\t/* bytes received to clients */\n590\t\tunsigned long long\tis_sbs;\t/* bytes sent to servers */\n591\t\tunsigned long long\tis_sbr;\t/* bytes received to servers */\n592\t\ttime_t\tis_cti;\t/* time spent connected by clients */\n593\t\ttime_t\tis_sti;\t/* time spent connected by servers */\n594\t\tu_int\tis_ac;\t/* connections accepted */\n595\t\tu_int\tis_ref;\t/* accepts refused */\n596\t\tu_int\tis_unco; /* unknown commands */\n597\t\tu_int\tis_wrdi; /* command going in wrong direction */\n598\t\tu_int\tis_unpf; /* unknown prefix */\n599\t\tu_int\tis_empt; /* empty message */\n600\t\tu_int\tis_num;\t/* numeric message */\n601\t\tu_int\tis_kill; /* number of kills generated on collisions */\n602\t\tu_int\tis_save; /* number of saved clients */\n603\t\tu_int\tis_fake; /* MODE 'fakes' */\n604\t\tu_int\tis_reop; /* number of local reops */\n605\t\tu_int\tis_rreop; /* number of remote reops */\n606\t\tu_int\tis_asuc; /* successful auth requests */\n607\t\tu_int\tis_abad; /* bad auth requests */\n608\t\tu_int\tis_udpok;\t/* packets recv'd on udp port */\n609\t\tu_int\tis_udperr;\t/* packets recvfrom errors on udp port */\n610\t\tu_int\tis_udpdrop;\t/* packets recv'd but dropped on udp port */\n611\t\tu_int\tis_loc;\t/* local connections made */\n612\t\tu_int\tis_nosrv; /* user without server */\n613\t\tu_long\tis_wwcnt; /* number of nicks overwritten in whowas[] */\n614\t\tunsigned long long\tis_wwt;\t/* sum of elapsed time on when \n615\t\t\t\t\t\t** overwriting whowas[] */\n616\t\tu_long\tis_wwMt;  /* max elapsed time on when overwriting whowas[] */\n617\t\tu_long\tis_wwmt;  /* min elapsed time on when overwriting whowas[] */\n618\t\tu_long\tis_lkcnt; /* number of nicks overwritten in locked[] */\n619\t\tunsigned long long\tis_lkt;\t/* sum of elapsed time on when\n620\t\t\t\t\t\t** overwriting locked[]*/\n621\t\tu_long\tis_lkMt;  /* max elapsed time on when overwriting locked[] */\n622\t\tu_long\tis_lkmt;  /* min elapsed time on when overwriting locked[] */\n623\t\tu_int\tis_ckl;   /* calls to check_link() */\n624\t\tu_int\tis_cklQ;  /* rejected: SendQ too high */\n625\t\tu_int\tis_ckly;  /* rejected: link too young */\n626\t\tu_int\tis_cklno; /* rejected: \"flood\" */\n627\t\tu_int\tis_cklok; /* accepted */\n628\t\tu_int\tis_cklq;  /* accepted early */\n629\t};\n630\t\n631\t/* mode structure for channels */\n632\t\n633\tstruct\tSMode\t{\n634\t\tu_int\tmode;\n635\t\tint\tlimit;\n636\t\tchar\tkey[KEYLEN+1];\n637\t};\n638\t\n639\t/* Message table structure */\n640\t\n641\ttypedef\tint\t(*CmdHandler)(aClient *, aClient *, int, char **);\n642\t\n643\tstruct\tCmd {\n644\t\tCmdHandler\thandler;\t/* command */\n645\t\tu_int\t\tcount;\t\t/* total count */\n646\t\tu_int\t\trcount;\t\t/* remote count */\n647\t\tu_long\t\tbytes;\n648\t\tu_long\t\trbytes;\n649\t};\n650\t\n651\tstruct\tMessage\t{\n652\t\tchar\t*cmd;\n653\t\tint\tminparams;\n654\t\tint\tmaxparams;\n655\t\tstruct Cmd\thandlers[STAT_MAX];\n656\t};\n657\t\n658\t/* fd array structure */\n659\t\n660\tstruct\tfdarray\t{\n661\t\tint\tfd[MAXCONNECTIONS];\n662\t\tint\thighest;\n663\t};\n664\t\n665\t/* general link structure used for chains */\n666\t\n667\tstruct\tSLink\t{\n668\t\tstruct\tSLink\t*next;\n669\t\tunion {\n670\t\t\taClient\t*cptr;\n671\t\t\taChannel *chptr;\n672\t\t\taConfItem *aconf;\n673\t\t\taListItem *alist;\n674\t\t\tchar\t*cp;\n675\t\t\tint\ti;\n676\t\t} value;\n677\t\tint\tflags;\n678\t};\n679\t\n680\t/* link structure used for invites */\n681\t\n682\tstruct\tinvSLink\t{\n683\t\tstruct\tinvSLink\t*next;\n684\t\taChannel\t\t*chptr;\n685\t\tchar\t\t\t*who;\n686\t\tint\t\t\tflags;\n687\t};\n688\t\n689\t/* channel structure */\n690\t\n691\tstruct Channel\t{\n692\t\tstruct\tChannel *nextch, *prevch, *hnextch;\n693\t\tu_int\thashv;\t\t/* raw hash value */\n694\t\tMode\tmode;\n695\t\tchar\ttopic[TOPICLEN+1];\n696\t#ifdef TOPIC_WHO_TIME\n697\t\tchar\ttopic_nuh[BANLEN+1];\n698\t\ttime_t\ttopic_t;\n699\t#endif\n700\t\tint\tusers;\t\t/* current membership total */\n701\t\tLink\t*members;\t/* channel members */\n702\t\tLink\t*invites;\t/* outstanding invitations */\n703\t\tLink\t*mlist;\t\t/* list of extended modes: +b/+e/+I */\n704\t\tLink\t*clist;\t\t/* list of local! connections which are members */\n705\t\ttime_t\thistory;\t/* channel history (aka channel delay) */\n706\t\ttime_t\treop;\t\t/* server reop stamp for !channels */\n707\t#ifdef JAPANESE\n708\t\tint flags;\n709\t#endif\n710\t\tchar\tchname[1];\n711\t};\n712\t\n713\t/*\n714\t** Channel Related macros follow\n715\t*/\n716\t\n717\t/* Channel related flags */\n718\t\n719\t#define\tCHFL_UNIQOP     0x0001 /* Channel creator */\n720\t#define\tCHFL_CHANOP     0x0002 /* Channel operator */\n721\t#define\tCHFL_VOICE      0x0004 /* the power to speak */\n722\t#define\tCHFL_BAN\t0x0008 /* ban channel flag */\n723\t#define\tCHFL_EXCEPTION\t0x0010 /* exception channel flag */\n724\t#define\tCHFL_INVITE\t0x0020 /* invite channel flag */\n725\t#define\tCHFL_REOPLIST\t0x0040 /* reoplist channel flag */\n726\t\n727\t/* Channel Visibility macros */\n728\t\n729\t#define\tMODE_UNIQOP\tCHFL_UNIQOP\n730\t#define\tMODE_CHANOP\tCHFL_CHANOP\n731\t#define\tMODE_VOICE\tCHFL_VOICE\n732\t#define\tMODE_PRIVATE\t0x00008\n733\t#define\tMODE_SECRET\t0x00010\n734\t#define\tMODE_MODERATED  0x00020\n735\t#define\tMODE_TOPICLIMIT 0x00040\n736\t#define\tMODE_INVITEONLY 0x00080\n737\t#define\tMODE_NOPRIVMSGS 0x00100\n738\t#define\tMODE_KEY\t0x00200\n739\t#define\tMODE_BAN\t0x00400\n740\t#define\tMODE_LIMIT\t0x00800\n741\t#define\tMODE_ANONYMOUS\t0x01000\n742\t#define\tMODE_QUIET\t0x02000\n743\t#define\tMODE_EXCEPTION\t0x04000\n744\t#define\tMODE_INVITE\t0x08000\n745\t#define\tMODE_REOP\t0x10000\n746\t#define\tMODE_REOPLIST\t0x20000\n747\t#define\tMODE_FLAGS\t0x3ffff\n748\t/*\n749\t * mode flags which take another parameter (With PARAmeterS)\n750\t */\n751\t#define\tMODE_WPARAS\t(MODE_UNIQOP|MODE_CHANOP|MODE_VOICE|MODE_BAN|MODE_KEY\\\n752\t\t\t\t |MODE_LIMIT|MODE_INVITE|MODE_EXCEPTION|MODE_REOPLIST)\n753\t/*\n754\t * Undefined here, these are used in conjunction with the above modes in\n755\t * the source.\n756\t#define\tMODE_DEL       0x40000000\n757\t#define\tMODE_ADD       0x80000000\n758\t */\n759\t\n760\t#define\tHoldChannel(x)\t\t(!(x))\n761\t/* name invisible */\n762\t#define\tSecretChannel(x)\t((x) && ((x)->mode.mode & MODE_SECRET))\n763\t/* channel not shown but names are */\n764\t#define\tHiddenChannel(x)\t((x) && ((x)->mode.mode & MODE_PRIVATE))\n765\t/* channel visible */\n766\t#define\tShowChannel(v,c)\t(PubChannel(c) || IsMember((v),(c)))\n767\t#define\tIsAnonymous(c)\t\t((c) && ((c)->mode.mode & MODE_ANONYMOUS))\n768\t#define\tPubChannel(x)\t\t((!x) || ((x)->mode.mode &\\\n769\t\t\t\t\t (MODE_PRIVATE | MODE_SECRET)) == 0)\n770\t\n771\t/*\n772\t#define\tIsMember(u, c)\t\t(assert(*(c)->chname != '\\0'), find_user_link((c)->members, u) ? 1 : 0)\n773\t#define\tIsMember(u, c)\t\t(find_user_link((c)->members, u) ? 1 : 0)\n774\t*/\n775\t#define       IsMember(u, c)          (u && (u)->user && \\\n776\t\t\t       find_channel_link((u)->user->channel, c) ? 1 : 0)\n777\t# define\tIsChannelName(n)\t((n) && (*(n) == '#' || *(n) == '&' ||\\\n778\t\t\t\t\t\t*(n) == '+' || \\\n779\t\t\t\t\t\t(*(n) == '!' && cid_ok(n, CHIDLEN))))\n780\t#define\tIsQuiet(x)\t\t((x)->mode.mode & MODE_QUIET)\n781\t#define\tUseModes(n)\t\t((n) && (*(n) == '#' || *(n) == '&' || \\\n782\t\t\t\t\t\t *(n) == '!'))\n783\t\n784\t/* Misc macros */\n785\t\n786\t#define\tBadPtr(x) (!(x) || (*(x) == '\\0'))\n787\t#define\tBadTo(x) (BadPtr((x)) ? \"*\" : (x))\n788\t\n789\t#define\tMyConnect(x)\t\t\t((x)->fd >= 0)\n790\t#define\tMyClient(x)\t\t\t(MyConnect(x) && IsClient(x))\n791\t#define\tMyPerson(x)\t\t\t(MyConnect(x) && IsPerson(x))\n792\t#define\tMyOper(x)\t\t\t(MyConnect(x) && IsOper(x))\n793\t#define\tMyService(x)\t\t\t(MyConnect(x) && IsService(x))\n794\t#define\tME\tme.name\n795\t#define\tMES\tme.serv->sid\n796\t\n797\t#define\tGotDependantClient(x)\t(x->prev &&\t\t\t\t\\\n798\t\t\t \t\t ((IsRegisteredUser(x->prev) &&\t\t\\\n799\t\t\t\t\t  x->prev->user->servp == x->serv) ||\t\\\n800\t\t\t\t\t  (IsService(x->prev) &&\t\t\\\n801\t\t\t\t\t  x->prev->service->servp == x->serv)))\n802\t\n803\t#define\tIsMasked(x)\t\t(x && x->serv && x->serv->maskedby != x)\n804\t\n805\t#define IsSplit()\t\t(iconf.split > 0)\n806\t\n807\ttypedef\tstruct\t{\n808\t\tu_long\tis_user[2];\t/* users, non[0] invis and invis[1] */\n809\t\tu_long\tis_serv;\t/* servers */\n810\t\tu_long\tis_eobservers;  /* number of servers which sent EOB */\n811\t\tu_long\tis_masked;\t/* masked servers. */\n812\t\tu_long\tis_service;\t/* services */\n813\t\tu_long\tis_chan;\t/* channels */\n814\t\tu_long\tis_chanmem;\n815\t\tu_long\tis_chanusers;\t/* channels users */\n816\t\tu_long\tis_hchan;\t/* channels in history */\n817\t\tu_long\tis_hchanmem;\n818\t\tu_long\tis_cchan;\t/* channels in cache */\n819\t\tu_long\tis_cchanmem;\n820\t\tu_long\tis_away;\t/* away sets */\n821\t\tu_long\tis_awaymem;\n822\t\tu_long\tis_oper;\t/* opers */\n823\t\tu_long\tis_bans;\t/* bans */\n824\t\tu_long\tis_banmem;\n825\t\tu_long\tis_invite;\t/* invites */\n826\t\tu_long\tis_class;\t/* classes */\n827\t\tu_long\tis_conf;\t/* conf lines */\n828\t\tu_long\tis_confmem;\n829\t\tu_long\tis_conflink;\t/* attached conf lines */\n830\t\tu_long\tis_myclnt;\t/* local clients */\n831\t\tu_long\tis_myserv;\t/* local servers */\n832\t\tu_long\tis_myservice;\t/* local services */\n833\t\tu_long\tis_unknown;\t/* unknown (local) connections */\n834\t\tu_long\tis_wwusers;\t/* users kept for whowas[] */\n835\t\tu_long\tis_wwaways;\t/* aways in users in whowas[] */\n836\t\tu_long\tis_wwawaysmem;\n837\t\tu_long\tis_wwuwas;\t/* uwas links */\n838\t\tu_long\tis_localc;\t/* local items (serv+service+client+..) */\n839\t\tu_long\tis_remc;\t/* remote clients */\n840\t\tu_long\tis_users;\t/* user structs */\n841\t\tu_long\tis_useri;\t/* user invites */\n842\t\tu_long\tis_userc;\t/* user links to channels */\n843\t\tu_long\tis_auth;\t/* OTHER ident reply block */\n844\t\tu_long\tis_authmem;\n845\t\tu_int\tis_dbuf;\t/* number of dbuf allocated (originally) */\n846\t\tu_int\tis_dbufnow;\t/* number of dbuf allocated */\n847\t\tu_int\tis_dbufuse;\t/* number of dbuf in use */\n848\t\tu_int\tis_dbufmin;\t/* min number of dbuf in use */\n849\t\tu_int\tis_dbufmax;\t/* max number of dbuf in use */\n850\t\tu_int\tis_dbufmore;\t/* how many times we increased the bufferpool*/\n851\t\tu_long\tis_m_users;\t/* maximum users connected */\n852\t\ttime_t\tis_m_users_t;\t/* timestamp of last maximum users */\n853\t\tu_long\tis_m_serv;\t/* maximum servers connected */\n854\t\tu_long\tis_m_service;\t/* maximum services connected */\n855\t\tu_long\tis_m_myclnt;\t/* maximum local clients */\n856\t\ttime_t\tis_m_myclnt_t;\t/* timestamp of last maximum local clients */\n857\t\tu_long\tis_m_myserv;\t/* maximum local servers */\n858\t\tu_long\tis_m_myservice;\t/* maximum local services */\n859\t\tu_long\tis_l_myclnt;\t/* last local user count */\n860\t\ttime_t\tis_l_myclnt_t;\t/* timestamp for last count */\n861\t#ifdef DELAY_CLOSE\n862\t\tu_long\tis_delayclose;\t/* number of fds that got delayed close() */\n863\t\tu_int\tis_delayclosewait;\t/* number of fds that wait for delayed close() */\n864\t#endif\n865\t} istat_t;\n866\t\n867\t/* String manipulation macros */\n868\t\n869\t/* strncopynt --> strncpyzt to avoid confusion, sematics changed\n870\t   N must be now the number of bytes in the array --msa */\n871\t#define\tstrncpyzt(x, y, N) do{(void)strncpy(x,y,N);x[N-1]='\\0';}while(0)\n872\t#define\tStrEq(x,y)\t(!strcmp((x),(y)))\n873\t\n874\t/* used in SetMode() in channel.c and m_umode() in s_msg.c */\n875\t\n876\t#define\tMODE_NULL      0\n877\t#define\tMODE_ADD       0x40000000\n878\t#define\tMODE_DEL       0x20000000\n879\t\n880\t/* return values for hunt_server() */\n881\t\n882\t#define\tHUNTED_NOSUCH\t(-1)\t/* if the hunted server is not found */\n883\t#define\tHUNTED_ISME\t0\t/* if this server should execute the command */\n884\t#define\tHUNTED_PASS\t1\t/* if message passed onwards successfully */\n885\t\n886\t/* used when sending to $#mask or $$mask */\n887\t\n888\t#define\tMATCH_SERVER\t1\n889\t#define\tMATCH_HOST\t2\n890\t\n891\t/* used for sendto_serv */\n892\t\n893\t#define\tSV_OLD\t\t0x0000\n894\t#define SV_UID\t\t0x0001\n895\t#define\tSV_2_11\t\tSV_UID\n896\t\n897\t/* used for sendto_flag */\n898\t\n899\ttypedef\tstruct\t{\n900\t\tint\tsvc_chan;\n901\t\tchar\t*svc_chname;\n902\t\tstruct\tChannel\t*svc_ptr;\n903\t\tint\tfd;\n904\t}\tSChan;\n905\t\n906\ttypedef enum ServerChannels {\n907\t\tSCH_ERROR,\n908\t\tSCH_NOTICE,\n909\t\tSCH_KILL,\n910\t\tSCH_CHAN,\n911\t\tSCH_NUM,\n912\t\tSCH_SERVER,\n913\t\tSCH_HASH,\n914\t\tSCH_LOCAL,\n915\t\tSCH_SERVICE,\n916\t\tSCH_DEBUG,\n917\t\tSCH_AUTH,\n918\t\tSCH_SAVE,\n919\t\tSCH_WALLOP,\n920\t#ifdef CLIENTS_CHANNEL\n921\t\tSCH_CLIENT,\n922\t#endif\n923\t\tSCH_OPER,\n924\t\tSCH_MAX\t\n925\t} ServerChannels;\n926\t\n927\t/* used for async dns values */\n928\t\n929\t#define\tASYNC_NONE\t(-1)\n930\t#define\tASYNC_CLIENT\t0\n931\t#define\tASYNC_CONNECT\t1\n932\t#define\tASYNC_CONF\t2\n933\t#define\tASYNC_SERVER\t3\n934\t\n935\t/* Client exit codes for log file */\n936\t#define EXITC_UNDEF\t'-'\t/* unregistered client */\n937\t#define EXITC_REG\t'0'\t/* normal exit */\n938\t#define EXITC_AUTHFAIL\t'A'\t/* Authentication failure (iauth problem) */\n939\t#define EXITC_AUTHTOUT\t'a'\t/* Authentication time out */\n940\t#define EXITC_CLONE\t'C'\t/* CLONE_CHECK */\n941\t#define EXITC_DIE\t'd'\t/* server died */\n942\t#define EXITC_DEAD\t'D'\t/* socket died */\n943\t#define EXITC_ERROR\t'E'\t/* socket error */\n944\t#define EXITC_FLOOD\t'F'\t/* client flooding */\n945\t#define EXITC_FAILURE\t'f'\t/* connect failure */\n946\t#define EXITC_GHMAX\t'G'\t/* global clients per host max limit */\n947\t#define EXITC_GUHMAX\t'g'\t/* global clients per user@host max limit */\n948\t#define EXITC_NOILINE\t'I'\t/* No matching I:line */\n949\t#define EXITC_KLINE\t'k'\t/* K-lined */\n950\t#define EXITC_KILL\t'K'\t/* KILLed */\n951\t#define EXITC_LHMAX\t'L'\t/* local clients per host max limit */\n952\t#define EXITC_LUHMAX\t'l'\t/* local clients per user@host max limit */\n953\t#define EXITC_MBUF\t'M'\t/* mem alloc error */\n954\t#define EXITC_PING\t'P'\t/* ping timeout */\n955\t#define EXITC_BADPASS\t'p'\t/* bad password */\n956\t#define EXITC_SENDQ\t'Q'\t/* send queue exceeded */\n957\t#define EXITC_REF\t'R'\t/* Refused */\n958\t#ifdef TKLINE\n959\t#define EXITC_TKLINE\t't'\t/* tkline */\n960\t#endif\n961\t#define EXITC_AREF\t'U'\t/* Unauthorized by iauth */\n962\t#define EXITC_AREFQ\t'u'\t/* Unauthorized by iauth, be quiet */\n963\t#define EXITC_VIRUS\t'v'\t/* joined a channel used by PrettyPark virus */\n964\t#ifdef XLINE\n965\t#define EXITC_XLINE\t'X'\t/* Forbidden GECOS */\n966\t#endif\n967\t#define EXITC_YLINEMAX\t'Y'\t/* Y:line max clients limit */\n968\t\n969\t/* eXternal authentication slave OPTions */\n970\t#define\tXOPT_REQUIRED\t0x01\t/* require authentication be done by iauth */\n971\t#define\tXOPT_NOTIMEOUT\t0x02\t/* disallow iauth time outs */\n972\t#define XOPT_EXTWAIT\t0x10\t/* extend registration ping timeout */\n973\t#define XOPT_EARLYPARSE\t0x20\t/* allow early parsing and send USER/PASS\n974\t\t\t\t\t   information to iauth */\n975\t\n976\t/* misc defines */\n977\t\n978\t#define\tFLUSH_BUFFER\t-2\n979\t#define\tUTMP\t\t\"/etc/utmp\"\n980\t#define\tCOMMA\t\t\",\"\n981\t\n982\t#define\tSAP\tstruct SOCKADDR *\n983\t\n984\t/* safety checks */\n985\t#if ! (UIDLEN <= NICKLEN)\n986\t#   error UIDLEN must not be bigger than NICKLEN\n987\t#endif\n988\t#if ! (UIDLEN > SIDLEN)\n989\t#   error UIDLEN must be bigger than SIDLEN\n990\t#endif\n991\t#if (NICKLEN < LOCALNICKLEN)\n992\t#   error LOCALNICKLEN must not be bigger than NICKLEN\n993\t#endif\n994\t\n995\t/* WHO parameter flags */\n996\t#define WHO_FLAG_OPERS_ONLY\t0x0001\n997\t#define WHO_FLAG_CHANNEL\t0x0002\n998\t#define WHO_FLAG_HOP\t\t0x0004\n999\t#define WHO_FLAG_FLAGS\t\t0x0008\n1000\t#define WHO_FLAG_HOST\t\t0x0010\n1001\t#define WHO_FLAG_IP\t\t\t0x0020\n1002\t#define WHO_FLAG_IDLE\t\t0x0040\n1003\t#define WHO_FLAG_NICK\t\t0x0080\n1004\t#define WHO_FLAG_INFO\t\t0x0100\n1005\t#define WHO_FLAG_SERVER\t\t0x0200\n1006\t#define WHO_FLAG_TOKEN\t\t0x0400\n1007\t#define WHO_FLAG_USER\t\t0x0800\n1008\t#define WHO_FLAG_ACCOUNT\t0x1000\n1009\t#define WHO_FLAG_OP_LEVEL\t0x2000\n1010\t#define WHO_FLAG_SID\t\t0x4000\n1011\t#define WHO_FLAG_UID\t\t0x8000\n1012\t\n1013\tstruct who_opts\n1014\t{\n1015\t\tint flags;\n1016\t\tconst char *token;\n1017\t};\n1018\t\n1019\t/*\n1020\t * base for channel IDs and UIDs\n1021\t */\n1022\t#define CHIDNB 36\n1023\t\n1024\t\n1025\t/* Defines used for SET command */\n1026\t#define TSET_ACONNECT 0x001\n1027\t#define TSET_POOLSIZE 0x002\n1028\t#define TSET_CACCEPT 0x004\n1029\t#define TSET_SHOWALL (int) ~0\n1030\t\n1031\t/* Runtime configuration structure */\n1032\ttypedef struct\n1033\t{\n1034\t\tint aconnect;\t/* 0 - OFF 1 - ON */\n1035\t\t/* standalone splitmode is -1 not 3 */\n1036\t\tint split;\t/* -1: standalone, 0: no, >0 yes (and since when) */\n1037\t\tint split_minservers;\n1038\t\tint split_minusers;\n1039\t\tint caccept;\t/* 0 - OFF 1 - ON 2 - SPLIT */\n1040\t} iconf_t;\n1041\t\n1042\t/* O:line flags, used also in is_allowed() */\n1043\t#define ACL_LOCOP\t\t0x00001\n1044\t#define ACL_KILLLOCAL\t\t0x00002\n1045\t#define ACL_KILLREMOTE\t\t0x00004\n1046\t#define ACL_KILL\t\t(ACL_KILLLOCAL|ACL_KILLREMOTE)\n1047\t#define ACL_SQUITLOCAL\t\t0x00008\n1048\t#define ACL_SQUITREMOTE\t\t0x00010\n1049\t#define ACL_SQUIT\t\t(ACL_SQUITLOCAL|ACL_SQUITREMOTE)\n1050\t#define ACL_CONNECTLOCAL\t0x00020\n1051\t#define ACL_CONNECTREMOTE\t0x00040\n1052\t#define ACL_CONNECT\t\t(ACL_CONNECTLOCAL|ACL_CONNECTREMOTE)\n1053\t#define ACL_CLOSE\t\t0x00080\n1054\t#define ACL_HAZH\t\t0x00100\n1055\t#define ACL_DNS\t\t\t0x00200\n1056\t#define ACL_REHASH\t\t0x00400\n1057\t#define ACL_RESTART\t\t0x00800\n1058\t#define ACL_DIE\t\t\t0x01000\n1059\t#define ACL_SET\t\t\t0x02000\n1060\t#define ACL_TKLINE\t\t0x04000\n1061\t#define ACL_UNTKLINE\t\tACL_TKLINE\n1062\t#define ACL_CLIENTS\t\t0x08000\n1063\t#define ACL_CANFLOOD\t\t0x10000\n1064\t#define ACL_NOPENALTY\t\t0x20000\n1065\t#define ACL_TRACE\t\t0x40000\n1066\t#define ACL_KLINE\t\t0x80000\n1067\t#define ACL_SIDTRACE\t\t0x100000\n1068\t\n1069\t#define ACL_ALL_REMOTE\t\t(ACL_KILLREMOTE|ACL_SQUITREMOTE|ACL_CONNECTREMOTE)\n1070\t#define ACL_ALL\t\t\t0x1FFFFF\n1071\t\n1072\t#ifdef CLIENTS_CHANNEL\n1073\t/* information scope of &CLIENTS channel. */\n1074\t#define CCL_CONN     0x01\t/* connections */\n1075\t#define CCL_CONNINFO 0x02\t/* if connections, then with realname */\n1076\t#define CCL_QUIT     0x04\t/* quits */\n1077\t#define CCL_QUITINFO 0x08\t/* if quits, then with quit message */\n1078\t#define CCL_NICK     0x10\t/* nick changes */\n1079\t#endif\n1080\t\n1081\t"}]},"uuid":"3919fc72-89ee-42cd-a899-9835c87d8eef","timestamp":"2026-06-03T04:02:30.897Z","sourceToolAssistantUUID":"8e306a1e-4fe1-4668-a4f3-ef431a6b8de3","userType":"external","entrypoint":"cli","cwd":"/home/xe/code/xeiaso.net/ircd.rs","sessionId":"6a99d21a-e41e-4a2c-9a95-861f1388f253","version":"2.1.161","gitBranch":"master","slug":"please-write-a-detailed-silly-avalanche"}
.claude/sessions/6a99d21a-e41e-4a2c-9a95-861f1388f253/subagents/agent-a517c0b37ebba1c08.jsonl:25:{"parentUuid":"d462ff91-9a52-4045-ba25-1cdd38834ca8","isSidechain":true,"promptId":"64d42066-aea2-4684-8374-6a75716e1c80","agentId":"a517c0b37ebba1c08","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01XytTkin9EZaNiPKgXna314","type":"tool_result","content":"1\t/************************************************************************\n2\t *   IRC - Internet Relay Chat, common/struct_def.h\n3\t *   Copyright (C) 1990 Jarkko Oikarinen and\n4\t *                      University of Oulu, Computing Center\n5\t *\n6\t *   This program is free software; you can redistribute it and/or modify\n7\t *   it under the terms of the GNU General Public License as published by\n8\t *   the Free Software Foundation; either version 1, or (at your option)\n9\t *   any later version.\n10\t *\n11\t *   This program is distributed in the hope that it will be useful,\n12\t *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n13\t *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n14\t *   GNU General Public License for more details.\n15\t *\n16\t *   You should have received a copy of the GNU General Public License\n17\t *   along with this program; if not, write to the Free Software\n18\t *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n19\t *\n20\t *   $Id: struct_def.h,v 1.152 2011/01/20 14:26:56 bif Exp $\n21\t */\n22\t\n23\ttypedef\tstruct\tConfItem aConfItem;\n24\ttypedef\tstruct\tListItem aListItem;\n25\ttypedef\tstruct \tClient\taClient;\n26\ttypedef\tstruct\tChannel\taChannel;\n27\ttypedef\tstruct\tUser\tanUser;\n28\ttypedef\tstruct\tServer\taServer;\n29\ttypedef\tstruct\tService\taService;\n30\ttypedef\tstruct\tSLink\tLink;\n31\ttypedef\tstruct\tinvSLink\tinvLink;\n32\ttypedef\tstruct\tSMode\tMode;\n33\ttypedef\tstruct\tfdarray\tFdAry;\n34\ttypedef\tstruct\tCPing\taCPing;\n35\ttypedef\tstruct\tZdata\taZdata;\n36\ttypedef struct        LineItem aMotd;\n37\t#if defined(USE_IAUTH)\n38\ttypedef struct        LineItem aExtCf;\n39\ttypedef struct        LineItem aExtData;\n40\t#endif\n41\t\n42\t#define\tHOSTLEN\t\t63\t/* Length of hostname.  Updated to         */\n43\t\t\t\t\t/* comply with RFC1123                     */\n44\t\n45\t#if (INET6_ADDRSTRLEN > HOSTLEN)\n46\t#error HOSTLEN must not be smaller than INET6_ADDRSTRLEN\n47\t#endif\n48\t\n49\t#define\tNICKLEN\t\t15\t/* Must be the same network-wide. */\n50\t#define UIDLEN\t\t9\t/* must not be bigger than NICKLEN --Beeth */\n51\t#define\tUSERLEN\t\t10\n52\t#define\tREALLEN\t \t50\n53\t#define\tTOPICLEN\t255\n54\t#define\tCHANNELLEN\t50\n55\t#define\tPASSWDLEN \t20\n56\t#define\tKEYLEN\t\t23\n57\t#define\tBUFSIZE\t\t512\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n58\t#define\tMAXRECIPIENTS \t20\n59\t#define\tMAXBANS\t\t64\n60\t#define\tMAXBANLENGTH\t2048\n61\t#define\tBANLEN\t\t(USERLEN + NICKLEN + HOSTLEN + 3)\n62\t#define MAXPENALTY\t10\n63\t#define\tCHIDLEN\t\t5\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n64\t#define\tSIDLEN\t\t4\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n65\t#define\tMAXMODEPARAMS\t3\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n66\t#define\tDELAYCHASETIMELIMIT\t1800\t/* WARNING: *DONT* CHANGE THIS!!!! */\n67\t#define\tLDELAYCHASETIMELIMIT\t5400\t/* WARNING: *DONT* CHANGE THIS!!!! */\n68\t\n69\t#define\tREADBUF_SIZE\t16384\t/* used in s_bsd.c *AND* s_zip.c ! */\n70\t \n71\t/*\n72\t * Make up some numbers which should reflect average leaf server connect\n73\t * queue max size.\n74\t * queue=(<# of channels> * <channel size> + <user size> * <# of users>) * 2\n75\t * pool=<queue per client> * <avg. # of clients having data in queue>\n76\t */\n77\t#define\tQUEUELEN\t(((MAXCONNECTIONS / 10) * (CHANNELLEN + BANLEN + 16) +\\\n78\t\t\t\t  (HOSTLEN * 4 + REALLEN + NICKLEN + USERLEN + 24) *\\\n79\t\t\t\t  (MAXCONNECTIONS / 2)) * 2)\n80\t\n81\t#define\tBUFFERPOOL\t(DBUFSIZ * MAXCONNECTIONS * 2) + \\\n82\t\t\t\t(QUEUELEN * MAXSERVERS)\n83\t\n84\t#define\tUSERHOST_REPLYLEN\t(NICKLEN+HOSTLEN+USERLEN+5)\n85\t\n86\t/*\n87\t** 'offsetof' is defined in ANSI-C. The following definition\n88\t** is not absolutely portable (I have been told), but so far\n89\t** it has worked on all machines I have needed it. The type\n90\t** should be size_t but...  --msa\n91\t*/\n92\t#ifndef offsetof\n93\t#define\toffsetof(t,m) (int)((&((t *)0L)->m))\n94\t#endif\n95\t\n96\t#define\telementsof(x) (sizeof(x)/sizeof(x[0]))\n97\t\n98\t/*\n99\t** flags for bootup options (command line flags)\n100\t*/\n101\t#define\tBOOT_CONSOLE\t0x001\n102\t#define\tBOOT_QUICK\t0x002\n103\t#define\tBOOT_DEBUG\t0x004\n104\t#define\tBOOT_INETD\t0x008\n105\t#define\tBOOT_TTY\t0x010\n106\t\n107\t#define\tBOOT_AUTODIE\t0x040\n108\t#define\tBOOT_BADTUNE\t0x080\n109\t#define\tBOOT_PROT\t0x100\n110\t#define\tBOOT_STRICTPROT\t0x200\n111\t#define\tBOOT_NOIAUTH\t0x400\n112\t#define\tBOOT_STANDALONE\t0x800\n113\t\n114\ttypedef enum Status {\n115\t\tSTAT_CONNECTING = -4,\n116\t\tSTAT_HANDSHAKE, /* -3 */\n117\t\tSTAT_UNKNOWN,\t/* -2 */\n118\t\tSTAT_ME,\t/* -1 */\n119\t\tSTAT_SERVER,\t/* 0 */\n120\t\tSTAT_CLIENT,\t/* 1 */\n121\t\tSTAT_OPER,\t/* 2 */\n122\t\tSTAT_SERVICE,\t/* 3 */\n123\t\tSTAT_UNREG,\t/* 4 */\n124\t\tSTAT_MAX\t/* 5 -- size of handler[] table we need */\n125\t} Status;\n126\t\n127\t/*\n128\t * status macros.\n129\t */\n130\t#define\tIsRegisteredUser(x)\t(((x)->status == STAT_CLIENT || \\\n131\t\t\t\t\t (x)->status == STAT_OPER) && (x)->user)\n132\t#define\tIsRegistered(x)\t\t((x)->status >= STAT_SERVER || \\\n133\t\t\t\t\t (x)->status == STAT_ME)\n134\t#define\tIsConnecting(x)\t\t((x)->status == STAT_CONNECTING)\n135\t#define\tIsHandshake(x)\t\t((x)->status == STAT_HANDSHAKE)\n136\t#define\tIsMe(x)\t\t\t((x)->status == STAT_ME)\n137\t#define\tIsUnknown(x)\t\t((x)->status == STAT_UNKNOWN)\n138\t#define\tIsServer(x)\t\t((x)->status == STAT_SERVER)\n139\t#define\tIsClient(x)\t\t((x)->status == STAT_CLIENT || \\\n140\t\t\t\t\t (x)->status == STAT_OPER)\n141\t#define\tIsService(x)\t\t((x)->status == STAT_SERVICE && (x)->service)\n142\t\n143\t#define\tSetConnecting(x)\t((x)->status = STAT_CONNECTING)\n144\t#define\tSetHandshake(x)\t\t((x)->status = STAT_HANDSHAKE)\n145\t#define\tSetMe(x)\t\t((x)->status = STAT_ME)\n146\t#define\tSetUnknown(x)\t\t((x)->status = STAT_UNKNOWN)\n147\t#define\tSetServer(x)\t\t((x)->status = STAT_SERVER)\n148\t#define\tSetClient(x)\t\t((x)->status = IsAnOper((x)) ? STAT_OPER : STAT_CLIENT)\n149\t#define\tSetService(x)\t\t((x)->status = STAT_SERVICE)\n150\t\n151\t#define\tFLAGS_PINGSENT\t0x0000001 /* Unreplied ping sent */\n152\t#define\tFLAGS_DEADSOCK\t0x0000002 /* Local socket is dead--Exiting soon */\n153\t#define\tFLAGS_KILLED\t0x0000004 /* Prevents \"QUIT\" from being sent for this */\n154\t#define\tFLAGS_BLOCKED\t0x0000008 /* socket is in blocked condition [unused] */\n155\t#ifdef UNIXPORT\n156\t#define\tFLAGS_UNIX\t0x0000010 /* socket is in the unix domain, not inet */\n157\t#endif\n158\t#define\tFLAGS_CLOSING\t0x0000020 /* set when closing to suppress errors */\n159\t#define\tFLAGS_LISTEN\t0x0000040 /* used to mark clients which we listen() on */\n160\t#define\tFLAGS_XAUTHDONE\t0x0000080 /* iauth is finished with this client */\n161\t#define\tFLAGS_DOINGDNS\t0x0000100 /* client is waiting for a DNS response */\n162\t#define\tFLAGS_AUTH\t0x0000200 /* client is waiting on rfc931 response */\n163\t#define\tFLAGS_WRAUTH\t0x0000400 /* set if we havent writen to ident server */\n164\t#define\tFLAGS_LOCAL\t0x0000800 /* set for local clients */\n165\t#define\tFLAGS_GOTID\t0x0001000 /* successful ident lookup achieved */\n166\t#define\tFLAGS_XAUTH\t0x0002000 /* waiting on external authentication */\n167\t#define\tFLAGS_WXAUTH\t0x0004000 /* same as above, but also prevent parsing */\n168\t#define\tFLAGS_NONL\t0x0008000 /* No \\n in buffer */\n169\t#define\tFLAGS_CBURST\t0x0010000 /* set to mark connection burst being sent */\n170\t#define\tFLAGS_QUIT\t0x0040000 /* QUIT :comment shows it's not a split */\n171\t#define\tFLAGS_SPLIT\t0x0080000 /* client QUITting because of a netsplit */\n172\t#define\tFLAGS_HIDDEN\t0x0100000 /* netsplit is behind a hostmask,\n173\t\t\t\t\t     also used for marking clients in who_find\n174\t\t\t\t\t   */\n175\t#define\tFLAGS_UNKCMD\t0x0200000 /* has sent an unknown command */\n176\t#define\tFLAGS_ZIP\t0x0400000 /* link is zipped */\n177\t#define\tFLAGS_ZIPRQ\t0x0800000 /* zip requested */\n178\t#define\tFLAGS_ZIPSTART\t0x1000000 /* start of zip (ignore any CRLF) */\n179\t#define\tFLAGS_SQUIT\t0x2000000 /* This is set when we send the last\n180\t\t\t\t\t  ** server, so we know we have to send\n181\t\t\t\t\t  ** a SQUIT. */\n182\t#define\tFLAGS_EOB\t0x4000000 /* EOB received */\n183\t#define FLAGS_LISTENINACTIVE 0x8000000 /* Listener does not listen() */\n184\t#ifdef JAPANESE\n185\t#define\tFLAGS_JP\t0x10000000 /* jp version, used both for chans and servs */\n186\t#endif\n187\t\t\n188\t#define\tFLAGS_OPER\t0x0001 /* operator */\n189\t#define\tFLAGS_LOCOP\t0x0002 /* local operator -- SRB */\n190\t#define\tFLAGS_WALLOP\t0x0004 /* send wallops to them */\n191\t#define\tFLAGS_INVISIBLE\t0x0008 /* makes user invisible */\n192\t#define FLAGS_RESTRICT\t0x0010 /* restricted user */\n193\t#define FLAGS_AWAY\t0x0020 /* user is away */\n194\t#define FLAGS_EXEMPT    0x0040 /* user is exempted from k-lines */\n195\t#ifdef XLINE\n196\t#define FLAGS_XLINED\t0x0100\t/* X-lined client */\n197\t#endif\n198\t#define FLAGS_TLS       0x0200 /* user is on a secure connection port (SSL/TLS) -- mh 2020-04-27 */\n199\t#define\tSEND_UMODES\t(FLAGS_INVISIBLE|FLAGS_OPER|FLAGS_WALLOP|FLAGS_AWAY|FLAGS_RESTRICT)\n200\t#define\tALL_UMODES\t(SEND_UMODES|FLAGS_LOCOP)"}]},"uuid":"b07b966f-7d39-42e1-968f-8b09c1fdae3f","timestamp":"2026-06-03T04:02:45.229Z","sourceToolAssistantUUID":"d462ff91-9a52-4045-ba25-1cdd38834ca8","userType":"external","entrypoint":"cli","cwd":"/home/xe/code/xeiaso.net/ircd.rs","sessionId":"6a99d21a-e41e-4a2c-9a95-861f1388f253","version":"2.1.161","gitBranch":"master","slug":"please-write-a-detailed-silly-avalanche"}
.claude/sessions/ba5566ad-6136-4ebe-b017-225d121463c3/subagents/agent-a37e297110885b941.jsonl:22:{"parentUuid":"e06bbb27-6ef2-471c-b73a-a5148a5d1f46","isSidechain":true,"promptId":"446dac18-e7b4-4408-b565-c2c9af5850c5","agentId":"a37e297110885b941","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01HqZf2LsZe3DdaDzFNPFu5w","type":"tool_result","content":"/home/xe/code/xeiaso.net/ircd.rs/common/class_def.h:20:#ifdef ENABLE_CIDR_LIMITS\n/home/xe/code/xeiaso.net/ircd.rs/common/class_def.h:36:#ifdef ENABLE_CIDR_LIMITS\n/home/xe/code/xeiaso.net/ircd.rs/common/class_def.h:67:#ifdef ENABLE_CIDR_LIMITS\n/home/xe/code/xeiaso.net/ircd.rs/common/support_ext.h:66:#if defined(DEBUGMODE) && !defined(CLIENT_COMPILE) && defined(DO_DEBUG_MALLOC)\n/home/xe/code/xeiaso.net/ircd.rs/common/support_ext.h:70:#else /* DEBUGMODE && !CLIENT_COMPILE && !DO_DEBUG_MALLOC */\n/home/xe/code/xeiaso.net/ircd.rs/common/support_ext.h:73:#endif /* DEBUGMODE && !CLIENT_COMPILE && !DO_DEBUG_MALLOC */\n/home/xe/code/xeiaso.net/ircd.rs/common/common_def.h:74:# define DO_DEBUG_MALLOC\n/home/xe/code/xeiaso.net/ircd.rs/common/common_def.h:81:#undef\tZIP_LINKS\n/home/xe/code/xeiaso.net/ircd.rs/common/struct_def.h:37:#if defined(USE_IAUTH)\n/home/xe/code/xeiaso.net/ircd.rs/common/struct_def.h:195:#ifdef XLINE\n/home/xe/code/xeiaso.net/ircd.rs/common/struct_def.h:196:#define FLAGS_XLINED\t0x0100\t/* X-lined client */\n/home/xe/code/xeiaso.net/ircd.rs/common/struct_def.h:262:#ifdef XLINE\n/home/xe/code/xeiaso.net/ircd.rs/common/struct_def.h:263:#define IsXlined(x)\t\t((x)->user && (x)->user->flags & FLAGS_XLINED)\n/home/xe/code/xeiaso.net/ircd.rs/common/struct_def.h:264:#define SetXlined(x)\t\t((x)->user->flags |= FLAGS_XLINED)\n/home/xe/code/xeiaso.net/ircd.rs/common/struct_def.h:265:#define ClearXlined(x)\t\t((x)->user->flags &= ~FLAGS_XLINED)\n/home/xe/code/xeiaso.net/ircd.rs/common/struct_def.h:313:#ifdef XLINE\n/home/xe/code/xeiaso.net/ircd.rs/common/struct_def.h:361:#ifdef XLINE\n/home/xe/code/xeiaso.net/ircd.rs/common/struct_def.h:362:#define CONF_XLINE\t\t0x800000\n/home/xe/code/xeiaso.net/ircd.rs/common/struct_def.h:377:#ifdef XLINE\n/home/xe/code/xeiaso.net/ircd.rs/common/struct_def.h:388:#ifdef XLINE","is_error":false}]},"uuid":"3bdfaa5d-e4b5-422a-9af2-f7fdb2f2cdc2","timestamp":"2026-06-02T19:21:23.332Z","sourceToolAssistantUUID":"e06bbb27-6ef2-471c-b73a-a5148a5d1f46","userType":"external","entrypoint":"cli","cwd":"/home/xe/code/xeiaso.net/ircd.rs","sessionId":"ba5566ad-6136-4ebe-b017-225d121463c3","version":"2.1.161","gitBranch":"master"}
.claude/sessions/ba5566ad-6136-4ebe-b017-225d121463c3/subagents/agent-a37e297110885b941.jsonl:33:{"parentUuid":"1b1dd57c-957a-4cc5-9464-3e1183ca1aa3","isSidechain":true,"promptId":"446dac18-e7b4-4408-b565-c2c9af5850c5","agentId":"a37e297110885b941","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01MpwpeD7YEN1WEqCPf4tXVF","type":"tool_result","content":"1\t/************************************************************************\n2\t *   IRC - Internet Relay Chat, common/struct_def.h\n3\t *   Copyright (C) 1990 Jarkko Oikarinen and\n4\t *                      University of Oulu, Computing Center\n5\t *\n6\t *   This program is free software; you can redistribute it and/or modify\n7\t *   it under the terms of the GNU General Public License as published by\n8\t *   the Free Software Foundation; either version 1, or (at your option)\n9\t *   any later version.\n10\t *\n11\t *   This program is distributed in the hope that it will be useful,\n12\t *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n13\t *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n14\t *   GNU General Public License for more details.\n15\t *\n16\t *   You should have received a copy of the GNU General Public License\n17\t *   along with this program; if not, write to the Free Software\n18\t *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n19\t *\n20\t *   $Id: struct_def.h,v 1.152 2011/01/20 14:26:56 bif Exp $\n21\t */\n22\t\n23\ttypedef\tstruct\tConfItem aConfItem;\n24\ttypedef\tstruct\tListItem aListItem;\n25\ttypedef\tstruct \tClient\taClient;\n26\ttypedef\tstruct\tChannel\taChannel;\n27\ttypedef\tstruct\tUser\tanUser;\n28\ttypedef\tstruct\tServer\taServer;\n29\ttypedef\tstruct\tService\taService;\n30\ttypedef\tstruct\tSLink\tLink;\n31\ttypedef\tstruct\tinvSLink\tinvLink;\n32\ttypedef\tstruct\tSMode\tMode;\n33\ttypedef\tstruct\tfdarray\tFdAry;\n34\ttypedef\tstruct\tCPing\taCPing;\n35\ttypedef\tstruct\tZdata\taZdata;\n36\ttypedef struct        LineItem aMotd;\n37\t#if defined(USE_IAUTH)\n38\ttypedef struct        LineItem aExtCf;\n39\ttypedef struct        LineItem aExtData;\n40\t#endif\n41\t\n42\t#define\tHOSTLEN\t\t63\t/* Length of hostname.  Updated to         */\n43\t\t\t\t\t/* comply with RFC1123                     */\n44\t\n45\t#if (INET6_ADDRSTRLEN > HOSTLEN)\n46\t#error HOSTLEN must not be smaller than INET6_ADDRSTRLEN\n47\t#endif\n48\t\n49\t#define\tNICKLEN\t\t15\t/* Must be the same network-wide. */\n50\t#define UIDLEN\t\t9\t/* must not be bigger than NICKLEN --Beeth */\n51\t#define\tUSERLEN\t\t10\n52\t#define\tREALLEN\t \t50\n53\t#define\tTOPICLEN\t255\n54\t#define\tCHANNELLEN\t50\n55\t#define\tPASSWDLEN \t20\n56\t#define\tKEYLEN\t\t23\n57\t#define\tBUFSIZE\t\t512\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n58\t#define\tMAXRECIPIENTS \t20\n59\t#define\tMAXBANS\t\t64\n60\t#define\tMAXBANLENGTH\t2048\n61\t#define\tBANLEN\t\t(USERLEN + NICKLEN + HOSTLEN + 3)\n62\t#define MAXPENALTY\t10\n63\t#define\tCHIDLEN\t\t5\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n64\t#define\tSIDLEN\t\t4\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n65\t#define\tMAXMODEPARAMS\t3\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n66\t#define\tDELAYCHASETIMELIMIT\t1800\t/* WARNING: *DONT* CHANGE THIS!!!! */\n67\t#define\tLDELAYCHASETIMELIMIT\t5400\t/* WARNING: *DONT* CHANGE THIS!!!! */\n68\t\n69\t#define\tREADBUF_SIZE\t16384\t/* used in s_bsd.c *AND* s_zip.c ! */\n70\t \n71\t/*\n72\t * Make up some numbers which should reflect average leaf server connect\n73\t * queue max size.\n74\t * queue=(<# of channels> * <channel size> + <user size> * <# of users>) * 2\n75\t * pool=<queue per client> * <avg. # of clients having data in queue>\n76\t */\n77\t#define\tQUEUELEN\t(((MAXCONNECTIONS / 10) * (CHANNELLEN + BANLEN + 16) +\\\n78\t\t\t\t  (HOSTLEN * 4 + REALLEN + NICKLEN + USERLEN + 24) *\\\n79\t\t\t\t  (MAXCONNECTIONS / 2)) * 2)\n80\t\n81\t#define\tBUFFERPOOL\t(DBUFSIZ * MAXCONNECTIONS * 2) + \\\n82\t\t\t\t(QUEUELEN * MAXSERVERS)\n83\t\n84\t#define\tUSERHOST_REPLYLEN\t(NICKLEN+HOSTLEN+USERLEN+5)\n85\t\n86\t/*\n87\t** 'offsetof' is defined in ANSI-C. The following definition\n88\t** is not absolutely portable (I have been told), but so far\n89\t** it has worked on all machines I have needed it. The type\n90\t** should be size_t but...  --msa\n91\t*/\n92\t#ifndef offsetof\n93\t#define\toffsetof(t,m) (int)((&((t *)0L)->m))\n94\t#endif\n95\t\n96\t#define\telementsof(x) (sizeof(x)/sizeof(x[0]))\n97\t\n98\t/*\n99\t** flags for bootup options (command line flags)\n100\t*/\n101\t#define\tBOOT_CONSOLE\t0x001\n102\t#define\tBOOT_QUICK\t0x002\n103\t#define\tBOOT_DEBUG\t0x004\n104\t#define\tBOOT_INETD\t0x008\n105\t#define\tBOOT_TTY\t0x010\n106\t\n107\t#define\tBOOT_AUTODIE\t0x040\n108\t#define\tBOOT_BADTUNE\t0x080\n109\t#define\tBOOT_PROT\t0x100\n110\t#define\tBOOT_STRICTPROT\t0x200\n111\t#define\tBOOT_NOIAUTH\t0x400\n112\t#define\tBOOT_STANDALONE\t0x800\n113\t\n114\ttypedef enum Status {\n115\t\tSTAT_CONNECTING = -4,\n116\t\tSTAT_HANDSHAKE, /* -3 */\n117\t\tSTAT_UNKNOWN,\t/* -2 */\n118\t\tSTAT_ME,\t/* -1 */\n119\t\tSTAT_SERVER,\t/* 0 */\n120\t\tSTAT_CLIENT,\t/* 1 */\n121\t\tSTAT_OPER,\t/* 2 */\n122\t\tSTAT_SERVICE,\t/* 3 */\n123\t\tSTAT_UNREG,\t/* 4 */\n124\t\tSTAT_MAX\t/* 5 -- size of handler[] table we need */\n125\t} Status;\n126\t\n127\t/*\n128\t * status macros.\n129\t */\n130\t#define\tIsRegisteredUser(x)\t(((x)->status == STAT_CLIENT || \\\n131\t\t\t\t\t (x)->status == STAT_OPER) && (x)->user)\n132\t#define\tIsRegistered(x)\t\t((x)->status >= STAT_SERVER || \\\n133\t\t\t\t\t (x)->status == STAT_ME)\n134\t#define\tIsConnecting(x)\t\t((x)->status == STAT_CONNECTING)\n135\t#define\tIsHandshake(x)\t\t((x)->status == STAT_HANDSHAKE)\n136\t#define\tIsMe(x)\t\t\t((x)->status == STAT_ME)\n137\t#define\tIsUnknown(x)\t\t((x)->status == STAT_UNKNOWN)\n138\t#define\tIsServer(x)\t\t((x)->status == STAT_SERVER)\n139\t#define\tIsClient(x)\t\t((x)->status == STAT_CLIENT || \\\n140\t\t\t\t\t (x)->status == STAT_OPER)\n141\t#define\tIsService(x)\t\t((x)->status == STAT_SERVICE && (x)->service)\n142\t\n143\t#define\tSetConnecting(x)\t((x)->status = STAT_CONNECTING)\n144\t#define\tSetHandshake(x)\t\t((x)->status = STAT_HANDSHAKE)\n145\t#define\tSetMe(x)\t\t((x)->status = STAT_ME)\n146\t#define\tSetUnknown(x)\t\t((x)->status = STAT_UNKNOWN)\n147\t#define\tSetServer(x)\t\t((x)->status = STAT_SERVER)\n148\t#define\tSetClient(x)\t\t((x)->status = IsAnOper((x)) ? STAT_OPER : STAT_CLIENT)\n149\t#define\tSetService(x)\t\t((x)->status = STAT_SERVICE)\n150\t\n151\t#define\tFLAGS_PINGSENT\t0x0000001 /* Unreplied ping sent */\n152\t#define\tFLAGS_DEADSOCK\t0x0000002 /* Local socket is dead--Exiting soon */\n153\t#define\tFLAGS_KILLED\t0x0000004 /* Prevents \"QUIT\" from being sent for this */\n154\t#define\tFLAGS_BLOCKED\t0x0000008 /* socket is in blocked condition [unused] */\n155\t#ifdef UNIXPORT\n156\t#define\tFLAGS_UNIX\t0x0000010 /* socket is in the unix domain, not inet */\n157\t#endif\n158\t#define\tFLAGS_CLOSING\t0x0000020 /* set when closing to suppress errors */\n159\t#define\tFLAGS_LISTEN\t0x0000040 /* used to mark clients which we listen() on */\n160\t#define\tFLAGS_XAUTHDONE\t0x0000080 /* iauth is finished with this client */\n161\t#define\tFLAGS_DOINGDNS\t0x0000100 /* client is waiting for a DNS response */\n162\t#define\tFLAGS_AUTH\t0x0000200 /* client is waiting on rfc931 response */\n163\t#define\tFLAGS_WRAUTH\t0x0000400 /* set if we havent writen to ident server */\n164\t#define\tFLAGS_LOCAL\t0x0000800 /* set for local clients */\n165\t#define\tFLAGS_GOTID\t0x0001000 /* successful ident lookup achieved */\n166\t#define\tFLAGS_XAUTH\t0x0002000 /* waiting on external authentication */\n167\t#define\tFLAGS_WXAUTH\t0x0004000 /* same as above, but also prevent parsing */\n168\t#define\tFLAGS_NONL\t0x0008000 /* No \\n in buffer */\n169\t#define\tFLAGS_CBURST\t0x0010000 /* set to mark connection burst being sent */\n170\t#define\tFLAGS_QUIT\t0x0040000 /* QUIT :comment shows it's not a split */\n171\t#define\tFLAGS_SPLIT\t0x0080000 /* client QUITting because of a netsplit */\n172\t#define\tFLAGS_HIDDEN\t0x0100000 /* netsplit is behind a hostmask,\n173\t\t\t\t\t     also used for marking clients in who_find\n174\t\t\t\t\t   */\n175\t#define\tFLAGS_UNKCMD\t0x0200000 /* has sent an unknown command */\n176\t#define\tFLAGS_ZIP\t0x0400000 /* link is zipped */\n177\t#define\tFLAGS_ZIPRQ\t0x0800000 /* zip requested */\n178\t#define\tFLAGS_ZIPSTART\t0x1000000 /* start of zip (ignore any CRLF) */\n179\t#define\tFLAGS_SQUIT\t0x2000000 /* This is set when we send the last\n180\t\t\t\t\t  ** server, so we know we have to send\n181\t\t\t\t\t  ** a SQUIT. */\n182\t#define\tFLAGS_EOB\t0x4000000 /* EOB received */\n183\t#define FLAGS_LISTENINACTIVE 0x8000000 /* Listener does not listen() */\n184\t#ifdef JAPANESE\n185\t#define\tFLAGS_JP\t0x10000000 /* jp version, used both for chans and servs */\n186\t#endif\n187\t\t\n188\t#define\tFLAGS_OPER\t0x0001 /* operator */\n189\t#define\tFLAGS_LOCOP\t0x0002 /* local operator -- SRB */\n190\t#define\tFLAGS_WALLOP\t0x0004 /* send wallops to them */\n191\t#define\tFLAGS_INVISIBLE\t0x0008 /* makes user invisible */\n192\t#define FLAGS_RESTRICT\t0x0010 /* restricted user */\n193\t#define FLAGS_AWAY\t0x0020 /* user is away */\n194\t#define FLAGS_EXEMPT    0x0040 /* user is exempted from k-lines */\n195\t#ifdef XLINE\n196\t#define FLAGS_XLINED\t0x0100\t/* X-lined client */\n197\t#endif\n198\t#define FLAGS_TLS       0x0200 /* user is on a secure connection port (SSL/TLS) -- mh 2020-04-27 */\n199\t#define\tSEND_UMODES\t(FLAGS_INVISIBLE|FLAGS_OPER|FLAGS_WALLOP|FLAGS_AWAY|FLAGS_RESTRICT)\n200\t#define\tALL_UMODES\t(SEND_UMODES|FLAGS_LOCOP)\n201\t\n202\t/*\n203\t * user flags macros.\n204\t */\n205\t#define\tIsOper(x)\t\t((x)->user && (x)->user->flags & FLAGS_OPER)\n206\t#define\tIsLocOp(x)\t\t((x)->user && (x)->user->flags & FLAGS_LOCOP)\n207\t#define\tIsInvisible(x)\t\t((x)->user->flags & FLAGS_INVISIBLE)\n208\t#define IsRestricted(x)         ((x)->user && \\\n209\t\t\t\t\t (x)->user->flags & FLAGS_RESTRICT)\n210\t#define\tIsAnOper(x)\t\t((x)->user && \\\n211\t\t\t\t\t (x)->user->flags & (FLAGS_OPER|FLAGS_LOCOP))\n212\t#define\tIsPerson(x)\t\t((x)->user && IsClient(x))\n213\t#define\tIsPrivileged(x)\t\t(IsServer(x) || IsAnOper(x))\n214\t#define\tSendWallops(x)\t\t((x)->user->flags & FLAGS_WALLOP)\n215\t#ifdef UNIXPORT\n216\t#define\tIsUnixSocket(x)\t\t((x)->flags & FLAGS_UNIX)\n217\t#endif\n218\t#define\tIsListener(x)\t\t((x)->flags & FLAGS_LISTEN)\n219\t#define IsListenerInactive(x)\t((x)->flags & FLAGS_LISTENINACTIVE)\n220\t#define\tIsLocal(x)\t\t(MyConnect(x) && (x)->flags & FLAGS_LOCAL)\n221\t#define\tIsDead(x)\t\t((x)->flags & FLAGS_DEADSOCK)\n222\t#define\tIsBursting(x)\t\t(!((x)->flags & FLAGS_EOB))\n223\t#define IsKlineExempt(x)        ((x)->user && (x)->user->flags & FLAGS_EXEMPT)\n224\t\n225\t#define\tSetDead(x)\t\t((x)->flags |= FLAGS_DEADSOCK)\n226\t#define\tCBurst(x)\t\t((x)->flags & FLAGS_CBURST)\n227\t#define\tSetOper(x)\t\t((x)->user->flags |= FLAGS_OPER, \\\n228\t\t\t\t\t (x)->status = STAT_OPER)\n229\t#define\tSetLocOp(x)\t\t((x)->user->flags |= FLAGS_LOCOP, \\\n230\t\t\t\t\t (x)->status = STAT_OPER)\n231\t#define\tSetInvisible(x)\t\t((x)->user->flags |= FLAGS_INVISIBLE)\n232\t#define SetRestricted(x)\t((x)->user->flags |= FLAGS_RESTRICT)\n233\t#define\tSetWallops(x)\t\t((x)->user->flags |= FLAGS_WALLOP)\n234\t#ifdef UNIXPORT\n235\t#define\tSetUnixSock(x)\t\t((x)->flags |= FLAGS_UNIX)\n236\t#endif\n237\t#define\tSetDNS(x)\t\t((x)->flags |= FLAGS_DOINGDNS)\n238\t#define\tSetDoneXAuth(x)\t\t((x)->flags |= FLAGS_XAUTHDONE)\n239\t#define\tSetEOB(x)\t\t((x)->flags |= FLAGS_EOB)\n240\t#define SetListenerInactive(x)\t((x)->flags |= FLAGS_LISTENINACTIVE)\n241\t#define SetKlineExempt(x)\t((x)->user->flags |= FLAGS_EXEMPT)\n242\t\n243\t#define\tDoingDNS(x)\t\t((x)->flags & FLAGS_DOINGDNS)\n244\t#define\tDoingAuth(x)\t\t((x)->flags & FLAGS_AUTH)\n245\t#define\tDoingXAuth(x)\t\t((x)->flags & FLAGS_XAUTH)\n246\t#define\tWaitingXAuth(x)\t\t((x)->flags & FLAGS_WXAUTH)\n247\t#define\tDoneXAuth(x)\t\t((x)->flags & FLAGS_XAUTHDONE)\n248\t#define\tNoNewLine(x)\t\t((x)->flags & FLAGS_NONL)\n249\t\n250\t#define\tClearOper(x)\t\t((x)->user->flags &= ~FLAGS_OPER, \\\n251\t\t\t\t\t (x)->status = STAT_CLIENT)\n252\t#define\tClearLocOp(x)\t\t((x)->user->flags &= ~FLAGS_LOCOP, \\\n253\t\t\t\t\t (x)->status = STAT_CLIENT)\n254\t#define\tClearInvisible(x)\t((x)->user->flags &= ~FLAGS_INVISIBLE)\n255\t#define ClearRestricted(x)      ((x)->user->flags &= ~FLAGS_RESTRICT)\n256\t#define\tClearWallops(x)\t\t((x)->user->flags &= ~FLAGS_WALLOP)\n257\t#define\tClearDNS(x)\t\t((x)->flags &= ~FLAGS_DOINGDNS)\n258\t#define\tClearAuth(x)\t\t((x)->flags &= ~FLAGS_AUTH)\n259\t#define\tClearXAuth(x)\t\t((x)->flags &= ~FLAGS_XAUTH)\n260\t#define\tClearWXAuth(x)\t\t((x)->flags &= ~FLAGS_WXAUTH)\n261\t#define ClearListenerInactive(x) ((x)->flags &= ~FLAGS_LISTENINACTIVE)\n262\t#ifdef XLINE\n263\t#define IsXlined(x)\t\t((x)->user && (x)->user->flags & FLAGS_XLINED)\n264\t#define SetXlined(x)\t\t((x)->user->flags |= FLAGS_XLINED)\n265\t#define ClearXlined(x)\t\t((x)->user->flags &= ~FLAGS_XLINED)\n266\t#endif\n267\t#define IsTLS(x)        ((x)->user && (x)->user->flags & FLAGS_TLS)\n268\t#define SetTLS(x)       ((x)->user->flags |= FLAGS_TLS)\n269\t\n270\t/*\n271\t * defined debugging levels\n272\t */\n273\t#define\tDEBUG_FATAL  0\n274\t#define\tDEBUG_ERROR  1\t/* report_error() and other errors that are found */\n275\t#define\tDEBUG_READ   2\n276\t#define\tDEBUG_WRITE  2\n277\t#define\tDEBUG_NOTICE 3\n278\t#define\tDEBUG_DNS    4\t/* used by all DNS related routines - a *lot* */\n279\t#define\tDEBUG_INFO   5\t/* general usful info */\n280\t#define\tDEBUG_NUM    6\t/* numerics */\n281\t#define\tDEBUG_SEND   7\t/* everything that is sent out */\n282\t#define\tDEBUG_DEBUG  8\t/* anything to do with debugging, ie unimportant :) */\n283\t#define\tDEBUG_MALLOC 9\t/* malloc/free calls */\n284\t#define\tDEBUG_LIST  10\t/* debug list use */\n285\t#define\tDEBUG_L10   10\n286\t#define\tDEBUG_L11   11\n287\t\n288\t/*\n289\t * defines for curses in client\n290\t */\n291\t#define\tDUMMY_TERM\t0\n292\t#define\tCURSES_TERM\t1\n293\t#define\tTERMCAP_TERM\t2\n294\t\n295\tstruct\tCPing\t{\n296\t\tu_short\tport;\t\t/* port to send pings to */\n297\t\tu_long\trtt;\t\t/* average RTT */\n298\t\tu_long\tping;\n299\t\tu_long\tseq;\t\t/* # sent still in the \"window\" */\n300\t\tu_long\tlseq;\t\t/* sequence # of last sent */\n301\t\tu_long\trecvd;\t\t/* # received still in the \"window\" */\n302\t\tu_long\tlrecvd;\t\t/* # received */\n303\t};\n304\t\n305\tstruct\tConfItem\t{\n306\t\tu_int\tstatus;\t\t/* If CONF_ILLEGAL, delete when no clients */\n307\t\tint\tclients;\t/* Number of *LOCAL* clients using this */\n308\t\tstruct\tIN_ADDR ipnum;\t/* ip number of host field */\n309\t\tchar\t*host;\n310\t\tchar\t*passwd;\n311\t\tchar\t*name;\n312\t\tchar\t*name2;\n313\t#ifdef XLINE\n314\t\tchar\t*name3;\n315\t#endif\n316\t\tint\tport;\n317\t\tlong\tflags;\t\t/* I-line flags */\n318\t\tint\tpref;\t\t/* preference value */\n319\t\tstruct\tCPing\t*ping;\n320\t\ttime_t\thold;\t/* Hold action until this time (calendar time) */\n321\t\tchar\t*source_ip;\n322\t#ifndef VMSP\n323\t\taClass\t*class;  /* Class of connection */\n324\t#endif\n325\t\tstruct\tConfItem *next;\n326\t};\n327\t\n328\tstruct\tListItem\t{\n329\t\tchar\t*nick;\n330\t\tchar\t*user;\n331\t\tchar\t*host;\n332\t};\n333\t\n334\t/* these define configuration lines (A:, M:, I:, K:, etc.) */\n335\t#define\tCONF_ILLEGAL\t\t0x80000000\n336\t#define\tCONF_MATCH\t\t0x40000000\n337\t#define\tCONF_QUARANTINED_SERVER\t0x000001\n338\t#define\tCONF_CLIENT\t\t0x000002\n339\t\n340\t#define\tCONF_CONNECT_SERVER\t0x000008\n341\t#define\tCONF_NOCONNECT_SERVER\t0x000010\n342\t#define\tCONF_ZCONNECT_SERVER\t0x000020\n343\t\n344\t#define\tCONF_OPERATOR\t\t0x000080\n345\t#define\tCONF_ME\t\t\t0x000100\n346\t#define\tCONF_KILL\t\t0x000200\n347\t#define\tCONF_ADMIN\t\t0x000400\n348\t#define\tCONF_CLASS\t\t0x001000\n349\t#define\tCONF_SERVICE\t\t0x002000\n350\t#define\tCONF_LEAF\t\t0x004000\n351\t#define\tCONF_LISTEN_PORT\t0x008000\n352\t#define\tCONF_HUB\t\t0x010000\n353\t#define\tCONF_VER\t\t0x020000\n354\t#define\tCONF_BOUNCE\t\t0x040000\n355\t#define\tCONF_OTHERKILL\t\t0x080000\n356\t#define\tCONF_DENY\t\t0x100000\n357\t#ifdef TKLINE\n358\t#define\tCONF_TKILL\t\t0x200000\n359\t#define\tCONF_TOTHERKILL\t\t0x400000\n360\t#endif\n361\t#ifdef XLINE\n362\t#define CONF_XLINE\t\t0x800000\n363\t#endif\n364\t#define\tCONF_OPS\t\tCONF_OPERATOR\n365\t#define\tCONF_SERVER_MASK\t(CONF_CONNECT_SERVER | CONF_NOCONNECT_SERVER |\\\n366\t\t\t\t\t CONF_ZCONNECT_SERVER)\n367\t#define\tCONF_CLIENT_MASK\t(CONF_CLIENT | CONF_SERVICE | CONF_OPS | \\\n368\t\t\t\t\t CONF_SERVER_MASK)\n369\t\n370\t#define CFLAG_RESTRICTED\t0x00001\n371\t#define CFLAG_RNODNS\t\t0x00002\n372\t#define CFLAG_RNOIDENT\t\t0x00004\n373\t#define CFLAG_KEXEMPT\t\t0x00008\n374\t#define CFLAG_NORESOLVE\t\t0x00010\n375\t#define CFLAG_FALL\t\t0x00020\n376\t#define CFLAG_NORESOLVEMATCH\t0x00040\n377\t#ifdef XLINE\n378\t#define CFLAG_XEXEMPT\t\t0x00080\n379\t#endif\n380\t\n381\t#define IsConfRestricted(x)\t((x)->flags & CFLAG_RESTRICTED)\n382\t#define IsConfRNoDNS(x)\t\t((x)->flags & CFLAG_RNODNS)\n383\t#define IsConfRNoIdent(x)\t((x)->flags & CFLAG_RNOIDENT)\n384\t#define IsConfKlineExempt(x)\t((x)->flags & CFLAG_KEXEMPT)\n385\t#define IsConfNoResolve(x)\t((x)->flags & CFLAG_NORESOLVE)\n386\t#define IsConfNoResolveMatch(x)\t((x)->flags & CFLAG_NORESOLVEMATCH)\n387\t#define IsConfFallThrough(x)\t((x)->flags & CFLAG_FALL)\n388\t#ifdef XLINE\n389\t#define IsConfXlineExempt(x)\t((x)->flags & CFLAG_XEXEMPT)\n390\t#endif\n391\t\n392\t#define PFLAG_DELAYED\t\t0x00001\n393\t#define PFLAG_SERVERONLY\t0x00002\n394\t#define PFLAG_TLS           0x00004\n395\t\n396\t#define IsConfDelayed(x)\t((x)->flags & PFLAG_DELAYED)\n397\t#define IsConfServeronly(x)\t((x)->flags & PFLAG_SERVERONLY)\n398\t#define IsConfTLS(x)        ((x)->flags & PFLAG_TLS)\n399\t\n400\t#define\tIsIllegal(x)\t((x)->status & CONF_ILLEGAL)\n401\t\n402\ttypedef\tstruct\t{\n403\t\tu_long\tpi_id;\n404\t\tu_long\tpi_seq;\n405\t\tstruct\ttimeval\tpi_tv;\n406\t\taConfItem *pi_cp;\n407\t} Ping;\n408\t\n409\t\n410\t#define\tPING_REPLY\t0x01\n411\t#define\tPING_CPING\t0x02\n412\t\n413\t#ifdef\tZIP_LINKS\n414\t/* the minimum amount of data needed to trigger compression */\n415\t# define\tZIP_MINIMUM\t4096\n416\t\n417\t/* the maximum amount of data to be compressed (can actually be a bit more) */\n418\t# define\tZIP_MAXIMUM\t8192\t/* WARNING: *DON'T* CHANGE THIS!!!! */\n419\t\n420\tstruct Zdata {\n421\t\tz_stream\t*in;\t\t/* input zip stream data */\n422\t\tz_stream\t*out;\t\t/* output zip stream data */\n423\t\tBytef\t\toutbuf[ZIP_MAXIMUM]; /* outgoing (unzipped) buffer */\n424\t\tint\t\toutcount;\t/* size of outbuf content */\n425\t};\n426\t#endif\n427\t\n428\tstruct LineItem\n429\t{ \n430\t    char    *line;\n431\t    struct  LineItem *next;\n432\t};\n433\t\n434\t/*\n435\t * Client structures\n436\t */\n437\tstruct\tUser\t{\n438\t\tLink\t*channel;\t/* chain of channel pointer blocks */\n439\t\tinvLink\t*invited;\t/* chain of invite pointer blocks */\n440\t\tLink\t*uwas;\t\t/* chain of whowas pointer blocks */\n441\t\tchar\t*away;\t\t/* pointer to away message */\n442\t\ttime_t\tlast;\t\t/* \"idle\" time */\n443\t\tint\trefcnt;\t\t/* Number of times this block is referenced\n444\t\t\t\t\t** from aClient (field user), aServer (field\n445\t\t\t\t\t** by) and whowas array (field ww_user).\n446\t\t\t\t\t*/\n447\t\tint\tjoined;\t\t/* number of channels joined */\n448\t\tint\tflags;\t\t/* user modes */\n449\t        struct\tServer\t*servp;\n450\t\t\t\t\t/*\n451\t\t\t\t\t** In a perfect world the 'server' name\n452\t\t\t\t\t** should not be needed, a pointer to the\n453\t\t\t\t\t** client describing the server is enough.\n454\t\t\t\t\t** Unfortunately, in reality, server may\n455\t\t\t\t\t** not yet be in links while USER is\n456\t\t\t\t\t** introduced... --msa\n457\t\t\t\t\t** I think it's not true anymore --Beeth\n458\t\t\t\t\t*/\n459\t\tu_int\thashv;\n460\t\taClient\t*uhnext;\n461\t\taClient\t*bcptr;\n462\t\tchar\tusername[USERLEN+1];\n463\t\tchar\tuid[UIDLEN+1];\n464\t\tchar\thost[HOSTLEN+1];\n465\t\tchar\t*server;\n466\t\tu_int\thhashv;\t\t/* hostname hash value */\n467\t\tu_int\tiphashv;\t/* IP hash value */\n468\t\tstruct User *hhnext;\t/* next entry in hostname hash */\n469\t\tstruct User *iphnext;\t/* next entry in IP hash */\n470\t\t\t\t\t/* sip MUST be the last in this struct!!! */\n471\t\tchar\tsip[1];\t\t/* ip as a string, big enough for ipv6\n472\t\t\t\t\t * allocated to real size in make_user */\n473\t\n474\t};\n475\t\n476\tstruct\tServer\t{\n477\t\tchar\tnamebuf[HOSTLEN+1];\n478\t\tanUser\t*user;\t\t/* who activated this connection */\n479\t\taClient\t*up;\t\t/* uplink for this server */\n480\t\taConfItem *nline;\t/* N-line pointer for this server */\n481\t\tint\tversion;        /* version id for local client */\n482\t\tint\tsnum;\n483\t\tint\trefcnt;\t\t/* Number of times this block is referenced\n484\t\t\t\t\t** from anUser (field servp), aService (field\n485\t\t\t\t\t** servp) and aClient (field serv) */\n486\t\tint\tusercnt[3];\t/* # of clients - visible, invisible, opers */\n487\t\tstruct\tServer\t*nexts, *prevs, *shnext;\n488\t\taClient\t*bcptr;\n489\t\taClient\t*maskedby;\t/* Pointer to server masking this server.\n490\t\t\t\t\t** Self if not masked, *NEVER* NULL. */\n491\t\tchar\tby[NICKLEN+1];\n492\t\tchar\tbyuid[UIDLEN + 1];\n493\t\tchar\tsid[SIDLEN + 1];/* The Server ID. */\n494\t\tchar\tverstr[11];\t/* server version, PATCHLEVEL format */\n495\t\tu_int\tsidhashv;\t/* Raw hash value. */\n496\t\taServer\t*sidhnext;\t/* Next server in the sid hash. */\n497\t\ttime_t\tlastload;\t/* penalty like counters, see s_serv.c\n498\t\t\t\t\t** should be in the local part, but.. */\n499\t\tint\tservers;\t/* Number of downlinks of this server. */\n500\t\taClient\t*left, *right;\t/* Left and right nodes in server tree. */\n501\t\taClient\t*down;\t\t/* Ptr to first downlink of this server. */\n502\t};\n503\t\n504\tstruct\tService\t{\n505\t\tchar\tnamebuf[HOSTLEN+1];\n506\t\tint\twants;\n507\t\tint\ttype;\n508\t\tchar\t*server;\n509\t\taServer\t*servp;\n510\t\tstruct\tService\t*nexts, *prevs;\n511\t\taClient\t*bcptr;\n512\t\tchar\tdist[HOSTLEN+1];\n513\t};\n514\t\n515\tstruct Client\t{\n516\t\tstruct\tClient *next,*prev, *hnext;\n517\t\tanUser\t*user;\t\t/* ...defined, if this is a User */\n518\t\taServer\t*serv;\t\t/* ...defined, if this is a server */\n519\t\taService *service;\n520\t\tu_int\thashv;\t\t/* raw hash value */\n521\t\tlong\tflags;\t\t/* client flags */\n522\t\taClient\t*from;\t\t/* == self, if Local Client, *NEVER* NULL! */\n523\t\tint\tfd;\t\t/* >= 0, for local clients */\n524\t\tint\thopcount;\t/* number of servers to this 0 = local */\n525\t\tshort\tstatus;\t\t/* Client type */\n526\t\tchar\t*name;\t\t/* Pointer to unique name of the client */\n527\t\tchar\tnamebuf[NICKLEN+1]; /* nick of the client */\n528\t\tchar\tusername[USERLEN+1]; /* username here now for auth stuff */\n529\t\tchar\t*info;\t\t/* Free form additional client information */\n530\t\t/*\n531\t\t** The following fields are allocated only for local clients\n532\t\t** (directly connected to *this* server with a socket.\n533\t\t** The first of them *MUST* be the \"count\"--it is the field\n534\t\t** to which the allocation is tied to! *Never* refer to\n535\t\t** these fields, if (from != self).\n536\t\t*/\n537\t\tint\tcount;\t\t/* Amount of data in buffer */\n538\t\tchar\tbuffer[BUFSIZE]; /* Incoming message buffer */\n539\t#ifdef\tZIP_LINKS\n540\t\taZdata\t*zip;\t\t/* zip data */\n541\t#endif\n542\t\tshort\tlastsq;\t\t/* # of 2k blocks when sendqueued called last*/\n543\t\tdbuf\tsendQ;\t\t/* Outgoing message queue--if socket full */\n544\t\tdbuf\trecvQ;\t\t/* Hold for data incoming yet to be parsed */\n545\t\tlong\tsendM;\t\t/* Statistics: protocol messages send */\n546\t\tlong\treceiveM;\t/* Statistics: protocol messages received */\n547\t\tunsigned long long\tsendB;\t\t/* Statistics: total bytes send */\n548\t\tunsigned long long\treceiveB;\t/* Statistics: total bytes received */\n549\t\ttime_t\tlasttime;\t/* last time we received data */\n550\t\ttime_t\tfirsttime;\t/* time client was created */\n551\t\ttime_t\tsince;\t\t/* last time we parsed something */\n552\t\taClient\t*acpt;\t\t/* listening client which we accepted from */\n553\t\tLink\t*confs;\t\t/* Configuration record associated */\n554\t\tint\tping;\n555\t\tint\tauthfd;\t\t/* fd for rfc931 authentication */\n556\t\tchar\t*auth;\n557\t\tu_short\tport;\t\t/* and the remote port# too :-) */\n558\t\tstruct\tIN_ADDR\tip;\t/* keep real ip# too */\n559\t\tstruct\thostent\t*hostp;\n560\t\tchar\tsockhost[HOSTLEN+1]; /* This is the host name from the socket\n561\t\t\t\t\t  ** and after which the connection was\n562\t\t\t\t\t  ** accepted.\n563\t\t\t\t\t  */\n564\t\tchar\tpasswd[PASSWDLEN+1];\n565\t\tchar\texitc;\n566\t\tchar\t*reason;\t/* additional exit message */\n567\t#ifdef XLINE\n568\t\t/* Those logically should be in anUser struct, but would be null for\n569\t\t** all remote users... so better waste two pointers for all local\n570\t\t** non-users than two pointers for all remote users. --B. */\n571\t\tchar\t*user2;\t/* 2nd param of USER */\n572\t\tchar\t*user3;\t/* 3rd param of USER */\n573\t#endif\n574\t\n575\t};\n576\t\n577\t#define\tCLIENT_LOCAL_SIZE sizeof(aClient)\n578\t#define\tCLIENT_REMOTE_SIZE offsetof(aClient,count)\n579\t\n580\t/*\n581\t * statistics structures\n582\t */\n583\tstruct\tstats {\n584\t\tu_int\tis_cl;\t/* number of client connections */\n585\t\tu_int\tis_sv;\t/* number of server connections */\n586\t\tu_int\tis_ni;\t/* connection but no idea who it was\n587\t\t\t\t * (can be a P: line that has been removed -krys) */\n588\t\tunsigned long long\tis_cbs;\t/* bytes sent to clients */\n589\t\tunsigned long long\tis_cbr;\t/* bytes received to clients */\n590\t\tunsigned long long\tis_sbs;\t/* bytes sent to servers */\n591\t\tunsigned long long\tis_sbr;\t/* bytes received to servers */\n592\t\ttime_t\tis_cti;\t/* time spent connected by clients */\n593\t\ttime_t\tis_sti;\t/* time spent connected by servers */\n594\t\tu_int\tis_ac;\t/* connections accepted */\n595\t\tu_int\tis_ref;\t/* accepts refused */\n596\t\tu_int\tis_unco; /* unknown commands */\n597\t\tu_int\tis_wrdi; /* command going in wrong direction */\n598\t\tu_int\tis_unpf; /* unknown prefix */\n599\t\tu_int\tis_empt; /* empty message */\n600\t\tu_int\tis_num;\t/* numeric message */"}]},"uuid":"7424b230-44da-4258-894a-83817e644b2c","timestamp":"2026-06-02T19:21:28.130Z","sourceToolAssistantUUID":"1b1dd57c-957a-4cc5-9464-3e1183ca1aa3","userType":"external","entrypoint":"cli","cwd":"/home/xe/code/xeiaso.net/ircd.rs","sessionId":"ba5566ad-6136-4ebe-b017-225d121463c3","version":"2.1.161","gitBranch":"master"}
.claude/sessions/6a1eb242-da3f-4181-9b05-27c027148ad5/subagents/agent-a5a25c2ecc7e6c451.jsonl:48:{"parentUuid":"c8c3df29-3cfb-4b40-879c-461e47becda6","isSidechain":true,"promptId":"56331d33-583e-46ef-b824-a9c867f98e92","agentId":"a5a25c2ecc7e6c451","type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_015fCRf1HuC91nhwTZubRBJk","type":"tool_result","content":"1\t/************************************************************************\n2\t *   IRC - Internet Relay Chat, common/struct_def.h\n3\t *   Copyright (C) 1990 Jarkko Oikarinen and\n4\t *                      University of Oulu, Computing Center\n5\t *\n6\t *   This program is free software; you can redistribute it and/or modify\n7\t *   it under the terms of the GNU General Public License as published by\n8\t *   the Free Software Foundation; either version 1, or (at your option)\n9\t *   any later version.\n10\t *\n11\t *   This program is distributed in the hope that it will be useful,\n12\t *   but WITHOUT ANY WARRANTY; without even the implied warranty of\n13\t *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n14\t *   GNU General Public License for more details.\n15\t *\n16\t *   You should have received a copy of the GNU General Public License\n17\t *   along with this program; if not, write to the Free Software\n18\t *   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n19\t *\n20\t *   $Id: struct_def.h,v 1.152 2011/01/20 14:26:56 bif Exp $\n21\t */\n22\t\n23\ttypedef\tstruct\tConfItem aConfItem;\n24\ttypedef\tstruct\tListItem aListItem;\n25\ttypedef\tstruct \tClient\taClient;\n26\ttypedef\tstruct\tChannel\taChannel;\n27\ttypedef\tstruct\tUser\tanUser;\n28\ttypedef\tstruct\tServer\taServer;\n29\ttypedef\tstruct\tService\taService;\n30\ttypedef\tstruct\tSLink\tLink;\n31\ttypedef\tstruct\tinvSLink\tinvLink;\n32\ttypedef\tstruct\tSMode\tMode;\n33\ttypedef\tstruct\tfdarray\tFdAry;\n34\ttypedef\tstruct\tCPing\taCPing;\n35\ttypedef\tstruct\tZdata\taZdata;\n36\ttypedef struct        LineItem aMotd;\n37\t#if defined(USE_IAUTH)\n38\ttypedef struct        LineItem aExtCf;\n39\ttypedef struct        LineItem aExtData;\n40\t#endif\n41\t\n42\t#define\tHOSTLEN\t\t63\t/* Length of hostname.  Updated to         */\n43\t\t\t\t\t/* comply with RFC1123                     */\n44\t\n45\t#if (INET6_ADDRSTRLEN > HOSTLEN)\n46\t#error HOSTLEN must not be smaller than INET6_ADDRSTRLEN\n47\t#endif\n48\t\n49\t#define\tNICKLEN\t\t15\t/* Must be the same network-wide. */\n50\t#define UIDLEN\t\t9\t/* must not be bigger than NICKLEN --Beeth */\n51\t#define\tUSERLEN\t\t10\n52\t#define\tREALLEN\t \t50\n53\t#define\tTOPICLEN\t255\n54\t#define\tCHANNELLEN\t50\n55\t#define\tPASSWDLEN \t20\n56\t#define\tKEYLEN\t\t23\n57\t#define\tBUFSIZE\t\t512\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n58\t#define\tMAXRECIPIENTS \t20\n59\t#define\tMAXBANS\t\t64\n60\t#define\tMAXBANLENGTH\t2048\n61\t#define\tBANLEN\t\t(USERLEN + NICKLEN + HOSTLEN + 3)\n62\t#define MAXPENALTY\t10\n63\t#define\tCHIDLEN\t\t5\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n64\t#define\tSIDLEN\t\t4\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n65\t#define\tMAXMODEPARAMS\t3\t\t/* WARNING: *DONT* CHANGE THIS!!!! */\n66\t#define\tDELAYCHASETIMELIMIT\t1800\t/* WARNING: *DONT* CHANGE THIS!!!! */\n67\t#define\tLDELAYCHASETIMELIMIT\t5400\t/* WARNING: *DONT* CHANGE THIS!!!! */\n68\t\n69\t#define\tREADBUF_SIZE\t16384\t/* used in s_bsd.c *AND* s_zip.c ! */\n70\t \n71\t/*\n72\t * Make up some numbers which should reflect average leaf server connect\n73\t * queue max size.\n74\t * queue=(<# of channels> * <channel size> + <user size> * <# of users>) * 2\n75\t * pool=<queue per client> * <avg. # of clients having data in queue>\n76\t */\n77\t#define\tQUEUELEN\t(((MAXCONNECTIONS / 10) * (CHANNELLEN + BANLEN + 16) +\\\n78\t\t\t\t  (HOSTLEN * 4 + REALLEN + NICKLEN + USERLEN + 24) *\\\n79\t\t\t\t  (MAXCONNECTIONS / 2)) * 2)\n80\t\n81\t#define\tBUFFERPOOL\t(DBUFSIZ * MAXCONNECTIONS * 2) + \\\n82\t\t\t\t(QUEUELEN * MAXSERVERS)\n83\t\n84\t#define\tUSERHOST_REPLYLEN\t(NICKLEN+HOSTLEN+USERLEN+5)\n85\t\n86\t/*\n87\t** 'offsetof' is defined in ANSI-C. The following definition\n88\t** is not absolutely portable (I have been told), but so far\n89\t** it has worked on all machines I have needed it. The type\n90\t** should be size_t but...  --msa\n91\t*/\n92\t#ifndef offsetof\n93\t#define\toffsetof(t,m) (int)((&((t *)0L)->m))\n94\t#endif\n95\t\n96\t#define\telementsof(x) (sizeof(x)/sizeof(x[0]))\n97\t\n98\t/*\n99\t** flags for bootup options (command line flags)\n100\t*/\n101\t#define\tBOOT_CONSOLE\t0x001\n102\t#define\tBOOT_QUICK\t0x002\n103\t#define\tBOOT_DEBUG\t0x004\n104\t#define\tBOOT_INETD\t0x008\n105\t#define\tBOOT_TTY\t0x010\n106\t\n107\t#define\tBOOT_AUTODIE\t0x040\n108\t#define\tBOOT_BADTUNE\t0x080\n109\t#define\tBOOT_PROT\t0x100\n110\t#define\tBOOT_STRICTPROT\t0x200\n111\t#define\tBOOT_NOIAUTH\t0x400\n112\t#define\tBOOT_STANDALONE\t0x800\n113\t\n114\ttypedef enum Status {\n115\t\tSTAT_CONNECTING = -4,\n116\t\tSTAT_HANDSHAKE, /* -3 */\n117\t\tSTAT_UNKNOWN,\t/* -2 */\n118\t\tSTAT_ME,\t/* -1 */\n119\t\tSTAT_SERVER,\t/* 0 */\n120\t\tSTAT_CLIENT,\t/* 1 */\n121\t\tSTAT_OPER,\t/* 2 */\n122\t\tSTAT_SERVICE,\t/* 3 */\n123\t\tSTAT_UNREG,\t/* 4 */\n124\t\tSTAT_MAX\t/* 5 -- size of handler[] table we need */\n125\t} Status;\n126\t\n127\t/*\n128\t * status macros.\n129\t */\n130\t#define\tIsRegisteredUser(x)\t(((x)->status == STAT_CLIENT || \\\n131\t\t\t\t\t (x)->status == STAT_OPER) && (x)->user)\n132\t#define\tIsRegistered(x)\t\t((x)->status >= STAT_SERVER || \\\n133\t\t\t\t\t (x)->status == STAT_ME)\n134\t#define\tIsConnecting(x)\t\t((x)->status == STAT_CONNECTING)\n135\t#define\tIsHandshake(x)\t\t((x)->status == STAT_HANDSHAKE)\n136\t#define\tIsMe(x)\t\t\t((x)->status == STAT_ME)\n137\t#define\tIsUnknown(x)\t\t((x)->status == STAT_UNKNOWN)\n138\t#define\tIsServer(x)\t\t((x)->status == STAT_SERVER)\n139\t#define\tIsClient(x)\t\t((x)->status == STAT_CLIENT || \\\n140\t\t\t\t\t (x)->status == STAT_OPER)\n141\t#define\tIsService(x)\t\t((x)->status == STAT_SERVICE && (x)->service)\n142\t\n143\t#define\tSetConnecting(x)\t((x)->status = STAT_CONNECTING)\n144\t#define\tSetHandshake(x)\t\t((x)->status = STAT_HANDSHAKE)\n145\t#define\tSetMe(x)\t\t((x)->status = STAT_ME)\n146\t#define\tSetUnknown(x)\t\t((x)->status = STAT_UNKNOWN)\n147\t#define\tSetServer(x)\t\t((x)->status = STAT_SERVER)\n148\t#define\tSetClient(x)\t\t((x)->status = IsAnOper((x)) ? STAT_OPER : STAT_CLIENT)\n149\t#define\tSetService(x)\t\t((x)->status = STAT_SERVICE)\n150\t\n151\t#define\tFLAGS_PINGSENT\t0x0000001 /* Unreplied ping sent */\n152\t#define\tFLAGS_DEADSOCK\t0x0000002 /* Local socket is dead--Exiting soon */\n153\t#define\tFLAGS_KILLED\t0x0000004 /* Prevents \"QUIT\" from being sent for this */\n154\t#define\tFLAGS_BLOCKED\t0x0000008 /* socket is in blocked condition [unused] */\n155\t#ifdef UNIXPORT\n156\t#define\tFLAGS_UNIX\t0x0000010 /* socket is in the unix domain, not inet */\n157\t#endif\n158\t#define\tFLAGS_CLOSING\t0x0000020 /* set when closing to suppress errors */\n159\t#define\tFLAGS_LISTEN\t0x0000040 /* used to mark clients which we listen() on */\n160\t#define\tFLAGS_XAUTHDONE\t0x0000080 /* iauth is finished with this client */\n161\t#define\tFLAGS_DOINGDNS\t0x0000100 /* client is waiting for a DNS response */\n162\t#define\tFLAGS_AUTH\t0x0000200 /* client is waiting on rfc931 response */\n163\t#define\tFLAGS_WRAUTH\t0x0000400 /* set if we havent writen to ident server */\n164\t#define\tFLAGS_LOCAL\t0x0000800 /* set for local clients */\n165\t#define\tFLAGS_GOTID\t0x0001000 /* successful ident lookup achieved */\n166\t#define\tFLAGS_XAUTH\t0x0002000 /* waiting on external authentication */\n167\t#define\tFLAGS_WXAUTH\t0x0004000 /* same as above, but also prevent parsing */\n168\t#define\tFLAGS_NONL\t0x0008000 /* No \\n in buffer */\n169\t#define\tFLAGS_CBURST\t0x0010000 /* set to mark connection burst being sent */\n170\t#define\tFLAGS_QUIT\t0x0040000 /* QUIT :comment shows it's not a split */\n171\t#define\tFLAGS_SPLIT\t0x0080000 /* client QUITting because of a netsplit */\n172\t#define\tFLAGS_HIDDEN\t0x0100000 /* netsplit is behind a hostmask,\n173\t\t\t\t\t     also used for marking clients in who_find\n174\t\t\t\t\t   */\n175\t#define\tFLAGS_UNKCMD\t0x0200000 /* has sent an unknown command */\n176\t#define\tFLAGS_ZIP\t0x0400000 /* link is zipped */\n177\t#define\tFLAGS_ZIPRQ\t0x0800000 /* zip requested */\n178\t#define\tFLAGS_ZIPSTART\t0x1000000 /* start of zip (ignore any CRLF) */\n179\t#define\tFLAGS_SQUIT\t0x2000000 /* This is set when we send the last\n180\t\t\t\t\t  ** server, so we know we have to send\n181\t\t\t\t\t  ** a SQUIT. */\n182\t#define\tFLAGS_EOB\t0x4000000 /* EOB received */\n183\t#define FLAGS_LISTENINACTIVE 0x8000000 /* Listener does not listen() */\n184\t#ifdef JAPANESE\n185\t#define\tFLAGS_JP\t0x10000000 /* jp version, used both for chans and servs */\n186\t#endif\n187\t\t\n188\t#define\tFLAGS_OPER\t0x0001 /* operator */\n189\t#define\tFLAGS_LOCOP\t0x0002 /* local operator -- SRB */\n190\t#define\tFLAGS_WALLOP\t0x0004 /* send wallops to them */\n191\t#define\tFLAGS_INVISIBLE\t0x0008 /* makes user invisible */\n192\t#define FLAGS_RESTRICT\t0x0010 /* restricted user */\n193\t#define FLAGS_AWAY\t0x0020 /* user is away */\n194\t#define FLAGS_EXEMPT    0x0040 /* user is exempted from k-lines */\n195\t#ifdef XLINE\n196\t#define FLAGS_XLINED\t0x0100\t/* X-lined client */\n197\t#endif\n198\t#define FLAGS_TLS       0x0200 /* user is on a secure connection port (SSL/TLS) -- mh 2020-04-27 */\n199\t#define\tSEND_UMODES\t(FLAGS_INVISIBLE|FLAGS_OPER|FLAGS_WALLOP|FLAGS_AWAY|FLAGS_RESTRICT)\n200\t#define\tALL_UMODES\t(SEND_UMODES|FLAGS_LOCOP)\n201\t\n202\t/*\n203\t * user flags macros.\n204\t */\n205\t#define\tIsOper(x)\t\t((x)->user && (x)->user->flags & FLAGS_OPER)\n206\t#define\tIsLocOp(x)\t\t((x)->user && (x)->user->flags & FLAGS_LOCOP)\n207\t#define\tIsInvisible(x)\t\t((x)->user->flags & FLAGS_INVISIBLE)\n208\t#define IsRestricted(x)         ((x)->user && \\\n209\t\t\t\t\t (x)->user->flags & FLAGS_RESTRICT)\n210\t#define\tIsAnOper(x)\t\t((x)->user && \\\n211\t\t\t\t\t (x)->user->flags & (FLAGS_OPER|FLAGS_LOCOP))\n212\t#define\tIsPerson(x)\t\t((x)->user && IsClient(x))\n213\t#define\tIsPrivileged(x)\t\t(IsServer(x) || IsAnOper(x))\n214\t#define\tSendWallops(x)\t\t((x)->user->flags & FLAGS_WALLOP)\n215\t#ifdef UNIXPORT\n216\t#define\tIsUnixSocket(x)\t\t((x)->flags & FLAGS_UNIX)\n217\t#endif\n218\t#define\tIsListener(x)\t\t((x)->flags & FLAGS_LISTEN)\n219\t#define IsListenerInactive(x)\t((x)->flags & FLAGS_LISTENINACTIVE)\n220\t#define\tIsLocal(x)\t\t(MyConnect(x) && (x)->flags & FLAGS_LOCAL)\n221\t#define\tIsDead(x)\t\t((x)->flags & FLAGS_DEADSOCK)\n222\t#define\tIsBursting(x)\t\t(!((x)->flags & FLAGS_EOB))\n223\t#define IsKlineExempt(x)        ((x)->user && (x)->user->flags & FLAGS_EXEMPT)\n224\t\n225\t#define\tSetDead(x)\t\t((x)->flags |= FLAGS_DEADSOCK)\n226\t#define\tCBurst(x)\t\t((x)->flags & FLAGS_CBURST)\n227\t#define\tSetOper(x)\t\t((x)->user->flags |= FLAGS_OPER, \\\n228\t\t\t\t\t (x)->status = STAT_OPER)\n229\t#define\tSetLocOp(x)\t\t((x)->user->flags |= FLAGS_LOCOP, \\\n230\t\t\t\t\t (x)->status = STAT_OPER)\n231\t#define\tSetInvisible(x)\t\t((x)->user->flags |= FLAGS_INVISIBLE)\n232\t#define SetRestricted(x)\t((x)->user->flags |= FLAGS_RESTRICT)\n233\t#define\tSetWallops(x)\t\t((x)->user->flags |= FLAGS_WALLOP)\n234\t#ifdef UNIXPORT\n235\t#define\tSetUnixSock(x)\t\t((x)->flags |= FLAGS_UNIX)\n236\t#endif\n237\t#define\tSetDNS(x)\t\t((x)->flags |= FLAGS_DOINGDNS)\n238\t#define\tSetDoneXAuth(x)\t\t((x)->flags |= FLAGS_XAUTHDONE)\n239\t#define\tSetEOB(x)\t\t((x)->flags |= FLAGS_EOB)\n240\t#define SetListenerInactive(x)\t((x)->flags |= FLAGS_LISTENINACTIVE)\n241\t#define SetKlineExempt(x)\t((x)->user->flags |= FLAGS_EXEMPT)\n242\t\n243\t#define\tDoingDNS(x)\t\t((x)->flags & FLAGS_DOINGDNS)\n244\t#define\tDoingAuth(x)\t\t((x)->flags & FLAGS_AUTH)\n245\t#define\tDoingXAuth(x)\t\t((x)->flags & FLAGS_XAUTH)\n246\t#define\tWaitingXAuth(x)\t\t((x)->flags & FLAGS_WXAUTH)\n247\t#define\tDoneXAuth(x)\t\t((x)->flags & FLAGS_XAUTHDONE)\n248\t#define\tNoNewLine(x)\t\t((x)->flags & FLAGS_NONL)\n249\t\n250\t#define\tClearOper(x)\t\t((x)->user->flags &= ~FLAGS_OPER, \\\n251\t\t\t\t\t (x)->status = STAT_CLIENT)\n252\t#define\tClearLocOp(x)\t\t((x)->user->flags &= ~FLAGS_LOCOP, \\\n253\t\t\t\t\t (x)->status = STAT_CLIENT)\n254\t#define\tClearInvisible(x)\t((x)->user->flags &= ~FLAGS_INVISIBLE)\n255\t#define ClearRestricted(x)      ((x)->user->flags &= ~FLAGS_RESTRICT)\n256\t#define\tClearWallops(x)\t\t((x)->user->flags &= ~FLAGS_WALLOP)\n257\t#define\tClearDNS(x)\t\t((x)->flags &= ~FLAGS_DOINGDNS)\n258\t#define\tClearAuth(x)\t\t((x)->flags &= ~FLAGS_AUTH)\n259\t#define\tClearXAuth(x)\t\t((x)->flags &= ~FLAGS_XAUTH)\n260\t#define\tClearWXAuth(x)\t\t((x)->flags &= ~FLAGS_WXAUTH)\n261\t#define ClearListenerInactive(x) ((x)->flags &= ~FLAGS_LISTENINACTIVE)\n262\t#ifdef XLINE\n263\t#define IsXlined(x)\t\t((x)->user && (x)->user->flags & FLAGS_XLINED)\n264\t#define SetXlined(x)\t\t((x)->user->flags |= FLAGS_XLINED)\n265\t#define ClearXlined(x)\t\t((x)->user->flags &= ~FLAGS_XLINED)\n266\t#endif\n267\t#define IsTLS(x)        ((x)->user && (x)->user->flags & FLAGS_TLS)\n268\t#define SetTLS(x)       ((x)->user->flags |= FLAGS_TLS)\n269\t\n270\t/*\n271\t * defined debugging levels\n272\t */\n273\t#define\tDEBUG_FATAL  0\n274\t#define\tDEBUG_ERROR  1\t/* report_error() and other errors that are found */\n275\t#define\tDEBUG_READ   2\n276\t#define\tDEBUG_WRITE  2\n277\t#define\tDEBUG_NOTICE 3\n278\t#define\tDEBUG_DNS    4\t/* used by all DNS related routines - a *lot* */\n279\t#define\tDEBUG_INFO   5\t/* general usful info */\n280\t#define\tDEBUG_NUM    6\t/* numerics */\n281\t#define\tDEBUG_SEND   7\t/* everything that is sent out */\n282\t#define\tDEBUG_DEBUG  8\t/* anything to do with debugging, ie unimportant :) */\n283\t#define\tDEBUG_MALLOC 9\t/* malloc/free calls */\n284\t#define\tDEBUG_LIST  10\t/* debug list use */\n285\t#define\tDEBUG_L10   10\n286\t#define\tDEBUG_L11   11\n287\t\n288\t/*\n289\t * defines for curses in client\n290\t */\n291\t#define\tDUMMY_TERM\t0\n292\t#define\tCURSES_TERM\t1\n293\t#define\tTERMCAP_TERM\t2\n294\t\n295\tstruct\tCPing\t{\n296\t\tu_short\tport;\t\t/* port to send pings to */\n297\t\tu_long\trtt;\t\t/* average RTT */\n298\t\tu_long\tping;\n299\t\tu_long\tseq;\t\t/* # sent still in the \"window\" */\n300\t\tu_long\tlseq;\t\t/* sequence # of last sent */\n301\t\tu_long\trecvd;\t\t/* # received still in the \"window\" */\n302\t\tu_long\tlrecvd;\t\t/* # received */\n303\t};\n304\t\n305\tstruct\tConfItem\t{\n306\t\tu_int\tstatus;\t\t/* If CONF_ILLEGAL, delete when no clients */\n307\t\tint\tclients;\t/* Number of *LOCAL* clients using this */\n308\t\tstruct\tIN_ADDR ipnum;\t/* ip number of host field */\n309\t\tchar\t*host;\n310\t\tchar\t*passwd;\n311\t\tchar\t*name;\n312\t\tchar\t*name2;\n313\t#ifdef XLINE\n314\t\tchar\t*name3;\n315\t#endif\n316\t\tint\tport;\n317\t\tlong\tflags;\t\t/* I-line flags */\n318\t\tint\tpref;\t\t/* preference value */\n319\t\tstruct\tCPing\t*ping;\n320\t\ttime_t\thold;\t/* Hold action until this time (calendar time) */\n321\t\tchar\t*source_ip;\n322\t#ifndef VMSP\n323\t\taClass\t*class;  /* Class of connection */\n324\t#endif\n325\t\tstruct\tConfItem *next;\n326\t};\n327\t\n328\tstruct\tListItem\t{\n329\t\tchar\t*nick;\n330\t\tchar\t*user;\n331\t\tchar\t*host;\n332\t};\n333\t\n334\t/* these define configuration lines (A:, M:, I:, K:, etc.) */\n335\t#define\tCONF_ILLEGAL\t\t0x80000000\n336\t#define\tCONF_MATCH\t\t0x40000000\n337\t#define\tCONF_QUARANTINED_SERVER\t0x000001\n338\t#define\tCONF_CLIENT\t\t0x000002\n339\t\n340\t#define\tCONF_CONNECT_SERVER\t0x000008\n341\t#define\tCONF_NOCONNECT_SERVER\t0x000010\n342\t#define\tCONF_ZCONNECT_SERVER\t0x000020\n343\t\n344\t#define\tCONF_OPERATOR\t\t0x000080\n345\t#define\tCONF_ME\t\t\t0x000100\n346\t#define\tCONF_KILL\t\t0x000200\n347\t#define\tCONF_ADMIN\t\t0x000400\n348\t#define\tCONF_CLASS\t\t0x001000\n349\t#define\tCONF_SERVICE\t\t0x002000\n350\t#define\tCONF_LEAF\t\t0x004000\n351\t#define\tCONF_LISTEN_PORT\t0x008000\n352\t#define\tCONF_HUB\t\t0x010000\n353\t#define\tCONF_VER\t\t0x020000\n354\t#define\tCONF_BOUNCE\t\t0x040000\n355\t#define\tCONF_OTHERKILL\t\t0x080000\n356\t#define\tCONF_DENY\t\t0x100000\n357\t#ifdef TKLINE\n358\t#define\tCONF_TKILL\t\t0x200000\n359\t#define\tCONF_TOTHERKILL\t\t0x400000\n360\t#endif\n361\t#ifdef XLINE\n362\t#define CONF_XLINE\t\t0x800000\n363\t#endif\n364\t#define\tCONF_OPS\t\tCONF_OPERATOR\n365\t#define\tCONF_SERVER_MASK\t(CONF_CONNECT_SERVER | CONF_NOCONNECT_SERVER |\\\n366\t\t\t\t\t CONF_ZCONNECT_SERVER)\n367\t#define\tCONF_CLIENT_MASK\t(CONF_CLIENT | CONF_SERVICE | CONF_OPS | \\\n368\t\t\t\t\t CONF_SERVER_MASK)\n369\t\n370\t#define CFLAG_RESTRICTED\t0x00001\n371\t#define CFLAG_RNODNS\t\t0x00002\n372\t#define CFLAG_RNOIDENT\t\t0x00004\n373\t#define CFLAG_KEXEMPT\t\t0x00008\n374\t#define CFLAG_NORESOLVE\t\t0x00010\n375\t#define CFLAG_FALL\t\t0x00020\n376\t#define CFLAG_NORESOLVEMATCH\t0x00040\n377\t#ifdef XLINE\n378\t#define CFLAG_XEXEMPT\t\t0x00080\n379\t#endif\n380\t\n381\t#define IsConfRestricted(x)\t((x)->flags & CFLAG_RESTRICTED)\n382\t#define IsConfRNoDNS(x)\t\t((x)->flags & CFLAG_RNODNS)\n383\t#define IsConfRNoIdent(x)\t((x)->flags & CFLAG_RNOIDENT)\n384\t#define IsConfKlineExempt(x)\t((x)->flags & CFLAG_KEXEMPT)\n385\t#define IsConfNoResolve(x)\t((x)->flags & CFLAG_NORESOLVE)\n386\t#define IsConfNoResolveMatch(x)\t((x)->flags & CFLAG_NORESOLVEMATCH)\n387\t#define IsConfFallThrough(x)\t((x)->flags & CFLAG_FALL)\n388\t#ifdef XLINE\n389\t#define IsConfXlineExempt(x)\t((x)->flags & CFLAG_XEXEMPT)\n390\t#endif\n391\t\n392\t#define PFLAG_DELAYED\t\t0x00001\n393\t#define PFLAG_SERVERONLY\t0x00002\n394\t#define PFLAG_TLS           0x00004\n395\t\n396\t#define IsConfDelayed(x)\t((x)->flags & PFLAG_DELAYED)\n397\t#define IsConfServeronly(x)\t((x)->flags & PFLAG_SERVERONLY)\n398\t#define IsConfTLS(x)        ((x)->flags & PFLAG_TLS)\n399\t\n400\t#define\tIsIllegal(x)\t((x)->status & CONF_ILLEGAL)\n401\t\n402\ttypedef\tstruct\t{\n403\t\tu_long\tpi_id;\n404\t\tu_long\tpi_seq;\n405\t\tstruct\ttimeval\tpi_tv;\n406\t\taConfItem *pi_cp;\n407\t} Ping;\n408\t\n409\t\n410\t#define\tPING_REPLY\t0x01\n411\t#define\tPING_CPING\t0x02\n412\t\n413\t#ifdef\tZIP_LINKS\n414\t/* the minimum amount of data needed to trigger compression */\n415\t# define\tZIP_MINIMUM\t4096\n416\t\n417\t/* the maximum amount of data to be compressed (can actually be a bit more) */\n418\t# define\tZIP_MAXIMUM\t8192\t/* WARNING: *DON'T* CHANGE THIS!!!! */\n419\t\n420\tstruct Zdata {\n421\t\tz_stream\t*in;\t\t/* input zip stream data */\n422\t\tz_stream\t*out;\t\t/* output zip stream data */\n423\t\tBytef\t\toutbuf[ZIP_MAXIMUM]; /* outgoing (unzipped) buffer */\n424\t\tint\t\toutcount;\t/* size of outbuf content */\n425\t};\n426\t#endif\n427\t\n428\tstruct LineItem\n429\t{ \n430\t    char    *line;\n431\t    struct  LineItem *next;\n432\t};\n433\t\n434\t/*\n435\t * Client structures\n436\t */\n437\tstruct\tUser\t{\n438\t\tLink\t*channel;\t/* chain of channel pointer blocks */\n439\t\tinvLink\t*invited;\t/* chain of invite pointer blocks */\n440\t\tLink\t*uwas;\t\t/* chain of whowas pointer blocks */\n441\t\tchar\t*away;\t\t/* pointer to away message */\n442\t\ttime_t\tlast;\t\t/* \"idle\" time */\n443\t\tint\trefcnt;\t\t/* Number of times this block is referenced\n444\t\t\t\t\t** from aClient (field user), aServer (field\n445\t\t\t\t\t** by) and whowas array (field ww_user).\n446\t\t\t\t\t*/\n447\t\tint\tjoined;\t\t/* number of channels joined */\n448\t\tint\tflags;\t\t/* user modes */\n449\t        struct\tServer\t*servp;\n450\t\t\t\t\t/*\n451\t\t\t\t\t** In a perfect world the 'server' name\n452\t\t\t\t\t** should not be needed, a pointer to the\n453\t\t\t\t\t** client describing the server is enough.\n454\t\t\t\t\t** Unfortunately, in reality, server may\n455\t\t\t\t\t** not yet be in links while USER is\n456\t\t\t\t\t** introduced... --msa\n457\t\t\t\t\t** I think it's not true anymore --Beeth\n458\t\t\t\t\t*/\n459\t\tu_int\thashv;\n460\t\taClient\t*uhnext;\n461\t\taClient\t*bcptr;\n462\t\tchar\tusername[USERLEN+1];\n463\t\tchar\tuid[UIDLEN+1];\n464\t\tchar\thost[HOSTLEN+1];\n465\t\tchar\t*server;\n466\t\tu_int\thhashv;\t\t/* hostname hash value */\n467\t\tu_int\tiphashv;\t/* IP hash value */\n468\t\tstruct User *hhnext;\t/* next entry in hostname hash */\n469\t\tstruct User *iphnext;\t/* next entry in IP hash */\n470\t\t\t\t\t/* sip MUST be the last in this struct!!! */\n471\t\tchar\tsip[1];\t\t/* ip as a string, big enough for ipv6\n472\t\t\t\t\t * allocated to real size in make_user */\n473\t\n474\t};\n475\t\n476\tstruct\tServer\t{\n477\t\tchar\tnamebuf[HOSTLEN+1];\n478\t\tanUser\t*user;\t\t/* who activated this connection */\n479\t\taClient\t*up;\t\t/* uplink for this server */\n480\t\taConfItem *nline;\t/* N-line pointer for this server */\n481\t\tint\tversion;        /* version id for local client */\n482\t\tint\tsnum;\n483\t\tint\trefcnt;\t\t/* Number of times this block is referenced\n484\t\t\t\t\t** from anUser (field servp), aService (field\n485\t\t\t\t\t** servp) and aClient (field serv) */\n486\t\tint\tusercnt[3];\t/* # of clients - visible, invisible, opers */\n487\t\tstruct\tServer\t*nexts, *prevs, *shnext;\n488\t\taClient\t*bcptr;\n489\t\taClient\t*maskedby;\t/* Pointer to server masking this server.\n490\t\t\t\t\t** Self if not masked, *NEVER* NULL. */\n491\t\tchar\tby[NICKLEN+1];\n492\t\tchar\tbyuid[UIDLEN + 1];\n493\t\tchar\tsid[SIDLEN + 1];/* The Server ID. */\n494\t\tchar\tverstr[11];\t/* server version, PATCHLEVEL format */\n495\t\tu_int\tsidhashv;\t/* Raw hash value. */\n496\t\taServer\t*sidhnext;\t/* Next server in the sid hash. */\n497\t\ttime_t\tlastload;\t/* penalty like counters, see s_serv.c\n498\t\t\t\t\t** should be in the local part, but.. */\n499\t\tint\tservers;\t/* Number of downlinks of this server. */\n500\t\taClient\t*left, *right;\t/* Left and right nodes in server tree. */\n501\t\taClient\t*down;\t\t/* Ptr to first downlink of this server. */\n502\t};\n503\t\n504\tstruct\tService\t{\n505\t\tchar\tnamebuf[HOSTLEN+1];\n506\t\tint\twants;\n507\t\tint\ttype;\n508\t\tchar\t*server;\n509\t\taServer\t*servp;\n510\t\tstruct\tService\t*nexts, *prevs;\n511\t\taClient\t*bcptr;\n512\t\tchar\tdist[HOSTLEN+1];\n513\t};\n514\t\n515\tstruct Client\t{\n516\t\tstruct\tClient *next,*prev, *hnext;\n517\t\tanUser\t*user;\t\t/* ...defined, if this is a User */\n518\t\taServer\t*serv;\t\t/* ...defined, if this is a server */\n519\t\taService *service;\n520\t\tu_int\thashv;\t\t/* raw hash value */\n521\t\tlong\tflags;\t\t/* client flags */\n522\t\taClient\t*from;\t\t/* == self, if Local Client, *NEVER* NULL! */\n523\t\tint\tfd;\t\t/* >= 0, for local clients */\n524\t\tint\thopcount;\t/* number of servers to this 0 = local */\n525\t\tshort\tstatus;\t\t/* Client type */\n526\t\tchar\t*name;\t\t/* Pointer to unique name of the client */\n527\t\tchar\tnamebuf[NICKLEN+1]; /* nick of the client */\n528\t\tchar\tusername[USERLEN+1]; /* username here now for auth stuff */\n529\t\tchar\t*info;\t\t/* Free form additional client information */\n530\t\t/*\n531\t\t** The following fields are allocated only for local clients\n532\t\t** (directly connected to *this* server with a socket.\n533\t\t** The first of them *MUST* be the \"count\"--it is the field\n534\t\t** to which the allocation is tied to! *Never* refer to\n535\t\t** these fields, if (from != self).\n536\t\t*/\n537\t\tint\tcount;\t\t/* Amount of data in buffer */\n538\t\tchar\tbuffer[BUFSIZE]; /* Incoming message buffer */\n539\t#ifdef\tZIP_LINKS\n540\t\taZdata\t*zip;\t\t/* zip data */\n541\t#endif\n542\t\tshort\tlastsq;\t\t/* # of 2k blocks when sendqueued called last*/\n543\t\tdbuf\tsendQ;\t\t/* Outgoing message queue--if socket full */\n544\t\tdbuf\trecvQ;\t\t/* Hold for data incoming yet to be parsed */\n545\t\tlong\tsendM;\t\t/* Statistics: protocol messages send */\n546\t\tlong\treceiveM;\t/* Statistics: protocol messages received */\n547\t\tunsigned long long\tsendB;\t\t/* Statistics: total bytes send */\n548\t\tunsigned long long\treceiveB;\t/* Statistics: total bytes received */\n549\t\ttime_t\tlasttime;\t/* last time we received data */\n550\t\ttime_t\tfirsttime;\t/* time client was created */\n551\t\ttime_t\tsince;\t\t/* last time we parsed something */\n552\t\taClient\t*acpt;\t\t/* listening client which we accepted from */\n553\t\tLink\t*confs;\t\t/* Configuration record associated */\n554\t\tint\tping;\n555\t\tint\tauthfd;\t\t/* fd for rfc931 authentication */\n556\t\tchar\t*auth;\n557\t\tu_short\tport;\t\t/* and the remote port# too :-) */\n558\t\tstruct\tIN_ADDR\tip;\t/* keep real ip# too */\n559\t\tstruct\thostent\t*hostp;\n560\t\tchar\tsockhost[HOSTLEN+1]; /* This is the host name from the socket\n561\t\t\t\t\t  ** and after which the connection was\n562\t\t\t\t\t  ** accepted.\n563\t\t\t\t\t  */\n564\t\tchar\tpasswd[PASSWDLEN+1];\n565\t\tchar\texitc;\n566\t\tchar\t*reason;\t/* additional exit message */\n567\t#ifdef XLINE\n568\t\t/* Those logically should be in anUser struct, but would be null for\n569\t\t** all remote users... so better waste two pointers for all local\n570\t\t** non-users than two pointers for all remote users. --B. */\n571\t\tchar\t*user2;\t/* 2nd param of USER */\n572\t\tchar\t*user3;\t/* 3rd param of USER */\n573\t#endif\n574\t\n575\t};\n576\t\n577\t#define\tCLIENT_LOCAL_SIZE sizeof(aClient)\n578\t#define\tCLIENT_REMOTE_SIZE offsetof(aClient,count)\n579\t\n580\t/*\n581\t * statistics structures\n582\t */\n583\tstruct\tstats {\n584\t\tu_int\tis_cl;\t/* number of client connections */\n585\t\tu_int\tis_sv;\t/* number of server connections */\n586\t\tu_int\tis_ni;\t/* connection but no idea who it was\n587\t\t\t\t * (can be a P: line that has been removed -krys) */\n588\t\tunsigned long long\tis_cbs;\t/* bytes sent to clients */\n589\t\tunsigned long long\tis_cbr;\t/* bytes received to clients */\n590\t\tunsigned long long\tis_sbs;\t/* bytes sent to servers */\n591\t\tunsigned long long\tis_sbr;\t/* bytes received to servers */\n592\t\ttime_t\tis_cti;\t/* time spent connected by clients */\n593\t\ttime_t\tis_sti;\t/* time spent connected by servers */\n594\t\tu_int\tis_ac;\t/* connections accepted */\n595\t\tu_int\tis_ref;\t/* accepts refused */\n596\t\tu_int\tis_unco; /* unknown commands */\n597\t\tu_int\tis_wrdi; /* command going in wrong direction */\n598\t\tu_int\tis_unpf; /* unknown prefix */\n599\t\tu_int\tis_empt; /* empty message */\n600\t\tu_int\tis_num;\t/* numeric message */\n601\t\tu_int\tis_kill; /* number of kills generated on collisions */\n602\t\tu_int\tis_save; /* number of saved clients */\n603\t\tu_int\tis_fake; /* MODE 'fakes' */\n604\t\tu_int\tis_reop; /* number of local reops */\n605\t\tu_int\tis_rreop; /* number of remote reops */\n606\t\tu_int\tis_asuc; /* successful auth requests */\n607\t\tu_int\tis_abad; /* bad auth requests */\n608\t\tu_int\tis_udpok;\t/* packets recv'd on udp port */\n609\t\tu_int\tis_udperr;\t/* packets recvfrom errors on udp port */\n610\t\tu_int\tis_udpdrop;\t/* packets recv'd but dropped on udp port */\n611\t\tu_int\tis_loc;\t/* local connections made */\n612\t\tu_int\tis_nosrv; /* user without server */\n613\t\tu_long\tis_wwcnt; /* number of nicks overwritten in whowas[] */\n614\t\tunsigned long long\tis_wwt;\t/* sum of elapsed time on when \n615\t\t\t\t\t\t** overwriting whowas[] */\n616\t\tu_long\tis_wwMt;  /* max elapsed time on when overwriting whowas[] */\n617\t\tu_long\tis_wwmt;  /* min elapsed time on when overwriting whowas[] */\n618\t\tu_long\tis_lkcnt; /* number of nicks overwritten in locked[] */\n619\t\tunsigned long long\tis_lkt;\t/* sum of elapsed time on when\n620\t\t\t\t\t\t** overwriting locked[]*/\n621\t\tu_long\tis_lkMt;  /* max elapsed time on when overwriting locked[] */\n622\t\tu_long\tis_lkmt;  /* min elapsed time on when overwriting locked[] */\n623\t\tu_int\tis_ckl;   /* calls to check_link() */\n624\t\tu_int\tis_cklQ;  /* rejected: SendQ too high */\n625\t\tu_int\tis_ckly;  /* rejected: link too young */\n626\t\tu_int\tis_cklno; /* rejected: \"flood\" */\n627\t\tu_int\tis_cklok; /* accepted */\n628\t\tu_int\tis_cklq;  /* accepted early */\n629\t};\n630\t\n631\t/* mode structure for channels */\n632\t\n633\tstruct\tSMode\t{\n634\t\tu_int\tmode;\n635\t\tint\tlimit;\n636\t\tchar\tkey[KEYLEN+1];\n637\t};\n638\t\n639\t/* Message table structure */\n640\t\n641\ttypedef\tint\t(*CmdHandler)(aClient *, aClient *, int, char **);\n642\t\n643\tstruct\tCmd {\n644\t\tCmdHandler\thandler;\t/* command */\n645\t\tu_int\t\tcount;\t\t/* total count */\n646\t\tu_int\t\trcount;\t\t/* remote count */\n647\t\tu_long\t\tbytes;\n648\t\tu_long\t\trbytes;\n649\t};\n650\t\n651\tstruct\tMessage\t{\n652\t\tchar\t*cmd;\n653\t\tint\tminparams;\n654\t\tint\tmaxparams;\n655\t\tstruct Cmd\thandlers[STAT_MAX];\n656\t};\n657\t\n658\t/* fd array structure */\n659\t\n660\tstruct\tfdarray\t{\n661\t\tint\tfd[MAXCONNECTIONS];\n662\t\tint\thighest;\n663\t};\n664\t\n665\t/* general link structure used for chains */\n666\t\n667\tstruct\tSLink\t{\n668\t\tstruct\tSLink\t*next;\n669\t\tunion {\n670\t\t\taClient\t*cptr;\n671\t\t\taChannel *chptr;\n672\t\t\taConfItem *aconf;\n673\t\t\taListItem *alist;\n674\t\t\tchar\t*cp;\n675\t\t\tint\ti;\n676\t\t} value;\n677\t\tint\tflags;\n678\t};\n679\t\n680\t/* link structure used for invites */\n681\t\n682\tstruct\tinvSLink\t{\n683\t\tstruct\tinvSLink\t*next;\n684\t\taChannel\t\t*chptr;\n685\t\tchar\t\t\t*who;\n686\t\tint\t\t\tflags;\n687\t};\n688\t\n689\t/* channel structure */\n690\t\n691\tstruct Channel\t{\n692\t\tstruct\tChannel *nextch, *prevch, *hnextch;\n693\t\tu_int\thashv;\t\t/* raw hash value */\n694\t\tMode\tmode;\n695\t\tchar\ttopic[TOPICLEN+1];\n696\t#ifdef TOPIC_WHO_TIME\n697\t\tchar\ttopic_nuh[BANLEN+1];\n698\t\ttime_t\ttopic_t;\n699\t#endif\n700\t\tint\tusers;\t\t/* current membership total */\n701\t\tLink\t*members;\t/* channel members */\n702\t\tLink\t*invites;\t/* outstanding invitations */\n703\t\tLink\t*mlist;\t\t/* list of extended modes: +b/+e/+I */\n704\t\tLink\t*clist;\t\t/* list of local! connections which are members */\n705\t\ttime_t\thistory;\t/* channel history (aka channel delay) */\n706\t\ttime_t\treop;\t\t/* server reop stamp for !channels */\n707\t#ifdef JAPANESE\n708\t\tint flags;\n709\t#endif\n710\t\tchar\tchname[1];\n711\t};\n712\t\n713\t/*\n714\t** Channel Related macros follow\n715\t*/\n716\t\n717\t/* Channel related flags */\n718\t\n719\t#define\tCHFL_UNIQOP     0x0001 /* Channel creator */\n720\t#define\tCHFL_CHANOP     0x0002 /* Channel operator */\n721\t#define\tCHFL_VOICE      0x0004 /* the power to speak */\n722\t#define\tCHFL_BAN\t0x0008 /* ban channel flag */\n723\t#define\tCHFL_EXCEPTION\t0x0010 /* exception channel flag */\n724\t#define\tCHFL_INVITE\t0x0020 /* invite channel flag */\n725\t#define\tCHFL_REOPLIST\t0x0040 /* reoplist channel flag */\n726\t\n727\t/* Channel Visibility macros */\n728\t\n729\t#define\tMODE_UNIQOP\tCHFL_UNIQOP\n730\t#define\tMODE_CHANOP\tCHFL_CHANOP\n731\t#define\tMODE_VOICE\tCHFL_VOICE\n732\t#define\tMODE_PRIVATE\t0x00008\n733\t#define\tMODE_SECRET\t0x00010\n734\t#define\tMODE_MODERATED  0x00020\n735\t#define\tMODE_TOPICLIMIT 0x00040\n736\t#define\tMODE_INVITEONLY 0x00080\n737\t#define\tMODE_NOPRIVMSGS 0x00100\n738\t#define\tMODE_KEY\t0x00200\n739\t#define\tMODE_BAN\t0x00400\n740\t#define\tMODE_LIMIT\t0x00800\n741\t#define\tMODE_ANONYMOUS\t0x01000\n742\t#define\tMODE_QUIET\t0x02000\n743\t#define\tMODE_EXCEPTION\t0x04000\n744\t#define\tMODE_INVITE\t0x08000\n745\t#define\tMODE_REOP\t0x10000\n746\t#define\tMODE_REOPLIST\t0x20000\n747\t#define\tMODE_FLAGS\t0x3ffff\n748\t/*\n749\t * mode flags which take another parameter (With PARAmeterS)\n750\t */\n751\t#define\tMODE_WPARAS\t(MODE_UNIQOP|MODE_CHANOP|MODE_VOICE|MODE_BAN|MODE_KEY\\\n752\t\t\t\t |MODE_LIMIT|MODE_INVITE|MODE_EXCEPTION|MODE_REOPLIST)\n753\t/*\n754\t * Undefined here, these are used in conjunction with the above modes in\n755\t * the source.\n756\t#define\tMODE_DEL       0x40000000\n757\t#define\tMODE_ADD       0x80000000\n758\t */\n759\t\n760\t#define\tHoldChannel(x)\t\t(!(x))\n761\t/* name invisible */\n762\t#define\tSecretChannel(x)\t((x) && ((x)->mode.mode & MODE_SECRET))\n763\t/* channel not shown but names are */\n764\t#define\tHiddenChannel(x)\t((x) && ((x)->mode.mode & MODE_PRIVATE))\n765\t/* channel visible */\n766\t#define\tShowChannel(v,c)\t(PubChannel(c) || IsMember((v),(c)))\n767\t#define\tIsAnonymous(c)\t\t((c) && ((c)->mode.mode & MODE_ANONYMOUS))\n768\t#define\tPubChannel(x)\t\t((!x) || ((x)->mode.mode &\\\n769\t\t\t\t\t (MODE_PRIVATE | MODE_SECRET)) == 0)\n770\t\n771\t/*\n772\t#define\tIsMember(u, c)\t\t(assert(*(c)->chname != '\\0'), find_user_link((c)->members, u) ? 1 : 0)\n773\t#define\tIsMember(u, c)\t\t(find_user_link((c)->members, u) ? 1 : 0)\n774\t*/\n775\t#define       IsMember(u, c)          (u && (u)->user && \\\n776\t\t\t       find_channel_link((u)->user->channel, c) ? 1 : 0)\n777\t# define\tIsChannelName(n)\t((n) && (*(n) == '#' || *(n) == '&' ||\\\n778\t\t\t\t\t\t*(n) == '+' || \\\n779\t\t\t\t\t\t(*(n) == '!' && cid_ok(n, CHIDLEN))))\n780\t#define\tIsQuiet(x)\t\t((x)->mode.mode & MODE_QUIET)\n781\t#define\tUseModes(n)\t\t((n) && (*(n) == '#' || *(n) == '&' || \\\n782\t\t\t\t\t\t *(n) == '!'))\n783\t\n784\t/* Misc macros */\n785\t\n786\t#define\tBadPtr(x) (!(x) || (*(x) == '\\0'))\n787\t#define\tBadTo(x) (BadPtr((x)) ? \"*\" : (x))\n788\t\n789\t#define\tMyConnect(x)\t\t\t((x)->fd >= 0)\n790\t#define\tMyClient(x)\t\t\t(MyConnect(x) && IsClient(x))\n791\t#define\tMyPerson(x)\t\t\t(MyConnect(x) && IsPerson(x))\n792\t#define\tMyOper(x)\t\t\t(MyConnect(x) && IsOper(x))\n793\t#define\tMyService(x)\t\t\t(MyConnect(x) && IsService(x))\n794\t#define\tME\tme.name\n795\t#define\tMES\tme.serv->sid\n796\t\n797\t#define\tGotDependantClient(x)\t(x->prev &&\t\t\t\t\\\n798\t\t\t \t\t ((IsRegisteredUser(x->prev) &&\t\t\\\n799\t\t\t\t\t  x->prev->user->servp == x->serv) ||\t\\\n800\t\t\t\t\t  (IsService(x->prev) &&\t\t\\\n801\t\t\t\t\t  x->prev->service->servp == x->serv)))\n802\t\n803\t#define\tIsMasked(x)\t\t(x && x->serv && x->serv->maskedby != x)\n804\t\n805\t#define IsSplit()\t\t(iconf.split > 0)\n806\t\n807\ttypedef\tstruct\t{\n808\t\tu_long\tis_user[2];\t/* users, non[0] invis and invis[1] */\n809\t\tu_long\tis_serv;\t/* servers */\n810\t\tu_long\tis_eobservers;  /* number of servers which sent EOB */\n811\t\tu_long\tis_masked;\t/* masked servers. */\n812\t\tu_long\tis_service;\t/* services */\n813\t\tu_long\tis_chan;\t/* channels */\n814\t\tu_long\tis_chanmem;\n815\t\tu_long\tis_chanusers;\t/* channels users */\n816\t\tu_long\tis_hchan;\t/* channels in history */\n817\t\tu_long\tis_hchanmem;\n818\t\tu_long\tis_cchan;\t/* channels in cache */\n819\t\tu_long\tis_cchanmem;\n820\t\tu_long\tis_away;\t/* away sets */\n821\t\tu_long\tis_awaymem;\n822\t\tu_long\tis_oper;\t/* opers */\n823\t\tu_long\tis_bans;\t/* bans */\n824\t\tu_long\tis_banmem;\n825\t\tu_long\tis_invite;\t/* invites */\n826\t\tu_long\tis_class;\t/* classes */\n827\t\tu_long\tis_conf;\t/* conf lines */\n828\t\tu_long\tis_confmem;\n829\t\tu_long\tis_conflink;\t/* attached conf lines */\n830\t\tu_long\tis_myclnt;\t/* local clients */\n831\t\tu_long\tis_myserv;\t/* local servers */\n832\t\tu_long\tis_myservice;\t/* local services */\n833\t\tu_long\tis_unknown;\t/* unknown (local) connections */\n834\t\tu_long\tis_wwusers;\t/* users kept for whowas[] */\n835\t\tu_long\tis_wwaways;\t/* aways in users in whowas[] */\n836\t\tu_long\tis_wwawaysmem;\n837\t\tu_long\tis_wwuwas;\t/* uwas links */\n838\t\tu_long\tis_localc;\t/* local items (serv+service+client+..) */\n839\t\tu_long\tis_remc;\t/* remote clients */\n840\t\tu_long\tis_users;\t/* user structs */\n841\t\tu_long\tis_useri;\t/* user invites */\n842\t\tu_long\tis_userc;\t/* user links to channels */\n843\t\tu_long\tis_auth;\t/* OTHER ident reply block */\n844\t\tu_long\tis_authmem;\n845\t\tu_int\tis_dbuf;\t/* number of dbuf allocated (originally) */\n846\t\tu_int\tis_dbufnow;\t/* number of dbuf allocated */\n847\t\tu_int\tis_dbufuse;\t/* number of dbuf in use */\n848\t\tu_int\tis_dbufmin;\t/* min number of dbuf in use */\n849\t\tu_int\tis_dbufmax;\t/* max number of dbuf in use */\n850\t\tu_int\tis_dbufmore;\t/* how many times we increased the bufferpool*/\n851\t\tu_long\tis_m_users;\t/* maximum users connected */\n852\t\ttime_t\tis_m_users_t;\t/* timestamp of last maximum users */\n853\t\tu_long\tis_m_serv;\t/* maximum servers connected */\n854\t\tu_long\tis_m_service;\t/* maximum services connected */\n855\t\tu_long\tis_m_myclnt;\t/* maximum local clients */\n856\t\ttime_t\tis_m_myclnt_t;\t/* timestamp of last maximum local clients */\n857\t\tu_long\tis_m_myserv;\t/* maximum local servers */\n858\t\tu_long\tis_m_myservice;\t/* maximum local services */\n859\t\tu_long\tis_l_myclnt;\t/* last local user count */\n860\t\ttime_t\tis_l_myclnt_t;\t/* timestamp for last count */\n861\t#ifdef DELAY_CLOSE\n862\t\tu_long\tis_delayclose;\t/* number of fds that got delayed close() */\n863\t\tu_int\tis_delayclosewait;\t/* number of fds that wait for delayed close() */\n864\t#endif\n865\t} istat_t;\n866\t\n867\t/* String manipulation macros */\n868\t\n869\t/* strncopynt --> strncpyzt to avoid confusion, sematics changed\n870\t   N must be now the number of bytes in the array --msa */\n871\t#define\tstrncpyzt(x, y, N) do{(void)strncpy(x,y,N);x[N-1]='\\0';}while(0)\n872\t#define\tStrEq(x,y)\t(!strcmp((x),(y)))\n873\t\n874\t/* used in SetMode() in channel.c and m_umode() in s_msg.c */\n875\t\n876\t#define\tMODE_NULL      0\n877\t#define\tMODE_ADD       0x40000000\n878\t#define\tMODE_DEL       0x20000000\n879\t\n880\t/* return values for hunt_server() */\n881\t\n882\t#define\tHUNTED_NOSUCH\t(-1)\t/* if the hunted server is not found */\n883\t#define\tHUNTED_ISME\t0\t/* if this server should execute the command */\n884\t#define\tHUNTED_PASS\t1\t/* if message passed onwards successfully */\n885\t\n886\t/* used when sending to $#mask or $$mask */\n887\t\n888\t#define\tMATCH_SERVER\t1\n889\t#define\tMATCH_HOST\t2\n890\t\n891\t/* used for sendto_serv */\n892\t\n893\t#define\tSV_OLD\t\t0x0000\n894\t#define SV_UID\t\t0x0001\n895\t#define\tSV_2_11\t\tSV_UID\n896\t\n897\t/* used for sendto_flag */\n898\t\n899\ttypedef\tstruct\t{\n900\t\tint\tsvc_chan;\n901\t\tchar\t*svc_chname;\n902\t\tstruct\tChannel\t*svc_ptr;\n903\t\tint\tfd;\n904\t}\tSChan;\n905\t\n906\ttypedef enum ServerChannels {\n907\t\tSCH_ERROR,\n908\t\tSCH_NOTICE,\n909\t\tSCH_KILL,\n910\t\tSCH_CHAN,\n911\t\tSCH_NUM,\n912\t\tSCH_SERVER,\n913\t\tSCH_HASH,\n914\t\tSCH_LOCAL,\n915\t\tSCH_SERVICE,\n916\t\tSCH_DEBUG,\n917\t\tSCH_AUTH,\n918\t\tSCH_SAVE,\n919\t\tSCH_WALLOP,\n920\t#ifdef CLIENTS_CHANNEL\n921\t\tSCH_CLIENT,\n922\t#endif\n923\t\tSCH_OPER,\n924\t\tSCH_MAX\t\n925\t} ServerChannels;\n926\t\n927\t/* used for async dns values */\n928\t\n929\t#define\tASYNC_NONE\t(-1)\n930\t#define\tASYNC_CLIENT\t0\n931\t#define\tASYNC_CONNECT\t1\n932\t#define\tASYNC_CONF\t2\n933\t#define\tASYNC_SERVER\t3\n934\t\n935\t/* Client exit codes for log file */\n936\t#define EXITC_UNDEF\t'-'\t/* unregistered client */\n937\t#define EXITC_REG\t'0'\t/* normal exit */\n938\t#define EXITC_AUTHFAIL\t'A'\t/* Authentication failure (iauth problem) */\n939\t#define EXITC_AUTHTOUT\t'a'\t/* Authentication time out */\n940\t#define EXITC_CLONE\t'C'\t/* CLONE_CHECK */\n941\t#define EXITC_DIE\t'd'\t/* server died */\n942\t#define EXITC_DEAD\t'D'\t/* socket died */\n943\t#define EXITC_ERROR\t'E'\t/* socket error */\n944\t#define EXITC_FLOOD\t'F'\t/* client flooding */\n945\t#define EXITC_FAILURE\t'f'\t/* connect failure */\n946\t#define EXITC_GHMAX\t'G'\t/* global clients per host max limit */\n947\t#define EXITC_GUHMAX\t'g'\t/* global clients per user@host max limit */\n948\t#define EXITC_NOILINE\t'I'\t/* No matching I:line */\n949\t#define EXITC_KLINE\t'k'\t/* K-lined */\n950\t#define EXITC_KILL\t'K'\t/* KILLed */\n951\t#define EXITC_LHMAX\t'L'\t/* local clients per host max limit */\n952\t#define EXITC_LUHMAX\t'l'\t/* local clients per user@host max limit */\n953\t#define EXITC_MBUF\t'M'\t/* mem alloc error */\n954\t#define EXITC_PING\t'P'\t/* ping timeout */\n955\t#define EXITC_BADPASS\t'p'\t/* bad password */\n956\t#define EXITC_SENDQ\t'Q'\t/* send queue exceeded */\n957\t#define EXITC_REF\t'R'\t/* Refused */\n958\t#ifdef TKLINE\n959\t#define EXITC_TKLINE\t't'\t/* tkline */\n960\t#endif\n961\t#define EXITC_AREF\t'U'\t/* Unauthorized by iauth */\n962\t#define EXITC_AREFQ\t'u'\t/* Unauthorized by iauth, be quiet */\n963\t#define EXITC_VIRUS\t'v'\t/* joined a channel used by PrettyPark virus */\n964\t#ifdef XLINE\n965\t#define EXITC_XLINE\t'X'\t/* Forbidden GECOS */\n966\t#endif\n967\t#define EXITC_YLINEMAX\t'Y'\t/* Y:line max clients limit */\n968\t\n969\t/* eXternal authentication slave OPTions */\n970\t#define\tXOPT_REQUIRED\t0x01\t/* require authentication be done by iauth */\n971\t#define\tXOPT_NOTIMEOUT\t0x02\t/* disallow iauth time outs */\n972\t#define XOPT_EXTWAIT\t0x10\t/* extend registration ping timeout */\n973\t#define XOPT_EARLYPARSE\t0x20\t/* allow early parsing and send USER/PASS\n974\t\t\t\t\t   information to iauth */\n975\t\n976\t/* misc defines */\n977\t\n978\t#define\tFLUSH_BUFFER\t-2\n979\t#define\tUTMP\t\t\"/etc/utmp\"\n980\t#define\tCOMMA\t\t\",\"\n981\t\n982\t#define\tSAP\tstruct SOCKADDR *\n983\t\n984\t/* safety checks */\n985\t#if ! (UIDLEN <= NICKLEN)\n986\t#   error UIDLEN must not be bigger than NICKLEN\n987\t#endif\n988\t#if ! (UIDLEN > SIDLEN)\n989\t#   error UIDLEN must be bigger than SIDLEN\n990\t#endif\n991\t#if (NICKLEN < LOCALNICKLEN)\n992\t#   error LOCALNICKLEN must not be bigger than NICKLEN\n993\t#endif\n994\t\n995\t/* WHO parameter flags */\n996\t#define WHO_FLAG_OPERS_ONLY\t0x0001\n997\t#define WHO_FLAG_CHANNEL\t0x0002\n998\t#define WHO_FLAG_HOP\t\t0x0004\n999\t#define WHO_FLAG_FLAGS\t\t0x0008\n1000\t#define WHO_FLAG_HOST\t\t0x0010\n1001\t#define WHO_FLAG_IP\t\t\t0x0020\n1002\t#define WHO_FLAG_IDLE\t\t0x0040\n1003\t#define WHO_FLAG_NICK\t\t0x0080\n1004\t#define WHO_FLAG_INFO\t\t0x0100\n1005\t#define WHO_FLAG_SERVER\t\t0x0200\n1006\t#define WHO_FLAG_TOKEN\t\t0x0400\n1007\t#define WHO_FLAG_USER\t\t0x0800\n1008\t#define WHO_FLAG_ACCOUNT\t0x1000\n1009\t#define WHO_FLAG_OP_LEVEL\t0x2000\n1010\t#define WHO_FLAG_SID\t\t0x4000\n1011\t#define WHO_FLAG_UID\t\t0x8000\n1012\t\n1013\tstruct who_opts\n1014\t{\n1015\t\tint flags;\n1016\t\tconst char *token;\n1017\t};\n1018\t\n1019\t/*\n1020\t * base for channel IDs and UIDs\n1021\t */\n1022\t#define CHIDNB 36\n1023\t\n1024\t\n1025\t/* Defines used for SET command */\n1026\t#define TSET_ACONNECT 0x001\n1027\t#define TSET_POOLSIZE 0x002\n1028\t#define TSET_CACCEPT 0x004\n1029\t#define TSET_SHOWALL (int) ~0\n1030\t\n1031\t/* Runtime configuration structure */\n1032\ttypedef struct\n1033\t{\n1034\t\tint aconnect;\t/* 0 - OFF 1 - ON */\n1035\t\t/* standalone splitmode is -1 not 3 */\n1036\t\tint split;\t/* -1: standalone, 0: no, >0 yes (and since when) */\n1037\t\tint split_minservers;\n1038\t\tint split_minusers;\n1039\t\tint caccept;\t/* 0 - OFF 1 - ON 2 - SPLIT */\n1040\t} iconf_t;\n1041\t\n1042\t/* O:line flags, used also in is_allowed() */\n1043\t#define ACL_LOCOP\t\t0x00001\n1044\t#define ACL_KILLLOCAL\t\t0x00002\n1045\t#define ACL_KILLREMOTE\t\t0x00004\n1046\t#define ACL_KILL\t\t(ACL_KILLLOCAL|ACL_KILLREMOTE)\n1047\t#define ACL_SQUITLOCAL\t\t0x00008\n1048\t#define ACL_SQUITREMOTE\t\t0x00010\n1049\t#define ACL_SQUIT\t\t(ACL_SQUITLOCAL|ACL_SQUITREMOTE)\n1050\t#define ACL_CONNECTLOCAL\t0x00020\n1051\t#define ACL_CONNECTREMOTE\t0x00040\n1052\t#define ACL_CONNECT\t\t(ACL_CONNECTLOCAL|ACL_CONNECTREMOTE)\n1053\t#define ACL_CLOSE\t\t0x00080\n1054\t#define ACL_HAZH\t\t0x00100\n1055\t#define ACL_DNS\t\t\t0x00200\n1056\t#define ACL_REHASH\t\t0x00400\n1057\t#define ACL_RESTART\t\t0x00800\n1058\t#define ACL_DIE\t\t\t0x01000\n1059\t#define ACL_SET\t\t\t0x02000\n1060\t#define ACL_TKLINE\t\t0x04000\n1061\t#define ACL_UNTKLINE\t\tACL_TKLINE\n1062\t#define ACL_CLIENTS\t\t0x08000\n1063\t#define ACL_CANFLOOD\t\t0x10000\n1064\t#define ACL_NOPENALTY\t\t0x20000\n1065\t#define ACL_TRACE\t\t0x40000\n1066\t#define ACL_KLINE\t\t0x80000\n1067\t#define ACL_SIDTRACE\t\t0x100000\n1068\t\n1069\t#define ACL_ALL_REMOTE\t\t(ACL_KILLREMOTE|ACL_SQUITREMOTE|ACL_CONNECTREMOTE)\n1070\t#define ACL_ALL\t\t\t0x1FFFFF\n1071\t\n1072\t#ifdef CLIENTS_CHANNEL\n1073\t/* information scope of &CLIENTS channel. */\n1074\t#define CCL_CONN     0x01\t/* connections */\n1075\t#define CCL_CONNINFO 0x02\t/* if connections, then with realname */\n1076\t#define CCL_QUIT     0x04\t/* quits */\n1077\t#define CCL_QUITINFO 0x08\t/* if quits, then with quit message */\n1078\t#define CCL_NICK     0x10\t/* nick changes */\n1079\t#endif\n1080\t\n1081\t"}]},"uuid":"f1a5caaf-17fc-46b2-9c4d-2be6c34ddc22","timestamp":"2026-06-04T15:19:38.973Z","sourceToolAssistantUUID":"c8c3df29-3cfb-4b40-879c-461e47becda6","userType":"external","entrypoint":"cli","cwd":"/home/xe/code/xeiaso.net/ircd.rs","sessionId":"6a1eb242-da3f-4181-9b05-27c027148ad5","version":"2.1.162","gitBranch":"master"}
