* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
* USA
- *
- * $Id: client.c 3514 2007-06-06 16:25:21Z nenolod $
*/
#include "stdinc.h"
#include "config.h"
#include "blacklist.h"
#include "reject.h"
#include "scache.h"
-#include "irc_dictionary.h"
+#include "rb_dictionary.h"
#include "sslproc.h"
#include "s_assert.h"
rb_event_addish("exit_aborted_clients", exit_aborted_clients, NULL, 1);
rb_event_add("flood_recalc", flood_recalc, NULL, 1);
- nd_dict = irc_dictionary_create(irccmp);
+ nd_dict = rb_dictionary_create("nickdelay", irccmp);
}
"No response from %s, closing link",
log_client_name(client_p, HIDE_IP));
}
- (void) rb_snprintf(scratch, sizeof(scratch),
+ (void) snprintf(scratch, sizeof(scratch),
"Ping timeout: %d seconds",
(int) (rb_current_time() - client_p->localClient->lasttime));
/* Do all of the nick-changing gymnastics. */
client_p->tsinfo = rb_current_time();
- add_history(client_p, 1);
+ whowas_add_history(client_p, 1);
monitor_signoff(client_p);
rb_dlinkDestroy(ptr, &client_p->on_allow_list);
}
- rb_snprintf(note, sizeof(note), "Nick: %s", nick);
+ snprintf(note, sizeof(note), "Nick: %s", nick);
rb_note(client_p->localClient->F, note);
}
}
if(who || IsDigit(*user))
return who;
- if(!(who = get_history(user, (long) KILLCHASETIMELIMIT)))
+ if(!(who = whowas_get_history(user, (long) KILLCHASETIMELIMIT)))
{
sendto_one_numeric(source_p, ERR_NOSUCHNICK,
form_str(ERR_NOSUCHNICK), user);
switch (showip)
{
case SHOW_IP:
- rb_snprintf(nbuf, sizeof(nbuf), "%s[%s@%s]",
+ snprintf(nbuf, sizeof(nbuf), "%s[%s@%s]",
client->name, client->username,
client->sockhost);
break;
case MASK_IP:
- rb_snprintf(nbuf, sizeof(nbuf), "%s[%s@255.255.255.255]",
+ snprintf(nbuf, sizeof(nbuf), "%s[%s@255.255.255.255]",
client->name, client->username);
break;
default:
- rb_snprintf(nbuf, sizeof(nbuf), "%s[%s@%s]",
+ snprintf(nbuf, sizeof(nbuf), "%s[%s@%s]",
client->name, client->username, client->host);
}
return nbuf;
switch (showip)
{
case SHOW_IP:
- rb_snprintf(nbuf, sizeof(nbuf), "%s[%s@%s]", target_p->name,
+ snprintf(nbuf, sizeof(nbuf), "%s[%s@%s]", target_p->name,
target_p->username, target_p->sockhost);
break;
default:
- rb_snprintf(nbuf, sizeof(nbuf), "%s[%s@%s]", target_p->name,
+ snprintf(nbuf, sizeof(nbuf), "%s[%s@%s]", target_p->name,
target_p->username, target_p->host);
}
** already been sent. we make sure to exit a server's dependent clients
** and servers before the server itself; exit_one_client takes care of
** actually removing things off llists. tweaked from +CSr31 -orabidoo
-*/
+ */
/*
* added sanity test code.... source_p->serv might be NULL...
*/
** Remove *everything* that depends on source_p, from all lists, and sending
** all necessary SQUITs. source_p itself is still on the lists,
** and its SQUITs have been sent except for the upstream one -orabidoo
-*/
+ */
static void
remove_dependents(struct Client *client_p,
struct Client *source_p,
/*
* dead_link - Adds client to a list of clients that need an exit_client()
- *
*/
void
dead_link(struct Client *client_p, int sendqex)
if(sendqex)
rb_strlcpy(abt->notice, "Max SendQ exceeded", sizeof(abt->notice));
else
- rb_snprintf(abt->notice, sizeof(abt->notice), "Write error: %s", strerror(errno));
+ snprintf(abt->notice, sizeof(abt->notice), "Write error: %s", strerror(errno));
abt->client = client_p;
SetIOError(client_p);
/* Clean up allow lists */
del_all_accepts(source_p);
- add_history(source_p, 0);
- off_history(source_p);
+ whowas_add_history(source_p, 0);
+ whowas_off_history(source_p);
monitor_signoff(source_p);
strcat(comment1, source_p->name);
}
if (IsPerson(from))
- rb_snprintf(newcomment, sizeof(newcomment), "by %s: %s",
+ snprintf(newcomment, sizeof(newcomment), "by %s: %s",
from->name, comment);
if(source_p->serv != NULL)
/* Always show source here, so the server notices show
* which side initiated the split -- jilles
*/
- rb_snprintf(newcomment, sizeof(newcomment), "by %s: %s",
+ snprintf(newcomment, sizeof(newcomment), "by %s: %s",
from == source_p ? me.name : from->name, comment);
if (!IsIOError(source_p))
sendto_one(source_p, "SQUIT %s :%s", use_id(source_p),
**
** CLIENT_EXITED if (client_p == source_p)
** 0 if (client_p != source_p)
-*/
+ */
int
exit_client(struct Client *client_p, /* The local client originating the
* exit or NULL, if this exit is
char *
generate_uid(void)
{
+ static int flipped = 0;
int i;
+uid_restart:
for(i = 8; i > 3; i--)
{
if(current_uid[i] == 'Z')
{
current_uid[i] = '0';
- return current_uid;
+ goto out;
}
else if(current_uid[i] != '9')
{
current_uid[i]++;
- return current_uid;
+ goto out;
}
else
current_uid[i] = 'A';
if(current_uid[3] == 'Z')
{
current_uid[i] = 'A';
- s_assert(0);
+ flipped = 1;
}
else
current_uid[i]++;
-
+out:
+ /* if this happens..well, i'm not sure what to say, but lets handle it correctly */
+ if(rb_unlikely(flipped))
+ {
+ /* this slows down uid generation a bit... */
+ if(find_id(current_uid) != NULL)
+ goto uid_restart;
+ }
return current_uid;
}
else
ServerStats.is_ni++;
+ del_from_cli_connid_hash(client_p);
+
if(client_p->localClient->F != NULL)
{
/* attempt to flush any pending dbufs. Evil, but .. -- adrian */
if(!IsIOError(client_p))
send_queued(client_p);
- del_from_cli_connid_hash(client_p);
rb_close(client_p->localClient->F);
client_p->localClient->F = NULL;
}
if(error == 0)
rb_strlcpy(errmsg, "Remote host closed the connection", sizeof(errmsg));
else
- rb_snprintf(errmsg, sizeof(errmsg), "Read error: %s", strerror(current_error));
+ snprintf(errmsg, sizeof(errmsg), "Read error: %s", strerror(current_error));
exit_client(client_p, client_p, &me, errmsg);
}