1 /*
2  * vars.c: All the dealing of the irc variables are handled here.
3  *
4  *
5  * Written By Michael Sandrof
6  *
7  * Copyright(c) 1990
8  *
9  * See the COPYRIGHT file, or do a HELP IRCII COPYRIGHT
10  */
11 
12 
13 #include "irc.h"
14 static char cvsrevision[] = "$Id: vars.c 344 2013-08-17 05:42:09Z tcava $";
15 CVS_REVISION(vars_c)
16 #include "struct.h"
17 
18 #include "status.h"
19 #include "window.h"
20 #include "lastlog.h"
21 #include "log.h"
22 #include "encrypt.h"
23 #include "history.h"
24 #include "notify.h"
25 #include "vars.h"
26 #include "input.h"
27 #include "ircaux.h"
28 #include "who.h"
29 #include "ircterm.h"
30 #include "output.h"
31 #include "screen.h"
32 #include "list.h"
33 #include "server.h"
34 #include "window.h"
35 #include "misc.h"
36 #include "stack.h"
37 #include "alist.h"
38 #include "hash2.h"
39 #include "cset.h"
40 #include "module.h"
41 #include "tcl_bx.h"
42 void add_tcl_vars(void);
43 
44 
45 #ifdef WANT_CD
46 #include "cdrom.h"
47 #endif
48 #ifdef TRANSLATE
49 #include "translat.h"
50 #endif
51 #define MAIN_SOURCE
52 #include "modval.h"
53 
54 #if defined(WINNT)
55 #include <windows.h>
56 extern DWORD gdwPlatform;
57 #endif
58 
59 char	*var_settings[] =
60 {
61 	"OFF", "ON", "TOGGLE"
62 };
63 
64 
65 extern	char	*auto_str;
66 
67 extern  Screen	*screen_list;
68 
69 extern  struct	in_addr nat_address;
70 extern	int	use_nat_address;
71 
72 int	loading_global = 0;
73 
74 
75 enum VAR_TYPES	find_variable (char *, int *);
76 static	void	exec_warning (Window *, char *, int);
77 static	void	eight_bit_characters (Window *, char *, int);
78 static	void	set_realname (Window *, char *, int);
79 static	void	set_numeric_string (Window *, char *, int);
80 static	void	set_user_mode (Window *, char *, int);
81 static	void	set_ov_mode (Window *, char *, int);
82 static	void	set_away_time (Window *, char *, int);
83 static	void	reinit_screen (Window *, char *, int);
84 	void	reinit_status (Window *, char *, int);
85 static	void	set_clock_format (Window *, char *, int);
86 	void	create_fsets (Window *, int);
87 	void	setup_ov_mode (int, int, int);
88 	void	convert_swatch (Window *, char *, int);
89 	void	toggle_reverse_status(Window *, char *, int);
90 static	void	set_dcc_timeout(Window *, char *, int);
91 	void	BX_set_scrollback_size (Window *, char *, int);
92 static	void	set_use_socks(Window *, char *, int);
93 
94 static	void	set_mangle_inbound (Window *, char *, int);
95 static	void	set_mangle_outbound (Window *, char *, int);
96 static	void	set_mangle_logfiles (Window *, char *, int);
97 static	void	set_mangle_operlog (Window *, char *, int);
98 static	void	set_nat_address (Window *, char *, int);
99 extern	void	debug_window (Window *, char *, int);
100 
101 extern	void	set_detach_on_hup (Window *, char *, int);
102 
103 /*
104  * irc_variable: all the irc variables used.  Note that the integer and
105  * boolean defaults are set here, which the string default value are set in
106  * the init_variables() procedure
107  */
108 
109 static	IrcVariable irc_variable[] =
110 {
111 	{ "AINV",0,			INT_TYPE_VAR,	DEFAULT_AINV, NULL, NULL, 0, VIF_BITCHX },
112 	{ "ALTNICK",0,			STR_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
113 	{ "ALT_CHARSET", 0,		BOOL_TYPE_VAR,	DEFAULT_ALT_CHARSET, NULL, NULL, 0, VIF_BITCHX },
114 	{ "ALWAYS_SPLIT_BIGGEST",0,	BOOL_TYPE_VAR,	DEFAULT_ALWAYS_SPLIT_BIGGEST, NULL, NULL, 0, 0 },
115 	{ "ANNOY_KICK",0,		BOOL_TYPE_VAR,	DEFAULT_ANNOY_KICK, NULL, NULL, 0, VIF_BITCHX },
116 	{ "AOP",0,			BOOL_TYPE_VAR,	DEFAULT_AOP_VAR, NULL, NULL, 0, VIF_BITCHX  },
117 	{ "APPEND_LOG",0,		BOOL_TYPE_VAR,	1, NULL, NULL, 0, VIF_BITCHX },
118 
119 	{ "AUTOKICK_ON_VERSION",0,	BOOL_TYPE_VAR,  0, NULL, NULL, 0, VIF_BITCHX },
120 	{ "AUTO_AWAY",0,		BOOL_TYPE_VAR,  DEFAULT_AUTO_AWAY, NULL, NULL, 0, VIF_BITCHX },
121 	{ "AUTO_AWAY_TIME",0,		INT_TYPE_VAR,	DEFAULT_AUTO_AWAY_TIME, NULL, set_away_time, 0, VIF_BITCHX  },
122 	{ "AUTO_JOIN_ON_INVITE",0,	BOOL_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
123 	{ "AUTO_LIMIT",0,		INT_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
124 	{ "AUTO_NSLOOKUP",0,		BOOL_TYPE_VAR,  DEFAULT_AUTO_NSLOOKUP, NULL, NULL, 0, VIF_BITCHX  },
125 	{ "AUTO_RECONNECT",0,		BOOL_TYPE_VAR,	DEFAULT_AUTO_RECONNECT, NULL, NULL, 0, VIF_BITCHX },
126 	{ "AUTO_REJOIN",0,		INT_TYPE_VAR,   DEFAULT_AUTO_REJOIN, NULL, NULL, 0, VIF_BITCHX  },
127 	{ "AUTO_RESPONSE",0,		BOOL_TYPE_VAR,	1, NULL, NULL, 0, VIF_BITCHX },
128 	{ "AUTO_RESPONSE_STR",0,	STR_TYPE_VAR,	0, NULL, reinit_autoresponse, 0, VIF_BITCHX },
129 	{ "AUTO_UNBAN",0,		INT_TYPE_VAR,	DEFAULT_AUTO_UNBAN, NULL, NULL, 0, VIF_BITCHX },
130 	{ "AUTO_UNMARK_AWAY",0,		BOOL_TYPE_VAR,	DEFAULT_AUTO_UNMARK_AWAY, NULL, NULL, 0, 0 },
131 	{ "AUTO_WHOWAS",0,		BOOL_TYPE_VAR,	DEFAULT_AUTO_WHOWAS, NULL, NULL, 0, 0 },
132 	{ "BANTIME", 0, 		INT_TYPE_VAR,	DEFAULT_BANTIME, NULL, NULL, 0, VIF_BITCHX },
133 	{ "BEEP",0,			BOOL_TYPE_VAR,	DEFAULT_BEEP, NULL, NULL, 0, VIF_BITCHX },
134 	{ "BEEP_ALWAYS",0,		BOOL_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
135 	{ "BEEP_MAX",0,			INT_TYPE_VAR,	DEFAULT_BEEP_MAX, NULL, NULL, 0, 0 },
136 	{ "BEEP_ON_MSG",0,		STR_TYPE_VAR,	0, NULL, set_beep_on_msg, 0, VIF_BITCHX },
137 	{ "BEEP_WHEN_AWAY",0,		INT_TYPE_VAR,	DEFAULT_BEEP_WHEN_AWAY, NULL, NULL, 0, VIF_BITCHX },
138 	{ "BITCH",0,			BOOL_TYPE_VAR,  0, NULL, NULL, 0, VIF_BITCHX },
139 	{ "BITCHX_HELP",0,		STR_TYPE_VAR,   0, NULL, NULL, 0, VIF_BITCHX },
140 	{ "BLINK_VIDEO",0,		BOOL_TYPE_VAR,	DEFAULT_BLINK_VIDEO, NULL, NULL, 0, 0 },
141 	{ "BOLD_VIDEO",0,		BOOL_TYPE_VAR,	DEFAULT_BOLD_VIDEO, NULL, NULL, 0, 0 },
142 	{ "BOT_LOG",0,			BOOL_TYPE_VAR,	1, NULL, NULL, 0, VIF_BITCHX  },
143 	{ "BOT_LOGFILE",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX  },
144 	{ "BOT_MODE",0,			BOOL_TYPE_VAR,	0, NULL, NULL, 0, 0 },
145 	{ "BOT_PASSWD",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, 0 },
146 	{ "BOT_RETURN",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, 0 },
147 	{ "BOT_TCL",0,			BOOL_TYPE_VAR,	0, NULL, NULL, 0, 0 },
148 	{ "CDCC",0,			BOOL_TYPE_VAR,	DEFAULT_CDCC, NULL, NULL, 0, 0 },
149 	{ "CDCC_FLOOD_AFTER",0,		INT_TYPE_VAR,	DEFAULT_CDCC_FLOOD_AFTER, NULL, NULL, 0, VIF_BITCHX  },
150 	{ "CDCC_FLOOD_RATE",0,		INT_TYPE_VAR,	DEFAULT_CDCC_FLOOD_RATE,NULL, NULL, 0, VIF_BITCHX  },
151 	{ "CDCC_PROMPT",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
152 	{ "CDCC_SECURITY",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX  },
153 #ifdef WANT_CD
154 	{ "CD_DEVICE",0,		STR_TYPE_VAR,	0, NULL, set_cd_device, 0, VIF_BITCHX },
155 #else
156 	{ "CD_DEVICE",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
157 #endif
158 	{ "CHANGE_NICK_ON_KILL",0,	BOOL_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
159 	{ "CHANMODE",0,			STR_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
160 	{ "CHANNEL_NAME_WIDTH",0,	INT_TYPE_VAR,	DEFAULT_CHANNEL_NAME_WIDTH, NULL, BX_update_all_status, 0, 0 },
161 	{ "CHECK_BEEP_USERS",0,		BOOL_TYPE_VAR,  0, NULL, NULL, 0, 0 },
162 	{ "CLIENT_INFORMATION",0,	STR_TYPE_VAR,	0, NULL, NULL, 0, 0 },
163 	{ "CLOAK",0,			INT_TYPE_VAR,	DEFAULT_CLOAK, NULL, BX_update_all_status, 0, VIF_BITCHX },
164 	{ "CLOCK",0,			BOOL_TYPE_VAR,	DEFAULT_CLOCK, NULL, BX_update_all_status, 0, 0 },
165 	{ "CLOCK_24HOUR",0,		BOOL_TYPE_VAR,	DEFAULT_CLOCK_24HOUR, NULL, reset_clock, 0, VIF_BITCHX },
166 	{ "CLOCK_FORMAT",0,		STR_TYPE_VAR,	0, NULL, set_clock_format, 0, 0 },
167 	{ "CLONE_CHECK",0,		INT_TYPE_VAR,	0, NULL, NULL, 0, 0 },
168 	{ "CLONE_COUNT",0,		INT_TYPE_VAR,	0, NULL, NULL, 0, 0 },
169 	{ "CMDCHARS",0,			STR_TYPE_VAR,	0, NULL, NULL, 0, 0 },
170 	{ "COLOR",0,			BOOL_TYPE_VAR,	1, NULL, NULL, 0, 0 },
171 	{ "COMMAND_MODE",0,		BOOL_TYPE_VAR,	DEFAULT_COMMAND_MODE, NULL, NULL, 0, 0 },
172 	{ "COMMENT_BREAKAGE",0,		BOOL_TYPE_VAR,	0, NULL, NULL, 0, 0 },
173 	{ "COMPRESS_MODES",0,		BOOL_TYPE_VAR,	0, NULL, NULL, 0, 0 },
174 	{ "CONNECT_DELAY",0,		INT_TYPE_VAR,	DEFAULT_CONNECT_DELAY, NULL, NULL, 0, VIF_BITCHX },
175 	{ "CONNECT_TIMEOUT",0,		INT_TYPE_VAR,	DEFAULT_CONNECT_TIMEOUT, NULL, NULL, 0, 0 },
176 	{ "CONTINUED_LINE",0,		STR_TYPE_VAR,	0, NULL, BX_set_continued_lines, 0, 0 },
177 	{ "CPU_SAVER_AFTER",0,		INT_TYPE_VAR,	DEFAULT_CPU_SAVER_AFTER, NULL, NULL, 0, VIF_BITCHX },
178 	{ "CPU_SAVER_EVERY",0,		INT_TYPE_VAR,	DEFAULT_CPU_SAVER_EVERY, NULL, NULL, 0, VIF_BITCHX },
179 	{ "CTCP_DELAY",0,		INT_TYPE_VAR,	DEFAULT_CTCP_DELAY, NULL, NULL, 0, VIF_BITCHX },
180 	{ "CTCP_FLOOD_AFTER",0,		INT_TYPE_VAR,	DEFAULT_CTCP_FLOOD_AFTER, NULL, NULL, 0, VIF_BITCHX },
181 	{ "CTCP_FLOOD_BAN",0,		BOOL_TYPE_VAR,	DEFAULT_CTCP_FLOOD_BAN, NULL, NULL, 0, 0 },
182 	{ "CTCP_FLOOD_PROTECTION",0,	BOOL_TYPE_VAR,	DEFAULT_CTCP_FLOOD_PROTECTION, NULL, NULL, 0, 0 },
183 	{ "CTCP_FLOOD_RATE",0,		INT_TYPE_VAR,	DEFAULT_CTCP_FLOOD_RATE, NULL, NULL, 0, VIF_BITCHX},
184 	{ "CTCP_VERBOSE",0,		BOOL_TYPE_VAR,	DEFAULT_VERBOSE_CTCP, NULL, NULL, 0, 0 },
185 	{ "CTOOLZ_DIR",0,		STR_TYPE_VAR,   0, NULL, NULL, 0, VIF_BITCHX },
186 	{ "DCC_AUTOGET",0,		BOOL_TYPE_VAR,	DEFAULT_DCC_AUTOGET, NULL, NULL, 0, VIF_BITCHX },
187 	{ "DCC_AUTORENAME",0,		BOOL_TYPE_VAR,	DEFAULT_DCC_AUTORENAME, NULL, NULL, 0, VIF_BITCHX },
188 	{ "DCC_AUTORESUME",0,		BOOL_TYPE_VAR,	DEFAULT_DCC_AUTORESUME, NULL, NULL, 0, VIF_BITCHX },
189 	{ "DCC_BAR_TYPE",0,		INT_TYPE_VAR,	DEFAULT_DCC_BAR_TYPE, NULL, NULL, 0, VIF_BITCHX },
190 	{ "DCC_BLOCK_SIZE",0,		INT_TYPE_VAR,	DEFAULT_DCC_BLOCK_SIZE, NULL, NULL, 0, VIF_BITCHX },
191 	{ "DCC_DLDIR",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
192 	{ "DCC_FAST",0,			BOOL_TYPE_VAR,	DEFAULT_DCC_FAST, NULL, NULL, 0, VIF_BITCHX },
193 	{ "DCC_FORCE_PORT",0,		INT_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
194 	{ "DCC_GET_LIMIT",0,		INT_TYPE_VAR,	DEFAULT_DCC_GET_LIMIT, NULL, NULL, 0, VIF_BITCHX },
195 	{ "DCC_MAX_AUTOGET_SIZE",0,	INT_TYPE_VAR,	DEFAULT_MAX_AUTOGET_SIZE, NULL, NULL, 0, VIF_BITCHX },
196 	{ "DCC_QUEUE_LIMIT",0,		INT_TYPE_VAR,	DEFAULT_DCC_QUEUE_LIMIT, NULL, NULL, 0, VIF_BITCHX },
197 	{ "DCC_SEND_LIMIT",0,		INT_TYPE_VAR,	DEFAULT_DCC_SEND_LIMIT, NULL, NULL, 0, VIF_BITCHX },
198 	{ "DCC_TIMEOUT",0,		INT_TYPE_VAR,	DEFAULT_DCCTIMEOUT, NULL, set_dcc_timeout, 0, VIF_BITCHX },
199 	{ "DCC_ULDIR",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
200 	{ "DCC_USE_GATEWAY_ADDR",0,	BOOL_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
201 	{ "DEBUG",0,			STR_TYPE_VAR,	0, NULL, debug_window, 0, 0 },
202 #if defined(__EMXPM__) || defined(WIN32)
203 	{ "DEFAULT_CODEPAGE",0,		INT_TYPE_VAR,	DEFAULT_CODEPAGE, NULL, NULL, 0, VIF_BITCHX },
204 #endif
205 	{ "DEFAULT_FONT",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
206 	{ "DEFAULT_MENU",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, 0 },
207 	{ "DEFAULT_NICK",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
208 	{ "DEFAULT_REASON",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
209 	{ "DEOPFLOOD",0,		BOOL_TYPE_VAR,	DEFAULT_DEOPFLOOD, NULL, NULL, 0, VIF_BITCHX },
210 	{ "DEOPFLOOD_TIME",0,		INT_TYPE_VAR,	DEFAULT_DEOPFLOOD_TIME, NULL, NULL, 0, VIF_BITCHX },
211 	{ "DEOP_ON_DEOPFLOOD",0,	INT_TYPE_VAR,	DEFAULT_DEOP_ON_DEOPFLOOD, NULL, NULL, 0, VIF_BITCHX },
212 	{ "DEOP_ON_KICKFLOOD",0,	INT_TYPE_VAR,	DEFAULT_DEOP_ON_KICKFLOOD, NULL, NULL, 0, VIF_BITCHX },
213 	{ "DETACH_ON_HUP",0,		BOOL_TYPE_VAR,	DEFAULT_DETACH_ON_HUP, NULL, set_detach_on_hup, 0, 0 },
214 	{ "DISPATCH_UNKNOWN_COMMANDS",0,BOOL_TYPE_VAR,	DEFAULT_DISPATCH_UNKNOWN_COMMANDS, NULL, NULL, 0, 0 },
215 	{ "DISPLAY",0,			BOOL_TYPE_VAR,	DEFAULT_DISPLAY, NULL, NULL, 0, 0 },
216 	{ "DISPLAY_ANSI",0,		BOOL_TYPE_VAR,	DEFAULT_DISPLAY_ANSI, NULL, toggle_reverse_status, 0, 0 },
217 	{ "DISPLAY_PC_CHARACTERS",0,	INT_TYPE_VAR,	DEFAULT_DISPLAY_PC_CHARACTERS, NULL, reinit_screen, 0, VIF_BITCHX },
218 	{ "DOUBLE_STATUS_LINE",0,	INT_TYPE_VAR,	DEFAULT_DOUBLE_STATUS_LINE, NULL, reinit_status, 0, VIF_BITCHX },
219 	{ "EIGHT_BIT_CHARACTERS",0,	BOOL_TYPE_VAR,	DEFAULT_EIGHT_BIT_CHARACTERS, NULL, eight_bit_characters, 0, VIF_BITCHX },
220 	{ "EXEC_PROTECTION",0,		BOOL_TYPE_VAR,	DEFAULT_EXEC_PROTECTION, NULL, exec_warning, 0, VF_NODAEMON },
221 	{ "FAKE_SPLIT_PATTERNS",0,	STR_TYPE_VAR,	0, NULL, NULL, 0, 0 },
222 
223 	{ "FLOATING_POINT_MATH_VAR",0,	BOOL_TYPE_VAR,	DEFAULT_FLOATING_POINT_MATH, NULL, NULL, 0, 0 },
224 	{ "FLOOD_AFTER",0,		INT_TYPE_VAR,	DEFAULT_FLOOD_AFTER, NULL, NULL, 0, VIF_BITCHX },
225 	{ "FLOOD_KICK",0,		BOOL_TYPE_VAR,	DEFAULT_FLOOD_KICK, NULL, NULL, 0, VIF_BITCHX },
226 	{ "FLOOD_PROTECTION",0,		BOOL_TYPE_VAR,	DEFAULT_FLOOD_PROTECTION, NULL, NULL, 0, VIF_BITCHX },
227 	{ "FLOOD_RATE",0,		INT_TYPE_VAR,	DEFAULT_FLOOD_RATE, NULL, NULL, 0, VIF_BITCHX },
228 	{ "FLOOD_USERS",0,		INT_TYPE_VAR,	DEFAULT_FLOOD_USERS, NULL, NULL, 0, VIF_BITCHX },
229 	{ "FLOOD_WARNING",0,		BOOL_TYPE_VAR,	DEFAULT_FLOOD_WARNING, NULL, NULL, 0, VIF_BITCHX },
230 
231 	{ "FTP_GRAB",0,			BOOL_TYPE_VAR,	DEFAULT_FTP_GRAB, NULL, NULL, 0, VIF_BITCHX },
232 	{ "FULL_STATUS_LINE",0,		BOOL_TYPE_VAR,	DEFAULT_FULL_STATUS_LINE, NULL, BX_update_all_status, 0, 0 },
233 	{ "HACKING",0,			INT_TYPE_VAR,	DEFAULT_HACKING, NULL, NULL, 0, VIF_BITCHX },
234 	{ "HACK_OPS",0,			BOOL_TYPE_VAR,	0, NULL, NULL, 0, 0},
235 	{ "HEBREW_TOGGLE",0,		BOOL_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
236 	{ "HELP_PAGER",0,		BOOL_TYPE_VAR,	DEFAULT_HELP_PAGER, NULL, NULL, 0, 0 },
237 	{ "HELP_PATH",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, VF_EXPAND_PATH|VF_NODAEMON },
238 	{ "HELP_PROMPT",0,		BOOL_TYPE_VAR,	DEFAULT_HELP_PROMPT, NULL, NULL, 0, 0 },
239 	{ "HELP_WINDOW",0,		BOOL_TYPE_VAR,	DEFAULT_HELP_WINDOW, NULL, NULL, 0, 0 },
240 	{ "HIDE_PRIVATE_CHANNELS",0,	BOOL_TYPE_VAR,	DEFAULT_HIDE_PRIVATE_CHANNELS, NULL, BX_update_all_status, 0, 0 },
241 	{ "HIGHLIGHT_CHAR",0,		STR_TYPE_VAR,	0, NULL, set_highlight_char, 0, 0 },
242 	{ "HIGH_BIT_ESCAPE",0,		INT_TYPE_VAR,	DEFAULT_HIGH_BIT_ESCAPE, NULL, set_meta_8bit, 0, 0 },
243 	{ "HISTORY",0,			INT_TYPE_VAR,	DEFAULT_HISTORY, NULL, set_history_size, 0, VF_NODAEMON },
244 	{ "HOLD_MODE",0,		BOOL_TYPE_VAR,	DEFAULT_HOLD_MODE, NULL, BX_reset_line_cnt, 0, 0 },
245 	{ "HOLD_MODE_MAX",0,		INT_TYPE_VAR,	DEFAULT_HOLD_MODE_MAX, NULL, NULL, 0, 0 },
246 	{ "HTTP_GRAB",0,		BOOL_TYPE_VAR,  DEFAULT_HTTP_GRAB, NULL, NULL, 0, VIF_BITCHX },
247 	{ "IDENT_HACK",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
248 	{ "IDLE_CHECK",0,		INT_TYPE_VAR,	120, NULL, NULL, 0, VIF_BITCHX },
249 	{ "IGNORE_TIME",0,		INT_TYPE_VAR,	DEFAULT_IGNORE_TIME, NULL, NULL, 0, VIF_BITCHX },
250 	{ "INDENT",0,			BOOL_TYPE_VAR,	DEFAULT_INDENT, NULL, NULL, 0, 0 },
251 	{ "INPUT_ALIASES",0,		BOOL_TYPE_VAR,	DEFAULT_INPUT_ALIASES, NULL, NULL, 0, 0 },
252 	{ "INPUT_GLOB",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
253 	{ "INPUT_PROMPT",0,		STR_TYPE_VAR,	0, NULL, BX_set_input_prompt, 0, 0 },
254 	{ "INSERT_MODE",0,		BOOL_TYPE_VAR,	DEFAULT_INSERT_MODE, NULL, BX_update_all_status, 0, 0 },
255 	{ "INVERSE_VIDEO",0,		BOOL_TYPE_VAR,	DEFAULT_INVERSE_VIDEO, NULL, NULL, 0, 0 },
256 	{ "JOINFLOOD",0,		BOOL_TYPE_VAR,	DEFAULT_JOINFLOOD, NULL, NULL, 0, VIF_BITCHX },
257 	{ "JOINFLOOD_TIME",0,		INT_TYPE_VAR,	DEFAULT_JOINFLOOD_TIME, NULL, NULL, 0, VIF_BITCHX },
258 	{ "JOIN_NEW_WINDOW",0,          BOOL_TYPE_VAR,  DEFAULT_JOIN_NEW_WINDOW, NULL, NULL, 0, VIF_BITCHX },
259 	{ "JOIN_NEW_WINDOW_TYPE",0,     STR_TYPE_VAR,   0, NULL, NULL, 0, VIF_BITCHX },
260 	{ "KICKFLOOD",0,		BOOL_TYPE_VAR,	DEFAULT_KICKFLOOD, NULL, NULL, 0, VIF_BITCHX  },
261 	{ "KICKFLOOD_TIME",0,		INT_TYPE_VAR,	DEFAULT_KICKFLOOD_TIME, NULL, NULL, 0, VIF_BITCHX  },
262 	{ "KICK_IF_BANNED",0,		BOOL_TYPE_VAR,  DEFAULT_KICK_IF_BANNED, NULL, NULL, 0, VIF_BITCHX },
263 	{ "KICK_ON_DEOPFLOOD",0,	INT_TYPE_VAR,   DEFAULT_KICK_ON_DEOPFLOOD, NULL, NULL, 0, VIF_BITCHX },
264 	{ "KICK_ON_JOINFLOOD",0,	INT_TYPE_VAR,	DEFAULT_KICK_ON_JOINFLOOD, NULL, NULL, 0, VIF_BITCHX },
265 	{ "KICK_ON_KICKFLOOD",0,	INT_TYPE_VAR,   DEFAULT_KICK_ON_KICKFLOOD, NULL, NULL, 0, VIF_BITCHX  },
266 	{ "KICK_ON_NICKFLOOD",0,	INT_TYPE_VAR,   DEFAULT_KICK_ON_NICKFLOOD, NULL, NULL, 0, VIF_BITCHX  },
267 	{ "KICK_ON_PUBFLOOD",0,		INT_TYPE_VAR,   DEFAULT_KICK_ON_PUBFLOOD, NULL, NULL, 0, VIF_BITCHX  },
268 	{ "KICK_OPS",0,			BOOL_TYPE_VAR,	DEFAULT_KICK_OPS, NULL, NULL, 0, VIF_BITCHX  },
269 	{ "LAMEIDENT",0,		BOOL_TYPE_VAR,	DEFAULT_LAME_IDENT, NULL, NULL, 0, VIF_BITCHX },
270 	{ "LAMELIST",0,			BOOL_TYPE_VAR,	DEFAULT_LAMELIST, NULL, NULL, 0, VIF_BITCHX },
271 	{ "LASTLOG",0,			INT_TYPE_VAR,	DEFAULT_LASTLOG, NULL, set_lastlog_size, 0, 0 },
272 	{ "LASTLOG_ANSI",0,		BOOL_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
273 	{ "LASTLOG_LEVEL",0,		STR_TYPE_VAR,	0, NULL, set_lastlog_level, 0, 0 },
274 	{ "LLOOK",0,			BOOL_TYPE_VAR,	DEFAULT_LLOOK, NULL, NULL, 0, 0 },
275 	{ "LLOOK_DELAY",0,		INT_TYPE_VAR,	DEFAULT_LLOOK_DELAY, NULL, NULL, 0, VIF_BITCHX  },
276 	{ "LOAD_PATH",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, VF_NODAEMON },
277 	{ "LOG",0,			BOOL_TYPE_VAR,	DEFAULT_LOG, NULL, logger, 0, 0 },
278 	{ "LOGFILE",0,			STR_TYPE_VAR,	0, NULL, set_log_file, 0, VF_NODAEMON },
279 	{ "MAIL",0,			INT_TYPE_VAR,	DEFAULT_MAIL, NULL, BX_update_all_status, 0, VIF_BITCHX },
280 
281 	{ "MANGLE_INBOUND",0,		STR_TYPE_VAR,	0, NULL, set_mangle_inbound, 0, VIF_BITCHX },
282 	{ "MANGLE_LOGFILES",0,		STR_TYPE_VAR,	0, NULL, set_mangle_logfiles, 0, VIF_BITCHX },
283 	{ "MANGLE_OPERLOG",0,		STR_TYPE_VAR,	0, NULL, set_mangle_operlog, 0, VIF_BITCHX },
284 	{ "MANGLE_OUTBOUND",0,		STR_TYPE_VAR,	0, NULL, set_mangle_outbound, 0, VIF_BITCHX },
285 
286 	{ "MAX_DEOPS",0,		INT_TYPE_VAR,	DEFAULT_MAX_DEOPS, NULL, NULL, 0, VIF_BITCHX  },
287 	{ "MAX_IDLEKICKS",0,		INT_TYPE_VAR,	DEFAULT_MAX_IDLEKICKS, NULL, NULL, 0, VIF_BITCHX  },
288 	{ "MAX_SERVER_RECONNECT",0,	INT_TYPE_VAR,	DEFAULT_MAX_SERVER_RECONNECT, NULL, NULL, 0, VIF_BITCHX },
289 	{ "MAX_URLS",0,			INT_TYPE_VAR,	DEFAULT_MAX_URLS, NULL, NULL, 0, VIF_BITCHX },
290 #ifdef GUI
291 	{ "MDI",0,				BOOL_TYPE_VAR,	DEFAULT_MDI, NULL, gui_mdi, 0, VIF_BITCHX },
292 #else
293 	{ "MDI",0,				BOOL_TYPE_VAR,	DEFAULT_MDI, NULL, NULL, 0, VIF_BITCHX },
294 #endif
295 	{ "META_STATES_VAR",0,		INT_TYPE_VAR,	DEFAULT_META_STATES, NULL, NULL, 0, 0 },
296 	{ "MIRCS",0,			BOOL_TYPE_VAR,  1, NULL, NULL, 0, VIF_BITCHX  },
297 	{ "MODE_STRIPPER",0,		BOOL_TYPE_VAR,	0, NULL, NULL, 0, 0 },
298 	{ "MSGCOUNT",0,			INT_TYPE_VAR,	0, NULL, NULL, 0, 0 },
299 	{ "MSGLOG",0,			BOOL_TYPE_VAR,	DEFAULT_MSGLOG, NULL, NULL, 0, 0 },
300 	{ "MSGLOG_FILE",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX|VF_EXPAND_PATH },
301 	{ "MSGLOG_LEVEL",0,		STR_TYPE_VAR,	0, NULL, set_msglog_level, 0, VIF_BITCHX},
302 	{ "NAMES_COLUMNS",0,		INT_TYPE_VAR,	5, NULL, NULL, 0, VIF_BITCHX },
303 	{ "NAT_ADDRESS",0,		STR_TYPE_VAR,	0, NULL, set_nat_address, 0, VIF_BITCHX },
304 	{ "ND_SPACE_MAX",0,		INT_TYPE_VAR,	DEFAULT_ND_SPACE_MAX, NULL, NULL, 0, 0 },
305 	{ "NEW_SERVER_LASTLOG_LEVEL",0,	STR_TYPE_VAR,	0, NULL, set_new_server_lastlog_level, 0, VIF_BITCHX },
306 	{ "NEXT_SERVER_ON_LOCAL_KILL",0,  BOOL_TYPE_VAR,  0, NULL, NULL, 0, VIF_BITCHX },
307 
308 	{ "NICKFLOOD",0,		BOOL_TYPE_VAR,	DEFAULT_NICKFLOOD, NULL, NULL, 0, VIF_BITCHX  },
309 	{ "NICKFLOOD_TIME",0,		INT_TYPE_VAR,	DEFAULT_NICKFLOOD_TIME, NULL, NULL, 0, VIF_BITCHX  },
310 	{ "NICKLIST",0,		        INT_TYPE_VAR,	DEFAULT_NICKLIST, NULL, NULL, 0, VIF_BITCHX  },
311 	{ "NICKLIST_SORT",0,		        INT_TYPE_VAR,	DEFAULT_NICKLIST_SORT, NULL, NULL, 0, VIF_BITCHX  },
312 	{ "NICK_COMPLETION",0,		BOOL_TYPE_VAR,	DEFAULT_NICK_COMPLETION, NULL, NULL, 0, VIF_BITCHX  },
313 	{ "NICK_COMPLETION_CHAR",0,	CHAR_TYPE_VAR,  DEFAULT_NICK_COMPLETION_CHAR, NULL, NULL, 0, VIF_BITCHX },
314 	{ "NICK_COMPLETION_LEN",0,	INT_TYPE_VAR,	DEFAULT_NICK_COMPLETION_LEN, NULL, NULL, 0, VIF_BITCHX  },
315 	{ "NICK_COMPLETION_TYPE",0,	INT_TYPE_VAR,	DEFAULT_NICK_COMPLETION_TYPE, NULL, NULL, 0, VIF_BITCHX  },
316 	{ "NOTIFY",0,			BOOL_TYPE_VAR,	DEFAULT_NOTIFY, NULL, NULL, 0, VIF_BITCHX },
317 	{ "NOTIFY_HANDLER",0,		STR_TYPE_VAR, 	0, NULL, set_notify_handler, 0, 0 },
318 	{ "NOTIFY_INTERVAL",0,		INT_TYPE_VAR,   DEFAULT_NOTIFY_INTERVAL, NULL, NULL, 0, VIF_BITCHX },
319 	{ "NOTIFY_LEVEL",0,		STR_TYPE_VAR,	0, NULL, set_notify_level, 0, 0 },
320 	{ "NOTIFY_ON_TERMINATION",0,	BOOL_TYPE_VAR,	DEFAULT_NOTIFY_ON_TERMINATION, NULL, NULL, 0, VF_NODAEMON },
321 	{ "NO_CTCP_FLOOD",0,		BOOL_TYPE_VAR,	DEFAULT_NO_CTCP_FLOOD, NULL, NULL, 0, 0 },
322 	{ "NO_FAIL_DISCONNECT",0,	BOOL_TYPE_VAR,	DEFAULT_NO_FAIL_DISCONNECT, NULL, NULL, 0, VIF_BITCHX },
323 	{ "NUM_BANMODES",0,		INT_TYPE_VAR,   DEFAULT_NUM_BANMODES, NULL, NULL, 0, VIF_BITCHX },
324 	{ "NUM_KICKS",0,		INT_TYPE_VAR,   DEFAULT_NUM_KICKS, NULL, NULL, 0, VIF_BITCHX },
325 	{ "NUM_KILLS",0,		INT_TYPE_VAR,	1, NULL, NULL, 0, VIF_BITCHX },
326 	{ "NUM_OF_WHOWAS",0,		INT_TYPE_VAR,	DEFAULT_NUM_OF_WHOWAS, NULL, NULL, 0, VIF_BITCHX },
327 	{ "NUM_OPMODES",0,		INT_TYPE_VAR,   DEFAULT_NUM_OPMODES, NULL, NULL, 0, VIF_BITCHX },
328 	{ "OPER_MODES",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
329 	{ "ORIGNICK_TIME",0,		INT_TYPE_VAR,	5, NULL, NULL, 0, VIF_BITCHX },
330 #ifdef WANT_OPERVIEW
331 	{ "OV",0,			BOOL_TYPE_VAR,  DEFAULT_OPER_VIEW, NULL, set_ov_mode, 0, VIF_BITCHX },
332 #else
333 	{ "OV",0,			BOOL_TYPE_VAR,  0, NULL, NULL, 0, VIF_BITCHX },
334 #endif
335 	{ "PAD_CHAR",0,			CHAR_TYPE_VAR,	DEFAULT_PAD_CHAR, NULL, NULL, 0, 0 },
336 	{ "PING_TYPE",0,		INT_TYPE_VAR,   DEFAULT_PING_TYPE, NULL, NULL, 0, VIF_BITCHX  },
337 	{ "PROTECT_CHANNELS",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, 0 },
338 	{ "PUBFLOOD",0,			BOOL_TYPE_VAR,	DEFAULT_PUBFLOOD, NULL, NULL, 0, VIF_BITCHX },
339 	{ "PUBFLOOD_TIME",0,		INT_TYPE_VAR,	DEFAULT_PUBFLOOD_TIME, NULL, NULL, 0, VIF_BITCHX  },
340 	{ "QUERY_NEW_WINDOW",0,         BOOL_TYPE_VAR,  DEFAULT_QUERY_NEW_WINDOW, NULL, NULL, 0, VIF_BITCHX },
341 	{ "QUERY_NEW_WINDOW_TYPE",0,    STR_TYPE_VAR,   0, NULL, NULL, 0, VIF_BITCHX },
342 	{ "QUEUE_SENDS",0,		INT_TYPE_VAR,	DEFAULT_QUEUE_SENDS, NULL, NULL, 0, VIF_BITCHX },
343 	{ "RANDOM_LOCAL_PORTS",0,	BOOL_TYPE_VAR,	DEFAULT_RANDOM_LOCAL_PORTS, NULL, NULL, 0, VIF_BITCHX },
344 	{ "RANDOM_SOURCE",0,		INT_TYPE_VAR,	DEFAULT_RANDOM_SOURCE, NULL, NULL, 0, VIF_BITCHX },
345 	{ "REALNAME",0,			STR_TYPE_VAR,	0, NULL, set_realname, 0, VF_NODAEMON },
346 	{ "REVERSE_STATUS",0,		BOOL_TYPE_VAR,	0, NULL, reinit_status, 0, 0 },
347 	{ "SAVEFILE",0,			STR_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX  },
348 	{ "SCREEN_OPTIONS",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, VF_NODAEMON },
349 	{ "SCRIPT_HELP",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX  },
350 	{ "SCROLLBACK",0,		INT_TYPE_VAR,	DEFAULT_SCROLLBACK_LINES, NULL, BX_set_scrollback_size, 0, 0 },
351 	{ "SCROLLBACK_RATIO",0,		INT_TYPE_VAR,	DEFAULT_SCROLLBACK_RATIO, NULL, NULL, 0, 0 },
352 	{ "SCROLL_LINES",0,		INT_TYPE_VAR,	DEFAULT_SCROLL_LINES, NULL, BX_set_scroll_lines, 0, 0 },
353 	{ "SEND_AWAY_MSG",0,		BOOL_TYPE_VAR,	DEFAULT_SEND_AWAY_MSG, NULL, NULL, 0, VIF_BITCHX },
354 	{ "SEND_CTCP_MSG",0,		BOOL_TYPE_VAR,	DEFAULT_SEND_CTCP_MSG, NULL, NULL, 0, VIF_BITCHX },
355 	{ "SEND_IGNORE_MSG",0,		BOOL_TYPE_VAR,	DEFAULT_SEND_IGNORE_MSG, NULL, NULL, 0, VIF_BITCHX },
356 	{ "SEND_OP_MSG",0,		BOOL_TYPE_VAR,	DEFAULT_SEND_OP_MSG, NULL, NULL, 0, VIF_BITCHX },
357 	{ "SERVER_GROUPS",0,            BOOL_TYPE_VAR,  DEFAULT_SERVER_GROUPS, NULL, NULL, 0, VIF_BITCHX },
358 	{ "SERVER_PROMPT",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, 0 },
359 	{ "SHELL",0,			STR_TYPE_VAR,	0, NULL, NULL, 0, VF_NODAEMON },
360 	{ "SHELL_FLAGS",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, VF_NODAEMON },
361 	{ "SHELL_LIMIT",0,		INT_TYPE_VAR,	DEFAULT_SHELL_LIMIT, NULL, NULL, 0, VF_NODAEMON },
362 	{ "SHITLIST",0,			BOOL_TYPE_VAR,  DEFAULT_SHITLIST, NULL, NULL, 0, VIF_BITCHX  },
363 	{ "SHITLIST_REASON",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX  },
364 	{ "SHOW_AWAY_ONCE",0,		BOOL_TYPE_VAR,	DEFAULT_SHOW_AWAY_ONCE, NULL, NULL, 0, VIF_BITCHX },
365 	{ "SHOW_CHANNEL_NAMES",0,	BOOL_TYPE_VAR,	DEFAULT_SHOW_CHANNEL_NAMES, NULL, NULL, 0, 0 },
366 	{ "SHOW_END_OF_MSGS",0,		BOOL_TYPE_VAR,	DEFAULT_SHOW_END_OF_MSGS, NULL, NULL, 0, 0 },
367 	{ "SHOW_NUMERICS",0,		BOOL_TYPE_VAR,	DEFAULT_SHOW_NUMERICS, NULL, NULL, 0, 0 },
368 	{ "SHOW_NUMERICS_STR",0,	STR_TYPE_VAR,	0, NULL, set_numeric_string, 0, 0 },
369 	{ "SHOW_STATUS_ALL",0,		BOOL_TYPE_VAR,	DEFAULT_SHOW_STATUS_ALL, NULL, BX_update_all_status, 0, 0 },
370 	{ "SHOW_WHO_HOPCOUNT",0, 	BOOL_TYPE_VAR,	DEFAULT_SHOW_WHO_HOPCOUNT, NULL, NULL, 0, 0 },
371 	{ "SOCKS_HOST",0,		STR_TYPE_VAR,	0, NULL, set_use_socks, 0, VIF_BITCHX },
372 	{ "SOCKS_PORT",0,		INT_TYPE_VAR,	DEFAULT_SOCKS_PORT, NULL, NULL, 0, VIF_BITCHX },
373 	{ "STATUS_AWAY",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
374 	{ "STATUS_CDCCCOUNT",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
375 	{ "STATUS_CHANNEL",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
376 	{ "STATUS_CHANOP",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
377 	{ "STATUS_CLOCK",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
378 	{ "STATUS_CPU_SAVER",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
379 	{ "STATUS_DCCCOUNT",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
380 	{ "STATUS_DOES_EXPANDOS",0,	BOOL_TYPE_VAR,	DEFAULT_STATUS_DOES_EXPANDOS, NULL, BX_build_status, 0, 0 },
381 	{ "STATUS_FLAG",0,		STR_TYPE_VAR,   0, NULL, BX_build_status, 0, 0 },
382 	{ "STATUS_FORMAT",0,            STR_TYPE_VAR,   0, NULL, BX_build_status, 0, 0 },
383 	{ "STATUS_FORMAT1",0,           STR_TYPE_VAR,   0, NULL, BX_build_status, 0, 0 },
384 	{ "STATUS_FORMAT2",0,           STR_TYPE_VAR,   0, NULL, BX_build_status, 0, 0 },
385 	{ "STATUS_FORMAT3",0,           STR_TYPE_VAR,   0, NULL, BX_build_status, 0, 0 },
386 	{ "STATUS_HALFOP",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
387 	{ "STATUS_HOLD",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
388 	{ "STATUS_HOLD_LINES",0,	STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
389 	{ "STATUS_INSERT",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
390 	{ "STATUS_LAG",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
391 	{ "STATUS_MAIL",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, VF_NODAEMON },
392 	{ "STATUS_MODE",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
393 	{ "STATUS_MSGCOUNT",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
394 	{ "STATUS_NICK",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
395 	{ "STATUS_NOTIFY",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
396 	{ "STATUS_NO_REPEAT",0,		BOOL_TYPE_VAR,	DEFAULT_STATUS_NO_REPEAT, NULL, NULL, 0, 0 },
397 	{ "STATUS_OPER",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
398 	{ "STATUS_OPER_KILLS",0,	STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
399 	{ "STATUS_OVERWRITE",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
400 	{ "STATUS_QUERY",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
401 	{ "STATUS_SCROLLBACK",0,	STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
402 	{ "STATUS_SERVER",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
403 	{ "STATUS_TOPIC",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
404 	{ "STATUS_UMODE",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
405 	{ "STATUS_USER0",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
406 	{ "STATUS_USER1",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
407 	{ "STATUS_USER10",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
408 	{ "STATUS_USER11",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
409 	{ "STATUS_USER12",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
410 	{ "STATUS_USER13",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
411 	{ "STATUS_USER14",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
412 	{ "STATUS_USER15",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
413 	{ "STATUS_USER16",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
414 	{ "STATUS_USER17",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
415 	{ "STATUS_USER18",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
416 	{ "STATUS_USER19",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
417 	{ "STATUS_USER2",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
418 	{ "STATUS_USER20",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
419 	{ "STATUS_USER21",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
420 	{ "STATUS_USER22",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
421 	{ "STATUS_USER23",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
422 	{ "STATUS_USER24",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
423 	{ "STATUS_USER25",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
424 	{ "STATUS_USER26",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
425 	{ "STATUS_USER27",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
426 	{ "STATUS_USER28",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
427 	{ "STATUS_USER29",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
428 	{ "STATUS_USER3",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
429 	{ "STATUS_USER30",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
430 	{ "STATUS_USER31",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
431 	{ "STATUS_USER32",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
432 	{ "STATUS_USER33",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
433 	{ "STATUS_USER34",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
434 	{ "STATUS_USER35",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
435 	{ "STATUS_USER36",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
436 	{ "STATUS_USER37",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
437 	{ "STATUS_USER38",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
438 	{ "STATUS_USER39",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
439 	{ "STATUS_USER4",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
440 	{ "STATUS_USER5",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
441 	{ "STATUS_USER6",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
442 	{ "STATUS_USER7",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
443 	{ "STATUS_USER8",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
444 	{ "STATUS_USER9",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
445 	{ "STATUS_USERS",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
446 	{ "STATUS_VOICE",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
447 	{ "STATUS_WINDOW",0,		STR_TYPE_VAR,	0, NULL, BX_build_status, 0, 0 },
448 	{ "SUPPRESS_SERVER_MOTD",0,	BOOL_TYPE_VAR,	DEFAULT_SUPPRESS_SERVER_MOTD, NULL, NULL, 0, VF_NODAEMON },
449 #ifdef WANT_OPERVIEW
450 	{ "SWATCH",0,			STR_TYPE_VAR,	0, NULL, convert_swatch, 0, VIF_BITCHX },
451 #else
452 	{ "SWATCH",0,			STR_TYPE_VAR,	0, NULL, NULL, 0, 0 },
453 #endif
454 	{ "TAB",0,			BOOL_TYPE_VAR,	DEFAULT_TAB, NULL, NULL, 0, 0 },
455 	{ "TAB_MAX",0,			INT_TYPE_VAR,	DEFAULT_TAB_MAX, NULL, NULL, 0, 0 },
456 	{ "TIMESTAMP",0,		BOOL_TYPE_VAR,	DEFAULT_TIMESTAMP, NULL, NULL, 0, VIF_BITCHX },
457 	{ "TIMESTAMP_AWAYLOG_HOURLY",0,	BOOL_TYPE_VAR,	DEFAULT_TIMESTAMP_AWAYLOG_HOURLY, NULL, NULL, 0, VIF_BITCHX },
458 	{ "TIMESTAMP_STRING",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
459 
460 #ifdef TRANSLATE
461 	{ "TRANSLATION",0,		STR_TYPE_VAR,	0, NULL, set_translation, 0, 0 },
462 #else
463 	{ "TRANSLATION",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, 0 },
464 #endif
465 
466 	{ "UNDERLINE_VIDEO",0,		BOOL_TYPE_VAR,	DEFAULT_UNDERLINE_VIDEO, NULL, NULL, 0, 0 },
467 	{ "USERLIST",0,			BOOL_TYPE_VAR,  DEFAULT_USERLIST, NULL, NULL, 0, VIF_BITCHX },
468 	{ "USERMODE",0,			STR_TYPE_VAR,	0, NULL, set_user_mode, 0, VIF_BITCHX},
469 	{ "USER_FLAG_OPS",0, 		STR_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
470 	{ "USER_FLAG_PROT",0, 		STR_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
471 	{ "USER_INFORMATION",0, 	STR_TYPE_VAR,	0, NULL, NULL, 0, 0 },
472 	{ "WINDOW_DESTROY_PART",0,      BOOL_TYPE_VAR,  DEFAULT_WINDOW_DESTROY_PART, NULL, NULL, 0, VIF_BITCHX },
473 	{ "WINDOW_QUIET",0,		BOOL_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
474 	{ "WORD_BREAK",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
475 	{ "XTERM",0,			STR_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
476 	{ "XTERM_OPTIONS",0,		STR_TYPE_VAR,	0, NULL, NULL, 0, VF_NODAEMON },
477 	{ "XTERM_TITLE",0,		BOOL_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
478 	{ "_CDCC_CLOSE_IDLE_SENDS_TIME",0,INT_TYPE_VAR,	55,NULL, NULL, 0, VIF_BITCHX },
479 	{ "_CDCC_MINSPEED_TIME",0,	INT_TYPE_VAR,	0, NULL, NULL, 0, VIF_BITCHX },
480 	{ "_CDCC_PACKS_OFFERED",0,	INT_TYPE_VAR,	0, NULL, NULL, 0, 0 },
481 	{ NULL, 0,			0, 		0, NULL, NULL, 0, 0 }
482 };
483 
484 /*
485  * get_string_var: returns the value of the string variable given as an index
486  * into the variable table.  Does no checking of variable types, etc
487  */
BX_get_string_var(enum VAR_TYPES var)488 char	*	BX_get_string_var(enum VAR_TYPES var)
489 {
490 	return (irc_variable[var].string);
491 }
492 
493 /*
494  * get_int_var: returns the value of the integer string given as an index
495  * into the variable table.  Does no checking of variable types, etc
496  */
BX_get_int_var(enum VAR_TYPES var)497 int BX_get_int_var(enum VAR_TYPES var)
498 {
499 	return (irc_variable[var].integer);
500 }
501 
502 /*
503  * set_string_var: sets the string variable given as an index into the
504  * variable table to the given string.  If string is null, the current value
505  * of the string variable is freed and set to null
506  */
BX_set_string_var(enum VAR_TYPES var,char * string)507 void BX_set_string_var(enum VAR_TYPES var, char *string)
508 {
509 	if (string)
510 		malloc_strcpy(&(irc_variable[var].string), string);
511 	else
512 		new_free(&(irc_variable[var].string));
513 }
514 
515 /*
516  * set_int_var: sets the integer value of the variable given as an index into
517  * the variable table to the given value
518  */
BX_set_int_var(enum VAR_TYPES var,unsigned int value)519 void BX_set_int_var(enum VAR_TYPES var, unsigned int value)
520 {
521 	irc_variable[var].integer = value;
522 }
523 
524 /*
525  * init_variables: initializes the string variables that can't really be
526  * initialized properly above
527  */
init_variables()528 void init_variables()
529 {
530 #if defined(WINNT) || defined(__EMX__)
531 	char *shell;
532 #endif
533 	int old_display = window_display;
534 	char *s;
535 #if 1
536 /* def VAR_DEBUG*/
537  	int i;
538 
539 	for (i = 1; i < NUMBER_OF_VARIABLES - 1; i++)
540 		if (strcmp(irc_variable[i-1].name, irc_variable[i].name) >= 0)
541 			ircpanic("Variable [%d] (%s) is out of order.", i, irc_variable[i].name);
542 #endif
543 
544 	window_display = 0;
545 
546 	set_string_var(SCRIPT_HELP_VAR, DEFAULT_SCRIPT_HELP_FILE);
547 	set_string_var(BITCHX_HELP_VAR, DEFAULT_BITCHX_HELP_FILE);
548 	set_string_var(IDENT_HACK_VAR, DEFAULT_IDENT_HACK);
549 	set_string_var(AUTO_RESPONSE_STR_VAR, nickname);
550 	set_string_var(XTERM_OPTIONS_VAR, DEFAULT_XTERM);
551         set_string_var(XTERM_OPTIONS_VAR, DEFAULT_XTERM_OPTIONS);
552 
553 	set_string_var(SHOW_NUMERICS_STR_VAR, DEFAULT_SHOW_NUMERICS_STR);
554 	set_numeric_string(current_window, DEFAULT_SHOW_NUMERICS_STR, 0);
555 
556 	reinit_autoresponse(current_window, nickname, 0);
557 	set_string_var(MSGLOGFILE_VAR, DEFAULT_MSGLOGFILE);
558 
559 	set_string_var(MSGLOG_LEVEL_VAR, DEFAULT_MSGLOG_LEVEL);
560 	set_string_var(CTOOLZ_DIR_VAR, DEFAULT_CTOOLZ_DIR);
561 	set_int_var(LLOOK_DELAY_VAR, DEFAULT_LLOOK_DELAY);
562 	set_int_var(MSGCOUNT_VAR, 0);
563 
564 	set_string_var(SHITLIST_REASON_VAR, DEFAULT_SHITLIST_REASON);
565 	set_string_var(PROTECT_CHANNELS_VAR, DEFAULT_PROTECT_CHANNELS);
566 	set_string_var(DEFAULT_REASON_VAR, DEFAULT_KICK_REASON);
567 	set_string_var(DCC_DLDIR_VAR, DEFAULT_DCC_DLDIR);
568 	set_string_var(DCC_ULDIR_VAR, DEFAULT_DCC_DLDIR);
569 
570 	set_string_var(CMDCHARS_VAR, DEFAULT_CMDCHARS);
571 	set_string_var(LOGFILE_VAR, DEFAULT_LOGFILE);
572 	set_string_var(WORD_BREAK_VAR, DEFAULT_WORD_BREAK);
573 
574         set_string_var(JOIN_NEW_WINDOW_TYPE_VAR, DEFAULT_JOIN_NEW_WINDOW_TYPE);
575         set_string_var(QUERY_NEW_WINDOW_TYPE_VAR, DEFAULT_QUERY_NEW_WINDOW_TYPE);
576 
577 #if defined(__EMX__)
578 	if (getenv("SHELL"))
579 	{
580 		shell = getenv("SHELL");
581 		set_string_var(SHELL_VAR, path_search(shell, getenv("PATH")));
582         	if (getenv("SHELL_FLAGS"))
583         		set_string_var(SHELL_FLAGS_VAR, getenv("SHELL_FLAGS"));
584 	}
585 	else
586 	{
587 	        shell = "cmd.exe";
588         	set_string_var(SHELL_FLAGS_VAR, "/c");
589 		set_string_var(SHELL_VAR, convert_dos(path_search(shell, getenv("PATH"))));
590 	}
591 #elif WINNT
592 	if (getenv("SHELL"))
593 	{
594 		shell = getenv("SHELL");
595 		set_string_var(SHELL_VAR, path_search(shell, getenv("PATH")));
596         	if (getenv("SHELL_FLAGS"))
597         		set_string_var(SHELL_FLAGS_VAR, getenv("SHELL_FLAGS"));
598 	}
599  	else if (gdwPlatform == VER_PLATFORM_WIN32_WINDOWS)
600 	{
601 		shell = "command.com";
602         	set_string_var(SHELL_FLAGS_VAR, "/c");
603 		set_string_var(SHELL_VAR, convert_dos(path_search(shell, getenv("PATH"))));
604 	}
605 	else
606 	{
607 	        shell = "cmd.exe";
608         	set_string_var(SHELL_FLAGS_VAR, "/c");
609 		set_string_var(SHELL_VAR, convert_dos(path_search(shell, getenv("PATH"))));
610 	}
611 #else
612 	set_string_var(SHELL_VAR, DEFAULT_SHELL);
613 	set_string_var(SHELL_FLAGS_VAR, DEFAULT_SHELL_FLAGS);
614 #endif
615 	set_string_var(CONTINUED_LINE_VAR, DEFAULT_CONTINUED_LINE);
616 	set_string_var(INPUT_PROMPT_VAR, DEFAULT_INPUT_PROMPT);
617 	set_string_var(HIGHLIGHT_CHAR_VAR, DEFAULT_HIGHLIGHT_CHAR);
618 	set_string_var(LASTLOG_LEVEL_VAR, DEFAULT_LASTLOG_LEVEL);
619 	set_string_var(NOTIFY_HANDLER_VAR, DEFAULT_NOTIFY_HANDLER);
620 	set_string_var(NOTIFY_LEVEL_VAR, DEFAULT_NOTIFY_LEVEL);
621 	set_string_var(REALNAME_VAR, realname);
622 
623 	set_string_var(STATUS_FLAG_VAR, DEFAULT_STATUS_FLAG);
624 	set_string_var(STATUS_FORMAT_VAR, DEFAULT_STATUS_FORMAT);
625 	set_string_var(STATUS_FORMAT1_VAR, DEFAULT_STATUS_FORMAT1);
626 	set_string_var(STATUS_FORMAT2_VAR, DEFAULT_STATUS_FORMAT2);
627 	set_string_var(STATUS_FORMAT3_VAR, DEFAULT_STATUS_FORMAT3);
628 
629 	set_string_var(STATUS_DCCCOUNT_VAR, DEFAULT_STATUS_DCCCOUNT);
630 	set_string_var(STATUS_CDCCCOUNT_VAR, DEFAULT_STATUS_CDCCCOUNT);
631 
632 	set_string_var(STATUS_AWAY_VAR, DEFAULT_STATUS_AWAY);
633 	set_string_var(STATUS_CHANNEL_VAR, DEFAULT_STATUS_CHANNEL);
634 	set_string_var(STATUS_CHANOP_VAR, DEFAULT_STATUS_CHANOP);
635 	set_string_var(STATUS_CLOCK_VAR, DEFAULT_STATUS_CLOCK);
636 	set_string_var(STATUS_CPU_SAVER_VAR, DEFAULT_STATUS_CPU_SAVER);
637 	set_string_var(STATUS_HALFOP_VAR, DEFAULT_STATUS_HALFOP);
638 	set_string_var(STATUS_HOLD_VAR, DEFAULT_STATUS_HOLD);
639 	set_string_var(STATUS_HOLD_LINES_VAR, DEFAULT_STATUS_HOLD_LINES);
640 	set_string_var(STATUS_INSERT_VAR, DEFAULT_STATUS_INSERT);
641 	set_string_var(STATUS_LAG_VAR, DEFAULT_STATUS_LAG);
642 	set_string_var(STATUS_MAIL_VAR, DEFAULT_STATUS_MAIL);
643 	set_string_var(STATUS_MODE_VAR, DEFAULT_STATUS_MODE);
644 	set_string_var(STATUS_MSGCOUNT_VAR, DEFAULT_STATUS_MSGCOUNT);
645 	set_string_var(STATUS_OPER_VAR, DEFAULT_STATUS_OPER);
646 	set_string_var(STATUS_VOICE_VAR, DEFAULT_STATUS_VOICE);
647 	set_string_var(STATUS_NICK_VAR, DEFAULT_STATUS_NICK);
648 	set_string_var(STATUS_NOTIFY_VAR, DEFAULT_STATUS_NOTIFY);
649 	set_string_var(STATUS_OPER_KILLS_VAR, DEFAULT_STATUS_OPER_KILLS);
650 	set_string_var(STATUS_OVERWRITE_VAR, DEFAULT_STATUS_OVERWRITE);
651 	set_string_var(STATUS_QUERY_VAR, DEFAULT_STATUS_QUERY);
652 	set_string_var(STATUS_SERVER_VAR, DEFAULT_STATUS_SERVER);
653 	set_string_var(STATUS_TOPIC_VAR, DEFAULT_STATUS_TOPIC);
654 	set_string_var(STATUS_UMODE_VAR, DEFAULT_STATUS_UMODE);
655 	set_string_var(STATUS_USERS_VAR, DEFAULT_STATUS_USERS);
656 	set_string_var(STATUS_USER0_VAR, DEFAULT_STATUS_USER);
657 	set_string_var(STATUS_USER1_VAR, DEFAULT_STATUS_USER1);
658 	set_string_var(STATUS_USER2_VAR, DEFAULT_STATUS_USER2);
659 	set_string_var(STATUS_USER3_VAR, DEFAULT_STATUS_USER3);
660 	set_string_var(STATUS_USER4_VAR, DEFAULT_STATUS_USER4);
661 	set_string_var(STATUS_USER5_VAR, DEFAULT_STATUS_USER5);
662 	set_string_var(STATUS_USER6_VAR, DEFAULT_STATUS_USER6);
663 	set_string_var(STATUS_USER7_VAR, DEFAULT_STATUS_USER7);
664 	set_string_var(STATUS_USER8_VAR, DEFAULT_STATUS_USER8);
665 	set_string_var(STATUS_USER9_VAR, DEFAULT_STATUS_USER9);
666 	set_string_var(STATUS_USER10_VAR, DEFAULT_STATUS_USER10);
667 	set_string_var(STATUS_USER11_VAR, DEFAULT_STATUS_USER11);
668 	set_string_var(STATUS_USER12_VAR, DEFAULT_STATUS_USER12);
669 	set_string_var(STATUS_USER13_VAR, DEFAULT_STATUS_USER13);
670 	set_string_var(STATUS_USER14_VAR, DEFAULT_STATUS_USER14);
671 	set_string_var(STATUS_USER15_VAR, DEFAULT_STATUS_USER15);
672 	set_string_var(STATUS_USER16_VAR, DEFAULT_STATUS_USER16);
673 	set_string_var(STATUS_USER17_VAR, DEFAULT_STATUS_USER17);
674 	set_string_var(STATUS_USER18_VAR, DEFAULT_STATUS_USER18);
675 	set_string_var(STATUS_USER19_VAR, DEFAULT_STATUS_USER19);
676 	set_string_var(STATUS_USER20_VAR, DEFAULT_STATUS_USER20);
677 	set_string_var(STATUS_USER21_VAR, DEFAULT_STATUS_USER21);
678 	set_string_var(STATUS_USER22_VAR, DEFAULT_STATUS_USER22);
679 	set_string_var(STATUS_USER23_VAR, DEFAULT_STATUS_USER23);
680 	set_string_var(STATUS_USER24_VAR, DEFAULT_STATUS_USER24);
681 	set_string_var(STATUS_USER25_VAR, DEFAULT_STATUS_USER25);
682 	set_string_var(STATUS_USER26_VAR, DEFAULT_STATUS_USER26);
683 	set_string_var(STATUS_USER27_VAR, DEFAULT_STATUS_USER27);
684 	set_string_var(STATUS_USER28_VAR, DEFAULT_STATUS_USER28);
685 	set_string_var(STATUS_USER29_VAR, DEFAULT_STATUS_USER29);
686 	set_string_var(STATUS_USER30_VAR, DEFAULT_STATUS_USER30);
687 	set_string_var(STATUS_USER31_VAR, DEFAULT_STATUS_USER31);
688 	set_string_var(STATUS_USER32_VAR, DEFAULT_STATUS_USER32);
689 	set_string_var(STATUS_USER33_VAR, DEFAULT_STATUS_USER33);
690 	set_string_var(STATUS_USER34_VAR, DEFAULT_STATUS_USER34);
691 	set_string_var(STATUS_USER35_VAR, DEFAULT_STATUS_USER35);
692 	set_string_var(STATUS_USER36_VAR, DEFAULT_STATUS_USER36);
693 	set_string_var(STATUS_USER37_VAR, DEFAULT_STATUS_USER37);
694 	set_string_var(STATUS_USER38_VAR, DEFAULT_STATUS_USER38);
695 	set_string_var(STATUS_USER39_VAR, DEFAULT_STATUS_USER39);
696 	set_string_var(STATUS_WINDOW_VAR, DEFAULT_STATUS_WINDOW);
697 	set_string_var(STATUS_SCROLLBACK_VAR, DEFAULT_STATUS_SCROLLBACK);
698 	set_string_var(TIMESTAMP_STRING_VAR, DEFAULT_TIMESTAMP_STR);
699 
700 	set_string_var(USERINFO_VAR, DEFAULT_USERINFO);
701 
702 	set_string_var(USERMODE_VAR, !send_umode ? DEFAULT_USERMODE : send_umode);
703 	set_user_mode(current_window, !send_umode? DEFAULT_USERMODE : send_umode, 0);
704 
705 	set_beep_on_msg(current_window, DEFAULT_BEEP_ON_MSG, 0);
706 
707 	set_var_value(SWATCH_VAR, DEFAULT_SWATCH, NULL);
708 	set_string_var(CLIENTINFO_VAR, IRCII_COMMENT);
709 	set_string_var(FAKE_SPLIT_PATS_VAR, "*fuck* *shit* *suck* *dick* *penis* *cunt* *haha* *fake* *split* *hehe* *bogus* *yawn* *leet* *blow* *screw* *dumb* *fbi* *l33t* *gov");
710 	set_string_var(CHANMODE_VAR, DEFAULT_CHANMODE);
711 
712 	set_string_var(CDCC_PROMPT_VAR, "%GC%gDCC");
713 	set_string_var(DEFAULT_MENU_VAR, "none");
714 	set_string_var(DEFAULT_FONT_VAR, DEFAULT_FONT);
715 
716 	set_string_var(SERVER_PROMPT_VAR, DEFAULT_SERVER_PROMPT);
717 
718 	set_string_var(BOT_LOGFILE_VAR, "tcl.log");
719 
720 	s = m_strdup(irc_lib);
721 	malloc_strcat(&s, "/help");
722 	set_string_var(HELP_PATH_VAR, s);
723 	new_free(&s);
724 
725 #ifdef WANT_CD
726 	set_cd_device(current_window, "/dev/cdrom", 0);
727 #endif
728 	set_string_var(OPER_MODES_VAR, DEFAULT_OPERMODE);
729 
730 	set_string_var(MANGLE_INBOUND_VAR, NULL);
731 	set_string_var(MANGLE_OUTBOUND_VAR, NULL);
732 	set_string_var(MANGLE_LOGFILES_VAR, NULL);
733 	set_mangle_operlog(current_window, "ALL", 0);
734 	set_string_var(NEW_SERVER_LASTLOG_LEVEL_VAR, DEFAULT_NEW_SERVER_LASTLOG_LEVEL);
735 
736 	set_lastlog_size(current_window, NULL, irc_variable[LASTLOG_VAR].integer);
737 	set_history_size(current_window, NULL, irc_variable[HISTORY_VAR].integer);
738 
739 	set_highlight_char(current_window, irc_variable[HIGHLIGHT_CHAR_VAR].string, 0);
740 	set_lastlog_level(current_window, irc_variable[LASTLOG_LEVEL_VAR].string, 0);
741 	set_notify_level(current_window, irc_variable[NOTIFY_LEVEL_VAR].string, 0);
742 	set_msglog_level(current_window, irc_variable[MSGLOG_LEVEL_VAR].string, 0);
743 
744 #ifdef TRANSLATE
745 	set_string_var(TRANSLATION_VAR, "LATIN1");
746 	set_translation(current_window, "LATIN1", 0);
747 #endif
748 	create_fsets(current_window, get_int_var(DISPLAY_ANSI_VAR));
749 	set_input_prompt(current_window, DEFAULT_INPUT_PROMPT, 0);
750 	if (current_window->wset)
751 		remove_wsets_for_window(current_window);
752 	current_window->wset = create_wsets_for_window(current_window);
753 	build_status(current_window, NULL, 0);
754 	window_display = old_display;
755 }
756 
757 
BUILT_IN_COMMAND(init_window_vars)758 BUILT_IN_COMMAND(init_window_vars)
759 {
760 	if (current_window->wset)
761 		remove_wsets_for_window(current_window);
762 	current_window->wset = create_wsets_for_window(current_window);
763 	update_all_windows();
764 	build_status(current_window, NULL, 0);
765 	update_all_status(current_window, NULL, 0);
766 }
767 
BUILT_IN_COMMAND(init_vars)768 BUILT_IN_COMMAND(init_vars)
769 {
770 	init_variables();
771 	init_window_vars(NULL, NULL, NULL, NULL);
772 }
773 
774 /*
775  * do_boolean: just a handy thing.  Returns 1 if the str is not ON, OFF, or
776  * TOGGLE
777  */
do_boolean(char * str,int * value)778 int do_boolean(char *str, int *value)
779 {
780 	upper(str);
781 	if (strcmp(str, var_settings[ON]) == 0)
782 		*value = 1;
783 	else if (strcmp(str, var_settings[OFF]) == 0)
784 		*value = 0;
785 	else if (strcmp(str, "TOGGLE") == 0)
786 	{
787 		if (*value)
788 			*value = 0;
789 		else
790 			*value = 1;
791 	}
792 	else
793 		return (1);
794 	return (0);
795 }
796 
797 /*
798  * set_var_value: Given the variable structure and the string representation
799  * of the value, this sets the value in the most verbose and error checking
800  * of manors.  It displays the results of the set and executes the function
801  * defined in the var structure
802  */
803 
set_var_value(int var_index,char * value,IrcVariableDll * dll)804 void set_var_value(int var_index, char *value, IrcVariableDll *dll)
805 {
806 	char	*rest;
807 	IrcVariable *var;
808 	int	old;
809 #ifdef WANT_DLL
810 	if (dll)
811 	{
812 		var = (IrcVariable *) new_malloc(sizeof(IrcVariable));
813 		var->type = dll->type;
814 		var->string = dll->string;
815 		var->integer = dll->integer;
816 		var->int_flags = dll->int_flags;
817 		var->flags = dll->flags;
818 		var->name = dll->name;
819 		var->func = dll->func;
820 	}
821 	else
822 #endif
823 		var = &(irc_variable[var_index]);
824 	switch (var->type)
825 	{
826 	case BOOL_TYPE_VAR:
827 		if (value && *value && (value = next_arg(value, &rest)))
828 		{
829 			old = var->integer;
830 			if (do_boolean(value, &(var->integer)))
831 			{
832 				say("Value must be either ON, OFF, or TOGGLE");
833 				break;
834 			}
835 			if (!(var->int_flags & VIF_CHANGED))
836 			{
837 				if (old != var->integer)
838 					var->int_flags |= VIF_CHANGED;
839 			}
840 			if (loading_global)
841 				var->int_flags |= VIF_GLOBAL;
842 			if (var->func)
843 				(var->func) (current_window, NULL, var->integer);
844 			say("Value of %s set to %s", var->name,
845 				var->integer ? var_settings[ON]
846 					     : var_settings[OFF]);
847 		}
848 		else
849 			put_it("%s", convert_output_format(fget_string_var(FORMAT_SET_FSET), "%s %s", var->name, var->integer?var_settings[ON] : var_settings[OFF]));
850 		break;
851 	case CHAR_TYPE_VAR:
852 		if (!value)
853 		{
854 			if (!(var->int_flags & VIF_CHANGED))
855 			{
856 				if (var->integer)
857 					var->int_flags |= VIF_CHANGED;
858 			}
859 			if (loading_global)
860 				var->int_flags |= VIF_GLOBAL;
861 			var->integer = ' ';
862 			if (var->func)
863 				(var->func) (current_window, NULL, var->integer);
864 			say("Value of %s set to '%c'", var->name, var->integer);
865 		}
866 
867 		else if (value && *value && (value = next_arg(value, &rest)))
868 		{
869 			if (strlen(value) > 1)
870 				say("Value of %s must be a single character",
871 					var->name);
872 			else
873 			{
874 				if (!(var->int_flags & VIF_CHANGED))
875 				{
876 					if (var->integer != *value)
877 						var->int_flags |= VIF_CHANGED;
878 				}
879 				if (loading_global)
880 					var->int_flags |= VIF_GLOBAL;
881 				var->integer = *value;
882 				if (var->func)
883 					(var->func) (current_window, NULL, var->integer);
884 				say("Value of %s set to '%c'", var->name,
885 					var->integer);
886 			}
887 		}
888 		else
889 			put_it("%s", convert_output_format(fget_string_var(FORMAT_SET_FSET), "%s %c", var->name, var->integer));
890 		break;
891 	case INT_TYPE_VAR:
892 		if (value && *value && (value = next_arg(value, &rest)))
893 		{
894 			int	val;
895 
896 			if (!is_number(value))
897 			{
898 				say("Value of %s must be numeric!", var->name);
899 				break;
900 			}
901 			if ((val = my_atol(value)) < 0)
902 			{
903 				say("Value of %s must be greater than 0", var->name);
904 				break;
905 			}
906 			if (!(var->int_flags & VIF_CHANGED))
907 			{
908 				if (var->integer != val)
909 					var->int_flags |= VIF_CHANGED;
910 			}
911 			if (loading_global)
912 				var->int_flags |= VIF_GLOBAL;
913 			var->integer = val;
914 			if (var->func)
915 				(var->func) (current_window, NULL, var->integer);
916 			say("Value of %s set to %d", var->name, var->integer);
917 		}
918 		else
919 			put_it("%s", convert_output_format(fget_string_var(FORMAT_SET_FSET), "%s %d", var->name, var->integer));
920 		break;
921 	case STR_TYPE_VAR:
922 		if (value)
923 		{
924 			if (*value)
925 			{
926 				char	*temp = NULL;
927 
928 				if (var->flags & VF_EXPAND_PATH)
929 				{
930 					temp = expand_twiddle(value);
931 					if (temp)
932 						value = temp;
933 					else
934 						say("SET: no such user");
935 				}
936 				if ((!var->int_flags & VIF_CHANGED))
937 				{
938 					if ((var->string && ! value) ||
939 					    (! var->string && value) ||
940 					    my_stricmp(var->string, value))
941 						var->int_flags |= VIF_CHANGED;
942 				}
943 				if (loading_global)
944 					var->int_flags |= VIF_GLOBAL;
945 				malloc_strcpy(&(var->string), value);
946 				if (temp)
947 					new_free(&temp);
948 			}
949 			else
950 			{
951 				put_it("%s", convert_output_format(fget_string_var(var->string?FORMAT_SET_FSET:FORMAT_SET_NOVALUE_FSET), "%s %s", var->name, var->string));
952 #ifdef WANT_DLL
953 				goto got_dll;
954 #else
955 				return;
956 #endif
957 			}
958 		}
959 		else
960 			new_free(&(var->string));
961 		if (var->func && !(var->int_flags & VIF_PENDING))
962 		{
963 			var->int_flags |= VIF_PENDING;
964 			(var->func) (current_window, var->string, 0);
965 			var->int_flags &= ~VIF_PENDING;
966 		}
967 		say("Value of %s set to %s", var->name, var->string ?
968 			var->string : "<EMPTY>");
969 		break;
970 	}
971 #ifdef WANT_DLL
972 got_dll:
973 	if (dll)
974 	{
975 		dll->integer = var->integer;
976 		if (var->string)
977 			dll->string = m_strdup(var->string);
978 		else
979 			dll->string = NULL;
980 		new_free(&var->string);
981 		new_free((char **)&var);
982 	}
983 #endif
984 
985 }
986 
987 extern AliasStack1 *set_stack;
do_stack_set(int type,char * args)988 void do_stack_set(int type, char *args)
989 {
990 	AliasStack1 *aptr = set_stack;
991 	AliasStack1 **aptrptr = &set_stack;
992 
993 	if (!*aptrptr && (type == STACK_POP || type == STACK_LIST))
994 	{
995 		say("Set stack is empty!");
996 		return;
997 	}
998 
999 	if (STACK_PUSH == type)
1000 	{
1001 		enum VAR_TYPES var_index;
1002 		int cnt = 0;
1003 		char *copy;
1004 		copy = LOCAL_COPY(args);
1005 		/* Dont need to unstub it, we're not actually using it. */
1006 		upper(copy);
1007 		find_fixed_array_item(irc_variable, sizeof(IrcVariable), NUMBER_OF_VARIABLES, copy, &cnt, (int *)&var_index);
1008 		if (cnt < 0)
1009 		{
1010 			aptr = (AliasStack1 *)new_malloc(sizeof(AliasStack1));
1011 			aptr->next = aptrptr ? *aptrptr : NULL;
1012 			*aptrptr = aptr;
1013 			aptr->set = (IrcVariable *) new_malloc(sizeof(IrcVariable));
1014 			memcpy(aptr->set, &irc_variable[var_index], sizeof(IrcVariable));
1015 			aptr->name = m_strdup(irc_variable[var_index].name);
1016 			if (irc_variable[var_index].string)
1017 				aptr->set->string = m_strdup(irc_variable[var_index].string);
1018 			aptr->var_index = var_index;
1019 		}
1020 		else if ((cnt == 0))
1021 			say("No such Set [%s]", args);
1022 		else
1023 			say("Set is ambiguous %s", args);
1024 		return;
1025 	}
1026 
1027 	if (STACK_POP == type)
1028 	{
1029 		AliasStack1 *prev = NULL;
1030 		for (aptr = *aptrptr; aptr; prev = aptr, aptr = aptr->next)
1031 		{
1032 			/* have we found it on the stack? */
1033 			if (!my_stricmp(args, aptr->name))
1034 			{
1035 				/* remove it from the list */
1036 				if (prev == NULL)
1037 					*aptrptr = aptr->next;
1038 				else
1039 					prev->next = aptr->next;
1040 
1041 				new_free(&(irc_variable[aptr->var_index].string));
1042 				memcpy(&irc_variable[aptr->var_index], aptr->set, sizeof(IrcVariable));
1043 				/* free it */
1044 				new_free((char **)&aptr->name);
1045 				new_free((char **)&aptr->set);
1046 				new_free((char **)&aptr);
1047 				return;
1048 			}
1049 		}
1050 		say("%s is not on the %s stack!", args, "Set");
1051 		return;
1052 	}
1053 	if (STACK_LIST == type)
1054 	{
1055 		AliasStack1 *prev = NULL;
1056 		for (aptr = *aptrptr; aptr; prev = aptr, aptr = aptr->next)
1057 		{
1058 			switch(aptr->set->type)
1059 			{
1060 				case BOOL_TYPE_VAR:
1061 					say("Variable [%s] = %s", aptr->set->name, on_off(aptr->set->integer));
1062 					break;
1063 				case INT_TYPE_VAR:
1064 					say("Variable [%s] = %d", aptr->set->name, aptr->set->integer);
1065 					break;
1066 				case CHAR_TYPE_VAR:
1067 					say("Variable [%s] = %c", aptr->set->name, aptr->set->integer);
1068 					break;
1069 				case STR_TYPE_VAR:
1070 					say("Variable [%s] = %s", aptr->set->name, aptr->set->string?aptr->set->string:"<Empty String>");
1071 					break;
1072 				default:
1073 					bitchsay("Error in do_stack_set: unknown set type");
1074 			}
1075 		}
1076 		return;
1077 	}
1078 	say("Unknown STACK type ??");
1079 }
1080 
1081 
1082 /*
1083  * set_variable: The SET command sets one of the irc variables.  The args
1084  * should consist of "variable-name setting", where variable name can be
1085  * partial, but non-ambbiguous, and setting depends on the variable being set
1086  */
BUILT_IN_COMMAND(setcmd)1087 BUILT_IN_COMMAND(setcmd)
1088 {
1089 	char	*var;
1090 	int	cnt = 0;
1091 	int	hook = 0;
1092 
1093 enum VAR_TYPES	var_index = 0;
1094 
1095 	IrcVariableDll *dll = NULL;
1096 
1097 	if ((var = next_arg(args, &args)) != NULL)
1098 	{
1099 		if (*var == '-')
1100 		{
1101 			var++;
1102 			args = NULL;
1103 		}
1104 #ifdef WANT_DLL
1105 		if (dll_variable)
1106 		{
1107 			int dll_cnt = 0;
1108 			if ((dll = (IrcVariableDll *) find_in_list_ext((List **)&dll_variable, var, 0, list_strnicmp)))
1109 			{
1110 				IrcVariableDll *tmp;
1111 				for (tmp = dll; tmp; tmp = tmp->next)
1112 				{
1113 					if (!my_strnicmp(tmp->name, var, strlen(var)))
1114 						dll_cnt++;
1115 				}
1116 				if (my_stricmp(dll->name, var))
1117 				{
1118 					cnt = dll_cnt;
1119 					if (cnt == 1)
1120 						cnt = -1;
1121 				}
1122 				else
1123 					cnt = -1;
1124 			}
1125 		}
1126 		if (cnt == 0)
1127 #endif
1128 		{
1129 			upper(var);
1130 			find_fixed_array_item (irc_variable, sizeof(IrcVariable), NUMBER_OF_VARIABLES, var, &cnt, (int *)&var_index);
1131 		}
1132 
1133 		if (cnt == 1)
1134 			cnt = -1;
1135 		if ((cnt >= 0) || (!dll && !(irc_variable[var_index].int_flags & VIF_PENDING)) || (dll && !(dll->int_flags & VIF_PENDING)))
1136 			hook = 1;
1137 
1138 		if (cnt < 0)
1139 		{
1140 			if (dll)
1141 				dll->int_flags |= VIF_PENDING;
1142 			else
1143 				irc_variable[var_index].int_flags |= VIF_PENDING;
1144 		}
1145 
1146 		if (hook)
1147 		{
1148 			hook = do_hook(SET_LIST, "%s %s", var, args ? args : "<unset>"/*empty_string*/);
1149 			if (hook && (cnt < 0))
1150 			{
1151 				hook = do_hook(SET_LIST, "%s %s",
1152 					dll? dll->name : irc_variable[var_index].name,
1153 					args ? args : "<unset>" /*empty_string*/);
1154 			}
1155 		}
1156 		if (cnt < 0)
1157 		{
1158 			if (dll)
1159 				dll->int_flags &= ~VIF_PENDING;
1160 			else
1161 				irc_variable[var_index].int_flags &= ~VIF_PENDING;
1162 		}
1163 		if (hook)
1164 		{
1165 			if (cnt < 0)
1166 				set_var_value(var_index, args, dll);
1167 			else if (cnt == 0)
1168 			{
1169 				if (!dll)
1170 				{
1171 					if (do_hook(SET_LIST, "set-error No such variable \"%s\"", var))
1172 						say("No such variable \"%s\"", var);
1173 				}
1174 				else
1175 					set_var_value(-1, args, dll);
1176 			}
1177 			else
1178 			{
1179 				if (do_hook(SET_LIST, "set-error %s is ambiguous", var))
1180 				{
1181 					say("%s is ambiguous", var);
1182 					if (dll)
1183 					{
1184 						IrcVariableDll *tmp;
1185 						for (tmp = dll; tmp; tmp = tmp->next)
1186 						{
1187 							if (!my_strnicmp(tmp->name, var, strlen(var)))
1188 								set_var_value(-1, empty_string, tmp);
1189 							else
1190 								break;
1191 						}
1192 					}
1193 					else
1194 					{
1195 						for (cnt += var_index; var_index < cnt; var_index++)
1196 							set_var_value(var_index, empty_string, dll);
1197 					}
1198 				}
1199 			}
1200 		}
1201 	}
1202 	else
1203         {
1204 		int var_index;
1205 		for (var_index = 0; var_index < NUMBER_OF_VARIABLES; var_index++)
1206 			set_var_value(var_index, empty_string, NULL);
1207 #ifdef WANT_DLL
1208 		for (dll = dll_variable; dll; dll = dll->next)
1209 			set_var_value(-1, empty_string, dll);
1210 #endif
1211 	}
1212 }
1213 
1214 /*
1215  * save_variables: this writes all of the IRCII variables to the given FILE
1216  * pointer in such a way that they can be loaded in using LOAD or the -l switch
1217  */
save_variables(FILE * fp,int do_all)1218 void save_variables(FILE *fp, int do_all)
1219 {
1220 	IrcVariable *var;
1221 
1222 	for (var = irc_variable; var->name; var++)
1223 	{
1224 		if (!(var->int_flags & VIF_CHANGED))
1225 			continue;
1226 		if ((do_all == 1) || !(var->int_flags & VIF_GLOBAL))
1227 		{
1228 			if (strcmp(var->name, "DISPLAY") == 0 || strcmp(var->name, "CLIENT_INFORMATION") == 0)
1229 				continue;
1230 			fprintf(fp, "SET ");
1231 			switch (var->type)
1232 			{
1233 			case BOOL_TYPE_VAR:
1234 				fprintf(fp, "%s %s\n", var->name, var->integer ?
1235 					var_settings[ON] : var_settings[OFF]);
1236 				break;
1237 			case CHAR_TYPE_VAR:
1238 				fprintf(fp, "%s %c\n", var->name, var->integer);
1239 				break;
1240 			case INT_TYPE_VAR:
1241 				fprintf(fp, "%s %u\n", var->name, var->integer);
1242 				break;
1243 			case STR_TYPE_VAR:
1244 				if (var->string)
1245 					fprintf(fp, "%s %s\n", var->name,
1246 						var->string);
1247 				else
1248 					fprintf(fp, "-%s\n", var->name);
1249 				break;
1250 			}
1251 		}
1252 	}
1253 }
1254 
savebitchx_variables(FILE * fp)1255 void savebitchx_variables(FILE *fp)
1256 {
1257 	IrcVariable *var;
1258 	int count = 0;
1259 	for (var = irc_variable; var->name; var++)
1260 	{
1261 		if (!(var->flags & VIF_BITCHX))
1262 			continue;
1263 		count++;
1264 		fprintf(fp, "SET ");
1265 		switch (var->type)
1266 		{
1267 		case BOOL_TYPE_VAR:
1268 			fprintf(fp, "%s %s\n", var->name, var->integer ?
1269 				var_settings[ON] : var_settings[OFF]);
1270 			break;
1271 		case CHAR_TYPE_VAR:
1272 			fprintf(fp, "%s %c\n", var->name, var->integer);
1273 			break;
1274 		case INT_TYPE_VAR:
1275 			fprintf(fp, "%s %u\n", var->name, var->integer);
1276 			break;
1277 		case STR_TYPE_VAR:
1278 			if (var->string)
1279 				fprintf(fp, "%s %s\n", var->name,
1280 					var->string);
1281 			else
1282 				fprintf(fp, "-%s\n", var->name);
1283 			break;
1284 		}
1285 	}
1286 	bitchsay("Saved %d variables", count);
1287 }
1288 
make_string_var(const char * var_name)1289 char	*make_string_var(const char *var_name)
1290 {
1291 	int	cnt,
1292 		msv_index;
1293 	char	*ret = NULL;
1294 	char	*copy;
1295 
1296 	copy = LOCAL_COPY(var_name);
1297 	upper(copy);
1298 
1299 	if ((find_fixed_array_item (irc_variable, sizeof(IrcVariable), NUMBER_OF_VARIABLES, copy, &cnt, &msv_index) == NULL))
1300 		return NULL;
1301 	if (cnt >= 0)
1302 		return NULL;
1303 	switch (irc_variable[msv_index].type)
1304 	{
1305 		case STR_TYPE_VAR:
1306 			ret = m_strdup(irc_variable[msv_index].string);
1307 			break;
1308 		case INT_TYPE_VAR:
1309 			ret = m_strdup(ltoa(irc_variable[msv_index].integer));
1310 			break;
1311 		case BOOL_TYPE_VAR:
1312 			ret = m_strdup(var_settings[irc_variable[msv_index].integer]);
1313 			break;
1314 		case CHAR_TYPE_VAR:
1315 			ret = m_dupchar(irc_variable[msv_index].integer);
1316 			break;
1317 	}
1318 	return ret;
1319 }
1320 
get_var_address(char * var_name)1321 IrcVariable *get_var_address(char *var_name)
1322 {
1323 	int	cnt,
1324 		msv_index;
1325 	char	*copy;
1326 
1327 	copy = LOCAL_COPY(var_name);
1328 	upper(copy);
1329 	if ((find_fixed_array_item (irc_variable, sizeof(IrcVariable), NUMBER_OF_VARIABLES, copy, &cnt, &msv_index) == NULL))
1330 		return NULL;
1331 	if (cnt >= 0)
1332 		return NULL;
1333 	return &irc_variable[msv_index];
1334 }
1335 
1336 /* exec_warning: a warning message displayed whenever EXEC_PROTECTION is turned off.  */
exec_warning(Window * win,char * unused,int value)1337 static	void exec_warning(Window *win, char *unused, int value)
1338 {
1339 	if (value == OFF)
1340 	{
1341 		bitchsay("Warning!  You have turned EXEC_PROTECTION off");
1342 		bitchsay("Please read the /HELP SET EXEC_PROTECTION documentation");
1343 	}
1344 }
1345 
1346 /* returns the size of the character set */
charset_size(void)1347 int charset_size(void)
1348 {
1349 	return get_int_var(EIGHT_BIT_CHARACTERS_VAR) ? 256 : 128;
1350 }
1351 
eight_bit_characters(Window * win,char * unused,int value)1352 static	void eight_bit_characters(Window *win, char *unused, int value)
1353 {
1354 	if (value == ON && !term_eight_bit())
1355 		say("Warning!  Your terminal says it does not support eight bit characters");
1356 	set_term_eight_bit(value);
1357 }
1358 
1359 
set_realname(Window * win,char * value,int unused)1360 static	void set_realname(Window *win, char *value, int unused)
1361 {
1362 	if (value)
1363 		strlcpy(realname, value, sizeof realname);
1364 	else
1365 		strlcpy(realname, empty_string, sizeof realname);
1366 }
1367 
reinit_autoresponse(Window * win,char * value,int unused)1368 void reinit_autoresponse(Window *win, char *value, int unused)
1369 {
1370 int old_window = window_display;
1371 	window_display = 1;
1372 	if (value)
1373 		malloc_strcpy(&auto_str, value);
1374 	else
1375 		bitchsay("Auto Response is set to - %s", auto_str);
1376 	window_display = old_window;
1377 }
1378 
set_numeric_string(Window * win,char * value,int unused)1379 static void set_numeric_string(Window *win, char *value, int unused)
1380 {
1381 	malloc_strcpy(&thing_ansi, value);
1382 }
1383 
set_user_mode(Window * win,char * value,int unused)1384 static void set_user_mode(Window *win, char *value, int unused)
1385 {
1386 	malloc_strcpy(&send_umode, value);
1387 }
1388 
1389 int old_ov_mode = -1;
1390 
1391 #ifdef WANT_OPERVIEW
set_ov_mode(Window * win,char * value,int unused)1392 static void set_ov_mode (Window *win, char *value, int unused)
1393 {
1394 int old_window_display = window_display;
1395 	if (!current_window)
1396 		return;
1397 	window_display = 0;
1398 	if (old_ov_mode == -1)
1399 		setup_ov_mode(unused ? 0 : 1, 0, -1);
1400 	else if (old_ov_mode != unused)
1401 		setup_ov_mode(unused ? 0 : 1, 0, -1);
1402 	old_ov_mode = unused;
1403 	window_display = old_window_display;
1404 }
1405 #endif
1406 
set_away_time(Window * win,char * unused,int value)1407 static void set_away_time(Window *win, char *unused, int value)
1408 {
1409 	if (value == 0)
1410 		set_int_var(AUTO_AWAY_TIME_VAR, 0);
1411 	else if ((value / 60) == 0)
1412 		set_int_var(AUTO_AWAY_TIME_VAR, value * 60);
1413 	else if (value < 60 * 10)
1414 		set_int_var(AUTO_AWAY_TIME_VAR, 60 * 10);
1415 	else
1416 		set_int_var(AUTO_AWAY_TIME_VAR, value);
1417 }
1418 
clear_sets(void)1419 void clear_sets(void)
1420 {
1421 int i = 0;
1422 	for(i = 0; irc_variable[i].name; i++)
1423 		new_free(&irc_variable->string);
1424 }
1425 
reinit_screen(Window * win,char * unused,int value)1426 static void reinit_screen(Window *win, char *unused, int value)
1427 {
1428 	set_input_prompt(current_window, NULL, 0);
1429 	set_input_prompt(current_window, get_string_var(INPUT_PROMPT_VAR), 0);
1430 	update_all_windows();
1431 	update_all_status(current_window, NULL, 0);
1432 	update_input(UPDATE_ALL);
1433 }
1434 
reinit_status(Window * win,char * unused,int value)1435 void reinit_status(Window *win, char *unused, int value)
1436 {
1437 	update_all_windows();
1438 	update_all_status(current_window, NULL, 0);
1439 }
1440 
toggle_reverse_status(Window * win,char * unused,int value)1441 void toggle_reverse_status(Window *win, char *unused, int value)
1442 {
1443 	if (!value)
1444 		set_int_var(REVERSE_STATUS_VAR, 1);
1445 	else
1446 		set_int_var(REVERSE_STATUS_VAR, 0);
1447 	create_fsets(win, value);
1448 	set_string_var(SHOW_NUMERICS_STR_VAR, value ? DEFAULT_SHOW_NUMERICS_STR : NO_NUMERICS_STR);
1449 	set_numeric_string(current_window, value ? DEFAULT_SHOW_NUMERICS_STR : NO_NUMERICS_STR, 0);
1450 	reinit_status(win, unused, value);
1451 }
1452 
1453 #ifdef WANT_TCL
ircii_rem_str(ClientData * cd,Tcl_Interp * intp,char * name1,char * name2,int flags)1454 char *ircii_rem_str(ClientData *cd, Tcl_Interp *intp, char *name1, char *name2, int flags)
1455 {
1456 char *s;
1457 IrcVariable *n;
1458 	n = (IrcVariable *)cd;
1459 	if ((s = Tcl_GetVar(intp, name1, TCL_GLOBAL_ONLY)))
1460 	{
1461 		Tcl_UnlinkVar(intp, name1);
1462 		if (s && *s)
1463 			malloc_strcpy(&n->string, s);
1464 		else
1465 			new_free(&n->string);
1466 		Tcl_LinkVar(intp, name1, (char *)&n->string, TCL_LINK_STRING);
1467 	}
1468 	return NULL;
1469 }
1470 
add_tcl_vars(void)1471 void add_tcl_vars(void)
1472 {
1473 char varname[80];
1474 int i = 0;
1475 	for(i = 0; irc_variable[i].name; i++)
1476 	{
1477 		int type_of = -1;
1478 		switch(irc_variable[i].type)
1479 		{
1480 			case INT_TYPE_VAR:
1481 				type_of = TCL_LINK_INT;
1482 				break;
1483 			case STR_TYPE_VAR:
1484 				type_of = TCL_LINK_STRING;
1485 				break;
1486 			case BOOL_TYPE_VAR:
1487 				type_of = TCL_LINK_BOOLEAN;
1488 				break;
1489 			default:
1490 				continue;
1491 		}
1492 		strcpy(varname, irc_variable[i].name);
1493 		lower(varname);
1494 		Tcl_LinkVar(tcl_interp, varname,
1495 			(irc_variable[i].type == STR_TYPE_VAR) ?
1496 				(char *)&irc_variable[i].string :
1497 				(char *)&irc_variable[i].integer,
1498 			type_of);
1499 		if (irc_variable[i].type == STR_TYPE_VAR)
1500 			Tcl_TraceVar(tcl_interp, varname, TCL_TRACE_WRITES,
1501 				(Tcl_VarTraceProc *)ircii_rem_str,
1502 				(ClientData)&irc_variable[i]);
1503 	}
1504 }
1505 #endif
1506 
clear_variables(void)1507 void clear_variables(void)
1508 {
1509 int i;
1510 	for(i = 0; irc_variable[i].name; i++)
1511 	{
1512 		if (irc_variable[i].string)
1513 			new_free(&irc_variable[i].string);
1514 	}
1515 }
1516 
set_clock_format(Window * win,char * value,int unused)1517 static void set_clock_format (Window *win, char *value, int unused)
1518 {
1519 	extern char *time_format; /* XXXX bogus XXXX */
1520 	malloc_strcpy(&time_format, value);
1521 	update_clock(RESET_TIME);
1522 	update_all_status(current_window, NULL, 0);
1523 }
1524 
get_all_sets(void)1525 char *get_all_sets(void)
1526 {
1527 	int i;
1528 	char *ret = NULL;
1529 	for (i = 0; irc_variable[i].name; i++)
1530 		m_s3cat(&ret, space, irc_variable[i].name);
1531 	return ret;
1532 }
1533 
get_set(char * str)1534 char *get_set(char *str)
1535 {
1536 	int i;
1537 	char *ret = NULL;
1538 	if (!str || !*str)
1539 		return get_all_sets();
1540 	for (i = 0; irc_variable[i].name; i++)
1541 		if (wild_match(str, irc_variable[i].name))
1542 			m_s3cat(&ret, space, irc_variable[i].name);
1543 	return ret ? ret : m_strdup(empty_string);
1544 }
1545 
set_dcc_timeout(Window * win,char * unused,int value)1546 static void	set_dcc_timeout (Window *win, char *unused, int value)
1547 {
1548 extern time_t dcc_timeout;
1549 	if (value == 0)
1550 		dcc_timeout = (time_t) -1;
1551 	else
1552 		dcc_timeout = value;
1553 }
1554 
set_use_socks(Window * win,char * value,int unused)1555 static void	set_use_socks(Window *win, char *value, int unused)
1556 {
1557 extern int use_socks;
1558 	if (value && *value)
1559 		use_socks = 1;
1560 	else
1561 		use_socks = 0;
1562 }
1563 
1564 
parse_mangle(char * value,int nvalue,char ** rv)1565 int	parse_mangle (char *value, int nvalue, char **rv)
1566 {
1567 	char	*str1, *str2;
1568 	char	*copy;
1569 	char	*nv = NULL;
1570 
1571 	if (rv)
1572 		*rv = NULL;
1573 
1574 	if (!value)
1575 		return 0;
1576 
1577 	copy = LOCAL_COPY(value);
1578 
1579 	while ((str1 = new_next_arg(copy, &copy)))
1580 	{
1581 		while (*str1 && (str2 = next_in_comma_list(str1, &str1)))
1582 		{
1583 		     if (!my_strnicmp(str2, "ALL", 3))
1584 				nvalue = (0x7FFFFFFF - (MANGLE_ESCAPES));
1585 			else if (!my_strnicmp(str2, "-ALL", 4))
1586 				nvalue = 0;
1587 			else if (!my_strnicmp(str2, "ALL_OFF", 4))
1588 				nvalue |= STRIP_ALL_OFF;
1589 			else if (!my_strnicmp(str2, "-ALL_OFF", 5))
1590 				nvalue &= ~(STRIP_ALL_OFF);
1591 			else if (!my_strnicmp(str2, "ANSI", 2))
1592 				nvalue |= MANGLE_ANSI_CODES;
1593 			else if (!my_strnicmp(str2, "-ANSI", 3))
1594 				nvalue &= ~(MANGLE_ANSI_CODES);
1595 			else if (!my_strnicmp(str2, "BLINK", 2))
1596 				nvalue |= STRIP_BLINK;
1597 			else if (!my_strnicmp(str2, "-BLINK", 3))
1598 				nvalue &= ~(STRIP_BLINK);
1599 			else if (!my_strnicmp(str2, "BOLD", 2))
1600 				nvalue |= STRIP_BOLD;
1601 			else if (!my_strnicmp(str2, "-BOLD", 3))
1602 				nvalue &= ~(STRIP_BOLD);
1603 			else if (!my_strnicmp(str2, "COLOR", 1))
1604 				nvalue |= STRIP_COLOR;
1605 			else if (!my_strnicmp(str2, "-COLOR", 2))
1606 				nvalue &= ~(STRIP_COLOR);
1607 			else if (!my_strnicmp(str2, "ESCAPE", 1))
1608 				nvalue |= MANGLE_ESCAPES;
1609 			else if (!my_strnicmp(str2, "-ESCAPE", 2))
1610 				nvalue &= ~(MANGLE_ESCAPES);
1611 			else if (!my_strnicmp(str2, "ND_SPACE", 2))
1612 				nvalue |= STRIP_ND_SPACE;
1613 			else if (!my_strnicmp(str2, "-ND_SPACE", 3))
1614 				nvalue &= ~(STRIP_ND_SPACE);
1615 			else if (!my_strnicmp(str2, "NONE", 2))
1616 				nvalue = 0;
1617 			else if (!my_strnicmp(str2, "REVERSE", 1))
1618 				nvalue |= STRIP_REVERSE;
1619 			else if (!my_strnicmp(str2, "-REVERSE", 2))
1620 				nvalue &= ~(STRIP_REVERSE);
1621 			else if (!my_strnicmp(str2, "ROM_CHAR", 1))
1622 				nvalue |= STRIP_ROM_CHAR;
1623 			else if (!my_strnicmp(str2, "-ROM_CHAR", 2))
1624 				nvalue &= ~(STRIP_ROM_CHAR);
1625 			else if (!my_strnicmp(str2, "UNDERLINE", 1))
1626 				nvalue |= STRIP_UNDERLINE;
1627 			else if (!my_strnicmp(str2, "-UNDERLINE", 2))
1628 				nvalue &= ~(STRIP_UNDERLINE);
1629 		}
1630 	}
1631 
1632 	if (rv)
1633 	{
1634 		if (nvalue & MANGLE_ESCAPES)
1635 			m_s3cat(&nv, comma, "ESCAPE");
1636 		if (nvalue & MANGLE_ANSI_CODES)
1637 			m_s3cat(&nv, comma, "ANSI");
1638 		if (nvalue & STRIP_COLOR)
1639 			m_s3cat(&nv, comma, "COLOR");
1640 		if (nvalue & STRIP_REVERSE)
1641 			m_s3cat(&nv, comma, "REVERSE");
1642 		if (nvalue & STRIP_UNDERLINE)
1643 			m_s3cat(&nv, comma, "UNDERLINE");
1644 		if (nvalue & STRIP_BOLD)
1645 			m_s3cat(&nv, comma, "BOLD");
1646 		if (nvalue & STRIP_BLINK)
1647 			m_s3cat(&nv, comma, "BLINK");
1648 		if (nvalue & STRIP_ROM_CHAR)
1649 			m_s3cat(&nv, comma, "ROM_CHAR");
1650 		if (nvalue & STRIP_ND_SPACE)
1651 			m_s3cat(&nv, comma, "ND_SPACE");
1652 		if (nvalue & STRIP_ALL_OFF)
1653 			m_s3cat(&nv, comma, "ALL_OFF");
1654 
1655 		*rv = nv;
1656 	}
1657 
1658 	return nvalue;
1659 }
1660 
set_mangle_inbound(Window * w,char * value,int unused)1661 static	void	set_mangle_inbound (Window *w, char *value, int unused)
1662 {
1663 	char *nv = NULL;
1664 	inbound_line_mangler = parse_mangle(value, inbound_line_mangler, &nv);
1665 	set_string_var(MANGLE_INBOUND_VAR, nv);
1666 	new_free(&nv);
1667 }
1668 
set_mangle_outbound(Window * w,char * value,int unused)1669 static	void	set_mangle_outbound (Window *w, char *value, int unused)
1670 {
1671 	char *nv = NULL;
1672 	outbound_line_mangler = parse_mangle(value, outbound_line_mangler, &nv);
1673 	set_string_var(MANGLE_OUTBOUND_VAR, nv);
1674 	new_free(&nv);
1675 }
1676 
set_mangle_logfiles(Window * w,char * value,int unused)1677 static	void	set_mangle_logfiles (Window *w, char *value, int unused)
1678 {
1679 	char *nv = NULL;
1680 	logfile_line_mangler = parse_mangle(value, logfile_line_mangler, &nv);
1681 	set_string_var(MANGLE_LOGFILES_VAR, nv);
1682 	if (w)
1683 		w->mangler = logfile_line_mangler;
1684 	new_free(&nv);
1685 }
1686 
set_mangle_operlog(Window * w,char * value,int unused)1687 static	void	set_mangle_operlog (Window *w, char *value, int unused)
1688 {
1689 	char *nv = NULL;
1690 	operlog_line_mangler = parse_mangle(value, operlog_line_mangler, &nv);
1691 	set_string_var(MANGLE_OPERLOG_VAR, nv);
1692 	new_free(&nv);
1693 }
1694 
set_nat_address(Window * w,char * value,int unused)1695 static	void	set_nat_address (Window *w, char *value, int unused)
1696 {
1697 	char *nv = NULL, *h;
1698 	if (value && *value)
1699 	{
1700 		nv = next_arg(value, &value);
1701 		if (isdigit((unsigned char)*nv))
1702 			h = nv;
1703 		else
1704 			h = host_to_ip(nv);
1705 		set_string_var(NAT_ADDRESS_VAR, h);
1706         	nat_address.s_addr = inet_addr(h);
1707 		use_nat_address = 2;
1708 	}
1709 	else
1710 	{
1711 		set_string_var(NAT_ADDRESS_VAR, NULL);
1712 		use_nat_address = 0;
1713 	}
1714 }
1715 
1716 #ifdef GUI
return_irc_var(int nummer)1717 IrcVariable *return_irc_var(int nummer)
1718 {
1719    return &irc_variable[nummer];
1720 }
1721 #endif
1722