1
0
mirror of https://github.com/unrealircd/unrealircd.git synced 2026-06-27 22:16:37 +02:00
Files
unrealircd/src/aln.c
T
2001-07-02 00:57:57 +00:00

318 lines
6.6 KiB
C

/************************************************************************
* Unreal Internet Relay Chat Daemo, src/aln.c
* (C) 2000 Carsten Munk (Techie/Stskeeps) <stskeeps@tspre.org>
* Copyright (C) 2000 Lucas Madar [bahamut team]
*
* See file AUTHORS in IRC package for additional names of
* the programmers.
*
* 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
* the Free Software Foundation; either version 1, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef STANDALONE
#include "struct.h"
#include "common.h"
#include "sys.h"
#include "numeric.h"
#include "msg.h"
#include "channel.h"
#include "version.h"
#endif
#include <time.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifdef PIPEDEBUG
#include <signal.h>
#endif
#ifdef _WIN32
#include <io.h>
#endif
#include <fcntl.h>
#ifndef STANDALONE
#include "h.h"
#include "proto.h"
ID_Copyright("(C) Carsten Munk 2000");
#endif
static inline char *int_to_base64(long);
static inline long base64_to_int(char *);
Link *Servers = NULL;
char *base64enc(long i)
{
if (i < 0)
return ("0");
return int_to_base64(i);
}
char *xbase64enc(long i)
{
if (i < 0)
return ("0");
return int_to_base64(i);
}
long base64dec(char *b64)
{
if (b64)
return base64_to_int(b64);
else
return 0;
}
long xbase64dec(char *b64)
{
long r;
if (b64)
{
r = base64_to_int(b64);
return r;
}
else
return 0;
}
int numeric_collides(long numeric)
{
Link *lp;
if (!numeric)
return 0;
for (lp = Servers; lp; lp = lp->next)
if (numeric == lp->value.cptr->serv->numeric)
return 1;
return 0;
}
void add_server_to_table(aClient *what)
{
Link *ptr;
if (IsServer(what) || IsMe(what))
{
ptr = make_link();
ptr->value.cptr = what;
ptr->flags = what->serv->numeric;
ptr->next = Servers;
Servers = ptr;
}
}
void remove_server_from_table(aClient *what)
{
Link **curr;
Link *tmp;
Link *lp = Servers;
for (; lp && (lp->value.cptr == what); lp = lp->next);
for (;;)
{
for (curr = &Servers; (tmp = *curr); curr = &tmp->next)
if (tmp->value.cptr == what)
{
*curr = tmp->next;
free_link(tmp);
break;
}
if (lp)
break;
}
}
aClient *find_server_by_numeric(long value)
{
Link *lp;
for (lp = Servers; lp; lp = lp->next)
if (lp->value.cptr->serv->numeric == value)
return (lp->value.cptr);
#ifdef PIPEDEBUG
kill(getpid(), SIGPIPE);
#endif
return NULL;
}
aClient *find_server_by_base64(char *b64)
{
if (b64)
return find_server_by_numeric(base64dec(b64));
else
{
#ifdef PIPEDEBUG
kill(getpid(), SIGPIPE);
#endif
return NULL;
}
}
char *find_server_id(aClient *which)
{
return (base64enc(which->serv->numeric));
}
aClient *find_server_quick_search(char *name)
{
Link *lp;
for (lp = Servers; lp; lp = lp->next)
if (!match(name, lp->value.cptr->name))
return (lp->value.cptr);
#ifdef PIPEDEBUG
kill(getpid(), SIGPIPE);
#endif
return NULL;
}
aClient *find_server_quick_straight(char *name)
{
Link *lp;
for (lp = Servers; lp; lp = lp->next)
if (!strcmp(name, lp->value.cptr->name))
return (lp->value.cptr);
#ifdef PIPEDEBUG
kill(getpid(), SIGPIPE);
#endif
return NULL;
}
aClient *find_server_quickx(char *name, aClient *cptr)
{
if (name)
{
cptr = (aClient *)find_server_quick_search(name);
}
return cptr;
}
aClient *find_server_b64_or_real(char *name)
{
Link *lp;
long namebase64;
if (!name)
return NULL;
if (strlen(name) < 3)
{
namebase64 = base64dec(name);
for (lp = Servers; lp; lp = lp->next)
if (lp->value.cptr->serv->numeric == namebase64)
return (lp->value.cptr);
}
else
{
return find_server_quick_straight(name);
}
#ifdef PIPEDEBUG
kill(getpid(), SIGPIPE);
#endif
return NULL;
}
/* ':' and '#' and '&' and '+' and '@' must never be in this table. */
/* these tables must NEVER CHANGE! >) */
char int6_to_base64_map[] = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D',
'E', 'F',
'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T',
'U', 'V',
'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
'k', 'l',
'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'{', '}'
};
char base64_to_int6_map[] = {
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1,
-1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1,
-1, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, -1, 63, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
};
static inline char *int_to_base64(long val)
{
/* 32/6 == max 6 bytes for representation,
* +1 for the null, +1 for byte boundaries
*/
static char base64buf[8];
long i = 7;
base64buf[i] = '\0';
do
{
base64buf[--i] = int6_to_base64_map[val & 63];
}
while (val >>= 6);
return base64buf + i;
}
static inline long base64_to_int(char *b64)
{
int v = base64_to_int6_map[(u_char)*b64++];
if (!b64)
return 0;
while (*b64)
{
v <<= 6;
v += base64_to_int6_map[(u_char)*b64++];
}
return v;
}
void ns_stats(aClient *cptr)
{
Link *lp;
aClient *sptr;
for (lp = Servers; lp; lp = lp->next)
{
sptr = lp->value.cptr;
sendto_one(cptr,
":%s NOTICE %s :*** server=%s numeric=%i b64=%s [%s]", me.name,
cptr->name, sptr->name, sptr->serv->numeric,
find_server_id(sptr), find_server_b64_or_real(find_server_id(sptr)) == sptr ? "SANE" : "INSANE");
}
}