You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
259 lines
8.2 KiB
C
259 lines
8.2 KiB
C
20 years ago
|
/*
|
||
|
* binkleyforce -- unix FTN mailer project
|
||
|
*
|
||
|
* Copyright (c) 1998-2000 Alexander Belkin, 2:5020/1398.11
|
||
|
*
|
||
|
* This program is free software; you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU General Public License as published by
|
||
|
* the Free Software Foundation; either version 2 of the License, or
|
||
|
* (at your option) any later version.
|
||
|
*
|
||
|
* $Id$
|
||
|
*/
|
||
|
|
||
|
#ifndef _UTIL_H_
|
||
|
#define _UTIL_H_
|
||
|
|
||
|
#define DEFAULT_ZONE 2
|
||
|
#define DEFAULT_NET 5020
|
||
|
#define DEFAULT_NODE 0
|
||
|
|
||
|
#define TIMEVEC_MAX_ELEMENTS 10
|
||
|
|
||
|
enum { ADDR_EQ, ADDR_GT, ADDR_LT };
|
||
|
|
||
|
enum {
|
||
|
PLOCK_OK,
|
||
|
PLOCK_EXIST,
|
||
|
PLOCK_ERROR,
|
||
|
PLOCK_OURLOCK
|
||
|
};
|
||
|
|
||
|
enum day
|
||
|
{
|
||
|
DAY_MONDAY,
|
||
|
DAY_TUESDAY,
|
||
|
DAY_WEDNESDAY,
|
||
|
DAY_THURSDAY,
|
||
|
DAY_FRIDAY,
|
||
|
DAY_SATURDAY,
|
||
|
DAY_SUNDAY,
|
||
|
DAY_ANY,
|
||
|
DAY_WORKDAY,
|
||
|
DAY_WEEKEND,
|
||
|
DAY_UNDEF
|
||
|
};
|
||
|
|
||
|
typedef struct faddr {
|
||
|
bool inetform; /* Is address in domain form? */
|
||
|
int zone; /* -1 value means any?! */
|
||
|
int net;
|
||
|
int node;
|
||
|
int point;
|
||
|
char domain[BF_MAXDOMAIN+1];
|
||
|
} s_faddr;
|
||
|
|
||
|
typedef struct timeint {
|
||
|
enum day day_beg;
|
||
|
enum day day_end;
|
||
|
long beg;
|
||
|
long end;
|
||
|
} s_timeint;
|
||
|
|
||
|
typedef struct timevec {
|
||
|
int num;
|
||
|
s_timeint tvec[TIMEVEC_MAX_ELEMENTS];
|
||
|
} s_timevec;
|
||
|
|
||
|
typedef struct message {
|
||
|
int attr;
|
||
|
int cost;
|
||
|
time_t time;
|
||
|
s_faddr orig;
|
||
|
s_faddr dest;
|
||
|
char namefrom[36];
|
||
|
char nameto[36];
|
||
|
char subject[72];
|
||
|
char *text;
|
||
|
char *tagline;
|
||
|
char *tearline;
|
||
|
char *origin;
|
||
|
} s_message;
|
||
|
|
||
|
typedef struct packet {
|
||
|
s_faddr orig;
|
||
|
s_faddr dest;
|
||
|
int baud;
|
||
|
char password[8+1];
|
||
|
s_message *msgs;
|
||
|
int n_msgs;
|
||
|
} s_packet;
|
||
|
|
||
|
enum
|
||
|
{
|
||
|
FILELOCK_CLEAR,
|
||
|
FILELOCK_READ,
|
||
|
FILELOCK_WRITE
|
||
|
};
|
||
|
|
||
|
#define RECODE_MAX_CHAR 255
|
||
|
|
||
|
typedef struct recode_table {
|
||
|
const char *filename;
|
||
|
char table[RECODE_MAX_CHAR+1];
|
||
|
} s_recode_table;
|
||
|
|
||
|
#undef MAX
|
||
|
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
|
||
|
|
||
|
#undef MIN
|
||
|
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
|
||
|
|
||
|
#undef ABS
|
||
|
#define ABS(a) (((a) < 0) ? -(a) : (a))
|
||
|
|
||
|
#define SET_LAT_A_Z "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
|
||
|
#define SET_LAT_a_z "abcdefghijklmnopqrstuvwxyz"
|
||
|
#define SET_DEC "0123456789"
|
||
|
#define SET_HEX "0123456789ABCDEFabcdef"
|
||
|
#define SET_OCT "01234567"
|
||
|
|
||
|
#define CRC16TEST(crc) ((crc) == 0xf0b8)
|
||
|
#define CRC32TEST(crc) ((crc) == 0xdebb20e3L)
|
||
|
|
||
|
#define updcrc16(cp, crc) (TableCRC16Xmodem[(((int)(crc) >> 8) & 0xff)] ^ ((crc) << 8) ^ (cp))
|
||
|
#define updcrc32(cp, crc) (TableCRC32CCITT[((int)(crc) ^ cp) & 0xff] ^ (((crc) >> 8) & 0x00FFFFFF))
|
||
|
|
||
|
#define localtogmt(t) ((t) - time_gmtoffset()*60)
|
||
|
#define gmttolocal(t) ((t) + time_gmtoffset()*60)
|
||
|
|
||
|
#define timer_set(ptr, v) (time_settimer(ptr, v))
|
||
|
#define timer_expired(tm) (time(NULL) > (tm))
|
||
|
#define timer_running(tm) ((tm) > 0)
|
||
|
#define timer_timeleft(tm) (time_timeleft(tm))
|
||
|
|
||
|
#define recode_file_out(str) recode(str, &recode_table_out, conf_string(cf_recode_file_out));
|
||
|
#define recode_file_in(str) recode(str, &recode_table_in, conf_string(cf_recode_file_in));
|
||
|
#define recode_intro_in(str) recode(str, &recode_table_in, conf_string(cf_recode_intro_in));
|
||
|
|
||
|
extern s_recode_table recode_table_in;
|
||
|
extern s_recode_table recode_table_out;
|
||
|
extern unsigned long TableCRC32CCITT[];
|
||
|
extern unsigned short TableCRC16Xmodem[];
|
||
|
extern unsigned short TableCRC16CCITT[];
|
||
|
|
||
|
/* u_crc.c */
|
||
|
unsigned long getcrc32ccitt(const unsigned char *buffer, size_t buflen);
|
||
|
unsigned short getcrc16xmodem(const unsigned char *buffer, size_t buflen);
|
||
|
unsigned short getcrc16ccitt(const unsigned char *buffer, size_t buflen);
|
||
|
|
||
|
/* u_file.c */
|
||
|
int file_lock(FILE *fp, bool exclusive);
|
||
|
void file_unlock(FILE *fp);
|
||
|
int file_lock_wait(FILE *fp, bool exclusive);
|
||
|
bool file_name_issafe(int ch);
|
||
|
char *file_name_makesafe(char *filename);
|
||
|
char *file_getname(char *filename);
|
||
|
char *file_gettmp(void);
|
||
|
char *file_get_dos_name(char *buffer, const char *filename);
|
||
|
bool is_directory(const char *dirname);
|
||
|
bool is_regfile(const char *filename);
|
||
|
int directory_create(const char *dirname, mode_t access_mode);
|
||
|
FILE *file_open(const char *path, const char *mode);
|
||
|
int file_close(FILE *stream);
|
||
|
|
||
|
/* u_ftn.c */
|
||
|
int ftn_addrparse(s_faddr *addr, const char *s, bool wildcard);
|
||
|
char *ftn_addrstr_fido(char *buf, s_faddr addr);
|
||
|
char *ftn_addrstr_inet(char *buf, s_faddr addr);
|
||
|
char *ftn_addrstr(char *buf, s_faddr addr);
|
||
|
int ftn_addrcomp(s_faddr addr1, s_faddr addr2);
|
||
|
int ftn_addrcomp_logic(s_faddr addr1, int operator, s_faddr addr2);
|
||
|
int ftn_addrcomp_mask(s_faddr addr, s_faddr mask);
|
||
|
int ftn_addrsmetric(s_faddr addr1, s_faddr addr2);
|
||
|
|
||
|
/* u_md5.c */
|
||
|
void md5_get(const unsigned char *data, size_t length, unsigned char *digest);
|
||
|
void md5_cram_get(const unsigned char *secret, const unsigned char *challenge,
|
||
|
int challenge_length, unsigned char *digest);
|
||
|
|
||
|
/* u_misc.c */
|
||
|
void *xmalloc(size_t size);
|
||
|
void *xrealloc(void *buf, size_t size);
|
||
|
void *xmemcpy(const void *buffer, size_t buflen);
|
||
|
char *strparse(char *str, char **next, int quoted);
|
||
|
int strcasemask(const char *str, const char *mask);
|
||
|
int checkmasks(const char *masks, const char *str);
|
||
|
char *buffer_putlong(char *buffer, long val);
|
||
|
char *buffer_putint(char *buf, int val);
|
||
|
long buffer_getlong(const char *buf);
|
||
|
int buffer_getint(const char *buf);
|
||
|
void printf_usage(const char *ident, const char *fmt, ...);
|
||
|
|
||
|
/* u_pkt.c */
|
||
|
int pkt_createpacket(const char *pktname, const s_packet *pkt);
|
||
|
|
||
|
/* u_plock.c */
|
||
|
int plock_check(const char *lockname);
|
||
|
int plock_create(const char *lockname);
|
||
|
int plock_remove(const char *lockname);
|
||
|
int plock_link(const char *lockname, const char *tmpname);
|
||
|
|
||
|
/* u_recode.c */
|
||
|
char *recode(char *src, s_recode_table *tab, const char *filename);
|
||
|
|
||
|
/* u_string.c */
|
||
|
char *xstrcpy(const char *src);
|
||
|
char *xstrcat(char *src, const char *add);
|
||
|
char *strnxcpy(char *dst, const char *src, size_t len);
|
||
|
char *strnxcat(char *dst, const char *src, size_t len);
|
||
|
char *string_token(char *str, char **next, const char *delim, int quoted);
|
||
|
char *string_chomp(char *str);
|
||
|
const char *string_casestr(const char *string, const char *substr);
|
||
|
const char *string_casechr(const char *str, int ch);
|
||
|
char *string_toupper(char *str);
|
||
|
char *string_tolower(char *str);
|
||
|
bool string_isupper(const char *str);
|
||
|
bool string_islower(const char *str);
|
||
|
char *string_trimright(char *str);
|
||
|
char *string_trimleft(char *str);
|
||
|
char *string_trimboth(char *str);
|
||
|
char *string_printable_buffer(const char *buffer, size_t buflen);
|
||
|
const char *string_printable(const char *str);
|
||
|
char *string_replchar(char *str, char oldchar, char newchar);
|
||
|
int string_parse(char **dest, int items, char *str, int separator);
|
||
|
int string_parse_regular(char **dest, int items, char *str);
|
||
|
char *string_translate(const char *str, const char *find, const char *repl);
|
||
|
char *string_humansize(char *buffer, size_t size);
|
||
|
int string_get_escape(char **pptr);
|
||
|
int string_dequote(char *dst, char *src);
|
||
|
char *string_concat(const char *str, ...);
|
||
|
void string_bin_to_hex(char *string, const char *binptr, int binlen);
|
||
|
int string_hex_to_bin(char *binptr, const char *string);
|
||
|
bool string_is_empty(const char *string);
|
||
|
|
||
|
/* u_time.c */
|
||
|
int time_settimer(time_t *timer, int value);
|
||
|
int time_timerout(time_t timer);
|
||
|
int time_timeleft(time_t timer);
|
||
|
int time_elapsed(time_t since_time);
|
||
|
char *time_string_format(char *buffer, size_t buflen, const char *fmt, time_t t);
|
||
|
char *time_string_long(char *buffer, size_t buflen, time_t t);
|
||
|
char *time_string_log(char *buffer, size_t buflen, time_t t);
|
||
|
char *time_string_msghdr(char *buffer, time_t t);
|
||
|
long time_gmtoffset(void);
|
||
|
char *time_string_gmtoffset(char *buffer);
|
||
|
char *time_string_timer(char *buffer, int timer);
|
||
|
char *time_string_approx_interval(char *buffer, int seconds);
|
||
|
int time_check(const char *str, struct tm *now);
|
||
|
int time_checkintervals(const char *timestr, struct tm *now);
|
||
|
int timevec_add(s_timevec *dest, int day_beg, int day_end, long beg, long end);
|
||
|
int timevec_parse(s_timevec *dest, const char *str);
|
||
|
int timevec_parse_list(s_timevec *dest, const char *str);
|
||
|
int timevec_check(const s_timevec *tv, const struct tm *now);
|
||
|
char *timevec_string(char *buffer, const s_timevec *tv, size_t buflen);
|
||
|
bool timevec_isdefined(const s_timevec *tv);
|
||
|
bool timevec_isnow(const s_timevec *tv, const struct tm *now);
|
||
|
|
||
|
#endif /* _UTIL_H_ */
|