mirror of
https://github.com/VCMP-SqMod/SqMod.git
synced 2024-11-14 03:37:16 +01:00
131 lines
3.2 KiB
C
131 lines
3.2 KiB
C
|
/*
|
||
|
* 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);
|
||
|
}
|
||
|
}
|
||
|
}
|