e68df2ec0e2be10e49b7f334c9c4e1569940cb18
[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_config.h>
19 #include <main/php_ini.h>
20 #include <main/php_network.h>
21 #include <ext/standard/php_string.h>
22 #include <ext/standard/info.h>
23
24 #include <Zend/zend.h>
25 #include <Zend/zend_constants.h>
26 #include <Zend/zend_interfaces.h>
27
28 #include "php_ircclient.h"
29
30 #include <errno.h>
31 #include <ctype.h>
32 #include <libircclient/libircclient.h>
33
34 PHP_FUNCTION(parse_origin)
35 {
36 char *origin_str;
37 int origin_len;
38
39 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &origin_str, &origin_len)) {
40 zval *znick, *zuser, *zhost;
41 size_t siz = 0;
42 char *ptr;
43
44 MAKE_STD_ZVAL(znick); ZVAL_NULL(znick);
45 MAKE_STD_ZVAL(zuser); ZVAL_NULL(zuser);
46 MAKE_STD_ZVAL(zhost); ZVAL_NULL(zhost);
47
48 for (ptr = origin_str; *ptr; ptr += siz + 1) {
49 if ((siz = strcspn(ptr, "!@"))) {
50 switch (ptr[siz]) {
51 case '!':
52 ZVAL_STRINGL(znick, ptr, siz, 1);
53 break;
54 case '@':
55 ZVAL_STRINGL(zuser, ptr, siz, 1);
56 break;
57 case '\0':
58 ZVAL_STRINGL(zhost, ptr, siz, 1);
59 goto done;
60 break;
61 default:
62 break;
63 }
64 }
65 }
66 done:
67 array_init(return_value);
68 add_assoc_zval_ex(return_value, ZEND_STRS("nick"), znick);
69 add_assoc_zval_ex(return_value, ZEND_STRS("user"), zuser);
70 add_assoc_zval_ex(return_value, ZEND_STRS("host"), zhost);
71 }
72 }
73
74
75 const zend_function_entry php_ircclient_function_entry[] = {
76 ZEND_NS_FENTRY("irc\\client", parse_origin, ZEND_FN(parse_origin), NULL, 0)
77 {0}
78 };
79
80 PHP_MINIT_FUNCTION(ircclient);
81 PHP_MINFO_FUNCTION(ircclient);
82
83 zend_module_entry ircclient_module_entry = {
84 STANDARD_MODULE_HEADER,
85 "ircclient",
86 php_ircclient_function_entry,
87 PHP_MINIT(ircclient),
88 NULL,
89 NULL,
90 NULL,
91 PHP_MINFO(ircclient),
92 PHP_IRCCLIENT_VERSION,
93 STANDARD_MODULE_PROPERTIES
94 };
95
96
97 #ifdef COMPILE_DL_IRCCLIENT
98 ZEND_GET_MODULE(ircclient)
99 #endif
100
101 static void php_ircclient_event_callback(irc_session_t *session, const char *event, const char *origin, const char **params, unsigned int count);
102 static void php_ircclient_event_code_callback(irc_session_t *session, unsigned int event, const char *origin, const char **params, unsigned int count);
103 static void php_ircclient_event_dcc_chat_callback(irc_session_t *session, const char *nick, const char *addr, irc_dcc_t dccid);
104 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);
105
106 static irc_callbacks_t php_ircclient_callbacks = {
107 .event_connect = php_ircclient_event_callback,
108 .event_nick = php_ircclient_event_callback,
109 .event_quit = php_ircclient_event_callback,
110 .event_join = php_ircclient_event_callback,
111 .event_part = php_ircclient_event_callback,
112 .event_mode = php_ircclient_event_callback,
113 .event_umode = php_ircclient_event_callback,
114 .event_topic = php_ircclient_event_callback,
115 .event_kick = php_ircclient_event_callback,
116 .event_channel = php_ircclient_event_callback,
117 .event_privmsg = php_ircclient_event_callback,
118 .event_notice = php_ircclient_event_callback,
119 /* .event_channel_notice = php_ircclient_event_callback, */
120 .event_invite = php_ircclient_event_callback,
121 .event_ctcp_req = php_ircclient_event_callback,
122 .event_ctcp_rep = php_ircclient_event_callback,
123 .event_ctcp_action = php_ircclient_event_callback,
124 .event_unknown = php_ircclient_event_callback,
125 .event_numeric = php_ircclient_event_code_callback,
126 .event_dcc_chat_req = php_ircclient_event_dcc_chat_callback,
127 .event_dcc_send_req = php_ircclient_event_dcc_send_callback
128 };
129
130 typedef struct php_ircclient_session_object {
131 zend_object zo;
132 zend_object_value ov;
133 irc_session_t *sess;
134 #ifdef ZTS
135 void ***ts;
136 #endif
137 } php_ircclient_session_object_t;
138
139 zend_class_entry *php_ircclient_session_class_entry;
140
141 void php_ircclient_session_object_free(void *object TSRMLS_DC)
142 {
143 php_ircclient_session_object_t *o = (php_ircclient_session_object_t *) object;
144
145 if (o->sess) {
146 irc_destroy_session(o->sess);
147 o->sess = NULL;
148 }
149 zend_object_std_dtor((zend_object *) o TSRMLS_CC);
150 efree(o);
151 }
152
153 zend_object_value php_ircclient_session_object_create(zend_class_entry *ce TSRMLS_DC)
154 {
155 php_ircclient_session_object_t *obj;
156
157 obj = ecalloc(1, sizeof(*obj));
158 #if PHP_VERSION_ID >= 50399
159 zend_object_std_init((zend_object *) obj, ce TSRMLS_CC);
160 object_properties_init((zend_object *) obj, ce);
161 #else
162 obj->zo.ce = ce;
163 ALLOC_HASHTABLE(obj->zo.properties);
164 zend_hash_init(obj->zo.properties, zend_hash_num_elements(&ce->default_properties), NULL, ZVAL_PTR_DTOR, 0);
165 zend_hash_copy(obj->zo.properties, &ce->default_properties, (copy_ctor_func_t) zval_add_ref, NULL, sizeof(zval *));
166 #endif
167
168 obj->sess = irc_create_session(&php_ircclient_callbacks);
169 irc_set_ctx(obj->sess, obj);
170 TSRMLS_SET_CTX(obj->ts);
171
172 obj->ov.handle = zend_objects_store_put(obj, NULL, php_ircclient_session_object_free, NULL TSRMLS_CC);
173 obj->ov.handlers = zend_get_std_object_handlers();
174
175 return obj->ov;
176 }
177
178 static void php_ircclient_event_callback(irc_session_t *session, const char *event, const char *origin, const char **params, unsigned int count)
179 {
180 char *fn_str;
181 int i, fn_len;
182 zval *zo, *zr, *za;
183 php_ircclient_session_object_t *obj = irc_get_ctx(session);
184 TSRMLS_FETCH_FROM_CTX(obj->ts);
185
186 fn_str = emalloc(strlen(event) + 2 + 1);
187 fn_str[0] = 'o';
188 fn_str[1] = 'n';
189 fn_len = 2;
190 do {
191 if (*event != '_') {
192 fn_str[fn_len++] = tolower(*event);
193 }
194 } while (*event++);
195
196 MAKE_STD_ZVAL(zo);
197 Z_TYPE_P(zo) = IS_OBJECT;
198 zo->value.obj = obj->ov;
199 zend_objects_store_add_ref(zo TSRMLS_CC);
200
201 MAKE_STD_ZVAL(zr);
202 if (origin) {
203 ZVAL_STRING(zr, estrdup(origin), 0);
204 } else {
205 ZVAL_NULL(zr);
206 }
207
208 MAKE_STD_ZVAL(za);
209 array_init(za);
210 for (i = 0; i < count; ++i) {
211 add_next_index_string(za, estrdup(params[i]), 0);
212 }
213
214 zend_call_method(&zo, NULL, NULL, fn_str, fn_len - 1, NULL, 2, zr, za TSRMLS_CC);
215
216 zval_ptr_dtor(&za);
217 zval_ptr_dtor(&zr);
218 zval_ptr_dtor(&zo);
219
220 efree(fn_str);
221 }
222
223 static void php_ircclient_event_code_callback(irc_session_t *session, unsigned int event, const char *origin, const char **params, unsigned int count)
224 {
225 int i;
226 zval *zo, *zr, *zp, *za;
227 php_ircclient_session_object_t *obj = irc_get_ctx(session);
228 TSRMLS_FETCH_FROM_CTX(obj->ts);
229
230 MAKE_STD_ZVAL(zo);
231 Z_TYPE_P(zo) = IS_OBJECT;
232 zo->value.obj = obj->ov;
233 zend_objects_store_add_ref(zo TSRMLS_CC);
234
235 MAKE_STD_ZVAL(zr);
236 if (origin) {
237 ZVAL_STRING(zr, estrdup(origin), 0);
238 } else {
239 ZVAL_NULL(zr);
240 }
241
242 MAKE_STD_ZVAL(za);
243 array_init(za);
244 add_assoc_long_ex(za, ZEND_STRS("event"), event);
245
246 MAKE_STD_ZVAL(zp);
247 array_init(zp);
248 for (i = 0; i < count; ++i) {
249 add_next_index_string(zp, estrdup(params[i]), 0);
250 }
251 add_assoc_zval_ex(za, ZEND_STRS("params"), zp);
252
253 zend_call_method(&zo, NULL, NULL, ZEND_STRL("onnumeric"), NULL, 2, zr, za TSRMLS_CC);
254
255 zval_ptr_dtor(&zp);
256 zval_ptr_dtor(&za);
257 zval_ptr_dtor(&zr);
258 zval_ptr_dtor(&zo);
259
260 }
261
262 static void php_ircclient_event_dcc_chat_callback(irc_session_t *session, const char *nick, const char *addr, irc_dcc_t dccid)
263 {
264 zval *zo, *zp;
265 php_ircclient_session_object_t *obj = irc_get_ctx(session);
266 TSRMLS_FETCH_FROM_CTX(obj->ts);
267
268 MAKE_STD_ZVAL(zo);
269 Z_TYPE_P(zo) = IS_OBJECT;
270 zo->value.obj = obj->ov;
271 zend_objects_store_add_ref(zo TSRMLS_CC);
272
273 MAKE_STD_ZVAL(zp);
274 array_init(zp);
275 add_assoc_string_ex(zp, ZEND_STRS("nick"), estrdup(nick), 0);
276 add_assoc_string_ex(zp, ZEND_STRS("remote_addr"), estrdup(addr), 0);
277 add_assoc_long_ex(zp, ZEND_STRS("dccid"), dccid);
278
279 zend_call_method(&zo, NULL, NULL, ZEND_STRS("ondccchatreq"), NULL, 1, zp, NULL TSRMLS_CC);
280
281 zval_ptr_dtor(&zp);
282 zval_ptr_dtor(&zo);
283 }
284
285 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)
286 {
287 zval *zo, *zp;
288 php_ircclient_session_object_t *obj = irc_get_ctx(session);
289 TSRMLS_FETCH_FROM_CTX(obj->ts);
290
291 MAKE_STD_ZVAL(zo);
292 Z_TYPE_P(zo) = IS_OBJECT;
293 zo->value.obj = obj->ov;
294 zend_objects_store_add_ref(zo TSRMLS_CC);
295
296 MAKE_STD_ZVAL(zp);
297 array_init(zp);
298 add_assoc_string_ex(zp, ZEND_STRS("nick"), estrdup(nick), 0);
299 add_assoc_string_ex(zp, ZEND_STRS("remote_addr"), estrdup(addr), 0);
300 add_assoc_string_ex(zp, ZEND_STRS("filename"), estrdup(filename), 0);
301 add_assoc_long_ex(zp, ZEND_STRS("filesize"), size);
302 add_assoc_long_ex(zp, ZEND_STRS("dccid"), dccid);
303
304 zend_call_method(&zo, NULL, NULL, ZEND_STRL("ondccsendreq"), NULL, 1, zp, NULL TSRMLS_CC);
305
306 zval_ptr_dtor(&zp);
307 zval_ptr_dtor(&zo);
308 }
309
310 PHP_METHOD(Session, __construct)
311 {
312 char *nick_str = NULL, *user_str = NULL, *real_str = NULL;
313 int nick_len = 0, user_len = 0, real_len = 0;
314
315 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)) {
316 if (nick_str && nick_len) {
317 zend_update_property_stringl(php_ircclient_session_class_entry, getThis(), ZEND_STRL("nick"), nick_str, nick_len TSRMLS_CC);
318 }
319 if (nick_str && nick_len) {
320 zend_update_property_stringl(php_ircclient_session_class_entry, getThis(), ZEND_STRL("nick"), nick_str, nick_len TSRMLS_CC);
321 }
322 if (real_str && real_len) {
323 zend_update_property_stringl(php_ircclient_session_class_entry, getThis(), ZEND_STRL("real"), real_str, real_len TSRMLS_CC);
324 }
325 }
326 }
327
328 PHP_METHOD(Session, doConnect)
329 {
330 char *server_str, *passwd_str = NULL;
331 int server_len, passwd_len = 0;
332 long port = 6667;
333 zend_bool ip6;
334
335 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "bs|ls!", &ip6, &server_str, &server_len, &port, &passwd_str, &passwd_len)) {
336 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
337 char *nick = NULL, *user = NULL, *real = NULL;
338 zval *znick, *zuser, *zreal, *tmp;
339
340 znick = zend_read_property(php_ircclient_session_class_entry, getThis(), ZEND_STRL("nick"), 0 TSRMLS_CC);
341 SEPARATE_ARG_IF_REF(znick);
342 convert_to_string_ex(&znick);
343 if (Z_STRLEN_P(znick)) {
344 nick = Z_STRVAL_P(znick);
345 }
346 zuser = zend_read_property(php_ircclient_session_class_entry, getThis(), ZEND_STRL("user"), 0 TSRMLS_CC);
347 SEPARATE_ARG_IF_REF(zuser);
348 convert_to_string_ex(&zuser);
349 if (Z_STRLEN_P(zuser)) {
350 user = Z_STRVAL_P(zuser);
351 }
352 zreal = zend_read_property(php_ircclient_session_class_entry, getThis(), ZEND_STRL("real"), 0 TSRMLS_CC);
353 SEPARATE_ARG_IF_REF(zreal);
354 convert_to_string_ex(&zreal);
355 if (Z_STRLEN_P(zreal)) {
356 real = Z_STRVAL_P(zreal);
357 }
358
359 if (ip6) {
360 if (0 != irc_connect6(obj->sess, server_str, port, passwd_str, nick, user, real)) {
361 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
362 RETVAL_FALSE;
363 }
364 } else if (0 != irc_connect(obj->sess, server_str, port, passwd_str, nick, user, real)) {
365 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
366 RETVAL_FALSE;
367 } else {
368 RETVAL_TRUE;
369 }
370
371 zval_ptr_dtor(&znick);
372 zval_ptr_dtor(&zuser);
373 zval_ptr_dtor(&zreal);
374 }
375 }
376
377 PHP_METHOD(Session, isConnected)
378 {
379 if (SUCCESS == zend_parse_parameters_none()) {
380 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
381
382 RETURN_BOOL(irc_is_connected(obj->sess));
383 }
384 }
385
386 PHP_METHOD(Session, disconnect)
387 {
388 if (SUCCESS == zend_parse_parameters_none()) {
389 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
390
391 irc_disconnect(obj->sess);
392 }
393 }
394
395 PHP_METHOD(Session, run)
396 {
397 HashTable *ifds = NULL, *ofds = NULL;
398 double to = 0.25;
399
400 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|H!H!d", &ifds, &ofds, &to)) {
401 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
402
403 if ((ifds && zend_hash_num_elements(ifds)) || (ofds && zend_hash_num_elements(ofds))) {
404 struct timeval t;
405 fd_set i, o;
406 int m = 0;
407 zval **zfd, *zr, *zw;
408
409 FD_ZERO(&i);
410 FD_ZERO(&o);
411
412 if (0 != irc_add_select_descriptors(obj->sess, &i, &o, &m)) {
413 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
414 RETURN_FALSE;
415 }
416 if (ifds) {
417 for ( zend_hash_internal_pointer_reset(ifds);
418 SUCCESS == zend_hash_get_current_data(ifds, (void *) &zfd);
419 zend_hash_move_forward(ifds)
420 ) {
421 if (Z_TYPE_PP(zfd) == IS_RESOURCE) {
422 php_stream *s = NULL;
423 int fd = -1;
424
425 php_stream_from_zval_no_verify(s, zfd);
426
427 if (!s || SUCCESS != php_stream_cast(s, PHP_STREAM_AS_FD_FOR_SELECT, (void *) &fd, 1) || fd == -1) {
428 php_error_docref(NULL TSRMLS_CC, E_NOTICE, "invalid resource");
429 } else {
430 PHP_SAFE_FD_SET(fd, &i);
431 if (m < fd) {
432 m = fd;
433 }
434 }
435 }
436 }
437 }
438 if (ofds) {
439 for ( zend_hash_internal_pointer_reset(ofds);
440 SUCCESS == zend_hash_get_current_data(ofds, (void *) &zfd);
441 zend_hash_move_forward(ofds)
442 ) {
443 if (Z_TYPE_PP(zfd) == IS_RESOURCE) {
444 php_stream *s = NULL;
445 int fd = -1;
446
447 php_stream_from_zval_no_verify(s, zfd);
448
449 if (!s || SUCCESS != php_stream_cast(s, PHP_STREAM_AS_FD_FOR_SELECT|PHP_STREAM_CAST_INTERNAL, (void *) &fd, 1) || fd == -1) {
450 php_error_docref(NULL TSRMLS_CC, E_NOTICE, "invalid resource");
451 } else {
452 PHP_SAFE_FD_SET(fd, &o);
453 if (m < fd) {
454 m = fd;
455 }
456 }
457 }
458 }
459 }
460
461 PHP_SAFE_MAX_FD(m, m);
462
463 t.tv_sec = (time_t) to;
464 t.tv_usec = (suseconds_t) ((to - t.tv_sec) * 1000000.0);
465
466 if (0 > select(m + 1, &i, &o, NULL, &t) && errno != EINTR) {
467 php_error_docref(NULL TSRMLS_CC, E_WARNING, "select() error: %s", strerror(errno));
468 RETURN_FALSE;
469 }
470
471 if (0 != irc_process_select_descriptors(obj->sess, &i, &o)) {
472 int err = irc_errno(obj->sess);
473
474 if (err) {
475 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(err));
476 RETURN_FALSE;
477 }
478 }
479
480 array_init(return_value);
481 MAKE_STD_ZVAL(zr);
482 array_init(zr);
483 MAKE_STD_ZVAL(zw);
484 array_init(zw);
485
486 if (ifds) {
487 for ( zend_hash_internal_pointer_reset(ifds);
488 SUCCESS == zend_hash_get_current_data(ifds, (void *) &zfd);
489 zend_hash_move_forward(ifds)
490 ) {
491 if (Z_TYPE_PP(zfd) == IS_RESOURCE) {
492 php_stream *s = NULL;
493 int fd = -1;
494
495 php_stream_from_zval_no_verify(s, zfd);
496
497 if (s && SUCCESS == php_stream_cast(s, PHP_STREAM_AS_FD_FOR_SELECT|PHP_STREAM_CAST_INTERNAL, (void *) &fd, 1) && fd != -1) {
498 if (PHP_SAFE_FD_ISSET(fd, &i)) {
499 Z_ADDREF_PP(zfd);
500 add_next_index_zval(zr, *zfd);
501 }
502 }
503 }
504 }
505 }
506 if (ofds) {
507 for ( zend_hash_internal_pointer_reset(ofds);
508 SUCCESS == zend_hash_get_current_data(ofds, (void *) &zfd);
509 zend_hash_move_forward(ofds)
510 ) {
511 if (Z_TYPE_PP(zfd) == IS_RESOURCE) {
512 php_stream *s = NULL;
513 int fd = -1;
514
515 php_stream_from_zval_no_verify(s, zfd);
516
517 if (s && SUCCESS == php_stream_cast(s, PHP_STREAM_AS_FD_FOR_SELECT|PHP_STREAM_CAST_INTERNAL, (void *) &fd, 1) && fd != -1) {
518 if (PHP_SAFE_FD_ISSET(fd, &o)) {
519 Z_ADDREF_PP(zfd);
520 add_next_index_zval(zw, *zfd);
521 }
522 }
523 }
524 }
525 }
526
527 add_next_index_zval(return_value, zr);
528 add_next_index_zval(return_value, zw);
529
530 return;
531
532 } else {
533 if (0 != irc_run(obj->sess)) {
534 int err = irc_errno(obj->sess);
535
536 if (err) {
537 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(err));
538 RETURN_FALSE;
539 }
540 }
541 }
542
543 RETURN_TRUE;
544 }
545 }
546
547 PHP_METHOD(Session, setOption)
548 {
549 long opt;
550 zend_bool onoff = 1;
551
552 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l|b", &opt, &onoff)) {
553 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
554
555 if (onoff) {
556 irc_option_set(obj->sess, opt);
557 } else {
558 irc_option_reset(obj->sess, opt);
559 }
560 }
561 }
562
563 PHP_METHOD(Session, doJoin)
564 {
565 char *chan_str, *key_str = NULL;
566 int chan_len, key_len = 0;
567
568 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!", &chan_str, &chan_len, &key_str, &key_len)) {
569 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
570
571 if (0 != irc_cmd_join(obj->sess, chan_str, key_str)) {
572 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
573 RETVAL_FALSE;
574 } else {
575 RETVAL_TRUE;
576 }
577 }
578 }
579
580 PHP_METHOD(Session, doPart)
581 {
582 char *chan_str;
583 int chan_len;
584
585 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &chan_str, &chan_len)) {
586 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
587
588 if (0 != irc_cmd_part(obj->sess, chan_str)) {
589 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
590 RETVAL_FALSE;
591 } else {
592 RETVAL_TRUE;
593 }
594 }
595 }
596
597 PHP_METHOD(Session, doInvite)
598 {
599 char *chan_str, *nick_str;
600 int chan_len, nick_len;
601
602 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &nick_str, &nick_len, &chan_str, &chan_len)) {
603 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
604
605 if (0 != irc_cmd_invite(obj->sess, nick_str, chan_str)) {
606 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
607 RETVAL_FALSE;
608 } else {
609 RETVAL_TRUE;
610 }
611 }
612 }
613
614 PHP_METHOD(Session, doNames)
615 {
616 char *chan_str;
617 int chan_len;
618
619 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &chan_str, &chan_len)) {
620 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
621
622 if (0 != irc_cmd_names(obj->sess, chan_str)) {
623 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
624 RETVAL_FALSE;
625 } else {
626 RETVAL_TRUE;
627 }
628 }
629 }
630
631 PHP_METHOD(Session, doList)
632 {
633 char *chan_str;
634 int chan_len;
635
636 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &chan_str, &chan_len)) {
637 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
638
639 if (0 != irc_cmd_list(obj->sess, chan_str)) {
640 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
641 RETVAL_FALSE;
642 } else {
643 RETVAL_TRUE;
644 }
645 }
646 }
647
648 PHP_METHOD(Session, doTopic)
649 {
650 char *chan_str, *topic_str = NULL;
651 int chan_len, topic_len;
652
653 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!", &chan_str, &chan_len, &topic_str, &topic_len)) {
654 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
655
656 if (0 != irc_cmd_topic(obj->sess, chan_str, topic_str)) {
657 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
658 RETVAL_FALSE;
659 } else {
660 RETVAL_TRUE;
661 }
662 }
663 }
664
665 PHP_METHOD(Session, doChannelMode)
666 {
667 char *chan_str, *mode_str = NULL;
668 int chan_len, mode_len;
669
670 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s|s!", &chan_str, &chan_len, &mode_str, &mode_len)) {
671 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
672
673 if (0 != irc_cmd_channel_mode(obj->sess, chan_str, mode_str)) {
674 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
675 RETVAL_FALSE;
676 } else {
677 RETVAL_TRUE;
678 }
679 }
680 }
681
682 PHP_METHOD(Session, doKick)
683 {
684 char *chan_str, *nick_str, *reason_str = NULL;
685 int chan_len, nick_len, reason_len;
686
687 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|s!", &nick_str, &nick_len, &chan_str, &chan_len, &reason_str, &reason_len)) {
688 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
689
690 if (0 != irc_cmd_kick(obj->sess, nick_str, chan_str, reason_str)) {
691 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
692 RETVAL_FALSE;
693 } else {
694 RETVAL_TRUE;
695 }
696 }
697 }
698
699 PHP_METHOD(Session, doMsg)
700 {
701 char *dest_str, *msg_str;
702 int dest_len, msg_len;
703
704 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &dest_str, &dest_len, &msg_str, &msg_len)) {
705 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
706
707 if (0 != irc_cmd_msg(obj->sess, dest_str, msg_str)) {
708 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
709 RETVAL_FALSE;
710 } else {
711 RETVAL_TRUE;
712 }
713 }
714 }
715
716 PHP_METHOD(Session, doMe)
717 {
718 char *dest_str, *msg_str;
719 int dest_len, msg_len;
720
721 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &dest_str, &dest_len, &msg_str, &msg_len)) {
722 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
723
724 if (0 != irc_cmd_me(obj->sess, dest_str, msg_str)) {
725 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
726 RETVAL_FALSE;
727 } else {
728 RETVAL_TRUE;
729 }
730 }
731 }
732
733 PHP_METHOD(Session, doNotice)
734 {
735 char *dest_str, *msg_str;
736 int dest_len, msg_len;
737
738 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &dest_str, &dest_len, &msg_str, &msg_len)) {
739 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
740
741 if (0 != irc_cmd_notice(obj->sess, dest_str, msg_str)) {
742 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
743 RETVAL_FALSE;
744 } else {
745 RETVAL_TRUE;
746 }
747 }
748 }
749
750 PHP_METHOD(Session, doQuit)
751 {
752 char *reason_str = NULL;
753 int reason_len;
754
755 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!", &reason_str, &reason_len)) {
756 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
757
758 if (0 != irc_cmd_quit(obj->sess, reason_str)) {
759 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
760 RETVAL_FALSE;
761 } else {
762 RETVAL_TRUE;
763 }
764 }
765 }
766
767 PHP_METHOD(Session, doUserMode)
768 {
769 char *mode_str = NULL;
770 int mode_len;
771
772 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!", &mode_str, &mode_len)) {
773 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
774
775 if (0 != irc_cmd_user_mode(obj->sess, mode_str)) {
776 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
777 RETVAL_FALSE;
778 } else {
779 RETVAL_TRUE;
780 }
781 }
782 }
783
784 PHP_METHOD(Session, doNick)
785 {
786 char *nick_str;
787 int nick_len;
788
789 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &nick_str, &nick_len)) {
790 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
791
792 if (0 != irc_cmd_nick(obj->sess, nick_str)) {
793 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
794 RETVAL_FALSE;
795 } else {
796 RETVAL_TRUE;
797 }
798 }
799 }
800
801 PHP_METHOD(Session, doWhois)
802 {
803 char *nick_str = NULL;
804 int nick_len;
805
806 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s!", &nick_str, &nick_len)) {
807 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
808
809 if (0 != irc_cmd_whois(obj->sess, nick_str)) {
810 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
811 RETVAL_FALSE;
812 } else {
813 RETVAL_TRUE;
814 }
815 }
816 }
817
818 PHP_METHOD(Session, doCtcpReply)
819 {
820 char *nick_str, *reply_str;
821 int nick_len, reply_len;
822
823 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &nick_str, &nick_len, &reply_str, &reply_len)) {
824 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
825
826 if (0 != irc_cmd_ctcp_reply(obj->sess, nick_str, reply_str)) {
827 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
828 RETVAL_FALSE;
829 } else {
830 RETVAL_TRUE;
831 }
832 }
833 }
834
835 PHP_METHOD(Session, doCtcpRequest)
836 {
837 char *nick_str, *request_str;
838 int nick_len, request_len;
839
840 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &nick_str, &nick_len, &request_str, &request_len)) {
841 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
842
843 if (0 != irc_cmd_ctcp_request(obj->sess, nick_str, request_str)) {
844 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
845 RETVAL_FALSE;
846 } else {
847 RETVAL_TRUE;
848 }
849 }
850 }
851
852 PHP_METHOD(Session, doRaw)
853 {
854 char *msg_str;
855 int msg_len;
856
857 if (SUCCESS == zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &msg_str, &msg_len)) {
858 php_ircclient_session_object_t *obj = zend_object_store_get_object(getThis() TSRMLS_CC);
859
860 if (0 != irc_send_raw(obj->sess, "%.*s", msg_len, msg_str)) {
861 php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", irc_strerror(irc_errno(obj->sess)));
862 RETVAL_FALSE;
863 } else {
864 RETVAL_TRUE;
865 }
866 }
867 }
868
869 PHP_METHOD(Session, onConnect) {}
870 PHP_METHOD(Session, onNick) {}
871 PHP_METHOD(Session, onQuit) {}
872 PHP_METHOD(Session, onJoin) {}
873 PHP_METHOD(Session, onPart) {}
874 PHP_METHOD(Session, onMode) {}
875 PHP_METHOD(Session, onUmode) {}
876 PHP_METHOD(Session, onTopic) {}
877 PHP_METHOD(Session, onKick) {}
878 PHP_METHOD(Session, onChannel) {}
879 PHP_METHOD(Session, onPrivmsg) {}
880 PHP_METHOD(Session, onNotice) {}
881 PHP_METHOD(Session, onChannelNotice) {}
882 PHP_METHOD(Session, onInvite) {}
883 PHP_METHOD(Session, onCtcpReq) {}
884 PHP_METHOD(Session, onCtcpRep) {}
885 PHP_METHOD(Session, onAction) {}
886 PHP_METHOD(Session, onUnknown) {}
887 PHP_METHOD(Session, onNumeric) {}
888 PHP_METHOD(Session, onDccChatReq) {}
889 PHP_METHOD(Session, onDccSendReq) {}
890 PHP_METHOD(Session, onError) {}
891
892 #define ME(m) PHP_ME(Session, m, NULL, ZEND_ACC_PUBLIC)
893
894 zend_function_entry php_ircclient_session_method_entry[] = {
895 ME(__construct)
896 ME(doConnect)
897 ME(isConnected)
898 ME(disconnect)
899 ME(run)
900 ME(setOption)
901
902 ME(doJoin)
903 ME(doPart)
904 ME(doInvite)
905 ME(doNames)
906 ME(doList)
907 ME(doTopic)
908 ME(doChannelMode)
909 ME(doKick)
910
911 ME(doMsg)
912 ME(doMe)
913 ME(doNotice)
914
915 ME(doQuit)
916 ME(doUserMode)
917 ME(doNick)
918 ME(doWhois)
919
920 ME(doCtcpReply)
921 ME(doCtcpRequest)
922
923 ME(doRaw)
924
925 ME(onConnect)
926 ME(onNick)
927 ME(onQuit)
928 ME(onJoin)
929 ME(onPart)
930 ME(onMode)
931 ME(onUmode)
932 ME(onTopic)
933 ME(onKick)
934 ME(onChannel)
935 ME(onPrivmsg)
936 ME(onNotice)
937 ME(onChannelNotice)
938 ME(onInvite)
939 ME(onCtcpReq)
940 ME(onCtcpRep)
941 ME(onAction)
942 ME(onUnknown)
943 ME(onNumeric)
944 ME(onDccChatReq)
945 ME(onDccSendReq)
946 ME(onError)
947 {0}
948 };
949
950 PHP_MINIT_FUNCTION(ircclient)
951 {
952 zend_class_entry ce;
953
954 memset(&ce, 0, sizeof(zend_class_entry));
955 INIT_NS_CLASS_ENTRY(ce, "irc\\client", "Session", php_ircclient_session_method_entry);
956 ce.create_object = php_ircclient_session_object_create;
957 php_ircclient_session_class_entry = zend_register_internal_class_ex(&ce, NULL, NULL TSRMLS_CC);
958
959 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("nick"), ZEND_ACC_PUBLIC TSRMLS_CC);
960 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("user"), ZEND_ACC_PUBLIC TSRMLS_CC);
961 zend_declare_property_null(php_ircclient_session_class_entry, ZEND_STRL("real"), ZEND_ACC_PUBLIC TSRMLS_CC);
962
963 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_WELCOME", 001, CONST_CS|CONST_PERSISTENT);
964 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_YOURHOST", 002, CONST_CS|CONST_PERSISTENT);
965 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_CREATED", 003, CONST_CS|CONST_PERSISTENT);
966 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_MYINFO", 004, CONST_CS|CONST_PERSISTENT);
967 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_BOUNCE", 005, CONST_CS|CONST_PERSISTENT);
968 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_USERHOST", 302, CONST_CS|CONST_PERSISTENT);
969 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ISON", 303, CONST_CS|CONST_PERSISTENT);
970 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_AWAY", 301, CONST_CS|CONST_PERSISTENT);
971 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_UNAWAY", 305, CONST_CS|CONST_PERSISTENT);
972 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_NOWAWAY", 306, CONST_CS|CONST_PERSISTENT);
973 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_WHOISUSER", 311, CONST_CS|CONST_PERSISTENT);
974 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_WHOISSERVER", 312, CONST_CS|CONST_PERSISTENT);
975 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_WHOISOPERATOR", 313, CONST_CS|CONST_PERSISTENT);
976 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_WHOISIDLE", 317, CONST_CS|CONST_PERSISTENT);
977 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFWHOIS", 318, CONST_CS|CONST_PERSISTENT);
978 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_WHOISCHANNELS", 319, CONST_CS|CONST_PERSISTENT);
979 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_WHOWASUSER", 314, CONST_CS|CONST_PERSISTENT);
980 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFWHOWAS", 369, CONST_CS|CONST_PERSISTENT);
981 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_LIST", 322, CONST_CS|CONST_PERSISTENT);
982 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_LISTEND", 323, CONST_CS|CONST_PERSISTENT);
983 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_UNIQOPIS", 325, CONST_CS|CONST_PERSISTENT);
984 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_CHANNELMODEIS", 324, CONST_CS|CONST_PERSISTENT);
985 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_NOTOPIC", 331, CONST_CS|CONST_PERSISTENT);
986 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TOPIC", 332, CONST_CS|CONST_PERSISTENT);
987 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_INVITING", 341, CONST_CS|CONST_PERSISTENT);
988 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_SUMMONING", 342, CONST_CS|CONST_PERSISTENT);
989 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_INVITELIST", 346, CONST_CS|CONST_PERSISTENT);
990 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFINVITELIST", 347, CONST_CS|CONST_PERSISTENT);
991 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_EXCEPTLIST", 348, CONST_CS|CONST_PERSISTENT);
992 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFEXCEPTLIST", 349, CONST_CS|CONST_PERSISTENT);
993 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_VERSION", 351, CONST_CS|CONST_PERSISTENT);
994 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_WHOREPLY", 352, CONST_CS|CONST_PERSISTENT);
995 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFWHO", 315, CONST_CS|CONST_PERSISTENT);
996 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_NAMREPLY", 353, CONST_CS|CONST_PERSISTENT);
997 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFNAMES", 366, CONST_CS|CONST_PERSISTENT);
998 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_LINKS", 364, CONST_CS|CONST_PERSISTENT);
999 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFLINKS", 365, CONST_CS|CONST_PERSISTENT);
1000 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_BANLIST", 367, CONST_CS|CONST_PERSISTENT);
1001 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFBANLIST", 368, CONST_CS|CONST_PERSISTENT);
1002 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_INFO", 371, CONST_CS|CONST_PERSISTENT);
1003 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFINFO", 374, CONST_CS|CONST_PERSISTENT);
1004 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_MOTDSTART", 375, CONST_CS|CONST_PERSISTENT);
1005 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_MOTD", 372, CONST_CS|CONST_PERSISTENT);
1006 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFMOTD", 376, CONST_CS|CONST_PERSISTENT);
1007 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_YOUREOPER", 381, CONST_CS|CONST_PERSISTENT);
1008 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_REHASHING", 382, CONST_CS|CONST_PERSISTENT);
1009 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_YOURESERVICE", 383, CONST_CS|CONST_PERSISTENT);
1010 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TIME", 391, CONST_CS|CONST_PERSISTENT);
1011 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_USERSSTART", 392, CONST_CS|CONST_PERSISTENT);
1012 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_USERS", 393, CONST_CS|CONST_PERSISTENT);
1013 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFUSERS", 394, CONST_CS|CONST_PERSISTENT);
1014 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_NOUSERS", 395, CONST_CS|CONST_PERSISTENT);
1015 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACELINK", 200, CONST_CS|CONST_PERSISTENT);
1016 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACECONNECTING", 201, CONST_CS|CONST_PERSISTENT);
1017 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACEHANDSHAKE", 202, CONST_CS|CONST_PERSISTENT);
1018 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACEUNKNOWN", 203, CONST_CS|CONST_PERSISTENT);
1019 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACEOPERATOR", 204, CONST_CS|CONST_PERSISTENT);
1020 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACEUSER", 205, CONST_CS|CONST_PERSISTENT);
1021 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACESERVER", 206, CONST_CS|CONST_PERSISTENT);
1022 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACESERVICE", 207, CONST_CS|CONST_PERSISTENT);
1023 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACENEWTYPE", 208, CONST_CS|CONST_PERSISTENT);
1024 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACECLASS", 209, CONST_CS|CONST_PERSISTENT);
1025 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACELOG", 261, CONST_CS|CONST_PERSISTENT);
1026 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRACEEND", 262, CONST_CS|CONST_PERSISTENT);
1027 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_STATSLINKINFO", 211, CONST_CS|CONST_PERSISTENT);
1028 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_STATSCOMMANDS", 212, CONST_CS|CONST_PERSISTENT);
1029 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ENDOFSTATS", 219, CONST_CS|CONST_PERSISTENT);
1030 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_STATSUPTIME", 242, CONST_CS|CONST_PERSISTENT);
1031 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_STATSOLINE", 243, CONST_CS|CONST_PERSISTENT);
1032 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_UMODEIS", 221, CONST_CS|CONST_PERSISTENT);
1033 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_SERVLIST", 234, CONST_CS|CONST_PERSISTENT);
1034 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_SERVLISTEND", 235, CONST_CS|CONST_PERSISTENT);
1035 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_LUSERCLIENT", 251, CONST_CS|CONST_PERSISTENT);
1036 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_LUSEROP", 252, CONST_CS|CONST_PERSISTENT);
1037 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_LUSERUNKNOWN", 253, CONST_CS|CONST_PERSISTENT);
1038 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_LUSERCHANNELS", 254, CONST_CS|CONST_PERSISTENT);
1039 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_LUSERME", 255, CONST_CS|CONST_PERSISTENT);
1040 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ADMINME", 256, CONST_CS|CONST_PERSISTENT);
1041 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ADMINLOC1", 257, CONST_CS|CONST_PERSISTENT);
1042 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ADMINLOC2", 258, CONST_CS|CONST_PERSISTENT);
1043 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_ADMINEMAIL", 259, CONST_CS|CONST_PERSISTENT);
1044 REGISTER_NS_LONG_CONSTANT("irc\\client", "RPL_TRYAGAIN", 263, CONST_CS|CONST_PERSISTENT);
1045 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOSUCHNICK", 401, CONST_CS|CONST_PERSISTENT);
1046 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOSUCHSERVER", 402, CONST_CS|CONST_PERSISTENT);
1047 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOSUCHCHANNEL", 403, CONST_CS|CONST_PERSISTENT);
1048 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_CANNOTSENDTOCHAN", 404, CONST_CS|CONST_PERSISTENT);
1049 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_TOOMANYCHANNELS", 405, CONST_CS|CONST_PERSISTENT);
1050 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_WASNOSUCHNICK", 406, CONST_CS|CONST_PERSISTENT);
1051 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_TOOMANYTARGETS", 407, CONST_CS|CONST_PERSISTENT);
1052 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOSUCHSERVICE", 408, CONST_CS|CONST_PERSISTENT);
1053 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOORIGIN", 409, CONST_CS|CONST_PERSISTENT);
1054 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NORECIPIENT", 411, CONST_CS|CONST_PERSISTENT);
1055 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOTEXTTOSEND", 412, CONST_CS|CONST_PERSISTENT);
1056 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOTOPLEVEL", 413, CONST_CS|CONST_PERSISTENT);
1057 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_WILDTOPLEVEL", 414, CONST_CS|CONST_PERSISTENT);
1058 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_BADMASK", 415, CONST_CS|CONST_PERSISTENT);
1059 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_UNKNOWNCOMMAND", 421, CONST_CS|CONST_PERSISTENT);
1060 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOMOTD", 422, CONST_CS|CONST_PERSISTENT);
1061 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOADMININFO", 423, CONST_CS|CONST_PERSISTENT);
1062 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_FILEERROR", 424, CONST_CS|CONST_PERSISTENT);
1063 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NONICKNAMEGIVEN", 431, CONST_CS|CONST_PERSISTENT);
1064 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_ERRONEUSNICKNAME", 432, CONST_CS|CONST_PERSISTENT);
1065 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NICKNAMEINUSE", 433, CONST_CS|CONST_PERSISTENT);
1066 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NICKCOLLISION", 436, CONST_CS|CONST_PERSISTENT);
1067 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_UNAVAILRESOURCE", 437, CONST_CS|CONST_PERSISTENT);
1068 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_USERNOTINCHANNEL", 441, CONST_CS|CONST_PERSISTENT);
1069 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOTONCHANNEL", 442, CONST_CS|CONST_PERSISTENT);
1070 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_USERONCHANNEL", 443, CONST_CS|CONST_PERSISTENT);
1071 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOLOGIN", 444, CONST_CS|CONST_PERSISTENT);
1072 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_SUMMONDISABLED", 445, CONST_CS|CONST_PERSISTENT);
1073 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_USERSDISABLED", 446, CONST_CS|CONST_PERSISTENT);
1074 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOTREGISTERED", 451, CONST_CS|CONST_PERSISTENT);
1075 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NEEDMOREPARAMS", 461, CONST_CS|CONST_PERSISTENT);
1076 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_ALREADYREGISTRED", 462, CONST_CS|CONST_PERSISTENT);
1077 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOPERMFORHOST", 463, CONST_CS|CONST_PERSISTENT);
1078 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_PASSWDMISMATCH", 464, CONST_CS|CONST_PERSISTENT);
1079 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_YOUREBANNEDCREEP", 465, CONST_CS|CONST_PERSISTENT);
1080 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_YOUWILLBEBANNED", 466, CONST_CS|CONST_PERSISTENT);
1081 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_KEYSET", 467, CONST_CS|CONST_PERSISTENT);
1082 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_CHANNELISFULL", 471, CONST_CS|CONST_PERSISTENT);
1083 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_UNKNOWNMODE", 472, CONST_CS|CONST_PERSISTENT);
1084 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_INVITEONLYCHAN", 473, CONST_CS|CONST_PERSISTENT);
1085 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_BANNEDFROMCHAN", 474, CONST_CS|CONST_PERSISTENT);
1086 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_BADCHANNELKEY", 475, CONST_CS|CONST_PERSISTENT);
1087 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_BADCHANMASK", 476, CONST_CS|CONST_PERSISTENT);
1088 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOCHANMODES", 477, CONST_CS|CONST_PERSISTENT);
1089 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_BANLISTFULL", 478, CONST_CS|CONST_PERSISTENT);
1090 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOPRIVILEGES", 481, CONST_CS|CONST_PERSISTENT);
1091 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_CHANOPRIVSNEEDED", 482, CONST_CS|CONST_PERSISTENT);
1092 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_CANTKILLSERVER", 483, CONST_CS|CONST_PERSISTENT);
1093 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_RESTRICTED", 484, CONST_CS|CONST_PERSISTENT);
1094 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_UNIQOPPRIVSNEEDED", 485, CONST_CS|CONST_PERSISTENT);
1095 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_NOOPERHOST", 491, CONST_CS|CONST_PERSISTENT);
1096 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_UMODEUNKNOWNFLAG", 501, CONST_CS|CONST_PERSISTENT);
1097 REGISTER_NS_LONG_CONSTANT("irc\\client", "ERR_USERSDONTMATCH", 502, CONST_CS|CONST_PERSISTENT);
1098
1099 return SUCCESS;
1100 }
1101
1102 PHP_MINFO_FUNCTION(ircclient)
1103 {
1104 unsigned int high, low;
1105 char *version[2];
1106
1107 irc_get_version(&high, &low);
1108 spprintf(&version[1], 0, "%u.%u", high, low);
1109 spprintf(&version[0], 0, "%u.%u", PHP_IRCCLIENT_LIBIRCCLIENT_VERSION_HIGH, PHP_IRCCLIENT_LIBIRCCLIENT_VERSION_LOW);
1110
1111 php_info_print_table_start();
1112 php_info_print_table_header(2, "IRC client support", "enabled");
1113 php_info_print_table_row(2, "Version", PHP_IRCCLIENT_VERSION);
1114 php_info_print_table_end();
1115
1116 php_info_print_table_start();
1117 php_info_print_table_header(3, "Used Library", "compiled", "linked");
1118 php_info_print_table_row(3,
1119 "libircclient",
1120 version[0],
1121 version[1]
1122 );
1123 php_info_print_table_end();
1124
1125 efree(version[0]);
1126 efree(version[1]);
1127 }
1128
1129
1130
1131
1132