ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/ermyth/include/tools.h
Revision: 1.7
Committed: Thu Aug 30 19:56:20 2007 UTC (16 years, 9 months ago) by pippijn
Content type: text/plain
Branch: MAIN
Changes since 1.6: +4 -1 lines
Log Message:
- put faultcodes into their own namespace
- removed old files
- limited header garbage in atheme.h
- macros to inline bools for connection_t::is_*
- put some connection_t functions into the connection_t class

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