1 /*
2 * Project : tin - a Usenet reader
3 * Module : init.c
4 * Author : I. Lea
5 * Created : 1991-04-01
6 * Updated : 2020-09-28
7 * Notes :
8 *
9 * Copyright (c) 1991-2021 Iain Lea <iain@bricbrac.de>
10 * All rights reserved.
11 *
12 * Redistribution and use in source and binary forms, with or without
13 * modification, are permitted provided that the following conditions
14 * are met:
15 *
16 * 1. Redistributions of source code must retain the above copyright notice,
17 * this list of conditions and the following disclaimer.
18 *
19 * 2. Redistributions in binary form must reproduce the above copyright
20 * notice, this list of conditions and the following disclaimer in the
21 * documentation and/or other materials provided with the distribution.
22 *
23 * 3. Neither the name of the copyright holder nor the names of its
24 * contributors may be used to endorse or promote products derived from
25 * this software without specific prior written permission.
26 *
27 * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
28 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
29 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
30 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
31 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
34 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
35 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
36 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
37 * POSSIBILITY OF SUCH DAMAGE.
38 */
39
40
41 #ifndef TIN_H
42 # include "tin.h"
43 #endif /* !TIN_H */
44 #ifndef TNNTP_H
45 # include "tnntp.h"
46 #endif /* !TNNTP_H */
47 #ifndef included_trace_h
48 # include "trace.h"
49 #endif /* !included_trace_h */
50 #ifndef VERSION_H
51 # include "version.h"
52 #endif /* !VERSION_H */
53 #ifndef BUGREP_H
54 # include "bugrep.h"
55 #endif /* !BUGREP_H */
56
57 /*
58 * local prototypes
59 */
60 static int read_site_config(void);
61 #ifdef HAVE_COLOR
62 static void preinit_colors(void);
63 #endif /* HAVE_COLOR */
64
65
66 char active_times_file[PATH_LEN];
67 char article_name[PATH_LEN]; /* ~/TIN_ARTICLE_NAME file */
68 char bug_nntpserver1[PATH_LEN]; /* welcome message of NNTP server used */
69 char bug_nntpserver2[PATH_LEN]; /* welcome message of NNTP server used */
70 char cvers[LEN];
71 char dead_article[PATH_LEN]; /* ~/dead.article file */
72 char dead_articles[PATH_LEN]; /* ~/dead.articles file */
73 char default_organization[PATH_LEN]; /* Organization: */
74 char default_signature[PATH_LEN];
75 char domain_name[MAXHOSTNAMELEN + 1];
76 char global_attributes_file[PATH_LEN];
77 char global_config_file[PATH_LEN];
78 char homedir[PATH_LEN];
79 char index_maildir[PATH_LEN];
80 char index_newsdir[PATH_LEN]; /* directory for private overview data */
81 char index_savedir[PATH_LEN];
82 char inewsdir[PATH_LEN];
83 char local_attributes_file[PATH_LEN];
84 char local_config_file[PATH_LEN];
85 char local_input_history_file[PATH_LEN];
86 char local_newsgroups_file[PATH_LEN]; /* local copy of NNTP newsgroups file */
87 char local_newsrctable_file[PATH_LEN];
88 char lock_file[PATH_LEN]; /* contains name of index lock file */
89 char filter_file[PATH_LEN];
90 char mail_news_user[LEN]; /* mail new news to this user address */
91 char mailbox[PATH_LEN]; /* system mailbox for each user */
92 char mailer[PATH_LEN]; /* mail program */
93 char newnewsrc[PATH_LEN];
94 char news_active_file[PATH_LEN];
95 char newsgroups_file[PATH_LEN];
96 char newsrc[PATH_LEN];
97 char page_header[LEN]; /* page header of pgm name and version */
98 char posted_info_file[PATH_LEN];
99 char postponed_articles_file[PATH_LEN]; /* ~/.tin/postponed.articles file */
100 char rcdir[PATH_LEN];
101 char save_active_file[PATH_LEN];
102 char spooldir[PATH_LEN]; /* directory where news is */
103 char overviewfmt_file[PATH_LEN]; /* full path to overview.fmt */
104 char subscriptions_file[PATH_LEN]; /* full path to subscriptions */
105 char *tin_progname; /* program name */
106 char txt_help_bug_report[LEN]; /* address to send bug reports to */
107 char userid[PATH_LEN];
108 #ifdef HAVE_MH_MAIL_HANDLING
109 char mail_active_file[PATH_LEN];
110 char mailgroups_file[PATH_LEN];
111 #endif /* HAVE_MH_MAIL_HANDLING */
112 #ifndef NNTP_ONLY
113 char novfilename[NAME_LEN + 1]; /* file name of a single nov index file */
114 char novrootdir[PATH_LEN]; /* root directory of nov index files */
115 #endif /* !NNTP_ONLY */
116
117 t_function last_search = GLOBAL_SEARCH_REPEAT; /* for repeated search */
118 int hist_last[HIST_MAXNUM + 1];
119 int hist_pos[HIST_MAXNUM + 1];
120 int iso2asc_supported; /* Convert ISO-Latin1 to Ascii */
121 int system_status;
122 int xmouse, xrow, xcol; /* xterm button pressing information */
123
124 pid_t process_id; /* Useful to have around for .suffixes */
125
126 t_bool batch_mode; /* update index files only mode */
127 t_bool check_for_new_newsgroups; /* don't check for new newsgroups */
128 t_bool cmd_line; /* batch / interactive mode */
129 t_bool created_rcdir; /* checks if first time tin is started */
130 t_bool dangerous_signal_exit; /* no get_respcode() in nntp_command when dangerous signal exit */
131 t_bool disable_gnksa_domain_check; /* disable checking TLD in From: etc. */
132 t_bool disable_sender; /* disable generation of Sender: header */
133 #ifdef NO_POSTING
134 t_bool force_no_post = TRUE; /* force no posting mode */
135 #else
136 t_bool force_no_post = FALSE; /* don't force no posting mode */
137 #endif /* NO_POSTING */
138 #if defined(NNTP_ABLE) && defined(INET6)
139 t_bool force_ipv4 = FALSE;
140 t_bool force_ipv6 = FALSE;
141 #endif /* NNTP_ABLE && INET6 */
142 t_bool list_active;
143 t_bool newsrc_active;
144 t_bool no_write = FALSE; /* do not write newsrc on quit (-X cmd-line flag) */
145 t_bool post_article_and_exit; /* quick post of an article then exit(elm like) */
146 t_bool post_postponed_and_exit; /* post postponed articles and exit */
147 t_bool range_active; /* Set if a range is defined */
148 t_bool reread_active_for_posted_arts;
149 t_bool read_local_newsgroups_file; /* read newsgroups file locally or via NNTP */
150 t_bool read_news_via_nntp = FALSE; /* read news locally or via NNTP */
151 t_bool read_saved_news = FALSE; /* tin -R read saved news from tin -S */
152 t_bool show_description = TRUE; /* current copy of tinrc flag */
153 int verbose = 0; /* batch or debug mode */
154 t_bool word_highlight; /* word highlighting on/off */
155 t_bool xref_supported = TRUE;
156 #ifdef HAVE_COLOR
157 t_bool use_color; /* enables/disables ansi-color support under linux-console and color-xterm */
158 #endif /* HAVE_COLOR */
159 #ifdef NNTP_ABLE
160 t_bool force_auth_on_conn_open = FALSE; /* authenticate on connection startup */
161 unsigned short nntp_tcp_port;
162 #endif /* NNTP_ABLE */
163
164 /* Currently active menu parameters */
165 t_menu *currmenu;
166
167 /* History entries */
168 char *input_history[HIST_MAXNUM + 1][HIST_SIZE + 1];
169
170 #ifdef HAVE_SYS_UTSNAME_H
171 struct utsname system_info;
172 #endif /* HAVE_SYS_UTSNAME_H */
173
174 struct regex_cache
175 strip_re_regex, strip_was_regex,
176 uubegin_regex, uubody_regex,
177 verbatim_begin_regex, verbatim_end_regex,
178 url_regex, mail_regex, news_regex,
179 shar_regex,
180 slashes_regex, stars_regex, underscores_regex, strokes_regex
181 #ifdef HAVE_COLOR
182 , extquote_regex, quote_regex, quote_regex2, quote_regex3
183 #endif /* HAVE_COLOR */
184 = {
185 NULL,
186 NULL
187 };
188
189 struct t_cmdlineopts cmdline;
190
191 struct t_config tinrc = {
192 ART_MARK_DELETED, /* art_marked_deleted */
193 MARK_INRANGE, /* art_marked_inrange */
194 ART_MARK_RETURN, /* art_marked_return */
195 ART_MARK_SELECTED, /* art_marked_selected */
196 ART_MARK_RECENT, /* art_marked_recent */
197 ART_MARK_UNREAD, /* art_marked_unread */
198 ART_MARK_READ, /* art_marked_read */
199 ART_MARK_KILLED, /* art_marked_killed */
200 ART_MARK_READ_SELECTED, /* art_marked_read_selected */
201 "", /* editor_format */
202 "", /* default_goto_group */
203 "", /* default_mail_address */
204 "", /* mailer_format */
205 #ifndef DONT_HAVE_PIPING
206 "", /* default_pipe_command */
207 #endif /* !DONT_HAVE_PIPING */
208 "", /* default_post_newsgroups */
209 "", /* default_post_subject */
210 #ifndef DISABLE_PRINTING
211 "", /* printer */
212 #endif /* !DISABLE_PRINTING */
213 "1-.", /* default_range_group */
214 "1-.", /* default_range_select */
215 "1-.", /* default_range_thread */
216 "", /* default_pattern */
217 "", /* default_repost_group */
218 "savefile.tin", /* default_save_file */
219 "", /* default_search_art */
220 "", /* default_search_author */
221 "", /* default_search_config */
222 "", /* default_search_group */
223 "", /* default_search_subject */
224 "", /* default_select_pattern */
225 "", /* default_shell_command */
226 "In article %M you wrote:", /* mail_quote_format */
227 "", /* maildir */
228 #ifdef SCO_UNIX
229 2, /* mailbox_format = MMDF */
230 #else
231 0, /* mailbox_format = MBOXO */
232 #endif /* SCO_UNIX */
233 "", /* mail_address */
234 #ifdef HAVE_METAMAIL
235 METAMAIL_CMD, /* metamail_prog */
236 #else
237 INTERNAL_CMD, /* metamail_prog */
238 #endif /* HAVE_METAMAIL */
239 #ifndef CHARSET_CONVERSION
240 "", /* mm_charset, defaults to $MM_CHARSET */
241 #else
242 -1, /* mm_network_charset, defaults to $MM_CHARSET */
243 #endif /* !CHARSET_CONVERSION */
244 "US-ASCII", /* mm_local_charset, display charset */
245 #ifdef HAVE_ICONV_OPEN_TRANSLIT
246 FALSE, /* translit */
247 #endif /* HAVE_ICONV_OPEN_TRANSLIT */
248 "Newsgroups Followup-To Summary Keywords X-Comment-To", /* news_headers_to_display */
249 "", /* news_headers_to_not_display */
250 "%F wrote:", /* news_quote_format */
251 DEFAULT_COMMENT, /* quote_chars */
252 #ifdef HAVE_COLOR
253 "", /* quote_regex */
254 "", /* quote_regex 2nd level */
255 "", /* quote_regex >= 3rd level */
256 "", /* extquote_regex */
257 #endif /* HAVE_COLOR */
258 "", /* slashes_regex */
259 "", /* stars_regex */
260 "", /* underscores_regex */
261 "", /* strokes_regex */
262 "", /* sigfile */
263 "", /* strip_re_regex */
264 "", /* strip_was_regex */
265 "", /* verbatim_begin_regex */
266 "", /* verbatim_end_regex */
267 "", /* savedir */
268 "", /* spamtrap_warning_addresses */
269 DEFAULT_URL_HANDLER, /* url_handler */
270 "In %G %F wrote:", /* xpost_quote_format */
271 DEFAULT_FILTER_DAYS, /* filter_days */
272 FILTER_SUBJ_CASE_SENSITIVE, /* default_filter_kill_header */
273 FILTER_SUBJ_CASE_SENSITIVE, /* default_filter_select_header */
274 0, /* default_move_group */
275 'a', /* default_save_mode */
276 0, /* getart_limit */
277 2, /* recent_time */
278 GOTO_NEXT_UNREAD_TAB, /* goto_next_unread */
279 UUE_NO, /* hide_uue */
280 KILL_UNREAD, /* kill_level */
281 MIME_ENCODING_QP, /* mail_mime_encoding */
282 MIME_ENCODING_8BIT, /* post_mime_encoding */
283 POST_PROC_NO, /* post_process_type */
284 REREAD_ACTIVE_FILE_SECS, /* reread_active_file_secs */
285 1, /* scroll_lines */
286 SHOW_FROM_NAME, /* show_author */
287 SORT_ARTICLES_BY_DATE_ASCEND, /* sort_article_type */
288 SORT_THREADS_BY_SCORE_DESCEND, /* sort_threads_type */
289 #ifdef USE_HEAPSORT
290 0, /* sort_function default qsort */
291 #endif /* USE_HEAPSORT */
292 BOGUS_SHOW, /* strip_bogus */
293 THREAD_BOTH, /* thread_articles */
294 THREAD_PERC_DEFAULT, /* thread_perc */
295 THREAD_SCORE_MAX, /* thread_score */
296 0, /* Default to wildmat, not regex */
297 -50, /* score_limit_kill */
298 50, /* score_limit_select */
299 -100, /* score_kill */
300 100, /* score_select */
301 0, /* trim_article_body */
302 #ifdef HAVE_COLOR
303 0, /* col_back (initialised later) */
304 0, /* col_from (initialised later) */
305 0, /* col_head (initialised later) */
306 0, /* col_help (initialised later) */
307 0, /* col_invers_bg (initialised later) */
308 0, /* col_invers_fg (initialised later) */
309 0, /* col_minihelp (initialised later) */
310 0, /* col_normal (initialised later) */
311 0, /* col_markdash (initialised later) */
312 0, /* col_markstar (initialised later) */
313 0, /* col_markslash (initialised later) */
314 0, /* col_markstroke (initialised later) */
315 0, /* col_message (initialised later) */
316 0, /* col_newsheaders (initialised later) */
317 0, /* col_quote (initialised later) */
318 0, /* col_quote2 (initialised later) */
319 0, /* col_quote3 (initialised later) */
320 0, /* col_extquote (initialised later) */
321 0, /* col_response (initialised later) */
322 0, /* col_signature (initialised later) */
323 0, /* col_urls (initialised later) */
324 0, /* col_verbatim (initialised later) */
325 0, /* col_subject (initialised later) */
326 0, /* col_text (initialised later) */
327 0, /* col_title (initialised later) */
328 #endif /* HAVE_COLOR */
329 2, /* word_h_display_marks */
330 2, /* mono_markdash */
331 6, /* mono_markstar */
332 5, /* mono_markslash */
333 3, /* mono_markstroke */
334 TRUE, /* word_highlight */
335 TRUE, /* url_highlight */
336 0, /* wrap_column */
337 #ifdef HAVE_COLOR
338 FALSE, /* use_color */
339 #endif /* HAVE_COLOR */
340 FALSE, /* abbreviate_groupname */
341 TRUE, /* add_posted_to_filter */
342 TRUE, /* advertising */
343 TRUE, /* alternative_handling */
344 0, /* auto_cc_bcc */
345 TRUE, /* auto_list_thread */
346 FALSE, /* auto_reconnect */
347 FALSE, /* auto_save */
348 TRUE, /* batch_save */
349 TRUE, /* beginner_level */
350 FALSE, /* cache_overview_files */
351 FALSE, /* catchup_read_groups */
352 4, /* confirm_choice */
353 #ifdef USE_INVERSE_HACK
354 TRUE, /* draw_arrow */
355 #else
356 FALSE, /* draw_arrow */
357 #endif /* USE_INVERSE_HACK */
358 FALSE, /* force_screen_redraw */
359 TRUE, /* group_catchup_on_exit */
360 FALSE, /* info_in_last_line */
361 #ifdef USE_INVERSE_HACK
362 FALSE, /* inverse_okay */
363 #else
364 TRUE, /* inverse_okay */
365 #endif /* USE_INVERSE_HACK */
366 TRUE, /* keep_dead_articles */
367 POSTED_FILE, /* posted_articles_file */
368 TRUE, /* mail_8bit_header */
369 FALSE, /* mark_ignore_tags */
370 TRUE, /* mark_saved_read */
371 TRUE, /* pos_first_unread */
372 TRUE, /* post_8bit_header */
373 TRUE, /* post_process_view */
374 #ifndef DISABLE_PRINTING
375 FALSE, /* print_header */
376 #endif /* !DISABLE_PRINTING */
377 FALSE, /* process_only_unread */
378 FALSE, /* prompt_followupto */
379 QUOTE_COMPRESS|QUOTE_EMPTY, /* quote_style */
380 TRUE, /* show_description */
381 TRUE, /* show_only_unread_arts */
382 FALSE, /* show_only_unread_groups */
383 TRUE, /* show_signatures */
384 TRUE, /* sigdashes */
385 TRUE, /* signature_repost */
386 TRUE, /* start_editor_offset */
387 #ifndef USE_CURSES
388 TRUE, /* strip_blanks */
389 #endif /* !USE_CURSES */
390 FALSE, /* strip_newsrc */
391 FALSE, /* tex2iso_conv */
392 TRUE, /* thread_catchup_on_exit */
393 TRUE, /* unlink_article */
394 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
395 FALSE, /* utf8_graphics */
396 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
397 TRUE, /* verbatim_handling */
398 #ifdef HAVE_COLOR
399 FALSE, /* extquote_handling */
400 #endif /* HAVE_COLOR */
401 "", /* inews_prog */
402 #ifdef USE_CANLOCK
403 1, /* cancel_lock_algo, sha1 */
404 #endif /* USE_CANLOCK */
405 INTERACTIVE_NONE, /* interactive_mailer */
406 FALSE, /* use_mouse */
407 #ifdef HAVE_KEYPAD
408 FALSE, /* use_keypad */
409 #endif /* HAVE_KEYPAD */
410 TRUE, /* wrap_on_next_unread */
411 FALSE, /* ask_for_metamail */
412 FALSE, /* default_filter_kill_case */
413 FALSE, /* default_filter_kill_expire */
414 TRUE, /* default_filter_kill_global */
415 FALSE, /* default_filter_select_case */
416 FALSE, /* default_filter_select_expire */
417 #ifdef XFACE_ABLE
418 FALSE, /* use_slrnface */
419 #endif /* XFACE_ABLE */
420 TRUE, /* default_filter_select_global */
421 DEFAULT_SELECT_FORMAT, /* select_format */
422 DEFAULT_GROUP_FORMAT, /* group_format */
423 DEFAULT_THREAD_FORMAT, /* thread_format */
424 DEFAULT_DATE_FORMAT, /* date_format */
425 #ifdef HAVE_UNICODE_NORMALIZATION
426 DEFAULT_NORMALIZE, /* normalization form */
427 #endif /* HAVE_UNICODE_NORMALIZATION */
428 #if defined(HAVE_LIBICUUC) && defined(MULTIBYTE_ABLE) && defined(HAVE_UNICODE_UBIDI_H) && !defined(NO_LOCALE)
429 FALSE, /* render_bidi */
430 #endif /* HAVE_LIBICUUC && MULTIBYTE_ABLE && HAVE_UNICODE_UBIDI_H && !NO_LOCALE */
431 #ifdef CHARSET_CONVERSION
432 -1, /* attrib_mm_network_charset, defaults to $MM_CHARSET */
433 "", /* attrib_undeclared_charset */
434 #endif /* CHARSET_CONVERSION */
435 "", /* attrib_editor_format */
436 "", /* attrib_fcc */
437 "", /* attrib_maildir */
438 "", /* attrib_from */
439 "", /* attrib_mailing_list */
440 "", /* attrib_organization */
441 "", /* attrib_followup_to */
442 "", /* attrib_mime_types_to_save */
443 "", /* attrib_news_headers_to_display */
444 "", /* attrib_news_headers_to_not_display */
445 "", /* attrib_news_quote_format */
446 "", /* attrib_quote_chars */
447 "", /* attrib_sigfile */
448 "", /* attrib_savedir */
449 "", /* attrib_savefile */
450 "", /* attrib_x_body */
451 "", /* attrib_x_headers */
452 #ifdef HAVE_ISPELL
453 "", /* attrib_ispell */
454 #endif /* HAVE_ISPELL */
455 "", /* attrib_quick_kill_scope */
456 "", /* attrib_quick_select_scope */
457 "", /* attrib_group_format */
458 "", /* attrib_thread_format */
459 "", /* attrib_date_format */
460 0, /* attrib_trim_article_body */
461 0, /* attrib_auto_cc_bcc */
462 FILTER_SUBJ_CASE_SENSITIVE, /* attrib_quick_kill_header */
463 FILTER_SUBJ_CASE_SENSITIVE, /* attrib_quick_select_header */
464 MIME_ENCODING_QP, /* attrib_mail_mime_encoding */
465 #if defined(HAVE_ALARM) && defined(SIGALRM)
466 120, /* nntp_read_timeout_secs */
467 #endif /* HAVE_ALARM && SIGALRM */
468 MIME_ENCODING_8BIT, /* attrib_post_mime_encoding */
469 POST_PROC_NO, /* attrib_post_process_type */
470 SHOW_FROM_NAME, /* attrib_show_author */
471 SORT_ARTICLES_BY_DATE_ASCEND, /* attrib_sort_article_type */
472 SORT_THREADS_BY_SCORE_DESCEND, /* attrib_sort_threads_type */
473 THREAD_BOTH, /* attrib_thread_articles */
474 THREAD_PERC_DEFAULT, /* attrib_thread_perc */
475 TRUE, /* attrib_add_posted_to_filter */
476 TRUE, /* attrib_advertising */
477 TRUE, /* attrib_alternative_handling */
478 TRUE, /* attrib_auto_list_thread */
479 FALSE, /* attrib_auto_select */
480 FALSE, /* attrib_auto_save */
481 TRUE, /* attrib_batch_save */
482 TRUE, /* attrib_delete_tmp_files */
483 TRUE, /* attrib_group_catchup_on_exit */
484 FALSE, /* attrib_mail_8bit_header */
485 FALSE, /* attrib_mime_forward */
486 FALSE, /* attrib_mark_ignore_tags */
487 TRUE, /* attrib_mark_saved_read */
488 TRUE, /* attrib_pos_first_unread */
489 FALSE, /* attrib_post_8bit_header */
490 TRUE, /* attrib_post_process_view */
491 #ifndef DISABLE_PRINTING
492 FALSE, /* attrib_print_header */
493 #endif /* !DISABLE_PRINTING */
494 FALSE, /* attrib_process_only_unread */
495 FALSE, /* attrib_prompt_followupto */
496 TRUE, /* attrib_show_only_unread_arts */
497 TRUE, /* attrib_show_signatures */
498 TRUE, /* attrib_sigdashes */
499 TRUE, /* attrib_signature_repost */
500 TRUE, /* attrib_start_editor_offset */
501 FALSE, /* attrib_tex2iso_conv */
502 TRUE, /* attrib_thread_catchup_on_exit */
503 TRUE, /* attrib_verbatim_handling */
504 #ifdef HAVE_COLOR
505 FALSE, /* attrib_extquote_handling */
506 #endif /* HAVE_COLOR */
507 FALSE, /* attrib_x_comment_to */
508 TRUE, /* attrib_wrap_on_next_unread */
509 FALSE, /* attrib_ask_for_metamail */
510 FALSE, /* attrib_quick_kill_case */
511 FALSE, /* attrib_quick_kill_expire */
512 FALSE, /* attrib_quick_select_case */
513 FALSE /* attrib_quick_select_expire */
514 };
515
516 struct t_capabilities nntp_caps = {
517 NONE, /* type (NONE, CAPABILITIES, BROKEN) */
518 0, /* CAPABILITIES version */
519 FALSE, /* MODE-READER: "MODE READER" */
520 FALSE, /* READER: "ARTICLE", "BODY" */
521 FALSE, /* POST */
522 FALSE, /* LIST: "LIST ACTIVE" */
523 FALSE, /* LIST: "LIST ACTIVE.TIMES" */
524 FALSE, /* LIST: "LIST DISTRIB.PATS" */
525 FALSE, /* LIST: "LIST HEADERS" */
526 NULL, /* list of headers by range */
527 NULL, /* list of headers by id */
528 FALSE, /* LIST: "LIST NEWSGROUPS" */
529 FALSE, /* LIST: "LIST OVERVIEW.FMT" */
530 FALSE, /* LIST: "LIST MOTD" */
531 FALSE, /* LIST: "LIST SUBSCRIPTIONS" */
532 FALSE, /* LIST: "LIST DISTRIBUTIONS" */
533 FALSE, /* LIST: "LIST MODERATORS" */
534 FALSE, /* LIST: "LIST COUNTS" */
535 FALSE, /* XPAT */
536 FALSE, /* HDR: "HDR", "LIST HEADERS" */
537 NULL, /* [X]HDR */
538 FALSE, /* OVER: "OVER", "LIST OVERVIEW.FMT" */
539 FALSE, /* OVER: "OVER mid" */
540 NULL, /* [X]OVER */
541 FALSE, /* NEWNEWS */
542 NULL, /* IMPLEMENTATION */
543 FALSE, /* STARTTLS */
544 FALSE, /* AUTHINFO USER/PASS */
545 FALSE, /* AUTHINFO SASL */
546 FALSE, /* AUTHINFO available but not in current state */
547 SASL_NONE, /* SASL CRAM-MD5 DIGEST-MD5 PLAIN GSSAPI EXTERNAL OTP NTLM LOGIN */
548 FALSE, /* COMPRESS */
549 COMPRESS_NONE, /* COMPRESS_NONE, COMPRESS_DEFLATE */
550 #if 0
551 FALSE, /* STREAMING: "MODE STREAM", "CHECK", "TAKETHIS" */
552 FALSE /* IHAVE */
553 #endif /* 0 */
554 #ifndef BROKEN_LISTGROUP
555 FALSE /* LISTGROUP doesn't select group */
556 #else
557 TRUE
558 #endif /* !BROKEN_LISTGROUP */
559 };
560
561 static char libdir[PATH_LEN]; /* directory where news config files are (ie. active) */
562 static mode_t real_umask;
563
564 #ifdef HAVE_COLOR
565
566 # define DFT_FORE -1
567 # define DFT_BACK -2
568 # define DFT_INIT -3
569
570 static const struct {
571 int *colorp;
572 int color_dft; /* -2 back, -1 fore, >=0 normal */
573 } our_colors[] = {
574 { &tinrc.col_back, DFT_BACK },
575 { &tinrc.col_from, 2 },
576 { &tinrc.col_head, 2 },
577 { &tinrc.col_help, DFT_FORE },
578 { &tinrc.col_invers_bg, 4 },
579 { &tinrc.col_invers_fg, 7 },
580 { &tinrc.col_markdash, 13 },
581 { &tinrc.col_markstar, 11 },
582 { &tinrc.col_markslash, 14 },
583 { &tinrc.col_markstroke, 12 },
584 { &tinrc.col_message, 6 },
585 { &tinrc.col_minihelp, 3 },
586 { &tinrc.col_newsheaders, 9 },
587 { &tinrc.col_normal, DFT_FORE },
588 { &tinrc.col_quote, 2 },
589 { &tinrc.col_quote2, 3 },
590 { &tinrc.col_quote3, 4 },
591 { &tinrc.col_extquote, 5 },
592 { &tinrc.col_response, 2 },
593 { &tinrc.col_signature, 4 },
594 { &tinrc.col_urls, DFT_FORE },
595 { &tinrc.col_verbatim, 5 },
596 { &tinrc.col_subject, 6 },
597 { &tinrc.col_text, DFT_FORE },
598 { &tinrc.col_title, 4 },
599 };
600
601
602 static void
preinit_colors(void)603 preinit_colors(
604 void)
605 {
606 size_t n;
607
608 for (n = 0; n < ARRAY_SIZE(our_colors); n++)
609 *(our_colors[n].colorp) = DFT_INIT;
610 }
611
612
613 void
postinit_colors(int last_color)614 postinit_colors(
615 int last_color)
616 {
617 size_t n;
618
619 for (n = 0; n < ARRAY_SIZE(our_colors); n++) {
620 if (*(our_colors[n].colorp) == DFT_INIT
621 || *(our_colors[n].colorp) >= last_color) {
622 switch (our_colors[n].color_dft) {
623 case DFT_FORE:
624 *(our_colors[n].colorp) = default_fcol;
625 break;
626
627 case DFT_BACK:
628 *(our_colors[n].colorp) = default_bcol;
629 break;
630
631 default:
632 *(our_colors[n].colorp) = our_colors[n].color_dft;
633 break;
634 }
635 }
636 TRACE(("postinit_colors [%d] = %d", n, *(our_colors[n].colorp)));
637 }
638 }
639 #endif /* HAVE_COLOR */
640
641
642 /*
643 * Get users home directory, userid, and a bunch of other stuff!
644 */
645 void
init_selfinfo(void)646 init_selfinfo(
647 void)
648 {
649 FILE *fp;
650 char *ptr;
651 char tmp[PATH_LEN];
652 struct stat sb;
653 struct passwd *myentry;
654 #if defined(DOMAIN_NAME) || defined(HAVE_GETHOSTBYNAME)
655 const char *cptr;
656 #endif /* DOMAIN_NAME || HAVE_GETHOSTBYNAME */
657
658 domain_name[0] = '\0';
659
660 #ifdef HAVE_SYS_UTSNAME_H
661 # ifdef HAVE_UNAME
662 if (uname(&system_info) == -1)
663 # endif /* HAVE_UNAME */
664 {
665 strcpy(system_info.sysname, "unknown");
666 *system_info.machine = '\0';
667 *system_info.release = '\0';
668 *system_info.nodename = '\0';
669 }
670 #endif /* HAVE_SYS_UTSNAME_H */
671
672 #ifdef DOMAIN_NAME
673 if ((cptr = get_domain_name()) != NULL)
674 my_strncpy(domain_name, cptr, MAXHOSTNAMELEN);
675 #endif /* DOMAIN_NAME */
676
677 #ifdef HAVE_GETHOSTBYNAME
678 if (domain_name[0] == '\0') {
679 cptr = get_fqdn(get_host_name());
680 if (cptr != NULL)
681 my_strncpy(domain_name, cptr, MAXHOSTNAMELEN);
682 }
683 #endif /* HAVE_GETHOSTBYNAME */
684
685 process_id = getpid();
686
687 real_umask = umask(0);
688 (void) umask(real_umask);
689
690 if ((myentry = getpwuid(getuid())) == NULL) {
691 error_message(2, _(txt_error_passwd_missing));
692 free(tin_progname);
693 giveup();
694 }
695
696 my_strncpy(userid, myentry->pw_name, sizeof(userid) - 1);
697
698 if (((ptr = getenv("TIN_HOMEDIR")) != NULL) && strlen(ptr)) {
699 my_strncpy(homedir, ptr, sizeof(homedir) - 1);
700 } else if (((ptr = getenv("HOME")) != NULL) && strlen(ptr)) {
701 my_strncpy(homedir, ptr, sizeof(homedir) - 1);
702 } else if (strlen(myentry->pw_dir)) {
703 strncpy(homedir, myentry->pw_dir, sizeof(homedir) - 1);
704 } else
705 strncpy(homedir, TMPDIR, sizeof(homedir) - 1);
706
707 created_rcdir = FALSE;
708 dangerous_signal_exit = FALSE;
709 disable_gnksa_domain_check = TRUE;
710 disable_sender = FALSE; /* we set force_no_post=TRUE later on if we don't have a valid FQDN */
711 iso2asc_supported = atoi(get_val("ISO2ASC", DEFAULT_ISO2ASC));
712 if (iso2asc_supported >= NUM_ISO_TABLES || iso2asc_supported < 0) /* TODO: issue a warning here? */
713 iso2asc_supported = -1;
714 list_active = FALSE;
715 newsrc_active = FALSE;
716 post_article_and_exit = FALSE;
717 post_postponed_and_exit = FALSE;
718 read_local_newsgroups_file = FALSE;
719 force_reread_active_file = TRUE;
720 reread_active_for_posted_arts = TRUE;
721 batch_mode = FALSE;
722 check_for_new_newsgroups = TRUE;
723
724 #ifdef HAVE_COLOR
725 preinit_colors();
726 use_color = FALSE;
727 #endif /* HAVE_COLOR */
728
729 word_highlight = TRUE;
730
731 index_maildir[0] = '\0';
732 index_newsdir[0] = '\0';
733 index_savedir[0] = '\0';
734 newsrc[0] = '\0';
735
736 snprintf(page_header, sizeof(page_header), "%s %s release %s (\"%s\") %s",
737 PRODUCT, VERSION, RELEASEDATE, RELEASENAME,
738 (iso2asc_supported >= 0 ? "[ISO2ASC]" : ""));
739 snprintf(cvers, sizeof(cvers), txt_copyright_notice, page_header);
740
741 default_organization[0] = '\0';
742
743 strncpy(bug_addr, BUG_REPORT_ADDRESS, sizeof(bug_addr) - 1);
744
745 bug_nntpserver1[0] = '\0';
746 bug_nntpserver2[0] = '\0';
747
748 #ifdef INEWSDIR
749 strncpy(inewsdir, INEWSDIR, sizeof(inewsdir) - 1);
750 #else
751 inewsdir[0] = '\0';
752 #endif /* INEWSDIR */
753
754 #ifdef apollo
755 my_strncpy(default_organization, get_val("NEWSORG", ""), sizeof(default_organization) - 1);
756 #else
757 my_strncpy(default_organization, get_val("ORGANIZATION", ""), sizeof(default_organization) - 1);
758 #endif /* apollo */
759
760 #ifndef NNTP_ONLY
761 my_strncpy(libdir, get_val("TIN_LIBDIR", NEWSLIBDIR), sizeof(libdir) - 1);
762 my_strncpy(novrootdir, get_val("TIN_NOVROOTDIR", NOVROOTDIR), sizeof(novrootdir) - 1);
763 my_strncpy(novfilename, get_val("TIN_NOVFILENAME", OVERVIEW_FILE), sizeof(novfilename) - 1);
764 my_strncpy(spooldir, get_val("TIN_SPOOLDIR", SPOOLDIR), sizeof(spooldir) - 1);
765 #endif /* !NNTP_ONLY */
766 /* clear news_active_file, active_time_file, newsgroups_file */
767 news_active_file[0] = '\0';
768 active_times_file[0] = '\0';
769 newsgroups_file[0] = '\0';
770 overviewfmt_file[0] = '\0';
771 subscriptions_file[0] = '\0';
772
773 /*
774 * read the global site config file to override some default
775 * values given at compile time
776 */
777 (void) read_site_config();
778
779 /*
780 * the site_config-file was the last chance to set the domainname
781 * if it's still unset fall into no posting mode.
782 */
783 if (domain_name[0] == '\0') {
784 error_message(4, _(txt_error_no_domain_name));
785 force_no_post = TRUE;
786 }
787
788 /*
789 * only set the following variables if they weren't set from within
790 * read_site_config()
791 *
792 * TODO: do we really want that read_site_config() overwrites
793 * values given in env-vars? ($MM_CHARSET, $TIN_ACTIVEFILE)
794 */
795 if (!*news_active_file) /* TODO: really prepend libdir here in case of $TIN_ACTIVEFILE is set? */
796 joinpath(news_active_file, sizeof(news_active_file), libdir, get_val("TIN_ACTIVEFILE", ACTIVE_FILE));
797 if (!*active_times_file)
798 joinpath(active_times_file, sizeof(active_times_file), libdir, ACTIVE_TIMES_FILE);
799 if (!*newsgroups_file)
800 joinpath(newsgroups_file, sizeof(newsgroups_file), libdir, NEWSGROUPS_FILE);
801 if (!*subscriptions_file)
802 joinpath(subscriptions_file, sizeof(subscriptions_file), libdir, SUBSCRIPTIONS_FILE);
803 if (!*overviewfmt_file)
804 joinpath(overviewfmt_file, sizeof(overviewfmt_file), libdir, OVERVIEW_FMT);
805 if (!*default_organization) {
806 joinpath(tmp, sizeof(tmp), libdir, "organization");
807 if ((fp = fopen(tmp, "r")) != NULL) {
808 char buf[LEN];
809
810 if (fgets(buf, (int) sizeof(buf), fp) != NULL) {
811 ptr = strrchr(buf, '\n');
812 if (ptr != NULL)
813 *ptr = '\0';
814 }
815 fclose(fp);
816 my_strncpy(default_organization, buf, sizeof(default_organization) - 1);
817 }
818 }
819
820 /*
821 * Formerly get_mm_charset(), read_site_config() may set mm_charset
822 */
823 #ifndef CHARSET_CONVERSION
824 if (!*tinrc.mm_charset)
825 STRCPY(tinrc.mm_charset, get_val("MM_CHARSET", MM_CHARSET));
826 #else
827 if (tinrc.mm_network_charset < 0) {
828 size_t space = 255;
829
830 ptr = my_malloc(space + 1);
831
832 snprintf(ptr, space, "mm_network_charset=%s\n", get_val("MM_CHARSET", MM_CHARSET));
833 if (!match_list(ptr, "mm_network_charset=", txt_mime_charsets, &tinrc.mm_network_charset)) /* $MM_CHARSET may be set invalid, fallback */
834 snprintf(ptr, space, "mm_network_charset=%s\n", MM_CHARSET);
835
836 free(ptr);
837 }
838 #endif /* !CHARSET_CONVERSION */
839
840 #ifdef TIN_DEFAULTS_DIR
841 joinpath(global_attributes_file, sizeof(global_attributes_file), TIN_DEFAULTS_DIR, ATTRIBUTES_FILE);
842 joinpath(global_config_file, sizeof(global_config_file), TIN_DEFAULTS_DIR, CONFIG_FILE);
843 #else
844 /* read_site_config() might have changed the value of libdir */
845 joinpath(global_attributes_file, sizeof(global_attributes_file), libdir, ATTRIBUTES_FILE);
846 joinpath(global_config_file, sizeof(global_config_file), libdir, CONFIG_FILE);
847 #endif /* TIN_DEFAULTS_DIR */
848
849 joinpath(rcdir, sizeof(rcdir), homedir, RCDIR);
850 if (stat(rcdir, &sb) == -1) {
851 my_mkdir(rcdir, (mode_t) (S_IRWXU)); /* TODO: bail out? give error message? no_write = TRUE? */
852 created_rcdir = TRUE;
853 }
854 strcpy(tinrc.mailer_format, MAILER_FORMAT);
855 my_strncpy(mailer, get_val(ENV_VAR_MAILER, DEFAULT_MAILER), sizeof(mailer) - 1);
856 #ifndef DISABLE_PRINTING
857 strcpy(tinrc.printer, DEFAULT_PRINTER);
858 #endif /* !DISABLE_PRINTING */
859 strcpy(tinrc.inews_prog, PATH_INEWS);
860 joinpath(article_name, sizeof(article_name), homedir, TIN_ARTICLE_NAME);
861 #ifdef APPEND_PID
862 snprintf(article_name + strlen(article_name), sizeof(article_name) - strlen(article_name), ".%ld", (long) process_id);
863 #endif /* APPEND_PID */
864 joinpath(dead_article, sizeof(dead_article), homedir, "dead.article");
865 joinpath(dead_articles, sizeof(dead_articles), homedir, "dead.articles");
866 joinpath(tinrc.maildir, sizeof(tinrc.maildir), homedir, DEFAULT_MAILDIR);
867 joinpath(tinrc.savedir, sizeof(tinrc.savedir), homedir, DEFAULT_SAVEDIR);
868 joinpath(tinrc.sigfile, sizeof(tinrc.sigfile), homedir, ".Sig");
869 joinpath(default_signature, sizeof(default_signature), homedir, ".signature");
870
871 if (!index_newsdir[0])
872 joinpath(index_newsdir, sizeof(index_newsdir), get_val("TIN_INDEX_NEWSDIR", rcdir), INDEX_NEWSDIR);
873 joinpath(index_maildir, sizeof(index_maildir), get_val("TIN_INDEX_MAILDIR", rcdir), INDEX_MAILDIR);
874 if (stat(index_maildir, &sb) == -1)
875 my_mkdir(index_maildir, (mode_t) S_IRWXU);
876 joinpath(index_savedir, sizeof(index_savedir), get_val("TIN_INDEX_SAVEDIR", rcdir), INDEX_SAVEDIR);
877 if (stat(index_savedir, &sb) == -1)
878 my_mkdir(index_savedir, (mode_t) S_IRWXU);
879 joinpath(local_attributes_file, sizeof(local_attributes_file), rcdir, ATTRIBUTES_FILE);
880 joinpath(local_config_file, sizeof(local_config_file), rcdir, CONFIG_FILE);
881 joinpath(filter_file, sizeof(filter_file), rcdir, FILTER_FILE);
882 joinpath(local_input_history_file, sizeof(local_input_history_file), rcdir, INPUT_HISTORY_FILE);
883 joinpath(local_newsrctable_file, sizeof(local_newsrctable_file), rcdir, NEWSRCTABLE_FILE);
884 #ifdef HAVE_MH_MAIL_HANDLING
885 joinpath(mail_active_file, sizeof(mail_active_file), rcdir, ACTIVE_MAIL_FILE);
886 #endif /* HAVE_MH_MAIL_HANDLING */
887 ptr = getenv("MAIL");
888 if (ptr == NULL || (*ptr == '\0'))
889 joinpath(mailbox, sizeof(mailbox), DEFAULT_MAILBOX, userid);
890 else
891 STRCPY(mailbox, ptr);
892 #ifdef HAVE_MH_MAIL_HANDLING
893 joinpath(mailgroups_file, sizeof(mailgroups_file), rcdir, MAILGROUPS_FILE);
894 #endif /* HAVE_MH_MAIL_HANDLING */
895 joinpath(newsrc, sizeof(newsrc), homedir, NEWSRC_FILE);
896 joinpath(newnewsrc, sizeof(newnewsrc), homedir, NEWNEWSRC_FILE);
897 #ifdef APPEND_PID
898 snprintf(newnewsrc + strlen(newnewsrc), sizeof(newnewsrc) - strlen(newnewsrc), ".%d", (int) process_id);
899 #endif /* APPEND_PID */
900 joinpath(posted_info_file, sizeof(posted_info_file), rcdir, POSTED_FILE);
901 joinpath(postponed_articles_file, sizeof(postponed_articles_file), rcdir, POSTPONED_FILE);
902 joinpath(save_active_file, sizeof(save_active_file), rcdir, ACTIVE_SAVE_FILE);
903
904 snprintf(tmp, sizeof(tmp), INDEX_LOCK, userid);
905 joinpath(lock_file, sizeof(lock_file), TMPDIR, tmp);
906
907 #ifdef NNTP_ABLE
908 nntp_tcp_port = (unsigned short) atoi(get_val("NNTPPORT", NNTP_TCP_PORT));
909 #endif /* NNTP_ABLE */
910
911 if ((fp = fopen(posted_info_file, "a")) != NULL) {
912 if (!fstat(fileno(fp), &sb)) {
913 if (sb.st_size == 0) {
914 fprintf(fp, "%s", _(txt_posted_info_file));
915 #ifdef HAVE_FCHMOD
916 fchmod(fileno(fp), (mode_t) (S_IRUSR|S_IWUSR));
917 #else
918 # ifdef HAVE_CHMOD
919 chmod(posted_info_file, (mode_t) (S_IRUSR|S_IWUSR));
920 # endif /* HAVE_CHMOD */
921 #endif /* HAVE_FCHMOD */
922 }
923 }
924 fclose(fp);
925 }
926
927 init_postinfo();
928 snprintf(txt_help_bug_report, sizeof(txt_help_bug_report), _(txt_help_bug), bug_addr);
929
930 #ifdef HAVE_PGP_GPG
931 init_pgp();
932 #endif /* HAVE_PGP_GPG */
933 }
934
935
936 /*
937 * read_site_config()
938 *
939 * This function permits the local administrator to override a few compile
940 * time defined parameters, especially the concerning the place of a local
941 * news spool. This has especially binary distributions of TIN in mind.
942 *
943 * Sven Paulus <sven@tin.org>, 26-Jan-'98
944 */
945 static int
read_site_config(void)946 read_site_config(
947 void)
948 {
949 FILE *fp = (FILE *) 0;
950 char buf[LEN], filename[PATH_LEN];
951 static const char *tin_defaults[] = { TIN_DEFAULTS };
952 int i = 0;
953
954 /*
955 * try to find tin.defaults in some different locations
956 */
957 while (tin_defaults[i] != NULL) {
958 joinpath(filename, sizeof(filename), tin_defaults[i++], "tin.defaults");
959 if ((fp = fopen(filename, "r")) != NULL)
960 break;
961 }
962
963 if (!fp)
964 return -1;
965
966 while (fgets(buf, (int) sizeof(buf), fp)) {
967 /* ignore comments */
968 if (*buf == '#' || *buf == ';' || *buf == ' ')
969 continue;
970 #ifndef NNTP_ONLY
971 if (match_string(buf, "spooldir=", spooldir, sizeof(spooldir)))
972 continue;
973 if (match_string(buf, "overviewdir=", novrootdir, sizeof(novrootdir)))
974 continue;
975 if (match_string(buf, "overviewfile=", novfilename, sizeof(novfilename)))
976 continue;
977 #endif /* !NNTP_ONLY */
978 if (match_string(buf, "activefile=", news_active_file, sizeof(news_active_file)))
979 continue;
980 if (match_string(buf, "activetimesfile=", active_times_file, sizeof(active_times_file)))
981 continue;
982 if (match_string(buf, "newsgroupsfile=", newsgroups_file, sizeof(newsgroups_file)))
983 continue;
984 if (match_string(buf, "newslibdir=", libdir, sizeof(libdir)))
985 continue;
986 if (match_string(buf, "subscriptionsfile=", subscriptions_file, sizeof(subscriptions_file)))
987 continue;
988 if (match_string(buf, "overviewfmtfile=", overviewfmt_file, sizeof(overviewfmt_file)))
989 continue;
990 if (match_string(buf, "domainname=", domain_name, sizeof(domain_name)))
991 continue;
992 if (match_string(buf, "inewsdir=", inewsdir, sizeof(inewsdir)))
993 continue;
994 if (match_string(buf, "bugaddress=", bug_addr, sizeof(bug_addr)))
995 continue;
996 if (match_string(buf, "organization=", default_organization, sizeof(default_organization)))
997 continue;
998 #ifndef CHARSET_CONVERSION
999 if (match_string(buf, "mm_charset=", tinrc.mm_charset, sizeof(tinrc.mm_charset)))
1000 continue;
1001 #else
1002 if (match_list(buf, "mm_charset=", txt_mime_charsets, &tinrc.mm_network_charset))
1003 continue;
1004 #endif /* !CHARSET_CONVERSION */
1005 if (match_list(buf, "post_mime_encoding=", txt_mime_encodings, &tinrc.post_mime_encoding))
1006 continue;
1007 if (match_list(buf, "mail_mime_encoding=", txt_mime_encodings, &tinrc.mail_mime_encoding))
1008 continue;
1009 if (match_boolean(buf, "disable_gnksa_domain_check=", &disable_gnksa_domain_check))
1010 continue;
1011 if (match_boolean(buf, "disable_sender=", &disable_sender))
1012 continue;
1013 }
1014
1015 fclose(fp);
1016 return 0;
1017 }
1018
1019
1020 /*
1021 * set defaults if needed to avoid empty regexp
1022 */
1023 void
postinit_regexp(void)1024 postinit_regexp(
1025 void)
1026 {
1027 if (!strlen(tinrc.strip_re_regex))
1028 STRCPY(tinrc.strip_re_regex, DEFAULT_STRIP_RE_REGEX);
1029 compile_regex(tinrc.strip_re_regex, &strip_re_regex, PCRE_ANCHORED);
1030
1031 if (strlen(tinrc.strip_was_regex)) {
1032 /*
1033 * try to be clever, if we still use the initial default value
1034 * convert it to our needs
1035 *
1036 * TODO: a global solution
1037 */
1038 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
1039 if (IS_LOCAL_CHARSET("UTF-8") && utf8_pcre()) {
1040 if (!strcmp(tinrc.strip_was_regex, DEFAULT_STRIP_WAS_REGEX))
1041 STRCPY(tinrc.strip_was_regex, DEFAULT_U8_STRIP_WAS_REGEX);
1042 } else {
1043 if (!strcmp(tinrc.strip_was_regex, DEFAULT_U8_STRIP_WAS_REGEX))
1044 STRCPY(tinrc.strip_was_regex, DEFAULT_STRIP_WAS_REGEX);
1045 }
1046 #else
1047 if (!strcmp(tinrc.strip_was_regex, DEFAULT_U8_STRIP_WAS_REGEX))
1048 STRCPY(tinrc.strip_was_regex, DEFAULT_STRIP_WAS_REGEX);
1049 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
1050 } else {
1051 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
1052 if (IS_LOCAL_CHARSET("UTF-8") && utf8_pcre())
1053 STRCPY(tinrc.strip_was_regex, DEFAULT_U8_STRIP_WAS_REGEX);
1054 else
1055 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
1056 STRCPY(tinrc.strip_was_regex, DEFAULT_STRIP_WAS_REGEX);
1057 }
1058 compile_regex(tinrc.strip_was_regex, &strip_was_regex, 0);
1059
1060 #ifdef HAVE_COLOR
1061 if (!strlen(tinrc.extquote_regex))
1062 STRCPY(tinrc.extquote_regex, DEFAULT_EXTQUOTE_REGEX);
1063 compile_regex(tinrc.extquote_regex, &extquote_regex, PCRE_CASELESS);
1064 if (!strlen(tinrc.quote_regex))
1065 STRCPY(tinrc.quote_regex, DEFAULT_QUOTE_REGEX);
1066 compile_regex(tinrc.quote_regex, "e_regex, PCRE_CASELESS);
1067 if (!strlen(tinrc.quote_regex2))
1068 STRCPY(tinrc.quote_regex2, DEFAULT_QUOTE_REGEX2);
1069 compile_regex(tinrc.quote_regex2, "e_regex2, PCRE_CASELESS);
1070 if (!strlen(tinrc.quote_regex3))
1071 STRCPY(tinrc.quote_regex3, DEFAULT_QUOTE_REGEX3);
1072 compile_regex(tinrc.quote_regex3, "e_regex3, PCRE_CASELESS);
1073 #endif /* HAVE_COLOR */
1074
1075 if (!strlen(tinrc.slashes_regex))
1076 STRCPY(tinrc.slashes_regex, DEFAULT_SLASHES_REGEX);
1077 compile_regex(tinrc.slashes_regex, &slashes_regex, PCRE_CASELESS);
1078 if (!strlen(tinrc.stars_regex))
1079 STRCPY(tinrc.stars_regex, DEFAULT_STARS_REGEX);
1080 compile_regex(tinrc.stars_regex, &stars_regex, PCRE_CASELESS);
1081 if (!strlen(tinrc.strokes_regex))
1082 STRCPY(tinrc.strokes_regex, DEFAULT_STROKES_REGEX);
1083 compile_regex(tinrc.strokes_regex, &strokes_regex, PCRE_CASELESS);
1084 if (!strlen(tinrc.underscores_regex))
1085 STRCPY(tinrc.underscores_regex, DEFAULT_UNDERSCORES_REGEX);
1086 compile_regex(tinrc.underscores_regex, &underscores_regex, PCRE_CASELESS);
1087
1088 if (!strlen(tinrc.verbatim_begin_regex))
1089 STRCPY(tinrc.verbatim_begin_regex, DEFAULT_VERBATIM_BEGIN_REGEX);
1090 compile_regex(tinrc.verbatim_begin_regex, &verbatim_begin_regex, PCRE_ANCHORED);
1091 if (!strlen(tinrc.verbatim_end_regex))
1092 STRCPY(tinrc.verbatim_end_regex, DEFAULT_VERBATIM_END_REGEX);
1093 compile_regex(tinrc.verbatim_end_regex, &verbatim_end_regex, PCRE_ANCHORED);
1094
1095 compile_regex(UUBEGIN_REGEX, &uubegin_regex, PCRE_ANCHORED);
1096 compile_regex(UUBODY_REGEX, &uubody_regex, PCRE_ANCHORED);
1097
1098 compile_regex(URL_REGEX, &url_regex, PCRE_CASELESS);
1099 compile_regex(MAIL_REGEX, &mail_regex, PCRE_CASELESS);
1100 compile_regex(NEWS_REGEX, &news_regex, PCRE_CASELESS);
1101
1102 compile_regex(SHAR_REGEX, &shar_regex, PCRE_ANCHORED);
1103 }
1104
1105
1106 #if defined(MULTIBYTE_ABLE) && !defined(NO_LOCALE)
1107 t_bool
utf8_pcre(void)1108 utf8_pcre(
1109 void)
1110 {
1111 int i = 0;
1112
1113 # if (defined(PCRE_MAJOR) && PCRE_MAJOR >= 4)
1114 (void) pcre_config(PCRE_CONFIG_UTF8, &i);
1115 # endif /* PCRE_MAJOR && PCRE_MAJOR >= 4 */
1116
1117 return (i ? TRUE : FALSE);
1118 }
1119 #endif /* MULTIBYTE_ABLE && !NO_LOCALE */
1120