1 /*
2  *	binkleyforce -- unix FTN mailer project
3  *
4  *	Copyright (c) 1998-2000 Alexander Belkin, 2:5020/1398.11
5  *
6  *	This program is free software; you can redistribute it and/or modify
7  *	it under the terms of the GNU General Public License as published by
8  *	the Free Software Foundation; either version 2 of the License, or
9  *	(at your option) any later version.
10  *
11  *	$Id: util.h,v 1.1.1.1 2004/09/09 09:52:40 kstepanenkov Exp $
12  */
13 
14 #ifndef _UTIL_H_
15 #define _UTIL_H_
16 
17 #define DEFAULT_ZONE    2
18 #define DEFAULT_NET     5020
19 #define DEFAULT_NODE    0
20 
21 #define TIMEVEC_MAX_ELEMENTS	10
22 
23 enum { ADDR_EQ, ADDR_GT, ADDR_LT };
24 
25 enum {
26 	PLOCK_OK,
27 	PLOCK_EXIST,
28 	PLOCK_ERROR,
29 	PLOCK_OURLOCK
30 };
31 
32 enum day
33 {
34 	DAY_MONDAY,
35 	DAY_TUESDAY,
36 	DAY_WEDNESDAY,
37 	DAY_THURSDAY,
38 	DAY_FRIDAY,
39 	DAY_SATURDAY,
40 	DAY_SUNDAY,
41 	DAY_ANY,
42 	DAY_WORKDAY,
43 	DAY_WEEKEND,
44 	DAY_UNDEF
45 };
46 
47 typedef struct faddr {
48 	bool inetform;	/* Is address in domain form? */
49 	int zone;		/* -1 value means any?! */
50 	int net;
51 	int node;
52 	int point;
53 	char domain[BF_MAXDOMAIN+1];
54 } s_faddr;
55 
56 typedef struct timeint {
57 	enum day day_beg;
58 	enum day day_end;
59 	long beg;
60 	long end;
61 } s_timeint;
62 
63 typedef struct timevec {
64 	int num;
65 	s_timeint tvec[TIMEVEC_MAX_ELEMENTS];
66 } s_timevec;
67 
68 typedef struct message {
69 	int     attr;
70 	int     cost;
71 	time_t  time;
72 	s_faddr orig;
73 	s_faddr dest;
74 	char    namefrom[36];
75 	char    nameto[36];
76 	char    subject[72];
77 	char   *text;
78 	char   *tagline;
79 	char   *tearline;
80 	char   *origin;
81 } s_message;
82 
83 typedef struct packet {
84 	s_faddr orig;
85 	s_faddr dest;
86 	int     baud;
87 	char    password[8+1];
88 	s_message *msgs;
89 	int     n_msgs;
90 } s_packet;
91 
92 enum
93 {
94 	FILELOCK_CLEAR,
95 	FILELOCK_READ,
96 	FILELOCK_WRITE
97 };
98 
99 #define RECODE_MAX_CHAR 255
100 
101 typedef struct recode_table {
102 	const char *filename;
103 	char table[RECODE_MAX_CHAR+1];
104 } s_recode_table;
105 
106 #undef  MAX
107 #define MAX(a, b)           (((a) > (b)) ? (a) : (b))
108 
109 #undef	MIN
110 #define MIN(a, b)           (((a) < (b)) ? (a) : (b))
111 
112 #undef	ABS
113 #define ABS(a)              (((a) < 0) ? -(a) : (a))
114 
115 #define SET_LAT_A_Z         "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
116 #define SET_LAT_a_z         "abcdefghijklmnopqrstuvwxyz"
117 #define SET_DEC             "0123456789"
118 #define SET_HEX             "0123456789ABCDEFabcdef"
119 #define SET_OCT             "01234567"
120 
121 #define CRC16TEST(crc)      ((crc) == 0xf0b8)
122 #define CRC32TEST(crc)      ((crc) == 0xdebb20e3L)
123 
124 #define updcrc16(cp, crc)   (TableCRC16Xmodem[(((int)(crc) >> 8) & 0xff)] ^ ((crc) << 8) ^ (cp))
125 #define updcrc32(cp, crc)   (TableCRC32CCITT[((int)(crc) ^ cp) & 0xff] ^ (((crc) >> 8) & 0x00FFFFFF))
126 
127 #define localtogmt(t)       ((t) - time_gmtoffset()*60)
128 #define gmttolocal(t)       ((t) + time_gmtoffset()*60)
129 
130 #define timer_set(ptr, v)   (time_settimer(ptr, v))
131 #define timer_expired(tm)   (time(NULL) > (tm))
132 #define timer_running(tm)   ((tm) > 0)
133 #define timer_timeleft(tm)  (time_timeleft(tm))
134 
135 #define recode_file_out(str) recode(str, &recode_table_out, conf_string(cf_recode_file_out));
136 #define recode_file_in(str)  recode(str, &recode_table_in, conf_string(cf_recode_file_in));
137 #define recode_intro_in(str) recode(str, &recode_table_in, conf_string(cf_recode_intro_in));
138 
139 extern s_recode_table recode_table_in;
140 extern s_recode_table recode_table_out;
141 extern unsigned long  TableCRC32CCITT[];
142 extern unsigned short TableCRC16Xmodem[];
143 extern unsigned short TableCRC16CCITT[];
144 
145 /* u_crc.c */
146 unsigned long  getcrc32ccitt(const unsigned char *buffer, size_t buflen);
147 unsigned short getcrc16xmodem(const unsigned char *buffer, size_t buflen);
148 unsigned short getcrc16ccitt(const unsigned char *buffer, size_t buflen);
149 
150 /* u_file.c */
151 int   file_lock(FILE *fp, bool exclusive);
152 void  file_unlock(FILE *fp);
153 int   file_lock_wait(FILE *fp, bool exclusive);
154 bool  file_name_issafe(int ch);
155 char *file_name_makesafe(char *filename);
156 char *file_getname(char *filename);
157 char *file_gettmp(void);
158 char *file_get_dos_name(char *buffer, const char *filename);
159 bool  is_directory(const char *dirname);
160 bool  is_regfile(const char *filename);
161 int   directory_create(const char *dirname, mode_t access_mode);
162 FILE *file_open(const char *path, const char *mode);
163 int   file_close(FILE *stream);
164 
165 /* u_ftn.c */
166 int   ftn_addrparse(s_faddr *addr, const char *s, bool wildcard);
167 char *ftn_addrstr_fido(char *buf, s_faddr addr);
168 char *ftn_addrstr_inet(char *buf, s_faddr addr);
169 char *ftn_addrstr(char *buf, s_faddr addr);
170 int   ftn_addrcomp(s_faddr addr1, s_faddr addr2);
171 int   ftn_addrcomp_logic(s_faddr addr1, int operator, s_faddr addr2);
172 int   ftn_addrcomp_mask(s_faddr addr, s_faddr mask);
173 int   ftn_addrsmetric(s_faddr addr1, s_faddr addr2);
174 
175 /* u_md5.c */
176 void md5_get(const unsigned char *data, size_t length, unsigned char *digest);
177 void md5_cram_get(const unsigned char *secret, const unsigned char *challenge,
178                   int challenge_length, unsigned char *digest);
179 
180 /* u_misc.c */
181 void *xmalloc(size_t size);
182 void *xrealloc(void *buf, size_t size);
183 void *xmemcpy(const void *buffer, size_t buflen);
184 char *strparse(char *str, char **next, int quoted);
185 int   strcasemask(const char *str, const char *mask);
186 int   checkmasks(const char *masks, const char *str);
187 char *buffer_putlong(char *buffer, long val);
188 char *buffer_putint(char *buf, int val);
189 long  buffer_getlong(const char *buf);
190 int   buffer_getint(const char *buf);
191 void  printf_usage(const char *ident, const char *fmt, ...);
192 
193 /* u_pkt.c */
194 int   pkt_createpacket(const char *pktname, const s_packet *pkt);
195 
196 /* u_plock.c */
197 int   plock_check(const char *lockname);
198 int   plock_create(const char *lockname);
199 int   plock_remove(const char *lockname);
200 int   plock_link(const char *lockname, const char *tmpname);
201 
202 /* u_recode.c */
203 char *recode(char *src, s_recode_table *tab, const char *filename);
204 
205 /* u_string.c */
206 char       *xstrcpy(const char *src);
207 char       *xstrcat(char *src, const char *add);
208 char       *strnxcpy(char *dst, const char *src, size_t len);
209 char       *strnxcat(char *dst, const char *src, size_t len);
210 char       *string_token(char *str, char **next, const char *delim, int quoted);
211 char       *string_chomp(char *str);
212 const char *string_casestr(const char *string, const char *substr);
213 const char *string_casechr(const char *str, int ch);
214 char       *string_toupper(char *str);
215 char       *string_tolower(char *str);
216 bool        string_isupper(const char *str);
217 bool        string_islower(const char *str);
218 char       *string_trimright(char *str);
219 char       *string_trimleft(char *str);
220 char       *string_trimboth(char *str);
221 char       *string_printable_buffer(const char *buffer, size_t buflen);
222 const char *string_printable(const char *str);
223 char       *string_replchar(char *str, char oldchar, char newchar);
224 int         string_parse(char **dest, int items, char *str, int separator);
225 int         string_parse_regular(char **dest, int items, char *str);
226 char       *string_translate(const char *str, const char *find, const char *repl);
227 char       *string_humansize(char *buffer, size_t size);
228 int         string_get_escape(char **pptr);
229 int         string_dequote(char *dst, char *src);
230 char       *string_concat(const char *str, ...);
231 void        string_bin_to_hex(char *string, const char *binptr, int binlen);
232 int         string_hex_to_bin(char *binptr, const char *string);
233 bool        string_is_empty(const char *string);
234 
235 /* u_time.c */
236 int   time_settimer(time_t *timer, int value);
237 int   time_timerout(time_t timer);
238 int   time_timeleft(time_t timer);
239 int   time_elapsed(time_t since_time);
240 char *time_string_format(char *buffer, size_t buflen, const char *fmt, time_t t);
241 char *time_string_long(char *buffer, size_t buflen, time_t t);
242 char *time_string_bf_log(char *buffer, size_t buflen, time_t t);
243 char *time_string_msghdr(char *buffer, time_t t);
244 long  time_gmtoffset(void);
245 char *time_string_gmtoffset(char *buffer);
246 char *time_string_timer(char *buffer, int timer);
247 char *time_string_approx_interval(char *buffer, int seconds);
248 int   time_check(const char *str, struct tm *now);
249 int   time_checkintervals(const char *timestr, struct tm *now);
250 int   timevec_add(s_timevec *dest, int day_beg, int day_end, long beg, long end);
251 int   timevec_parse(s_timevec *dest, const char *str);
252 int   timevec_parse_list(s_timevec *dest, const char *str);
253 int   timevec_check(const s_timevec *tv, const struct tm *now);
254 char *timevec_string(char *buffer, const s_timevec *tv, size_t buflen);
255 bool  timevec_isdefined(const s_timevec *tv);
256 bool  timevec_isnow(const s_timevec *tv, const struct tm *now);
257 
258 #endif /* _UTIL_H_ */
259