1 /*
2  * vars.c: All the dealing of the irc variables are handled here.
3  *
4  * Written By Michael Sandrof
5  *
6  * Copyright (c) 1990 Michael Sandrof.
7  * Copyright (c) 1991, 1992 Troy Rollo.
8  * Copyright (c) 1992-2001 Matthew R. Green.
9  * All rights reserved.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  * 3. The name of the author may not be used to endorse or promote products
20  *    derived from this software without specific prior written permission.
21  *
22  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
23  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
24  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
25  * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
26  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
27  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
28  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
29  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
30  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32  * SUCH DAMAGE.
33  */
34 
35 #include "irc.h"
36 #include "dma.h"
37 IRCII_RCSID("@(#)$eterna: vars.c,v 1.71 2001/08/12 16:25:04 mrg Exp $");
38 
39 #include "status.h"
40 #include "window.h"
41 #include "lastlog.h"
42 #include "log.h"
43 #include "irccrypt.h"
44 #include "history.h"
45 #include "notify.h"
46 #include "vars.h"
47 #include "input.h"
48 #include "ircaux.h"
49 #include "whois.h"
50 #include "translat.h"
51 #include "ircterm.h"
52 #include "output.h"
53 #include "server.h"
54 
55 #include "ninja.h"
56 
57 /* IrcVariable: structure for each variable in the variable table */
58 typedef struct
59 {
60 	char	*name;			/* what the user types */
61 	int	type;			/* variable types, see below */
62 	int	integer;		/* int value of variable */
63 	char	*string;		/* string value of variable */
64 	void	(*func) ();		/* function to do every time variable is set */
65 	unsigned short	int_flags;	/* internal flags to the variable */
66 	unsigned short	flags;		/* flags for this variable */
67 }	IrcVariable;
68 
69 #define	VF_NODAEMON	0x0001
70 #define VF_EXPAND_PATH	0x0002
71 
72 #define VIF_CHANGED	0x01
73 #define VIF_GLOBAL	0x02
74 
75 /* the types of IrcVariables */
76 #define BOOL_TYPE_VAR 0
77 #define CHAR_TYPE_VAR 1
78 #define INT_TYPE_VAR 2
79 #define STR_TYPE_VAR 3
80 
81 char	*var_settings[] =
82 {
83 	"OFF", "ON", "TOGGLE"
84 };
85 
86 /* For the NOVICE variable. Complain loudlly if turned off manually.  */
87 extern	int	load_depth;
88 
89 extern  Screen	*screen_list, *current_screen;
90 
91 	int	loading_global = 0;
92 
93 static	int	find_variable _((u_char *, int *));
94 static	void	exec_warning _((int));
95 static	void	input_warning _((int));
96 static	void	eight_bit_characters _((int));
97 static	void	set_realname _((u_char *));
98 
99 /* ninja extensions */
100 static	void	set_leader _((u_char *));
101 static	void	ansi_color_toggle _((int));
102 
103 #ifdef _Windows
104 extern	u_char *get_ini_value(u_char *pchEntry);
105 #endif /* _Windows */
106 
107 /*
108  * irc_variable: all the irc variables used.  Note that the integer and
109  * boolean defaults are set here, which the string default value are set in
110  * the init_variables() procedure
111  */
112 static	IrcVariable irc_variable[] =
113 {
114 	{ "ALWAYS_SPLIT_BIGGEST",	BOOL_TYPE_VAR,	DEFAULT_ALWAYS_SPLIT_BIGGEST, NULL, NULL, 0, 0 },
115    /* ninja start */
116 	{ "ANSI_COLOR",			BOOL_TYPE_VAR,	DEFAULT_ANSI_COLOR, NULL, ansi_color_toggle, 0, 0 },
117 	{ "ANTI_IDLE",			BOOL_TYPE_VAR,	DEFAULT_ANTI_IDLE, NULL, NULL, 0, 0 },
118 	{ "AUTO_RECONNECT_DELAY",      	INT_TYPE_VAR,	DEFAULT_AUTO_RECONNECT_DELAY, NULL, NULL, 0, 0 },
119 	{ "AUTO_REJOIN",       		BOOL_TYPE_VAR,	DEFAULT_AUTO_REJOIN, NULL, NULL, 0, 0 },
120    /* ninja end */
121 	{ "AUTO_UNMARK_AWAY",		BOOL_TYPE_VAR,	DEFAULT_AUTO_UNMARK_AWAY, NULL, NULL, 0, 0 },
122    /* ninja start */
123 	{ "AUTO_WHOIS_NICK_IN_USE",    	BOOL_TYPE_VAR,	DEFAULT_AUTO_WHOIS_NICK_IN_USE, NULL, NULL, 0, 0 },
124    /* ninja end */
125 	{ "AUTO_WHOWAS",		BOOL_TYPE_VAR,	DEFAULT_AUTO_WHOWAS, NULL, NULL, 0, 0 },
126 	{ "BACKGROUND_COLOR",		INT_TYPE_VAR,	DEFAULT_BACKGROUND_COLOUR, 0, 0 },
127 	{ "BEEP",			BOOL_TYPE_VAR,	DEFAULT_BEEP, NULL, NULL, 0, 0 },
128 	{ "BEEP_MAX",			INT_TYPE_VAR,	DEFAULT_BEEP_MAX, NULL, NULL, 0, 0 },
129 	{ "BEEP_ON_MSG",		STR_TYPE_VAR,	0, NULL, set_beep_on_msg, 0, 0 },
130 	{ "BEEP_WHEN_AWAY",		INT_TYPE_VAR,	DEFAULT_BEEP_WHEN_AWAY, NULL, NULL, 0, 0 },
131 	{ "BOLD_VIDEO",			BOOL_TYPE_VAR,	DEFAULT_BOLD_VIDEO, NULL, NULL, 0, 0 },
132 	{ "CHANNEL_NAME_WIDTH",		INT_TYPE_VAR,	DEFAULT_CHANNEL_NAME_WIDTH, NULL, update_all_status, 0, 0 },
133 	{ "CLIENT_INFORMATION",		STR_TYPE_VAR,	0, NULL, NULL, 0, 0 },
134    /* ninja start */
135 	{ "CLOAK",			BOOL_TYPE_VAR,	DEFAULT_CLOAK, NULL, NULL, 0, VF_NODAEMON },
136    /* ninja end */
137 	{ "CLOCK",			BOOL_TYPE_VAR,	DEFAULT_CLOCK, NULL, update_all_status, 0, 0 },
138 	{ "CLOCK_24HOUR",		BOOL_TYPE_VAR,	DEFAULT_CLOCK_24HOUR, NULL, reset_clock, 0, 0 },
139 #ifdef SUPPORT_ALARM_CLOCK
140 	{ "CLOCK_ALARM",		STR_TYPE_VAR,	0, NULL, set_alarm, 0, 0 },
141 #else
142 	{ "CLOCK_ALARM",		STR_TYPE_VAR,	0, NULL, no_alarm_clock, 0, 0 },
143 #endif
144 	{ "CMDCHARS",			STR_TYPE_VAR,	0, NULL, NULL, 0, 0 },
145    /*
146     * moved to MIRC_COLOR
147     *
148 	{ "COLOUR",			BOOL_TYPE_VAR,	DEFAULT_COLOUR, NULL, NULL, 0, 0 },
149     */
150 	{ "COMMAND_MODE",		BOOL_TYPE_VAR,	DEFAULT_COMMAND_MODE, NULL, NULL, 0, 0 },
151 	{ "CONTINUED_LINE",		STR_TYPE_VAR,	0, NULL, set_continued_line, 0, 0 },
152 	{ "CTCP_REPLY_BACKLOG_SECONDS",	INT_TYPE_VAR,	DEFAULT_CTCP_REPLY_BACKLOG_SECONDS, NULL, ctcp_reply_backlog_change, 0, 0 },
153 	{ "CTCP_REPLY_FLOOD_SIZE",	INT_TYPE_VAR,	DEFAULT_CTCP_REPLY_FLOOD_SIZE_VAR, NULL, NULL, 0, 0 },
154 	{ "CTCP_REPLY_IGNORE_SECONDS",	INT_TYPE_VAR,	DEFAULT_CTCP_REPLY_IGNORE_SECONDS, NULL, NULL, 0, 0 },
155    /* ninja start */
156 	{ "DCC_AUTOGET",       		BOOL_TYPE_VAR,	DEFAULT_DCC_AUTOGET, NULL, NULL, 0, VF_NODAEMON },
157    /* ninja end */
158 	{ "DCC_BLOCK_SIZE",		INT_TYPE_VAR,	DEFAULT_DCC_BLOCK_SIZE, NULL, NULL, 0, 0 },
159    /* ninja start */
160 	{ "DCC_IDLE_LIMIT",    		INT_TYPE_VAR,	DEFAULT_DCC_IDLE_LIMIT, NULL, NULL, 0, 0 },
161    /* ninja end */
162 	{ "DEBUG",			INT_TYPE_VAR,	0, NULL, NULL, 0, 0 },
163    /* ninja start */
164 	{ "DEFAULT_AWAY_MSG",  		STR_TYPE_VAR,	0, NULL, NULL, 0, 0 },
165 	{ "DEFAULT_BACK_MSG",  		STR_TYPE_VAR,	0, NULL, NULL, 0, 0 },
166    /* ninja end */
167 	{ "DISPLAY",			BOOL_TYPE_VAR,	DEFAULT_DISPLAY, NULL, NULL, 0, 0 },
168    /* ninja start */
169 	{ "DOUBLE_CHECK_ADDRESSES",    	BOOL_TYPE_VAR,	DEFAULT_DOUBLE_CHECK_ADDRESSES, NULL, NULL, 0, 0 },
170    /* ninja end */
171 	{ "EIGHT_BIT_CHARACTERS",	BOOL_TYPE_VAR,	DEFAULT_EIGHT_BIT_CHARACTERS, NULL, eight_bit_characters, 0, 0 },
172    /* ninja start */
173 	{ "EMAIL_ADDRESS",	    	STR_TYPE_VAR,	0, NULL, NULL, 0, VF_NODAEMON },
174    /* ninja end */
175 	{ "ENCRYPT_PROGRAM",		STR_TYPE_VAR,	0, NULL, NULL, 0, VF_NODAEMON },
176 	{ "EXEC_PROTECTION",		BOOL_TYPE_VAR,	DEFAULT_EXEC_PROTECTION, NULL, exec_warning, 0, VF_NODAEMON },
177    /* ninja start */
178 	{ "EXTENDED_CACHE",    		BOOL_TYPE_VAR,	DEFAULT_EXTENDED_CACHE, NULL, NULL, 0, 0 },
179    /* ninja end */
180 	{ "FLOOD_AFTER",		INT_TYPE_VAR,	DEFAULT_FLOOD_AFTER, NULL, NULL, 0, 0 },
181    /* ninja start */
182 	{ "FLOOD_IGNORE_TIME",    	INT_TYPE_VAR,	DEFAULT_FLOOD_IGNORE_TIME, NULL, NULL, 0, 0 },
183 	{ "FLOOD_PROTECTION",		BOOL_TYPE_VAR,	DEFAULT_FLOOD_PROTECTION, NULL, NULL, 0, 0 },
184    /* ninja end */
185 	{ "FLOOD_RATE",			INT_TYPE_VAR,	DEFAULT_FLOOD_RATE, NULL, NULL, 0, 0 },
186 	{ "FLOOD_USERS",		INT_TYPE_VAR,	DEFAULT_FLOOD_USERS, NULL, NULL, 0, 0 },
187 	{ "FLOOD_WARNING",		BOOL_TYPE_VAR,	DEFAULT_FLOOD_WARNING, NULL, NULL, 0, 0 },
188 	{ "FOREGROUND_COLOR",		INT_TYPE_VAR,	DEFAULT_FOREGROUND_COLOUR, 0, 0 },
189 	{ "FULL_STATUS_LINE",		BOOL_TYPE_VAR,	DEFAULT_FULL_STATUS_LINE, NULL, update_all_status, 0, 0 },
190    /* ninja start */
191 	{ "HACKED_IDENTD",	    	STR_TYPE_VAR,	0, NULL, NULL, 0, VF_NODAEMON },
192    /* ninja end */
193 	{ "HELP_PAGER",			BOOL_TYPE_VAR,	DEFAULT_HELP_PAGER, NULL, NULL, 0, 0 },
194 	{ "HELP_PATH",			STR_TYPE_VAR,	0, NULL, NULL, 0, VF_EXPAND_PATH|VF_NODAEMON },
195 	{ "HELP_PROMPT",		BOOL_TYPE_VAR,	DEFAULT_HELP_PROMPT, NULL, NULL, 0, 0 },
196 	{ "HELP_WINDOW",		BOOL_TYPE_VAR,	DEFAULT_HELP_WINDOW, NULL, NULL, 0, 0 },
197 	{ "HIDE_CHANNEL_KEYS",		BOOL_TYPE_VAR,	DEFAULT_HIDE_CHANNEL_KEYS, NULL, update_all_status, 0, 0 },
198 	{ "HIDE_PRIVATE_CHANNELS",	BOOL_TYPE_VAR,	DEFAULT_HIDE_PRIVATE_CHANNELS, NULL, update_all_status, 0, 0 },
199 	{ "HIGHLIGHT_CHAR",		STR_TYPE_VAR,	0, NULL, set_highlight_char, 0, 0 },
200 	{ "HISTORY",			INT_TYPE_VAR,	DEFAULT_HISTORY, NULL, set_history_size, 0, VF_NODAEMON },
201 	{ "HISTORY_FILE",		STR_TYPE_VAR,	0, NULL, set_history_file, 0, 0 },
202 	{ "HOLD_MODE",			BOOL_TYPE_VAR,	DEFAULT_HOLD_MODE, NULL, reset_line_cnt, 0, 0 },
203 	{ "HOLD_MODE_MAX",		INT_TYPE_VAR,	DEFAULT_HOLD_MODE_MAX, NULL, NULL, 0, 0 },
204    /* ninja start */
205 	{ "IDLE_LIMIT",    		INT_TYPE_VAR,	DEFAULT_IDLE_LIMIT, NULL, NULL, 0, 0 },
206    /* ninja end */
207 	{ "INDENT",			BOOL_TYPE_VAR,	DEFAULT_INDENT, NULL, NULL, 0, 0 },
208 	{ "INPUT_ALIASES",		BOOL_TYPE_VAR,	DEFAULT_INPUT_ALIASES, NULL, NULL, 0, 0 },
209 	{ "INPUT_PROMPT",		STR_TYPE_VAR,	0, NULL, set_input_prompt, 0, 0 },
210 	{ "INPUT_PROTECTION",		BOOL_TYPE_VAR,	DEFAULT_INPUT_PROTECTION, NULL, input_warning, 0, 0 },
211 	{ "INSERT_MODE",		BOOL_TYPE_VAR,	DEFAULT_INSERT_MODE, NULL, update_all_status, 0, 0 },
212 	{ "INVERSE_VIDEO",		BOOL_TYPE_VAR,	DEFAULT_INVERSE_VIDEO, NULL, NULL, 0, 0 },
213 	{ "IRCHOST",			STR_TYPE_VAR,	0, NULL, set_irchost, 0, 0 },
214 	{ "ISO2022_SUPPORT",		BOOL_TYPE_VAR,	DEFAULT_ISO2022_SUPPORT, NULL, NULL, 0, 0 },
215    /* ninja start */
216 	{ "LAG_LIMIT",    		INT_TYPE_VAR,	DEFAULT_LAG_LIMIT, NULL, NULL, 0, 0 },
217    /* ninja end */
218 	{ "LASTLOG",			INT_TYPE_VAR,	DEFAULT_LASTLOG, NULL, set_lastlog_size, 0, 0 },
219 	{ "LASTLOG_LEVEL",		STR_TYPE_VAR,	0, NULL, set_lastlog_level, 0, 0 },
220    /* ninja start */
221 	{ "LEADER",		    	STR_TYPE_VAR,	0, NULL, set_leader, 0, VF_NODAEMON },
222    /* ninja end */
223 	{ "LOAD_PATH",			STR_TYPE_VAR,	0, NULL, NULL, 0, VF_NODAEMON },
224 	{ "LOG",			BOOL_TYPE_VAR,	DEFAULT_LOG, NULL, logger, 0, 0 },
225 	{ "LOGFILE",			STR_TYPE_VAR,	0, NULL, set_log_file, 0, VF_NODAEMON },
226 	{ "MAIL",			INT_TYPE_VAR,	DEFAULT_MAIL, NULL, update_all_status, 0, VF_NODAEMON },
227 	{ "MAKE_NOTICE_MSG",		BOOL_TYPE_VAR,	DEFAULT_MAKE_NOTICE_MSG, NULL, NULL, 0, 0},
228 	{ "MAX_RECURSIONS",		INT_TYPE_VAR,	DEFAULT_MAX_RECURSIONS, NULL, NULL, 0, 0 },
229 	{ "MENU",			STR_TYPE_VAR,	0, NULL, set_menu, 0, 0 },
230 	{ "MINIMUM_SERVERS",		INT_TYPE_VAR,	DEFAULT_MINIMUM_SERVERS, NULL, NULL, 0, VF_NODAEMON },
231 	{ "MINIMUM_USERS",		INT_TYPE_VAR,	DEFAULT_MINIMUM_USERS, NULL, NULL, 0, VF_NODAEMON },
232 	{ "MIRC_COLOR",			BOOL_TYPE_VAR,	DEFAULT_MIRC_COLOR, NULL, NULL, 0, 0 },
233    /* ninja start */
234 	{ "NDCC_INTERVAL",	 	INT_TYPE_VAR,	DEFAULT_NDCC_INTERVAL, NULL, NULL, 0, 0 },
235 	{ "NDCC_OFFERING",	 	BOOL_TYPE_VAR,	DEFAULT_NDCC_OFFERING, NULL, NULL, 0, 0 },
236 	{ "NDCC_PUBLIC",	 	BOOL_TYPE_VAR,	DEFAULT_NDCC_PUBLIC, NULL, NULL, 0, 0 },
237 	{ "NDCC_SECURE",	 	BOOL_TYPE_VAR,	DEFAULT_NDCC_SECURE, NULL, NULL, 0, 0 },
238    /* ninja end */
239 	{ "NO_ASK_NICKNAME",		BOOL_TYPE_VAR,	DEFAULT_NO_ASK_NICKNAME, NULL, NULL, 0, 0 },
240 	{ "NO_CTCP_FLOOD",		BOOL_TYPE_VAR,	DEFAULT_NO_CTCP_FLOOD, NULL, NULL, 0, 0 },
241 	{ "NOTIFY_HANDLER",		STR_TYPE_VAR, 	0, 0, set_notify_handler, 0, 0 },
242 	{ "NOTIFY_LEVEL",		STR_TYPE_VAR,	0, NULL, set_notify_level, 0, 0 },
243 	{ "NOTIFY_ON_TERMINATION",	BOOL_TYPE_VAR,	DEFAULT_NOTIFY_ON_TERMINATION, NULL, NULL, 0, VF_NODAEMON },
244 	{ "NOVICE",			BOOL_TYPE_VAR,	DEFAULT_NOVICE, NULL, NULL, 0, 0 },
245 	{ "OLD_ENCRYPT_PROGRAM",	BOOL_TYPE_VAR,	0, NULL, NULL, 0, VF_NODAEMON },
246 	{ "REALNAME",			STR_TYPE_VAR,	0, 0, set_realname, 0, VF_NODAEMON },
247    /* ninja start */
248 	{ "RESOLVE_HOSTS",		BOOL_TYPE_VAR,	DEFAULT_RESOLVE_HOSTS, NULL, NULL, 0, 0 },
249    /* ninja end */
250 	{ "SAME_WINDOW_ONLY",		BOOL_TYPE_VAR,	DEFAULT_SAME_WINDOW_ONLY, NULL, NULL, 0, 0 },
251 	{ "SCREEN_OPTIONS", 		STR_TYPE_VAR,	0, NULL, NULL, 0, VF_NODAEMON },
252 	{ "SCROLL",			BOOL_TYPE_VAR,	DEFAULT_SCROLL, NULL, set_scroll, 0, 0 },
253 	{ "SCROLL_LINES",		INT_TYPE_VAR,	DEFAULT_SCROLL_LINES, NULL, set_scroll_lines, 0, 0 },
254 	{ "SEND_IGNORE_MSG",		BOOL_TYPE_VAR,	DEFAULT_SEND_IGNORE_MSG, NULL, NULL, 0, 0 },
255 	{ "SHELL",			STR_TYPE_VAR,	0, NULL, NULL, 0, VF_NODAEMON },
256 	{ "SHELL_FLAGS",		STR_TYPE_VAR,	0, NULL, NULL, 0, VF_NODAEMON },
257 	{ "SHELL_LIMIT",		INT_TYPE_VAR,	DEFAULT_SHELL_LIMIT, NULL, NULL, 0, VF_NODAEMON },
258 	{ "SHOW_AWAY_ONCE",		BOOL_TYPE_VAR,	DEFAULT_SHOW_AWAY_ONCE, NULL, NULL, 0, 0 },
259 	{ "SHOW_CHANNEL_NAMES",		BOOL_TYPE_VAR,	DEFAULT_SHOW_CHANNEL_NAMES, NULL, NULL, 0, 0 },
260 	{ "SHOW_END_OF_MSGS",		BOOL_TYPE_VAR,	DEFAULT_SHOW_END_OF_MSGS, NULL, NULL, 0, 0 },
261 	{ "SHOW_NUMERICS",		BOOL_TYPE_VAR,	DEFAULT_SHOW_NUMERICS, NULL, NULL, 0, 0 },
262    /*
263     * ninja uses leader, not show stars
264     *
265 	{ "SHOW_STARS",			BOOL_TYPE_VAR,	1, NULL, NULL, 0, 0 },
266     */
267 	{ "SHOW_STATUS_ALL",		BOOL_TYPE_VAR,	DEFAULT_SHOW_STATUS_ALL, NULL, update_all_status, 0, 0 },
268 	{ "SHOW_WHO_HOPCOUNT", 		BOOL_TYPE_VAR,	DEFAULT_SHOW_WHO_HOPCOUNT, NULL, NULL, 0, 0 },
269    /* ninja start */
270 	{ "SILENT_AWAY",		BOOL_TYPE_VAR,	DEFAULT_SILENT_AWAY, NULL, NULL, 0, 0 },
271 	{ "SOCKS_PROXY",       	    	STR_TYPE_VAR,	0, NULL, NULL, 0, VF_NODAEMON },
272 	{ "SOCKS_USERNAME",    	    	STR_TYPE_VAR,	0, NULL, NULL, 0, VF_NODAEMON },
273 	{ "SOCKS_PASSWORD",    	    	STR_TYPE_VAR,	0, NULL, NULL, 0, VF_NODAEMON },
274    /* ninja end */
275 	/* { "STAR_PREFIX",		STR_TYPE_VAR,	0, NULL, NULL, 0, 0 }, */
276 	{ "STATUS_AWAY",		STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
277 	{ "STATUS_CHANNEL",		STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
278 	{ "STATUS_CHANOP",		STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
279 	{ "STATUS_CLOCK",		STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
280 	{ "STATUS_FORMAT",		STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
281 	{ "STATUS_FORMAT1",		STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
282 	{ "STATUS_FORMAT2",		STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
283 	{ "STATUS_GROUP",		STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
284 	{ "STATUS_HOLD",		STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
285 	{ "STATUS_HOLD_LINES",		STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
286 	{ "STATUS_INSERT",		STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
287    /* ninja start */
288 	{ "STATUS_LAG",      	    	STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
289    /* ninja end */
290 	{ "STATUS_MAIL",		STR_TYPE_VAR,	0, NULL, build_status, 0, VF_NODAEMON },
291 	{ "STATUS_MODE",		STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
292 	{ "STATUS_NOTIFY",		STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
293 	{ "STATUS_OPER",		STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
294 	{ "STATUS_OVERWRITE",		STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
295 	{ "STATUS_QUERY",		STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
296 	{ "STATUS_SERVER",		STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
297 	{ "STATUS_UMODE",		STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
298 	{ "STATUS_USER",		STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
299 	{ "STATUS_USER1",		STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
300 	{ "STATUS_USER2",		STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
301 	{ "STATUS_USER3",		STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
302    /* ninja start */
303 	{ "STATUS_USERS",      	    	STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
304 	{ "STATUS_VOICE",    	    	STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
305    /* ninja end */
306 	{ "STATUS_WINDOW",		STR_TYPE_VAR,	0, NULL, build_status, 0, 0 },
307    /* ninja start */
308 	{ "STRIP_LOG_ANSI",		BOOL_TYPE_VAR,	DEFAULT_STRIP_LOG_ANSI, NULL, NULL, 0, 0 },
309 	{ "STRIP_REDIRECT_ANSI",       	BOOL_TYPE_VAR,	DEFAULT_STRIP_REDIRECT_ANSI, NULL, NULL, 0, 0 },
310    /* ninja end */
311 	{ "SUPPRESS_SERVER_MOTD",	BOOL_TYPE_VAR,	DEFAULT_SUPPRESS_SERVER_MOTD, NULL, NULL, 0, VF_NODAEMON },
312 	{ "TAB",			BOOL_TYPE_VAR,	DEFAULT_TAB, NULL, NULL, 0, 0 },
313 	{ "TAB_MAX",			INT_TYPE_VAR,	DEFAULT_TAB_MAX, NULL, NULL, 0, 0 },
314 	{ "TRANSLATION",		STR_TYPE_VAR,	0, NULL, set_translation, 0, 0 },
315 	{ "UNDERLINE_VIDEO",		BOOL_TYPE_VAR,	DEFAULT_UNDERLINE_VIDEO, NULL, NULL, 0, 0 },
316 	{ "USE_OLD_MSG",		BOOL_TYPE_VAR,	DEFAULT_USE_OLD_MSG, NULL, NULL, 0, 0 },
317 	{ "USER_INFORMATION", 		STR_TYPE_VAR,	0, NULL, NULL, 0, 0 },
318 	{ "USER_WALLOPS",		BOOL_TYPE_VAR,	DEFAULT_USER_WALLOPS, NULL, NULL, 0, 0 },
319 	{ "VERBOSE_CTCP",		BOOL_TYPE_VAR,	DEFAULT_VERBOSE_CTCP, NULL, NULL, 0, 0 },
320 	{ "WARN_OF_IGNORES",		BOOL_TYPE_VAR,	DEFAULT_WARN_OF_IGNORES, NULL, NULL, 0, 0 },
321 	{ "XTERM_GEOMOPTSTR", 		STR_TYPE_VAR,	0, NULL, NULL, 0, VF_NODAEMON },
322 	{ "XTERM_OPTIONS", 		STR_TYPE_VAR,	0, NULL, NULL, 0, VF_NODAEMON },
323 	{ "XTERM_PATH", 		STR_TYPE_VAR,	0, NULL, NULL, 0, VF_NODAEMON },
324 	{ (char *) 0, 0, 0, 0, 0, 0, 0 }
325 };
326 
327 /*
328  * init_variables: initializes the string variables that can't really be
329  * initialized properly above
330  */
331 void
init_variables()332 init_variables()
333 {
334 	set_string_var(CMDCHARS_VAR, UP(DEFAULT_CMDCHARS));
335 	set_string_var(LOGFILE_VAR, UP(DEFAULT_LOGFILE));
336 	set_string_var(SHELL_VAR, UP(DEFAULT_SHELL));
337 	set_string_var(SHELL_FLAGS_VAR, UP(DEFAULT_SHELL_FLAGS));
338 	set_string_var(ENCRYPT_PROGRAM_VAR, UP(DEFAULT_ENCRYPT_PROGRAM));
339 	set_string_var(CONTINUED_LINE_VAR, UP(DEFAULT_CONTINUED_LINE));
340 	set_string_var(INPUT_PROMPT_VAR, UP(DEFAULT_INPUT_PROMPT));
341 	set_string_var(HIGHLIGHT_CHAR_VAR, UP(DEFAULT_HIGHLIGHT_CHAR));
342 	set_string_var(HISTORY_FILE_VAR, UP(DEFAULT_HISTORY_FILE));
343 	set_string_var(LASTLOG_LEVEL_VAR, UP(DEFAULT_LASTLOG_LEVEL));
344 	set_string_var(NOTIFY_HANDLER_VAR, UP(DEFAULT_NOTIFY_HANDLER));
345 	set_string_var(NOTIFY_LEVEL_VAR, UP(DEFAULT_NOTIFY_LEVEL));
346 	set_string_var(REALNAME_VAR, realname);
347 	/* set_string_var(STAR_PREFIX_VAR, UP(DEFAULT_STAR_PREFIX)); */
348 	set_string_var(STATUS_FORMAT_VAR, UP(DEFAULT_STATUS_FORMAT));
349 	set_string_var(STATUS_FORMAT1_VAR, UP(DEFAULT_STATUS_FORMAT1));
350 	set_string_var(STATUS_FORMAT2_VAR, UP(DEFAULT_STATUS_FORMAT2));
351 	set_string_var(STATUS_AWAY_VAR, UP(DEFAULT_STATUS_AWAY));
352 	set_string_var(STATUS_CHANNEL_VAR, UP(DEFAULT_STATUS_CHANNEL));
353 	set_string_var(STATUS_CHANOP_VAR, UP(DEFAULT_STATUS_CHANOP));
354 	set_string_var(STATUS_CLOCK_VAR, UP(DEFAULT_STATUS_CLOCK));
355 	set_string_var(STATUS_GROUP_VAR, UP(DEFAULT_STATUS_GROUP));
356 	set_string_var(STATUS_HOLD_VAR, UP(DEFAULT_STATUS_HOLD));
357 	set_string_var(STATUS_HOLD_LINES_VAR, UP(DEFAULT_STATUS_HOLD_LINES));
358 	set_string_var(STATUS_INSERT_VAR, UP(DEFAULT_STATUS_INSERT));
359 	set_string_var(STATUS_MAIL_VAR, UP(DEFAULT_STATUS_MAIL));
360 	set_string_var(STATUS_MODE_VAR, UP(DEFAULT_STATUS_MODE));
361 	set_string_var(STATUS_OPER_VAR, UP(DEFAULT_STATUS_OPER));
362 	set_string_var(STATUS_OVERWRITE_VAR, UP(DEFAULT_STATUS_OVERWRITE));
363 	set_string_var(STATUS_QUERY_VAR, UP(DEFAULT_STATUS_QUERY));
364 	set_string_var(STATUS_SERVER_VAR, UP(DEFAULT_STATUS_SERVER));
365 	set_string_var(STATUS_UMODE_VAR, UP(DEFAULT_STATUS_UMODE));
366 	set_string_var(STATUS_USER_VAR, UP(DEFAULT_STATUS_USER));
367 	set_string_var(STATUS_USER1_VAR, UP(DEFAULT_STATUS_USER1));
368 	set_string_var(STATUS_USER2_VAR, UP(DEFAULT_STATUS_USER2));
369 	set_string_var(STATUS_USER3_VAR, UP(DEFAULT_STATUS_USER3));
370 	set_string_var(STATUS_WINDOW_VAR, UP(DEFAULT_STATUS_WINDOW));
371 	set_string_var(USER_INFO_VAR, UP(DEFAULT_USERINFO));
372 	set_string_var(XTERM_GEOMOPTSTR_VAR, UP(DEFAULT_XTERM_GEOMOPTSTR));
373 	set_string_var(XTERM_OPTIONS_VAR, UP(DEFAULT_XTERM_OPTIONS));
374 	set_string_var(XTERM_PATH_VAR, UP(DEFAULT_XTERM_PATH));
375 #ifdef SUPPORT_ALARM_CLOCK
376 	set_alarm(DEFAULT_CLOCK_ALARM);
377 #endif
378 	set_beep_on_msg(UP(DEFAULT_BEEP_ON_MSG));
379 	set_string_var(STATUS_NOTIFY_VAR, UP(DEFAULT_STATUS_NOTIFY));
380 	set_string_var(CLIENTINFO_VAR, UP(IRCII_COMMENT));
381 /*
382  * ninja always wants LATIN_1
383  *
384 #ifdef _Windows
385  */
386 	set_string_var(TRANSLATION_VAR, UP("LATIN_1"));
387 	set_translation(UP("LATIN_1"));
388 /*
389 #else
390 	set_string_var(TRANSLATION_VAR, UP("ASCII"));
391 	set_translation(UP("ASCII"));
392 #endif / * _Windows * /
393  */
394 	set_string_var(HELP_PATH_VAR, UP(DEFAULT_HELP_PATH));
395 	set_lastlog_size(irc_variable[LASTLOG_VAR].integer);
396 	set_history_size(irc_variable[HISTORY_VAR].integer);
397 	set_history_file(UP(irc_variable[HISTORY_FILE_VAR].string));
398 	set_highlight_char(UP(irc_variable[HIGHLIGHT_CHAR_VAR].string));
399 	set_lastlog_level(UP(irc_variable[LASTLOG_LEVEL_VAR].string));
400 	set_notify_level(UP(irc_variable[NOTIFY_LEVEL_VAR].string));
401 	if (get_int_var(LOG_VAR))
402 		set_int_var(LOG_VAR, 1);
403 
404    /* ninja additions */
405    set_string_var(HACKED_IDENTD_VAR, UP(DEFAULT_HACKED_IDENTD));
406    set_string_var(EMAIL_ADDRESS_VAR, UP(DEFAULT_EMAIL_ADDRESS));
407    set_string_var(DEFAULT_AWAY_MSG_VAR, UP(DEFAULT_DEFAULT_AWAY_MSG));
408    set_string_var(DEFAULT_BACK_MSG_VAR, UP(DEFAULT_DEFAULT_BACK_MSG));
409    set_string_var(LEADER_VAR, UP(DEFAULT_LEADER));
410    set_leader(UP(irc_variable[LEADER_VAR].string));
411    set_string_var(STATUS_USERS_VAR, UP(DEFAULT_STATUS_USERS));
412    set_string_var(STATUS_VOICE_VAR, UP(DEFAULT_STATUS_VOICE));
413    set_string_var(STATUS_LAG_VAR, UP(DEFAULT_STATUS_LAG));
414 #ifdef DEFAULT_SOCKS_PROXY
415    set_string_var(SOCKS_PROXY_VAR, UP(DEFAULT_SOCKS_PROXY));
416 #endif
417 #ifdef DEFAULT_SOCKS_USERNAME
418    set_string_var(SOCKS_USERNAME_VAR, UP(DEFAULT_SOCKS_USERNAME));
419 #endif
420 #ifdef DEFAULT_SOCKS_PASSWORD
421    set_string_var(SOCKS_PASSWORD_VAR, UP(DEFAULT_SOCKS_PASSWORD));
422 #endif
423 }
424 
425 /*
426  * find_variable: looks up variable name in the variable table and returns
427  * the index into the variable array of the match.  If there is no match, cnt
428  * is set to 0 and -1 is returned.  If more than one match the string, cnt is
429  * set to that number, and it returns the first match.  Index will contain
430  * the index into the array of the first found entry
431  */
432 static	int
find_variable(org_name,cnt)433 find_variable(org_name, cnt)
434 	u_char	*org_name;
435 	int	*cnt;
436 {
437 	IrcVariable *v,
438 		    *first;
439 	size_t	len;
440 	int	var_index;
441 	u_char	*name = (u_char *) 0;
442 
443 	malloc_strcpy(&name, org_name);
444 	upper(name);
445 	len = my_strlen(name);
446 	var_index = 0;
447 	for (first = irc_variable; first->name; first++, var_index++)
448 
449 	{
450 		if (my_strncmp(name, first->name, len) == 0)
451 		{
452 			*cnt = 1;
453 			break;
454 		}
455 	}
456 	if (first->name)
457 
458 	{
459 		if (my_strlen(first->name) != len)
460 		{
461 			v = first;
462 			for (v++; v->name; v++, (*cnt)++)
463 
464 			{
465 				if (my_strncmp(name, v->name, len) != 0)
466 					break;
467 			}
468 		}
469 		new_free(&name);
470 		return (var_index);
471 	}
472 	else
473 	{
474 		*cnt = 0;
475 		new_free(&name);
476 		return (-1);
477 	}
478 }
479 
480 /*
481  * do_boolean: just a handy thing.  Returns 1 if the str is not ON, OFF, or
482  * TOGGLE
483  */
484 int
do_boolean(str,value)485 do_boolean(str, value)
486 	u_char	*str;
487 	int	*value;
488 {
489 	upper(str);
490 	if (my_strcmp(str, var_settings[ON]) == 0)
491 		*value = 1;
492 	else if (my_strcmp(str, var_settings[OFF]) == 0)
493 		*value = 0;
494 	else if (my_strcmp(str, "TOGGLE") == 0)
495 	{
496 		if (*value)
497 			*value = 0;
498 		else
499 			*value = 1;
500 	}
501 	else
502 		return (1);
503 	return (0);
504 }
505 
506 /*
507  * set_var_value: Given the variable structure and the string representation
508  * of the value, this sets the value in the most verbose and error checking
509  * of manors.  It displays the results of the set and executes the function
510  * defined in the var structure
511  */
512 void
set_var_value(var_index,value)513 set_var_value(var_index, value)
514 	int	var_index;
515 	u_char	*value;
516 {
517 	u_char	*rest;
518 	IrcVariable *var;
519 	int	old;
520 
521 
522 	var = &(irc_variable[var_index]);
523 #ifdef DAEMON_UID
524 	if (getuid() == DAEMON_UID && var->flags&VF_NODAEMON && value && *value)
525 	{
526 		say("You are not permitted to set that variable");
527 		return;
528 	}
529 #endif /* DAEMON_UID */
530 	switch (var->type)
531 	{
532 	case BOOL_TYPE_VAR:
533 		if (value && *value && (value = next_arg(value, &rest)))
534 		{
535 			old = var->integer;
536 			if (do_boolean(value, &(var->integer)))
537 
538 			{
539 				say("Value must be either ON, OFF, or TOGGLE");
540 				break;
541 			}
542 			if (!(var->int_flags & VIF_CHANGED))
543 			{
544 				if (old != var->integer)
545 					var->int_flags |= VIF_CHANGED;
546 			}
547 			if (loading_global)
548 				var->int_flags |= VIF_GLOBAL;
549 			if (var->func)
550 				(var->func) (var->integer);
551 			say("Value of %s set to %s", var->name,
552 				var->integer ? var_settings[ON]
553 					     : var_settings[OFF]);
554 		}
555 		else
556 			say("Current value of %s is %s", var->name,
557 				(var->integer) ?
558 				var_settings[ON] : var_settings[OFF]);
559 		break;
560 	case CHAR_TYPE_VAR:
561 		if (value && *value && (value = next_arg(value, &rest)))
562 		{
563 			if ((int) my_strlen(value) > 1)
564 				say("Value of %s must be a single character",
565 					var->name);
566 			else
567 			{
568 				if (!(var->int_flags & VIF_CHANGED))
569 				{
570 					if (var->integer != *value)
571 						var->int_flags |= VIF_CHANGED;
572 				}
573 				if (loading_global)
574 					var->int_flags |= VIF_GLOBAL;
575 				var->integer = *value;
576 				if (var->func)
577 					(var->func) (var->integer);
578 				say("Value of %s set to '%c'", var->name,
579 					var->integer);
580 			}
581 		}
582 		else
583 			say("Current value of %s is '%c'", var->name,
584 				var->integer);
585 		break;
586 	case INT_TYPE_VAR:
587 		if (value && *value && (value = next_arg(value, &rest)))
588 		{
589 			int	val;
590 
591 			if (!is_number(value))
592 			{
593 				say("Value of %s must be numeric!", var->name);
594 				break;
595 			}
596 			if ((val = my_atoi(value)) < 0)
597 			{
598 				say("Value of %s must be greater than 0",
599 					var->name);
600 				break;
601 			}
602 			if (!(var->int_flags & VIF_CHANGED))
603 			{
604 				if (var->integer != val)
605 					var->int_flags |= VIF_CHANGED;
606 			}
607 			if (loading_global)
608 				var->int_flags |= VIF_GLOBAL;
609 			var->integer = val;
610 			if (var->func)
611 				(var->func) (var->integer);
612 			say("Value of %s set to %d", var->name, var->integer);
613 		}
614 		else
615 			say("Current value of %s is %d", var->name,
616 				var->integer);
617 		break;
618 	case STR_TYPE_VAR:
619 		if (value)
620 		{
621 			if (*value)
622 			{
623 				u_char	*temp = NULL;
624 
625 				if (var->flags & VF_EXPAND_PATH
626 				    && *value == '~')
627 				{
628 					temp = expand_twiddle(value);
629 					if (temp)
630 						value = temp;
631 					else
632 						say("SET: no such user");
633 				}
634 				if ((!var->int_flags & VIF_CHANGED))
635 				{
636 					if ((var->string && ! value) ||
637 					    (! var->string && value) ||
638 					    my_stricmp(UP(var->string), value))
639 						var->int_flags |= VIF_CHANGED;
640 				}
641 				if (loading_global)
642 					var->int_flags |= VIF_GLOBAL;
643 				malloc_strcpy((u_char **) &(var->string), value);
644 				if (temp)
645 					new_free(&temp);
646 			}
647 			else
648 			{
649 				if (var->string)
650 					say("Current value of %s is %s",
651 						var->name, var->string);
652 				else
653 					say("No value for %s has been set",
654 						var->name);
655 				return;
656 			}
657 		}
658 		else
659 			new_free(&(var->string));
660 		if (var->func)
661 			(var->func) (var->string);
662 		say("Value of %s set to %s", var->name, var->string ?
663 			var->string : "<EMPTY>");
664 		break;
665 	}
666 }
667 
668 /*
669  * set_variable: The SET command sets one of the irc variables.  The args
670  * should consist of "variable-name setting", where variable name can be
671  * partial, but non-ambbiguous, and setting depends on the variable being set
672  */
673 /*ARGSUSED*/
674 void
set_variable(command,args,subargs)675 set_variable(command, args, subargs)
676 	u_char	*command,
677 		*args,
678 		*subargs;
679 {
680 	u_char	*var;
681 	int	cnt,
682 		var_index,
683 		lastlog_level;
684 
685 	if ((var = next_arg(args, &args)) != NULL)
686 	{
687 		if (*var == '-')
688 		{
689 			var++;
690 			args = (u_char *) 0;
691 		}
692 		var_index = find_variable(var, &cnt);
693 		switch (cnt)
694 		{
695 		case 0:
696 			say("No such variable \"%s\"", var);
697 			return;
698 		case 1:
699 			set_var_value(var_index, args);
700 			return;
701 		default:
702 			say("%s is ambiguous", var);
703 			for (cnt += var_index; var_index < cnt; var_index++)
704 				set_var_value(var_index, empty_string);
705 			return;
706 		}
707 	}
708 	lastlog_level = message_from_level(LOG_CRAP);
709 	for (var_index = 0; var_index < NUMBER_OF_VARIABLES; var_index++)
710 		set_var_value(var_index, empty_string);
711 	(void) message_from_level(lastlog_level);
712 }
713 
714 /*
715  * get_string_var: returns the value of the string variable given as an index
716  * into the variable table.  Does no checking of variable types, etc
717  */
718 u_char	*
get_string_var(var)719 get_string_var(var)
720 	int	var;
721 {
722 	return UP(irc_variable[var].string);
723 }
724 
725 /*
726  * get_int_var: returns the value of the integer string given as an index
727  * into the variable table.  Does no checking of variable types, etc
728  */
729 int
get_int_var(var)730 get_int_var(var)
731 	int	var;
732 {
733 	return (irc_variable[var].integer);
734 }
735 
736 /*
737  * set_string_var: sets the string variable given as an index into the
738  * variable table to the given string.  If string is null, the current value
739  * of the string variable is freed and set to null
740  */
741 void
set_string_var(var,string)742 set_string_var(var, string)
743 	int	var;
744 	u_char	*string;
745 {
746 	if (string)
747 		malloc_strcpy((u_char **) &(irc_variable[var].string), string);
748 	else
749 		new_free(&(irc_variable[var].string));
750 }
751 
752 /*
753  * set_int_var: sets the integer value of the variable given as an index into
754  * the variable table to the given value
755  */
756 void
set_int_var(var,value)757 set_int_var(var, value)
758 	int	var;
759 	unsigned int	value;
760 {
761 	if (var == NOVICE_VAR && !load_depth && !value)
762 	{
763 say("WARNING: Setting NOVICE to OFF enables commands in your client which");
764 say("         could be used by others on IRC to control your IRC session");
765 say("         or compromise security on your machine. If somebody has");
766 say("         asked you to do this, and you do not know EXACTLY why, or if");
767 say("         you are not ABSOLUTELY sure what you are doing, you should");
768 say("         immediately /SET NOVICE ON and find out more information.");
769 	}
770 	irc_variable[var].integer = value;
771 }
772 
773 /*
774  * save_variables: this writes all of the IRCII variables to the given FILE
775  * pointer in such a way that they can be loaded in using LOAD or the -l switch
776  */
777 int
save_variables(fp,do_all)778 save_variables(fp, do_all)
779 	FILE	*fp;
780 	int	do_all;
781 {
782 	IrcVariable *var;
783    	int count = 0;
784 
785 	for (var = irc_variable; var->name; var++)
786 	{
787 		if (!(var->int_flags & VIF_CHANGED))
788 			continue;
789 		if (do_all || !(var->int_flags & VIF_GLOBAL))
790 		{
791 			if (my_strcmp(var->name, "DISPLAY") == 0 || my_strcmp(var->name, "CLIENT_INFORMATION") == 0)
792 				continue;
793 		   	count++;
794 			fprintf(fp, "SET ");
795 			switch (var->type)
796 			{
797 			case BOOL_TYPE_VAR:
798 				fprintf(fp, "%s %s\n", var->name, var->integer ?
799 					var_settings[ON] : var_settings[OFF]);
800 				break;
801 			case CHAR_TYPE_VAR:
802 				fprintf(fp, "%s %c\n", var->name, var->integer);
803 				break;
804 			case INT_TYPE_VAR:
805 				fprintf(fp, "%s %u\n", var->name, var->integer);
806 				break;
807 			case STR_TYPE_VAR:
808 				if (var->string)
809 					fprintf(fp, "%s %s\n", var->name,
810 						var->string);
811 				else
812 					fprintf(fp, "-%s\n", var->name);
813 				break;
814 			}
815 		}
816 	}
817    	return count;
818 }
819 
820 u_char	*
make_string_var(var_name)821 make_string_var(var_name)
822 	u_char	*var_name;
823 {
824 	int	cnt,
825 		var_index;
826 	u_char	lbuf[BIG_BUFFER_SIZE + 1],
827 		*ret = (u_char *) 0,
828 		*cmd = (u_char *) 0;
829 
830 	malloc_strcpy(&cmd, var_name);
831 	upper(cmd);
832 	if (((var_index = find_variable(cmd, &cnt)) == -1) ||
833 	    (cnt > 1) ||
834 	    my_strcmp(cmd, irc_variable[var_index].name))
835 		goto out;
836 	switch (irc_variable[var_index].type)
837 	{
838 	case STR_TYPE_VAR:
839 		malloc_strcpy(&ret, UP(irc_variable[var_index].string));
840 		break;
841 	case INT_TYPE_VAR:
842 		snprintf(CP(lbuf), sizeof(lbuf)-1, "%u", irc_variable[var_index].integer);
843 		malloc_strcpy(&ret, lbuf);
844 		break;
845 	case BOOL_TYPE_VAR:
846 		malloc_strcpy(&ret, UP(var_settings[irc_variable[var_index].integer]));
847 		break;
848 	case CHAR_TYPE_VAR:
849 		snprintf(CP(lbuf), sizeof(lbuf)-1, "%c", irc_variable[var_index].integer);
850 		malloc_strcpy(&ret, lbuf);
851 		break;
852 	}
853 out:
854 	new_free(&cmd);
855 	return (ret);
856 
857 }
858 
859 /* exec_warning: a warning message displayed whenever EXEC_PROTECTION is turned off.  */
860 static	void
exec_warning(value)861 exec_warning(value)
862 	int	value;
863 {
864 	if (value == OFF)
865 	{
866 		say("Warning!  You have turned EXEC_PROTECTION off");
867 		say("Please read the /HELP SET EXEC_PROTECTION documentation");
868 	}
869 }
870 
871 static	void
input_warning(value)872 input_warning(value)
873 	int	value;
874 {
875 	if (value == OFF)
876 	{
877 		say("Warning!  You have turned INPUT_PROTECTION off");
878 		say("Please read the /HELP ON INPUT, and /HELP SET INPUT_PROTECTION documentation");
879 	}
880 }
881 
882 /* returns the size of the character set */
883 int
charset_size()884 charset_size()
885 {
886 	return get_int_var(EIGHT_BIT_CHARACTERS_VAR) ? 256 : 128;
887 }
888 
889 static	void
eight_bit_characters(value)890 eight_bit_characters(value)
891 	int	value;
892 {
893 //   static int lastval = -1;
894 
895    if (value == ON && !term_eight_bit())
896      say("Warning!  Your terminal says it does not support eight bit characters");
897    set_term_eight_bit(value);
898    // build_status(NULL);
899 //   if ( /* lastval != -1
900 //       && */ lastval != value)
901 //     refresh_screen(0, UNULL);
902 //   lastval = value;
903 }
904 
905 static	void
set_realname(value)906 set_realname(value)
907 	u_char	*value;
908 {
909 
910 	if (value)
911 		strmcpy(realname, value, REALNAME_LEN);
912 	else
913 		*realname = '\0';
914 }
915 
916 static void
set_leader(value)917 set_leader(value)
918    u_char *value;
919 {
920    if (value)
921      dma_strcpy(&leader, value);
922    else
923      dma_Free(&leader);
924 }
925 
926 
927 static void
ansi_color_toggle(value)928 ansi_color_toggle(value)
929     int value;
930 {
931 //   static int lastval = -1;
932 
933       // build_status(NULL);
934 //   if (lastval != -1
935 //       && lastval != value)
936 //     refresh_screen(0, UNULL);
937 //   lastval = value;
938 }
939