add backlog option to channels.

This commit is contained in:
Loc Gomez 2007-09-27 01:08:10 +02:00
parent 45e9688c45
commit 2090349f9c
9 changed files with 72 additions and 7 deletions

View File

@ -5,6 +5,8 @@
debug info... debug info...
* src/bip: add ssl_check_mode option to the connection block (requested * src/bip: add ssl_check_mode option to the connection block (requested
by Trou) + die if ssl_check_mode is unset while the network is SSL. by Trou) + die if ssl_check_mode is unset while the network is SSL.
* src: add backlog option to channels, allowing to disable backlog on
a per channel basis
2007-09-25 Loïc Gomez <opensource@kyoshiro.org> 2007-09-25 Loïc Gomez <opensource@kyoshiro.org>

View File

@ -315,6 +315,11 @@ The channel name (#bip, &bip, ...).
\fBkey\fP \fBkey\fP
The channel key if needed. The channel key if needed.
.TP
\fBbacklog\fP (default: \fBtrue\fP)
Enable or disable backlogging of this particular channel.
Setting this to true will NOT enable the backlog system, see the User section.
.SH SEE ALSO .SH SEE ALSO
bip, bipmkpw bip, bipmkpw

View File

@ -136,6 +136,10 @@ user {
name = "iiens"; # used by bip only name = "iiens"; # used by bip only
network = "iiens"; # which ircnet to connect to network = "iiens"; # which ircnet to connect to
# You can precise ssl_check_mode here, if you want a different
# behavior than the one defined in the parent user {}.
#ssl_check_mode = "none";
# If you have multiple IP addresses, you can set the one you # If you have multiple IP addresses, you can set the one you
# want bip to use here. See manpage for more information. # want bip to use here. See manpage for more information.
@ -166,6 +170,11 @@ user {
name = "#elite_UnDeRgR0uNd"; name = "#elite_UnDeRgR0uNd";
key = "sikiour"; key = "sikiour";
}; };
channel {
name = "#huge(28)_activity";
# disable backlogging of this channel.
backlog = false;
};
}; };
# another connection (optionnal) # another connection (optionnal)

View File

@ -69,12 +69,12 @@ syn keyword bipNKeyword contained nextgroup=bipBoolV ssl
" User block (level 1) " User block (level 1)
syn region bipUser contained matchgroup=Macro start=/user\s*{\s*/ syn region bipUser contained matchgroup=Macro start=/user\s*{\s*/
\ end=/};/ \ end=/};/
\ contains=bipUKeyword,bipUBool,bipConnection,bipComment,bipEndError,bipWhite \ contains=bipUKeyword,bipConnection,bipComment,bipEndError,bipWhite
syn keyword bipUKeyword contained nextgroup=bipStringV password name syn keyword bipUKeyword contained nextgroup=bipStringV password name
\ default_nick default_user default_realname ssl_check_store \ default_nick default_user default_realname ssl_check_store
\ ssl_check_mode \ ssl_check_mode
syn keyword bipUKeyword contained nextgroup=bipNumericV backlog_lines syn keyword bipUKeyword contained nextgroup=bipNumericV backlog_lines
syn keyword bipUBool contained nextgroup=bipBoolV admin syn keyword bipUKeyword contained nextgroup=bipBoolV admin
\ no_backlog always_backlog bl_msg_only blreset_on_talk \ no_backlog always_backlog bl_msg_only blreset_on_talk
\ backlog_no_timestamp backlog log_system backlog_reset_on_talk \ backlog_no_timestamp backlog log_system backlog_reset_on_talk
\ backlog_msg_only backlog_always \ backlog_msg_only backlog_always
@ -96,6 +96,7 @@ syn region bipChannel contained matchgroup=Macro
\ start=/channel\s*{\s*/ end=/};/ \ start=/channel\s*{\s*/ end=/};/
\ contains=bipCKeyword,bipComment,bipEndError,bipWhite \ contains=bipCKeyword,bipComment,bipEndError,bipWhite
syn keyword bipCKeyword contained nextgroup=bipStringV name key syn keyword bipCKeyword contained nextgroup=bipStringV name key
syn keyword bipCKeyword contained nextgroup=bipBoolV backlog
" Server elements (lvl 2) " Server elements (lvl 2)
syn region bipServer contained matchgroup=Macro syn region bipServer contained matchgroup=Macro

View File

@ -357,7 +357,7 @@ static int add_network(bip_t *bip, list_t *data)
static int add_connection(bip_t *bip, struct user *user, list_t *data) static int add_connection(bip_t *bip, struct user *user, list_t *data)
{ {
struct tuple *t; struct tuple *t, *t2;
struct link *l; struct link *l;
struct chan_info *ci; struct chan_info *ci;
char *name = get_tuple_value(data, LEX_NAME); char *name = get_tuple_value(data, LEX_NAME);
@ -373,7 +373,11 @@ static int add_connection(bip_t *bip, struct user *user, list_t *data)
list_add_last(&bip->link_list, l); list_add_last(&bip->link_list, l);
l->user = user; l->user = user;
l->log = log_new(user, name); l->log = log_new(user, name);
#ifdef HAVE_LIBSSL
l->ssl_check_mode = user->ssl_check_mode; l->ssl_check_mode = user->ssl_check_mode;
l->ssl_check_store = user->ssl_check_store;
l->untrusted_certs = sk_X509_new_null();
#endif
} else { } else {
#warning "CODEME (user switch..)" #warning "CODEME (user switch..)"
l->network = NULL; l->network = NULL;
@ -412,9 +416,22 @@ static int add_connection(bip_t *bip, struct user *user, list_t *data)
break; break;
case LEX_CHANNEL: case LEX_CHANNEL:
ci = calloc(sizeof(struct chan_info), 1); ci = calloc(sizeof(struct chan_info), 1);
ci->backlog = 1;
ci->name = get_tuple_value(t->pdata, LEX_NAME); while ((t2 = list_remove_first(t->pdata))) {
ci->key = get_tuple_value(t->pdata, LEX_KEY); switch (t2->type) {
case LEX_NAME:
MOVE_STRING(ci->name, t2->pdata);
break;
case LEX_KEY:
MOVE_STRING(ci->key, t2->pdata);
break;
case LEX_BACKLOG:
ci->backlog = t2->ndata;
break;
}
}
list_free(t->pdata);
hash_insert(&l->chan_infos, ci->name, ci); hash_insert(&l->chan_infos, ci->name, ci);
list_add_last(&l->chan_infos_order, ci); list_add_last(&l->chan_infos_order, ci);
@ -589,9 +606,10 @@ static int add_user(bip_t *bip, list_t *data)
static int validate_config(bip_t *bip) static int validate_config(bip_t *bip)
{ {
/* nick username realname or default_{nick,username,realname} in user */ /* nick username realname or default_{nick,username,realname} in user */
hash_iterator_t it, sit; hash_iterator_t it, sit, cit;
struct user *user; struct user *user;
struct link *link; struct link *link;
struct chan_info *ci;
int r = 1; int r = 1;
for (hash_it_init(&bip->users, &it); (user = hash_it_item(&it)); for (hash_it_init(&bip->users, &it); (user = hash_it_item(&it));
@ -618,6 +636,16 @@ static int validate_config(bip_t *bip)
//conf_die("user: ... net: ... can i has nick/user/rael"); //conf_die("user: ... net: ... can i has nick/user/rael");
r = 0; r = 0;
for (hash_it_init(&link->chan_infos, &cit);
(ci = hash_it_item(&cit));
hash_it_next(&cit)) {
if (!ci->name)
conf_die("user %s, connection "
"%s: channel must have"
"a name.", user->name,
link->name);
}
} }
} }

View File

@ -205,6 +205,7 @@ channel:
cha_command: cha_command:
LEX_NAME LEX_EQ LEX_STRING { $$ = tuple_s_new(LEX_NAME, $3); } LEX_NAME LEX_EQ LEX_STRING { $$ = tuple_s_new(LEX_NAME, $3); }
| LEX_KEY LEX_EQ LEX_STRING { $$ = tuple_s_new(LEX_KEY, $3); } | LEX_KEY LEX_EQ LEX_STRING { $$ = tuple_s_new(LEX_KEY, $3); }
| LEX_BACKLOG LEX_EQ LEX_BOOL { $$ = tuple_i_new(LEX_BACKLOG, $3); }
server: server:
{ $$ = list_new(NULL); } { $$ = list_new(NULL); }

View File

@ -2274,7 +2274,8 @@ void bip_tick(bip_t *bip)
struct link_client *ic = list_it_item(&li); struct link_client *ic = list_it_item(&li);
ic->logging_timer++; ic->logging_timer++;
if (ic->logging_timer > LOGGING_TIMEOUT) { if (ic->logging_timer > LOGGING_TIMEOUT) {
list_remove(&bip->conn_list, CONN(ic)); if (CONN(ic))
list_remove(&bip->conn_list, CONN(ic));
irc_close((struct link_any *)ic); irc_close((struct link_any *)ic);
list_it_remove(&li); list_it_remove(&li);
} }

View File

@ -206,6 +206,7 @@ struct log;
struct chan_info { struct chan_info {
char *name; char *name;
char *key; char *key;
int backlog;
}; };
#define chan_info_new() calloc(sizeof(struct chan_info), 1) #define chan_info_new() calloc(sizeof(struct chan_info), 1)

View File

@ -718,6 +718,8 @@ char *log_beautify(log_t *logdata, char *buf, char *dest)
char *ret; char *ret;
int out; int out;
int done; int done;
struct link *l;
struct chan_info *ci;
if (!buf) if (!buf)
fatal("BUG log_beautify not called correctly!"); fatal("BUG log_beautify not called correctly!");
@ -732,6 +734,21 @@ char *log_beautify(log_t *logdata, char *buf, char *dest)
return _log_wrap(dest, buf); return _log_wrap(dest, buf);
lots = p - sots; lots = p - sots;
p++; p++;
if (!logdata->user)
fatal("log_beautify: no user associated to logdata");
if (!logdata->network)
fatal("log_beautify: no network id associated to logdata");
l = hash_get(&logdata->user->connections, logdata->network);
if (!l)
fatal("log_beautify: no connection associated to logdata");
ci = hash_get(&l->chan_infos, dest);
if (ci && !ci->backlog) {
mylog(LOG_DEBUG, "Skipping unwanted channel %s for backlog",
dest);
return NULL;
}
if (strncmp(p, "-!-", 3) == 0) { if (strncmp(p, "-!-", 3) == 0) {
if (logdata->user->bl_msg_only) if (logdata->user->bl_msg_only)
return NULL; return NULL;