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