cvs: php4 /ext/ircg ircg.c

From: Date: Sat, 17 Feb 2001 17:31:36 +0000
Subject: cvs: php4 /ext/ircg ircg.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-4071@lists.php.net to get a copy of this message
sas Sat Feb 17 09:31:36 2001 EDT Modified files: /php4/ext/ircg ircg.c Log: Add initial CTCP handling and fix a possible segfault in ircg_msg() Index: php4/ext/ircg/ircg.c diff -u php4/ext/ircg/ircg.c:1.25 php4/ext/ircg/ircg.c:1.26 --- php4/ext/ircg/ircg.c:1.25 Sat Feb 17 00:30:10 2001 +++ php4/ext/ircg/ircg.c Sat Feb 17 09:31:36 2001 @@ -16,7 +16,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: ircg.c,v 1.25 2001/02/17 08:30:10 sas Exp $ */ +/* $Id: ircg.c,v 1.26 2001/02/17 17:31:36 sas Exp $ */ #include "php.h" #include "php_ini.h" @@ -84,6 +84,7 @@ int irconn_id; php_fmt_msgs_t *fmt_msgs; irc_write_buf wb; + HashTable ctcp_msgs; } php_irconn_t; static char *fmt_msgs_default[] = { @@ -157,6 +158,7 @@ conn->fd = -2; zend_hash_index_del(&h_irconn, conn->irconn_id); + zend_hash_destroy(&conn->ctcp_msgs); zend_llist_destroy(&conn->buffer); free(conn); } @@ -271,14 +273,48 @@ zend_llist_apply_with_argument(&conn->buffer, msg_send_apply, conn); } + +static void handle_ctcp(php_irconn_t *conn, const char *chan, const char *from, + smart_str *msg, smart_str *result) +{ + char *token_end; + char *real_msg; + char *real_msg_end; + + for (token_end = msg->c + 1; *token_end; token_end++) + if (!isalpha(*token_end)) break; + + if (*token_end != '\001') { + real_msg = token_end + 1; + + real_msg_end = strchr(real_msg, '\001'); + if (real_msg_end) { + char *fmt_msg; + + *real_msg_end = '\0'; + *token_end = '\0'; + + if (zend_hash_find(&conn->ctcp_msgs, msg->c + 1, token_end - msg->c - 1, (void **) &fmt_msg) != SUCCESS) { + return; + } + + format_msg(fmt_msg, chan, conn->conn.username, from, real_msg, + result); + } + } +} + + static void msg_handler(irconn_t *ircc, const char *chan, const char *from, smart_str *msg, void *conn_data, void *chan_data) { php_irconn_t *conn = conn_data; static smart_str m; - m.len = 0; - if (chan) { + m.len = 0; + if (msg->c[0] == '\001') { + handle_ctcp(conn, chan, from, msg, &m); + } else if (chan) { format_msg(MSG(conn, FMT_MSG_CHAN), chan, ircc->username, from, msg->c, &m); } else { @@ -540,20 +576,43 @@ irc_register_hook(conn, IRCG_TOPIC, new_topic); } +static int ircg_copy_ctcp_msgs(zval **array, php_irconn_t *conn) +{ + zval **val; + char *str; + ulong num; + + zend_hash_internal_pointer_reset(Z_ARRVAL_PP(array)); + + while (zend_hash_get_current_key(Z_ARRVAL_PP(array), &str, &num, 0) == HASH_KEY_IS_STRING) { + zend_hash_get_current_data(Z_ARRVAL_PP(array), (void **) &val); + convert_to_string_ex(val); + zend_hash_add(&conn->ctcp_msgs, str, strlen(str), Z_STRVAL_PP(val), + Z_STRLEN_PP(val) + 1, NULL); + + zend_hash_move_forward(Z_ARRVAL_PP(array)); + } + + return 0; +} + PHP_FUNCTION(ircg_pconnect) { - zval **p1, **p2, **p3, **p4 = NULL; + zval **p1, **p2, **p3, **p4 = NULL, **p5 = NULL; const char *username; const char *server = "0"; int port = 6667; php_fmt_msgs_t *fmt_msgs = NULL; php_irconn_t *conn; - if (ZEND_NUM_ARGS() < 1 || ZEND_NUM_ARGS() > 4 - || zend_get_parameters_ex(ZEND_NUM_ARGS(), &p1, &p2, &p3, &p4) == FAILURE) + if (ZEND_NUM_ARGS() < 1 || ZEND_NUM_ARGS() > 5 + || zend_get_parameters_ex(ZEND_NUM_ARGS(), &p1, &p2, &p3, &p4, &p5) == FAILURE) WRONG_PARAM_COUNT; switch (ZEND_NUM_ARGS()) { + case 5: + if (Z_TYPE_PP(p5) != IS_ARRAY) + WRONG_PARAM_COUNT; case 4: convert_to_string_ex(p4); fmt_msgs = lookup_fmt_msgs(p4); @@ -575,11 +634,15 @@ conn = malloc(sizeof(*conn)); conn->fd = -1; + zend_hash_init(&conn->ctcp_msgs, 10, NULL, NULL, 1); if (irc_connect(username, register_hooks, conn, server, port, &conn->conn)) { free(conn); RETURN_FALSE; } + if (p5) { + ircg_copy_ctcp_msgs(p5, conn); + } conn->fmt_msgs = fmt_msgs; irconn_id++; conn->irconn_id = irconn_id; @@ -646,7 +709,6 @@ irc_msg(&conn->conn, Z_STRVAL_PP(recipient), Z_STRVAL_PP(msg)); smart_str_setl(&l, Z_STRVAL_PP(msg), Z_STRLEN_PP(msg)); - smart_str_0(&l); switch (Z_STRVAL_PP(recipient)[0]) { case '#':

« previous php.cvs (#4071) next »