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