|
- /*
- * Copyright (C) 2004-2012 George Yunaev gyunaev@ulduzsoft.com
- *
- * This library is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 3 of the License, or (at your
- * option) any later version.
- *
- * This library is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
- * License for more details.
- */
-
- static void libirc_add_to_set (int fd, fd_set *set, int * maxfd)
- {
- FD_SET (fd, set);
-
- if ( *maxfd < fd )
- *maxfd = fd;
- }
-
- #if defined (ENABLE_DEBUG)
- static void libirc_dump_data (const char * prefix, const char * buf, unsigned int length)
- {
- printf ("%s: ", prefix);
- for ( ; length > 0; length -- )
- printf ("%c", *buf++);
- }
- #endif
-
-
- /*
- * Finds a separator (\x0D\x0A), which separates two lines.
- */
- static int libirc_findcrlf (const char * buf, int length)
- {
- int offset = 0;
- for ( ; offset < length; offset++ )
- {
- if ( buf[offset] == 0x0D && offset < length - 1 && buf[offset+1] == 0x0A )
- return offset;
- if ( buf[offset] == 0x0A)
- return offset;
- }
-
- return 0;
- }
-
- static int libirc_findcrlf_offset(const char *buf, int offset, const int length)
- {
- for(; offset < length; offset++)
- {
- if(buf[offset] != 0x0D && buf[offset] != 0x0A)
- {
- break;
- }
- }
- return offset;
- }
-
- static int libirc_findcrorlf (char * buf, int length)
- {
- int offset = 0;
- for ( ; offset < length; offset++ )
- {
- if ( buf[offset] == 0x0D || buf[offset] == 0x0A )
- {
- buf[offset++] = '\0';
-
- if ( offset < (length - 1)
- && (buf[offset] == 0x0D || buf[offset] == 0x0A) )
- offset++;
-
- return offset;
- }
- }
-
- return 0;
- }
-
-
- static void libirc_event_ctcp_internal (irc_session_t * session, const char * event, const char * origin, const char ** params, unsigned int count)
- {
- (void)event;
- (void)count;
-
- if ( origin )
- {
- char nickbuf[128], textbuf[256];
- irc_target_get_nick (origin, nickbuf, sizeof(nickbuf));
-
- if ( strstr (params[0], "PING") == params[0] )
- irc_cmd_ctcp_reply (session, nickbuf, params[0]);
- else if ( !strcmp (params[0], "VERSION") )
- {
- if ( !session->ctcp_version )
- {
- unsigned int high, low;
- irc_get_version (&high, &low);
-
- snprintf (textbuf, sizeof (textbuf), "VERSION libircclient by Georgy Yunaev ver.%d.%d", high, low);
- }
- else
- snprintf (textbuf, sizeof (textbuf), "VERSION %s", session->ctcp_version);
-
- irc_cmd_ctcp_reply (session, nickbuf, textbuf);
- }
- else if ( !strcmp (params[0], "FINGER") )
- {
- sprintf (textbuf, "FINGER %s (%s) Idle 0 seconds",
- session->username ? session->username : "nobody",
- session->realname ? session->realname : "noname");
-
- irc_cmd_ctcp_reply (session, nickbuf, textbuf);
- }
- else if ( !strcmp (params[0], "TIME") )
- {
- time_t now = time(0);
-
- #if defined (ENABLE_THREADS) && defined (HAVE_LOCALTIME_R)
- struct tm tmtmp, *ltime = localtime_r (&now, &tmtmp);
- #else
- struct tm * ltime = localtime (&now);
- #endif
- strftime (textbuf, sizeof(textbuf), "%a %b %d %H:%M:%S %Z %Y", ltime);
- irc_cmd_ctcp_reply (session, nickbuf, textbuf);
- }
- }
- }
|