#include "server.h"
Go to the source code of this file.
Functions | |
void | channel_init () |
void | channel_reset () |
void | channel_destroy () |
void | channel_free (channel_t *chan) |
channel_t * | channel_probe (const char *chan_name, int create) |
channel_t * | channel_lookup (const char *chan_name) |
channel_t * | channel_add (const char *name) |
int | channel_remove (const char *name) |
channel_mode_arg_t * | channel_get_arg (channel_t *chan, int type) |
channel_mask_list_t * | channel_get_mask_list (channel_t *chan, int type) |
void | channel_add_mask (channel_t *chan, char type, const char *mask, const char *set_by, int time) |
void | channel_del_mask (channel_t *chan, char type, const char *mask) |
int | channel_mode (const char *chan_name, const char *nick, char *buf) |
int | channel_mode_arg (const char *chan_name, int type, const char **value) |
int | channel_set (channel_t *chan, const char *value,...) |
int | channel_get (channel_t *chan, char **strptr,...) |
int | channel_get_int (channel_t *chan, int *intptr,...) |
xml_node_t * | channel_get_node (channel_t *chan,...) |
int | channel_load (const char *fname) |
int | channel_save (const char *fname) |
Variables | |
static const char | rcsid [] = "$Id: channels.c,v 1.40 2008-10-17 15:57:43 sven Exp $" |
channel_t * | channel_head = NULL |
int | nchannels = 0 |
channel_t* channel_add | ( | const char * | name | ) |
Definition at line 103 of file channels.c.
References channel_probe, CHANNEL_STATIC, and channel::flags.
00104 { 00105 channel_t *chan; 00106 00107 chan = channel_probe(name, 1); 00108 chan->flags |= CHANNEL_STATIC; 00109 return(chan); 00110 }
void channel_add_mask | ( | channel_t * | chan, | |
char | type, | |||
const char * | mask, | |||
const char * | set_by, | |||
int | time | |||
) |
Definition at line 164 of file channels.c.
References channel_get_mask_list, channel_mask_list::head, channel_mask::last_used, channel_mask_list::len, channel_mask::mask, channel_mask::next, channel_mask::set_by, and channel_mask::time.
00165 { 00166 channel_mask_list_t *l; 00167 channel_mask_t *m; 00168 00169 l = channel_get_mask_list(chan, type); 00170 00171 if (!l) return; 00172 00173 m = calloc(1, sizeof(*m)); 00174 m->mask = strdup(mask); 00175 m->next = l->head; 00176 if (set_by) m->set_by = strdup(set_by); 00177 m->time = time; 00178 m->last_used = 0; 00179 00180 l->head = m; 00181 l->len++; 00182 }
void channel_del_mask | ( | channel_t * | chan, | |
char | type, | |||
const char * | mask | |||
) |
Definition at line 184 of file channels.c.
References channel_get_mask_list, channel_mask_list::head, channel_mask_list::len, channel_mask::mask, channel_mask::next, NULL, and channel_mask::set_by.
00185 { 00186 channel_mask_list_t *l; 00187 channel_mask_t *m, *prev; 00188 00189 l = channel_get_mask_list(chan, type); 00190 if (!l) return; 00191 00192 prev = NULL; 00193 for (m = l->head; m; m = m->next) { 00194 if (m->mask && !strcasecmp(m->mask, mask)) { 00195 free(m->mask); 00196 if (m->set_by) free(m->set_by); 00197 if (prev) prev->next = m->next; 00198 else l->head = m->next; 00199 l->len--; 00200 free(m); 00201 break; 00202 } 00203 prev = m; 00204 } 00205 }
void channel_destroy | ( | ) |
Definition at line 48 of file channels.c.
References channel_reset, channel_save, and server_config.
00049 { 00050 channel_reset(); 00051 channel_save(server_config.chanfile); 00052 }
void channel_free | ( | channel_t * | chan | ) |
Definition at line 54 of file channels.c.
References channel_free_online, channel::name, nchannels, channel::next, channel::prev, channel::settings, and xml_node_delete().
00055 { 00056 /* Free online things. */ 00057 channel_free_online(chan); 00058 00059 /* Delete settings. */ 00060 if (chan->name) free(chan->name); 00061 if (chan->settings) xml_node_delete(chan->settings); 00062 00063 /* Unlink. */ 00064 if (chan->prev) chan->prev->next = chan->next; 00065 else channel_head = chan->next; 00066 if (chan->next) chan->next->prev = chan->prev; 00067 nchannels--; 00068 }
int channel_get | ( | channel_t * | chan, | |
char ** | strptr, | |||
... | ||||
) |
Definition at line 264 of file channels.c.
References NULL, channel::settings, xml_node_get_str(), and xml_node_vlookup().
00265 { 00266 va_list args; 00267 xml_node_t *node; 00268 00269 va_start(args, strptr); 00270 node = xml_node_vlookup(chan->settings, args, 0); 00271 va_end(args); 00272 return xml_node_get_str(strptr, node, NULL); 00273 }
channel_mode_arg_t* channel_get_arg | ( | channel_t * | chan, | |
int | type | |||
) |
Definition at line 123 of file channels.c.
References channel::args, current_server, channel::nargs, NULL, and channel_mode_arg::type.
00124 { 00125 int i; 00126 char *c; 00127 channel_mode_arg_t *arg; 00128 00129 if (!chan->args && (current_server.type2modes || current_server.type3modes)) { 00130 chan->nargs = strlen(current_server.type2modes) + strlen(current_server.type3modes); 00131 chan->args = calloc(chan->nargs, sizeof(*chan->args)); 00132 for (arg = chan->args, c = current_server.type2modes; *c; arg++, c++) { 00133 arg->type = *c; 00134 } 00135 for (c = current_server.type3modes; *c; arg++, c++) { 00136 arg->type = *c; 00137 } 00138 } 00139 for (i = 0; i < chan->nargs; i++) { 00140 if (chan->args[i].type == type) return chan->args+i; 00141 } 00142 return(NULL); 00143 }
int channel_get_int | ( | channel_t * | chan, | |
int * | intptr, | |||
... | ||||
) |
Definition at line 275 of file channels.c.
References NULL, channel::settings, xml_node_get_int(), and xml_node_vlookup().
00276 { 00277 va_list args; 00278 xml_node_t *node; 00279 00280 va_start(args, intptr); 00281 node = xml_node_vlookup(chan->settings, args, 0); 00282 va_end(args); 00283 return xml_node_get_int(intptr, node, NULL); 00284 }
channel_mask_list_t* channel_get_mask_list | ( | channel_t * | chan, | |
int | type | |||
) |
Definition at line 145 of file channels.c.
References current_server, channel::lists, channel::nlists, NULL, and channel_mask_list::type.
00146 { 00147 int i; 00148 00149 if (!chan->lists && current_server.type1modes) { 00150 chan->nlists = strlen(current_server.type1modes); 00151 chan->lists = calloc(chan->nlists, sizeof(*chan->lists)); 00152 for (i = 0; i < chan->nlists; i++) { 00153 chan->lists[i] = calloc(1, sizeof(*chan->lists[i])); 00154 chan->lists[i]->type = current_server.type1modes[i]; 00155 } 00156 } 00157 00158 for (i = 0; i < chan->nlists; i++) { 00159 if (chan->lists[i]->type == type) return(chan->lists[i]); 00160 } 00161 return(NULL); 00162 }
xml_node_t* channel_get_node | ( | channel_t * | chan, | |
... | ||||
) |
Definition at line 286 of file channels.c.
References channel::settings, and xml_node_vlookup().
00287 { 00288 va_list args; 00289 xml_node_t *node; 00290 00291 va_start(args, chan); 00292 node = xml_node_vlookup(chan->settings, args, 0); 00293 va_end(args); 00294 return(node); 00295 }
void channel_init | ( | ) |
Definition at line 29 of file channels.c.
References channel_load, nchannels, NULL, and server_config.
00030 { 00031 channel_head = NULL; 00032 nchannels = 0; 00033 channel_load(server_config.chanfile); 00034 }
int channel_load | ( | const char * | fname | ) |
Definition at line 297 of file channels.c.
References channel_probe, channel::flags, LOG_MISC, xml_node::next_sibling, putlog(), channel::settings, xml_last_error(), xml_node_delete(), xml_node_get_vars(), xml_node_lookup(), xml_node_unlink(), and xml_parse_file().
00298 { 00299 xml_node_t *root = xml_parse_file(fname); 00300 xml_node_t *chan_node, *settings; 00301 channel_t *chan; 00302 char *name; 00303 int flags; 00304 00305 if (!root) { 00306 putlog(LOG_MISC, "*", "Could not load channel file '%s': %s", fname, xml_last_error()); 00307 return(-1); 00308 } 00309 00310 chan_node = xml_node_lookup(root, 0, "channel", 0, 0); 00311 for (; chan_node; chan_node = chan_node->next_sibling) { 00312 xml_node_get_vars(chan_node, "sin", "name", &name, "flags", &flags, "settings", &settings); 00313 if (!name) continue; 00314 chan = channel_probe(name, 1); 00315 if (settings) { 00316 xml_node_unlink(settings); 00317 xml_node_delete(chan->settings); 00318 chan->settings = settings; 00319 } 00320 chan->flags = flags; 00321 } 00322 return(0); 00323 }
channel_t* channel_lookup | ( | const char * | chan_name | ) |
Definition at line 97 of file channels.c.
References channel_probe.
00098 { 00099 return channel_probe(chan_name, 0); 00100 }
int channel_mode | ( | const char * | chan_name, | |
const char * | nick, | |||
char * | buf | |||
) |
Definition at line 207 of file channels.c.
References channel_probe, current_server, flag_to_str(), channel::member_head, channel_member::mode, channel::mode, channel_member::next, channel_member::nick, and NULL.
00208 { 00209 channel_t *chan; 00210 channel_member_t *m; 00211 flags_t *flags = NULL; 00212 00213 buf[0] = 0; 00214 chan = channel_probe(chan_name, 0); 00215 if (!chan) return(-1); 00216 if (!nick) flags = &chan->mode; 00217 else { 00218 for (m = chan->member_head; m; m = m->next) { 00219 if (!(current_server.strcmp)(nick, m->nick)) { 00220 flags = &m->mode; 00221 break; 00222 } 00223 } 00224 if (!flags) return(-2); 00225 } 00226 flag_to_str(flags, buf); 00227 return(0); 00228 }
int channel_mode_arg | ( | const char * | chan_name, | |
int | type, | |||
const char ** | value | |||
) |
Definition at line 230 of file channels.c.
References channel::args, channel_probe, channel::nargs, channel_mode_arg::type, and channel_mode_arg::value.
00231 { 00232 int i; 00233 channel_t *chan; 00234 00235 chan = channel_probe(chan_name, 0); 00236 if (!chan) return(-1); 00237 for (i = 0; i < chan->nargs; i++) { 00238 if (chan->args[i].type == type) { 00239 *value = chan->args[i].value; 00240 return(0); 00241 } 00242 } 00243 return(-2); 00244 }
channel_t* channel_probe | ( | const char * | chan_name, | |
int | create | |||
) |
Definition at line 71 of file channels.c.
References xml_node::name, channel::name, nchannels, channel::next, NULL, channel::prev, channel::settings, and xml_node_new().
00072 { 00073 channel_t *chan, *prev; 00074 00075 prev = NULL; 00076 for (chan = channel_head; chan; chan = chan->next) { 00077 if (!strcasecmp(chan->name, chan_name)) return(chan); 00078 prev = chan; 00079 } 00080 if (!create) return(NULL); 00081 00082 /* Create a new channel. */ 00083 nchannels++; 00084 chan = calloc(1, sizeof(*chan)); 00085 chan->name = strdup(chan_name); 00086 chan->settings = xml_node_new(); 00087 chan->settings->name = strdup("settings"); 00088 00089 /* Link to list. */ 00090 if (prev) prev->next = chan; 00091 else channel_head = chan; 00092 chan->prev = prev; 00093 return(chan); 00094 }
int channel_remove | ( | const char * | name | ) |
Definition at line 113 of file channels.c.
References channel_probe, CHANNEL_STATIC, and channel::flags.
00114 { 00115 channel_t *chan; 00116 00117 chan = channel_probe(name, 0); 00118 if (!chan) return(-1); 00119 chan->flags &= ~CHANNEL_STATIC; 00120 return(0); 00121 }
void channel_reset | ( | ) |
Definition at line 37 of file channels.c.
References channel_free_online, channel::next, and uhost_cache_reset.
00038 { 00039 channel_t *chan; 00040 00041 /* Clear out channel list. */ 00042 for (chan = channel_head; chan; chan = chan->next) { 00043 channel_free_online(chan); 00044 } 00045 uhost_cache_reset(); 00046 }
int channel_save | ( | const char * | fname | ) |
Definition at line 325 of file channels.c.
References CHANNEL_STATIC, channel::flags, channel::name, xml_node::name, channel::next, channel::settings, XML_INDENT, xml_node_append(), xml_node_delete(), xml_node_new(), xml_node_set_int(), xml_node_set_str(), xml_node_unlink(), and xml_save_file().
00326 { 00327 xml_node_t *root = xml_node_new(); 00328 xml_node_t *chan_node; 00329 channel_t *chan; 00330 00331 if (!fname) fname = "channels.xml"; 00332 root->name = strdup("channels"); 00333 for (chan = channel_head; chan; chan = chan->next) { 00334 if (!(chan->flags & CHANNEL_STATIC)) continue; 00335 00336 chan_node = xml_node_new(); 00337 chan_node->name = strdup("channel"); 00338 xml_node_set_str(chan->name, chan_node, "name", 0, 0); 00339 xml_node_set_int(chan->flags, chan_node, "flags", 0, 0); 00340 xml_node_append(chan_node, chan->settings); 00341 xml_node_append(root, chan_node); 00342 } 00343 xml_save_file(fname, root, XML_INDENT); 00344 for (chan = channel_head; chan; chan = chan->next) { 00345 if (chan->settings) xml_node_unlink(chan->settings); 00346 } 00347 xml_node_delete(root); 00348 return(0); 00349 }
int channel_set | ( | channel_t * | chan, | |
const char * | value, | |||
... | ||||
) |
Definition at line 246 of file channels.c.
References bind_check(), BIND_RET_BREAK, BT_chanset, channel::name, NULL, channel::settings, xml_node_fullname(), xml_node_get_str(), xml_node_set_str(), and xml_node_vlookup().
00247 { 00248 va_list args; 00249 xml_node_t *node; 00250 char *setting, *oldvalue; 00251 int r; 00252 00253 va_start(args, value); 00254 node = xml_node_vlookup(chan->settings, args, 1); 00255 va_end(args); 00256 setting = xml_node_fullname(node); 00257 xml_node_get_str(&oldvalue, node, NULL); 00258 r = bind_check(BT_chanset, NULL, setting, chan->name, setting, oldvalue, value); 00259 free(setting); 00260 if (!(r & BIND_RET_BREAK)) xml_node_set_str(value, node, NULL); 00261 return(0); 00262 }
channel_t* channel_head = NULL |
Definition at line 26 of file channels.c.
int nchannels = 0 |
Definition at line 27 of file channels.c.
const char rcsid[] = "$Id: channels.c,v 1.40 2008-10-17 15:57:43 sven Exp $" [static] |
Definition at line 21 of file channels.c.