cvs: php4 /ext/ircg ircg.c

From: Date: Tue, 09 Jan 2001 02:00:29 +0000
Subject: cvs: php4 /ext/ircg ircg.c
Groups: php.cvs 
Request: Send a blank email to php-cvs+get-3499@lists.php.net to get a copy of this message
sas Mon Jan 8 18:00:29 2001 EDT Modified files: /php4/ext/ircg ircg.c Log: Add an irc handler for (non-)fatal error messages and don't free our default strings which are static. Index: php4/ext/ircg/ircg.c diff -u php4/ext/ircg/ircg.c:1.7 php4/ext/ircg/ircg.c:1.8 --- php4/ext/ircg/ircg.c:1.7 Mon Jan 8 16:36:41 2001 +++ php4/ext/ircg/ircg.c Mon Jan 8 18:00:28 2001 @@ -42,6 +42,8 @@ FMT_MSG_JOIN, FMT_MSG_KICK, FMT_MSG_TOPIC, + FMT_MSG_ERROR, + FMT_MSG_FATAL_ERROR, NO_FMTS }; @@ -76,7 +78,9 @@ "%f leaves %c<br />", "%f joins %c<br />", "%t was kicked by %f from %c (%m)<br />", - "%f changes topic on %c to %m<br />" + "%f changes topic on %c to %m<br />", + "Error: %m<br />", + "Fatal Error: %m<br />" }; #define MSG(conn, type) \ @@ -97,7 +101,7 @@ int i; for (i = 0; i < NO_FMTS; i++) { - if ((*conn)->fmt_msgs[i]) free((*conn)->fmt_msgs[i]); + if ((*conn)->fmt_msgs[i] && (*conn)->fmt_msgs[i] != fmt_msgs_default[i]) free((*conn)->fmt_msgs[i]); } irc_disconnect(&(*conn)->conn, "Browser connection closed"); @@ -106,7 +110,9 @@ static void buffer_dtor(void *dummy) { - free(dummy); + smart_str *msg = dummy; + + smart_str_free_ex(msg, 1); } static void quit_handler(irconn_t *c, void *dummy) @@ -268,14 +274,35 @@ sapi_flush(); } -static void msg_send(php_irconn_t *conn, smart_str *msg) +static void msg_replay_buffer(php_irconn_t *conn) +{ + zend_llist_position pos; + void *pmsg; + smart_str *msg; + + pmsg = zend_llist_get_first_ex(&conn->buffer, &pos); + + while (pmsg) { + msg = pmsg; + send(conn->fd, msg->c, msg->len, 0); + pmsg = zend_llist_get_next_ex(&conn->buffer, &pos); + } +} + +static void msg_empty_buffer(php_irconn_t *conn) { - /* XXX: Currently we don't buffer data. This is quite bad, - but leaves the implementation quite easy for now. */ - /* zend_llist_add_element(&conn->buffer, strdup(msg)); */ + zend_llist_clean(&conn->buffer); +} +static void msg_send(php_irconn_t *conn, smart_str *msg) +{ if (conn->fd != -1) { send(conn->fd, msg->c, msg->len, 0); + } else { + smart_str msg2 = {0}; + + smart_str_append_ex(&msg2, msg, 1); + zend_llist_add_element(&conn->buffer, &msg2); } } @@ -297,6 +324,18 @@ smart_str_free_ex(&m, 1); } +static void error_handler(irconn_t *ircc, int id, int fatal, smart_str *msg, void *conn_data) +{ + php_irconn_t *conn = conn_data; + smart_str m = {0}; + + format_msg(MSG(conn, fatal ? FMT_MSG_FATAL_ERROR : FMT_MSG_ERROR), NULL, + conn->username, "IRC SERVER", msg->c, &m); + + msg_send(conn, &m); + smart_str_free_ex(&m, 1); +} + static void user_add(irconn_t *ircc, const char *channel, smart_str *users, int nr, void *dummy) { @@ -373,6 +412,8 @@ conn->fd = thttpd_get_fd(); zend_hash_index_update(&h_fd2irconn, conn->fd, &Z_LVAL_PP(p1), sizeof(int), NULL); msg_http_start(conn); + msg_replay_buffer(conn); + msg_empty_buffer(conn); RETURN_TRUE; } @@ -493,9 +534,9 @@ } irconn_id++; zend_hash_index_update(&h_irconn, irconn_id, &conn, sizeof(conn), NULL); - zend_llist_init(&conn->buffer, 0, buffer_dtor, 1); - irc_connect(username, NULL, msg_handler, quit_handler, conn, server, port, - &conn->conn); + zend_llist_init(&conn->buffer, sizeof(smart_str), buffer_dtor, 1); + irc_connect(username, NULL, msg_handler, quit_handler, error_handler, + conn, server, port, &conn->conn); RETVAL_LONG(irconn_id); }

« previous php.cvs (#3499) next »