1 /* 2 * Copyright (C) 2003-2004 E. Will et al. 3 * Copyright (C) 2005-2006 Atheme Development Group 4 * Rights to this code are as documented in doc/LICENSE. 5 * 6 * Misc tools 7 * 8 */ 9 10 #ifndef ATHEME_TOOLS_H 11 #define ATHEME_TOOLS_H 12 13 /* email stuff */ 14 E int sendemail(user_t *u, myuser_t *mu, const char *type, const char *email, const char *param); 15 16 /* email types (meaning of param argument) */ 17 #define EMAIL_REGISTER "register" /* register an account/nick (verification code) */ 18 #define EMAIL_SENDPASS "sendpass" /* send a password to a user (password) */ 19 #define EMAIL_SETEMAIL "setemail" /* change email address (verification code) */ 20 #define EMAIL_MEMO "memo" /* emailed memos (memo text) */ 21 #define EMAIL_SETPASS "setpass" /* send a password change key (verification code) */ 22 23 /* arc4random.c */ 24 #ifndef HAVE_ARC4RANDOM 25 E void arc4random_stir(void); 26 E void arc4random_addrandom(unsigned char *dat, int datlen); 27 E unsigned int arc4random(void); 28 #ifndef HAVE_ARC4RANDOM_BUF 29 E void arc4random_buf(void *buf, size_t n); 30 #endif /* !HAVE_ARC4RANDOM_BUF */ 31 #endif /* !HAVE_ARC4RANDOM */ 32 33 /* explicit_bzero.c */ 34 #ifndef HAVE_EXPLICIT_BZERO 35 E void explicit_bzero(void *p, size_t n); 36 #endif /* !HAVE_EXPLICIT_BZERO */ 37 38 /* cidr.c */ 39 E int valid_ip_or_mask(const char *src); 40 41 typedef enum { 42 LOG_ANY = 0, 43 LOG_INTERACTIVE = 1, /* IRC channels */ 44 LOG_NONINTERACTIVE = 2 /* files */ 45 } log_type_t; 46 47 typedef struct logfile_ logfile_t; 48 49 /* logstreams API --nenolod */ 50 typedef void (*log_write_func_t)(logfile_t *lf, const char *buf); 51 52 /* logger.c */ 53 struct logfile_ { 54 object_t parent; 55 mowgli_node_t node; 56 57 void *log_file; /* opaque: can either be mychan_t or FILE --nenolod */ 58 char *log_path; 59 unsigned int log_mask; 60 61 log_write_func_t write_func; 62 log_type_t log_type; 63 }; 64 65 E char *log_path; /* contains path to default log. */ 66 E int log_force; 67 68 E logfile_t *logfile_new(const char *log_path_, unsigned int log_mask); 69 E void logfile_register(logfile_t *lf); 70 E void logfile_unregister(logfile_t *lf); 71 72 /* general */ 73 #define LG_NONE 0x00000001 /* don't log */ 74 #define LG_INFO 0x00000002 /* log general info */ 75 #define LG_ERROR 0x00000004 /* log real important stuff */ 76 #define LG_IOERROR 0x00000008 /* log I/O errors. */ 77 #define LG_DEBUG 0x00000010 /* log debugging stuff */ 78 #define LG_VERBOSE 0x00000020 /* log a bit more verbosely than INFO or REGISTER, but not as much as DEBUG */ 79 /* commands */ 80 #define LG_CMD_ADMIN 0x00000100 /* oper-only commands */ 81 #define LG_CMD_REGISTER 0x00000200 /* register/drop */ 82 #define LG_CMD_SET 0x00000400 /* change properties of static data */ 83 #define LG_CMD_DO 0x00000800 /* change properties of dynamic data */ 84 #define LG_CMD_LOGIN 0x00001000 /* login/logout */ 85 #define LG_CMD_GET 0x00002000 /* query information */ 86 #define LG_CMD_REQUEST 0x00004000 /* requests made by users */ 87 /* other */ 88 #define LG_NETWORK 0x00010000 /* netsplit/netjoin */ 89 #define LG_WALLOPS 0x00020000 /* NOTYET wallops from opers/other servers */ 90 #define LG_RAWDATA 0x00040000 /* all data sent/received */ 91 #define LG_REGISTER 0x00080000 /* all registration related messages */ 92 #define LG_WARN1 0x00100000 /* NOTYET messages formerly walloped */ 93 #define LG_WARN2 0x00200000 /* NOTYET messages formerly snooped */ 94 #define LG_DENYCMD 0x00400000 /* commands denied by security policy */ 95 96 #define LG_CMD_ALL 0x0000FF00 97 #define LG_ALL 0x7FFFFFFF /* XXX cannot use bit 31 as it would then be equal to TOKEN_UNMATCHED */ 98 99 /* aliases for use with logcommand() */ 100 #define CMDLOG_ADMIN LG_CMD_ADMIN 101 #define CMDLOG_REGISTER (LG_CMD_REGISTER | LG_REGISTER) 102 #define CMDLOG_SET LG_CMD_SET 103 #define CMDLOG_REQUEST LG_CMD_REQUEST 104 #define CMDLOG_DO LG_CMD_DO 105 #define CMDLOG_LOGIN LG_CMD_LOGIN 106 #define CMDLOG_GET LG_CMD_GET 107 108 E void log_open(void); 109 E void log_shutdown(void); 110 E bool log_debug_enabled(void); 111 E void log_master_set_mask(unsigned int mask); 112 E logfile_t *logfile_find_mask(unsigned int log_mask); 113 E void slog(unsigned int level, const char *fmt, ...) PRINTFLIKE(2, 3); 114 E void logcommand(sourceinfo_t *si, int level, const char *fmt, ...) PRINTFLIKE(3, 4); 115 E void logcommand_user(service_t *svs, user_t *source, int level, const char *fmt, ...) PRINTFLIKE(4, 5); 116 E void logcommand_external(service_t *svs, const char *type, connection_t *source, const char *sourcedesc, myuser_t *login, int level, const char *fmt, ...) PRINTFLIKE(7, 8); 117 118 /* function.c */ 119 120 typedef void (*email_canonicalizer_t)(char email[EMAILLEN + 1], void *user_data); 121 122 typedef struct { 123 email_canonicalizer_t func; 124 void *user_data; 125 mowgli_node_t node; 126 } email_canonicalizer_item_t; 127 128 /* misc string stuff */ 129 E char *random_string(int sz); 130 E void create_challenge(sourceinfo_t *si, const char *name, int v, char *dest); 131 E void tb2sp(char *line); 132 E char *replace(char *s, int size, const char *old, const char *new); 133 E const char *number_to_string(int num); 134 E int validemail(const char *email); 135 E stringref canonicalize_email(const char *email); 136 E void canonicalize_email_case(char email[EMAILLEN + 1], void *user_data); 137 E void register_email_canonicalizer(email_canonicalizer_t func, void *user_data); 138 E void unregister_email_canonicalizer(email_canonicalizer_t func, void *user_data); 139 E bool email_within_limits(const char *email); 140 E bool validhostmask(const char *host); 141 E char *pretty_mask(char *mask); 142 E bool validtopic(const char *topic); 143 E bool has_ctrl_chars(const char *text); 144 E char *sbytes(float x); 145 E float bytes(float x); 146 147 E unsigned long makekey(void); 148 E int srename(const char *old_fn, const char *new_fn); 149 150 /* time stuff */ 151 #if HAVE_GETTIMEOFDAY 152 E void s_time(struct timeval *sttime); 153 E void e_time(struct timeval sttime, struct timeval *ttime); 154 E int tv2ms(struct timeval *tv); 155 #endif 156 E char *time_ago(time_t event); 157 E char *timediff(time_t seconds); 158 159 #ifndef timersub 160 #define timersub(tvp, uvp, vvp) \ 161 do { \ 162 (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ 163 (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ 164 if ((vvp)->tv_usec < 0) { \ 165 (vvp)->tv_sec--; \ 166 (vvp)->tv_usec += 1000000; \ 167 } \ 168 } while (0) 169 #endif 170 171 /* tokenize.c */ 172 E int sjtoken(char *message, char delimiter, char **parv); 173 E int tokenize(char *message, char **parv); 174 175 /* ubase64.c */ 176 E const char *uinttobase64(char *buf, uint64_t v, int64_t count); 177 E unsigned int base64touint(const char *buf); 178 E void decode_p10_ip(const char *b64, char ipstring[HOSTIPLEN]); 179 180 /* sharedheap.c */ 181 E mowgli_heap_t *sharedheap_get(size_t size); 182 E void sharedheap_unref(mowgli_heap_t *heap); 183 E char *combine_path(const char *parent, const char *child); 184 185 #if !HAVE_VSNPRINTF 186 int rpl_vsnprintf(char *, size_t, const char *, va_list); 187 #endif 188 #if !HAVE_SNPRINTF 189 int rpl_snprintf(char *, size_t, const char *, ...); 190 #endif 191 #if !HAVE_VASPRINTF 192 int rpl_vasprintf(char **, const char *, va_list); 193 #endif 194 #if !HAVE_ASPRINTF 195 int rpl_asprintf(char **, const char *, ...); 196 #endif 197 198 #endif 199 200 /* vim:cinoptions=>s,e0,n0,f0,{0,}0,^0,=s,ps,t0,c3,+s,(2s,us,)20,*30,gs,hs 201 * vim:ts=8 202 * vim:sw=8 203 * vim:noexpandtab 204 */ 205