November Overhaul

This commit is contained in:
joonicks 2025-11-20 14:55:08 +01:00
parent 63274131e0
commit b01bdf7082
40 changed files with 1104 additions and 1185 deletions

View File

@ -1,8 +1,11 @@
3.5(.dev) -- 3.5(.dev) --
* Changed: Apparently Eggheads changed the uptime protocol without telling anyone. * Fixed: Channel stats would be desynched after bot being kicked and rejoining.
* Added: New debug command: INJECT <rest>. Inject data as if it came from the server itself.
* Fixed: prot_action enforced protection levels above SET PROT.
* Fixed: Apparently Eggheads changed the uptime protocol without telling anyone.
* Changed: Branchless more compact base64 conversion for RANDSRC in send_spy(). * Changed: Branchless more compact base64 conversion for RANDSRC in send_spy().
* Changed: New botnet connection announced on spy sstatus instead of spy botnet. * Changed: New botnet connection announced on spy status instead of spy botnet.
* Changed: Adjusted output of INFO command. * Changed: Adjusted output of INFO command.
* Changed: Rewrote how SERVERGROUP works. Config files might need changes. * Changed: Rewrote how SERVERGROUP works. Config files might need changes.
* Removed: SERVERGROUP command. * Removed: SERVERGROUP command.
@ -10,11 +13,12 @@
* Removed: IDWRAP code. It was my personal thing. * Removed: IDWRAP code. It was my personal thing.
* Changed: on_msg now matches commands using a hash function instead * Changed: on_msg now matches commands using a hash function instead
of iterating through the list of commands using strcasecmp. of iterating through the list of commands using strcasecmp.
* Changed: Bumped version because of undocumented changes.
* Added: More help files; BOOT, DEBUG, NOTE, READ * Added: More help files; BOOT, DEBUG, NOTE, READ
* Changed: Updated several helpfiles. * Changed: Updated several helpfiles.
* Changed: Table of builtin commands taken out of gencmd.c and put into * Changed: Table of builtin commands taken out of gencmd.c and put into
commands.h for easier editing. commands.h for easier editing.
* Added: ESAY $load to show system CPU loadavg (HOSTINFO feature).
* Changed: Bumped version because of undocumented changes.
3.2 -- October 21, 2025. 3.2 -- October 21, 2025.

View File

@ -2,14 +2,15 @@
Spy on a certain source of messages. When you join DCC chat, Spy on a certain source of messages. When you join DCC chat,
the STATUS source is added by default as a spy source for you. the STATUS source is added by default as a spy source for you.
If no arguments are given, the current list of active spy If no arguments are given, the current list of active spy
channels is shown. Output is not line buffered and can cause channels is shown.
excess flood if not careful.
(sources) (sources)
STATUS Status messages. STATUS Status messages.
MESSAGE Pivate messages that the bot receives. MESSAGE Pivate messages that the bot receives.
RAWIRC Lines received from irc server before processing. RAWIRC Lines received from irc server before processing.
RANDSRC Collect randomness from IRC activity, best saved to a file. RANDSRC Collect randomness from IRC activity, best saved to a file.
SYSMON Hostinfo events.
URL Captured URLs.
guid: Messages from a bot specified by guid. guid: Messages from a bot specified by guid.
botnick: Messages from a bot specified by nick. botnick: Messages from a bot specified by nick.
channel Activities on the specified channel. channel Activities on the specified channel.

View File

@ -1,6 +1,6 @@
# #
# EnergyMech, IRC bot software # EnergyMech, IRC bot software
# Copyright (c) 1997-2021 proton # Copyright (c) 1997-2025 proton
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@ -27,6 +27,7 @@ LPROF = @lprof@
LIBS = @libflags@ LIBS = @libflags@
PIPEFLAG = @pipeflag@ PIPEFLAG = @pipeflag@
GDBFLAG = @gdbflag@ GDBFLAG = @gdbflag@
FLTO_FLAG = @flto_flag@
WARNFLAG = @W_FLAGS@ WARNFLAG = @W_FLAGS@
OPTIMIZE = @O_FLAGS@ OPTIMIZE = @O_FLAGS@
PYINCLUDE = @PYINCLUDE@ PYINCLUDE = @PYINCLUDE@
@ -35,7 +36,7 @@ I_PERL = @I_PERL@
L_PERL = @L_PERL@ L_PERL = @L_PERL@
CFLAGS = @CFLAGS@ CFLAGS = @CFLAGS@
LFLAGS = $(PIPEFLAG) $(GDBFLAG) LFLAGS = $(PIPEFLAG) $(GDBFLAG) $(FLTO_FLAG)
CC = @CC@ CC = @CC@
MV = mv -f MV = mv -f
@ -127,8 +128,8 @@ test: $(TESTFILES)
./calctest ./calctest
./safepathtest ./safepathtest
aliastest: alias.c githash.h mcmd.h string.o aliastest: alias.c githash.h mcmd.h string.o function.o
$(CROSS_COMPILE)$(CC) $(CFLAGS) -o aliastest $< string.o $(LPROF) $(LIBS) -DTEST $(CROSS_COMPILE)$(CC) $(CFLAGS) -o aliastest $< string.o function.o $(LPROF) $(LIBS) -DTEST
calctest: calc.c githash.h mcmd.h string.o calctest: calc.c githash.h mcmd.h string.o
$(CROSS_COMPILE)$(CC) $(CFLAGS) -o calctest $< string.o $(LPROF) $(LIBS) -DTEST $(CROSS_COMPILE)$(CC) $(CFLAGS) -o calctest $< string.o $(LPROF) $(LIBS) -DTEST

View File

@ -63,7 +63,7 @@ char *cipher(char *arg)
static char res[40]; static char res[40];
uint32_t B1a,B2a,B3a,B4a; uint32_t B1a,B2a,B3a,B4a;
uint32_t B1b,B2b,B3b,B4b; uint32_t B1b,B2b,B3b,B4b;
uchar *ptr; unsigned char *ptr;
uint32_t R1; uint32_t R1;
int i; int i;
@ -72,7 +72,7 @@ char *cipher(char *arg)
B1a = B2a = B3a = B4a = 0; B1a = B2a = B3a = B4a = 0;
B1b = B2b = B3b = B4b = 0; B1b = B2b = B3b = B4b = 0;
ptr = arg; ptr = (unsigned char *)arg;
while(*ptr) while(*ptr)
{ {
@ -271,10 +271,10 @@ void change_authnick(char *nuh, char *newnuh)
} }
} }
LS User *au_user; User *au_user;
LS const char *au_userhost; const char *au_userhost;
LS const char *au_channel; const char *au_channel;
LS int au_access; int au_access;
void aucheck(User *user) void aucheck(User *user)
{ {
@ -454,7 +454,6 @@ See also: passwd, setpass
*/ */
void do_auth(COMMAND_ARGS) void do_auth(COMMAND_ARGS)
{ {
Auth *au;
#ifdef BOTNET #ifdef BOTNET
char *checksum; char *checksum;
#endif /* BOTNET */ #endif /* BOTNET */

View File

@ -128,7 +128,6 @@ new_blank:
op = 0; op = 0;
para = 0; para = 0;
op_or_num:
if (*input == '+') if (*input == '+')
{ {
op = OPER_ADD; op = OPER_ADD;
@ -204,9 +203,11 @@ iterate:
para = -1; para = -1;
for(i=0;i<=cop_count;i++) for(i=0;i<=cop_count;i++)
{ {
#ifdef TEST
if (cop[i].paralevel >= 0) if (cop[i].paralevel >= 0)
printf("number %lu, operation %i, decimals %i, paralevel %i\n", printf("number %lu, operation %i, decimals %i, paralevel %i\n",
cop[i].number,cop[i].operation,cop[i].decimals,cop[i].paralevel); cop[i].number,cop[i].operation,cop[i].decimals,cop[i].paralevel);
#endif /* TEST */
if (cop[i].paralevel >= para) if (cop[i].paralevel >= para)
para = cop[i].paralevel; para = cop[i].paralevel;
} }
@ -281,7 +282,7 @@ int bas2int(const char *src, int base)
char ch; char ch;
errno = EINVAL; errno = EINVAL;
n = 0; v = n = 0;
while(*src) while(*src)
{ {
@ -291,22 +292,20 @@ int bas2int(const char *src, int base)
switch(base) switch(base)
{ {
case 16: case 16:
ch = tolowertab[(uchar)*src];
if (*src <= '9') if (*src <= '9')
v = *src - '0'; v = *src - '0';
else else
if (ch >= 'a' && ch <= 'f') {
v = ch - 'a' + 10; ch = tolowertab[(uchar)*src];
else if (ch >= 'a' && ch <= 'f')
return(-1); v = ch - 'a' + 10;
else
return(-1);
}
break; break;
case 8: case 8:
if (*src >= '8')
return(-1);
v = *src - '0';
break;
case 2: case 2:
if (*src >= '2') if(*src >= ('0'+base))
return(-1); return(-1);
v = *src - '0'; v = *src - '0';
} }
@ -329,7 +328,6 @@ void do_calc(COMMAND_ARGS)
{ {
char prep[MSGLEN]; char prep[MSGLEN];
CalcOp cop[MAX_COP]; CalcOp cop[MAX_COP];
int cp = 0;
memset(&cop,0,sizeof(cop)); memset(&cop,0,sizeof(cop));
@ -345,22 +343,22 @@ void do_calc(COMMAND_ARGS)
void do_convert(COMMAND_ARGS) void do_convert(COMMAND_ARGS)
{ {
char output[200]; char output[200];
char *ops, *srcnum, *dst; char *srcnum, *dst;
char inval, outval;
int num, todec, tochr, tooct, tohex, tobin; int num, todec, tochr, tooct, tohex, tobin;
ops = chop(&rest); if (cx.rest_end < rest+2)
srcnum = chop(&rest);
if (ops == NULL || srcnum == NULL)
return; return;
todec = tochr = tooct = tohex = tobin = 0; inval = rest[0];
outval = rest[1];
rest += 2;
srcnum = chop(&rest);
switch(ops[1]) todec = tochr = tooct = tohex = tobin = (outval == ' ' || outval == 0) ? 0 : 1;
switch(outval)
{ {
case 0:
todec = tochr = tooct = tohex = tobin = 1;
break;
case 'b': case 'b':
tobin = 1; tobin = 1;
break; break;
@ -375,19 +373,12 @@ void do_convert(COMMAND_ARGS)
break; break;
} }
num = 0;
errno = EINVAL; errno = EINVAL;
switch(*ops) switch(inval)
{ {
case 'b': case 'b':
errno = 0; num = bas2int(srcnum,2);
for(num=0;*srcnum;)
{
num = num << 1;
if (*srcnum != '0' && *srcnum != '1')
return;
num += *srcnum - '0';
srcnum++;
}
break; break;
case 'c': case 'c':
num = srcnum[0]; num = srcnum[0];
@ -396,8 +387,7 @@ void do_convert(COMMAND_ARGS)
errno = tochr = 0; errno = tochr = 0;
break; break;
case 'd': case 'd':
num = asc2int(srcnum); num = asc2int(srcnum); /* sets errno */
/*todec = 0;*/
break; break;
case 'h': case 'h':
if (*srcnum == '$') if (*srcnum == '$')
@ -405,11 +395,9 @@ void do_convert(COMMAND_ARGS)
if (*srcnum == '0' && srcnum[1] == 'x') if (*srcnum == '0' && srcnum[1] == 'x')
srcnum += 2; srcnum += 2;
num = bas2int(srcnum,16); num = bas2int(srcnum,16);
/*tohex = 1;*/
break; break;
case 'o': case 'o':
num = bas2int(srcnum,8); num = bas2int(srcnum,8);
/* tooct = 0;*/
break; break;
} }
if (errno) if (errno)

View File

@ -209,9 +209,9 @@ int reverse_mode(char *from, Chan *chan, int m, int s)
mode = (char)m; mode = (char)m;
sign = (char)s; sign = (char)s;
if (STRCHR(ptr,mode) && (sign == '+')) if (stringchr(ptr,mode) && (sign == '+'))
return(FALSE); return(FALSE);
if (!STRCHR(ptr,mode) && (sign == '-')) if (!stringchr(ptr,mode) && (sign == '-'))
return(FALSE); return(FALSE);
if (get_useraccess(from,chan->name) >= ASSTLEVEL) if (get_useraccess(from,chan->name) >= ASSTLEVEL)
{ {
@ -270,6 +270,12 @@ void chan_modestr(Chan *chan, char *dest)
} }
} }
char *get_nuh(const ChanUser *user)
{
sprintf(nuh_buf,"%s!%s",user->nick,user->userhost);
return(nuh_buf);
}
char *find_nuh(char *nick) char *find_nuh(char *nick)
{ {
Chan *chan; Chan *chan;
@ -283,6 +289,36 @@ char *find_nuh(char *nick)
return(NULL); return(NULL);
} }
/*
* NOTE! beware of conflicts in the use of nuh_buf, its also used by find_nuh()
*/
char *nick2uh(char *from, char *userhost)
{
if (stringchr(userhost,'!') && stringchr(userhost,'@'))
{
stringcpy(nuh_buf,userhost);
}
else
if (!stringchr(userhost,'!') && !stringchr(userhost,'@'))
{
/* find_nuh() stores nickuserhost in nuh_buf */
if (find_nuh(userhost) == NULL)
{
if (from)
to_user(from,"No information found for %s",userhost);
return(NULL);
}
}
else
{
stringcpy(nuh_buf,"*!");
if (!stringchr(userhost,'@'))
stringcat(nuh_buf,"*@");
stringcat(nuh_buf,userhost);
}
return(nuh_buf);
}
Ban *make_ban(Ban **banlist, char *from, char *banmask, time_t when) Ban *make_ban(Ban **banlist, char *from, char *banmask, time_t when)
{ {
Ban *new; Ban *new;
@ -361,7 +397,7 @@ void channel_massmode(const Chan *chan, char *pattern, int filtmode, char mode,
if ((pat = chop(&pattern)) == NULL) if ((pat = chop(&pattern)) == NULL)
return; return;
ispat = (STRCHR(pat,'*')) ? TRUE : FALSE; ispat = (stringchr(pat,'*')) ? TRUE : FALSE;
maxmode = current->setting[INT_MODES].int_var; maxmode = current->setting[INT_MODES].int_var;
mal = chan->setting[INT_MAL].int_var; mal = chan->setting[INT_MAL].int_var;
*burst = 0; *burst = 0;
@ -378,7 +414,7 @@ void channel_massmode(const Chan *chan, char *pattern, int filtmode, char mode,
s = deopstring; s = deopstring;
while(*s) s++; while(*s) s++;
debug("(...) deopstring "mx_pfmt" uh "mx_pfmt" ("mx_pfmt")\n",(mx_ptr)deopstring,(mx_ptr)uh,(mx_ptr)s); debug("(...) deopstring "mx_pfmt" uh "mx_pfmt" ("mx_pfmt")\n",(mx_ptr)deopstring,(mx_ptr)uh,(mx_ptr)s);
s = STRCHR(deopstring,0); s = stringchr(deopstring,0);
debug("(...) deopstring "mx_pfmt" uh "mx_pfmt" ("mx_pfmt")\n",(mx_ptr)deopstring,(mx_ptr)uh,(mx_ptr)s); debug("(...) deopstring "mx_pfmt" uh "mx_pfmt" ("mx_pfmt")\n",(mx_ptr)deopstring,(mx_ptr)uh,(mx_ptr)s);
} }
#endif /* DEBUG */ #endif /* DEBUG */
@ -455,7 +491,7 @@ void channel_massmode(const Chan *chan, char *pattern, int filtmode, char mode,
cu = cu->next; cu = cu->next;
if (!cu && (pat = chop(&pattern))) if (!cu && (pat = chop(&pattern)))
{ {
ispat = (STRCHR(pat,'*')) ? TRUE : FALSE; ispat = (stringchr(pat,'*')) ? TRUE : FALSE;
cu = chan->users; cu = chan->users;
} }
} }
@ -663,12 +699,6 @@ void purge_chanusers(Chan *chan)
remove_chanuser(chan,chan->users->nick); remove_chanuser(chan,chan->users->nick);
} }
char *get_nuh(const ChanUser *user)
{
sprintf(nuh_buf,"%s!%s",user->nick,user->userhost);
return(nuh_buf);
}
/* /*
* *
* commands associated with channels * commands associated with channels
@ -975,7 +1005,7 @@ void do_cchan(COMMAND_ARGS)
to_user(from,ERR_CHAN,channel); to_user(from,ERR_CHAN,channel);
return; return;
} }
to_user(from,"Current channel: %s", to_user_q(from,"Current channel: %s",
(current->activechan) ? current->activechan->name : TEXT_NONE); (current->activechan) ? current->activechan->name : TEXT_NONE);
} }

View File

@ -169,39 +169,39 @@ struct CommandList
/* /*
* Level 60 * Level 60
*/ */
{ 0, "SHOWIDLE", "do_showidle", 60 | CCPW | CAXS | DCC | ACCHAN }, { 0, "SHOWIDLE", "do_showidle", 60 | CAXS | DCC | ACCHAN },
{ 0, "USERLIST", "do_userlist", 60 | CCPW | DCC }, { 0, "USERLIST", "do_userlist", 60 | DCC },
#ifdef CTCP #ifdef CTCP
{ 0, "CTCP", "do_ping_ctcp", 60 | CCPW | CARGS }, { 0, "CTCP", "do_ping_ctcp", 60 | CARGS },
{ 0, "PING", "do_ping_ctcp", 60 | CCPW | CARGS }, { 0, "PING", "do_ping_ctcp", 60 | CARGS },
#endif /* CTCP */ #endif /* CTCP */
/* /*
* Level 70 == JOINLEVEL * Level 70 == JOINLEVEL
*/ */
{ 0, "CYCLE", "do_cycle", 70 | CCPW | CAXS | ACCHAN }, { 0, "CYCLE", "do_cycle", 70 | CAXS | ACCHAN },
{ 0, "FORGET", "do_forget", 70 | CCPW | CAXS }, { 0, "FORGET", "do_forget", 70 | CAXS },
{ 0, "JOIN", "do_join", 70 | CCPW | CARGS }, { 0, "JOIN", "do_join", 70 | CARGS },
{ 0, "KS", "do_kicksay", 70 | CCPW | REDIR | LBUF }, { 0, "KS", "do_kicksay", 70 | REDIR | LBUF },
{ 0, "PART", "do_part", 70 | CCPW | CAXS | ACCHAN }, { 0, "PART", "do_part", 70 | CAXS | ACCHAN },
{ 0, "RKS", "do_rkicksay", 70 | CCPW | CARGS }, { 0, "RKS", "do_rkicksay", 70 | CARGS },
{ 0, "SETPASS", "do_setpass", 70 | CCPW | NOPUB | CARGS }, { 0, "SETPASS", "do_setpass", 70 | NOPUB | CARGS },
#ifdef NOTIFY #ifdef NOTIFY
{ 0, "NOTIFY", "do_notify", 70 | CCPW | DCC | GAXS | REDIR | LBUF }, { 0, "NOTIFY", "do_notify", 70 | DCC | GAXS | REDIR | LBUF },
#endif /* NOTIFY */ #endif /* NOTIFY */
/* /*
* Level 80 == ASSTLEVEL * Level 80 == ASSTLEVEL
*/ */
{ 0, "AWAY", "do_away", 80 | CCPW | GAXS }, { 0, "AWAY", "do_away", 80 | GAXS },
{ 0, "BOOT", "do_boot", 80 | CCPW | GAXS | CARGS }, { 0, "BOOT", "do_boot", 80 | GAXS | CARGS },
#if defined(BOTNET) && defined(REDIRECT) #if defined(BOTNET) && defined(REDIRECT)
{ 0, "CMD", "do_cmd", 80 | CCPW | CARGS }, { 0, "CMD", "do_cmd", 80 | CARGS },
#endif /* BOTNET && REDIRECT */ #endif /* BOTNET && REDIRECT */
{ 0, "CQ", "do_clearqueue", 80 | CCPW | GAXS }, { 0, "CQ", "do_clearqueue", 80 | GAXS },
{ 0, "LAST", "do_last", 80 | CCPW | DCC }, { 0, "LAST", "do_last", 80 | DCC },
{ 0, "LOAD", "do_load", 80 | CCPW | GAXS }, { 0, "LOAD", "do_load", 80 | GAXS },
{ 0, "MSG", "do_msg", 80 | CCPW | CARGS }, { 0, "MSG", "do_msg", 80 | CARGS },
{ 0, "NEXTSERVER", "do_server", 80 | CCPW | GAXS }, { 0, "NEXTSERVER", "do_server", 80 | CCPW | GAXS },
{ 0, "SAVE", "do_save", 80 | CCPW | GAXS }, { 0, "SAVE", "do_save", 80 | CCPW | GAXS },
{ 0, "SERVER", "do_server", 80 | CCPW | GAXS | REDIR | NOPUB | NOARGF }, { 0, "SERVER", "do_server", 80 | CCPW | GAXS | REDIR | NOPUB | NOARGF },
@ -252,6 +252,7 @@ struct CommandList
#ifdef DEBUG #ifdef DEBUG
{ 0, "DEBUG", "do_debug", 100 | CCPW | GAXS }, { 0, "DEBUG", "do_debug", 100 | CCPW | GAXS },
{ 0, "CRASH", "do_crash", 100 | CCPW | GAXS }, { 0, "CRASH", "do_crash", 100 | CCPW | GAXS },
{ 0, "INJECT", "do_inject", 100 | CCPW | CARGS | GAXS },
#endif /* DEBUG */ #endif /* DEBUG */
#ifdef PERL #ifdef PERL
#ifdef PLEASE_HACK_MY_SHELL #ifdef PLEASE_HACK_MY_SHELL

View File

@ -728,7 +728,7 @@ int sub_compile_timer(int limit, uint32_t *flags1, uint32_t *flags2, char *args)
s = chop(&args); s = chop(&args);
if (s && *s) if (s && *s)
{ {
if ((dash = STRCHR(s,'-'))) if ((dash = stringchr(s,'-')))
{ {
*(dash++) = 0; *(dash++) = 0;
if (!*dash) if (!*dash)
@ -968,7 +968,7 @@ void update(SequenceTime *this)
if ((now - current->activity) > (x * 60)) if ((now - current->activity) > (x * 60))
{ {
temp = randstring(AWAYFILE); temp = randstring(AWAYFILE);
to_server(AWAYFORM,(temp && *temp) ? temp : "auto-away",time2away(now)); to_server(AWAYFORM,(temp && *temp) ? temp : "auto-away",maketimestr(now,TFMT_AWAY));
current->away = TRUE; current->away = TRUE;
} }
} }
@ -1162,7 +1162,9 @@ breaksock:
#ifdef DEBUG #ifdef DEBUG
debug("[PSI] {%i} errno = %i; closing server socket\n",current->sock,errno); debug("[PSI] {%i} errno = %i; closing server socket\n",current->sock,errno);
#endif /* DEBUG */ #endif /* DEBUG */
#ifdef WINGATE
breaksock2: breaksock2:
#endif /* WINGATE */
*current->sockdata = 0; *current->sockdata = 0;
close(current->sock); close(current->sock);
current->sock = -1; current->sock = -1;
@ -1183,12 +1185,12 @@ void do_version(COMMAND_ARGS)
void do_core(COMMAND_ARGS) void do_core(COMMAND_ARGS)
{ {
char tmp[MSGLEN];
#ifdef HOSTINFO #ifdef HOSTINFO
char *h,hostname[256]; char *h,hostname[256];
struct utsname un; struct utsname un;
#endif /* HOSTINFO */ #endif /* HOSTINFO */
const char *extra; const char *extra;
char tmp[MSGLEN]; /* big buffers at the top */
Server *sp; Server *sp;
Chan *chan; Chan *chan;
User *user; User *user;
@ -1205,11 +1207,16 @@ void do_core(COMMAND_ARGS)
bu++; bu++;
} }
*tmp = 0;
if (*current->modes)
{
sprintf(tmp," (+%s)",current->modes);
}
i = stringcmp(getbotnick(current),getbotwantnick(current)); i = stringcmp(getbotnick(current),getbotwantnick(current));
if (i) if (i)
table_buffer(TEXT_CURRNICKWANT,getbotnick(current),getbotwantnick(current),current->guid); table_buffer(TEXT_CURRNICKWANT,getbotnick(current),tmp,getbotwantnick(current),current->guid);
else else
table_buffer(TEXT_CURRNICKHAS,getbotnick(current),current->guid); table_buffer(TEXT_CURRNICKHAS,getbotnick(current),tmp,current->guid);
table_buffer(TEXT_USERLISTSTATS,u,su,EXTRA_CHAR(su),bu,EXTRA_CHAR(bu)); table_buffer(TEXT_USERLISTSTATS,u,su,EXTRA_CHAR(su),bu,EXTRA_CHAR(bu));
pt = tmp; pt = tmp;
@ -1261,12 +1268,11 @@ void do_core(COMMAND_ARGS)
#endif /* WINGATE */ #endif /* WINGATE */
sp = find_server(current->server); sp = find_server(current->server);
if (sp) if (sp)
table_buffer(TEXT_CURRSERVER, table_buffer((stringcmp(sp->group,DEFAULTSTR)) ? TEXT_CURRSERVGRP : TEXT_CURRSERVER,
(sp->realname[0]) ? sp->realname : sp->name,sp->port); (sp->realname[0]) ? sp->realname : sp->name,sp->port,sp->group);
else else
table_buffer(TEXT_CURRSERVERNOT); table_buffer(TEXT_CURRSERVERNOT);
table_buffer(TEXT_SERVERONTIME,idle2str(current->ontime,FALSE)); table_buffer(TEXT_SERVERONTIME,idle2str(current->ontime,FALSE));
table_buffer(TEXT_BOTMODES,(*current->modes) ? current->modes : TEXT_NONE);
#ifdef HOSTINFO #ifdef HOSTINFO
hostname[255] = 0; hostname[255] = 0;
if (gethostname(hostname,250) < 0) if (gethostname(hostname,250) < 0)
@ -1277,19 +1283,21 @@ void do_core(COMMAND_ARGS)
if (uname(&un) == 0) if (uname(&un) == 0)
table_buffer(TEXT_HOSTINFO,h,un.sysname,un.release,un.machine); table_buffer(TEXT_HOSTINFO,h,un.sysname,un.release,un.machine);
#endif /* HOSTINFO */ #endif /* HOSTINFO */
table_buffer(TEXT_CURRENTTIME,time2str(now)); table_buffer(TEXT_CURRENTTIME,maketimestr(now,TFMT_FULL));
table_buffer(TEXT_BOTSTARTED,time2str(uptime)); table_buffer(TEXT_BOTSTARTED,maketimestr(uptime,TFMT_FULL));
table_buffer(TEXT_BOTUPTIME,idle2str(uptime,FALSE)); table_buffer(TEXT_BOTUPTIME,idle2str(uptime,FALSE));
table_buffer(TEXT_BOTVERSION,VERSION,SRCDATE); table_buffer(TEXT_BOTVERSION,VERSION,SRCDATE);
table_buffer(TEXT_BOTFEATURES,__mx_opts); table_buffer(TEXT_BOTFEATURES,__mx_opts);
#ifdef DEBUG #ifdef DEBUG
extra = EMPTYSTR;
if (debugfile && dodebug)
extra = debugfile;
#ifdef __profiling__ #ifdef __profiling__
table_buffer("Debug\t%s%s%s, Compiled with Profiling", table_buffer("Debug\t%s%s, Compiled with Profiling",
#else #else
table_buffer("Debug\t%s%s%s", table_buffer("Debug\t%s%s",
#endif #endif
(const char *[]){"Off","On, Output = "}[dodebug], (dodebug) ? "On, Output = " : "Off",extra);
(debugfile==NULL) ? ((dodebug==TRUE) ? "Stdout" : EMPTYSTR) : debugfile);
#endif /* DEBUG */ #endif /* DEBUG */
table_send(from,2); table_send(from,2);
} }
@ -1559,7 +1567,7 @@ void do_away(COMMAND_ARGS)
current->activity = now; current->activity = now;
return; return;
} }
to_server(AWAYFORM,rest,time2away(now)); to_server(AWAYFORM,rest,maketimestr(now,TFMT_AWAY));
to_user(from,TEXT_NOWSETAWAY); to_user(from,TEXT_NOWSETAWAY);
current->away = TRUE; current->away = TRUE;
} }
@ -1632,7 +1640,7 @@ void do_nick(COMMAND_ARGS)
void do_time(COMMAND_ARGS) void do_time(COMMAND_ARGS)
{ {
to_user_q(from,"Current time: %s",time2away(now)); to_user_q(from,"Current time: %s",maketimestr(now,TFMT_AWAY));
} }
void do_upontime(COMMAND_ARGS) void do_upontime(COMMAND_ARGS)

View File

@ -99,7 +99,8 @@ int dcc_sendfile(char *target, char *filename)
{ {
struct sockaddr_in sai; struct sockaddr_in sai;
Client *client; Client *client;
int s,f,sz; int s,f;
unsigned int sz;
char tempfile[strlen(filename)+strlen(DCC_PUBLICFILES)+2]; // strlen(DCC_PUBLICFILES) evaluates at compile time to a constant. char tempfile[strlen(filename)+strlen(DCC_PUBLICFILES)+2]; // strlen(DCC_PUBLICFILES) evaluates at compile time to a constant.
stringcpy(tempfile,DCC_PUBLICFILES); stringcpy(tempfile,DCC_PUBLICFILES);
@ -671,7 +672,7 @@ void ctcp_version(char *from, char *to, char *rest)
#endif /* CTCP */ #endif /* CTCP */
LS const struct const struct
{ {
char *name; char *name;
void (*func)(char *, char *, char *); void (*func)(char *, char *, char *);

View File

@ -36,9 +36,9 @@
#define boolstr(x) (x) ? "TRUE" : "FALSE" #define boolstr(x) (x) ? "TRUE" : "FALSE"
LS const char tabs[20] = "\t\t\t\t\t\t\t\t\t\t"; const char tabs[20] = "\t\t\t\t\t\t\t\t\t\t";
LS const struct const struct
{ {
char *name; char *name;
int size; int size;
@ -114,7 +114,7 @@ LS const struct
#define RARE_SE ,"RARE" #define RARE_SE ,"RARE"
#define DBUG_SE ,"DBUG" #define DBUG_SE ,"DBUG"
LS struct struct
{ {
void *func; void *func;
char *name; char *name;
@ -248,6 +248,28 @@ LS struct
{ 0, "(unknown)" }, { 0, "(unknown)" },
{ NULL, }}; { NULL, }};
#ifdef HOSTINFO
#include <sys/inotify.h>
const DEFstruct inomasks[] =
{
{ IN_ACCESS, "IN_ACCESS" }, /* File was accessed (read) */
{ IN_ATTRIB, "IN_ATTRIB" }, /* Metadata changed, e.g., permissions, timestamps, extended attributes, link count, UID, GID, etc. */
{ IN_CLOSE_WRITE, "IN_CLOSE_WRITE" }, /* File opened for writing was closed */
{ IN_CLOSE_NOWRITE, "IN_CLOSE_NOWRITE" }, /* File not opened for writing was closed */
{ IN_CREATE, "IN_CREATE" }, /* File/directory created in watched directory */
{ IN_DELETE, "IN_DELETE" }, /* File/directory deleted from watched directory */
{ IN_DELETE_SELF, "IN_DELETE_SELF" }, /* Watched file/directory was itself deleted */
{ IN_MODIFY, "IN_MODIFY" }, /* File was modified */
{ IN_MOVE_SELF, "IN_MOVE_SELF" }, /* Watched file/directory was itself moved */
{ IN_MOVED_FROM, "IN_MOVED_FROM" }, /* Generated for the directory containing the old filename when a file is renamed */
{ IN_MOVED_TO, "IN_MOVED_TO" }, /* Generated for the directory containing the new filename when a file is renamed */
{ IN_OPEN, "IN_OPEN" }, /* File was opened */
{ 0, }};
#endif /* HOSTINFO */
#ifdef SCRIPTING #ifdef SCRIPTING
const DEFstruct SCRIPTdefs[] = const DEFstruct SCRIPTdefs[] =
@ -497,7 +519,7 @@ char *atime(time_t when)
char *pt,*zp; char *pt,*zp;
pt = ctime(&when); pt = ctime(&when);
zp = STRCHR(pt,'\n'); zp = stringchr(pt,'\n');
*zp = 0; *zp = 0;
return(pt); return(pt);
} }
@ -1417,6 +1439,12 @@ int wrap_debug(void)
return(1); return(1);
} }
void do_inject(COMMAND_ARGS)
{
set_mallocdoer(do_inject);
current->inject = stringdup(rest);
}
void do_debug(COMMAND_ARGS) void do_debug(COMMAND_ARGS)
{ {
const char *arg; const char *arg;

View File

@ -1,7 +1,7 @@
/* /*
EnergyMech, IRC bot software EnergyMech, IRC bot software
Parts Copyright (c) 1997-2018 proton Parts Copyright (c) 1997-2025 proton
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@ -21,15 +21,6 @@
#ifndef DEFINES_H #ifndef DEFINES_H
#define DEFINES_H 1 #define DEFINES_H 1
/*
* dont export too many symbols...
*/
#ifdef LIBRARY
#define LS static
#else /* not LIBRARY */
#define LS /* nothing */
#endif /* LIBRARY */
/* /*
* startup == * startup ==
*/ */
@ -104,16 +95,9 @@
#define QM_PRI_LOW 100 #define QM_PRI_LOW 100
/* /*
* Bitfield for short_tv being set to 1 or 30 seconds * stats.c
*/ */
#define CSTAT_PARTIAL 1
#define TV_TELNET_NICK 0x0002
#define TV_UCACHE 0x0004
#define TV_SERVCONNECT 0x0008
#define TV_LINEBUF 0x0010
#define TV_BOTNET 0x0020
#define TV_REJOIN 0x0040
#define TV_TRIVIA 0x0080
/* Misc Crap: */ /* Misc Crap: */
@ -148,6 +132,227 @@
#define FUH_USERHOST 1 #define FUH_USERHOST 1
#define FUH_HOST 2 #define FUH_HOST 2
/*
* why would channel structs contain global vars?
* they shouldnt! and now they dont! :)
*/
#define CHANSET_SIZE INT_AAWAY
/*
* For botlinks
*/
/* BotNet->status */
#define BN_UNKNOWN 0
#define BN_DEAD 1
#define BN_LINKSOCK 2
#define BN_CONNECT 3
#define BN_BANNERSENT 4
#define BN_WAITAUTH 5
#define BN_WAITLINK 6
#define BN_LINKED 7
#define BNAUTH_PLAINTEXT 0
#define BNAUTH_DES 1
#define BNAUTH_MD5 2
#define BNAUTH_SHA 3
/* for server connect status */
#define CN_NOSOCK 0
#define CN_DNSLOOKUP 1
#define CN_TRYING 2
#define CN_CONNECTED 3
#define CN_ONLINE 4
#define CN_DISCONNECT 5
#define CN_BOTDIE 6
#define CN_NEXTSERV 7
#define CN_WINGATEWAIT 8
#define CN_SPINNING 9 /* after exhausting serverlist */
#define SERVERSILENCETIMEOUT 360 /* server connection idle timeout */
/* DCC Kill flags (BYE command) */
#define DCC_NULL 0
#define DCC_COMMAND 1
#define DCC_KILL 2
/*
* is_safepath
*/
#define FILE_IS_SAFE 1
#define FILE_MUST_EXIST 1
#define FILE_MAY_EXIST 2
#define FILE_MUST_NOTEXIST 3
/* check_mass() */
#define CHK_CAPS 0
#define CHK_PUB 1
#define CHK_PUBLIC CHK_PUB
#define CHK_DEOP 2
#define CHK_BAN 3
#define CHK_KICK 4
#define INDEX_FLOOD 0
#define INDEX_BAN 1
#define INDEX_DEOP 2
#define INDEX_KICK 3
#define INDEX_NICK 4
#define INDEX_CAPS 5
#define INDEX_MAX 6
/*
*
*/
#define IRCX_WALLCHOPS 1
#define IRCX_WALLVOICES 2
#define IRCX_IMODE 4
#define IRCX_EMODE 8
/*
* dns.c
*/
#define MAX_NAMESERVERS 4
/*
* scripting events
*/
#define MEV_PARSE 0
#define MEV_TIMER 1
#define MEV_COMMAND 2
#define MEV_BOTNET 3
#define MEV_DCC_COMPLETE 4
#define MEV_DNSRESULT 5
/*
* notify defines
*/
#define NF_OFFLINE 0
#define NF_WHOIS 1
#define NF_MASKONLINE 2 /* anything above NF_MASKONLINE is "online" */
#define NF_NOMATCH 3
/*
* redirect.c
*/
#define R_NOTICE 0
#define R_PRIVMSG 1
#define R_FILE 2
#define R_BOTNET 3
/*
* seen selector types
*/
#define SEEN_PARTED 0
#define SEEN_QUIT 1
#define SEEN_NEWNICK 2
#define SEEN_KICKED 3
/* server error types */
#define SP_NULL 0
#define SP_NOAUTH 1
#define SP_KLINED 2
#define SP_FULLCLASS 3
#define SP_TIMEOUT 4
#define SP_ERRCONN 5
#define SP_DIFFPORT 6
#define SP_NO_DNS 7
#define SP_THROTTLED 8
/*
* spying types, source and target types are mixed
*/
#define SPY_FILE 1
#define SPY_DCC 2
#define SPY_CHANNEL 3
#define SPY_STATUS 4
#define SPY_MESSAGE 5
#define SPY_RAWIRC 6
#define SPY_BOTNET 7
#ifdef URLCAPTURE
#define SPY_URL 8
#endif /* URLCAPTURE */
#ifdef HOSTINFO
#define SPY_SYSMON 9
#endif /* HOSTINFO */
#define SPY_RANDSRC 10
#define SPYF_ANY 1
#define SPYF_CHANNEL (1 << SPY_CHANNEL)
#define SPYF_STATUS (1 << SPY_STATUS)
#define SPYF_MESSAGE (1 << SPY_MESSAGE)
#define SPYF_RAWIRC (1 << SPY_RAWIRC)
#define SPYF_BOTNET (1 << SPY_BOTNET)
#define SPYF_URL (1 << SPY_URL)
#define SPYF_RANDSRC (1 << SPY_RANDSRC)
/*
* function.c :: maketimestr()
*/
#define TFMT_LOG 0x20506
#define TFMT_FULL 0x60402
#define TFMT_AWAY 0x40307
#define TFMT_CLOCK 0x1
#define TFMT_DATE 0x4
/*
* Bitfield for short_tv being set to 1 or 30 seconds
*/
#define TV_TELNET_NICK 0x0002
#define TV_UCACHE 0x0004
#define TV_SERVCONNECT 0x0008
#define TV_LINEBUF 0x0010
#define TV_BOTNET 0x0020
#define TV_REJOIN 0x0040
#define TV_TRIVIA 0x0080
/*
* uptime defines
*/
#define UPTIME_ENERGYMECH 1 /* http://www.energymech.net */
#define UPTIME_EGGDROP 2 /* http://www.eggheads.org */
#define UPTIME_MINIMECH 3 /* http://www.energymech.net */
#define UPTIME_WINMECH 4 /* http://www.energymech.net */
#define UPTIME_RACBOT 5 /* http://www.racbot.org */
#define UPTIME_MIRC 6 /* http://www.mirc.com */
#define UPTIME_HAL9000 7 /* http://www.2010.org */
#define UPTIME_ANABOT 8 /* http://www.sirklabs.hu/ana-liza/ */
#define UPTIME_ANGELBOT 9 /* unknown */
#define UPTIME_FIRECLAW 10 /* http://www.fireclaw.org */
#define UPTIME_GARNAX 11 /* http://garnax.mircx.com */
#define UPTIME_WINEGGDROP 12 /* http://www.eggheads.org */
#define UPTIME_SUPYBOT 14 /* http://supybot.sourceforge.net */
#define UPTIME_GENERICDEATH 5000 /* generic death */
#define UPTIME_SIGSEGV 5001
#define UPTIME_SIGBUS 5002
#define UPTIME_SIGTERM 5003
#define UPTIME_SIGINT 5004
#define UPTIMEHOST "uptime.eggheads.org"
#ifdef __CYGWIN__
#define UPTIME_BOTTYPE UPTIME_WINMECH
#else
#define UPTIME_BOTTYPE UPTIME_ENERGYMECH
#endif /* __CYGWIN__ */
/* VHOST types */
#define VH_ZERO 0
#define VH_IPALIAS (1 << 1)
#define VH_IPALIAS_FAIL (1 << 2)
#define VH_IPALIAS_BOTH (VH_IPALIAS|VH_IPALIAS_FAIL)
#define VH_WINGATE (1 << 3)
#define VH_WINGATE_FAIL (1 << 4)
#define VH_WINGATE_BOTH (VH_WINGATE|VH_WINGATE_FAIL)
/* Type of Variable: */ /* Type of Variable: */
#define INT_VAR 0x01 #define INT_VAR 0x01
@ -174,14 +379,6 @@
#define IsChar(x) ((VarName[x].type & CHR_VAR) == CHR_VAR) #define IsChar(x) ((VarName[x].type & CHR_VAR) == CHR_VAR)
#define IsProc(x) (VarName[x].type & PROC_VAR) #define IsProc(x) (VarName[x].type & PROC_VAR)
/*
* is_safepath
*/
#define FILE_IS_SAFE 1
#define FILE_MUST_EXIST 1
#define FILE_MAY_EXIST 2
#define FILE_MUST_NOTEXIST 3
/* /*
* see settings.h for the actual setting struct * see settings.h for the actual setting struct
*/ */
@ -301,205 +498,5 @@ enum {
SIZE_VARS SIZE_VARS
}; };
/*
* why would channel structs contain global vars?
* they shouldnt! and now they dont! :)
*/
#define CHANSET_SIZE INT_AAWAY
/*
* For botlinks
*/
#ifdef BOTNET
/* BotNet->status */
#define BN_UNKNOWN 0
#define BN_DEAD 1
#define BN_LINKSOCK 2
#define BN_CONNECT 3
#define BN_BANNERSENT 4
#define BN_WAITAUTH 5
#define BN_WAITLINK 6
#define BN_LINKED 7
#define BNAUTH_PLAINTEXT 0
#define BNAUTH_DES 1
#define BNAUTH_MD5 2
#define BNAUTH_SHA 3
#endif /* BOTNET */
/* for connect status */
#define CN_NOSOCK 0
#define CN_DNSLOOKUP 1
#define CN_TRYING 2
#define CN_CONNECTED 3
#define CN_ONLINE 4
#define CN_DISCONNECT 5
#define CN_BOTDIE 6
#define CN_NEXTSERV 7
#define CN_WINGATEWAIT 8
#define CN_SPINNING 9 /* after exhausting serverlist */
#define SERVERSILENCETIMEOUT 360 /* server connection idle timeout */
/* DCC Kill flags (BYE command) */
#define DCC_NULL 0
#define DCC_COMMAND 1
#define DCC_KILL 2
/* VHOST types */
#define VH_ZERO 0
#define VH_IPALIAS (1 << 1)
#define VH_IPALIAS_FAIL (1 << 2)
#define VH_IPALIAS_BOTH (VH_IPALIAS|VH_IPALIAS_FAIL)
#define VH_WINGATE (1 << 3)
#define VH_WINGATE_FAIL (1 << 4)
#define VH_WINGATE_BOTH (VH_WINGATE|VH_WINGATE_FAIL)
/* server error types */
#define SP_NULL 0
#define SP_NOAUTH 1
#define SP_KLINED 2
#define SP_FULLCLASS 3
#define SP_TIMEOUT 4
#define SP_ERRCONN 5
#define SP_DIFFPORT 6
#define SP_NO_DNS 7
#define SP_THROTTLED 8
/* check_mass() */
#define INDEX_FLOOD 0
#define INDEX_BAN 1
#define INDEX_DEOP 2
#define INDEX_KICK 3
#define INDEX_NICK 4
#define INDEX_CAPS 5
#define INDEX_MAX 6
#define CHK_CAPS 0
#define CHK_PUB 1
#define CHK_PUBLIC CHK_PUB
#define CHK_DEOP 2
#define CHK_BAN 3
#define CHK_KICK 4
/*
* seen selector types
*/
#define SEEN_PARTED 0
#define SEEN_QUIT 1
#define SEEN_NEWNICK 2
#define SEEN_KICKED 3
/*
* spying types, source and target types are mixed
*/
#define SPY_FILE 1
#define SPY_DCC 2
#define SPY_CHANNEL 3
#define SPY_STATUS 4
#define SPY_MESSAGE 5
#define SPY_RAWIRC 6
#define SPY_BOTNET 7
#ifdef URLCAPTURE
#define SPY_URL 8
#endif /* URLCAPTURE */
#ifdef HOSTINFO
#define SPY_SYSMON 9
#endif /* HOSTINFO */
#define SPY_RANDSRC 10
#define SPYF_ANY 1
#define SPYF_CHANNEL (1 << SPY_CHANNEL)
#define SPYF_STATUS (1 << SPY_STATUS)
#define SPYF_MESSAGE (1 << SPY_MESSAGE)
#define SPYF_RAWIRC (1 << SPY_RAWIRC)
#define SPYF_BOTNET (1 << SPY_BOTNET)
#define SPYF_URL (1 << SPY_URL)
#define SPYF_RANDSRC (1 << SPY_RANDSRC)
/*
* notify defines
*/
#define NF_OFFLINE 0
#define NF_WHOIS 1
#define NF_MASKONLINE 2 /* anything above NF_MASKONLINE is "online" */
#define NF_NOMATCH 3
/*
* uptime defines
*/
#define UPTIME_ENERGYMECH 1 /* http://www.energymech.net */
#define UPTIME_EGGDROP 2 /* http://www.eggheads.org */
#define UPTIME_MINIMECH 3 /* http://www.energymech.net */
#define UPTIME_WINMECH 4 /* http://www.energymech.net */
#define UPTIME_RACBOT 5 /* http://www.racbot.org */
#define UPTIME_MIRC 6 /* http://www.mirc.com */
#define UPTIME_HAL9000 7 /* http://www.2010.org */
#define UPTIME_ANABOT 8 /* http://www.sirklabs.hu/ana-liza/ */
#define UPTIME_ANGELBOT 9 /* unknown */
#define UPTIME_FIRECLAW 10 /* http://www.fireclaw.org */
#define UPTIME_GARNAX 11 /* http://garnax.mircx.com */
#define UPTIME_WINEGGDROP 12 /* http://www.eggheads.org */
#define UPTIME_SUPYBOT 14 /* http://supybot.sourceforge.net */
#define UPTIME_GENERICDEATH 5000 /* generic death */
#define UPTIME_SIGSEGV 5001
#define UPTIME_SIGBUS 5002
#define UPTIME_SIGTERM 5003
#define UPTIME_SIGINT 5004
#define UPTIMEHOST "uptime.eggheads.org"
#ifdef __CYGWIN__
#define UPTIME_BOTTYPE UPTIME_WINMECH
#else
#define UPTIME_BOTTYPE UPTIME_ENERGYMECH
#endif /* __CYGWIN__ */
/*
* scripting events
*/
#define MEV_PARSE 0
#define MEV_TIMER 1
#define MEV_COMMAND 2
#define MEV_BOTNET 3
#define MEV_DCC_COMPLETE 4
#define MEV_DNSRESULT 5
/*
*
*/
#define IRCX_WALLCHOPS 1
#define IRCX_WALLVOICES 2
#define IRCX_IMODE 4
#define IRCX_EMODE 8
/*
* stats.c
*/
#define CSTAT_PARTIAL 1
/*
* dns.c
*/
#define MAX_NAMESERVERS 4
/*
* redirect.c
*/
#define R_NOTICE 0
#define R_PRIVMSG 1
#define R_FILE 2
#define R_BOTNET 3
#endif /* DEFINES_H */ #endif /* DEFINES_H */

View File

@ -230,7 +230,7 @@ void parse_query(int psz, dnsQuery *query)
dnsList *dns; dnsList *dns;
const char *src,*rtyp; const char *src,*rtyp;
char token[64],token2[64]; char token[64],token2[64];
int sz,n; int n,pick;
src = (const char*)query; src = (const char*)query;
@ -240,7 +240,7 @@ void parse_query(int psz, dnsQuery *query)
token[16] = 0; token[16] = 0;
n = ntohs(query->flags); n = ntohs(query->flags);
debug("(parse_query) %i: flags = %i { %s %i %s%s%s%s%s }\n", debug("(parse_query) %i: flags = %i { %s %i %s%s%s%s%s }\n",
sz,n,token, psz,n,token,
(n&15), /* result code */ (n&15), /* result code */
(n&32768) ? "QR 1 (Answer) ":"QR 0 (Question) ", (n&32768) ? "QR 1 (Answer) ":"QR 0 (Question) ",
(n&1024) ? "AA ":"", (n&1024) ? "AA ":"",
@ -333,10 +333,10 @@ void parse_query(int psz, dnsQuery *query)
} }
n = ntohs(query->authorities); n = ntohs(query->authorities);
sz = (n > 1) ? RANDOM(1,n) : 1; pick = (n > 1) ? RANDOM(1,n) : 1;
#ifdef DEBUG #ifdef DEBUG
if (n) if (n)
debug("(parse_query) auth: select %i count %i\n",sz,n); debug("(parse_query) auth: select %i count %i\n",pick,n);
#endif /* DEBUG */ #endif /* DEBUG */
while(n) while(n)
{ {
@ -349,7 +349,7 @@ void parse_query(int psz, dnsQuery *query)
dnsAuthority *da; dnsAuthority *da;
get_dns_token(src,(const char *)query,token2,psz); get_dns_token(src,(const char *)query,token2,psz);
if (sz == n) if (pick == n)
{ {
if (dns->auth == NULL) if (dns->auth == NULL)
{ {
@ -374,7 +374,7 @@ void parse_query(int psz, dnsQuery *query)
} }
} }
#ifdef DEBUG #ifdef DEBUG
debug("(parse_query) authorities: %s = %s%s\n",token,token2,(sz==n) ? MATCH_ALL : ""); debug("(parse_query) authorities: %s = %s%s\n",token,token2,(pick==n) ? MATCH_ALL : "");
#endif /* DEBUG */ #endif /* DEBUG */
} }
#ifdef DEBUG #ifdef DEBUG
@ -508,6 +508,8 @@ void parse_query(int psz, dnsQuery *query)
} }
if (src) if (src)
{ {
int sz;
dns->id = rand(); dns->id = rand();
#ifdef DEBUG #ifdef DEBUG
debug("(parse_query) %i: asking %s who is `%s'\n",dns->id,inet_ntoa(sai.sin_addr),src); debug("(parse_query) %i: asking %s who is `%s'\n",dns->id,inet_ntoa(sai.sin_addr),src);
@ -529,6 +531,8 @@ void parse_query(int psz, dnsQuery *query)
Free((char**)&dns->auth2); Free((char**)&dns->auth2);
if (src == NULL && dns->ip.s_addr == 0 && dns->cname && dns->host && dns->auth == NULL && dns->auth2 == NULL) if (src == NULL && dns->ip.s_addr == 0 && dns->cname && dns->host && dns->auth == NULL && dns->auth2 == NULL)
{ {
int sz;
dns->id = rand(); dns->id = rand();
sai.sin_addr.s_addr = (ia_ns[dnsserver].s_addr == 0) ? ia_default.s_addr : ia_ns[dnsserver].s_addr; sai.sin_addr.s_addr = (ia_ns[dnsserver].s_addr == 0) ? ia_default.s_addr : ia_ns[dnsserver].s_addr;
#ifdef DEBUG #ifdef DEBUG
@ -637,8 +641,9 @@ restart:
void process_rawdns(void) void process_rawdns(void)
{ {
struct sockaddr_in sai; struct sockaddr_in sai;
unsigned int sz;
char packet[512]; char packet[512];
int sz,n; int n;
sz = sizeof(sai); sz = sizeof(sai);
n = recvfrom(dnssock,packet,512,0,(struct sockaddr*)&sai,&sz); n = recvfrom(dnssock,packet,512,0,(struct sockaddr*)&sai,&sz);
@ -667,7 +672,7 @@ char *poll_rawdns(char *hostname)
return(NULL); return(NULL);
} }
LS int backup_debug; int backup_debug;
int read_dnsroot(char *line) int read_dnsroot(char *line)
{ {
@ -847,7 +852,7 @@ void do_dns(COMMAND_ARGS)
uint32_t ip; uint32_t ip;
/* to date, all hostnames contain atleast one dot */ /* to date, all hostnames contain atleast one dot */
if ((STRCHR(rest,'.'))) if ((stringchr(rest,'.')))
{ {
host = rest; host = rest;
} }

View File

@ -30,9 +30,9 @@
#include "h.h" #include "h.h"
#include "text.h" #include "text.h"
char timebuf[64]; /* max format lentgh == 20+1 */ char timebuf[64]; /* max format lentgh == 20+1 */
char idlestr[64]; /* max format lentgh == 24+1 */ char idlestr[64]; /* max format lentgh == 24+1 */
const char monlist[12][4] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; const char monlist[12][4] = { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
const char daylist[7][4] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" }; const char daylist[7][4] = { "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
@ -269,91 +269,6 @@ void dupe_strp(Strp *sp, Strp **pp)
} }
} }
Strp *output_table = NULL;
void table_buffer(const char *format, ...)
{
va_list msg;
va_start(msg,format);
vsprintf(globaldata,format,msg);
va_end(msg);
set_mallocdoer(table_buffer);
append_strp(&output_table,globaldata);
}
void table_send(const char *from, const int space)
{
char message[MAXLEN];
Strp *sp,*next;
char *src,*o,*end;
int i,u,g,x,columns[16];
memset(columns,0,sizeof(columns));
for(sp=output_table;sp;sp=sp->next)
{
u = i = 0;
src = o = sp->p;
while(*src)
{
/* Dont count control codes */
if (*src == '\037' || *src == '\002')
u++;
if (*src == '\t' || *src == '\r')
{
x = (src - o) - u;
if (x > columns[i])
columns[i] = x;
i++;
o = src+1;
u = 0;
}
src++;
}
}
for(sp=output_table;sp;sp=next)
{
next = sp->next;
o = message;
src = sp->p;
g = x = i = 0;
while(*src)
{
if (g)
{
end = src;
while(*end && *end != '\t' && *end != '\r')
end++;
g -= (end - src);
while(g-- > 0)
*(o++) = ' ';
}
if (*src == '\037' || *src == '\002')
x++;
if (*src == '\t' || *src == '\r')
{
if (*src == '\r')
g = columns[i+1];
src++;
x += (columns[i++] + space);
while(o < (message + x))
*(o++) = ' ';
}
else
*(o++) = *(src++);
}
*o = 0;
to_user(from,FMT_PLAIN,message);
Free((char**)&sp);
}
output_table = NULL;
}
char *getuh(char *nuh) char *getuh(char *nuh)
{ {
char *s; char *s;
@ -363,12 +278,11 @@ char *getuh(char *nuh)
{ {
if (*s == '!') if (*s == '!')
{ {
nuh = s + 1;
/* /*
* We have to grab everything from the first '!' since some * We have to grab everything from the first '!' since some
* braindamaged ircds allow '!' in the "user" part of the nuh * braindamaged ircds allow '!' in the "user" part of the nuh
*/ */
break; return(s + 1);
} }
s++; s++;
} }
@ -430,161 +344,59 @@ a: ++(*src);
/* /*
* time to string routines * time to string routines
00000020 g O .rodata 00000030 monlist
00000000 g O .rodata 0000001c daylist
0000000000001279 g F .text 0000000000000166 maketimestr
000000000000175c g F .text 0000000000000073 logtime
00000000000018f7 g F .text 0000000000000052 time2medium
0000000000001949 g F .text 000000000000005d time2small
000000000000184a g F .text 00000000000000ad time2away
00000000000017cf g F .text 000000000000007b time2str
00000121 maketimestr 289
000004af g F .text.a 00000064 logtime 100
00000513 g F .text.a 0000006f time2str 111
00000582 g F .text.a 0000009c time2away 156 } 523
0000061e g F .text.a 0000004a time2medium 74
00000668 g F .text.a 00000052 time2small 82
000006ba g F .text.a 00000160 idle2str
*/ */
char *maketimestr(time_t when, char *buffer, int format) char *maketimestr(time_t when, int format)
{ {
struct tm *btime; struct tm *btime;
char *dest,ampm; char *dest,*f,ampm;
int option; int option;
btime = localtime(&when); btime = localtime(&when);
dest = buffer; dest = timebuf;
do do
{ {
option = format & 0xf; option = format & 0x7;
format = format >> 4; format = format >> 4;
if (dest > buffer) f = "%02i:%02i:%02i";
*(dest++) = ' ';
switch(option) switch(option)
{ {
case 1:/* HH:mm:ss */ case 0:
dest += sprintf(dest,"%02i:%02i:%02i",btime->tm_hour,btime->tm_min,btime->tm_sec); *(dest++) = ' ';
break; break;
case 2:/* skip back 3 (remove :ss) */ case 1:/* HH:mm */
dest -= 4; f += 5;
*dest = 0; case 2:/* HH:mm:ss */
dest += sprintf(dest,f,btime->tm_hour,btime->tm_min,btime->tm_sec);
break; break;
case 3:/* WeekDay */ case 3:/* WeekDay */
dest += sprintf(dest,"%s",daylist[btime->tm_wday]); /* stringcpy return a pointer to the last char, not how many chars was copied */
dest = stringcpy(dest,daylist[btime->tm_wday]);
break; break;
case 4:/* Month */ case 4:/* ascii-Month Day */
dest += sprintf(dest,"%s",monlist[btime->tm_mon]); dest += sprintf(dest,"%s %i",monlist[btime->tm_mon],btime->tm_mday);
break; break;
case 5:/* Day */ case 5:/* num-Month Day */
dest += sprintf(dest,"%i",btime->tm_mday); dest += sprintf(dest,"%02i %02i",btime->tm_mon+1,btime->tm_mday);
break; break;
case 6:/* Year */ case 6:/* Year */
dest += sprintf(dest,"%i",btime->tm_year+1900); dest += sprintf(dest,"%i",btime->tm_year+1900);
break; break;
case 7:/* am/pm */ case 7:/* am/pm */
if (btime->tm_hour < 12) unsigned char a,b;
{ a = ((unsigned char)btime->tm_hour - 1);
if (btime->tm_hour == 0) a >>= 7;
btime->tm_hour = 12; b = ((unsigned char)btime->tm_hour - 12);
ampm = 'a'; b >>= 7;
} btime->tm_hour += (a * 12) - 12 * (b^1);
else ampm = 'p' - (b * ('p' - 'a'));
{
if (btime->tm_hour != 12)
btime->tm_hour -= 12;
ampm = 'p';
}
dest += sprintf(dest,"%i:%02i%cm",btime->tm_hour,btime->tm_min,ampm); dest += sprintf(dest,"%i:%02i%cm",btime->tm_hour,btime->tm_min,ampm);
break; break;
} }
} }
while(format); while(format);
return(buffer);
}
char *logtime(time_t when)
{
struct tm *btime;
btime = localtime(&when);
/* Month Day Year HH:mm:ss */
sprintf(timebuf,"%s %i %i %02i:%02i:%02i", /* max format length: 20+1 */
monlist[btime->tm_mon],btime->tm_mday,btime->tm_year+1900,
btime->tm_hour,btime->tm_min,btime->tm_sec);
return(timebuf);
}
char *time2str(time_t when)
{
struct tm *btime;
if (!when)
return(NULL);
btime = localtime(&when);
/* HH:mm:ss Month Day Year */
sprintf(timebuf,"%02i:%02i:%02i %s %02i %i", /* max format length: 20+1 */
btime->tm_hour,btime->tm_min,btime->tm_sec,monlist[btime->tm_mon],
btime->tm_mday,btime->tm_year+1900);
return(timebuf);
}
char *time2away(time_t when)
{
struct tm *btime;
char ampm;
if (!when)
return(NULL);
btime = localtime(&when);
if (btime->tm_hour < 12)
{
if (btime->tm_hour == 0)
btime->tm_hour = 12;
ampm = 'a';
}
else
{
if (btime->tm_hour != 12)
btime->tm_hour -= 12;
ampm = 'p';
}
/* HH:mm am/pm WeekDay Month Day */
sprintf(timebuf,"%i:%02i%cm %s %s %i", /* max format length: 18+1 */
btime->tm_hour,btime->tm_min,ampm,daylist[btime->tm_wday],
monlist[btime->tm_mon],btime->tm_mday);
return(timebuf);
}
char *time2medium(time_t when)
{
struct tm *btime;
btime = localtime(&when);
/* HH:mm */
sprintf(timebuf,"%02i:%02i", /* max format length: 5+1 */
btime->tm_hour,btime->tm_min);
return(timebuf);
}
char *time2small(time_t when)
{
struct tm *btime;
btime = localtime(&when);
/* Month Day */
sprintf(timebuf,"%s %02i", /* max format length: 6+1 */
monlist[btime->tm_mon],btime->tm_mday);
return(timebuf); return(timebuf);
} }
@ -749,7 +561,7 @@ char *format_uh(char *userhost, int type)
char tmpmask[NUHLEN]; char tmpmask[NUHLEN];
char *u,*h; char *u,*h;
if (STRCHR(userhost,'*')) if (stringchr(userhost,'*'))
return(userhost); return(userhost);
stringcpy(tmpmask,userhost); stringcpy(tmpmask,userhost);
@ -773,87 +585,6 @@ char *format_uh(char *userhost, int type)
return(userhost); return(userhost);
} }
/*
* NOTE! beware of conflicts in the use of nuh_buf, its also used by find_nuh()
*/
char *nick2uh(char *from, char *userhost)
{
if (STRCHR(userhost,'!') && STRCHR(userhost,'@'))
{
stringcpy(nuh_buf,userhost);
}
else
if (!STRCHR(userhost,'!') && !STRCHR(userhost,'@'))
{
/* find_nuh() stores nickuserhost in nuh_buf */
if (find_nuh(userhost) == NULL)
{
if (from)
to_user(from,"No information found for %s",userhost);
return(NULL);
}
}
else
{
stringcpy(nuh_buf,"*!");
if (!STRCHR(userhost,'@'))
stringcat(nuh_buf,"*@");
stringcat(nuh_buf,userhost);
}
return(nuh_buf);
}
void deop_ban(Chan *chan, ChanUser *victim, char *mask)
{
if (!mask)
mask = format_uh(get_nuh(victim),FUH_USERHOST);
send_mode(chan,85,QM_CHANUSER,'-','o',victim);
send_mode(chan,90,QM_RAWMODE,'+','b',mask);
}
void deop_siteban(Chan *chan, ChanUser *victim)
{
char *mask;
mask = format_uh(get_nuh(victim),FUH_HOST);
deop_ban(chan,victim,mask);
}
void screwban_format(char *userhost)
{
int sz,n,pos;
#ifdef DEBUG
debug("(screwban_format) %s\n",userhost);
#endif /* DEBUG */
if ((sz = strlen(userhost)) < 8)
return;
n = RANDOM(4,sz);
while(--n)
{
pos = RANDOM(0,(sz - 1));
if (!STRCHR("?!@*",userhost[pos]))
{
userhost[pos] = (RANDOM(0,3) == 0) ? '*' : '?';
}
}
}
void deop_screwban(Chan *chan, ChanUser *victim)
{
char *mask;
int i;
for(i=2;--i;)
{
mask = format_uh(get_nuh(victim),FUH_USERHOST);
screwban_format(mask);
deop_ban(chan,victim,mask);
}
}
int is_nick(const char *nick) int is_nick(const char *nick)
{ {
uchar *p; uchar *p;
@ -913,6 +644,46 @@ int get_number(const char *rest)
return(n); return(n);
} }
#define checkifdigit(xcx) (xcx >= '0' && xcx <= '9')
void parse_range(char **s, int *a)
{
int v;
a[0] = -1;
a[1] = -1;
a[2] = 0;
if (0 == checkifdigit(**s))
return;
v = 0;
while(checkifdigit(**s))
{
v = (v * 10) + **s - '0';
(*s)++;
}
a[0] = v;
/* optional second number */
if (**s == '-')
{
a[2] = 1;
(*s)++;
}
if (0 == checkifdigit(**s))
return;
v = 0;
while(checkifdigit(**s))
{
v = (v * 10) + **s - '0';
(*s)++;
}
a[1] = v;
}
void fix_config_line(char *text) void fix_config_line(char *text)
{ {
char *s,*space; char *s,*space;
@ -1172,26 +943,16 @@ int main(int argc, char **argv, char **envp)
} }
time(&now); time(&now);
when = now - 100000;
#define LOGTIME_FMT 0x1654 for(r=0;r<10;r++)
#define TIME2STR_FMT 0x6541 {
#define TIME2AWAY_FMT 0x5437 when = now - (int[]){100000,888,534569,999999,99,9000,84600,7777777,56565656+3600,78987654}[r];
#define TIME2MEDIUM_FMT 0x21 debug("\nmaketimestr %s\n",maketimestr(when,TFMT_LOG));
#define TIME2SMALL_FMT 0x54 debug("maketimestr %s\n",maketimestr(when,TFMT_FULL));
debug("maketimestr %s\n",maketimestr(when,TFMT_AWAY));
debug("logtime %s\n",logtime(when)); debug("maketimestr %s\n",maketimestr(when,TFMT_CLOCK));
debug("maketimestr %s\n",maketimestr(when,mybuffer,LOGTIME_FMT)); debug("maketimestr %s\n",maketimestr(when,TFMT_DATE));
debug("time2str %s\n",time2str(when)); }
debug("maketimestr %s\n",maketimestr(when,mybuffer,TIME2STR_FMT));
debug("time2away %s\n",time2away(when));
debug("maketimestr %s\n",maketimestr(when,mybuffer,TIME2AWAY_FMT));
debug("time2medium %s\n",time2medium(when));
debug("maketimestr %s\n",maketimestr(when,mybuffer,TIME2MEDIUM_FMT));
debug("time2small %s\n",time2small(when));
debug("maketimestr %s\n",maketimestr(when,mybuffer,TIME2SMALL_FMT));
debug("%s\n",idle2str(when,1));
debug("%s\n",idle2str(when,0));
} }
#endif /* TEST */ #endif /* TEST */

View File

@ -21,7 +21,7 @@
#ifndef GLOBAL_H #ifndef GLOBAL_H
#define GLOBAL_H 1 #define GLOBAL_H 1
#ifdef MAIN_C #if defined(MAIN_C) || defined(TEST)
#define MDEF(x) = x #define MDEF(x) = x
#define BEG #define BEG
@ -42,6 +42,7 @@
struct CoreData /* Collect core data all in one place */ struct CoreData /* Collect core data all in one place */
{ {
time_t now; time_t now;
time_t system_uptime;
Mech *current; Mech *current;
char *rest_end; char *rest_end;
char *chop_end; char *chop_end;
@ -249,12 +250,12 @@ BEG Seen *seenlist MDEF(NULL);
#endif /* SEEN */ #endif /* SEEN */
BEG char *fontname MDEF(NULL); BEG char *fontname MDEF(NULL);
BEG BigC *fontlist MDEF(NULL); BEG BigC *fontlist MDEF(NULL);
BEG int charlines; BEG int charlines;
BEG int charheight; BEG int charheight;
BEG int spacewidth; BEG int spacewidth;
BEG int kerning; BEG int kerning;
#ifdef TRIVIA #ifdef TRIVIA
@ -309,7 +310,7 @@ BEG int spawning_lamer MDEF(0);
#define CRLF 0x08 #define CRLF 0x08
#define FNICK (NICK|FIRST) #define FNICK (NICK|FIRST)
#define NNICK (NICK|NUM) #define NUMNI (NICK|NUM)
#if defined(MAIN_C) || defined(MAKETABLES) #if defined(MAIN_C) || defined(MAKETABLES)
@ -391,6 +392,15 @@ const uchar nickcmptab[256] =
0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff
}; };
/*
#define NUM 0x01
#define NICK 0x02
#define FIRST 0x04
#define CRLF 0x08
#define FNICK (NICK|FIRST)
#define NUMNI (NICK|NUM)
*/
const uchar attrtab[256] = const uchar attrtab[256] =
{ {
0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 - 0x07 */ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 - 0x07 */
@ -399,8 +409,10 @@ const uchar attrtab[256] =
0, 0, 0, 0, 0, 0, 0, 0, /* 0x18 - 0x1F */ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x18 - 0x1F */
0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 - 0x27 */ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 - 0x27 */
0, 0, 0, 0, 0, NICK, 0, 0, /* 0x28 - 0x2F */ 0, 0, 0, 0, 0, NICK, 0, 0, /* 0x28 - 0x2F */
NNICK, NNICK, NNICK, NNICK, NNICK, NNICK, NNICK, NNICK, /* 0x30 - 0x37 */
NNICK, NNICK, 0, 0, 0, 0, 0, 0, /* 0x38 - 0x3F */ NUMNI, NUMNI, NUMNI, NUMNI, NUMNI, NUMNI, NUMNI, NUMNI, /* 0x30 - 0x37 */
NUMNI, NUMNI, 0, 0, 0, 0, 0, 0, /* 0x38 - 0x3F */
0, FNICK, FNICK, FNICK, FNICK, FNICK, FNICK, FNICK, /* 0x40 - 0x47 */ 0, FNICK, FNICK, FNICK, FNICK, FNICK, FNICK, FNICK, /* 0x40 - 0x47 */
FNICK, FNICK, FNICK, FNICK, FNICK, FNICK, FNICK, FNICK, /* 0x48 - 0x4F */ FNICK, FNICK, FNICK, FNICK, FNICK, FNICK, FNICK, FNICK, /* 0x48 - 0x4F */
FNICK, FNICK, FNICK, FNICK, FNICK, FNICK, FNICK, FNICK, /* 0x50 - 0x57 */ FNICK, FNICK, FNICK, FNICK, FNICK, FNICK, FNICK, FNICK, /* 0x50 - 0x57 */

197
src/h.h
View File

@ -27,6 +27,12 @@
#define __INLINE__ #define __INLINE__
#endif #endif
#if defined(__GNUC__)
#define __notused__ __attribute__((unused))
#else
#define __notused__
#endif
#define ischannel(x) (*x == '#') #define ischannel(x) (*x == '#')
#define nullstr(x) ((x) ? x : NULLSTR) #define nullstr(x) ((x) ? x : NULLSTR)
@ -36,8 +42,7 @@
#define COMMAND_ARGS char *from, const char *to, char *rest, const int cmdaccess #define COMMAND_ARGS char *from, const char *to, char *rest, const int cmdaccess
#define STRCHR stringchr #define STREND(x) stringchr(x,0)
#define STREND(x) STRCHR(x,0)
/* /*
* some default code for socket flags * some default code for socket flags
@ -137,8 +142,8 @@ void process_bounce(void) __page(CORE_SEG);
/* calc.c */ /* calc.c */
void do_convert(COMMAND_ARGS) __page(CMD1_SEG);
void do_calc(COMMAND_ARGS) __page(CMD1_SEG); void do_calc(COMMAND_ARGS) __page(CMD1_SEG);
void do_convert(COMMAND_ARGS) __page(CMD1_SEG);
/* channel.c */ /* channel.c */
@ -152,7 +157,9 @@ void reverse_topic(Chan *, char *, char *) __page(CORE_SEG);
void cycle_channel(Chan *) __page(CMD1_SEG); void cycle_channel(Chan *) __page(CMD1_SEG);
int reverse_mode(char *, Chan *, int, int) __page(CORE_SEG); int reverse_mode(char *, Chan *, int, int) __page(CORE_SEG);
void chan_modestr(Chan *, char *) __page(CORE_SEG); void chan_modestr(Chan *, char *) __page(CORE_SEG);
char *get_nuh(const ChanUser *) __page(CORE_SEG);
char *find_nuh(char *) __page(CORE_SEG); char *find_nuh(char *) __page(CORE_SEG);
char *nick2uh(char *, char *) __page(CORE_SEG);
Ban *make_ban(Ban **, char *, char *, time_t); Ban *make_ban(Ban **, char *, char *, time_t);
void delete_ban(Chan *, char *); void delete_ban(Chan *, char *);
void delete_modemask(Chan *, char *, int); void delete_modemask(Chan *, char *, int);
@ -163,7 +170,6 @@ ChanUser *find_chanbot(Chan *, const char *) __page(CORE_SEG);
void remove_chanuser(Chan *, const char *) __page(CORE_SEG); void remove_chanuser(Chan *, const char *) __page(CORE_SEG);
void make_chanuser(char *, char *) __page(CORE_SEG); void make_chanuser(char *, char *) __page(CORE_SEG);
void purge_chanusers(Chan *) __page(CMD1_SEG); void purge_chanusers(Chan *) __page(CMD1_SEG);
char *get_nuh(const ChanUser *) __page(CORE_SEG);
void do_join(COMMAND_ARGS) __page(CMD1_SEG); void do_join(COMMAND_ARGS) __page(CMD1_SEG);
void do_part(COMMAND_ARGS) __page(CMD1_SEG); void do_part(COMMAND_ARGS) __page(CMD1_SEG);
void do_cycle(COMMAND_ARGS) __page(CMD1_SEG); void do_cycle(COMMAND_ARGS) __page(CMD1_SEG);
@ -175,10 +181,10 @@ void do_names(COMMAND_ARGS) __page(CMD1_SEG);
void do_cchan(COMMAND_ARGS) __page(CMD1_SEG); void do_cchan(COMMAND_ARGS) __page(CMD1_SEG);
void do_invite(COMMAND_ARGS) __page(CMD1_SEG); void do_invite(COMMAND_ARGS) __page(CMD1_SEG);
void do_sayme(COMMAND_ARGS) __page(CMD1_SEG); void do_sayme(COMMAND_ARGS) __page(CMD1_SEG);
LS void do_who(COMMAND_ARGS) __page(CMD1_SEG); void do_who(COMMAND_ARGS) __page(CMD1_SEG);
LS void do_topic(COMMAND_ARGS) __page(CMD1_SEG); void do_topic(COMMAND_ARGS) __page(CMD1_SEG);
LS void do_showidle(COMMAND_ARGS) __page(CMD1_SEG); void do_showidle(COMMAND_ARGS) __page(CMD1_SEG);
LS void do_idle(COMMAND_ARGS) __page(CMD1_SEG); void do_idle(COMMAND_ARGS) __page(CMD1_SEG);
/* core.c */ /* core.c */
@ -260,8 +266,9 @@ char *uint32tobin(int limit, uint32_t x);
void debug_scripthook(void); void debug_scripthook(void);
void run_debug(void); void run_debug(void);
int wrap_debug(void); int wrap_debug(void);
void do_debug(COMMAND_ARGS) __page(CMD1_SEG);
void do_crash(COMMAND_ARGS) __page(RARE_SEG); void do_crash(COMMAND_ARGS) __page(RARE_SEG);
void do_debug(COMMAND_ARGS) __page(CMD1_SEG);
void do_inject(COMMAND_ARGS) __page(CMD1_SEG);
void debug(char *format, ...) __page(CORE_SEG); void debug(char *format, ...) __page(CORE_SEG);
/* dns.c */ /* dns.c */
@ -284,43 +291,34 @@ void do_dnsserver(COMMAND_ARGS) __page(CMD1_SEG);
void do_dns(COMMAND_ARGS) __page(CMD1_SEG); void do_dns(COMMAND_ARGS) __page(CMD1_SEG);
/* dynamode.c */ /* dynamode.c */
/* function.c */ /* function.c */
LS void *Calloc(int) __page(CORE_SEG); void *Calloc(int) __page(CORE_SEG);
LS void Free(char **) __page(CORE_SEG); void Free(char **) __page(CORE_SEG);
LS Strp *make_strp(Strp **, const char *) __page(CORE_SEG); Strp *make_strp(Strp **, const char *) __page(CORE_SEG);
LS Strp *append_strp(Strp **, const char *) __page(CORE_SEG); Strp *append_strp(Strp **, const char *) __page(CORE_SEG);
LS Strp *prepend_strp(Strp **, const char *) __page(CORE_SEG); Strp *prepend_strp(Strp **, const char *) __page(CORE_SEG);
LS void purge_linklist(void **) __page(CORE_SEG); void purge_linklist(void **) __page(CORE_SEG);
LS void dupe_strp(Strp *, Strp **) __page(CORE_SEG); void dupe_strp(Strp *, Strp **) __page(CORE_SEG);
LS const int StrlenX(const char *, ...) __page(CORE_SEG); const int StrlenX(const char *, ...) __page(CORE_SEG);
LS const int Strlen2(const char *, const char *) __page(CORE_SEG); const int Strlen2(const char *, const char *) __page(CORE_SEG);
LS char *getuh(char *) __page(CORE_SEG); char *getuh(char *) __page(CORE_SEG);
LS char *get_token(char **, const char *) __page(CORE_SEG); char *get_token(char **, const char *) __page(CORE_SEG);
LS char *logtime(time_t) __page(CORE_SEG); char *maketimestr(time_t, int) __page(CORE_SEG);
LS char *time2str(time_t) __page(CORE_SEG); char *idle2str(time_t, int) __page(CORE_SEG);
LS char *time2away(time_t) __page(CORE_SEG); const char *get_channel(const char *, char **) __page(CORE_SEG);
LS char *time2medium(time_t) __page(CORE_SEG); const char *get_channel2(const char *, char **) __page(CORE_SEG);
LS char *time2small(time_t) __page(CORE_SEG); char *cluster(char *) __page(CORE_SEG);
LS char *idle2str(time_t, int) __page(CORE_SEG); char *format_uh(char *, int) __page(CORE_SEG);
LS const char *get_channel(const char *, char **) __page(CORE_SEG); int is_nick(const char *) __page(CORE_SEG);
LS const char *get_channel2(const char *, char **) __page(CORE_SEG); int asc2int(const char *) __page(CORE_SEG);
LS char *cluster(char *) __page(CORE_SEG); int get_number(const char *) __page(CORE_SEG);
LS char *format_uh(char *, int) __page(CORE_SEG); void parse_range(char **, int *) __page(CORE_SEG);
LS char *nick2uh(char *, char *) __page(CORE_SEG); void fix_config_line(char *) __page(CFG1_SEG);
LS void deop_ban(Chan *, ChanUser *, char *) __page(CORE_SEG); int matches(const char *, const char *) __page(CORE_SEG);
LS void deop_siteban(Chan *, ChanUser *) __page(CORE_SEG); int num_matches(const char *, const char *) __page(CORE_SEG);
LS void screwban_format(char *) __page(CORE_SEG); int is_safepath(const char *, int) __page(CORE_SEG);
LS void deop_screwban(Chan *, ChanUser *) __page(CORE_SEG);
LS int is_nick(const char *) __page(CORE_SEG);
LS int asc2int(const char *) __page(CORE_SEG);
LS int get_number(const char *) __page(CORE_SEG);
LS void fix_config_line(char *) __page(CFG1_SEG);
LS int matches(const char *, const char *) __page(CORE_SEG);
LS int num_matches(const char *, const char *) __page(CORE_SEG);
LS void table_buffer(const char *, ...) __page(CMD1_SEG);
LS void table_send(const char *, const int) __page(CMD1_SEG);
LS int is_safepath(const char *, int) __page(CORE_SEG);
/* greet.c */ /* greet.c */
@ -350,25 +348,27 @@ void do_filemon(COMMAND_ARGS) __page(CMD1_SEG);
/* io.c */ /* io.c */
LS uint32_t get_ip(const char *) __page(CORE_SEG); uint32_t get_ip(const char *) __page(CORE_SEG);
LS void SockFlags(int) __page(CORE_SEG); void SockFlags(int) __page(CORE_SEG);
LS int SockOpts(void) __page(CORE_SEG); int SockOpts(void) __page(CORE_SEG);
LS int SockListener(int) __page(CORE_SEG); int SockListener(int) __page(CORE_SEG);
LS int SockConnect(char *, int, int) __page(CORE_SEG); int SockConnect(char *, int, int) __page(CORE_SEG);
LS int SockAccept(int) __page(CORE_SEG); int SockAccept(int) __page(CORE_SEG);
int to_file(const int sock, const char *format, ...) __page(CORE_SEG); int to_file(const int sock, const char *format, ...) __page(CORE_SEG);
void to_server(const char *format, ...) __page(CORE_SEG); void to_server(const char *format, ...) __page(CORE_SEG);
void to_user_q(const char *, const char *, ...) __page(CMD1_SEG); void to_user_q(const char *, const char *, ...) __page(CMD1_SEG);
void to_user(const char *, const char *, ...) __page(CORE_SEG); void to_user(const char *, const char *, ...) __page(CORE_SEG);
void table_buffer(const char *, ...) __page(CMD1_SEG);
void table_send(const char *, const int) __page(CMD1_SEG);
char *sockread(int, char *, char *) __page(CORE_SEG); char *sockread(int, char *, char *) __page(CORE_SEG);
void readline(int, int (*)(char *)) __page(CMD1_SEG); void readline(int, int (*)(char *)) __page(CMD1_SEG);
void remove_ks(KillSock *); void remove_ks(KillSock *);
int killsock(int); int killsock(int);
LS void do_clearqueue(COMMAND_ARGS) __page(CMD1_SEG); void do_clearqueue(COMMAND_ARGS) __page(CMD1_SEG);
/* irc.c */ /* irc.c */
LS void make_ireq(int, const char *, const char *) __page(CMD1_SEG); void make_ireq(int, const char *, const char *) __page(CMD1_SEG);
void send_pa(int type, const char *nick, const char *format, ...); void send_pa(int type, const char *nick, const char *format, ...);
void do_irclusers(COMMAND_ARGS) __page(CMD1_SEG); void do_irclusers(COMMAND_ARGS) __page(CMD1_SEG);
void do_ircstats(COMMAND_ARGS) __page(CMD1_SEG); void do_ircstats(COMMAND_ARGS) __page(CMD1_SEG);
@ -383,50 +383,50 @@ void purge_kicklist(void);
void do_kicksay(COMMAND_ARGS) __page(CMD1_SEG); void do_kicksay(COMMAND_ARGS) __page(CMD1_SEG);
void do_rkicksay(COMMAND_ARGS) __page(CMD1_SEG); void do_rkicksay(COMMAND_ARGS) __page(CMD1_SEG);
/* lib/string.c */ /* string.c */
LS char *chop(char **) __page(CORE_SEG); char *chop(char **) __page(CORE_SEG);
LS void unchop(char *, const char *) __page(CORE_SEG); void unchop(char *, const char *) __page(CORE_SEG);
LS int stringcasecmp(const char *, const char *) __page(CORE_SEG); int stringcasecmp(const char *, const char *) __page(CORE_SEG);
LS int stringcmp(const char *, const char *) __page(CORE_SEG); int stringcmp(const char *, const char *) __page(CORE_SEG);
LS int nickcmp(const char *, const char *) __page(CORE_SEG); int nickcmp(const char *, const char *) __page(CORE_SEG);
LS char *nickcpy(char *, const char *) __page(CORE_SEG); char *nickcpy(char *, const char *) __page(CORE_SEG);
LS void stringcpy_n(char *, const char *, int) __page(CORE_SEG); void stringcpy_n(char *, const char *, int) __page(CORE_SEG);
LS char *stringcpy(char *, const char *) __page(CORE_SEG); char *stringcpy(char *, const char *) __page(CORE_SEG);
LS char *stringchr(const char *, int) __page(CORE_SEG); char *stringchr(const char *, int) __page(CORE_SEG);
LS char *stringdup(const char *) __page(CORE_SEG); char *stringdup(const char *) __page(CORE_SEG);
LS char *stringcat(char *, const char *) __page(CORE_SEG); char *stringcat(char *, const char *) __page(CORE_SEG);
LS char *tolowercat(char *, const char *) __page(CORE_SEG); char *tolowercat(char *, const char *) __page(CORE_SEG);
/* main.c */ /* main.c */
void mech_exec(void) __page(RARE_SEG); void mech_exec(void) __page(RARE_SEG);
int randstring_count(char *line) __page(CMD1_SEG); int randstring_count(char *line) __page(CMD1_SEG);
int randstring_getline(char *line) __page(CMD1_SEG); int randstring_getline(char *line) __page(CMD1_SEG);
LS char *randstring(const char *) __page(CORE_SEG); char *randstring(const char *) __page(CORE_SEG);
LS int sig_hup_callback(char *) __page(RARE_SEG); /* rare */ int sig_hup_callback(char *) __page(RARE_SEG); /* rare */
LS void do_sighup(void) __page(CMD1_SEG); void do_sighup(void) __page(CMD1_SEG);
LS void sig_hup(int) __page(RARE_SEG); /* rare */ void sig_hup(int) __page(RARE_SEG); /* rare */
LS void sig_child(int) __page(RARE_SEG); /* rare */ void sig_child(int) __page(RARE_SEG); /* rare */
LS void sig_alrm(int) __page(RARE_SEG); /* rare */ void sig_alrm(int) __page(RARE_SEG); /* rare */
LS void sig_pipe(int) __page(CORE_SEG); void sig_pipe(int) __page(CORE_SEG);
LS void do_sigusr1(void) __page(CMD1_SEG); void do_sigusr1(void) __page(CMD1_SEG);
LS void sig_usr1(int) __page(CMD1_SEG); void sig_usr1(int) __page(CMD1_SEG);
LS void sig_usr2(int) __page(DBUG_SEG); /* DEBUG */ void sig_usr2(int) __page(DBUG_SEG); /* DEBUG */
LS void sig_suicide() __attr(RARE_SEG, __noreturn__); /* rare */ void sig_suicide() __attr(RARE_SEG, __noreturn__); /* rare */
LS void do_sigint(void) __attr(RARE_SEG, __noreturn__); /* rare */ void do_sigint(void) __attr(RARE_SEG, __noreturn__); /* rare */
LS void sig_int(int) __page(RARE_SEG); /* rare */ void sig_int(int) __page(RARE_SEG); /* rare */
LS void sig_ill(int) __page(RARE_SEG); void sig_ill(int) __page(RARE_SEG);
LS void sig_abrt(int) __page(RARE_SEG); void sig_abrt(int) __page(RARE_SEG);
LS void sig_bus(int) __attr(RARE_SEG, __noreturn__); void sig_bus(int) __attr(RARE_SEG, __noreturn__);
#if defined(__linux__) && defined(__x86_64__) && defined(DEBUG) && !defined(__STRICT_ANSI__) #if defined(__linux__) && defined(__x86_64__) && defined(DEBUG) && !defined(__STRICT_ANSI__)
LS void sig_segv(int, siginfo_t *, void *) __attr(RARE_SEG, __noreturn__); void sig_segv(int, siginfo_t *, void *) __attr(RARE_SEG, __noreturn__);
#else #else
LS void sig_segv(int) __attr(RARE_SEG, __noreturn__); void sig_segv(int) __attr(RARE_SEG, __noreturn__);
#endif #endif
LS void sig_term(int) __attr(RARE_SEG, __noreturn__); /* rare */ void sig_term(int) __attr(RARE_SEG, __noreturn__); /* rare */
int main(int argc, char **argv, char **envp) __page(INIT_SEG); int main(int argc, char **argv, char **envp) __page(INIT_SEG);
int parse_commandline(int argc, char **argv, char **envp) __page(INIT_SEG); void parse_commandline(int argc, char **argv, char **envp) __page(INIT_SEG);
void mainloop(void) __attr(CORE_SEG, __noreturn__); void mainloop(void) __attr(CORE_SEG, __noreturn__);
/* net.c */ /* net.c */
@ -548,7 +548,6 @@ void parse_346(char *from, char *rest) __page(CORE_SEG);
void parse_348(char *from, char *rest) __page(CORE_SEG); void parse_348(char *from, char *rest) __page(CORE_SEG);
void parse_368(char *from, char *rest) __page(CORE_SEG); void parse_368(char *from, char *rest) __page(CORE_SEG);
void parse_005(char *from, char *rest) __page(CORE_SEG); void parse_005(char *from, char *rest) __page(CORE_SEG);
static __INLINE__ uint32_t stringhash(char *) __page(CORE_SEG);
void parse_server_input(char *) __page(CORE_SEG); void parse_server_input(char *) __page(CORE_SEG);
/* partyline.c */ /* partyline.c */
@ -572,6 +571,10 @@ void do_perlscript(COMMAND_ARGS) __page(CMD1_SEG);
/* prot.c */ /* prot.c */
void screwban_format(char *) __page(CORE_SEG);
void deop_ban(Chan *, ChanUser *, char *) __page(CORE_SEG);
void deop_siteban(Chan *, ChanUser *) __page(CORE_SEG);
void deop_screwban(Chan *, ChanUser *) __page(CORE_SEG);
void send_kick(Chan *chan, const char *nick, const char *format, ...); void send_kick(Chan *chan, const char *nick, const char *format, ...);
void push_kicks(Chan *chan); void push_kicks(Chan *chan);
void unmode_chanuser(Chan *chan, ChanUser *cu); void unmode_chanuser(Chan *chan, ChanUser *cu);
@ -656,7 +659,7 @@ void send_spy(const char *src, const char *format, ...) __page(CORE_SEG);
void send_global(const char *src, const char *format, ...) __page(CORE_SEG); void send_global(const char *src, const char *format, ...) __page(CORE_SEG);
void spy_typecount(Mech *bot) __page(CORE_SEG); void spy_typecount(Mech *bot) __page(CORE_SEG);
int spy_source(char *from, int *t_src, const char **src) __page(CORE_SEG); int spy_source(char *from, int *t_src, const char **src) __page(CORE_SEG);
char *urlhost(const char *) __page(CORE_SEG); void urlhost(const char *) __page(CORE_SEG);
void urlcapture(const char *) __page(CORE_SEG); void urlcapture(const char *) __page(CORE_SEG);
int begin_redirect(char *, char *) __page(CORE_SEG); int begin_redirect(char *, char *) __page(CORE_SEG);
void send_redirect(char *) __page(CORE_SEG); void send_redirect(char *) __page(CORE_SEG);
@ -672,8 +675,8 @@ void do_urlhist(COMMAND_ARGS) __page(CMD1_SEG);
#ifdef TCL #ifdef TCL
/* /*
LS char *tcl_var_read(Tcl_TVInfo *vinfo, Tcl_Interp *I, char *n1, char *n2, int flags); char *tcl_var_read(Tcl_TVInfo *vinfo, Tcl_Interp *I, char *n1, char *n2, int flags);
LS char *tcl_var_write(Tcl_TVInfo *vinfo, Tcl_Interp *I, char *n1, char *n2, int flags); char *tcl_var_write(Tcl_TVInfo *vinfo, Tcl_Interp *I, char *n1, char *n2, int flags);
*/ */
int tcl_timer_jump(Hook *hook); int tcl_timer_jump(Hook *hook);
int tcl_parse_jump(char *from, char *rest, Hook *hook); int tcl_parse_jump(char *from, char *rest, Hook *hook);
@ -682,14 +685,14 @@ void tcl_dcc_complete(Client *client, int cps);
int tcl_hook(void *foo, Tcl_Interp *I, int objc, Tcl_Obj *CONST objv[]); int tcl_hook(void *foo, Tcl_Interp *I, int objc, Tcl_Obj *CONST objv[]);
#endif #endif
/* /*
LS int tcl_unhook(void *foo, Tcl_Interp *I, int objc, Tcl_Obj *CONST objv[]); int tcl_unhook(void *foo, Tcl_Interp *I, int objc, Tcl_Obj *CONST objv[]);
LS int tcl_userlevel(void *foo, Tcl_Interp *I, int objc, Tcl_Obj *CONST objv[]); int tcl_userlevel(void *foo, Tcl_Interp *I, int objc, Tcl_Obj *CONST objv[]);
LS int tcl_debug(void *foo, Tcl_Interp *I, int objc, Tcl_Obj *CONST objv[]); int tcl_debug(void *foo, Tcl_Interp *I, int objc, Tcl_Obj *CONST objv[]);
LS int tcl_to_server(void *foo, Tcl_Interp *I, int objc, Tcl_Obj *CONST objv[]); int tcl_to_server(void *foo, Tcl_Interp *I, int objc, Tcl_Obj *CONST objv[]);
LS int tcl_to_file(void *foo, Tcl_Interp *I, int objc, Tcl_Obj *CONST objv[]); int tcl_to_file(void *foo, Tcl_Interp *I, int objc, Tcl_Obj *CONST objv[]);
LS int tcl_dcc_sendfile(void *foo, Tcl_Interp *I, int objc, Tcl_Obj *CONST objv[]); int tcl_dcc_sendfile(void *foo, Tcl_Interp *I, int objc, Tcl_Obj *CONST objv[]);
LS int tcl_dns_jump(char *host, char *resolved, Hook *hook); int tcl_dns_jump(char *host, char *resolved, Hook *hook);
LS int tcl_dns(void *foo, Tcl_Interp *I, int objc, Tcl_Obj *CONST objv[]); int tcl_dns(void *foo, Tcl_Interp *I, int objc, Tcl_Obj *CONST objv[]);
*/ */
void init_tcl(void); void init_tcl(void);
void do_tcl(COMMAND_ARGS) __page(CMD1_SEG); void do_tcl(COMMAND_ARGS) __page(CMD1_SEG);

View File

@ -145,7 +145,7 @@ help_loop:
return; return;
} }
if (STRCHR(rest,'*')) if (stringchr(rest,'*'))
{ {
line[0] = 0; line[0] = 0;
ci = 0; ci = 0;

View File

@ -53,7 +53,7 @@ struct /* statusvalues */
const int klen; const int klen;
char *valbuf; char *valbuf;
} sv[] = } statusvalues[] =
{ {
{ "VmPeak:", 7, vmpeak }, { "VmPeak:", 7, vmpeak },
{ "VmSize:", 7, vmsize }, { "VmSize:", 7, vmsize },
@ -65,55 +65,9 @@ struct /* statusvalues */
{ NULL, 0, NULL } { NULL, 0, NULL }
}; };
#ifdef DEBUG
struct
{
int value;
char *str;
} in2str[] =
{
{ IN_ACCESS, "IN_ACCESS" }, /* File was accessed (read) */
{ IN_ATTRIB, "IN_ATTRIB" }, /* Metadata changed, e.g., permissions, timestamps, extended attributes, link count, UID, GID, etc. */
{ IN_CLOSE_WRITE, "IN_CLOSE_WRITE" }, /* File opened for writing was closed */
{ IN_CLOSE_NOWRITE, "IN_CLOSE_NOWRITE" }, /* File not opened for writing was closed */
{ IN_CREATE, "IN_CREATE" }, /* File/directory created in watched directory */
{ IN_DELETE, "IN_DELETE" }, /* File/directory deleted from watched directory */
{ IN_DELETE_SELF, "IN_DELETE_SELF" }, /* Watched file/directory was itself deleted */
{ IN_MODIFY, "IN_MODIFY" }, /* File was modified */
{ IN_MOVE_SELF, "IN_MOVE_SELF" }, /* Watched file/directory was itself moved */
{ IN_MOVED_FROM, "IN_MOVED_FROM" }, /* Generated for the directory containing the old filename when a file is renamed */
{ IN_MOVED_TO, "IN_MOVED_TO" }, /* Generated for the directory containing the new filename when a file is renamed */
{ IN_OPEN, "IN_OPEN" }, /* File was opened */
{ 0, NULL }
};
char *inomask2str(uint32_t mask, char *dst)
{
const char *src;
int i,n = 0;
for(i=0;in2str[i].str;i++)
{
if ((mask & in2str[i].value) == in2str[i].value)
{
if (n)
dst[n++] = '|';
src = in2str[i].str;
for(;src[n];n++)
dst[n] = src[n];
}
}
dst[n] = 0;
return(dst);
}
#endif /* DEBUG */
int monitor_fs(const char *file) int monitor_fs(const char *file)
{ {
FileMon *fmon,*fnew; FileMon *fnew;
int ino; int ino;
if ((ino = inotify_init()) < 0) if ((ino = inotify_init()) < 0)
@ -145,15 +99,15 @@ int parse_proc_status(char *line)
#endif #endif
if (key == NULL) if (key == NULL)
return(FALSE); return(FALSE);
for(i=0;sv[i].key;i++) for(i=0;statusvalues[i].key;i++)
{ {
if (strncmp(key,sv[i].key,sv[i].klen) == 0) if (strncmp(key,statusvalues[i].key,statusvalues[i].klen) == 0)
{ {
#ifdef DEBUG #ifdef DEBUG
debug("(parse_proc_status) key %s -> %s\n",key,line); debug("(parse_proc_status) key %s -> %s\n",key,line);
#endif /* DEBUG */ #endif /* DEBUG */
dest = sv[i].valbuf; dest = statusvalues[i].valbuf;
limit = sv[i].valbuf + 31; limit = statusvalues[i].valbuf + 31;
while(*line == ' ') while(*line == ' ')
line++; line++;
while(*line && dest <= limit) while(*line && dest <= limit)
@ -250,52 +204,60 @@ int parse_proc_cpuinfo(char *line)
return(FALSE); /* return false to continue reading lines */ return(FALSE); /* return false to continue reading lines */
} }
void select_monitor() void select_monitor(void)
{ {
FileMon *fmon; FileMon *fmon;
for(fmon=filemonlist;fmon;fmon=fmon->next) for(fmon=filemonlist;fmon;fmon=fmon->next)
{
if (fmon->fd >= 0) if (fmon->fd >= 0)
{ {
FD_SET(fmon->fd,&read_fds); FD_SET(fmon->fd,&read_fds);
chkhigh(fmon->fd); chkhigh(fmon->fd);
} }
}
} }
void process_monitor() #ifdef DEBUG
extern const DEFstruct inomasks[];
#endif /* DEBUG */
void process_monitor(void)
{ {
FileMon *fmon; FileMon *fmon;
struct inotify_event *ivent; struct inotify_event *ivent;
#ifdef DEBUG
char tmp[256]; char tmp[256];
int n,m; int n;
#else
int n __notused__;
#endif /* DEBUG */
int m __notused__;
for(fmon=filemonlist;fmon;fmon=fmon->next) for(fmon=filemonlist;fmon;fmon=fmon->next)
{ {
if (fmon->fd >= 0 && FD_ISSET(fmon->fd,&read_fds)) if (fmon->fd < 0 || 0 == FD_ISSET(fmon->fd,&read_fds))
{ continue;
ivent = (struct inotify_event *)&globaldata;
n = read(fmon->fd,globaldata,sizeof(struct inotify_event)); ivent = (struct inotify_event *)&globaldata;
if (ivent->len > 0)
m = read(fmon->fd,ivent->name,ivent->len); n = read(fmon->fd,globaldata,sizeof(struct inotify_event));
else if (ivent->len > 0)
*ivent->name = 0; m = read(fmon->fd,ivent->name,ivent->len);
else
*ivent->name = 0;
#ifdef DEBUG #ifdef DEBUG
debug("(process_monitor) ino %i, n %i, sz %i\n",fmon->fd,n,sizeof(in2str)); strflags(tmp,inomasks,ivent->mask);
debug("(process_monitor) wd %i, mask %lu, cookie %lu, len %lu, name %s\n",
ivent->wd,ivent->mask,ivent->cookie,ivent->len,ivent->name); debug("(process_monitor) ino {%i} %i bytes, wd = %i, mask = %s (%lu), cookie = %lu, len = %lu, name = %s\n",
debug("(process_monitor) %s\n",inomask2str(ivent->mask,tmp)); fmon->fd,n,ivent->wd,tmp,ivent->mask,ivent->cookie,ivent->len,ivent->name);
debug("(process_monitor) ino %i bytes read, int wd = %i, uint32_t mask = %s (%lu), " #endif /* DEBUG */
"uint32_t cookie = %lu, uint32_t len = %lu, char name = %s\n", if ((ivent->mask & IN_CLOSE_WRITE) == IN_CLOSE_WRITE)
n,ivent->wd,inomask2str(ivent->mask,tmp),ivent->mask,ivent->cookie,ivent->len,ivent->name); return;
#endif if (fmon->nospam > now-30)
if ((ivent->mask & IN_CLOSE_WRITE) == IN_CLOSE_WRITE) return;
return; fmon->nospam = now;
if (fmon->nospam > now-30) send_global(SPYSTR_SYSMON,"Alert: file ``%s'' was touched",fmon->filename);
return;
fmon->nospam = now;
send_global(SPYSTR_SYSMON,"Alert: file ``%s'' was touched",fmon->filename);
}
} }
} }
@ -346,8 +308,8 @@ void do_meminfo(COMMAND_ARGS)
p = getpid(); p = getpid();
snprintf(fn,sizeof(fn),"/proc/%i/status",p); snprintf(fn,sizeof(fn),"/proc/%i/status",p);
for(i=0;sv[i].key;i++) for(i=0;statusvalues[i].key;i++)
*(sv[i].valbuf) = 0; *(statusvalues[i].valbuf) = 0;
if ((fd = open(fn,O_RDONLY)) < 0) if ((fd = open(fn,O_RDONLY)) < 0)
return; return;
readline(fd,&parse_proc_status); /* readline closes fd */ readline(fd,&parse_proc_status); /* readline closes fd */
@ -364,18 +326,9 @@ See also: hostinfo, meminfo
void do_cpuinfo(COMMAND_ARGS) void do_cpuinfo(COMMAND_ARGS)
{ {
char bogostr[256],cpustr[64]; char bogostr[256],cpustr[64];
char *a1,*a2,*a3,*dst; int fd;
int fd,n;
double loads[3]; double loads[3];
#ifdef DEVELOPING
a1 = chop(&rest);
if (a1)
sprintf(bogostr,"/home/git/cpuinfo/%s",a1);
else
stringcpy(bogostr,"/proc/cpuinfo");
if ((fd = open(bogostr,O_RDONLY)) < 0)
#endif
if ((fd = open("/proc/cpuinfo",O_RDONLY)) < 0) if ((fd = open("/proc/cpuinfo",O_RDONLY)) < 0)
#ifdef DEBUG #ifdef DEBUG
{ {

View File

@ -204,7 +204,8 @@ int SockConnect(char *host, int port, int use_vhost)
int SockAccept(int sock) int SockAccept(int sock)
{ {
struct sockaddr_in sai; struct sockaddr_in sai;
int s,sz; unsigned int sz;
int s;
sz = sizeof(sai); sz = sizeof(sai);
s = accept(sock,(struct sockaddr*)&sai,&sz); s = accept(sock,(struct sockaddr*)&sai,&sz);
@ -309,7 +310,7 @@ void to_user_q(const char *target, const char *format, ...)
if (STARTUP_ECHOTOCONSOLE) if (STARTUP_ECHOTOCONSOLE)
{ {
int n; int n __notused__;
n = write(1,message,strlen(message)); n = write(1,message,strlen(message));
return; return;
} }
@ -449,6 +450,91 @@ void to_user(const char *target, const char *format, ...)
#endif /* DEBUG */ #endif /* DEBUG */
} }
Strp *output_table = NULL;
void table_buffer(const char *format, ...)
{
va_list msg;
va_start(msg,format);
vsprintf(globaldata,format,msg);
va_end(msg);
set_mallocdoer(table_buffer);
append_strp(&output_table,globaldata);
}
void table_send(const char *from, const int space)
{
char message[MAXLEN];
Strp *sp,*next;
char *src,*o,*end;
int i,u,g,x,columns[16];
memset(columns,0,sizeof(columns));
for(sp=output_table;sp;sp=sp->next)
{
u = i = 0;
src = o = sp->p;
while(*src)
{
/* Dont count control codes */
if (*src == '\037' || *src == '\002')
u++;
if (*src == '\t' || *src == '\r')
{
x = (src - o) - u;
if (x > columns[i])
columns[i] = x;
i++;
o = src+1;
u = 0;
}
src++;
}
}
for(sp=output_table;sp;sp=next)
{
next = sp->next;
o = message;
src = sp->p;
g = x = i = 0;
while(*src)
{
if (g)
{
end = src;
while(*end && *end != '\t' && *end != '\r')
end++;
g -= (end - src);
while(g-- > 0)
*(o++) = ' ';
}
if (*src == '\037' || *src == '\002')
x++;
if (*src == '\t' || *src == '\r')
{
if (*src == '\r')
g = columns[i+1];
src++;
x += (columns[i++] + space);
while(o < (message + x))
*(o++) = ' ';
}
else
*(o++) = *(src++);
}
*o = 0;
to_user(from,FMT_PLAIN,message);
Free((char**)&sp);
}
output_table = NULL;
}
#endif /* ifndef GENCMD_C */ #endif /* ifndef GENCMD_C */
/* /*

View File

@ -144,8 +144,8 @@ void mech_exec(void)
exit(1); exit(1);
} }
LS int r_ct; int r_ct;
LS char r_str[MSGLEN]; char r_str[MSGLEN];
int randstring_count(char *line) int randstring_count(char *line)
{ {
@ -199,7 +199,7 @@ char *randstring(const char *file)
* SIGUSR2 Call run_debug() (dump `everything' to a debug file) * SIGUSR2 Call run_debug() (dump `everything' to a debug file)
*/ */
LS struct struct
{ {
uint32_t sighup:1, uint32_t sighup:1,
sigint:1, sigint:1,
@ -667,7 +667,7 @@ doit_jumptonext:
if (current->ip.s_addr == 0) if (current->ip.s_addr == 0)
{ {
struct sockaddr_in sai; struct sockaddr_in sai;
int sz; unsigned int sz;
sz = sizeof(sai); sz = sizeof(sai);
if (getsockname(current->sock,(struct sockaddr *)&sai,&sz) == 0) if (getsockname(current->sock,(struct sockaddr *)&sai,&sz) == 0)
@ -777,6 +777,18 @@ restart_dcc:
if (current->sock != -1) if (current->sock != -1)
process_server_input(); process_server_input();
#ifdef DEBUG
if (current->inject)
{
char injection[MSGLEN];
stringcpy(injection,current->inject);
Free((char**)&current->inject);
debug("(*inject) %s\n");
parse_server_input(injection);
}
#endif /* DEBUG */
if (current->connect == CN_ONLINE) if (current->connect == CN_ONLINE)
{ {
/* /*
@ -897,7 +909,7 @@ restart_die:
const char *bad_exe = "init: Error: Improper executable name\n"; const char *bad_exe = "init: Error: Improper executable name\n";
int parse_commandline(int argc, char **argv, char **envp) void parse_commandline(int argc, char **argv, char **envp)
{ {
struct stat st; struct stat st;
char *opt; char *opt;
@ -919,6 +931,11 @@ int parse_commandline(int argc, char **argv, char **envp)
stat("..",&st); stat("..",&st);
parent_inode = st.st_ino; /* used for is_safepath() */ parent_inode = st.st_ino; /* used for is_safepath() */
if (stat("/proc",&st) >= 0)
{
cx.system_uptime = st.st_ctime;
}
srand(now+getpid()); srand(now+getpid());
/* /*
@ -956,6 +973,7 @@ int parse_commandline(int argc, char **argv, char **envp)
} }
#ifdef DEBUG #ifdef DEBUG
/* memory tracking */
mrrec = calloc(sizeof(aMEA),1); mrrec = calloc(sizeof(aMEA),1);
#endif /* DEBUG */ #endif /* DEBUG */
@ -964,7 +982,7 @@ int parse_commandline(int argc, char **argv, char **envp)
to_file(1,bad_exe); to_file(1,bad_exe);
_exit(1); _exit(1);
} }
if ((opt = STRCHR(*argv,' ')) != NULL) if ((opt = stringchr(*argv,' ')) != NULL)
{ {
*(opt++) = 0; *(opt++) = 0;
respawn = asc2int(opt); respawn = asc2int(opt);
@ -984,66 +1002,26 @@ int parse_commandline(int argc, char **argv, char **envp)
opt = *argv; opt = *argv;
switch(opt[1]) switch(opt[1])
{ {
case 'v':
versiononly = TRUE;
break;
case 'h':
to_file(1,TEXT_USAGE,executable);
to_file(1,
TEXT_CSWITCH
#ifdef DEBUG
TEXT_DSWITCH
#endif /* DEBUG */
TEXT_ESWITCH
TEXT_FSWITCH
TEXT_HSWITCH
#ifdef DEBUG
TEXT_OSWITCH
TEXT_PSWITCH1
TEXT_PSWITCH2
#endif /* DEBUG */
TEXT_TSWITCH
TEXT_VSWITCH
#ifdef DEBUG
TEXT_XSWITCH
#endif /* DEBUG */
);
_exit(0);
case 'c': case 'c':
makecore = TRUE; makecore = TRUE;
break; break;
#ifdef DEBUG #ifdef DEBUG
case 'd': case 'd':
dodebug = TRUE; dodebug = TRUE;
do_fork = FALSE; do_fork = TRUE;
break; if (opt[2] != 0) /* -d[file] */
case 'o':
if (opt[2] != 0)
{ {
debugfile = &opt[2]; debugfile = &opt[2];
} }
else else
if (argv[1] && argv[1][0] != '-') /* -d [file] */
{ {
++argv; ++argv;
if (!*argv)
{
to_file(1,"init: No debugfile specified\n");
_exit(0);
}
debugfile = *argv; debugfile = *argv;
argc--; argc--;
} }
do_fork = TRUE;
break;
case 'p':
++argv;
if (*argv)
to_file(1,"%s\n",makepass(*argv));
else else
to_file(1,"error: Missing argument for -p <string>\n"); do_fork = FALSE;
_exit(0);
case 'X':
debug_on_exit = TRUE;
break; break;
#endif /* DEBUG */ #endif /* DEBUG */
case 'e': /* run a single command before exiting */ case 'e': /* run a single command before exiting */
@ -1057,9 +1035,6 @@ int parse_commandline(int argc, char **argv, char **envp)
else else
to_file(1,"error: Missing argument for -e <command string>\n"); to_file(1,"error: Missing argument for -e <command string>\n");
_exit(0); _exit(0);
case 't':
startup = STARTUP_TESTRUN;
break;
case 'f': case 'f':
if (opt[2] != 0) if (opt[2] != 0)
{ {
@ -1078,6 +1053,43 @@ int parse_commandline(int argc, char **argv, char **envp)
} }
to_file(1,INFO_USINGCONF,configfile); to_file(1,INFO_USINGCONF,configfile);
break; break;
case 'h':
to_file(1,TEXT_USAGE,executable);
to_file(1,
TEXT_CSWITCH
#ifdef DEBUG
TEXT_DSWITCH
#endif /* DEBUG */
TEXT_ESWITCH
TEXT_FSWITCH
TEXT_HSWITCH
TEXT_PSWITCH1
TEXT_PSWITCH2
TEXT_TSWITCH
TEXT_VSWITCH
#ifdef DEBUG
TEXT_XSWITCH
#endif /* DEBUG */
);
_exit(0);
case 'p':
++argv;
if (*argv)
to_file(1,"%s\n",makepass(*argv));
else
to_file(1,"error: Missing argument for -p <string>\n");
_exit(0);
case 't':
startup = STARTUP_TESTRUN;
break;
case 'v':
versiononly = TRUE;
break;
#ifdef DEBUG
case 'x':
debug_on_exit = TRUE;
break;
#endif /* DEBUG */
default: default:
to_file(1,ERR_UNKNOWNOPT,opt); to_file(1,ERR_UNKNOWNOPT,opt);
_exit(1); _exit(1);
@ -1098,7 +1110,7 @@ int parse_commandline(int argc, char **argv, char **envp)
to_file(1,"warning: current configuration file overrides session file\n"); to_file(1,"warning: current configuration file overrides session file\n");
} }
#endif /* SESSION */ #endif /* SESSION */
if (stat(configfile,&st)); if (stat(configfile,&st))
{ {
if ((st.st_mode & (S_IWGRP|S_IWOTH)) != 0) if ((st.st_mode & (S_IWGRP|S_IWOTH)) != 0)
{ {
@ -1108,7 +1120,7 @@ int parse_commandline(int argc, char **argv, char **envp)
if ((st.st_mode & (S_IRGRP|S_IROTH)) != 0) if ((st.st_mode & (S_IRGRP|S_IROTH)) != 0)
to_file(1,"warning: configfile is readable by others\n"); to_file(1,"warning: configfile is readable by others\n");
} }
if (stat(".",&st)); if (stat(".",&st))
{ {
if ((st.st_mode & (S_IWGRP|S_IWOTH)) != 0) if ((st.st_mode & (S_IWGRP|S_IWOTH)) != 0)
{ {
@ -1174,7 +1186,7 @@ int parse_commandline(int argc, char **argv, char **envp)
} }
#else #else
{ {
if (stat(opt,&st)); if (stat(opt,&st))
{ {
if ((st.st_mode & (S_IWGRP|S_IWOTH)) != 0) if ((st.st_mode & (S_IWGRP|S_IWOTH)) != 0)
{ {

View File

@ -46,10 +46,11 @@ const char banneropt[] = "BB%i %i PTA"
#ifdef TELNET #ifdef TELNET
char *telnetprompt = TEXT_ENTERNICKNAME; char *telnetprompt = TEXT_ENTERNICKNAME;
#endif /* TELNET */ #endif /* TELNET */
/* /*
* this is a partial copy of the BotNet struct * this is a partial copy of the BotNet struct
*/ */
LS struct struct
{ {
struct BotNet *next; struct BotNet *next;
@ -73,7 +74,7 @@ typedef struct LinkCmd
#define RELAY_YES 1 #define RELAY_YES 1
#define RELAY_NO 0 #define RELAY_NO 0
LS const LinkCmd basicProto[] = const LinkCmd basicProto[] =
{ {
{ "BA", basicAuth, RELAY_NO }, { "BA", basicAuth, RELAY_NO },
{ "BB", basicBanner, RELAY_NO }, { "BB", basicBanner, RELAY_NO },
@ -95,7 +96,7 @@ LS const LinkCmd basicProto[] =
{ "\0\0", NULL, RELAY_NO }, { "\0\0", NULL, RELAY_NO },
}; };
LS int deadlinks = FALSE; int deadlinks = FALSE;
/* /*
* *
@ -160,7 +161,6 @@ NetCfg *find_netcfg(int guid)
BotInfo *make_botinfo(int guid, int hops, char *nuh, char *server, char *version) BotInfo *make_botinfo(int guid, int hops, char *nuh, char *server, char *version)
{ {
BotInfo *newbinfo; BotInfo *newbinfo;
int sn,vn;
set_mallocdoer(make_botinfo); set_mallocdoer(make_botinfo);
newbinfo = (BotInfo*)Calloc(sizeof(BotInfo) + StrlenX(nuh,server,version,NULL)); newbinfo = (BotInfo*)Calloc(sizeof(BotInfo) + StrlenX(nuh,server,version,NULL));
@ -168,11 +168,6 @@ BotInfo *make_botinfo(int guid, int hops, char *nuh, char *server, char *version
newbinfo->guid = guid; newbinfo->guid = guid;
newbinfo->hops = hops; newbinfo->hops = hops;
/*
sprintf(newbinfo->nuh,"%s%c%n%s%c%n%s",nuh,0,&sn,server,0,&vn,version);
newbinfo->server = newbinfo->nuh + sn;
newbinfo->version = newbinfo->nuh + vn;
*/
newbinfo->server = stringcat(newbinfo->nuh,nuh) + 1; newbinfo->server = stringcat(newbinfo->nuh,nuh) + 1;
newbinfo->version = stringcat(newbinfo->server,server) + 1; newbinfo->version = stringcat(newbinfo->server,server) + 1;
stringcpy(newbinfo->version,version); stringcpy(newbinfo->version,version);
@ -922,10 +917,10 @@ void partyAuth(BotNet *bn, char *rest)
{ {
User *user; User *user;
Strp *ump; Strp *ump;
char *name,*userhost,*checksum; char *userhost,*checksum;
int m; int m;
name = chop(&rest); chop(&rest);
userhost = chop(&rest); userhost = chop(&rest);
if ((checksum = chop(&rest)) == NULL) if ((checksum = chop(&rest)) == NULL)
checksum = ""; checksum = "";
@ -1337,10 +1332,8 @@ void ushareTick(BotNet *bn, char *rest)
void ushareDelete(BotNet *bn, char *rest) void ushareDelete(BotNet *bn, char *rest)
{ {
User *user; User *user;
char *orig;
int modcount; int modcount;
orig = rest;
modcount = asc2int(chop(&rest)); modcount = asc2int(chop(&rest));
if (errno) if (errno)
return; return;
@ -1779,10 +1772,9 @@ void do_cmd(COMMAND_ARGS)
Mech *backup; Mech *backup;
char tempdata[MAXLEN]; char tempdata[MAXLEN];
char *target,*orig = rest; char *target,*orig = rest;
int guid;
target = chop(&rest); target = chop(&rest);
guid = asc2int(target); asc2int(target);
if (errno) if (errno)
{ {
unchop(orig,rest); unchop(orig,rest);
@ -1796,7 +1788,7 @@ void do_cmd(COMMAND_ARGS)
return; return;
} }
if (STRCHR(from,'!')) if (stringchr(from,'!'))
sprintf(tempdata,"%s %i %s %s",target,current->guid,from,rest); sprintf(tempdata,"%s %i %s %s",target,current->guid,from,rest);
else else
sprintf(tempdata,"%s %i %s!%s %s",target,current->guid,from,CurrentUser->mask->p,rest); sprintf(tempdata,"%s %i %s!%s %s",target,current->guid,from,CurrentUser->mask->p,rest);

View File

@ -34,7 +34,6 @@ int catch_note(char *from, char *to, char *rest)
{ {
User *u; User *u;
Note *n,**pp; Note *n,**pp;
Strp *sp,**np;
#ifdef DEBUG #ifdef DEBUG
debug("(catch_note) from = %s, to = %s, rest = %s\n",from,to,rest); debug("(catch_note) from = %s, to = %s, rest = %s\n",from,to,rest);
@ -85,7 +84,6 @@ void do_note(COMMAND_ARGS)
{ {
User *u; User *u;
Note *n; Note *n;
Strp *sp,**np;
char header[MSGLEN]; char header[MSGLEN];
/* /*
@ -112,7 +110,7 @@ void do_note(COMMAND_ARGS)
/* /*
* add a note header * add a note header
*/ */
sprintf(header,"\001%s %s",from,time2str(now)); sprintf(header,"\001%s %s",from,maketimestr(now,TFMT_FULL));
append_strp(&u->note,header); append_strp(&u->note,header);
} }

120
src/ons.c
View File

@ -231,7 +231,7 @@ void on_join(Chan *chan, char *from)
*/ */
if (chan->setting[TOG_CTL].int_var) if (chan->setting[TOG_CTL].int_var)
{ {
if (STRCHR(from,'\031') || STRCHR(from,'\002') || STRCHR(from,'\022') || STRCHR(from,'\026')) if (stringchr(from,'\031') || stringchr(from,'\002') || stringchr(from,'\022') || stringchr(from,'\026'))
{ {
deop_siteban(chan,cu); deop_siteban(chan,cu);
send_kick(chan,CurrentNick,KICK_BAD_IDENT); send_kick(chan,CurrentNick,KICK_BAD_IDENT);
@ -639,20 +639,20 @@ recheck_alias:
Free(&current->lastcmds[LASTCMDSIZE-1]); Free(&current->lastcmds[LASTCMDSIZE-1]);
for(j=LASTCMDSIZE-2;j>=0;j--) for(j=LASTCMDSIZE-2;j>=0;j--)
current->lastcmds[j+1] = current->lastcmds[j]; current->lastcmds[j+1] = current->lastcmds[j];
if ((pt = STRCHR(from,'@')) == NULL) if ((pt = stringchr(from,'@')) == NULL)
pt = from; pt = from;
set_mallocdoer(on_msg); set_mallocdoer(on_msg);
current->lastcmds[0] = (char*)Calloc(strlen(pt) + 45); current->lastcmds[0] = (char*)Calloc(strlen(pt) + 45);
if (CurrentUser) if (CurrentUser)
{ {
sprintf(current->lastcmds[0],"[%s] %s\r%s[%-3i]\t(*%s)", sprintf(current->lastcmds[0],"[%s] %s\r%s[%-3i]\t(*%s)",
time2medium(now),command,CurrentUser->name, maketimestr(now,TFMT_CLOCK),command,CurrentUser->name,
(CurrentUser->x.x.access),pt); (CurrentUser->x.x.access),pt);
} }
else else
{ {
sprintf(current->lastcmds[0],"[%s] %s\r%s[---]\t(*%s)", sprintf(current->lastcmds[0],"[%s] %s\r%s[---]\t(*%s)",
time2medium(now),command,CurrentNick,pt); maketimestr(now,TFMT_CLOCK),command,CurrentNick,pt);
} }
} }
@ -745,8 +745,11 @@ void on_mode(char *from, char *channel, char *rest)
char templimit[20]; char templimit[20];
char *nick; char *nick;
char *parm,*nickuh,*mode; char *parm,*nickuh,*mode;
int i,sign,enfm,maxprot; int i,sign,rev,enfm,flag,maxprot,isself;
#ifdef DEBUG
debug("(on_mode) %s --> %s: %s\n",from,channel,rest);
#endif /* DEBUG */
if ((chan = find_channel_ac(channel)) == NULL) if ((chan = find_channel_ac(channel)) == NULL)
return; return;
channel = chan->name; channel = chan->name;
@ -765,16 +768,6 @@ void on_mode(char *from, char *channel, char *rest)
doer = find_chanuser(chan,from); doer = find_chanuser(chan,from);
modeloop: modeloop:
if (*mode == 'o' || *mode == 'v')
{
nick = chop(&rest);
if ((victim = find_chanuser(chan,nick)) == NULL)
{
mode++;
goto modeloop;
}
}
switch(*mode) switch(*mode)
{ {
case '+': case '+':
@ -783,25 +776,50 @@ modeloop:
break; break;
/* /*
* *
* MODE <channel> +/-v <nick>
* MODE <channel> +/-o <nick> * MODE <channel> +/-o <nick>
* *
*/ */
case 'v':
case 'o': case 'o':
nick = chop(&rest);
victim = find_chanuser(chan,nick);
if (victim == NULL) /* Cant take action against an unknown entity */
{
mode++;
goto modeloop;
}
rev = 0;
i = (victim->user) ? victim->user->x.x.access : 0; i = (victim->user) ? victim->user->x.x.access : 0;
/*
* Can only be 'o' or 'v'
* Sign can only be '+' or '-'
* #define CU_VOICE 0x0001
* #define CU_CHANOP 0x0002
*/
flag = CU_VOICE + (*mode == 'o');
victim->flags &= ~flag;
victim->flags |= (flag & (-(sign == '+')));
if (*mode == 'v')
break;
victim->flags &= ~CU_DEOPPED;
isself = (0 == nickcmp(getbotnick(current),nick)) ? TRUE : FALSE;
/* +o */ if (sign == '+') /* +o */ if (sign == '+')
{ {
victim->flags |= CU_CHANOP; if (0 == i)
victim->flags &= ~CU_DEOPPED;
if (!i)
{ {
if (victim->shit || (chan->setting[TOG_SD].int_var && !doer) || if (victim->shit || (chan->setting[TOG_SO].int_var) || (chan->setting[TOG_SD].int_var && !doer))
chan->setting[TOG_SO].int_var)
{ {
send_mode(chan,60,QM_CHANUSER,'-','o',victim); rev = '-';
} }
} }
else if (isself)
if (!nickcmp(getbotnick(current),nick))
{ {
/* /*
* wooohoooo! they gave me ops!!! * wooohoooo! they gave me ops!!!
@ -815,35 +833,30 @@ modeloop:
} }
check_shit(); check_shit();
update_modes(chan); update_modes(chan);
if (current->spy & SPYF_STATUS)
send_spy(SPYSTR_STATUS,"Given op on %s, set by %s",chan->name,nick);
} }
#ifdef DEBUG
debug("(on_mode) %s!%s --> %i\n",victim->nick,victim->userhost,i);
#endif /* DEBUG */
} }
/* -o */ else /* -o */ else
{ {
victim->flags &= ~(CU_CHANOP|CU_DEOPPED); if (isself)
if (i == BOTLEVEL)
{ {
if (!nickcmp(getbotnick(current),nick)) /*
{ * they dont love me!!! :~(
/* */
* they dont love me!!! :~( chan->bot_is_op = FALSE;
*/ if (current->spy & SPYF_STATUS)
chan->bot_is_op = FALSE; send_spy(SPYSTR_STATUS,"Lost op on %s, removed by %s",chan->name,nick);
}
} }
/* /*
* idiots deopping themselves * idiots deopping themselves
*/ */
if (!nickcmp(from,nick)) #ifdef DEBUG
debug("(on_mode) doer == victim: %s\n",(doer == victim) ? "TRUE" : "FALSE");
#endif /* DEBUG */
if (doer == victim)
break; break;
/* if (doer && doer->user && doer->user->x.x.access >= OWNERLEVEL)
* 1. Use enfm var to temporarily store users access
* 2. get_userlevel also checks is_localbot()...
*/
enfm = (doer && doer->user) ? doer->user->x.x.access : 0;
if (enfm == BOTLEVEL)
break; break;
if (check_mass(chan,doer,INT_MDL)) if (check_mass(chan,doer,INT_MDL))
mass_action(chan,doer); mass_action(chan,doer);
@ -855,29 +868,14 @@ modeloop:
nickuh = get_nuh(victim); nickuh = get_nuh(victim);
if (get_authaccess(nickuh,channel)) if (get_authaccess(nickuh,channel))
{ {
send_mode(chan,60,QM_CHANUSER,'+','o',victim); rev = '+';
prot_action(chan,from,doer,NULL,victim); prot_action(chan,from,doer,NULL,victim);
} }
} }
} }
if (rev)
send_mode(chan,60,QM_CHANUSER,rev,'o',victim);
break; break;
/*
*
* MODE <channel> +/-v <nick>
*
*/
case 'v':
if (sign == '+')
victim->flags |= CU_VOICE;
else
victim->flags &= ~CU_VOICE;
break;
#ifdef IRCD_EXTENSIONS
/*
:joonicks!*@* MODE #emech +I *king*!*@*
:joonicks!*@* MODE #emech +e *kong*!*@*
*/
#endif /* IRCD_EXTENSIONS */
/* /*
* *
* MODE <channel> +/-b <parm> * MODE <channel> +/-b <parm>
@ -886,6 +884,8 @@ modeloop:
#ifdef IRCD_EXTENSIONS #ifdef IRCD_EXTENSIONS
/* /*
* ircnet braindamage modes * ircnet braindamage modes
* :joonicks!*@* MODE #emech +I *king*!*@*
* :joonicks!*@* MODE #emech +e *kong*!*@*
*/ */
case 'I': case 'I':
case 'e': case 'e':

View File

@ -816,7 +816,7 @@ void parse_317(char *from, char *rest)
} }
if (when != -1) if (when != -1)
send_pa(PA_WHOIS,nick,"Signed On: %s",time2away(when)); send_pa(PA_WHOIS,nick,"Signed On: %s",maketimestr(when,TFMT_AWAY));
send_pa(PA_WHOIS,nick, send_pa(PA_WHOIS,nick,
(sec) ? "Idle: %i minute%s, %i second%s" : "Idle: %i minute%s", (sec) ? "Idle: %i minute%s, %i second%s" : "Idle: %i minute%s",

View File

@ -124,7 +124,7 @@ void partyline_banner(Client *client)
sprintf(tmp,"[%s] %s[%i] has connected", sprintf(tmp,"[%s] %s[%i] has connected",
getbotnick(current),client->user->name,(int)client->user->x.x.access); getbotnick(current),client->user->name,(int)client->user->x.x.access);
if ((to_file(client->sock,"[%s] %s\n",time2medium(now),tmp)) < 0) if ((to_file(client->sock,"[%s] %s\n",maketimestr(now,TFMT_CLOCK),tmp)) < 0)
{ {
client->flags = DCC_DELETE; client->flags = DCC_DELETE;
return; return;
@ -142,9 +142,10 @@ void partyline_banner(Client *client)
void dcc_chat(char *from) void dcc_chat(char *from)
{ {
struct sockaddr_in sai; struct sockaddr_in sai;
unsigned int sz;
Client *client; Client *client;
User *user; User *user;
int sock,sz; int sock;
if ((user = get_authuser(from,NULL)) == NULL) if ((user = get_authuser(from,NULL)) == NULL)
return; return;

View File

@ -28,6 +28,60 @@
#include "text.h" #include "text.h"
#include "mcmd.h" #include "mcmd.h"
/*
* deal with undesired lusers
*/
void screwban_format(char *userhost)
{
int sz,n,pos;
#ifdef DEBUG
debug("(screwban_format) %s\n",userhost);
#endif /* DEBUG */
if ((sz = strlen(userhost)) < 8)
return;
n = RANDOM(4,sz);
while(--n)
{
pos = RANDOM(0,(sz - 1));
if (!stringchr("?!@*",userhost[pos]))
{
userhost[pos] = (RANDOM(0,3) == 0) ? '*' : '?';
}
}
}
void deop_ban(Chan *chan, ChanUser *victim, char *mask)
{
if (!mask)
mask = format_uh(get_nuh(victim),FUH_USERHOST);
send_mode(chan,85,QM_CHANUSER,'-','o',victim);
send_mode(chan,90,QM_RAWMODE,'+','b',mask);
}
void deop_siteban(Chan *chan, ChanUser *victim)
{
char *mask;
mask = format_uh(get_nuh(victim),FUH_HOST);
deop_ban(chan,victim,mask);
}
void deop_screwban(Chan *chan, ChanUser *victim)
{
char *mask;
int i;
for(i=2;--i;)
{
mask = format_uh(get_nuh(victim),FUH_USERHOST);
screwban_format(mask);
deop_ban(chan,victim,mask);
}
}
/* /*
* *
* kicking and screaming * kicking and screaming
@ -821,7 +875,7 @@ void do_unban(COMMAND_ARGS)
if (((chan = find_channel_ac(to)) == NULL) || !chan->bot_is_op) if (((chan = find_channel_ac(to)) == NULL) || !chan->bot_is_op)
return; return;
if (nick && STRCHR(nick,'*')) if (nick && stringchr(nick,'*'))
{ {
channel_massunban(chan,nick,0); channel_massunban(chan,nick,0);
return; return;

View File

@ -1,7 +1,7 @@
/* /*
EnergyMech, IRC bot software EnergyMech, IRC bot software
Copyright (c) 1997-2018 proton Copyright (c) 1997-2025 proton
This program is free software; you can redistribute it and/or modify This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by it under the terms of the GNU General Public License as published by
@ -27,11 +27,13 @@
#include "h.h" #include "h.h"
#ifdef TELNET #ifdef TELNET
LS int client_type = DCC_ACTIVE;
int client_type = DCC_ACTIVE;
#endif /* TELNET */ #endif /* TELNET */
#define mkaxx(x) (0x40404040 + (0x0f0f & x) + ((0xf0f0 & x) << 12)) #define simpleencode(x) (0x41414141 + (0x0f0f & x) + ((0xf0f0 & x) << 12))
#define getaxx(x) (((x & 0x0f0f0000) >> 12) | (x & 0x00000f0f)) #define simpledecode(x) ((((x - 0x41410000) & 0x0f0f0000) >> 12) | ((x - 0x4141) & 0x0f0f))
char *recover_client(char *env) char *recover_client(char *env)
{ {
@ -40,17 +42,18 @@ char *recover_client(char *env)
char asc[8]; char asc[8];
} axx; } axx;
struct sockaddr_in sai; struct sockaddr_in sai;
unsigned int sz;
Client *client; Client *client;
User *user; User *user;
char *p,*handle; char *p,*handle;
int guid = 0,fd = 0,sz; int guid = 0,fd = 0;
if (env[8] != ':') if (env[8] != ':')
return(env); return(env);
memcpy(axx.asc,env,8); /* compiler is not stupid and will optimize the shit out of this */ memcpy(axx.asc,env,8); /* compiler is not stupid and will optimize the shit out of this */
guid = getaxx(axx.num[0]); guid = simpledecode(axx.num[0]);
fd = getaxx(axx.num[1]); fd = simpledecode(axx.num[1]);
handle = p = (env = env + 9); handle = p = (env = env + 9);
while(*p) while(*p)
@ -97,7 +100,7 @@ char *recover_client(char *env)
found_user: found_user:
if (to_file(fd,"[%s] [%s] %s[%i] has connected (reset recover)\n", if (to_file(fd,"[%s] [%s] %s[%i] has connected (reset recover)\n",
time2medium(now),getbotwantnick(current),handle,user->x.x.access) < 0) maketimestr(now,TFMT_CLOCK),getbotwantnick(current),handle,user->x.x.access) < 0)
{ {
close(fd); close(fd);
return(p); return(p);
@ -142,16 +145,16 @@ char *recover_debug(char *env)
char asc[4]; char asc[4];
} axx; } axx;
struct stat s; struct stat s;
char *d;
debug_fd = 0; debug_fd = 0;
d = stringchr(env,'&');
if (env[4] != ' ' && env[4] != 0)
return(env);
/* /*
* get the fd number * get the fd number
*/ */
memcpy(axx.asc,env,4); /* compiler is not stupid and will optimize the shit out of this */ memcpy(axx.asc,env,4); /* compiler is not stupid and will optimize the shit out of this */
debug_fd = getaxx(axx.num); debug_fd = simpledecode(axx.num);
if (fstat(debug_fd,&s) < 0) if (fstat(debug_fd,&s) < 0)
{ {
@ -164,17 +167,19 @@ char *recover_debug(char *env)
dodebug = TRUE; dodebug = TRUE;
debug("(recover_debug) {%i} debug fd recovered\n",debug_fd); debug("(recover_debug) {%i} debug fd recovered\n",debug_fd);
CoreClient.sock = debug_fd; CoreClient.sock = debug_fd;
if (d && is_safepath(d+1,FILE_MAY_EXIST) == TRUE)
{
debugfile = d+1;
debug("(recover_debug) output file = %s\n",debugfile);
}
} }
return(env+4); d = chop(&env);
return(env);
} }
#endif /* DEBUG */ #endif /* DEBUG */
/* /*
(do_reset) mkaxx(3) = C@@@
(do_reset) ircx mkaxx(12) = L@@@
(do_reset) sock mkaxx(2) = B@@@
(do_reset) guid mkaxx(1881) = IGE@
[StS] {2} PING :OT1523818405 [StS] {2} PING :OT1523818405
(do_reset) MECHRESET=dC@@@ fXIGE@B@@@L@@@ tIGE@F@@@:joo [44] (do_reset) MECHRESET=dC@@@ fXIGE@B@@@L@@@ tIGE@F@@@:joo [44]
execve( ./energymech, argv = { ./energymech <NULL> <NULL> <NULL> <NULL> }, envp = { MECHRESET=dC@@@ fXIGE@B@@@L@@@ tIGE@F@@@:joo } ) execve( ./energymech, argv = { ./energymech <NULL> <NULL> <NULL> <NULL> }, envp = { MECHRESET=dC@@@ fXIGE@B@@@L@@@ tIGE@F@@@:joo } )
@ -187,8 +192,8 @@ char *recover_server(char *env)
char asc[16]; char asc[16];
} axx; } axx;
struct sockaddr_in sai; struct sockaddr_in sai;
char *p; unsigned int sz;
int guid = 0,fd = 0,sz; int guid = 0,fd = 0;
#ifdef IRCD_EXTENSIONS #ifdef IRCD_EXTENSIONS
int ircx = 0; int ircx = 0;
#endif /* IRCD_EXTENSIONS */ #endif /* IRCD_EXTENSIONS */
@ -209,10 +214,10 @@ char *recover_server(char *env)
memcpy(axx.asc,env,sz); /* compiler is not stupid and will optimize the shit out of this */ memcpy(axx.asc,env,sz); /* compiler is not stupid and will optimize the shit out of this */
env += sz; env += sz;
guid = getaxx(axx.num[0]); guid = simpledecode(axx.num[0]);
fd = getaxx(axx.num[1]); fd = simpledecode(axx.num[1]);
#ifdef IRCD_EXTENSIONS #ifdef IRCD_EXTENSIONS
ircx = getaxx(axx.num[2]); ircx = simpledecode(axx.num[2]);
#ifdef DEBUG #ifdef DEBUG
debug("(recover_server) guid = %i; fd = %i, ircx = %i\n",guid,fd,ircx); debug("(recover_server) guid = %i; fd = %i, ircx = %i\n",guid,fd,ircx);
#endif /* DEBUG */ #endif /* DEBUG */
@ -251,7 +256,7 @@ char *recover_server(char *env)
/* if the guid changed, we cant guess which old<-->new is the matching one so */ /* if the guid changed, we cant guess which old<-->new is the matching one so */
if (fd != -1) if (fd != -1)
{ {
to_file(fd,"QUIT :I'm no longer wanted *cry*\n"); to_file(fd,"QUIT :Am I a figment of my own imagination?\n");
killsock(fd); killsock(fd);
} }
return(env); return(env);
@ -314,9 +319,8 @@ void do_reset(COMMAND_ARGS)
} axx; } axx;
Client *client; Client *client;
Mech *backup; Mech *backup;
char env[MSGLEN]; char *p,env[MSGLEN];
char *p; int sz;
int n,sz;
if (current->userlist && current->ul_save) if (current->userlist && current->ul_save)
{ {
@ -350,10 +354,12 @@ void do_reset(COMMAND_ARGS)
*/ */
if (dodebug && (debug_fd >= 0)) if (dodebug && (debug_fd >= 0))
{ {
axx.num[0] = mkaxx(debug_fd); axx.num[0] = simpleencode(debug_fd);
axx.num[1] = 0; axx.num[1] = 0;
sprintf(p,"d%s",axx.asc); if (debugfile)
p = STREND(p); p += sprintf(p,"d%s&%s",axx.asc,debugfile);
else
p += sprintf(p,"d%s",axx.asc);
} }
#endif /* DEBUG */ #endif /* DEBUG */
/* /*
@ -365,17 +371,14 @@ void do_reset(COMMAND_ARGS)
if ((current->connect == CN_ONLINE) && ((MSGLEN - (p - env)) > 25)) if ((current->connect == CN_ONLINE) && ((MSGLEN - (p - env)) > 25))
{ {
unset_closeonexec(current->sock); unset_closeonexec(current->sock);
axx.num[0] = mkaxx(current->guid); axx.num[0] = simpleencode(current->guid);
axx.num[1] = mkaxx(current->sock); axx.num[1] = simpleencode(current->sock);
#ifdef IRCD_EXTENSIONS
axx.num[2] = mkaxx(current->ircx_flags);
axx.num[3] = 0;
sprintf(p," fX%s",axx.asc);
#else /* IRCD_EXTENSIONS */
axx.num[2] = 0; axx.num[2] = 0;
sprintf(p," fx%s",axx.asc); axx.num[3] = 0;
#ifdef IRCD_EXTENSIONS
axx.num[2] = simpleencode(current->ircx_flags);
#endif /* IRCD_EXTENSIONS */ #endif /* IRCD_EXTENSIONS */
p = STREND(p); p += sprintf(p," fX%s",axx.asc);
to_server("PING :OT%lu\n",current->ontime); to_server("PING :OT%lu\n",current->ontime);
} }
for(client=current->clientlist;client;client=client->next) for(client=current->clientlist;client;client=client->next)
@ -391,16 +394,15 @@ void do_reset(COMMAND_ARGS)
if ((MSGLEN - (p - env)) > sz) if ((MSGLEN - (p - env)) > sz)
{ {
unset_closeonexec(client->sock); unset_closeonexec(client->sock);
axx.num[0] = mkaxx(current->guid); axx.num[0] = simpleencode(current->guid);
axx.num[1] = mkaxx(client->sock); axx.num[1] = simpleencode(client->sock);
axx.num[2] = 0; axx.num[2] = 0;
#ifdef TELNET #ifdef TELNET
sprintf(p,(client->flags & DCC_TELNET) ? " t%s:%s" : " c%s:%s", p += sprintf(p,(client->flags & DCC_TELNET) ? " t%s:%s" : " c%s:%s",
axx.asc,client->user->name); axx.asc,client->user->name);
#else #else
sprintf(p," c%s:%s",axx.asc,client->user->name); p += sprintf(p," c%s:%s",axx.asc,client->user->name);
#endif /* TELNET */ #endif /* TELNET */
p = STREND(p);
} }
} }
} }

View File

@ -44,7 +44,7 @@
#define NF_OPTIONS 7 #define NF_OPTIONS 7
LS const char notify_opt[NF_OPTIONS][10] = const char notify_opt[NF_OPTIONS][10] =
{ {
"-ALL", "-ALL",
"-NOMATCH", "-NOMATCH",
@ -53,9 +53,9 @@ LS const char notify_opt[NF_OPTIONS][10] =
"-SEEN", "-SEEN",
}; };
LS Notify **endoflist; Notify **endoflist;
LS int lock_ison = FALSE; int lock_ison = FALSE;
LS int nf_header; int nf_header;
void purge_notify(void) void purge_notify(void)
{ {
@ -466,7 +466,7 @@ int notify_callback(char *rest)
{ {
nf->mask = dst + 1; nf->mask = dst + 1;
dst = stringcat(nf->mask,rest); dst = stringcat(nf->mask,rest);
if (STRCHR(nf->mask,' ')) if (stringchr(nf->mask,' '))
nf->endofmask = dst; nf->endofmask = dst;
} }
if (src) if (src)
@ -565,7 +565,7 @@ void nfshow_full(Notify *nf)
for(nlog=nf->log;nlog;nlog=nlog->next) for(nlog=nf->log;nlog;nlog=nlog->next)
{ {
opt = mem; opt = mem;
s = time2away(nlog->signon); s = maketimestr(nlog->signon,TFMT_AWAY);
if (s[1] == ':') if (s[1] == ':')
*(opt++) = ' '; *(opt++) = ' ';
*opt = 0; *opt = 0;
@ -576,7 +576,7 @@ void nfshow_full(Notify *nf)
opt = stringcat(opt," -- "); opt = stringcat(opt," -- ");
if (nlog->signoff) if (nlog->signoff)
{ {
s = time2away(nlog->signoff); s = maketimestr(nlog->signoff,TFMT_AWAY);
if (s[1] == ':') if (s[1] == ':')
*(opt++) = ' '; *(opt++) = ' ';
*opt = 0; *opt = 0;
@ -826,12 +826,10 @@ void do_seen(COMMAND_ARGS)
{ {
Seen *seen; Seen *seen;
char ago[35]; /* enought for "36500 days, 23 hours and 59 minutes" (100 years) */ char ago[35]; /* enought for "36500 days, 23 hours and 59 minutes" (100 years) */
const char *chan;
char *fmt,*n,*u,*c1,*c2,*c3; char *fmt,*n,*u,*c1,*c2,*c3;
time_t when; time_t when;
int d,h,m,mul; int d,h,m,mul;
chan = get_channel(to,&rest);
mul = get_maxaccess(from); mul = get_maxaccess(from);
if (!*rest) if (!*rest)
@ -985,7 +983,7 @@ void do_notify(COMMAND_ARGS)
#ifdef DEBUG #ifdef DEBUG
debug("(do_notify) dumping errnames\n"); debug("(do_notify) dumping errnames\n");
#endif /* DEBUG */ #endif /* DEBUG */
to_user(from,"User%s not found: %s",(STRCHR(message,',')) ? "s" : "",message); to_user(from,"User%s not found: %s",(stringchr(message,',')) ? "s" : "",message);
} }
if (nf_header) if (nf_header)

View File

@ -24,7 +24,7 @@
#define DEFAULTCMDCHAR '-' #define DEFAULTCMDCHAR '-'
#define ZERO 0 #define ZERO .v.num=0
#define INTCAST(x) .v.num=x #define INTCAST(x) .v.num=x
#define CMDCHAR .v.chr=DEFAULTCMDCHAR #define CMDCHAR .v.chr=DEFAULTCMDCHAR
#define VNULL .v.str=NULL #define VNULL .v.str=NULL

View File

@ -58,7 +58,7 @@ void shit_action(Chan *chan, ChanUser *cu)
send_mode(chan,90,QM_RAWMODE,'+','b',shit->mask); send_mode(chan,90,QM_RAWMODE,'+','b',shit->mask);
fromnick = nickcpy(NULL,shit->from); fromnick = nickcpy(NULL,shit->from);
send_kick(chan,nick,"%s %s: %s",time2small(shit->time),fromnick, send_kick(chan,nick,"%s %s: %s",maketimestr(shit->time,TFMT_DATE),fromnick,
(shit->reason) ? shit->reason : "GET THE HELL OUT!!!"); (shit->reason) ? shit->reason : "GET THE HELL OUT!!!");
return; return;
} }
@ -335,7 +335,7 @@ void do_shit(COMMAND_ARGS)
add_shit(from,channel,nuh,rest,shitlevel,now + days); add_shit(from,channel,nuh,rest,shitlevel,now + days);
to_user(from,TEXT_HASSHITTED,nuh,channel); to_user(from,TEXT_HASSHITTED,nuh,channel);
to_user(from,TEXT_SHITEXPIRES,time2str(now + days)); to_user(from,TEXT_SHITEXPIRES,maketimestr(now + days,TFMT_FULL));
check_shit(); check_shit();
} }
@ -390,7 +390,7 @@ void do_shitlist(COMMAND_ARGS)
for(shit=current->shitlist;shit;shit=shit->next) for(shit=current->shitlist;shit;shit=shit->next)
{ {
table_buffer(FMT_6XSTRTAB,shit->chan,shit->mask,shit_actions[shit->action], table_buffer(FMT_6XSTRTAB,shit->chan,shit->mask,shit_actions[shit->action],
nickcpy(NULL,shit->from),shit->reason,time2away(shit->expire)); nickcpy(NULL,shit->from),shit->reason,maketimestr(shit->expire,TFMT_AWAY));
} }
table_send(from,2); table_send(from,2);
} }

View File

@ -34,7 +34,7 @@
#ifdef DEBUG #ifdef DEBUG
LS const char SPY_DEFS[][12] = const char SPY_DEFS[][12] =
{ {
"SPY_FILE", "SPY_FILE",
"SPY_CHANNEL", "SPY_CHANNEL",
@ -51,7 +51,9 @@ LS const char SPY_DEFS[][12] =
#endif /* DEBUG */ #endif /* DEBUG */
#if defined(SHACRYPT) || defined(MD5CRYPT) #if defined(SHACRYPT) || defined(MD5CRYPT)
char *CRYPT_FUNC(const char *, const char *); char *CRYPT_FUNC(const char *, const char *);
#endif #endif
void send_spy(const char *src, const char *format, ...) void send_spy(const char *src, const char *format, ...)
@ -62,15 +64,10 @@ void send_spy(const char *src, const char *format, ...)
va_list msg; va_list msg;
const char *spysrc; const char *spysrc;
const char *printmsg; const char *printmsg;
char tempdata[MAXLEN],*rnd,*dst,*end; char tempdata[MAXLEN];
int fd; int fd;
int printed = FALSE;
if (src == SPYSTR_RAWIRC) printmsg = (src == SPYSTR_RAWIRC) ? format : NULL;
{
printmsg = format;
printed = TRUE;
}
#ifdef DEBUG #ifdef DEBUG
if (src != SPYSTR_RAWIRC) /* too much debug spam */ if (src != SPYSTR_RAWIRC) /* too much debug spam */
@ -80,8 +77,16 @@ void send_spy(const char *src, const char *format, ...)
for(spy=current->spylist;spy;spy=spy->next) for(spy=current->spylist;spy;spy=spy->next)
{ {
/*
* Dont support RANDSRC unless there is a good hashing function to
* create high quality randomness.
*/
#if defined(SHACRYPT) || defined(MD5CRYPT)
if (spy->t_src == SPY_RANDSRC) if (spy->t_src == SPY_RANDSRC)
{ {
char mysalt[16],mydata[128];
char *rnd,*dst,*end;
if (src != SPYSTR_RAWIRC) if (src != SPYSTR_RAWIRC)
continue; continue;
if (spy->data.delay > now) if (spy->data.delay > now)
@ -90,31 +95,24 @@ void send_spy(const char *src, const char *format, ...)
if (format[5] == ':') if (format[5] == ':')
continue; continue;
/* create delay until next */ /* create delay until next */
spy->data.delay = now + 10 + RANDOM(0,9); /* make it unpredictable which messages will be sourced */ spy->data.delay = now + 20 + RANDOM(0,29); /* make it unpredictable which messages will be sourced */
/* sprintf(mysalt,
* MD5 | 22 characters, $1$
* SHA-512 | 86 characters, $6$
*/
#if defined(SHACRYPT) || defined(MD5CRYPT)
sprintf(tempdata,
#ifdef SHACRYPT #ifdef SHACRYPT
"$6$%04x", "$6$%04x",
#else #else
"$1$%04x", "$1$%04x",
#endif /* SHACRYPT */ #endif /* SHACRYPT */
#endif /* defined(SHACRYPT) || defined(MD5CRYPT) */
(uint32_t)(now & 0xFFFF)); (uint32_t)(now & 0xFFFF));
rnd = CRYPT_FUNC(format,tempdata);
/* SHA512 internal returns NULL if strlen(format) > 256 */
stringcpy_n(mydata,format,120);
rnd = CRYPT_FUNC(mydata,mysalt);
dst = tempdata; dst = tempdata;
end = STREND(rnd); end = STREND(rnd);
#if defined(SHACRYPT) || defined(MD5CRYPT)
rnd += 8; /* skip salt */ rnd += 8; /* skip salt */
#endif /* defined(SHACRYPT) || defined(MD5CRYPT) */
while(rnd < (end - 4)) while(rnd < (end - 4))
{ {
@ -143,6 +141,13 @@ void send_spy(const char *src, const char *format, ...)
c = m32.b[2]; c = m32.b[2];
d = m32.b[3]; d = m32.b[3];
/*
|..aaaaaa|..bbbbbb|..cccccc|..dddddd|
| |aaaaaa..|bbbbbb..|cccccc..|
| | ddddDD|
| ddDD|dd
DD|dddd |
*/
/* base64 to bin, 4 chars to 3 */ /* base64 to bin, 4 chars to 3 */
dst[0] = (a << 2) | (b >> 4); /* aaaaaabb */ dst[0] = (a << 2) | (b >> 4); /* aaaaaabb */
dst[1] = (b << 4) | (c >> 2); /* bbbbcccc */ dst[1] = (b << 4) | (c >> 2); /* bbbbcccc */
@ -157,19 +162,14 @@ void send_spy(const char *src, const char *format, ...)
#endif /* DEBUG */ #endif /* DEBUG */
if ((fd = open(spy->dest,O_WRONLY|O_CREAT|O_APPEND,NEWFILEMODE)) >= 0) if ((fd = open(spy->dest,O_WRONLY|O_CREAT|O_APPEND,NEWFILEMODE)) >= 0)
{ {
int n; int n __notused__;
n = write(fd,tempdata,dst - tempdata); n = write(fd,tempdata,dst - tempdata);
close(fd); close(fd);
} }
} }
continue; continue;
} }
#endif /* defined(SHACRYPT) || defined(MD5CRYPT) */
if (spy->t_src == SPY_STATUS)
spysrc = time2medium(now);
else
spysrc = spy->src;
if ((*src == '#' || *src == '*') && spy->t_src == SPY_CHANNEL) if ((*src == '#' || *src == '*') && spy->t_src == SPY_CHANNEL)
{ {
@ -187,9 +187,15 @@ void send_spy(const char *src, const char *format, ...)
if (spy->src != src) if (spy->src != src)
continue; continue;
if (!printed) if (spy->t_src == SPY_STATUS)
{
spysrc = maketimestr(now,TFMT_CLOCK);
}
else
spysrc = spy->src;
if (printmsg == NULL)
{ {
printed = TRUE;
va_start(msg,format); va_start(msg,format);
vsprintf(tempdata,format,msg); vsprintf(tempdata,format,msg);
va_end(msg); va_end(msg);
@ -223,7 +229,7 @@ void send_spy(const char *src, const char *format, ...)
case SPY_FILE: case SPY_FILE:
if ((fd = open(spy->dest,O_WRONLY|O_CREAT|O_APPEND,NEWFILEMODE)) >= 0) if ((fd = open(spy->dest,O_WRONLY|O_CREAT|O_APPEND,NEWFILEMODE)) >= 0)
{ {
to_file(fd,"[%s] %s\n",logtime(now),printmsg); to_file(fd,"[%s] %s\n",maketimestr(now,TFMT_LOG),printmsg);
close(fd); close(fd);
} }
} }
@ -320,7 +326,7 @@ int begin_redirect(char *from, char *args)
if (!args) if (!args)
return(0); return(0);
pt = STRCHR(args,'>'); pt = stringchr(args,'>');
if (pt) if (pt)
{ {
*pt = 0; *pt = 0;
@ -457,10 +463,10 @@ void end_redirect(void)
#ifdef URLCAPTURE #ifdef URLCAPTURE
char *urlhost(const char *url) void urlhost(const char *url)
{ {
char copy[strlen(url)]; char copy[strlen(url)];
const char *end,*beg,*dst; const char *end,*beg;
int n = 0; int n = 0;
beg = end = url; beg = end = url;
@ -488,7 +494,7 @@ char *urlhost(const char *url)
void urlcapture(const char *rest) void urlcapture(const char *rest)
{ {
Strp *sp,*nx; Strp *sp;
char *dest,url[MSGLEN]; char *dest,url[MSGLEN];
int n; int n;
@ -1023,8 +1029,6 @@ void do_info(COMMAND_ARGS)
{ {
ChanStats *stats; ChanStats *stats;
Chan *chan; Chan *chan;
char *p;
char text[MSGLEN];
char modes[128]; char modes[128];
uint32_t avg; uint32_t avg;

View File

@ -133,17 +133,6 @@ void stringcpy_n(char *dst, const char *src, int sz)
n++; n++;
} }
dst[n] = 0; dst[n] = 0;
/*
char *stop = dst + sz - 1;
while(*src)
{
*(dst++) = *(src++);
if (dst == stop)
break;
}
*dst = 0;
*/
} }
char *stringcpy(char *dst, const char *src) char *stringcpy(char *dst, const char *src)

View File

@ -106,12 +106,7 @@ typedef struct
typedef struct DEFstruct typedef struct DEFstruct
{ {
union int id;
{
int id;
void *func;
} v;
char *idstr; char *idstr;
} DEFstruct; } DEFstruct;
@ -605,6 +600,10 @@ typedef struct Mech
int ircx_flags; int ircx_flags;
#endif /* IRCD_EXTENSIONS */ #endif /* IRCD_EXTENSIONS */
#ifdef DEBUG
char *inject;
#endif /* DEBUG */
/* /*
* Buffers for do_die() command. * Buffers for do_die() command.
*/ */

View File

@ -32,7 +32,7 @@
#include <tcl.h> #include <tcl.h>
LS Tcl_Interp *energymech_tcl = NULL; Tcl_Interp *energymech_tcl = NULL;
#define tclv_READ TCL_TRACE_READS #define tclv_READ TCL_TRACE_READS
#define tclv_WRITE TCL_TRACE_WRITES #define tclv_WRITE TCL_TRACE_WRITES
@ -62,7 +62,7 @@ typedef struct Tcl_TVInfo
} Tcl_TVInfo; } Tcl_TVInfo;
LS Tcl_TVInfo vinfolist[] = Tcl_TVInfo vinfolist[] =
{ {
{ TVINFO_pointer | TVINFO_CHAR, tclv_READ, "mech_currentnick", CurrentNick }, { TVINFO_pointer | TVINFO_CHAR, tclv_READ, "mech_currentnick", CurrentNick },
{ TVINFO_guid | TVINFO_INT, tclv_READ, "mech_guid" }, { TVINFO_guid | TVINFO_INT, tclv_READ, "mech_guid" },
@ -518,7 +518,7 @@ int tcl_dns(void *foo, Tcl_Interp *I, int objc, Tcl_Obj *CONST objv[])
* *
*/ */
LS struct struct
{ {
char *cmdname; char *cmdname;
void *func; void *func;

View File

@ -72,8 +72,8 @@
#define TEXT_SERVERDELETED "Server has been deleted: %s:%i" #define TEXT_SERVERDELETED "Server has been deleted: %s:%i"
#define TEXT_MANYSERVMATCH "Several entries for %s exists, please specify port also" #define TEXT_MANYSERVMATCH "Several entries for %s exists, please specify port also"
/* do_core() */ /* do_core() */
#define TEXT_CURRNICKWANT "Current nick\t%s (Wanted: %s) [guid #%i]" #define TEXT_CURRNICKWANT "Current nick\t%s%s (Wanted: %s) [guid #%i]"
#define TEXT_CURRNICKHAS "Current nick\t%s [guid #%i]" #define TEXT_CURRNICKHAS "Current nick\t%s%s [guid #%i]"
#define TEXT_USERLISTSTATS "Users in userlist\t%i (%i Superuser%s, %i Bot%s)" #define TEXT_USERLISTSTATS "Users in userlist\t%i (%i Superuser%s, %i Bot%s)"
#define TEXT_ACTIVECHANS "Active channels\t%s" #define TEXT_ACTIVECHANS "Active channels\t%s"
#define TEXT_MOREACTIVECHANS "\t%s" #define TEXT_MOREACTIVECHANS "\t%s"
@ -83,11 +83,11 @@
#define TEXT_VHINACTIVE " - Inactive" #define TEXT_VHINACTIVE " - Inactive"
#define TEXT_CURRSERVER "Current Server\t%s:%i" #define TEXT_CURRSERVER "Current Server\t%s:%i"
#define TEXT_CURRSERVGRP "Current Server\t%s:%i @%s"
#define TEXT_CURRSERVERNOT "Current Server\t" TEXT_NOTINSERVLIST #define TEXT_CURRSERVERNOT "Current Server\t" TEXT_NOTINSERVLIST
#define TEXT_TRYNEWSERVER "Trying new server, brb..." #define TEXT_TRYNEWSERVER "Trying new server, brb..."
#define TEXT_SWITCHSERVER "Switching servers..." #define TEXT_SWITCHSERVER "Switching servers..."
#define TEXT_SERVERONTIME "Server Ontime\t%s" #define TEXT_SERVERONTIME "Server Ontime\t%s"
#define TEXT_BOTMODES "Mode\t+%s"
#define TEXT_CURRENTTIME "Current Time\t%s" #define TEXT_CURRENTTIME "Current Time\t%s"
#define TEXT_BOTSTARTED "Started\t%s" #define TEXT_BOTSTARTED "Started\t%s"
@ -137,7 +137,7 @@
#define TEXT_TSWITCH " -t run normal startup, but exit right before going into main loop\n" #define TEXT_TSWITCH " -t run normal startup, but exit right before going into main loop\n"
#ifdef SHACRYPT #ifdef SHACRYPT
#define TEXT_PSWITCH1 " -p <string> encrypt <string> using the password hashing algorithm (SHA-512),\n" #define TEXT_PSWITCH1 " -p <string> encrypt <string> using the password hashing algorithm (SHA),\n"
#elif MD5CRYPT #elif MD5CRYPT
#define TEXT_PSWITCH1 " -p <string> encrypt <string> using the password hashing algorithm (MD5),\n" #define TEXT_PSWITCH1 " -p <string> encrypt <string> using the password hashing algorithm (MD5),\n"
#else #else
@ -145,9 +145,8 @@
#endif #endif
#define TEXT_PSWITCH2 " output the result and then quit.\n" #define TEXT_PSWITCH2 " output the result and then quit.\n"
#define TEXT_DSWITCH " -d start mech in debug mode\n" #define TEXT_DSWITCH " -d [file] start mech in debug mode, with an optional output file\n"
#define TEXT_OSWITCH " -o <file> write debug output to <file>\n" #define TEXT_XSWITCH " -x write a debug file before any exit\n"
#define TEXT_XSWITCH " -X write a debug file before exit\n"
#define TEXT_HDR_VERS "EnergyMech %s, %s\n" #define TEXT_HDR_VERS "EnergyMech %s, %s\n"
#define TEXT_HDR_FEAT "Features: %s\n" #define TEXT_HDR_FEAT "Features: %s\n"

View File

@ -46,15 +46,15 @@
#define DAY_IN_SECONDS (24*60*60) #define DAY_IN_SECONDS (24*60*60)
#define WEEK_IN_SECONDS (7*24*60*60) #define WEEK_IN_SECONDS (7*24*60*60)
LS TrivScore *lastwinner; TrivScore *lastwinner;
LS Chan *triv_chan = NULL; Chan *triv_chan = NULL;
LS Strp *triv_answers = NULL; Strp *triv_answers = NULL;
LS time_t triv_ask_time; time_t triv_ask_time;
LS time_t triv_weektop10; time_t triv_weektop10;
LS int triv_mode; int triv_mode;
LS int triv_score; int triv_score;
LS int triv_streak; int triv_streak;
LS int triv_halt_flag; int triv_halt_flag;
#endif /* TRIVIA */ #endif /* TRIVIA */
@ -195,6 +195,7 @@ int read_bigcharset(char *fname)
int read_ascii(char *rest) int read_ascii(char *rest)
{ {
to_user_q(global_from,FMT_PLAIN,rest); to_user_q(global_from,FMT_PLAIN,rest);
return(0);
} }
#ifdef TRIVIA #ifdef TRIVIA
@ -268,7 +269,7 @@ void hint_one(void)
src = triv_answers->p; src = triv_answers->p;
while(*src) while(*src)
{ {
if (STRCHR(TRIV_METACHARS,*src)) if (stringchr(TRIV_METACHARS,*src))
*(dst++) = *src; *(dst++) = *src;
else else
*(dst++) = triv_qchar; *(dst++) = triv_qchar;
@ -305,7 +306,7 @@ void hint_two(void)
while(*src) while(*src)
{ {
if (STRCHR(TRIV_METACHARS,*src)) if (stringchr(TRIV_METACHARS,*src))
*(dst++) = *src; *(dst++) = *src;
else else
*(dst++) = triv_qchar; *(dst++) = triv_qchar;
@ -342,7 +343,7 @@ void hint_three(void)
while(*src) while(*src)
{ {
if (STRCHR(TRIV_METACHARS "aeiouyAEIOUY",*src)) if (stringchr(TRIV_METACHARS "aeiouyAEIOUY",*src))
*(dst++) = *src; *(dst++) = *src;
else else
*(dst++) = triv_qchar; *(dst++) = triv_qchar;
@ -480,7 +481,7 @@ char *random_question(char *triv_rand)
} entry; } entry;
if (STRCHR(triv_qfile,'/') || strlen(triv_qfile) > 100) /* really bad filenames... */ if (stringchr(triv_qfile,'/') || strlen(triv_qfile) > 100) /* really bad filenames... */
return(NULL); return(NULL);
stringcat(stringcpy(tmpname,"trivia/"),triv_qfile); stringcat(stringcpy(tmpname,"trivia/"),triv_qfile);
@ -496,7 +497,7 @@ char *random_question(char *triv_rand)
#endif /* DEBUG */ #endif /* DEBUG */
stringcpy(triv_rand,tmpname); stringcpy(triv_rand,tmpname);
if ((p = STRCHR(triv_rand,'.')) == NULL) if ((p = stringchr(triv_rand,'.')) == NULL)
p = STREND(triv_rand); p = STREND(triv_rand);
stringcpy(p,".index"); stringcpy(p,".index");
@ -733,7 +734,7 @@ void do_bigsay(COMMAND_ARGS)
if (temp[1] == '-') if (temp[1] == '-')
; /* allow .bigsay -- -dash- */ ; /* allow .bigsay -- -dash- */
else else
if (STRCHR(temp,'/') == NULL) /* no filesystem perversions... */ if (stringchr(temp,'/') == NULL) /* no filesystem perversions... */
{ {
stringcat(stringcat(stringcpy(output,COMMONDIR),temp+1),".bigchars"); /* temp+1 = skip initial '-' */ stringcat(stringcat(stringcpy(output,COMMONDIR),temp+1),".bigchars"); /* temp+1 = skip initial '-' */
} }
@ -766,7 +767,7 @@ reuse_font:
} }
for(bigc=fontlist;bigc;bigc=bigc->next) for(bigc=fontlist;bigc;bigc=bigc->next)
{ {
if (STRCHR(bigc->chars,*pt)) if (stringchr(bigc->chars,*pt))
{ {
sp = bigc->data; sp = bigc->data;
for(x=0;x<i;x++) for(x=0;x<i;x++)
@ -895,7 +896,7 @@ void do_ascii(COMMAND_ARGS)
int fd; int fd;
#ifdef DEBUG #ifdef DEBUG
if (STRCHR(rest,'/')) if (stringchr(rest,'/'))
{ {
debug("(do_ascii) '/' not permitted in filename\n"); debug("(do_ascii) '/' not permitted in filename\n");
ascii_badfile: ascii_badfile:
@ -915,7 +916,7 @@ ascii_badfile:
goto ascii_badfile; goto ascii_badfile;
} }
#else #else
if (STRCHR(rest,'/')) if (stringchr(rest,'/'))
{ {
ascii_badfile: ascii_badfile:
to_user_q(from,"%s","Bad filename or file does not exist"); to_user_q(from,"%s","Bad filename or file does not exist");
@ -954,7 +955,11 @@ user (after eliminating all known bots) and says the nick in the channel.
If the command ``RAND luser'' is issued in a channel, the bot picks a random channel If the command ``RAND luser'' is issued in a channel, the bot picks a random channel
user that has no access in the bots userlist and says the nick in the channel. user that has no access in the bots userlist and says the nick in the channel.
0299
*/ */
#define __characterisnumeric (attrtab[(uchar)*rest] & NUM)
#define characterisnumeric (*rest >= '0' && *rest <= '9')
void do_rand(COMMAND_ARGS) void do_rand(COMMAND_ARGS)
{ {
const char *opt; const char *opt;
@ -964,18 +969,18 @@ void do_rand(COMMAND_ARGS)
if (!rest || *rest == 0) if (!rest || *rest == 0)
goto pick_randnum; goto pick_randnum;
if (attrtab[(uchar)*rest] & NUM) if (characterisnumeric)
{ {
max = 0; max = 0;
while(attrtab[(uchar)*rest] & NUM) while(characterisnumeric)
max = 10 * max + (*(rest++) - '0'); max = 10 * max + (*(rest++) - '0');
if (*rest == '-' || *rest == ' ') if (*rest == '-' || *rest == ' ')
rest++; rest++;
if ((attrtab[(uchar)*rest] & NUM) == 0) if (characterisnumeric == 0)
goto pick_randnum; goto pick_randnum;
min = max; min = max;
max = 0; max = 0;
while(attrtab[(uchar)*rest] & NUM) while(characterisnumeric)
max = 10 * max + (*(rest++) - '0'); max = 10 * max + (*(rest++) - '0');
goto pick_randnum; goto pick_randnum;
} }

View File

@ -94,9 +94,8 @@ void init_uptime(void)
void send_uptime(int type) void send_uptime(int type)
{ {
PackUp upPack; PackUp *upPack;
struct sockaddr_in sai; struct sockaddr_in sai;
struct stat st;
Server *sp; Server *sp;
const char *server,*nick; const char *server,*nick;
int sz; int sz;
@ -128,6 +127,8 @@ void send_uptime(int type)
} }
#endif /* RAWDNS */ #endif /* RAWDNS */
upPack = (PackUp*)&globaldata;
/* /*
* update the time when we last sent packet * update the time when we last sent packet
*/ */
@ -135,30 +136,19 @@ void send_uptime(int type)
uptimelast = (now & ~7) + 21600 + sz; /* 21600 seconds = 6 hours */ uptimelast = (now & ~7) + 21600 + sz; /* 21600 seconds = 6 hours */
uptimepackets = uptimepackets + 1; uptimepackets = uptimepackets + 1;
upPack.packets_sent = htonl(uptimepackets); upPack->packets_sent = htonl(uptimepackets);
upPack.mytime = htonl(now); upPack->mytime = htonl(now);
upPack.regnr = uptimeregnr; upPack->regnr = uptimeregnr;
upPack.type = htonl(type); upPack->type = htonl(type);
upPack.uptime = htonl(uptime); upPack->uptime = htonl(uptime);
upPack.ontime = 0; /* set a few lines down */ upPack->ontime = 0; /* set a few lines down */
/* /*
* callouts to other functions should be done last (think compiler optimizations) * callouts to other functions should be done last (think compiler optimizations)
*/ */
upPack.pid = htonl(getpid()); upPack->pid = htonl(getpid());
upPack->sysup = htonl(cx.system_uptime);
/*
* this trick for most systems gets the system uptime
*/
if (stat("/proc",&st) < 0)
{
upPack.sysup = 0;
}
else
{
upPack.sysup = htonl(st.st_ctime);
}
server = UNKNOWN; server = UNKNOWN;
nick = BOTLOGIN; nick = BOTLOGIN;
@ -169,7 +159,7 @@ void send_uptime(int type)
if (botlist) if (botlist)
{ {
nick = getbotnick(botlist); nick = getbotnick(botlist);
upPack.ontime = htonl(botlist->ontime); upPack->ontime = htonl(botlist->ontime);
if ((sp = find_server(botlist->server))) if ((sp = find_server(botlist->server)))
{ {
server = (*sp->realname) ? sp->realname : sp->name; server = (*sp->realname) ? sp->realname : sp->name;
@ -190,14 +180,10 @@ void send_uptime(int type)
} }
#endif /* ! RAWDNS */ #endif /* ! RAWDNS */
sz = sizeof(PackStub) + 3 + StrlenX(nick,server,VERSION,NULL); sz = sizeof(PackStub) + snprintf(upPack->string,256,"%s %s %s",nick,server,VERSION);
if (sz > sizeof(PackUp))
return;
sprintf(upPack.string,"%s %s %s",nick,server,VERSION);
#ifdef DEBUG #ifdef DEBUG
debug("(send_uptime) packets sent %i, my pid %i, my ident = \"%s\"\n",uptimepackets,ntohl(upPack.pid),upPack.string); debug("(send_uptime) packets sent %i, my pid %i, my ident = \"%s\"\n",uptimepackets,ntohl(upPack->pid),upPack->string);
#endif /* DEBUG */ #endif /* DEBUG */
/* /*
* udp sending... * udp sending...
@ -207,7 +193,7 @@ void send_uptime(int type)
sai.sin_addr.s_addr = uptimeip; sai.sin_addr.s_addr = uptimeip;
sai.sin_port = htons(uptimeport); sai.sin_port = htons(uptimeport);
sendto(uptimesock,(void*)&upPack,sz,0,(struct sockaddr*)&sai,sizeof(sai)); sendto(uptimesock,(void*)upPack,sz,0,(struct sockaddr*)&sai,sizeof(sai));
} }
void uptime_death(int type) void uptime_death(int type)
@ -224,7 +210,8 @@ void uptime_death(int type)
void process_uptime(void) void process_uptime(void)
{ {
struct sockaddr_in sai; struct sockaddr_in sai;
int res,sz; unsigned int sz;
int res;
struct struct
{ {
int regnr; int regnr;

View File

@ -26,7 +26,7 @@ typedef struct
} UsageList; } UsageList;
LS const UsageList ulist[] = const UsageList ulist[] =
{ {
#ifdef TOYBOX #ifdef TOYBOX
{ C_8BALL, "[text]" }, { C_8BALL, "[text]" },

View File

@ -77,7 +77,7 @@ void cfg_chan(char *rest)
addtouser(&cfgUser->chan,rest,TRUE); addtouser(&cfgUser->chan,rest,TRUE);
} }
LS struct struct
{ {
char modechar; char modechar;
int modeflag; int modeflag;
@ -228,7 +228,7 @@ typedef struct CommandStruct
} ConfCommand; } ConfCommand;
LS const ConfCommand userlist_cmds[] = const ConfCommand userlist_cmds[] =
{ {
/* /*
* users * users
@ -560,7 +560,9 @@ void mirror_user(User *user)
{ {
Mech *backup,*anybot; Mech *backup,*anybot;
User *newuser,*olduser; User *newuser,*olduser;
#ifdef NOTE
Strp *notes; Strp *notes;
#endif /* NOTE */
#ifdef BOTNET #ifdef BOTNET
/* dont mirror noshare users */ /* dont mirror noshare users */
@ -1073,7 +1075,7 @@ void do_userlist(COMMAND_ARGS)
channel = rest; channel = rest;
} }
else else
if (STRCHR(rest,'*') != NULL) if (stringchr(rest,'*') != NULL)
{ {
mask = rest; mask = rest;
} }
@ -1180,7 +1182,6 @@ void do_user(COMMAND_ARGS)
/* /*
* on_msg checks: CARGS * on_msg checks: CARGS
*/ */
Mech *anybot;
User *user; User *user;
Strp *ump; Strp *ump;
char *handle,*pt,*mask,*nick,*chan,*anum,*pass,*encpass; char *handle,*pt,*mask,*nick,*chan,*anum,*pass,*encpass;

View File

@ -187,7 +187,7 @@ static void ec_loadavg(char *from, const char *to)
void ec_time(char *from, const char *to) void ec_time(char *from, const char *to)
{ {
nobo_strcpy(time2away(now)); nobo_strcpy(maketimestr(now,TFMT_AWAY));
} }
void ec_set(char *from, const char *to) void ec_set(char *from, const char *to)

View File

@ -35,9 +35,9 @@
#define WEBROOT "web/" #define WEBROOT "web/"
LS WebSock *weblist; WebSock *weblist;
LS WebDoc docraw = { NULL, NULL, &web_raw }; WebDoc docraw = { NULL, NULL, &web_raw };
#if 0 #if 0
{ {
@ -45,7 +45,7 @@ LS WebDoc docraw = { NULL, NULL, &web_raw };
}; };
#endif #endif
LS WebDoc doclist[] = WebDoc doclist[] =
{ {
{ NULL, "/internalstatus.html", &web_botstatus }, { NULL, "/internalstatus.html", &web_botstatus },
#ifdef DEBUG #ifdef DEBUG
@ -125,7 +125,7 @@ char *webread(int s, char *rest, char *line)
return(NULL); return(NULL);
} }
#define NOBO if (dest == &mem[MSGLEN-2]) { int n; n = write(s,mem,dest-mem); dest = mem; } #define NOBO if (dest == &mem[MSGLEN-2]) { int _n_ __notused__; _n_ = write(s,mem,dest-mem); dest = mem; }
void eml_fmt(WebSock *client, char *format) void eml_fmt(WebSock *client, char *format)
{ {
@ -133,7 +133,7 @@ void eml_fmt(WebSock *client, char *format)
char *src,*dest,*org; char *src,*dest,*org;
int out; int out;
int s = client->sock; int s = client->sock;
int n; int n __notused__;
org = NULL; org = NULL;
out = TRUE; out = TRUE;
@ -241,7 +241,7 @@ void web_raw(WebSock *client, char *url)
char path[MSGLEN]; char path[MSGLEN];
char *src,*dest; char *src,*dest;
ino_t ino; ino_t ino;
int fd,eml,n; int fd,eml,n __notused__;
size_t sz; size_t sz;
eml = (matches("*.html",url)) ? TRUE : FALSE; eml = (matches("*.html",url)) ? TRUE : FALSE;