ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/ermyth/include/tools.h
Revision: 1.4
Committed: Tue Aug 28 17:08:07 2007 UTC (16 years, 9 months ago) by pippijn
Content type: text/plain
Branch: MAIN
Changes since 1.3: +17 -27 lines
Log Message:
- changed name
- updated the example config to the new system
- added more documentation
- enhanced documentation generators
- added a link to the pdf to the website
- added an RSS feed generator
- transitioned hooks to c++ callbacks
- did various merges with upstream along the way
- added const where appropriate
- removed the old block allocator
- fixed most memory leaks
- transitioned some dictionaries to std::map
- transitioned some lists to std::vector
- made some free functions members where appropriate
- renamed string to dynstr and added a static string ststr
- use NOW instead of time (NULL) if possible
- completely reworked database backends, crypto handlers and protocol handlers
  to use an object factory
- removed the old module system. ermyth does not do any dynamic loading anymore
- fixed most of the build system
- reworked how protocol commands work

File Contents

# User Rev Content
1 pippijn 1.1 /*
2 pippijn 1.4 * Copyright © 2003-2004 E. Will et al.
3     * Copyright © 2005-2006 Atheme Development Group
4 pippijn 1.2 * Rights to this code are as documented in doc/pod/license.pod.
5 pippijn 1.1 *
6     * Misc tools
7     *
8 pippijn 1.4 * $Id: tools.h,v 1.3 2007-07-25 00:03:21 pippijn Exp $
9 pippijn 1.1 */
10    
11     #ifndef _TOOLS_H
12     #define _TOOLS_H
13    
14     /*
15     * Warns operators and console users that an error occurred
16     */
17     #ifdef __GNUC__
18     #define warn(x) \
19     do \
20     { \
21     slog (LG_INFO, "%s(%d) [%s]: critical: " x, \
22     __FILE__, __LINE__, __PRETTY_FUNCTION__); \
23     wallops ("%s(%d) [%s]: critical: " x, \
24     __FILE__, __LINE__, __PRETTY_FUNCTION__);\
25     } while (0)
26     #else
27     #define warn(x) \
28     do \
29     { \
30     slog (LG_INFO, "%s(%d): critical: " x, \
31     __FILE__, __LINE__); \
32     wallops ("%s(%d): critical: " x, \
33     __FILE__, __LINE__); \
34     } while (0)
35     #endif
36    
37     /*
38     * Performs a soft assertion. If the assertion fails, we wallops() and log.
39     */
40     #ifdef __GNUC__
41     #define soft_assert(x) \
42     if (!(x)) { \
43     slog(LG_INFO, "%s(%d) [%s]: critical: Assertion '%s' failed.", \
44     __FILE__, __LINE__, __PRETTY_FUNCTION__, #x); \
45     wallops("%s(%d) [%s]: critical: Assertion '%s' failed.", \
46     __FILE__, __LINE__, __PRETTY_FUNCTION__, #x); \
47     }
48     #else
49     #define soft_assert(x) \
50     if (!(x)) { \
51     slog(LG_INFO, "%s(%d): critical: Assertion '%s' failed.", \
52     __FILE__, __LINE__, #x); \
53     wallops("%s(%d): critical: Assertion '%s' failed.", \
54     __FILE__, __LINE__, #x); \
55     }
56     #endif
57    
58     /*
59     * Same as soft_assert, but returns if an assertion fails.
60     */
61     #ifdef __GNUC__
62     #define return_if_fail(x) \
63     if (!(x)) { \
64     slog(LG_INFO, "%s(%d) [%s]: critical: Assertion '%s' failed.", \
65     __FILE__, __LINE__, __PRETTY_FUNCTION__, #x); \
66     wallops("%s(%d) [%s]: critical: Assertion '%s' failed.", \
67     __FILE__, __LINE__, __PRETTY_FUNCTION__, #x); \
68     return; \
69     }
70     #else
71     #define return_if_fail(x) \
72     if (!(x)) { \
73     slog(LG_INFO, "%s(%d): critical: Assertion '%s' failed.", \
74     __FILE__, __LINE__, #x); \
75     wallops("%s(%d): critical: Assertion '%s' failed.", \
76     __FILE__, __LINE__, #x); \
77     return; \
78     }
79     #endif
80    
81     /*
82 pippijn 1.4 * Same as return_if_fail, but returns a given value if an assertion fails.
83 pippijn 1.1 */
84     #ifdef __GNUC__
85     #define return_val_if_fail(x, y) \
86     if (!(x)) { \
87     slog(LG_INFO, "%s(%d) [%s]: critical: Assertion '%s' failed.", \
88     __FILE__, __LINE__, __PRETTY_FUNCTION__, #x); \
89     wallops("%s(%d) [%s]: critical: Assertion '%s' failed.", \
90     __FILE__, __LINE__, __PRETTY_FUNCTION__, #x); \
91     return (y); \
92     }
93     #else
94     #define return_val_if_fail(x, y) \
95     if (!(x)) { \
96     slog(LG_INFO, "%s(%d): critical: Assertion '%s' failed.", \
97     __FILE__, __LINE__, #x); \
98     wallops("%s(%d): critical: Assertion '%s' failed.", \
99     __FILE__, __LINE__, #x); \
100     return (y); \
101     }
102     #endif
103    
104     /* email stuff */
105     /* the following struct is not used yet */
106     struct email_t
107     {
108     char *sender;
109     char *reciever;
110     char *subject;
111     char *body;
112     char **headers;
113    
114     void *miscellaneous; /* module defined data */
115     void (*callback_sent) (email_t *); /* callback on email send */
116     };
117    
118 pippijn 1.4 E int sendemail (user_t *from, int type, myuser_t *mu, char const * const param);
119 pippijn 1.1
120     /* email types (meaning of param argument) */
121     #define EMAIL_REGISTER 1 /* register an account/nick (verification code) */
122     #define EMAIL_SENDPASS 2 /* send a password to a user (password) */
123     #define EMAIL_SETEMAIL 3 /* change email address (verification code) */
124     #define EMAIL_MEMO 4 /* emailed memos (memo text) */
125     #define EMAIL_SETPASS 5 /* send a password change key (verification code) */
126    
127 pippijn 1.4 /* logstreams API --nenolod */
128 pippijn 1.1 struct logfile_t;
129    
130 pippijn 1.4 typedef void (*log_write_func_t) (logfile_t *lf, char const * const buf);
131 pippijn 1.1
132     /* logger.c */
133 pippijn 1.4 struct logfile_t : zero_initialised
134 pippijn 1.1 {
135     object_t parent;
136     node_t node;
137    
138     void *log_file; /* opaque: can either be mychan_t or FILE --nenolod */
139     char *log_path;
140     unsigned int log_mask;
141    
142     log_write_func_t write_func;
143     };
144    
145     E char *log_path; /* contains path to default log. */
146     E int log_force;
147    
148 pippijn 1.4 E logfile_t *logfile_new (char const * const log_path_, unsigned int log_mask);
149     E void logfile_write (logfile_t *lf, char const * const buf);
150 pippijn 1.1 E void logfile_register (logfile_t *lf);
151     E void logfile_unregister (logfile_t *lf);
152    
153     /* general */
154     #define LG_NONE 0x00000001 /* don't log */
155     #define LG_INFO 0x00000002 /* log general info */
156     #define LG_ERROR 0x00000004 /* log real important stuff */
157     #define LG_IOERROR 0x00000008 /* log I/O errors. */
158     #define LG_DEBUG 0x00000010 /* log debugging stuff */
159     /* commands */
160     #define LG_CMD_ADMIN 0x00000100 /* oper-only commands */
161     #define LG_CMD_REGISTER 0x00000200 /* register/drop */
162     #define LG_CMD_SET 0x00000400 /* change properties of static data */
163     #define LG_CMD_DO 0x00000800 /* change properties of dynamic data */
164     #define LG_CMD_LOGIN 0x00001000 /* login/logout */
165     #define LG_CMD_GET 0x00002000 /* query information */
166     /* other */
167     #define LG_NETWORK 0x00010000 /* netsplit/netjoin */
168     #define LG_WALLOPS 0x00020000 /* NOTYET wallops from opers/other servers */
169     #define LG_RAWDATA 0x00040000 /* all data sent/received */
170     #define LG_REGISTER 0x00080000 /* all registration related messages */
171     #define LG_WARN1 0x00100000 /* NOTYET messages formerly walloped */
172     #define LG_WARN2 0x00100000 /* NOTYET messages formerly snooped */
173    
174     #define LG_CMD_ALL 0x0000FF00
175     #define LG_ALL 0x7FFFFFFF /* XXX cannot use bit 31 as it would then be unequal to TOKEN_UNMATCHED */
176    
177     /* aliases for use with logcommand() */
178     #define CMDLOG_ADMIN LG_CMD_ADMIN
179     #define CMDLOG_REGISTER (LG_CMD_REGISTER | LG_REGISTER)
180     #define CMDLOG_SET LG_CMD_SET
181     #define CMDLOG_DO LG_CMD_DO
182     #define CMDLOG_LOGIN LG_CMD_LOGIN
183     #define CMDLOG_GET LG_CMD_GET
184    
185     E void log_open (void);
186     E void log_shutdown (void);
187     E bool log_debug_enabled (void);
188     E void log_master_set_mask (unsigned int mask);
189 pippijn 1.4 E void slog (unsigned int level, char const * const fmt, ...);
190     E void logcommand (sourceinfo_t *si, int level, char const * const fmt, ...);
191     E void logcommand_user (service_t *svs, user_t *source, int level, char const * const fmt, ...);
192     E void logcommand_external (service_t *svs, char const * const type, connection_t *source, char const * const sourcedesc, myuser_t *login, int level, char const * const fmt, ...);
193 pippijn 1.1
194     /* function.c */
195     /* misc string stuff */
196     E char *gen_pw (int sz);
197     E void tb2sp (char *line);
198 pippijn 1.4 E char *replace (char *s, int size, char const * const oldstr, char const * const newstr);
199 pippijn 1.1 E char *itoa (int num);
200     E int validemail (char *email);
201     E bool validhostmask (char *host);
202 pippijn 1.4 E char const *sbytes (float x);
203 pippijn 1.1 E float bytes (float x);
204    
205     E unsigned long makekey (void);
206    
207     /* time stuff */
208     #if HAVE_GETTIMEOFDAY
209     E void s_time (struct timeval *sttime);
210     E void e_time (struct timeval sttime, struct timeval *ttime);
211     E int tv2ms (struct timeval *tv);
212     #endif
213     E char *time_ago (time_t event);
214     E char *timediff (time_t seconds);
215    
216     #ifndef timersub
217     #define timersub(tvp, uvp, vvp) \
218     do { \
219     (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \
220     (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \
221     if ((vvp)->tv_usec < 0) { \
222     (vvp)->tv_sec--; \
223     (vvp)->tv_usec += 1000000; \
224     } \
225     } while (0)
226     #endif
227    
228     /* tokenize.c */
229 pippijn 1.3 E int sjtoken (char *message, char delimiter, char **parv, int limit = 256);
230 pippijn 1.1 E int tokenize (char *message, char **parv);
231    
232     /* ubase64.c */
233 pippijn 1.4 E char const * const uinttobase64 (char *buf, uint64_t v, int64_t count);
234 pippijn 1.1 E unsigned int base64touint (char *buf);
235    
236     #endif