cvs: php4 /ext/ircg ircg.c
| From: | Sascha Schumann | 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);
}