1 /*:ts=8*/
2 /*****************************************************************************
3  * FIDOGATE --- Gateway UNIX Mail/News <-> FTN NetMail/EchoMail
4  *
5  *
6  * Prototypes for functions in libfidogate.a
7  *
8  *****************************************************************************
9  * Copyright (C) 1990-2002
10  *  _____ _____
11  * |     |___  |   Martin Junius             <mj@fidogate.org>
12  * | | | |   | |   Radiumstr. 18
13  * |_|_|_|@home|   D-51069 Koeln, Germany
14  *
15  * This file is part of FIDOGATE.
16  *
17  * FIDOGATE is free software; you can redistribute it and/or modify it
18  * under the terms of the GNU General Public License as published by the
19  * Free Software Foundation; either version 2, or (at your option) any
20  * later version.
21  *
22  * FIDOGATE is distributed in the hope that it will be useful, but
23  * WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * General Public License for more details.
26  *
27  * You should have received a copy of the GNU General Public License
28  * along with FIDOGATE; see the file COPYING.  If not, write to the Free
29  * Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
30  *****************************************************************************/
31 #ifndef FIDOGATE_PROTOTYPES_H
32 #define FIDOGATE_PROTOTYPES_H
33 
34 #include "structs.h"
35 #include "node.h"
36 #include "packet.h"
37 #include <stdio.h>
38 /* Should it be checked by configure ? */
39 #include <sys/stat.h>
40 
41 /* define __attribute__ to nothing for non GNU */
42 #ifndef __GNUC__
43 #define __attribute__(x)        /*nothing */
44 #endif
45 
46 /* acl.c */
47 #define acl_init()              acl_do_file( cf_p_acl() )
48 void acl_do_file(char *);
49 void acl_ngrp(RFCAddr, int);
50 int acl_ngrp_lookup(char *);
51 int pna_notify(char *);
52 int ftnacl_lookup(Node *, Node *, char *);
53 void acl_ftn_free(void);
54 void acl_free(void);
55 void acl_ngrp_free(void);
56 
57 /* acl_ftn.c */
58 #ifdef FTN_ACL
59 #define TYPE_MANDATORY 'm'
60 #define TYPE_READONLY  'r'
61 #define ftnacl_init()               ftnacl_do_file( cf_p_ftnacl() )
62 #define ftnacl_ismandatory(a, b, c) ftnacl_search(a, b, TYPE_MANDATORY, c)
63 #define ftnacl_isreadonly(a, b, c)  ftnacl_search(a, b, TYPE_READONLY, c)
64 void ftnacl_do_file(char *);
65 int ftnacl_search(Node *, char *, char, char);
66 #endif                          /* FTN_ACL */
67 
68 /* active.c */
69 #ifdef ACTIVE_LOOKUP
70 #ifndef SN
71 short active_init(void);
72 #endif
73 Active *active_lookup(char *);
74 #endif                          /* ACTIVE_LOOKUP */
75 
76 /* address.c */
77 #define ADDRESS_ERROR_SIZE	256
78 extern char address_error[ADDRESS_ERROR_SIZE];
79 
80 char *str_ftn_to_inet(char *, size_t, Node *, int);
81 char *s_ftn_to_inet(Node *);
82 Node *inet_to_ftn(char *);
83 int addr_is_local(char *);
84 int addr_is_domain(char *);
85 int addr_is_local_xpost(char *);
86 void addr_is_local_xpost_init(char *);
87 #ifdef AI_1
88 int verify_host_flag(Node *);
89 #endif
90 
91 /* aliases.c */
92 #define alias_init()            alias_do_file( cf_p_aliases() )
93 void alias_do_file(char *);
94 Alias *alias_lookup(Node *, char *);
95 Alias *alias_lookup_strict(Node *, char *);
96 Alias *alias_lookup_userdom(RFCAddr *);
97 void alias_free(void);
98 
99 /* uplinks.c */
100 void uplinks_init(void);
101 AreaUplink *uplinks_lookup(int, char *);
102 void uplinks_lookup_free(void);
103 AreaUplink *uplinks_line_get(int, Node *);
104 AreaUplink *uplinks_first(void);
105 void uplinks_free(void);
106 
107 /* areas.c */
108 void areas_maxmsgsize(long);
109 long areas_get_maxmsgsize(void);
110 void areas_limitmsgsize(long);
111 long areas_get_limitmsgsize(void);
112 void areas_init(void);
113 Area *areas_parse_line(char *);
114 Area *areas_lookup(char *, char *, Node *);
115 void areas_free(void);
116 
117 
118 /* areasbbs.c */
119 int areasbbs_rewrite(void);
120 void areasbbs_changed(void);
121 void areasbbs_not_changed(void);
122 void areasbbs_remove(AreasBBS *, AreasBBS *);
123 void areasbbs_remove1(AreasBBS *);
124 AreasBBS *areasbbs_new(void);
125 int areasbbs_init(char *);
126 int areasbbs_print(FILE *);
127 AreasBBS *areasbbs_first(void);
128 AreasBBS *areasbbs_lookup(char *);
129 void areasbbs_add(AreasBBS * p);
130 int areasbbs_isstate(char *, char);
131 int areasbbs_chstate(char **, char *, char);
132 void areasbbs_free(void);
133 
134 /* binkley.c */
135 #define NOWAIT		0
136 #define WAIT		1
137 
138 #define CHECK_FILE	0
139 #define CHECK_DIR	1
140 
141 char *flav_to_asc(int);
142 //int   asc_to_flav     (char *);
143 char *bink_out_name(Node *);
144 char *bink_bsy_name(Node *);
145 int bink_bsy_test(Node *);
146 int bink_bsy_create(Node *, int);
147 int bink_bsy_delete(Node *);
148 char *bink_find_flo(Node *, char *);
149 char *bink_find_out(Node *, char *);
150 int bink_attach(Node *, int, char *, char *, int);
151 int check_access(char *, int);
152 int bink_mkdir(Node *);
153 long check_size(char *);
154 int check_old(char *, time_t dt);
155 
156 /* bounce.c */
157 void bounce_set_cc(char *);
158 int print_file_subst(FILE *, FILE *, Message *, char *, Textlist *, RFCHeader *);
159 int bounce_header(char *);
160 void bounce_mail(char *, RFCAddr *, Message *, char *, Textlist *, RFCHeader *);
161 
162 /* charset.c */
163 CharsetTable *charset_table_new(void);
164 CharsetAlias *charset_alias_new(void);
165 int charset_write_bin(char *);
166 int charset_read_bin(char *);
167 char *charset_map_c(int, int);
168 char *xlat_s(char *, char *);
169 int charset_recode_buf(char **, size_t *, char *, size_t, char *, char *);
170 char *charset_alias_fsc(char *);
171 char *charset_alias_rfc(char *);
172 void charset_set_in_out(char *, char *);
173 void charset_init(void);
174 char *charset_chrs_name(char *);
175 void charset_free(void);
176 int charset_is_7bit(char *buffer, size_t len);
177 bool charset_is_valid_utf8(char *, size_t);
178 char *charset_fsc_canonize(char *);
179 char *charset_name_rfc2ftn(char *);
180 
181 /* config.c */
182 void cf_i_am_a_gateway_prog(void);
183 void cf_check_gate(void);
184 void cf_debug(void);
185 Node *cf_main_addr(void);
186 Node cf_n_main_addr(void);
187 Node *cf_addr(void);
188 Node *cf_uplink(void);
189 Node cf_n_addr(void);
190 Node cf_n_uplink(void);
191 void cf_set_curr(Node *);
192 void cf_set_zone(int);
193 void cf_set_best(int, int, int);
194 int cf_zone();
195 int cf_defzone();
196 long cf_lineno_get(void);
197 long cf_lineno_set(long n);
198 char *cf_getline(char *, int, FILE *);
199 void cf_read_config_file(char *);
200 void cf_initialize(void);
201 void cf_set_addr(char *);
202 void cf_set_uplink(char *);
203 char *cf_hostname(void);
204 char *cf_domainname(void);
205 char *cf_hostsdomain(void);
206 char *cf_fqdn(void);
207 char *cf_zones_inet_domain(int);
208 int cf_zones_check(int);
209 char *cf_zones_trav(int);
210 char *cf_zones_out(int);
211 char *cf_out_get(short int);
212 char *cf_zones_ftn_domain(int);
213 Node *cf_addr_trav(int);
214 int cf_dos(void);
215 char *cf_dos_xlate(char *);
216 char *cf_unix_xlate(char *);
217 Node cf_gateway(void);
218 char *cf_get_string(char *, int);
219 char *cf_p_organization(void);
220 char *cf_p_origin(void);
221 cflist *config_first(void);
222 void config_free(void);
223 
224 /* crc16.c */
225 void crc16_init(void);
226 void crc16_update(int);
227 void crc16_update_ccitt(int);
228 unsigned int crc16_value(void);
229 unsigned int crc16_value_ccitt(void);
230 
231 /* crc32.c */
232 unsigned long compute_crc32(unsigned char *, int);
233 void crc32_init(void);
234 void crc32_compute(unsigned char *, int);
235 void crc32_update(int);
236 unsigned long crc32_value(void);
237 unsigned long crc32_file(char *);
238 
239 /* date.c */
240 char *date(char *, time_t *);
241 char *date_buf(char *, size_t, char *, time_t *, long);
242 char *date_tz(char *, time_t *, char *);
243 char *date_rfc_tz(char *);
244 time_t date_tz_str_to_time(char *);
245 
246 
247 /* dir.c */
248 #define DIR_SORTNAME	'n'
249 #define DIR_SORTNAMEI	'i'
250 #define DIR_SORTSIZE	's'
251 #define DIR_SORTMTIME	'm'
252 #define DIR_SORTNONE	'-'
253 
254 int dir_open(char *, char *, int);
255 void dir_close(void);
256 void dir_sortmode(int);
257 char *dir_get(int);
258 char *dir_get_mtime(time_t, char);
259 char *dir_search(char *, char *);
260 int mkdir_r(char *, mode_t);
261 
262 /* file.c */
263 void rename_bad(char *);
264 
265 /* flo.c */
266 FILE *flo_file(void);
267 int flo_open(Node *, int);
268 int flo_openx(Node *, int, char *, int);
269 char *flo_gets(char *, size_t);
270 int flo_close(Node *, int, int);
271 void flo_mark(void);
272 
273 /* fopen.c */
274 FILE *fopen_expand_name(char *, char *, int);
275 FILE *xfopen(char *, char *);
276 
277 /* ftnaddr.c */
278 void ftnaddr_init(FTNAddr *);
279 void ftnaddr_invalid(FTNAddr *);
280 FTNAddr ftnaddr_parse(char *);
281 char *s_ftnaddr_print(FTNAddr *);
282 
283 /* getdate.y */
284 time_t get_date(char *, void *);
285 
286 /* gettime.c / parsedate.y */
287 extern time_t parsedate(char *, TIMEINFO *);
288 extern void GetTimeInfo(TIMEINFO *);
289 
290 /* histdb.c */
291 short int hi_init_dbc(void);
292 void hi_init_history(void);
293 void hi_init_tic_history(void);
294 void hi_close(void);
295 short int hi_write_dbc(char *, char *, short int);
296 short int hi_write_t(time_t, time_t, char *);
297 short int hi_write(time_t, char *);
298 short int hi_test(char *);
299 short int hi_write_avail(char *area, char *desc);
300 char *hi_fetch(char *, int);
301 
302 /* hosts.c */
303 void hosts_init(void);
304 Host *hosts_lookup(Node *, char *);
305 void hosts_free(void);
306 
307 /* kludge.c */
308 void kludge_pt_intl(MsgBody *, Message *, short int);
309 char *kludge_get(Textlist *, char *, Textline **);
310 
311 /* lock.c */
312 int lock_fd(int);
313 int unlock_fd(int);
314 int lock_file(FILE *);
315 int unlock_file(FILE *);
316 #ifdef NFS_SAFE_LOCK_FILES
317 int lock_lockfile_nfs(char *, int, char *);
318 int unlock_lockfile_nfs(char *);
319 #else
320 int lock_lockfile(char *, int);
321 int unlock_lockfile(char *);
322 #endif
323 int lock_program(char *, int);
324 int unlock_program(char *);
325 int lock_path(char *, int);
326 void unlock_path(char *);
327 
328 /* log.c */
329 extern int verbose;
330 
331 char *strerror(int);
332 void fglog(const char *, ...)
333     __attribute__((format(printf, 1, 2)));
334 void debug(int, const char *, ...)
335     __attribute__((format(printf, 2, 3)));
336 void log_file(char *);
337 void log_program(char *);
338 
339 /* mail.c */
340 extern char mail_dir[MAXPATH];
341 extern char news_dir[MAXPATH];
342 
343 int mail_open(int);
344 FILE *mail_file(int);
345 void mail_close(int);
346 
347 /* message.c */
348 int pkt_get_line(FILE *, char *, int);
349 int pkt_get_body(FILE *, Textlist *);
350 void msg_body_init(MsgBody *);
351 void msg_body_clear(MsgBody *);
352 int is_blank_line(char *);
353 short int pkt_get_body_parse(FILE *, MsgBody *, Node *, Node *);
354 int msg_body_parse(Textlist *, MsgBody *);
355 int msg_put_msgbody(FILE *, MsgBody *);
356 int msg_put_line(FILE *, char *);
357 char *msg_xlate_line(char *, int, char *, int);
358 int msg_parse_origin(char *, Node *);
359 int msg_parse_msgid(char *, Node *);
360 
361 /* mime.c */
362 enum mime_encodings {
363     MIME_7BIT = 0,
364     MIME_8BIT,
365     MIME_QP,
366     MIME_B64,
367 };
368 #define MIME_DEFAULT MIME_B64
369 #define MIME_STRING_LIMIT 76
370 
371 char *mime_dequote(char *, size_t, char *);
372 char *mime_header_dec(char *, size_t, char *, char *, char *, RFCHeader *);
373 Textlist *mime_body_dec(Textlist *, RFCHeader *, char *, char *);
374 int mime_header_enc(char **, char *, char *, int);
375 void mime_b64_encode_tl(Textlist * in, Textlist * out);
376 void mime_qp_encode_tl(Textlist * in, Textlist * out);
377 
378 /* misc.c */
379 char *str_change_ext(char *, size_t, char *, char *);
380 void str_printf(char *, size_t, const char *, ...)
381     __attribute__((format(printf, 3, 4)));
382 int str_last(char *, size_t);
383 char *str_lower(char *);
384 char *str_upper(char *);
385 char *str_copy(char *, size_t, char *);
386 char *str_append(char *, size_t, char *);
387 char *str_append2(char *, size_t, char *, char *);
388 char *str_copy2(char *, size_t, char *, char *);
389 char *str_copy3(char *, size_t, char *, char *, char *);
390 char *str_copy4(char *, size_t, char *, char *, char *, char *);
391 char *str_copy5(char *, size_t, char *, char *, char *, char *, char *);
392 
393 #define BUF_LAST(d)			str_last  (d,sizeof(d))
394 #define BUF_COPY(d,s)			str_copy  (d,sizeof(d),s)
395 #define BUF_APPEND(d,s)			str_append(d,sizeof(d),s)
396 #define BUF_APPEND2(d,s1,s2)		str_append2(d,sizeof(d),s1,s2)
397 #define BUF_COPY2(d,s1,s2)		str_copy2 (d,sizeof(d),s1,s2)
398 #define BUF_COPY3(d,s1,s2,s3)		str_copy3 (d,sizeof(d),s1,s2,s3)
399 #define BUF_COPY4(d,s1,s2,s3,s4)	str_copy4 (d,sizeof(d),s1,s2,s3,s4)
400 #define BUF_COPY5(d,s1,s2,s3,s4,s5)	str_copy5 (d,sizeof(d),s1,s2,s3,s4,s5)
401 
402 int strlen_zero(char *);
403 char *str_copy_range(char *, size_t, char *, char *);
404 #ifdef HAVE_STRCASECMP
405 #ifndef HAVE_STRICMP
406 #define stricmp  strcasecmp
407 #define strnicmp strncasecmp
408 #endif
409 #endif
410 #if !defined(HAVE_STRCASECMP) && !defined(HAVE_STRICMP)
411 int strnicmp(char *, char *, int);
412 int stricmp(char *, char *);
413 #endif
414 
415 #define streq(a,b)		(strcmp  ((a),(b)) == 0)
416 #define strieq(a,b)		(stricmp ((a),(b)) == 0)
417 #define strneq(a,b,n)		(strncmp ((a),(b),(n)) == 0)
418 #define strnieq(a,b,n)		(strnicmp((a),(b),(n)) == 0)
419 
420 long xtol(char *);
421 void strip_crlf(char *);
422 char *strip_space(char *);
423 int is_space(int);
424 int atooct(char *);
425 int is_blank(int);
426 int is_digit(int);
427 int is_xdigit(int);
428 int is_odigit(int);
429 char *str_expand_name(char *, size_t, char *);
430 
431 #define BUF_EXPAND(d,s)			str_expand_name(d,sizeof(d),s)
432 
433 char *str_dosify(char *);
434 #ifdef DO_DOSIFY                /* MSDOS, OS2 */
435 #define DOSIFY_IF_NEEDED(s)	str_dosify(s);
436 #else                           /* UNIX */
437 #define DOSIFY_IF_NEEDED(s)
438 #endif
439 int run_system(char *);
440 
441 int xfeof(FILE *);
442 
443 void list_init(char ***, char *);
444 int list_match(char **, char **);
445 void list_free(char **);
446 
447 /* msgid.c */
448 char *s_msgid_fido_to_rfc(char *, int *, short, char *);
449 char *s_msgid_default(Message *);
450 char *s_msgid_rfc_to_fido(int *, char *, int, int, char *, short int, int);
451 char *s_msgid_convert_origid(char *);
452 
453 /* node.c */
454 int pfnz_to_node(char *, Node *);
455 int asc_to_node(char *, Node *, int);
456 char *node_to_pfnz(Node *);
457 int node_eq(Node *, Node *);
458 int node_np_eq(Node *, Node *);
459 void node_clear(Node *);
460 void node_invalid(Node *);
461 int asc_to_node_diff(char *, Node *, Node *);
462 #ifdef FTN_ACL
463 int asc_to_node_diff_acl(char *, Node *, Node *);
464 #endif                          /* FTN_ACL */
465 char *node_to_asc_diff(Node *, Node *);
466 #ifdef FTN_ACL
467 char *node_to_asc_diff_acl(Node *, Node *);
468 #endif                          /* FTN_ACL */
469 int node_cmp(Node *, Node *);
470 
471 void lon_init(LON *);
472 void lon_delete(LON *);
473 void lon_add(LON *, Node *);
474 void lon_remove(LON *, Node *);
475 int lon_search(LON *, Node *);
476 int lon_search_wild(LON *, Node *);
477 short int lon_one_link(LON *);
478 #ifdef FTN_ACL
479 int lon_search_acl(LON *, Node *);
480 #endif                          /* FTN_ACL */
481 int lon_is_uplink(LON *, int, Node *);
482 Node *lon_search_node(LON *, Node *);
483 void lon_add_string(LON *, char *);
484 void lon_print(LON *, FILE *, char);
485 void lon_sort(LON *, short);
486 void lon_print_sorted(LON *, FILE *, int);
487 #ifdef FTN_ACL
488 //int   lon_print_acl       (LON *, FILE *);
489 #endif                          /* FTN_ACL */
490 int lon_print_passive(LON *, FILE *);
491 void lon_debug(char, char *, LON *, char);
492 void lon_join(LON *, LON *);
493 
494 /* outpkt.c */
495 char *outpkt_outputname(char *, char *, int, int, int, long, char *);
496 long outpkt_sequencer(void);
497 void outpkt_set_maxopen(int);
498 FILE *outpkt_open(Node *, Node *, int, int, int, int);
499 void outpkt_close(void);
500 int outpkt_netmail(Message *, Textlist *, char *, char *, char *);
501 void send_request(Textlist *);
502 
503 /* packet.c */
504 void pkt_outdir(char *, char *);
505 char *pkt_get_outdir(void);
506 void pkt_baddir(char *, char *);
507 char *pkt_get_baddir(void);
508 FILE *pkt_open(char *, Node *, char *, int);
509 int pkt_close(void);
510 char *pkt_name(void);
511 char *pkt_tmpname(void);
512 int pkt_isopen(void);
513 
514 size_t pkt_get_string(FILE *, char *, size_t);
515 time_t pkt_get_date(FILE *);
516 int pkt_get_msg_hdr(FILE *, Message *, bool);
517 void pkt_debug_msg_hdr(FILE *, Message *, char *);
518 void pkt_put_string(FILE *, char *);
519 void pkt_put_line(FILE *, char *);
520 void pkt_put_int16(FILE *, int);
521 void pkt_put_date(FILE *, time_t, char *);
522 int pkt_put_msg_hdr(FILE *, Message *, int);
523 long pkt_get_int16(FILE *);
524 int pkt_get_nbytes(FILE *, char *, int);
525 int pkt_get_hdr(FILE *, Packet *);
526 void pkt_debug_hdr(FILE *, Packet *, char *);
527 int pkt_put_string_padded(FILE *, char *, int);
528 int pkt_put_hdr(FILE *, Packet *);
529 int pkt_put_hdr_raw(FILE *, Packet *);
530 void pkt_fill_hdr(Packet *);
531 
532 /* parsenode.c */
533 int znfp_get_number(char **);
534 int znfp_parse_partial(char *, Node *);
535 int znfp_parse_diff(char *, Node *, Node *);
536 char *znfp_put_number(int, int);
537 char *s_znfp_print(Node *, int);
538 char *str_znfp_print(char *, size_t, Node *, int, int, int);
539 char *s_znfp(Node *);
540 char *znfp1(Node *);
541 char *znfp2(Node *);
542 char *znfp3(Node *);
543 char *znf1(Node *);
544 char *znf2(Node *);
545 char *nf1(Node *);
546 int wild_compare_node(Node *, Node *);
547 /* passwd.c */
548 void passwd_init(void);
549 Passwd *passwd_lookup(char *, Node *);
550 void passwd_free(void);
551 
552 /* read.c */
553 char *read_line(char *, int, FILE *);
554 long read_rnews_size(FILE *);
555 
556 /* rematch.c */
557 #ifdef HAS_POSIX_REGEX
558 int regex_match(const char *);
559 char *str_regex_match_sub(char *, size_t, int, const char *);
560 void regex_init(void);
561 void regex_free(void);
562 #endif
563 
564 /* rfcaddr.c */
565 void rfcaddr_dot_names(void);
566 void rfcaddr_mode(int);
567 RFCAddr rfcaddr_from_ftn(char *, Node *);
568 RFCAddr rfcaddr_from_rfc(char *);
569 char *s_rfcaddr_to_asc(RFCAddr *, int);
570 void rfcaddr_fallback_username(char *);
571 
572 /* rfcheader.c */
573 int header_alter(RFCHeader *, char *, char *);
574 void header_ca_rfc(RFCHeader *, FILE *, int);
575 void header_free(RFCHeader *);
576 int header_delete_from_body(Textlist *);
577 RFCHeader *header_read(FILE *);
578 RFCHeader *header_read_list(Textlist *);
579 int header_hops(RFCHeader *);
580 char *header_get(RFCHeader *, char *);
581 /* keep for legacy ftn2rfc */
582 char *rfcheader_get(Textlist *, char *);
583 char *header_geth(RFCHeader *, char *, int);
584 char *header_getnext(RFCHeader *);
585 char *s_header_getcomplete(RFCHeader *, char *);
586 char *addr_token(char *);
587 RFCHeader *header_decode(RFCHeader *, char *, char *);
588 
589 /* routing.c */
590 extern Routing *routing_first;
591 extern Routing *routing_last;
592 extern Remap *remap_first;
593 extern Remap *remap_last;
594 extern Rewrite *rewrite_first;
595 extern Rewrite *rewrite_last;
596 extern MkRoute *mkroute_first;
597 extern MkRoute *mkroute_last;
598 
599 int parse_cmd(char *);
600 int parse_flav(char *);
601 void routing_init(char *);
602 int node_match(Node *, Node *);
603 PktDesc *parse_pkt_name(char *, Node *, Node *);
604 
605 /* sequencer.c */
606 long sequencer(char *);
607 long sequencer_nx(char *, int);
608 
609 #ifdef SPYES
610 /* spyes.c */
611 void spyes_init(void);
612 Spy *spyes_lookup(Node *);
613 #endif                          /* SPYES */
614 
615 /* strtok_r.c */
616 #define DELIM_WS	" \t\r\n"
617 #define DELIM_EOL	"\r\n"
618 #define NONE		0
619 #define QUOTE		'\"'
620 #define DQUOTE		'\"'
621 #define SQUOTE		'\''
622 
623 #undef strtok
624 #undef strtok_r
625 
626 char *strtok(char *, const char *);
627 char *xstrtok(char *, const char *);
628 char *strtok_r(char *, const char *, char **);
629 char *strtok_r_ext(char *, const char *, char **, int);
630 
631 #define LOCAL_STRTOK		char *local_strtok_lasts;
632 #define STRTOK(s,d)		strtok_r_ext(s,d,&local_strtok_lasts,NONE)
633 #define STRTOK_Q(s,d)		strtok_r_ext(s,d,&local_strtok_lasts,DQUOTE)
634 
635 /* textlist.c */
636 void tl_fput(FILE *, Textlist *);
637 void tl_add(Textlist *, Textline *);
638 void tl_remove(Textlist *, Textline *);
639 void tl_delete(Textlist *, Textline *);
640 void tl_init(Textlist *);
641 void tl_append(Textlist *, char *);
642 void tl_appendf(Textlist *, char *, ...)
643     __attribute__((format(printf, 2, 3)));
644 void tl_print(Textlist *, FILE *);
645 void tl_print_x(Textlist *, FILE *, char *);
646 void tl_print_xx(Textlist *, FILE *, char *, char *);
647 void tl_clear(Textlist *);
648 long tl_size(Textlist *);
649 void tl_addtl(Textlist *, Textlist *);
650 Textline *tl_get(Textlist *, char *, int);
651 char *tl_get_str(Textlist *, char *, int);
652 int tl_copy(Textlist *, Textlist *);
653 int tl_for_each(Textlist *, int (*)(Textline *, void *), void *);
654 void tl_char_iterator_start(TextlistCharIterator *, Textlist *);
655 size_t tl_char_iterator_next(TextlistCharIterator *, char *, size_t);
656 void tl_iterator_start(TextlistIterator *, Textlist *);
657 Textline *tl_iterator_next(TextlistIterator *);
658 Textlist *tl_dup(Textlist *);
659 void tl_free(Textlist *);
660 void tl_addtl_move(Textlist *, Textlist *);
661 
662 /* tick.c */
663 int copy_file(char *, char *, char *);
664 void tick_init(Tick *);
665 void tick_delete(Tick *);
666 int tick_put(Tick *, char *, mode_t);
667 int tick_get(Tick *, char *);
668 void tick_debug(Tick *, int);
669 #ifndef FECHO_PASSTHROUGHT
670 int tick_send(Tick *, Node *, char *, mode_t);
671 #else
672 int tick_send(Tick *, Node *, char *, int, mode_t, char *);
673 #endif                          /* FECHO_PASSTHROUGHT */
674 void tick_add_path(Tick *);
675 
676 /* tmps.c */
677 void fatal(char *, int);
678 TmpS *tmps_alloc(size_t);
679 TmpS *tmps_realloc(TmpS *, size_t);
680 TmpS *tmps_find(char *);
681 void tmps_free(TmpS *);
682 void tmps_freeall(void);
683 TmpS *tmps_printf(const char *, ...)
684     __attribute__((format(printf, 1, 2)));
685 TmpS *tmps_copy(char *);
686 TmpS *tmps_stripsize(TmpS *);
687 char *s_alloc(size_t);
688 char *s_realloc(char *, size_t);
689 void s_free(char *s);
690 void s_freeall(void);
691 char *s_printf(const char *, ...)
692     __attribute__((format(printf, 1, 2)));
693 char *s_copy(char *);
694 char *s_stripsize(char *);
695 
696 #define TMPS_RETURN(x)		do { tmps_freeall(); return x; } while(0)
697 
698 /* version.c */
699 char *version_global(void);
700 char *version_local(char *);
701 int version_major(void);
702 int version_minor(void);
703 
704 /* wildmat */
705 int wildmat(char *, char *);
706 int wildmatch_file(char *, char *, int);
707 #ifdef FTN_ACL
708 int wildmatch_string(char *, char *, int);
709 #endif
710 int wildmatch(char *, char *, int);
711 
712 /* xalloc.c */
713 #define BUFFERSIZE		(32*1024)   /* Global buffer */
714 extern char buffer[BUFFERSIZE];
715 
716 void *xmalloc(int);
717 void *xrealloc(void *, int);
718 void xfree(void *);
719 char *strsave(char *);
720 char *strsave2(char *, char *);
721 void exit_free(void);
722 
723 MIMEInfo *get_mime(char *, char *, char *);
724 MIMEInfo *get_mime_from_header(RFCHeader *);
725 /* xstrnlen.c */
726 size_t xstrnlen(const char *, size_t);
727 
728 #endif
729