trigger mirror
[m6w6/ext-ircclient] / php_ircclient.c
1 /*
2 +--------------------------------------------------------------------+
3 | PECL :: ircclient |
4 +--------------------------------------------------------------------+
5 | Redistribution and use in source and binary forms, with or without |
6 | modification, are permitted provided that the conditions mentioned |
7 | in the accompanying LICENSE file are met. |
8 +--------------------------------------------------------------------+
9 | Copyright (c) 2011, Michael Wallner <mike@php.net> |
10 +--------------------------------------------------------------------+
11 */
12
13 #ifdef HAVE_CONFIG_H
14 #include "config.h"
15 #endif
16
17 #include <main/php.h>
18 #include <main/php_ini.h>
19 #include <main/php_network.h>
20 #include <ext/standard/php_string.h>
21 #include <ext/standard/info.h>
22 #include <ext/standard/basic_functions.h>
23
24 #include <Zend/zend.h>
25 #include <Zend/zend_constants.h>
26 #include <Zend/zend_interfaces.h>
27
28 #ifdef ZTS
29 #include <TSRM/TSRM.h>
30 #endif
31
32 #include "php_ircclient.h"
33
34 #include <errno.h>
35 #include <ctype.h>
36 #include <libircclient.h>
37
38 PHP_FUNCTION(parse_origin)
39 {
40 char *origin_str;
41 int origin_len;
42
43 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &origin_str, &origin_len)) {
44 zval *znick, *zuser, *zhost;
45 size_t siz = 0;
46 char *ptr;
47
48 MAKE_STD_ZVAL(znick); ZVAL_NULL(znick);
49 MAKE_STD_ZVAL(zuser); ZVAL_NULL(zuser);
50 MAKE_STD_ZVAL(zhost); ZVAL_NULL(zhost);
51
52 for (ptr = origin_str; *ptr; ptr += siz + 1) {
53 if ((siz = strcspn(ptr, "!@"))) {
54 switch (ptr[siz]) {
55 case '!':
56 ZVAL_STRINGL(znick, ptr, siz, 1);
57 break;
58 case '@':
59 ZVAL_STRINGL(zuser, ptr, siz, 1);
60 break;
61 case '\0':
62 ZVAL_STRINGL(zhost, ptr, siz, 1);
63 goto done;
64 break;
65 default:
66 break;
67 }
68 }
69 }
70 done:
71 array_init(return_value);
72 add_assoc_zval_ex(return_value, ZEND_STRS("nick"), znick);
73 add_assoc_zval_ex(return_value, ZEND_STRS("user"), zuser);
74 add_assoc_zval_ex(return_value, ZEND_STRS("host"), zhost);
75 }
76 }
77
78
79 const zend_function_entry php_ircclient_function_entry[] = {
80 ZEND_NS_FENTRY("irc\\client", parse_origin, ZEND_FN(parse_origin), NULL, 0)
81 {0}
82 };
83
84 PHP_MINIT_FUNCTION(ircclient);
85 PHP_MINFO_FUNCTION(ircclient);
86
87 zend_module_entry ircclient_module_entry = {
88 STANDARD_MODULE_HEADER,
89 "ircclient",
90 php_ircclient_function_entry,
91 PHP_MINIT(ircclient),
92 NULL,
93 NULL,
94 NULL,
95 PHP_MINFO(ircclient),
96 PHP_IRCCLIENT_VERSION,
97 STANDARD_MODULE_PROPERTIES
98 };
99
100
101 #ifdef COMPILE_DL_IRCCLIENT
102 ZEND_GET_MODULE(ircclient)
103 #endif
104
105 static void php_ircclient_event_callback(irc_session_t *session, const char *event, const char *origin, const char **params, unsigned int count);
106 static void php_ircclient_event_code_callback(irc_session_t *session, unsigned int event, const char *origin, const char **params, unsigned int count);
107 static void php_ircclient_event_dcc_chat_callback(irc_session_t *session, const char *nick, const char *addr, irc_dcc_t dccid);
108 static void php_ircclient_event_dcc_send_callback(irc_session_t *session, const char *nick, const char *addr, const char *filename, unsigned long size, irc_dcc_t dccid);
109
110 static irc_callbacks_t php_ircclient_callbacks = {
111 .event_connect = php_ircclient_event_callback,
112 .event_nick = php_ircclient_event_callback,
113 .event_quit = php_ircclient_event_callback,
114 .event_join = php_ircclient_event_callback,
115 .event_part = php_ircclient_event_callback,
116 .event_mode = php_ircclient_event_callback,
117 .event_umode = php_ircclient_event_callback,
118 .event_topic = php_ircclient_event_callback,
119 .event_kick = php_ircclient_event_callback,
120 .event_channel = php_ircclient_event_callback,
121 .event_privmsg = php_ircclient_event_callback,
122 .event_notice = php_ircclient_event_callback,
123 #if PHP_IRCCLIENT_HAVE_EVENT_CHANNEL_NOTICE
124 .event_channel_notice = php_ircclient_event_callback,
125 #endif
126 .event_invite = php_ircclient_event_callback,
127 .event_ctcp_req = php_ircclient_event_callback,
128 .event_ctcp_rep = php_ircclient_event_callback,
129 .event_ctcp_action = php_ircclient_event_callback,
130 .event_unknown = php_ircclient_event_callback,
131 .event_numeric = php_ircclient_event_code_callback,
132 .event_dcc_chat_req = php_ircclient_event_dcc_chat_callback,
133 .event_dcc_send_req = php_ircclient_event_dcc_send_callback
134 };
135
136 typedef struct php_ircclient_session_callback {
137 zval *zfn;
138 zend_fcall_info fci;
139 zend_fcall_info_cache fcc;
140 } php_ircclient_session_callback_t;
141
142 typedef struct php_ircclient_session_object {
143 zend_object zo;
144 zend_object_value ov;
145 irc_session_t *sess;
146 unsigned opts;
147 HashTable cbc;
148 #ifdef ZTS
149 void ***ts;
150 #endif
151 } php_ircclient_session_object_t;
152
153 zend_class_entry *php_ircclient_session_class_entry;
154
155 void php_ircclient_session_object_free(void *object TSRMLS_DC)
156 {
157 php_ircclient_session_object_t *o = (php_ircclient_session_object_t *) object;
158
159 if (o->sess) {
160 irc_destroy_session(o->sess);
161 o->sess = NULL;
162 }
163 zend_hash_destroy(&o->cbc);
164 zend_object_std_dtor((zend_object *) o TSRMLS_CC);
165 efree(o);
166 }
167
168 static void php_ircclient_session_callback_dtor(void *ptr)
169 {
170 php_ircclient_session_callback_t *cb = (php_ircclient_session_callback_t *) ptr;
171
172 zend_fcall_info_args_clear(&cb->fci, 1);
173 zval_ptr_dtor(&cb->zfn);
174 }
175
176 zend_object_value php_ircclient_session_object_create(zend_class_entry *ce TSRMLS_DC)
177 {
178 php_ircclient_session_object_t *obj;
179
180 obj = ecalloc(1, sizeof(*obj));
181 #if PHP_VERSION_ID >= 50399
182 zend_object_std_init((zend_object *) obj, ce TSRMLS_CC);
183 object_properties_init((zend_object *) obj, ce);
184 #else
185 obj->zo.ce = ce;
186 ALLOC_HASHTABLE(obj->zo.properties);
187 zend_hash_init(obj->zo.properties, zend_hash_num_elements(&ce->default_properties), NULL, ZVAL_PTR_DTOR, 0);
188 zend_hash_copy(obj->zo.properties, &ce->default_properties, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
189 #endif
190
191 obj->sess = irc_create_session(&php_ircclient_callbacks);
192 irc_set_ctx(obj->sess, obj);
193 zend_hash_init(&obj->cbc, 10, NULL, php_ircclient_session_callback_dtor, 0);
194 TSRMLS_SET_CTX(obj->ts);
195
196 obj->ov.handle = zend_objects_store_put(obj, NULL, php_ircclient_session_object_free, NULL TSRMLS_CC);
197 obj->ov.handlers = zend_get_std_object_handlers();
198
199 return obj->ov;
200 }
201
202 static php_ircclient_session_callback_t *php_ircclient_session_get_callback(php_ircclient_session_object_t *obj, const char *fn_str, size_t fn_len)
203 {
204 zval *zo, *zm;
205 php_ircclient_session_callback_t cb, *cbp = NULL;
206 TSRMLS_FETCH_FROM_CTX(obj->ts);
207
208 if (SUCCESS == zend_hash_find(&obj->cbc, fn_str, fn_len + 1, (void *) &cbp)) {
209 return cbp;
210 }
211
212 MAKE_STD_ZVAL(zo);
213 Z_TYPE_P(zo) = IS_OBJECT;
214 zo->value.obj = obj->ov;
215 zend_objects_store_add_ref(zo TSRMLS_CC);
216
217 MAKE_STD_ZVAL(zm);
218 ZVAL_STRINGL(zm, estrndup(fn_str, fn_len), fn_len, 0);
219
220 MAKE_STD_ZVAL(cb.zfn);
221 array_init_size(cb.zfn, 2);
222 add_next_index_zval(cb.zfn, zo);
223 add_next_index_zval(cb.zfn, zm);
224
225 if (SUCCESS != zend_fcall_info_init(cb.zfn, IS_CALLABLE_STRICT, &cb.fci, &cb.fcc, NULL, NULL TSRMLS_CC)) {
226 zval_ptr_dtor(&cb.zfn);
227 return NULL;
228 }
229
230 if (SUCCESS != zend_hash_add(&obj->cbc, fn_str, fn_len + 1, &cb, sizeof(cb), (void *) &cbp)) {
231 zval_ptr_dtor(&cb.zfn);
232 return NULL;
233 }
234
235 return cbp;
236 }
237
238 static void php_ircclient_event_callback(irc_session_t *session, const char *event, const char *origin, const char **params, unsigned int count)
239 {
240 char *fn_str;
241 int fn_len;
242 php_ircclient_session_callback_t *cb;
243 php_ircclient_session_object_t *obj = irc_get_ctx(session);
244 TSRMLS_FETCH_FROM_CTX(obj->ts);
245
246 fn_str = emalloc(strlen(event) + 2 + 1);
247 fn_str[0] = 'o';
248 fn_str[1] = 'n';
249 fn_len = 2;
250 do {
251 if (*event != '_') {
252 fn_str[fn_len++] = tolower(*event);
253 }
254 } while (*event++);
255
256 if ((cb = php_ircclient_session_get_callback(obj, fn_str, fn_len -1))) {
257 int i;
258 zval *zo, *zp;
259
260 MAKE_STD_ZVAL(zo);
261 if (origin) {
262 ZVAL_STRING(zo, estrdup(origin), 0);
263 } else {
264 ZVAL_NULL(zo);
265 }
266
267 MAKE_STD_ZVAL(zp);
268 array_init(zp);
269 for (i = 0; i < count; ++i) {
270 add_next_index_string(zp, estrdup(params[i]), 0);
271 }
272
273 if (SUCCESS == zend_fcall_info_argn(&cb->fci TSRMLS_CC, 2, &zo, &zp)) {
274 zend_fcall_info_call(&cb->fci, &cb->fcc, NULL, NULL TSRMLS_CC);
275 }
276
277 zval_ptr_dtor(&zo);
278 zval_ptr_dtor(&zp);
279 }
280
281 efree(fn_str);
282 }
283
284 static void php_ircclient_event_code_callback(irc_session_t *session, unsigned int event, const char *origin, const char **params, unsigned int count)
285 {
286 php_ircclient_session_callback_t *cb;
287 php_ircclient_session_object_t *obj = irc_get_ctx(session);
288 TSRMLS_FETCH_FROM_CTX(obj->ts);
289
290
291 if ((cb = php_ircclient_session_get_callback(obj, ZEND_STRL("onNumeric")))) {
292 int i;
293 zval *zo, *ze, *zp;
294
295 MAKE_STD_ZVAL(zo);
296 if (origin) {
297 ZVAL_STRING(zo, estrdup(origin), 0);
298 } else {
299 ZVAL_NULL(zo);
300 }
301
302 MAKE_STD_ZVAL(ze);
303 ZVAL_LONG(ze, event);
304
305 MAKE_STD_ZVAL(zp);
306 array_init(zp);
307 for (i = 0; i < count; ++i) {
308 add_next_index_string(zp, estrdup(params[i]), 0);
309 }
310
311 if (SUCCESS == zend_fcall_info_argn(&cb->fci TSRMLS_CC, 3, &zo, &ze, &zp)) {
312 zend_fcall_info_call(&cb->fci, &cb->fcc, NULL, NULL TSRMLS_CC);
313 }
314
315 zval_ptr_dtor(&zp);
316 zval_ptr_dtor(&ze);
317 zval_ptr_dtor(&zo);
318 }
319 }
320
321 static void php_ircclient_event_dcc_chat_callback(irc_session_t *session, const char *nick, const char *addr, irc_dcc_t dccid)
322 {
323 php_ircclient_session_callback_t *cb;
324 php_ircclient_session_object_t *obj = irc_get_ctx(session);
325 TSRMLS_FETCH_FROM_CTX(obj->ts);
326
327 if ((cb = php_ircclient_session_get_callback(obj, ZEND_STRL("onDccChatReq")))) {
328 zval *zn, *za, *zd;
329
330 MAKE_STD_ZVAL(zn);
331 ZVAL_STRING(zn, estrdup(nick), 0);
332 MAKE_STD_ZVAL(za);
333 ZVAL_STRING(za, estrdup(addr), 0);
334 MAKE_STD_ZVAL(zd);
335 ZVAL_LONG(zd, dccid);
336
337 if (SUCCESS == zend_fcall_info_argn(&cb->fci TSRMLS_CC, 3, &zn, &za, &zd)) {
338 zend_fcall_info_call(&cb->fci, &cb->fcc, NULL, NULL TSRMLS_CC);
339 }
340
341 zval_ptr_dtor(&zd);
342 zval_ptr_dtor(&za);
343 zval_ptr_dtor(&zn);
344 }
345 }
346
347 static void php_ircclient_event_dcc_send_callback(irc_session_t *session, const char *nick, const char *addr, const char *filename, unsigned long size, irc_dcc_t dccid)
348 {
349 php_ircclient_session_callback_t *cb;
350 php_ircclient_session_object_t *obj = irc_get_ctx(session);
351 TSRMLS_FETCH_FROM_CTX(obj->ts);
352
353 if ((cb = php_ircclient_session_get_callback(obj, ZEND_STRL("onDccChatReq")))) {
354 zval *zn, *za, *zf, *zs, *zd;
355
356 MAKE_STD_ZVAL(zn);
357 ZVAL_STRING(zn, estrdup(nick), 0);
358 MAKE_STD_ZVAL(za);
359 ZVAL_STRING(za, estrdup(addr), 0);
360 MAKE_STD_ZVAL(zf);
361 ZVAL_STRING(zf, estrdup(filename), 0);
362 MAKE_STD_ZVAL(zs);
363 ZVAL_LONG(zs, size);
364 MAKE_STD_ZVAL(zd);
365 ZVAL_LONG(zd, dccid);
366
367 if (SUCCESS == zend_fcall_info_argn(&cb->fci TSRMLS_CC, 5, &zn, &za, &zf, &zs, &zd)) {
368 zend_fcall_info_call(&cb->fci, &cb->fcc, NULL, NULL TSRMLS_CC);
369 }
370
371 zval_ptr_dtor(&zd);
372 zval_ptr_dtor(&zs);
373 zval_ptr_dtor(&zf);
374 zval_ptr_dtor(&za);
375 zval_ptr_dtor(&zn);
376 }
377 }
378
379 ZEND_BEGIN_ARG_INFO_EX(ai_Session___construct, 0, 0, 0)
380 ZEND_ARG_INFO(0, nick)
381 ZEND_ARG_INFO(0, user)
382 ZEND_ARG_INFO(0, real)
383 ZEND_END_ARG_INFO()
384 /* {{{ proto void Session::__construct([string nick[, string user[, string real]]]) */
385 PHP_METHOD(Session, __construct)
386 {
387 char *nick_str = NULL, *user_str = NULL, *real_str = NULL;
388 int nick_len = 0, user_len = 0, real_len = 0;
389
390 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!s!s!", &nick_str, &nick_len, &user_str, &user_len, &real_str, &real_len)) {
391 if (nick_str && nick_len) {
392 zend_update_property_stringl(php_ircclient_session_class_entry, getThis(), ZEND_STRL("nick"), nick_str, nick_len TSRMLS_CC);
393 }
394 if (nick_str && nick_len) {
395 zend_update_property_stringl(php_ircclient_session_class_entry, getThis(), ZEND_STRL("nick"), nick_str, nick_len TSRMLS_CC);
396 }
397 if (real_str && real_len) {
398 zend_update_property_stringl(php_ircclient_session_class_entry, getThis(), ZEND_STRL("real"), real_str, real_len TSRMLS_CC);
399 }
400 }
401 }
402 /* }}} */
403
404 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doConnect, 0, 0, 2)
405 ZEND_ARG_INFO(0, ip6)
406 ZEND_ARG_INFO(0, host)
407 ZEND_ARG_INFO(0, port)
408 ZEND_ARG_INFO(0, password)
409 ZEND_END_ARG_INFO()
410 /* {{{ proto bool Session::doConnect(bool ip6, string host[, int port[, string password]])
411 Returns TRUE when the command was sent successfully. */
412 PHP_METHOD(Session, doConnect)
413 {
414 char *server_str, *passwd_str = NULL;
415 int server_len, passwd_len = 0;
416 long port = 6667;
417 zend_bool ip6;
418
419 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "bs|ls!", &ip6, &server_str, &server_len, &port, &passwd_str, &passwd_len)) {
420 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
421 char *nick = NULL, *user = NULL, *real = NULL;
422 zval *znick, *zuser, *zreal;
423
424 znick = zend_read_property(php_ircclient_session_class_entry, getThis(), ZEND_STRL("nick"), 0 TSRMLS_CC);
425 SEPARATE_ARG_IF_REF(znick);
426 convert_to_string_ex(&znick);
427 if (Z_STRLEN_P(znick)) {
428 nick = Z_STRVAL_P(znick);
429 }
430 zuser = zend_read_property(php_ircclient_session_class_entry, getThis(), ZEND_STRL("user"), 0 TSRMLS_CC);
431 SEPARATE_ARG_IF_REF(zuser);
432 convert_to_string_ex(&zuser);
433 if (Z_STRLEN_P(zuser)) {
434 user = Z_STRVAL_P(zuser);
435 }
436 zreal = zend_read_property(php_ircclient_session_class_entry, getThis(), ZEND_STRL("real"), 0 TSRMLS_CC);
437 SEPARATE_ARG_IF_REF(zreal);
438 convert_to_string_ex(&zreal);
439 if (Z_STRLEN_P(zreal)) {
440 real = Z_STRVAL_P(zreal);
441 }
442
443 if (ip6) {
444 if (0 != irc_connect6(obj->sess, server_str, port, passwd_str, nick, user, real)) {
445 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
446 RETVAL_FALSE;
447 }
448 } else if (0 != irc_connect(obj->sess, server_str, port, passwd_str, nick, user, real)) {
449 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
450 RETVAL_FALSE;
451 } else {
452 RETVAL_TRUE;
453 }
454
455 zval_ptr_dtor(&znick);
456 zval_ptr_dtor(&zuser);
457 zval_ptr_dtor(&zreal);
458 }
459 }
460 /* }}} */
461
462 /* {{{ proto bool Session::isConnected() */
463 PHP_METHOD(Session, isConnected)
464 {
465 if (SUCCESS == zend_parse_parameters_none()) {
466 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
467
468 RETURN_BOOL(irc_is_connected(obj->sess));
469 }
470 }
471 /* }}} */
472
473 /* {{{ proto void Session::disconnect() */
474 PHP_METHOD(Session, disconnect)
475 {
476 if (SUCCESS == zend_parse_parameters_none()) {
477 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
478
479 irc_disconnect(obj->sess);
480 }
481 }
482 /* }}} */
483
484 ZEND_BEGIN_ARG_INFO_EX(ai_Session_run, 0, 0, 0)
485 ZEND_ARG_INFO(0, read_fd_array_for_select)
486 ZEND_ARG_INFO(0, write_fd_array_for_select)
487 ZEND_ARG_INFO(0, timeout_seconds)
488 ZEND_END_ARG_INFO()
489 /* {{{ proto array Session::run([array read_fds_for_select[, array write_fds_for_select[, double timeout = null]]])
490 Returns array(array of readable fds, array of writeable fds) or false on error. */
491 PHP_METHOD(Session, run)
492 {
493 HashTable *ifds = NULL, *ofds = NULL;
494 double to = php_get_inf();
495 int connected;
496
497 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|H!H!d", &ifds, &ofds, &to)) {
498 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
499
500 if (ifds || ofds) {
501 struct timeval t, *tp = NULL;
502 fd_set i, o;
503 int m = 0;
504 zval **zfd, *zr, *zw;
505
506 FD_ZERO(&i);
507 FD_ZERO(&o);
508
509 if ((connected = irc_is_connected(obj->sess))) {
510 if (0 != irc_add_select_descriptors(obj->sess, &i, &o, &m)) {
511 php_error_docref(NULL TSRMLS_CC, E_WARNING, "irc_add_select_descriptors: %s", irc_strerror(irc_errno(obj->sess)));
512 RETURN_FALSE;
513 }
514 }
515 if (ifds) {
516 for ( zend_hash_internal_pointer_reset(ifds);
517 SUCCESS == zend_hash_get_current_data(ifds, (void *) &zfd);
518 zend_hash_move_forward(ifds)
519 ) {
520 if (Z_TYPE_PP(zfd) == IS_RESOURCE) {
521 php_stream *s = NULL;
522 int fd = -1;
523
524 php_stream_from_zval_no_verify(s, zfd);
525
526 if (!s || SUCCESS != php_stream_cast(s, PHP_STREAM_AS_FD_FOR_SELECT, (void *) &fd, 1) || fd == -1) {
527 php_error_docref(NULL TSRMLS_CC, E_NOTICE, "invalid resource");
528 } else {
529 PHP_SAFE_FD_SET(fd, &i);
530 if (m < fd) {
531 m = fd;
532 }
533 }
534 }
535 }
536 }
537 if (ofds) {
538 for ( zend_hash_internal_pointer_reset(ofds);
539 SUCCESS == zend_hash_get_current_data(ofds, (void *) &zfd);
540 zend_hash_move_forward(ofds)
541 ) {
542 if (Z_TYPE_PP(zfd) == IS_RESOURCE) {
543 php_stream *s = NULL;
544 int fd = -1;
545
546 php_stream_from_zval_no_verify(s, zfd);
547
548 if (!s || SUCCESS != php_stream_cast(s, PHP_STREAM_AS_FD_FOR_SELECT|PHP_STREAM_CAST_INTERNAL, (void *) &fd, 1) || fd == -1) {
549 php_error_docref(NULL TSRMLS_CC, E_NOTICE, "invalid resource");
550 } else {
551 PHP_SAFE_FD_SET(fd, &o);
552 if (m < fd) {
553 m = fd;
554 }
555 }
556 }
557 }
558 }
559
560 PHP_SAFE_MAX_FD(m, m);
561 array_init(return_value);
562
563 if (to != php_get_inf()) {
564 t.tv_sec = (time_t) to;
565 t.tv_usec = (suseconds_t) ((to - t.tv_sec) * 1000000.0);
566 tp = &t;
567 }
568
569 if (0 > select(m + 1, &i, &o, NULL, tp)) {
570 if (errno == EINTR) {
571 /* interrupt; let userland be able to handle signals etc. */
572 return;
573 }
574
575 php_error_docref(NULL TSRMLS_CC, E_WARNING, "select() error: %s", strerror(errno));
576 RETURN_FALSE;
577 }
578
579 if (connected) {
580 if (0 != irc_process_select_descriptors(obj->sess, &i, &o)) {
581 int err = irc_errno(obj->sess);
582
583 if (err) {
584 php_error_docref(NULL TSRMLS_CC, E_WARNING, "irc_process: %s", irc_strerror(err));
585 RETURN_FALSE;
586 }
587 }
588 }
589
590
591 MAKE_STD_ZVAL(zr);
592 array_init(zr);
593 MAKE_STD_ZVAL(zw);
594 array_init(zw);
595
596 if (ifds) {
597 for ( zend_hash_internal_pointer_reset(ifds);
598 SUCCESS == zend_hash_get_current_data(ifds, (void *) &zfd);
599 zend_hash_move_forward(ifds)
600 ) {
601 if (Z_TYPE_PP(zfd) == IS_RESOURCE) {
602 php_stream *s = NULL;
603 int fd = -1;
604
605 php_stream_from_zval_no_verify(s, zfd);
606
607 if (s && SUCCESS == php_stream_cast(s, PHP_STREAM_AS_FD_FOR_SELECT|PHP_STREAM_CAST_INTERNAL, (void *) &fd, 1) && fd != -1) {
608 if (PHP_SAFE_FD_ISSET(fd, &i)) {
609 Z_ADDREF_PP(zfd);
610 add_next_index_zval(zr, *zfd);
611 }
612 }
613 }
614 }
615 }
616 if (ofds) {
617 for ( zend_hash_internal_pointer_reset(ofds);
618 SUCCESS == zend_hash_get_current_data(ofds, (void *) &zfd);
619 zend_hash_move_forward(ofds)
620 ) {
621 if (Z_TYPE_PP(zfd) == IS_RESOURCE) {
622 php_stream *s = NULL;
623 int fd = -1;
624
625 php_stream_from_zval_no_verify(s, zfd);
626
627 if (s && SUCCESS == php_stream_cast(s, PHP_STREAM_AS_FD_FOR_SELECT|PHP_STREAM_CAST_INTERNAL, (void *) &fd, 1) && fd != -1) {
628 if (PHP_SAFE_FD_ISSET(fd, &o)) {
629 Z_ADDREF_PP(zfd);
630 add_next_index_zval(zw, *zfd);
631 }
632 }
633 }
634 }
635 }
636
637 add_next_index_zval(return_value, zr);
638 add_next_index_zval(return_value, zw);
639
640 return;
641
642 } else {
643 if (0 != irc_run(obj->sess)) {
644 int err = irc_errno(obj->sess);
645
646 if (err) {
647 php_error_docref(NULL TSRMLS_CC, E_WARNING, "irc_run: %s", irc_strerror(err));
648 RETURN_FALSE;
649 }
650 }
651 }
652
653 RETURN_TRUE;
654 }
655 }
656 /* }}} */
657
658 ZEND_BEGIN_ARG_INFO_EX(ai_Session_setOption, 0, 0, 1)
659 ZEND_ARG_INFO(0, option)
660 ZEND_ARG_INFO(0, enable)
661 ZEND_END_ARG_INFO()
662 /* {{{ proto void Session::setOption(int option[, bool enable = true]) */
663 PHP_METHOD(Session, setOption)
664 {
665 long opt;
666 zend_bool onoff = 1;
667
668 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|b", &opt, &onoff)) {
669 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
670
671 if (onoff) {
672 obj->opts |= opt;
673 irc_option_set(obj->sess, opt);
674 } else {
675 obj->opts ^= opt;
676 irc_option_reset(obj->sess, opt);
677 }
678 }
679 }
680 /* }}} */
681
682 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doJoin, 0, 0, 1)
683 ZEND_ARG_INFO(0, channel)
684 ZEND_ARG_INFO(0, password)
685 ZEND_END_ARG_INFO()
686 /* {{{ proto bool Session::doJoin(string channel[, string password])
687 Returns TRUE when the command was successfully sent. */
688 PHP_METHOD(Session, doJoin)
689 {
690 char *chan_str, *key_str = NULL;
691 int chan_len, key_len = 0;
692
693 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!", &chan_str, &chan_len, &key_str, &key_len)) {
694 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
695
696 if (0 != irc_cmd_join(obj->sess, chan_str, key_str)) {
697 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
698 RETVAL_FALSE;
699 } else {
700 RETVAL_TRUE;
701 }
702 }
703 }
704 /* }}} */
705
706 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doPart, 0, 0, 1)
707 ZEND_ARG_INFO(0, channel)
708 ZEND_END_ARG_INFO()
709 /* {{{ proto bool Session::doPart(string channel)
710 Returns TRUE when the command was successfully sent. */
711 PHP_METHOD(Session, doPart)
712 {
713 char *chan_str;
714 int chan_len;
715
716 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &chan_str, &chan_len)) {
717 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
718
719 if (0 != irc_cmd_part(obj->sess, chan_str)) {
720 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
721 RETVAL_FALSE;
722 } else {
723 RETVAL_TRUE;
724 }
725 }
726 }
727 /* }}} */
728
729 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doInvite, 0, 0, 2)
730 ZEND_ARG_INFO(0, nick)
731 ZEND_ARG_INFO(0, channel)
732 ZEND_END_ARG_INFO()
733 /* {{{ proto bool Session::doInvite(string nick, string channel)
734 Returns TRUE when the command was sent successfully. */
735 PHP_METHOD(Session, doInvite)
736 {
737 char *chan_str, *nick_str;
738 int chan_len, nick_len;
739
740 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &nick_str, &nick_len, &chan_str, &chan_len)) {
741 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
742
743 if (0 != irc_cmd_invite(obj->sess, nick_str, chan_str)) {
744 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
745 RETVAL_FALSE;
746 } else {
747 RETVAL_TRUE;
748 }
749 }
750 }
751 /* }}} */
752
753 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doNames, 0, 0, 1)
754 ZEND_ARG_INFO(0, channel)
755 ZEND_END_ARG_INFO()
756 /* {{{ proto bool Session::doNames(string channel)
757 Returns TRUE when the command was sent successfully. */
758 PHP_METHOD(Session, doNames)
759 {
760 char *chan_str;
761 int chan_len;
762
763 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &chan_str, &chan_len)) {
764 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
765
766 if (0 != irc_cmd_names(obj->sess, chan_str)) {
767 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
768 RETVAL_FALSE;
769 } else {
770 RETVAL_TRUE;
771 }
772 }
773 }
774 /* }}} */
775
776 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doList, 0, 0, 1)
777 ZEND_ARG_INFO(0, channel)
778 ZEND_END_ARG_INFO()
779 /* {{{ proto bool Session::doList(string channel)
780 Returns TRUE when the command was sent successfully. */
781 PHP_METHOD(Session, doList)
782 {
783 char *chan_str;
784 int chan_len;
785
786 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &chan_str, &chan_len)) {
787 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
788
789 if (0 != irc_cmd_list(obj->sess, chan_str)) {
790 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
791 RETVAL_FALSE;
792 } else {
793 RETVAL_TRUE;
794 }
795 }
796 }
797 /* }}} */
798
799 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doTopic, 0, 0, 1)
800 ZEND_ARG_INFO(0, channel)
801 ZEND_ARG_INFO(0, topic)
802 ZEND_END_ARG_INFO()
803 /* {{{ proto bool Session::doTopic(string channel[, string topic])
804 Returns TRUE when the command was sent successfully. */
805 PHP_METHOD(Session, doTopic)
806 {
807 char *chan_str, *topic_str = NULL;
808 int chan_len, topic_len;
809
810 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!", &chan_str, &chan_len, &topic_str, &topic_len)) {
811 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
812
813 if (0 != irc_cmd_topic(obj->sess, chan_str, topic_str)) {
814 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
815 RETVAL_FALSE;
816 } else {
817 RETVAL_TRUE;
818 }
819 }
820 }
821 /* }}} */
822
823 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doChannelMode, 0, 0, 1)
824 ZEND_ARG_INFO(0, channel)
825 ZEND_ARG_INFO(0, mode)
826 ZEND_END_ARG_INFO()
827 /* {{{ proto bool Session::doChannelMode(string channel[, string mode])
828 Returns TRUE when the command was sent successfully. */
829 PHP_METHOD(Session, doChannelMode)
830 {
831 char *chan_str, *mode_str = NULL;
832 int chan_len, mode_len;
833
834 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!", &chan_str, &chan_len, &mode_str, &mode_len)) {
835 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
836
837 if (0 != irc_cmd_channel_mode(obj->sess, chan_str, mode_str)) {
838 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
839 RETVAL_FALSE;
840 } else {
841 RETVAL_TRUE;
842 }
843 }
844 }
845 /* }}} */
846
847 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doKick, 0, 0, 2)
848 ZEND_ARG_INFO(0, nick)
849 ZEND_ARG_INFO(0, channel)
850 ZEND_ARG_INFO(0, reason)
851 ZEND_END_ARG_INFO()
852 /* {{{ proto bool Session::doKick(string nick, string channel[, string reason])
853 Returns TRUE when the command was sent successfully. */
854 PHP_METHOD(Session, doKick)
855 {
856 char *chan_str, *nick_str, *reason_str = NULL;
857 int chan_len, nick_len, reason_len;
858
859 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|s!", &nick_str, &nick_len, &chan_str, &chan_len, &reason_str, &reason_len)) {
860 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
861
862 if (0 != irc_cmd_kick(obj->sess, nick_str, chan_str, reason_str)) {
863 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
864 RETVAL_FALSE;
865 } else {
866 RETVAL_TRUE;
867 }
868 }
869 }
870 /* }}} */
871
872 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doMsg, 0, 0, 2)
873 ZEND_ARG_INFO(0, destination)
874 ZEND_ARG_INFO(0, message)
875 ZEND_END_ARG_INFO()
876 /* {{{ proto bool Session::doMsg(string destination, string message)
877 Returns TRUE when the command was sent successfully. */
878 PHP_METHOD(Session, doMsg)
879 {
880 char *dest_str, *msg_str;
881 int dest_len, msg_len;
882
883 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &dest_str, &dest_len, &msg_str, &msg_len)) {
884 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
885
886 if (0 != irc_cmd_msg(obj->sess, dest_str, msg_str)) {
887 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
888 RETVAL_FALSE;
889 } else {
890 RETVAL_TRUE;
891 }
892 }
893 }
894 /* }}} */
895
896 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doMe, 0, 0, 2)
897 ZEND_ARG_INFO(0, destination)
898 ZEND_ARG_INFO(0, message)
899 ZEND_END_ARG_INFO()
900 /* {{{ proto bool Session::doMe(string destination, string message)
901 Returns TRUE when the command was sent successfully. */
902 PHP_METHOD(Session, doMe)
903 {
904 char *dest_str, *msg_str;
905 int dest_len, msg_len;
906
907 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &dest_str, &dest_len, &msg_str, &msg_len)) {
908 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
909
910 if (0 != irc_cmd_me(obj->sess, dest_str, msg_str)) {
911 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
912 RETVAL_FALSE;
913 } else {
914 RETVAL_TRUE;
915 }
916 }
917 }
918 /* }}} */
919
920 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doNotice, 0, 0, 2)
921 ZEND_ARG_INFO(0, destination)
922 ZEND_ARG_INFO(0, message)
923 ZEND_END_ARG_INFO()
924 /* {{{ proto bool Session::doNotice(string destination, string message)
925 Returns TRUE when the command was sent successfully. */
926 PHP_METHOD(Session, doNotice)
927 {
928 char *dest_str, *msg_str;
929 int dest_len, msg_len;
930
931 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &dest_str, &dest_len, &msg_str, &msg_len)) {
932 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
933
934 if (0 != irc_cmd_notice(obj->sess, dest_str, msg_str)) {
935 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
936 RETVAL_FALSE;
937 } else {
938 RETVAL_TRUE;
939 }
940 }
941 }
942 /* }}} */
943
944 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doQuit, 0, 0, 0)
945 ZEND_ARG_INFO(0, reason)
946 ZEND_END_ARG_INFO()
947 /* {{{ proto bool Session::doQuit([string reason])
948 Returns TRUE when the command was sent successfully. */
949 PHP_METHOD(Session, doQuit)
950 {
951 char *reason_str = NULL;
952 int reason_len;
953
954 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!", &reason_str, &reason_len)) {
955 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
956
957 if (0 != irc_cmd_quit(obj->sess, reason_str)) {
958 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
959 RETVAL_FALSE;
960 } else {
961 RETVAL_TRUE;
962 }
963 }
964 }
965 /* }}} */
966
967 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doUserMode, 0, 0, 0)
968 ZEND_ARG_INFO(0, mode)
969 ZEND_END_ARG_INFO()
970 /* {{{ proto bool Session::doUserMode([string mode])
971 Returns TRUE when the command was sent successfully. */
972 PHP_METHOD(Session, doUserMode)
973 {
974 char *mode_str = NULL;
975 int mode_len;
976
977 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!", &mode_str, &mode_len)) {
978 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
979
980 if (0 != irc_cmd_user_mode(obj->sess, mode_str)) {
981 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
982 RETVAL_FALSE;
983 } else {
984 RETVAL_TRUE;
985 }
986 }
987 }
988 /* }}} */
989
990 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doNick, 0, 0, 1)
991 ZEND_ARG_INFO(0, nick)
992 ZEND_END_ARG_INFO()
993 /* {{{ proto bool Session::doNick(string nick)
994 Returns TRUE when the command was sent successfully. */
995 PHP_METHOD(Session, doNick)
996 {
997 char *nick_str;
998 int nick_len;
999
1000 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &nick_str, &nick_len)) {
1001 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
1002
1003 if (0 != irc_cmd_nick(obj->sess, nick_str)) {
1004 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
1005 RETVAL_FALSE;
1006 } else {
1007 RETVAL_TRUE;
1008 }
1009 }
1010 }
1011 /* }}} */
1012
1013 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doWhois, 0, 0, 0)
1014 ZEND_ARG_INFO(0, nick)
1015 ZEND_END_ARG_INFO()
1016 /* {{{ proto bool Session::doWhois([string nick])
1017 Returns TRUE when the command was sent successfully. */
1018 PHP_METHOD(Session, doWhois)
1019 {
1020 char *nick_str = NULL;
1021 int nick_len;
1022
1023 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!", &nick_str, &nick_len)) {
1024 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
1025
1026 if (0 != irc_cmd_whois(obj->sess, nick_str)) {
1027 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
1028 RETVAL_FALSE;
1029 } else {
1030 RETVAL_TRUE;
1031 }
1032 }
1033 }
1034 /* }}} */
1035
1036 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doCtcpReply, 0, 0, 2)
1037 ZEND_ARG_INFO(0, nick)
1038 ZEND_ARG_INFO(0, reply)
1039 ZEND_END_ARG_INFO()
1040 /* {{{ proto bool Session::doCtcpReply(string nick, string reply)
1041 Returns TRUE when the command was sent successfully. */
1042 PHP_METHOD(Session, doCtcpReply)
1043 {
1044 char *nick_str, *reply_str;
1045 int nick_len, reply_len;
1046
1047 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &nick_str, &nick_len, &reply_str, &reply_len)) {
1048 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
1049
1050 if (0 != irc_cmd_ctcp_reply(obj->sess, nick_str, reply_str)) {
1051 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
1052 RETVAL_FALSE;
1053 } else {
1054 RETVAL_TRUE;
1055 }
1056 }
1057 }
1058 /* }}} */
1059
1060 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doCtcpRequest, 0, 0, 2)
1061 ZEND_ARG_INFO(0, nick)
1062 ZEND_ARG_INFO(0, request)
1063 ZEND_END_ARG_INFO()
1064 /* {{{ proto bool Session::doCtcpRequest(string nick, string request)
1065 Returns TRUE when the command was sent successfully. */
1066 PHP_METHOD(Session, doCtcpRequest)
1067 {
1068 char *nick_str, *request_str;
1069 int nick_len, request_len;
1070
1071 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &nick_str, &nick_len, &request_str, &request_len)) {
1072 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
1073
1074 if (0 != irc_cmd_ctcp_request(obj->sess, nick_str, request_str)) {
1075 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
1076 RETVAL_FALSE;
1077 } else {
1078 RETVAL_TRUE;
1079 }
1080 }
1081 }
1082 /* }}} */
1083
1084 ZEND_BEGIN_ARG_INFO_EX(ai_Session_doRaw, 0, 0, 1)
1085 ZEND_ARG_INFO(0, message)
1086 ZEND_END_ARG_INFO()
1087 /* {{{ proto bool Session::doRaw(string message)
1088 Returns TRUE when the command was sent successfully. */
1089 PHP_METHOD(Session, doRaw)
1090 {
1091 char *msg_str;
1092 int msg_len;
1093
1094 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &msg_str, &msg_len)) {
1095 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
1096
1097 if (0 != irc_send_raw(obj->sess, "%.*s", msg_len, msg_str)) {
1098 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
1099 RETVAL_FALSE;
1100 } else {
1101 RETVAL_TRUE;
1102 }
1103 }
1104 }
1105 /* }}} */
1106
1107 /* {{{ event_callbacks */
1108 ZEND_BEGIN_ARG_INFO_EX(ai_Session_event, 0, 0, 2)
1109 ZEND_ARG_INFO(0, origin)
1110 ZEND_ARG_ARRAY_INFO(0, args, 0)
1111 ZEND_END_ARG_INFO()
1112 ZEND_BEGIN_ARG_INFO_EX(ai_Session_event_code, 0, 0, 3)
1113 ZEND_ARG_INFO(0, origin)
1114 ZEND_ARG_INFO(0, event)
1115 ZEND_ARG_ARRAY_INFO(0, args, 0)
1116 ZEND_END_ARG_INFO()
1117 ZEND_BEGIN_ARG_INFO_EX(ai_Session_event_dcc_chat, 0, 0, 3)
1118 ZEND_ARG_INFO(0, nick)
1119 ZEND_ARG_INFO(0, remote_addr)
1120 ZEND_ARG_INFO(0, dccid)
1121 ZEND_END_ARG_INFO()
1122 ZEND_BEGIN_ARG_INFO_EX(ai_Session_event_dcc_send, 0, 0, 5)
1123 ZEND_ARG_INFO(0, nick)
1124 ZEND_ARG_INFO(0, remote_addr)
1125 ZEND_ARG_INFO(0, filename)
1126 ZEND_ARG_INFO(0, size)
1127 ZEND_ARG_INFO(0, dccid)
1128 ZEND_END_ARG_INFO()
1129
1130 static void call_closure(INTERNAL_FUNCTION_PARAMETERS, /* stupid non-const API */ char *prop_str, size_t prop_len)
1131 {
1132 zval **params = ecalloc(ZEND_NUM_ARGS(), sizeof(zval *));
1133 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
1134
1135 if (obj->opts & LIBIRC_OPTION_DEBUG) {
1136 zval za;
1137
1138 INIT_PZVAL(&za);
1139 array_init(&za);
1140
1141 if (SUCCESS == zend_copy_parameters_array(ZEND_NUM_ARGS(), &za TSRMLS_CC)) {
1142 php_printf("ircclient: %s - ", prop_str);
1143 zend_print_flat_zval_r(&za TSRMLS_CC);
1144 php_printf("\n");
1145 }
1146 zval_dtor(&za);
1147 }
1148
1149 if (SUCCESS == zend_get_parameters_array(ZEND_NUM_ARGS(), ZEND_NUM_ARGS(), params)) {
1150 zval *prop = zend_read_property(Z_OBJCE_P(getThis()), getThis(), prop_str, prop_len, 0 TSRMLS_CC);
1151
1152 if (Z_TYPE_P(prop) != IS_NULL) {
1153 call_user_function(NULL, NULL, prop, return_value, ZEND_NUM_ARGS(), params TSRMLS_CC);
1154 }
1155 }
1156
1157 efree(params);
1158 }
1159
1160 PHP_METHOD(Session, onConnect) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onConnect")); }
1161 PHP_METHOD(Session, onNick) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onNick")); }
1162 PHP_METHOD(Session, onQuit) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onQuit")); }
1163 PHP_METHOD(Session, onJoin) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onJoin")); }
1164 PHP_METHOD(Session, onPart) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onPart")); }
1165 PHP_METHOD(Session, onMode) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onMode")); }
1166 PHP_METHOD(Session, onUmode) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onUmode")); }
1167 PHP_METHOD(Session, onTopic) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onTopic")); }
1168 PHP_METHOD(Session, onKick) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onKick")); }
1169 PHP_METHOD(Session, onChannel) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onChannel")); }
1170 PHP_METHOD(Session, onPrivmsg) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onPrivmsg")); }
1171 PHP_METHOD(Session, onNotice) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onNotice")); }
1172 PHP_METHOD(Session, onChannelNotice) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onChannelNotice")); }
1173 PHP_METHOD(Session, onInvite) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onInvite")); }
1174 PHP_METHOD(Session, onCtcpReq) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onCtcpReq")); }
1175 PHP_METHOD(Session, onCtcpRep) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onCtcpRep")); }
1176 PHP_METHOD(Session, onAction) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onAction")); }
1177 PHP_METHOD(Session, onUnknown) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onUnknown")); }
1178 PHP_METHOD(Session, onNumeric) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onNumeric")); }
1179 PHP_METHOD(Session, onDccChatReq) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onDccChatReq")); }
1180 PHP_METHOD(Session, onDccSendReq) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onDccSendReq")); }
1181 PHP_METHOD(Session, onError) { call_closure(INTERNAL_FUNCTION_PARAM_PASSTHRU, ZEND_STRL("onError")); }
1182 /* }}} */
1183
1184 #define ME(m, ai) PHP_ME(Session, m, ai, ZEND_ACC_PUBLIC)
1185
1186 zend_function_entry php_ircclient_session_method_entry[] = {
1187 ME(__construct, ai_Session___construct)
1188 ME(doConnect, ai_Session_doConnect)
1189 ME(isConnected, NULL)
1190 ME(disconnect, NULL)
1191 ME(run, ai_Session_run)
1192 ME(setOption, ai_Session_setOption)
1193
1194 ME(doJoin, ai_Session_doJoin)
1195 ME(doPart, ai_Session_doPart)
1196 ME(doInvite, ai_Session_doInvite)
1197 ME(doNames, ai_Session_doNames)
1198 ME(doList, ai_Session_doList)
1199 ME(doTopic, ai_Session_doTopic)
1200 ME(doChannelMode, ai_Session_doChannelMode)
1201 ME(doKick, ai_Session_doKick)
1202
1203 ME(doMsg, ai_Session_doMsg)
1204 ME(doMe, ai_Session_doMe)
1205 ME(doNotice, ai_Session_doNotice)
1206
1207 ME(doQuit, ai_Session_doQuit)
1208 ME(doUserMode, ai_Session_doUserMode)
1209 ME(doNick, ai_Session_doNick)
1210 ME(doWhois, ai_Session_doWhois)
1211
1212 ME(doCtcpReply, ai_Session_doCtcpReply)
1213 ME(doCtcpRequest, ai_Session_doCtcpRequest)
1214
1215 ME(doRaw, ai_Session_doRaw)
1216
1217 ME(onConnect, ai_Session_event)
1218 ME(onNick, ai_Session_event)
1219 ME(onQuit, ai_Session_event)
1220 ME(onJoin, ai_Session_event)
1221 ME(onPart, ai_Session_event)
1222 ME(onMode, ai_Session_event)
1223 ME(onUmode, ai_Session_event)
1224 ME(onTopic, ai_Session_event)
1225 ME(onKick, ai_Session_event)
1226 ME(onChannel, ai_Session_event)
1227 ME(onPrivmsg, ai_Session_event)
1228 ME(onNotice, ai_Session_event)
1229 ME(onChannelNotice, ai_Session_event)
1230 ME(onInvite, ai_Session_event)
1231 ME(onCtcpReq, ai_Session_event)
1232 ME(onCtcpRep, ai_Session_event)
1233 ME(onAction, ai_Session_event)
1234 ME(onUnknown, ai_Session_event)
1235 ME(onNumeric, ai_Session_event_code)
1236 ME(onDccChatReq, ai_Session_event_dcc_chat)
1237 ME(onDccSendReq, ai_Session_event_dcc_send)
1238 ME(onError, ai_Session_event)
1239 {0}
1240 };
1241
1242 PHP_MINIT_FUNCTION(ircclient)
1243 {
1244 zend_class_entry ce;
1245
1246 memset(&ce, 0, sizeof(zend_class_entry));
1247 INIT_NS_CLASS_ENTRY(ce, "irc\\client", "Session", php_ircclient_session_method_entry);
1248 ce.create_object = php_ircclient_session_object_create;
1249 php_ircclient_session_class_entry = zend_register_internal_class_ex(&ce, NULL, NULL TSRMLS_CC);
1250
1251 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("nick"), ZEND_ACC_PUBLIC TSRMLS_CC);
1252 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("user"), ZEND_ACC_PUBLIC TSRMLS_CC);
1253 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("real"), ZEND_ACC_PUBLIC TSRMLS_CC);
1254
1255 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onConnect"), ZEND_ACC_PUBLIC TSRMLS_CC);
1256 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onNick"), ZEND_ACC_PUBLIC TSRMLS_CC);
1257 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onQuit"), ZEND_ACC_PUBLIC TSRMLS_CC);
1258 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onJoin"), ZEND_ACC_PUBLIC TSRMLS_CC);
1259 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onPart"), ZEND_ACC_PUBLIC TSRMLS_CC);
1260 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onMode"), ZEND_ACC_PUBLIC TSRMLS_CC);
1261 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onUmode"), ZEND_ACC_PUBLIC TSRMLS_CC);
1262 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onTopic"), ZEND_ACC_PUBLIC TSRMLS_CC);
1263 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onKick"), ZEND_ACC_PUBLIC TSRMLS_CC);
1264 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onChannel"), ZEND_ACC_PUBLIC TSRMLS_CC);
1265 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onPrivmsg"), ZEND_ACC_PUBLIC TSRMLS_CC);
1266 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onNotice"), ZEND_ACC_PUBLIC TSRMLS_CC);
1267 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onChannelNotice"), ZEND_ACC_PUBLIC TSRMLS_CC);
1268 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onInvite"), ZEND_ACC_PUBLIC TSRMLS_CC);
1269 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onCtcpReq"), ZEND_ACC_PUBLIC TSRMLS_CC);
1270 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onCtcpRep"), ZEND_ACC_PUBLIC TSRMLS_CC);
1271 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onAction"), ZEND_ACC_PUBLIC TSRMLS_CC);
1272 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onUnknown"), ZEND_ACC_PUBLIC TSRMLS_CC);
1273 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onNumeric"), ZEND_ACC_PUBLIC TSRMLS_CC);
1274 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onDccChatReq"), ZEND_ACC_PUBLIC TSRMLS_CC);
1275 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onDccSendReq"), ZEND_ACC_PUBLIC TSRMLS_CC);
1276 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("onError"), ZEND_ACC_PUBLIC TSRMLS_CC);
1277
1278 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_WELCOME", 001, CONST_CS|CONST_PERSISTENT);
1279 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_YOURHOST", 002, CONST_CS|CONST_PERSISTENT);
1280 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_CREATED", 003, CONST_CS|CONST_PERSISTENT);
1281 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_MYINFO", 004, CONST_CS|CONST_PERSISTENT);
1282 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_BOUNCE", 005, CONST_CS|CONST_PERSISTENT);
1283 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_USERHOST", 302, CONST_CS|CONST_PERSISTENT);
1284 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ISON", 303, CONST_CS|CONST_PERSISTENT);
1285 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_AWAY", 301, CONST_CS|CONST_PERSISTENT);
1286 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_UNAWAY", 305, CONST_CS|CONST_PERSISTENT);
1287 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_NOWAWAY", 306, CONST_CS|CONST_PERSISTENT);
1288 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_WHOISUSER", 311, CONST_CS|CONST_PERSISTENT);
1289 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_WHOISSERVER", 312, CONST_CS|CONST_PERSISTENT);
1290 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_WHOISOPERATOR", 313, CONST_CS|CONST_PERSISTENT);
1291 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_WHOISIDLE", 317, CONST_CS|CONST_PERSISTENT);
1292 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFWHOIS", 318, CONST_CS|CONST_PERSISTENT);
1293 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_WHOISCHANNELS", 319, CONST_CS|CONST_PERSISTENT);
1294 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_WHOWASUSER", 314, CONST_CS|CONST_PERSISTENT);
1295 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFWHOWAS", 369, CONST_CS|CONST_PERSISTENT);
1296 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_LIST", 322, CONST_CS|CONST_PERSISTENT);
1297 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_LISTEND", 323, CONST_CS|CONST_PERSISTENT);
1298 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_UNIQOPIS", 325, CONST_CS|CONST_PERSISTENT);
1299 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_CHANNELMODEIS", 324, CONST_CS|CONST_PERSISTENT);
1300 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_NOTOPIC", 331, CONST_CS|CONST_PERSISTENT);
1301 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TOPIC", 332, CONST_CS|CONST_PERSISTENT);
1302 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_INVITING", 341, CONST_CS|CONST_PERSISTENT);
1303 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_SUMMONING", 342, CONST_CS|CONST_PERSISTENT);
1304 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_INVITELIST", 346, CONST_CS|CONST_PERSISTENT);
1305 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFINVITELIST", 347, CONST_CS|CONST_PERSISTENT);
1306 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_EXCEPTLIST", 348, CONST_CS|CONST_PERSISTENT);
1307 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFEXCEPTLIST", 349, CONST_CS|CONST_PERSISTENT);
1308 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_VERSION", 351, CONST_CS|CONST_PERSISTENT);
1309 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_WHOREPLY", 352, CONST_CS|CONST_PERSISTENT);
1310 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFWHO", 315, CONST_CS|CONST_PERSISTENT);
1311 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_NAMREPLY", 353, CONST_CS|CONST_PERSISTENT);
1312 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFNAMES", 366, CONST_CS|CONST_PERSISTENT);
1313 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_LINKS", 364, CONST_CS|CONST_PERSISTENT);
1314 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFLINKS", 365, CONST_CS|CONST_PERSISTENT);
1315 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_BANLIST", 367, CONST_CS|CONST_PERSISTENT);
1316 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFBANLIST", 368, CONST_CS|CONST_PERSISTENT);
1317 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_INFO", 371, CONST_CS|CONST_PERSISTENT);
1318 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFINFO", 374, CONST_CS|CONST_PERSISTENT);
1319 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_MOTDSTART", 375, CONST_CS|CONST_PERSISTENT);
1320 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_MOTD", 372, CONST_CS|CONST_PERSISTENT);
1321 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFMOTD", 376, CONST_CS|CONST_PERSISTENT);
1322 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_YOUREOPER", 381, CONST_CS|CONST_PERSISTENT);
1323 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_REHASHING", 382, CONST_CS|CONST_PERSISTENT);
1324 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_YOURESERVICE", 383, CONST_CS|CONST_PERSISTENT);
1325 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TIME", 391, CONST_CS|CONST_PERSISTENT);
1326 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_USERSSTART", 392, CONST_CS|CONST_PERSISTENT);
1327 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_USERS", 393, CONST_CS|CONST_PERSISTENT);
1328 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFUSERS", 394, CONST_CS|CONST_PERSISTENT);
1329 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_NOUSERS", 395, CONST_CS|CONST_PERSISTENT);
1330 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACELINK", 200, CONST_CS|CONST_PERSISTENT);
1331 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACECONNECTING", 201, CONST_CS|CONST_PERSISTENT);
1332 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACEHANDSHAKE", 202, CONST_CS|CONST_PERSISTENT);
1333 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACEUNKNOWN", 203, CONST_CS|CONST_PERSISTENT);
1334 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACEOPERATOR", 204, CONST_CS|CONST_PERSISTENT);
1335 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACEUSER", 205, CONST_CS|CONST_PERSISTENT);
1336 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACESERVER", 206, CONST_CS|CONST_PERSISTENT);
1337 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACESERVICE", 207, CONST_CS|CONST_PERSISTENT);
1338 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACENEWTYPE", 208, CONST_CS|CONST_PERSISTENT);
1339 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACECLASS", 209, CONST_CS|CONST_PERSISTENT);
1340 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACELOG", 261, CONST_CS|CONST_PERSISTENT);
1341 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACEEND", 262, CONST_CS|CONST_PERSISTENT);
1342 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_STATSLINKINFO", 211, CONST_CS|CONST_PERSISTENT);
1343 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_STATSCOMMANDS", 212, CONST_CS|CONST_PERSISTENT);
1344 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFSTATS", 219, CONST_CS|CONST_PERSISTENT);
1345 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_STATSUPTIME", 242, CONST_CS|CONST_PERSISTENT);
1346 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_STATSOLINE", 243, CONST_CS|CONST_PERSISTENT);
1347 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_UMODEIS", 221, CONST_CS|CONST_PERSISTENT);
1348 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_SERVLIST", 234, CONST_CS|CONST_PERSISTENT);
1349 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_SERVLISTEND", 235, CONST_CS|CONST_PERSISTENT);
1350 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_LUSERCLIENT", 251, CONST_CS|CONST_PERSISTENT);
1351 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_LUSEROP", 252, CONST_CS|CONST_PERSISTENT);
1352 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_LUSERUNKNOWN", 253, CONST_CS|CONST_PERSISTENT);
1353 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_LUSERCHANNELS", 254, CONST_CS|CONST_PERSISTENT);
1354 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_LUSERME", 255, CONST_CS|CONST_PERSISTENT);
1355 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ADMINME", 256, CONST_CS|CONST_PERSISTENT);
1356 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ADMINLOC1", 257, CONST_CS|CONST_PERSISTENT);
1357 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ADMINLOC2", 258, CONST_CS|CONST_PERSISTENT);
1358 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ADMINEMAIL", 259, CONST_CS|CONST_PERSISTENT);
1359 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRYAGAIN", 263, CONST_CS|CONST_PERSISTENT);
1360 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOSUCHNICK", 401, CONST_CS|CONST_PERSISTENT);
1361 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOSUCHSERVER", 402, CONST_CS|CONST_PERSISTENT);
1362 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOSUCHCHANNEL", 403, CONST_CS|CONST_PERSISTENT);
1363 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_CANNOTSENDTOCHAN", 404, CONST_CS|CONST_PERSISTENT);
1364 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_TOOMANYCHANNELS", 405, CONST_CS|CONST_PERSISTENT);
1365 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_WASNOSUCHNICK", 406, CONST_CS|CONST_PERSISTENT);
1366 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_TOOMANYTARGETS", 407, CONST_CS|CONST_PERSISTENT);
1367 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOSUCHSERVICE", 408, CONST_CS|CONST_PERSISTENT);
1368 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOORIGIN", 409, CONST_CS|CONST_PERSISTENT);
1369 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NORECIPIENT", 411, CONST_CS|CONST_PERSISTENT);
1370 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOTEXTTOSEND", 412, CONST_CS|CONST_PERSISTENT);
1371 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOTOPLEVEL", 413, CONST_CS|CONST_PERSISTENT);
1372 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_WILDTOPLEVEL", 414, CONST_CS|CONST_PERSISTENT);
1373 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_BADMASK", 415, CONST_CS|CONST_PERSISTENT);
1374 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_UNKNOWNCOMMAND", 421, CONST_CS|CONST_PERSISTENT);
1375 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOMOTD", 422, CONST_CS|CONST_PERSISTENT);
1376 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOADMININFO", 423, CONST_CS|CONST_PERSISTENT);
1377 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_FILEERROR", 424, CONST_CS|CONST_PERSISTENT);
1378 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NONICKNAMEGIVEN", 431, CONST_CS|CONST_PERSISTENT);
1379 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_ERRONEUSNICKNAME", 432, CONST_CS|CONST_PERSISTENT);
1380 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NICKNAMEINUSE", 433, CONST_CS|CONST_PERSISTENT);
1381 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NICKCOLLISION", 436, CONST_CS|CONST_PERSISTENT);
1382 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_UNAVAILRESOURCE", 437, CONST_CS|CONST_PERSISTENT);
1383 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_USERNOTINCHANNEL", 441, CONST_CS|CONST_PERSISTENT);
1384 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOTONCHANNEL", 442, CONST_CS|CONST_PERSISTENT);
1385 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_USERONCHANNEL", 443, CONST_CS|CONST_PERSISTENT);
1386 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOLOGIN", 444, CONST_CS|CONST_PERSISTENT);
1387 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_SUMMONDISABLED", 445, CONST_CS|CONST_PERSISTENT);
1388 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_USERSDISABLED", 446, CONST_CS|CONST_PERSISTENT);
1389 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOTREGISTERED", 451, CONST_CS|CONST_PERSISTENT);
1390 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NEEDMOREPARAMS", 461, CONST_CS|CONST_PERSISTENT);
1391 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_ALREADYREGISTRED", 462, CONST_CS|CONST_PERSISTENT);
1392 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOPERMFORHOST", 463, CONST_CS|CONST_PERSISTENT);
1393 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_PASSWDMISMATCH", 464, CONST_CS|CONST_PERSISTENT);
1394 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_YOUREBANNEDCREEP", 465, CONST_CS|CONST_PERSISTENT);
1395 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_YOUWILLBEBANNED", 466, CONST_CS|CONST_PERSISTENT);
1396 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_KEYSET", 467, CONST_CS|CONST_PERSISTENT);
1397 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_CHANNELISFULL", 471, CONST_CS|CONST_PERSISTENT);
1398 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_UNKNOWNMODE", 472, CONST_CS|CONST_PERSISTENT);
1399 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_INVITEONLYCHAN", 473, CONST_CS|CONST_PERSISTENT);
1400 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_BANNEDFROMCHAN", 474, CONST_CS|CONST_PERSISTENT);
1401 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_BADCHANNELKEY", 475, CONST_CS|CONST_PERSISTENT);
1402 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_BADCHANMASK", 476, CONST_CS|CONST_PERSISTENT);
1403 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOCHANMODES", 477, CONST_CS|CONST_PERSISTENT);
1404 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_BANLISTFULL", 478, CONST_CS|CONST_PERSISTENT);
1405 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOPRIVILEGES", 481, CONST_CS|CONST_PERSISTENT);
1406 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_CHANOPRIVSNEEDED", 482, CONST_CS|CONST_PERSISTENT);
1407 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_CANTKILLSERVER", 483, CONST_CS|CONST_PERSISTENT);
1408 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_RESTRICTED", 484, CONST_CS|CONST_PERSISTENT);
1409 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_UNIQOPPRIVSNEEDED", 485, CONST_CS|CONST_PERSISTENT);
1410 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOOPERHOST", 491, CONST_CS|CONST_PERSISTENT);
1411 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_UMODEUNKNOWNFLAG", 501, CONST_CS|CONST_PERSISTENT);
1412 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_USERSDONTMATCH", 502, CONST_CS|CONST_PERSISTENT);
1413
1414 return SUCCESS;
1415 }
1416
1417 PHP_MINFO_FUNCTION(ircclient)
1418 {
1419 unsigned int high, low;
1420 char *version[2];
1421 char *lt16 = "<=1.6";
1422
1423 irc_get_version(&high, &low);
1424 spprintf(&version[1], 0, "%u.%u", high, low);
1425 #if PHP_IRCCLIENT_LIBIRCCLIENT_VERSION_HIGH
1426 spprintf(&version[0], 0, "%u.%u", PHP_IRCCLIENT_LIBIRCCLIENT_VERSION_HIGH, PHP_IRCCLIENT_LIBIRCCLIENT_VERSION_LOW);
1427 #else
1428 /* version <= 1.6 doesn't expose its version */
1429 version[0] = lt16;
1430 #endif
1431 php_info_print_table_start();
1432 php_info_print_table_header(2, "IRC client support", "enabled");
1433 php_info_print_table_row(2, "Version", PHP_IRCCLIENT_VERSION);
1434 php_info_print_table_end();
1435
1436 php_info_print_table_start();
1437 php_info_print_table_header(3, "Used Library", "compiled", "linked");
1438 php_info_print_table_row(3,
1439 "libircclient",
1440 version[0],
1441 version[1]
1442 );
1443 php_info_print_table_end();
1444
1445 if (version[0] != lt16) {
1446 efree(version[0]);
1447 }
1448 efree(version[1]);
1449 }
1450
1451
1452
1453
1454