#ifndef _LIBBBSUTIL_H_ #define _LIBBBSUTIL_H_ #include #include #include #include #include "osdep.h" #include "config.h" // XXX for TIMET64, but config.h has too much thing I don't want ... #ifdef __GNUC__ #define GCC_CHECK_FORMAT(a,b) __attribute__ ((format (printf, a, b))) #else #define GCC_CHECK_FORMAT(a,b) #endif // flags used by strip_ansi enum STRIP_FLAG { STRIP_ALL = 0, ONLY_COLOR, // allow only colors (ESC [ .. m) NO_RELOAD // allow all known (color+move) }; enum LOG_FLAG { LOG_CREAT = 1, }; /* DBCS aware modes */ enum _DBCS_STATUS { DBCS_ASCII, DBCS_LEADING, DBCS_TRAILING, }; #ifdef TIMET64 typedef int32_t time4_t; #else typedef time_t time4_t; #endif /* crypt.c */ char *fcrypt(const char *key, const char *salt); /* daemon.c */ extern int daemonize(const char * pidfile, const char * logfile); /* file.c */ extern off_t dashs(const char *fname); extern time4_t dasht(const char *fname); extern time4_t dashc(const char *fname); extern int dashl(const char *fname); extern int dashf(const char *fname); extern int dashd(const char *fname); extern int copy_file_to_file(const char *src, const char *dst); extern int copy_file_to_dir(const char *src, const char *dst); extern int copy_dir_to_dir(const char *src, const char *dst); extern int copy_file(const char *src, const char *dst); extern int Rename(const char *src, const char *dst); extern int Copy(const char *src, const char *dst); extern int CopyN(const char *src, const char *dst, int n); extern int AppendTail(const char *src, const char *dst, int off); extern int Link(const char *src, const char *dst); extern int HardLink(const char *src, const char *dst); extern int file_count_line(const char *file); extern int file_append_line(const char *file, const char *string); // does not append "\n" extern int file_append_record(const char *file, const char *key); // will append "\n" extern int file_exist_record(const char *file, const char *key); extern int file_find_record(const char *file, const char *key); extern int file_delete_record(const char *file, const char *key, int case_sensitive); /* lock.c */ extern void PttLock(int fd, int start, int size, int mode); /* net.c */ extern uint32_t ipstr2int(const char *ip); extern int tobind (const char *addr); extern int tobindex (const char *addr, int qlen, int (*setsock)(int), int do_listen); extern int toconnect(const char *addr); extern int toconnectex(const char *addr, int timeout); extern int toread (int fd, void *buf, int len); extern int towrite (int fd, const void *buf, int len); extern int send_remote_fd(int tunnel, int fd); extern int recv_remote_fd(int tunnel, const char *tunnel_path); /* sort.c */ extern int cmp_int(const void *a, const void *b); extern int cmp_int_desc(const void * a, const void * b); extern int *intbsearch(int key, const int *base0, int nmemb); extern unsigned int *uintbsearch(const unsigned int key, const unsigned int *base0, const int nmemb); /* string.h */ extern void str_lower(char *t, const char *s); extern void trim(char *buf); extern void chomp(char *src); extern int strlen_noansi(const char *s); extern int strat_ansi(int count, const char *s); extern int strip_blank(char *cbuf, const char *buf); extern int strip_ansi(char *buf, const char *str, enum STRIP_FLAG flag); extern void strip_nonebig5(unsigned char *str, int maxlen); extern int invalid_pname(const char *str); extern int is_number(const char *p); extern char * qp_encode (char *s, size_t slen, const char *d, const char *tocode); extern unsigned StringHash(const char *s); /* DBCS utilities */ extern int DBCS_RemoveIntrEscape(unsigned char *buf, int *len); extern int DBCS_Status(const char *dbcstr, int pos); extern char * DBCS_strcasestr(const char* pool, const char *ptr); extern size_t str_iconv( const char *fromcode, /* charset of source string */ const char *tocode, /* charset of destination string */ const char *src, /* source string */ size_t srclen, /* source string length */ char *dst, /* destination string */ size_t dstlen); extern void str_decode_M3(char *str); /* time.c */ extern int is_leap_year(int year); extern int getHoroscope(int m, int d); extern const char* Cdate(const time4_t *clock); extern const char* Cdatelite(const time4_t *clock); extern const char* Cdatedate(const time4_t * clock); extern const char * Cdate_mdHM(const time4_t * clock); extern const char * Cdate_md(const time4_t * clock); #ifdef TIMET64 struct tm* localtime4(const time4_t *); struct tm* localtime4_r(const time4_t *, struct tm *); time4_t time4(time4_t *); char* ctime4(const time4_t *); char* ctime4_r(const time4_t *, char *); #else #define localtime4_r(a,b) localtime_r(a,b) #define localtime4(a) localtime(a) #define time4(a) time(a) #define ctime4(a) ctime(a) #define ctime4_r(a) ctime_r(a) #endif extern int log_filef(const char *fn, int flag, const char *fmt,...) GCC_CHECK_FORMAT(3,4); extern int log_file(const char *fn, int flag, const char *msg); /* record.c */ int get_num_records(const char *fpath, size_t size); int get_records_keep(const char *fpath, void *rptr, size_t size, int id, size_t number, int *fd); int get_records(const char *fpath, void *rptr, size_t size, int id, size_t number); #define get_record(fpath, rptr, size, id) get_records(fpath, rptr, size, id, 1) #define get_record_keep(fpath, rptr, size, id, fd) get_records_keep(fpath, rptr, size, id, 1, fd) int substitute_record(const char *fpath, const void *rptr, size_t size, int id); int append_record(const char *fpath, const void *record, size_t size); int delete_records(const char *fpath, size_t size, int id, size_t num); #define delete_record(fpath, size, id) delete_records(fpath, size, id, 1) int apply_record(const char *fpath, int (*fptr) (void *item, void *optarg), size_t size, void *arg); /* vector.c */ struct Vector { int size; int length; int capacity; char *base; bool constant; }; extern void Vector_init(struct Vector *self, const int size); extern void Vector_init_const(struct Vector *self, char * base, const int length, const int size); extern void Vector_delete(struct Vector *self); extern void Vector_clear(struct Vector *self, const int size); extern int Vector_length(const struct Vector *self); extern void Vector_resize(struct Vector *self, const int length); extern void Vector_add(struct Vector *self, const char *name); extern const char* Vector_get(const struct Vector *self, const int idx); extern int Vector_MaxLen(const struct Vector *list, const int offset, const int count); extern int Vector_match(const struct Vector *src, struct Vector *dst, const int key, const int pos); extern void Vector_sublist(const struct Vector *src, struct Vector *dst, const char *tag); extern int Vector_remove(struct Vector *self, const char *name); extern int Vector_search(const struct Vector *self, const char *name); /* telnet.c */ struct TelnetCallback { void (*write_data) (void *write_arg, int fd, const void *buf, size_t nbytes); void (*term_resize) (void *resize_arg,int w, int h); void (*update_client_code) (void *cc_arg, unsigned char seq); void (*send_ayt) (void *ayt_arg, int fd); }; #define TELNET_IAC_MAXLEN (16) struct TelnetCtx { int fd; // should be blocking fd unsigned char iac_state; unsigned char iac_quote; unsigned char iac_opt_req; unsigned char iac_buf[TELNET_IAC_MAXLEN]; unsigned int iac_buflen; const struct TelnetCallback *callback; // callback parameters void *write_arg; // write_data void *resize_arg; // term_resize void *cc_arg; // update_client_code void *ayt_arg; // send_ayt }; typedef struct TelnetCtx TelnetCtx; extern TelnetCtx *telnet_create_context(void); extern void telnet_free_context (TelnetCtx *ctx); extern void telnet_ctx_init (TelnetCtx *ctx, const struct TelnetCallback *callback, int fd); extern void telnet_ctx_send_init_cmds(TelnetCtx *ctx); extern void telnet_ctx_set_cc_arg (TelnetCtx *ctx, void *cc_arg); extern void telnet_ctx_set_write_arg (TelnetCtx *ctx, void *cc_arg); extern void telnet_ctx_set_resize_arg(TelnetCtx *ctx, void *cc_arg); extern void telnet_ctx_set_ayt_arg (TelnetCtx *ctx, void *ayt_arg); extern ssize_t telnet_process (TelnetCtx *ctx, unsigned char *buf, ssize_t size); #endif