Page MenuHomeDevCentral

No OneTemporary

diff --git a/beta/m4/minmax.m4 b/beta/m4/minmax.m4
new file mode 100644
index 0000000..ba9fbdb
--- /dev/null
+++ b/beta/m4/minmax.m4
@@ -0,0 +1,41 @@
+# minmax.m4 serial 2
+dnl Copyright (C) 2005 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_PREREQ(2.52)
+
+AC_DEFUN([gl_MINMAX],
+[
+ AC_REQUIRE([gl_PREREQ_MINMAX])
+])
+
+# Prerequisites of lib/minmax.h.
+AC_DEFUN([gl_PREREQ_MINMAX],
+[
+ gl_MINMAX_IN_HEADER([limits.h])
+ gl_MINMAX_IN_HEADER([sys/param.h])
+])
+
+dnl gl_MINMAX_IN_HEADER(HEADER)
+dnl The parameter has to be a literal header name; it cannot be macro,
+dnl nor a shell variable. (Because autoheader collects only AC_DEFINE
+dnl invocations with a literal macro name.)
+AC_DEFUN([gl_MINMAX_IN_HEADER],
+[
+ m4_pushdef([header], AS_TR_SH([$1]))
+ m4_pushdef([HEADER], AS_TR_CPP([$1]))
+ AC_CACHE_CHECK([whether <$1> defines MIN and MAX],
+ [gl_cv_minmax_in_]header,
+ [AC_COMPILE_IFELSE([AC_LANG_SOURCE([[#include <$1>
+int x = MIN (42, 17);]], [[]])],
+ [gl_cv_minmax_in_]header[=yes],
+ [gl_cv_minmax_in_]header[=no])])
+ if test $gl_cv_minmax_in_[]header = yes; then
+ AC_DEFINE([HAVE_MINMAX_IN_]HEADER, 1,
+ [Define to 1 if <$1> defines the MIN and MAX macros.])
+ fi
+ m4_popdef([HEADER])
+ m4_popdef([header])
+])
diff --git a/beta/source/chan.c b/beta/source/chan.c
index 8166319..4f6085c 100755
--- a/beta/source/chan.c
+++ b/beta/source/chan.c
@@ -1,618 +1,618 @@
#include "defines.h"
#include "vars.h"
#include "prototypes.h"
#ifdef ENABLE_MATH
/* Changed input to be unsigned instead of signed. This
* suppressed warning messages when compiling on Solaris.
*/
void
do_math (const char *who, char *target, char *math)
{
char number_string[STRING_SHORT] = { 0 };
char op = 0;
unsigned char input[STRING_SHORT] = { 0 };
unsigned int index = 0;
unsigned int to = 0;
unsigned int input_length = 0;
unsigned int number_length = 0;
double result = 0.0;
double number = 0.0;
strncpy (input, math, sizeof (input));
input_length = strlen (input);
for (to = 0, index = 0; index <= input_length; index++)
if (*(input + index) != ' ')
*(input + to++) = *(input + index);
input_length = strlen (input);
index = 0;
if (input[index] == '=')
index++;
else
{
number_length = 0;
if (input[index] == '+' || input[index] == '-')
*(number_string + number_length++) = *(input + index++);
for (; isdigit (*(input + index)); index++)
*(number_string + number_length++) = *(input + index);
if (*(input + index) == '.')
{
*(number_string + number_length++) = *(input + index++);
for (; isdigit (*(input + index)); index++)
*(number_string + number_length++) = *(input + index);
}
*(number_string + number_length) = '\0';
if (number_length > 0)
result = atof (number_string);
}
for (; index < input_length;)
{
op = *(input + index++);
number_length = 0;
if (input[index] == '+' || input[index] == '-')
*(number_string + number_length++) = *(input + index++);
for (; isdigit (*(input + index)); index++)
*(number_string + number_length++) = *(input + index);
if (*(input + index) == '.')
{
*(number_string + number_length++) = *(input + index++);
for (; isdigit (*(input + index)); index++)
*(number_string + number_length++) = *(input + index);
}
*(number_string + number_length) = '\0';
number = atof (number_string);
switch (op)
{
case '+':
result += number;
break;
case '-':
result -= number;
break;
case '*':
result *= number;
break;
case '/':
if (number == 0)
{
L016 (target, who);
return;
}
else
result /= number;
break;
case '%':
if ((long) number == 0)
{
L016 (target, who);
return;
}
else
result = (double) ((long) result % (long) number);
break;
default:
L017 (target, who);
return;
}
}
S ("PRIVMSG %s :%s\2:\2 %f\n", target, who, result);
}
#endif
long
cf (char *host, char *nick, char *chan)
{
int f_n = 0;
if (check_access (host, chan, 0, nick) >= 3)
return 0;
f_n = f_f (host);
if (f_n == -1)
{
a_f (host);
return 0;
}
if (ood[f_n].value)
return 1;
ood[f_n].count++;
- if ((time (NULL) - ood[f_n].time) > ft)
+ if ((time (NULL) - ood[f_n].time) > FT)
ood[f_n].count = 0;
- else if ((time (NULL) - ood[f_n].time) <= ft && ood[f_n].count >= fr)
+ else if ((time (NULL) - ood[f_n].time) <= FT && ood[f_n].count >= FR)
{
ood[f_n].value = true;
if (!ood[f_n].kick)
{
ood[f_n].kick = 1;
#ifdef FLOOD_KICK
if (*chan == '#' || *chan == '&')
{
L018 (chan, nick, FLOOD_REASON, fc, host);
}
else
L019 (CHAN, fc, host);
#else
if (*chan == '#' || *chan == '&')
{
L019 (CHAN, fc, host);
}
else
L019 (CHAN, fc, host);
#endif
}
return 1;
}
ood[f_n].time = time (NULL);
return 0;
}
/**
* Update a nick's channel greeting and user@host.
* 6/23/00 Dan:
* - All method arguments are now pointers to const data
* - Rewrote to use a for loop, and fewer variables
* - Info is only saved to disk if changes are made
*/
void
update_setinfo (const char *new_uh, const char *new_greetz, const char *nick)
{
struct helperlist *c = helperhead;
bool madeChange = false;
size_t i = 0;
for (; c != NULL; c = c->next)
{
++i;
if (!match_wild (c->uh, new_uh) == 0)
{
strncpy (c->greetz, new_greetz, sizeof (c->greetz));
strlwr (c->uh);
L020 (nick, i, c->uh, new_greetz);
madeChange = true;
}
}
if (madeChange)
{
save_changes ();
}
}
/**
* 6/23/00 Dan:
* - All variables now initialized when declared
* - Altered variable types to reflect usage
*/
void
info (const char *source, char *target)
{
FILE *fp;
clock_t starttime = 0;
char b[STRING_LONG] = { 0 };
size_t topics = 0, dup = 0;
time_t t2time = 0, c_uptime = 0;
char *ptr = NULL, *subj = NULL;
char last[STRING_LONG] = { 0 };
t2time = time (NULL);
unlink (TMP_URL);
starttime = clock ();
fp = fopen (URL2, "r");
if (NULL == fp)
{
L003 (source, URL2);
return;
}
while (fgets (b, STRING_LONG, fp))
{
topics++;
if (FIND_DUPS)
{
if(*b == '\n')
continue;
stripline (b);
subj = strtok (b, " ");
ptr = strtok (NULL, "");
strlwr (subj);
if (strcasecmp (last, subj) == 0)
{
dup++;
if (SAVE_DUPS)
db_log (BACKUP_DUP, "%s %s\n", subj, ptr);
}
else
{
db_log (TMP_URL, "%s %s\n", subj, ptr);
}
strncpy (last, subj, sizeof (last));
last[sizeof (last) - 1] = '\0';
}
}
fclose (fp);
rename (TMP_URL, URL2);
if ((FIND_DUPS) && (dup > 0))
{
L025 (target, dup);
}
c_uptime = time (NULL) - uptime;
topics -= dup;
if (c_uptime > 86400)
{
L026 (target,
dbVersion,
topics,
c_uptime / 86400,
(c_uptime / 86400 ==
1) ? "" : "s",
(c_uptime / 3600) % 24,
(c_uptime / 60) % 60, QUESTIONS,
ADDITIONS, DELETIONS,
(double) (clock () -
starttime) /
CLOCKS_PER_SEC, (((double) (clock () - starttime) / CLOCKS_PER_SEC) == 1) ? "" : "s");
}
else if (c_uptime > 3600)
{
L027 (target,
dbVersion,
topics,
c_uptime / 3600,
c_uptime / 3600 == 1 ? "" : "s",
(c_uptime / 60) % 60,
(c_uptime / 60) % 60 ==
1 ? "" : "s", QUESTIONS,
ADDITIONS, DELETIONS,
(double) (clock () -
starttime) /
CLOCKS_PER_SEC, (((double) (clock () - starttime) / CLOCKS_PER_SEC) == 1) ? "" : "s");
}
else
{
L028 (target,
dbVersion,
topics,
c_uptime / 60,
c_uptime / 60 == 1 ? "" : "s",
c_uptime % 60,
c_uptime % 60 == 1 ? "" : "s",
QUESTIONS, ADDITIONS, DELETIONS,
(double) (clock () - starttime) / CLOCKS_PER_SEC, (((double)
(clock () -
starttime) /
CLOCKS_PER_SEC) == 1) ? "" : "s");
}
/* get_stats(target, NULL); */
}
/**
* Output information about the bot's database to a target.
* 6/22 Dan:
* - Changed both method arguments to be pointers to const data,
* this is a read only method.
*/
void
show_info2 (const char *target, const char *source)
{
S ("PRIVMSG %s :%s, compiled on %s. "
"I have processed %ld lines of text since startup...\n",
target, source, __DATE__, NUMLINESSEEN);
}
/**
* 6/23/00 Dan:
* - All method arguments are now pointer to const
* - Return type is now time_t
* - A for loop is now used instead of a while loop
*/
time_t
return_useridle (const char *chan, const char *who, int toggle)
{ /* toggle=0 is for idle time, toggle=1 is to check if user
is in the chan */
const struct userlist *c = userhead;
for (; c != NULL; c = c->next)
{
if (!strcasecmp (who, c->nick) && !strcasecmp (chan, c->chan))
{
if (toggle == 1)
{
/* If we only care if user is present or not.. */
return 1;
}
else
return c->idle;
} /* if */
} /* for */
return 0;
}
void
process_nick (char *nick, char *newnick)
{
struct userlist *c;
c = userhead;
newnick++;
while (c)
{
if (strcasecmp (nick, c->nick) == 0)
{
strncpy (c->nick, newnick, sizeof (c->nick));
}
c = c->next;
}
}
/**
* 6/23/00 Dan:
* - All method arguments are now pointer to const
* - A for loop is now used instead of a while loop
*/
void
show_chaninfo (const char *nick, const char *chan, const char *target)
{
size_t totalUsers = 0, foundUsers = 0;
const struct userlist *c = userhead;
for (; c != NULL; c = c->next)
{
++totalUsers;
if (!strcasecmp (chan, c->chan))
++foundUsers;
}
S ("PRIVMSG %s :%s, I see %d users in %s (%d users total in ram)\n",
target, nick, foundUsers, chan, totalUsers);
}
/*
* This function displays a list of users that are listed in the bot's internal user
* list as being on the channel pointed to by chan, to the nick pointed to by nick.
* Each message sent to the target should be no more than 200 characters in length.
*/
void show_chanusers (const char *nick, const char *chan)
{
const struct userlist *c = userhead;
char DATA [STRING_SHORT * 7] = {0},
tmp [STRING_SHORT] = {0};
size_t foundUsers = 0, len = 0;
for (; c != NULL; c = c->next)
{
if (strcasecmp (chan, c->chan) == 0)
{
++foundUsers;
snprintf (tmp, sizeof (tmp), "%s", DATA);
/* The check for DATA being NULL is done to prevent ugly looking spaces
* at the beginning of the line when it's outputted.
*/
snprintf (DATA, (sizeof (DATA) + sizeof (tmp)),
"%s%s%s",
tmp,
(DATA == NULL ? "" : " "),
c->nick);
/* Add the length of the new nick and room for a space to the length
* of the current buffer.
*/
len += (strlen (c->nick) + 1);
memset (tmp, 0, sizeof (tmp));
if (len >= 200)
{
S ("NOTICE %s :%s\n", nick, DATA);
len = 0;
memset (DATA, 0, sizeof (DATA));
db_sleep (2);
}
}
}
/* If there's any leftover data in our buffer after we've reached the end of the list,
* send that as well.
*/
if (len > 0)
S ("NOTICE %s :%s\n", nick, DATA);
/* Even if no users were found... */
S ("NOTICE %s :End of CHANUSERS list; %d user%s found.\n",
nick, foundUsers, (foundUsers == 1 ? "" : "s"));
}
void
do_modes (char *source, char *data)
{
char *chan = NULL, *mode = NULL, *nick = NULL, *ptr = NULL;
long PM = 0, j = 0, i = 0;
chan = strtok (data, " ");
mode = strtok (NULL, " ");
if ((ptr = strchr (source, '!')) != NULL)
*ptr++ = '\0';
j = strlen (mode);
i = -1; /* i needs to start at 0 */
while (j > 0)
{
j--;
i++;
if (mode[i] == '+')
PM = 1;
if (mode[i] == '-')
PM = 0;
if (mode[i] == 'o')
{
nick = strtok (NULL, " ");
do_op(nick, chan, PM); /* flag this member as having been (De)OP'd/ */
continue;
}
if (mode[i] == 'v')
{ /* voice sucks, ignore it */
nick = strtok (NULL, " ");
continue;
}
if (mode[i] == 'k' || mode[i] == 'b')
{
nick = strtok (NULL, " ");
if (nick[0] == '*' && nick[1] == '!')
{
nick += 2;
}
strlwr (nick);
if (PM == 1)
scan_chan_users (chan, source, nick);
continue;
}
if (mode[i] == 'l' && PM == 1)
{ /* don't parse if -limit
* since no parms */
nick = strtok (NULL, " ");
continue;
}
}
}
/**
* do_quit
*
* Purpose:
* 1) delete all instances when a nick matches (nick)
* 2) delete all users off a given channel
* 2) delete everything (i.e., when the bot is disconnected from irc)
*
* toggle 1 = delete user.
* toggle 2 = delete chan
* toggle 3 = everything (when I'm killed).
*/
void
do_quit (const char *nick, long toggle)
{
struct userlist *pNode = userhead;
struct userlist *pPrev = NULL;
if (toggle == 1)
{
/* delete user */
while (pNode)
{
if (strcasecmp (pNode->nick, nick) == 0)
{
/* found a match, remove it */
save_seen (pNode->nick, pNode->uh, pNode->chan);
if (pPrev != NULL)
{
pPrev->next = pNode->next;
free (pNode);
pNode = pPrev->next;
}
else
{
/* first node in the list */
userhead = pNode->next;
free (pNode);
pNode = userhead;
}
}
else
{
/* No match, continue to next node */
pPrev = pNode;
pNode = pNode->next;
}
}
}
else if (toggle == 2)
{
/* delete channel */
while (pNode)
{
if (strcasecmp (pNode->chan, nick) == 0)
{
/* found a match, remove it */
save_seen (pNode->nick, pNode->uh, pNode->chan);
if (pPrev != NULL)
{
pPrev->next = pNode->next;
free (pNode);
pNode = pPrev->next;
}
else
{
/* first node in the list */
userhead = pNode->next;
free (pNode);
pNode = userhead;
}
}
else
{
/* No match, continue to next node */
pPrev = pNode;
pNode = pNode->next;
}
}
}
else if (toggle == 3)
{
struct userlist *tempPtr = userhead;
while (pNode)
{
tempPtr = pNode->next;
free (pNode);
pNode = tempPtr;
}
}
}
long
f_f (char *host)
{
int i = 0;
for (i = 0; i < fc; i++)
if (!strcasecmp (ood[i].host, host))
return i;
return -1;
}
void
a_f (char *host)
{
if (++fc > 100)
fc = 0;
fc--;
strncpy (ood[fc].host, host, sizeof (ood[fc].host));
ood[fc].time = time (NULL);
ood[fc].count = 0;
ood[fc].value = false;
fc++;
}
void
reset_ (void)
{
int i = 0;
for (i = 0; i < fc; i++)
{
if (ood[i].value && (time (NULL) - ood[i].time) > rt)
{
ood[i].count = 0;
ood[i].time = time (NULL);
ood[i].value = false;
ood[i].kick = 0;
}
}
}
diff --git a/beta/source/compat/crypt.c b/beta/source/compat/crypt.c
index a1431dd..1a2aca6 100644
--- a/beta/source/compat/crypt.c
+++ b/beta/source/compat/crypt.c
@@ -1,785 +1,779 @@
/*
* crypt() for uClibc
*
* Copyright (C) 2000 by Lineo, inc. and Erik Andersen
* Copyright (C) 2000-2006 Erik Andersen <andersen@uclibc.org>
*
* Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
*/
/* Written by Erik Andersen <andersen@uclibc.org> */
#define __FORCE_GLIBC
+#include "defines.h"
+
+#include <sys/cdefs.h>
+#include <sys/param.h>
+#include <pwd.h>
//#include <crypt.h>
-#include <unistd.h>
+
//extern char * crypt_md5_crypt( const char *pw, const char *salt) attribute_hidden;
char * crypt_des_crypt(const char *pw, const char *salt); //attribute_hidden;
char * rpl_crypt(const char *key, const char *salt)
{
/* First, check if we are supposed to be using the MD5 replacement
* instead of DES... */
// ...or not, darkbot doesn't use MD5 crypt.
// if (salt[0]=='$' && salt[1]=='1' && salt[2]=='$')
// return crypt_md5_crypt(key, salt);
// else
return crypt_des_crypt(key, salt);
}
/*
* FreeSec: libcrypt for NetBSD
*
* Copyright (c) 1994 David Burren
* All rights reserved.
*
* Adapted for FreeBSD-2.0 by Geoffrey M. Rehmet
* this file should now *only* export crypt(), in order to make
* binaries of libcrypt exportable from the USA
*
* Adapted for FreeBSD-4.0 by Mark R V Murray
* this file should now *only* export crypt_des(), in order to make
* a module that can be optionally included in libcrypt.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. Neither the name of the author nor the names of other contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* This is an original implementation of the DES and the crypt(3) interfaces
* by David Burren <davidb@werj.com.au>.
*
* An excellent reference on the underlying algorithm (and related
* algorithms) is:
*
* B. Schneier, Applied Cryptography: protocols, algorithms,
* and source code in C, John Wiley & Sons, 1994.
*
* Note that in that book's description of DES the lookups for the initial,
* pbox, and final permutations are inverted (this has been brought to the
* attention of the author). A list of errata for this book has been
* posted to the sci.crypt newsgroup by the author and is available for FTP.
*
* ARCHITECTURE ASSUMPTIONS:
* It is assumed that the 8-byte arrays passed by reference can be
* addressed as arrays of u_int32_t's (ie. the CPU is not picky about
* alignment).
*/
-#define __FORCE_GLIBC
-#include <sys/cdefs.h>
-#include <sys/types.h>
-#include <sys/param.h>
-#include <netinet/in.h>
-#include <pwd.h>
-#include <string.h>
-//#include <crypt.h>
-
/* Re-entrantify me -- all this junk needs to be in
* struct crypt_data to make this really reentrant... */
static u_char inv_key_perm[64];
static u_char inv_comp_perm[56];
static u_char u_sbox[8][64];
static u_char un_pbox[32];
static u_int32_t en_keysl[16], en_keysr[16];
static u_int32_t de_keysl[16], de_keysr[16];
static u_int32_t ip_maskl[8][256], ip_maskr[8][256];
static u_int32_t fp_maskl[8][256], fp_maskr[8][256];
static u_int32_t key_perm_maskl[8][128], key_perm_maskr[8][128];
static u_int32_t comp_maskl[8][128], comp_maskr[8][128];
static u_int32_t saltbits;
static u_int32_t old_salt;
static u_int32_t old_rawkey0, old_rawkey1;
/* Static stuff that stays resident and doesn't change after
* being initialized, and therefore doesn't need to be made
* reentrant. */
static u_char init_perm[64], final_perm[64];
static u_char m_sbox[4][4096];
static u_int32_t psbox[4][256];
-
-
/* A pile of data */
static const u_char ascii64[] = "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
static const u_char IP[64] = {
58, 50, 42, 34, 26, 18, 10, 2, 60, 52, 44, 36, 28, 20, 12, 4,
62, 54, 46, 38, 30, 22, 14, 6, 64, 56, 48, 40, 32, 24, 16, 8,
57, 49, 41, 33, 25, 17, 9, 1, 59, 51, 43, 35, 27, 19, 11, 3,
61, 53, 45, 37, 29, 21, 13, 5, 63, 55, 47, 39, 31, 23, 15, 7
};
static const u_char key_perm[56] = {
57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18,
10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36,
63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22,
14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4
};
static const u_char key_shifts[16] = {
1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
};
static const u_char comp_perm[48] = {
14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10,
23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2,
41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48,
44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32
};
/*
* No E box is used, as it's replaced by some ANDs, shifts, and ORs.
*/
static const u_char sbox[8][64] = {
{
14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13
},
{
15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9
},
{
10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12
},
{
7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14
},
{
2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3
},
{
12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13
},
{
4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12
},
{
13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11
}
};
static const u_char pbox[32] = {
16, 7, 20, 21, 29, 12, 28, 17, 1, 15, 23, 26, 5, 18, 31, 10,
2, 8, 24, 14, 32, 27, 3, 9, 19, 13, 30, 6, 22, 11, 4, 25
};
static const u_int32_t bits32[32] =
{
0x80000000, 0x40000000, 0x20000000, 0x10000000,
0x08000000, 0x04000000, 0x02000000, 0x01000000,
0x00800000, 0x00400000, 0x00200000, 0x00100000,
0x00080000, 0x00040000, 0x00020000, 0x00010000,
0x00008000, 0x00004000, 0x00002000, 0x00001000,
0x00000800, 0x00000400, 0x00000200, 0x00000100,
0x00000080, 0x00000040, 0x00000020, 0x00000010,
0x00000008, 0x00000004, 0x00000002, 0x00000001
};
static const u_char bits8[8] = { 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01 };
static const u_int32_t *bits28, *bits24;
static int
ascii_to_bin(char ch)
{
if (ch > 'z')
return(0);
if (ch >= 'a')
return(ch - 'a' + 38);
if (ch > 'Z')
return(0);
if (ch >= 'A')
return(ch - 'A' + 12);
if (ch > '9')
return(0);
if (ch >= '.')
return(ch - '.');
return(0);
}
static void
des_init(void)
{
int i, j, b, k, inbit, obit;
u_int32_t *p, *il, *ir, *fl, *fr;
static int des_initialised = 0;
if (des_initialised==1)
return;
old_rawkey0 = old_rawkey1 = 0L;
saltbits = 0L;
old_salt = 0L;
bits24 = (bits28 = bits32 + 4) + 4;
/*
* Invert the S-boxes, reordering the input bits.
*/
for (i = 0; i < 8; i++)
for (j = 0; j < 64; j++) {
b = (j & 0x20) | ((j & 1) << 4) | ((j >> 1) & 0xf);
u_sbox[i][j] = sbox[i][b];
}
/*
* Convert the inverted S-boxes into 4 arrays of 8 bits.
* Each will handle 12 bits of the S-box input.
*/
for (b = 0; b < 4; b++)
for (i = 0; i < 64; i++)
for (j = 0; j < 64; j++)
m_sbox[b][(i << 6) | j] =
(u_char)((u_sbox[(b << 1)][i] << 4) |
u_sbox[(b << 1) + 1][j]);
/*
* Set up the initial & final permutations into a useful form, and
* initialise the inverted key permutation.
*/
for (i = 0; i < 64; i++) {
init_perm[final_perm[i] = IP[i] - 1] = (u_char)i;
inv_key_perm[i] = 255;
}
/*
* Invert the key permutation and initialise the inverted key
* compression permutation.
*/
for (i = 0; i < 56; i++) {
inv_key_perm[key_perm[i] - 1] = (u_char)i;
inv_comp_perm[i] = 255;
}
/*
* Invert the key compression permutation.
*/
for (i = 0; i < 48; i++) {
inv_comp_perm[comp_perm[i] - 1] = (u_char)i;
}
/*
* Set up the OR-mask arrays for the initial and final permutations,
* and for the key initial and compression permutations.
*/
for (k = 0; k < 8; k++) {
for (i = 0; i < 256; i++) {
*(il = &ip_maskl[k][i]) = 0L;
*(ir = &ip_maskr[k][i]) = 0L;
*(fl = &fp_maskl[k][i]) = 0L;
*(fr = &fp_maskr[k][i]) = 0L;
for (j = 0; j < 8; j++) {
inbit = 8 * k + j;
if (i & bits8[j]) {
if ((obit = init_perm[inbit]) < 32)
*il |= bits32[obit];
else
*ir |= bits32[obit-32];
if ((obit = final_perm[inbit]) < 32)
*fl |= bits32[obit];
else
*fr |= bits32[obit - 32];
}
}
}
for (i = 0; i < 128; i++) {
*(il = &key_perm_maskl[k][i]) = 0L;
*(ir = &key_perm_maskr[k][i]) = 0L;
for (j = 0; j < 7; j++) {
inbit = 8 * k + j;
if (i & bits8[j + 1]) {
if ((obit = inv_key_perm[inbit]) == 255)
continue;
if (obit < 28)
*il |= bits28[obit];
else
*ir |= bits28[obit - 28];
}
}
*(il = &comp_maskl[k][i]) = 0L;
*(ir = &comp_maskr[k][i]) = 0L;
for (j = 0; j < 7; j++) {
inbit = 7 * k + j;
if (i & bits8[j + 1]) {
if ((obit=inv_comp_perm[inbit]) == 255)
continue;
if (obit < 24)
*il |= bits24[obit];
else
*ir |= bits24[obit - 24];
}
}
}
}
/*
* Invert the P-box permutation, and convert into OR-masks for
* handling the output of the S-box arrays setup above.
*/
for (i = 0; i < 32; i++)
un_pbox[pbox[i] - 1] = (u_char)i;
for (b = 0; b < 4; b++)
for (i = 0; i < 256; i++) {
*(p = &psbox[b][i]) = 0L;
for (j = 0; j < 8; j++) {
if (i & bits8[j])
*p |= bits32[un_pbox[8 * b + j]];
}
}
des_initialised = 1;
}
static void
setup_salt(u_int32_t salt)
{
u_int32_t obit, saltbit;
int i;
if (salt == old_salt)
return;
old_salt = salt;
saltbits = 0L;
saltbit = 1;
obit = 0x800000;
for (i = 0; i < 24; i++) {
if (salt & saltbit)
saltbits |= obit;
saltbit <<= 1;
obit >>= 1;
}
}
static int
des_setkey(const char *key)
{
u_int32_t k0, k1, rawkey0, rawkey1;
int shifts, round;
des_init();
rawkey0 = ntohl(*(const u_int32_t *) key);
rawkey1 = ntohl(*(const u_int32_t *) (key + 4));
if ((rawkey0 | rawkey1)
&& rawkey0 == old_rawkey0
&& rawkey1 == old_rawkey1) {
/*
* Already setup for this key.
* This optimisation fails on a zero key (which is weak and
* has bad parity anyway) in order to simplify the starting
* conditions.
*/
return(0);
}
old_rawkey0 = rawkey0;
old_rawkey1 = rawkey1;
/*
* Do key permutation and split into two 28-bit subkeys.
*/
k0 = key_perm_maskl[0][rawkey0 >> 25]
| key_perm_maskl[1][(rawkey0 >> 17) & 0x7f]
| key_perm_maskl[2][(rawkey0 >> 9) & 0x7f]
| key_perm_maskl[3][(rawkey0 >> 1) & 0x7f]
| key_perm_maskl[4][rawkey1 >> 25]
| key_perm_maskl[5][(rawkey1 >> 17) & 0x7f]
| key_perm_maskl[6][(rawkey1 >> 9) & 0x7f]
| key_perm_maskl[7][(rawkey1 >> 1) & 0x7f];
k1 = key_perm_maskr[0][rawkey0 >> 25]
| key_perm_maskr[1][(rawkey0 >> 17) & 0x7f]
| key_perm_maskr[2][(rawkey0 >> 9) & 0x7f]
| key_perm_maskr[3][(rawkey0 >> 1) & 0x7f]
| key_perm_maskr[4][rawkey1 >> 25]
| key_perm_maskr[5][(rawkey1 >> 17) & 0x7f]
| key_perm_maskr[6][(rawkey1 >> 9) & 0x7f]
| key_perm_maskr[7][(rawkey1 >> 1) & 0x7f];
/*
* Rotate subkeys and do compression permutation.
*/
shifts = 0;
for (round = 0; round < 16; round++) {
u_int32_t t0, t1;
shifts += key_shifts[round];
t0 = (k0 << shifts) | (k0 >> (28 - shifts));
t1 = (k1 << shifts) | (k1 >> (28 - shifts));
de_keysl[15 - round] =
en_keysl[round] = comp_maskl[0][(t0 >> 21) & 0x7f]
| comp_maskl[1][(t0 >> 14) & 0x7f]
| comp_maskl[2][(t0 >> 7) & 0x7f]
| comp_maskl[3][t0 & 0x7f]
| comp_maskl[4][(t1 >> 21) & 0x7f]
| comp_maskl[5][(t1 >> 14) & 0x7f]
| comp_maskl[6][(t1 >> 7) & 0x7f]
| comp_maskl[7][t1 & 0x7f];
de_keysr[15 - round] =
en_keysr[round] = comp_maskr[0][(t0 >> 21) & 0x7f]
| comp_maskr[1][(t0 >> 14) & 0x7f]
| comp_maskr[2][(t0 >> 7) & 0x7f]
| comp_maskr[3][t0 & 0x7f]
| comp_maskr[4][(t1 >> 21) & 0x7f]
| comp_maskr[5][(t1 >> 14) & 0x7f]
| comp_maskr[6][(t1 >> 7) & 0x7f]
| comp_maskr[7][t1 & 0x7f];
}
return(0);
}
static int
do_des( u_int32_t l_in, u_int32_t r_in, u_int32_t *l_out, u_int32_t *r_out, int count)
{
/*
* l_in, r_in, l_out, and r_out are in pseudo-"big-endian" format.
*/
u_int32_t l, r, *kl, *kr, *kl1, *kr1;
u_int32_t f, r48l, r48r;
int round;
if (count == 0) {
return(1);
} else if (count > 0) {
/*
* Encrypting
*/
kl1 = en_keysl;
kr1 = en_keysr;
} else {
/*
* Decrypting
*/
count = -count;
kl1 = de_keysl;
kr1 = de_keysr;
}
/*
* Do initial permutation (IP).
*/
l = ip_maskl[0][l_in >> 24]
| ip_maskl[1][(l_in >> 16) & 0xff]
| ip_maskl[2][(l_in >> 8) & 0xff]
| ip_maskl[3][l_in & 0xff]
| ip_maskl[4][r_in >> 24]
| ip_maskl[5][(r_in >> 16) & 0xff]
| ip_maskl[6][(r_in >> 8) & 0xff]
| ip_maskl[7][r_in & 0xff];
r = ip_maskr[0][l_in >> 24]
| ip_maskr[1][(l_in >> 16) & 0xff]
| ip_maskr[2][(l_in >> 8) & 0xff]
| ip_maskr[3][l_in & 0xff]
| ip_maskr[4][r_in >> 24]
| ip_maskr[5][(r_in >> 16) & 0xff]
| ip_maskr[6][(r_in >> 8) & 0xff]
| ip_maskr[7][r_in & 0xff];
while (count--) {
/*
* Do each round.
*/
kl = kl1;
kr = kr1;
round = 16;
while (round--) {
/*
* Expand R to 48 bits (simulate the E-box).
*/
r48l = ((r & 0x00000001) << 23)
| ((r & 0xf8000000) >> 9)
| ((r & 0x1f800000) >> 11)
| ((r & 0x01f80000) >> 13)
| ((r & 0x001f8000) >> 15);
r48r = ((r & 0x0001f800) << 7)
| ((r & 0x00001f80) << 5)
| ((r & 0x000001f8) << 3)
| ((r & 0x0000001f) << 1)
| ((r & 0x80000000) >> 31);
/*
* Do salting for crypt() and friends, and
* XOR with the permuted key.
*/
f = (r48l ^ r48r) & saltbits;
r48l ^= f ^ *kl++;
r48r ^= f ^ *kr++;
/*
* Do sbox lookups (which shrink it back to 32 bits)
* and do the pbox permutation at the same time.
*/
f = psbox[0][m_sbox[0][r48l >> 12]]
| psbox[1][m_sbox[1][r48l & 0xfff]]
| psbox[2][m_sbox[2][r48r >> 12]]
| psbox[3][m_sbox[3][r48r & 0xfff]];
/*
* Now that we've permuted things, complete f().
*/
f ^= l;
l = r;
r = f;
}
r = l;
l = f;
}
/*
* Do final permutation (inverse of IP).
*/
*l_out = fp_maskl[0][l >> 24]
| fp_maskl[1][(l >> 16) & 0xff]
| fp_maskl[2][(l >> 8) & 0xff]
| fp_maskl[3][l & 0xff]
| fp_maskl[4][r >> 24]
| fp_maskl[5][(r >> 16) & 0xff]
| fp_maskl[6][(r >> 8) & 0xff]
| fp_maskl[7][r & 0xff];
*r_out = fp_maskr[0][l >> 24]
| fp_maskr[1][(l >> 16) & 0xff]
| fp_maskr[2][(l >> 8) & 0xff]
| fp_maskr[3][l & 0xff]
| fp_maskr[4][r >> 24]
| fp_maskr[5][(r >> 16) & 0xff]
| fp_maskr[6][(r >> 8) & 0xff]
| fp_maskr[7][r & 0xff];
return(0);
}
#if 0
static int
des_cipher(const char *in, char *out, u_int32_t salt, int count)
{
u_int32_t l_out, r_out, rawl, rawr;
int retval;
union {
u_int32_t *ui32;
const char *c;
} trans;
des_init();
setup_salt(salt);
trans.c = in;
rawl = ntohl(*trans.ui32++);
rawr = ntohl(*trans.ui32);
retval = do_des(rawl, rawr, &l_out, &r_out, count);
trans.c = out;
*trans.ui32++ = htonl(l_out);
*trans.ui32 = htonl(r_out);
return(retval);
}
#endif
void
setkey(const char *key)
{
int i, j;
u_int32_t packed_keys[2];
u_char *p;
p = (u_char *) packed_keys;
for (i = 0; i < 8; i++) {
p[i] = 0;
for (j = 0; j < 8; j++)
if (*key++ & 1)
p[i] |= bits8[j];
}
des_setkey((char *)p);
}
void
encrypt(char *block, int flag)
{
u_int32_t io[2];
u_char *p;
int i, j;
des_init();
setup_salt(0L);
p = (u_char*)block;
for (i = 0; i < 2; i++) {
io[i] = 0L;
for (j = 0; j < 32; j++)
if (*p++ & 1)
io[i] |= bits32[j];
}
do_des(io[0], io[1], io, io + 1, flag ? -1 : 1);
for (i = 0; i < 2; i++)
for (j = 0; j < 32; j++)
block[(i << 5) | j] = (io[i] & bits32[j]) ? 1 : 0;
}
char *
crypt_des_crypt(const char *key, const char *setting)
{
u_int32_t count, salt, l, r0, r1, keybuf[2];
u_char *p, *q;
static char output[21];
des_init();
/*
* Copy the key, shifting each character up by one bit
* and padding with zeros.
*/
q = (u_char *)keybuf;
while (q - (u_char *)keybuf - 8) {
*q++ = *key << 1;
if (*(q - 1))
key++;
}
if (des_setkey((char *)keybuf))
return(NULL);
#if 0
if (*setting == _PASSWORD_EFMT1) {
int i;
/*
* "new"-style:
* setting - underscore, 4 bytes of count, 4 bytes of salt
* key - unlimited characters
*/
for (i = 1, count = 0L; i < 5; i++)
count |= ascii_to_bin(setting[i]) << ((i - 1) * 6);
for (i = 5, salt = 0L; i < 9; i++)
salt |= ascii_to_bin(setting[i]) << ((i - 5) * 6);
while (*key) {
/*
* Encrypt the key with itself.
*/
if (des_cipher((char *)keybuf, (char *)keybuf, 0L, 1))
return(NULL);
/*
* And XOR with the next 8 characters of the key.
*/
q = (u_char *)keybuf;
while (q - (u_char *)keybuf - 8 && *key)
*q++ ^= *key++ << 1;
if (des_setkey((char *)keybuf))
return(NULL);
}
strncpy(output, setting, 9);
/*
* Double check that we weren't given a short setting.
* If we were, the above code will probably have created
* wierd values for count and salt, but we don't really care.
* Just make sure the output string doesn't have an extra
* NUL in it.
*/
output[9] = '\0';
p = (u_char *)output + strlen(output);
} else
#endif
{
/*
* "old"-style:
* setting - 2 bytes of salt
* key - up to 8 characters
*/
count = 25;
salt = (ascii_to_bin(setting[1]) << 6)
| ascii_to_bin(setting[0]);
output[0] = setting[0];
/*
* If the encrypted password that the salt was extracted from
* is only 1 character long, the salt will be corrupted. We
* need to ensure that the output string doesn't have an extra
* NUL in it!
*/
output[1] = setting[1] ? setting[1] : output[0];
p = (u_char *)output + 2;
}
setup_salt(salt);
/*
* Do it.
*/
if (do_des(0L, 0L, &r0, &r1, (int)count))
return(NULL);
/*
* Now encode the result...
*/
l = (r0 >> 8);
*p++ = ascii64[(l >> 18) & 0x3f];
*p++ = ascii64[(l >> 12) & 0x3f];
*p++ = ascii64[(l >> 6) & 0x3f];
*p++ = ascii64[l & 0x3f];
l = (r0 << 16) | ((r1 >> 16) & 0xffff);
*p++ = ascii64[(l >> 18) & 0x3f];
*p++ = ascii64[(l >> 12) & 0x3f];
*p++ = ascii64[(l >> 6) & 0x3f];
*p++ = ascii64[l & 0x3f];
l = r1 << 2;
*p++ = ascii64[(l >> 12) & 0x3f];
*p++ = ascii64[(l >> 6) & 0x3f];
*p++ = ascii64[l & 0x3f];
*p = 0;
return(output);
}
diff --git a/beta/source/compat/lstat.c b/beta/source/compat/lstat.c
index 9b9c33e..90b4c1a 100644
--- a/beta/source/compat/lstat.c
+++ b/beta/source/compat/lstat.c
@@ -1,80 +1,74 @@
/* Work around a bug of lstat on some systems
Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free
Software Foundation, Inc.
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 2, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
/* written by Jim Meyering */
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
+#include "defines.h"
/* The specification of these functions is in sys_stat.h. But we cannot
include this include file here, because on some systems, a
"#define lstat lstat64" is being used, and sys_stat.h deletes this
definition. */
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <string.h>
-#include <errno.h>
-#include "stat-macros.h"
+#undef lstat
/* lstat works differently on Linux and Solaris systems. POSIX (see
`pathname resolution' in the glossary) requires that programs like
`ls' take into consideration the fact that FILE has a trailing slash
when FILE is a symbolic link. On Linux and Solaris 10 systems, the
lstat function already has the desired semantics (in treating
`lstat ("symlink/", sbuf)' just like `lstat ("symlink/.", sbuf)',
but on Solaris 9 and earlier it does not.
If FILE has a trailing slash and specifies a symbolic link,
then use stat() to get more info on the referent of FILE.
If the referent is a non-directory, then set errno to ENOTDIR
and return -1. Otherwise, return stat's result. */
int
rpl_lstat (const char *file, struct stat *sbuf)
{
size_t len;
int lstat_result = lstat (file, sbuf);
if (lstat_result != 0 || !S_ISLNK (sbuf->st_mode))
return lstat_result;
len = strlen (file);
if (len == 0 || file[len - 1] != '/')
return 0;
/* FILE refers to a symbolic link and the name ends with a slash.
Call stat() to get info about the link's referent. */
/* If stat fails, then we do the same. */
if (stat (file, sbuf) != 0)
return -1;
/* If FILE references a directory, return 0. */
if (S_ISDIR (sbuf->st_mode))
return 0;
/* Here, we know stat succeeded and FILE references a non-directory.
But it was specified via a name including a trailing slash.
Fail with errno set to ENOTDIR to indicate the contradiction. */
errno = ENOTDIR;
return -1;
}
diff --git a/beta/source/compat/lstat.h b/beta/source/compat/lstat.h
deleted file mode 100644
index 6a83fbf..0000000
--- a/beta/source/compat/lstat.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Retrieving information about files.
- Copyright (C) 2005 Free Software Foundation, Inc.
-
- 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 2, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
-
-#include <sys/stat.h>
-
-#if !LSTAT_FOLLOWS_SLASHED_SYMLINK
-extern int rpl_lstat (const char *name, struct stat *buf);
-# undef lstat
-# define lstat rpl_lstat
-#endif
diff --git a/beta/source/compat/malloc.c b/beta/source/compat/malloc.c
index 4f97337..6bbee26 100644
--- a/beta/source/compat/malloc.c
+++ b/beta/source/compat/malloc.c
@@ -1,35 +1,33 @@
/* malloc() function that is glibc compatible.
Copyright (C) 1997, 1998 Free Software Foundation, Inc.
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 2, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
/* written by Jim Meyering */
# include "defines.h"
-
#undef malloc
-
/* Allocate an N-byte block of memory from the heap.
If N is zero, allocate a 1-byte block. */
void *
rpl_malloc (size_t n)
{
if (n == 0)
n = 1;
return malloc (n);
}
diff --git a/beta/source/compat/memset.c b/beta/source/compat/memset.c
index b3646d1..e1a6ad0 100644
--- a/beta/source/compat/memset.c
+++ b/beta/source/compat/memset.c
@@ -1,28 +1,28 @@
/* memset.c -- set an area of memory to a given value
Copyright (C) 1991, 2003 Free Software Foundation, Inc.
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 2, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
-#include <stddef.h>
+#include "defines.h"
void *
rpl_memset (void *str, int c, size_t len)
{
register char *st = str;
while (len-- > 0)
*st++ = c;
return str;
}
diff --git a/beta/source/compat/nanosleep.c b/beta/source/compat/nanosleep.c
index 7ffe05d..ba57a4b 100644
--- a/beta/source/compat/nanosleep.c
+++ b/beta/source/compat/nanosleep.c
@@ -1,145 +1,123 @@
/* Provide a replacement for the POSIX nanosleep function.
Copyright (C) 1999, 2000, 2002, 2004, 2005, 2006 Free Software
Foundation, Inc.
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 2, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
/* written by Jim Meyering */
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
+#include "defines.h"
/* Undefine nanosleep here so any prototype is not redefined to be a
prototype for rpl_nanosleep. (they'd conflict e.g., on alpha-dec-osf3.2) */
-#undef nanosleep
-#include <stdbool.h>
-#include <stdio.h>
#if HAVE_SYS_SELECT_H
# include <sys/select.h>
#endif
-#include <sys/types.h>
-#include <signal.h>
-
-#if TIME_WITH_SYS_TIME
-# include <sys/time.h>
-# include <time.h>
-#else
-# if HAVE_SYS_TIME_H
-# include <sys/time.h>
-# else
-# include <time.h>
-# endif
-#endif
-
-#include <errno.h>
-
-#include <unistd.h>
#include "timespec.h"
/* Some systems (MSDOS) don't have SIGCONT.
Using SIGTERM here turns the signal-handling code below
into a no-op on such systems. */
#ifndef SIGCONT
# define SIGCONT SIGTERM
#endif
#if ! HAVE_SIGINTERRUPT
# define siginterrupt(sig, flag) /* empty */
#endif
static sig_atomic_t volatile suspended;
/* Handle SIGCONT. */
static void
sighandler (int sig)
{
suspended = 1;
}
/* Suspend execution for at least *TS_DELAY seconds. */
static void
my_usleep (const struct timespec *ts_delay)
{
struct timeval tv_delay;
tv_delay.tv_sec = ts_delay->tv_sec;
tv_delay.tv_usec = (ts_delay->tv_nsec + 999) / 1000;
if (tv_delay.tv_usec == 1000000)
{
time_t t1 = tv_delay.tv_sec + 1;
if (t1 < tv_delay.tv_sec)
tv_delay.tv_usec = 1000000 - 1; /* close enough */
else
{
tv_delay.tv_sec = t1;
tv_delay.tv_usec = 0;
}
}
select (0, NULL, NULL, NULL, &tv_delay);
}
/* Suspend execution for at least *REQUESTED_DELAY seconds. The
*REMAINING_DELAY part isn't implemented yet. */
int
rpl_nanosleep (const struct timespec *requested_delay,
struct timespec *remaining_delay)
{
static bool initialized;
/* set up sig handler */
if (! initialized)
{
#ifdef SA_NOCLDSTOP
struct sigaction oldact, newact;
newact.sa_handler = sighandler;
sigemptyset (&newact.sa_mask);
newact.sa_flags = 0;
sigaction (SIGCONT, NULL, &oldact);
if (oldact.sa_handler != SIG_IGN)
sigaction (SIGCONT, &newact, NULL);
#else
if (signal (SIGCONT, SIG_IGN) != SIG_IGN)
{
signal (SIGCONT, sighandler);
siginterrupt (SIGCONT, 1);
}
#endif
initialized = true;
}
suspended = 0;
my_usleep (requested_delay);
if (suspended)
{
/* Calculate time remaining. */
/* FIXME: the code in sleep doesn't use this, so there's no
rush to implement it. */
errno = EINTR;
}
/* FIXME: Restore sig handler? */
return suspended;
}
diff --git a/beta/source/compat/realloc.c b/beta/source/compat/realloc.c
index fe94822..e3c7902 100644
--- a/beta/source/compat/realloc.c
+++ b/beta/source/compat/realloc.c
@@ -1,46 +1,43 @@
/* realloc() function that is glibc compatible.
Copyright (C) 1997, 2003, 2004 Free Software Foundation, Inc.
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 2, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
/* written by Jim Meyering */
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-#undef realloc
+#include "defines.h"
-#include <stdlib.h>
+#undef realloc
/* Change the size of an allocated block of memory P to N bytes,
with error checking. If N is zero, change it to 1. If P is NULL,
use malloc. */
void *
rpl_realloc (void *p, size_t n)
{
if (n == 0)
{
n = 1;
/* In theory realloc might fail, so don't rely on it to free. */
free (p);
p = NULL;
}
if (p == NULL)
return malloc (n);
return realloc (p, n);
}
diff --git a/beta/source/compat/snprintf.c b/beta/source/compat/snprintf.c
index 952ab59..e7ed74f 100644
--- a/beta/source/compat/snprintf.c
+++ b/beta/source/compat/snprintf.c
@@ -1,23 +1,20 @@
/* Provide a version vfprintf in terms of _doprnt.
By Kaveh Ghazi (ghazi@caip.rutgers.edu) 3/29/98
Copyright (C) 1998 Free Software Foundation, Inc.
*/
-#include "ansidecl.h"
-#include <stdarg.h>
-#include <stdio.h>
-#undef snprintf
+#include "defines.h"
int
rpl_snprintf (char *buff, size_t size, const char *fmt, ...)
{
static char temp[BUFSIZ]; /* a temp (large buffer) */
int result;
va_list ap;
va_start (ap, fmt);
result = vsprintf (temp, fmt, ap);
strncpy (buff, temp, size - 1); /* copy at most n */
buff[size - 1] = '\0'; /* ensure \0 at end */
va_end (ap);
return result;
}
diff --git a/beta/source/compat/stat.c b/beta/source/compat/stat.c
index 75d6e58..3a74869 100644
--- a/beta/source/compat/stat.c
+++ b/beta/source/compat/stat.c
@@ -1,76 +1,64 @@
/* Work around a bug of stat on some systems
Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006 Free
Software Foundation, Inc.
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 2, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
/* written by Jim Meyering */
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
+#include "defines.h"
-/* The specification of these functions is in sys_stat.h. But we cannot
- include this include file here, because on some systems, a
- "#define lstat lstat64" is being used, and sys_stat.h deletes this
- definition. */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <string.h>
-#include <errno.h>
-
-#include "stat-macros.h"
+#undef stat
/* stat works differently on Linux and Solaris systems. POSIX (see
`pathname resolution' in the glossary) requires that programs like
`ls' take into consideration the fact that FILE has a trailing slash
when FILE is a symbolic link. On Linux and Solaris 10 systems, the
stat function already has the desired semantics (in treating
`stat ("symlink/", sbuf)' just like `stat ("symlink/.", sbuf)',
but on Solaris 9 and earlier it does not.
If FILE has a trailing slash and specifies a symbolic link,
then use stat() to get more info on the referent of FILE.
If the referent is a non-directory, then set errno to ENOTDIR
and return -1. Otherwise, return stat's result. */
int
rpl_stat (const char *file, struct stat *sbuf)
{
size_t len;
int stat_result = stat (file, sbuf);
if (stat_result != 0 || !S_ISLNK (sbuf->st_mode))
return stat_result;
len = strlen (file);
if (len == 0 || file[len - 1] != '/')
return 0;
/* FILE refers to a symbolic link and the name ends with a slash.
Call stat() to get info about the link's referent. */
/* If FILE references a directory, return 0. */
if (S_ISDIR (sbuf->st_mode))
return 0;
/* Here, we know stat succeeded and FILE references a non-directory.
But it was specified via a name including a trailing slash.
Fail with errno set to ENOTDIR to indicate the contradiction. */
errno = ENOTDIR;
return -1;
}
diff --git a/beta/source/compat/strcase.h b/beta/source/compat/strcase.h
deleted file mode 100644
index e420798..0000000
--- a/beta/source/compat/strcase.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/* Case-insensitive string comparison functions.
- Copyright (C) 1995-1996, 2001, 2003, 2005 Free Software Foundation, Inc.
-
- 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 2, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
-
-#ifndef _STRCASE_H
-#define _STRCASE_H
-
-#include <stddef.h>
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-/* Compare strings S1 and S2, ignoring case, returning less than, equal to or
- greater than zero if S1 is lexicographically less than, equal to or greater
- than S2.
- Note: This function may, in multibyte locales, return 0 for strings of
- different lengths! */
-extern int strcasecmp (const char *s1, const char *s2);
-
-/* Compare no more than N characters of strings S1 and S2, ignoring case,
- returning less than, equal to or greater than zero if S1 is
- lexicographically less than, equal to or greater than S2.
- Note: This function can not work correctly in multibyte locales. */
-extern int strncasecmp (const char *s1, const char *s2, size_t n);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* _STRCASE_H */
diff --git a/beta/source/compat/strcasecmp.c b/beta/source/compat/strcasecmp.c
index bf08c5f..f6e735d 100644
--- a/beta/source/compat/strcasecmp.c
+++ b/beta/source/compat/strcasecmp.c
@@ -1,107 +1,97 @@
/* Case-insensitive string comparison function.
Copyright (C) 1998, 1999, 2005 Free Software Foundation, Inc.
Written by Bruno Haible <bruno@clisp.org>, 2005,
based on earlier glibc code.
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 2, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-/* Specification. */
-#include "strcase.h"
-
-#include <ctype.h>
-#include <limits.h>
+#include "defines.h"
#if HAVE_MBRTOWC
# include "mbuiter.h"
#endif
#define TOLOWER(Ch) (isupper (Ch) ? tolower (Ch) : (Ch))
-#undef strcasecmp
-
/* Compare strings S1 and S2, ignoring case, returning less than, equal to or
greater than zero if S1 is lexicographically less than, equal to or greater
than S2.
Note: This function may, in multibyte locales, return 0 for strings of
different lengths! */
int
rpl_strcasecmp (const char *s1, const char *s2)
{
if (s1 == s2)
return 0;
/* Be careful not to look at the entire extent of s1 or s2 until needed.
This is useful because when two strings differ, the difference is
most often already in the very few first characters. */
#if HAVE_MBRTOWC
if (MB_CUR_MAX > 1)
{
mbui_iterator_t iter1;
mbui_iterator_t iter2;
mbui_init (iter1, s1);
mbui_init (iter2, s2);
while (mbui_avail (iter1) && mbui_avail (iter2))
{
int cmp = mb_casecmp (mbui_cur (iter1), mbui_cur (iter2));
if (cmp != 0)
return cmp;
mbui_advance (iter1);
mbui_advance (iter2);
}
if (mbui_avail (iter1))
/* s2 terminated before s1. */
return 1;
if (mbui_avail (iter2))
/* s1 terminated before s2. */
return -1;
return 0;
}
else
#endif
{
const unsigned char *p1 = (const unsigned char *) s1;
const unsigned char *p2 = (const unsigned char *) s2;
unsigned char c1, c2;
do
{
c1 = TOLOWER (*p1);
c2 = TOLOWER (*p2);
if (c1 == '\0')
break;
++p1;
++p2;
}
while (c1 == c2);
if (UCHAR_MAX <= INT_MAX)
return c1 - c2;
else
/* On machines where 'char' and 'int' are types of the same size, the
difference of two 'unsigned char' values - including the sign bit -
doesn't fit in an 'int'. */
return (c1 > c2 ? 1 : c1 < c2 ? -1 : 0);
}
}
diff --git a/beta/source/compat/strcasestr.c b/beta/source/compat/strcasestr.c
index fef8790..f369b36 100644
--- a/beta/source/compat/strcasestr.c
+++ b/beta/source/compat/strcasestr.c
@@ -1,75 +1,69 @@
/* strcasestr.c -- case insensitive substring search in C locale
Copyright (C) 2005 Free Software Foundation, Inc.
Written by Bruno Haible <bruno@clisp.org>, 2005.
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 2, 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <stddef.h>
-
-#include <ctype.h>
+#include "defines.h"
/* Find the first occurrence of NEEDLE in HAYSTACK, using case-insensitive
comparison.
Note: This function may, in multibyte locales, return success even if
strlen (haystack) < strlen (needle) ! */
char *
rpl_strcasestr (const char *haystack, const char *needle)
{
/* Be careful not to look at the entire extent of haystack or needle
until needed. This is useful because of these two cases:
- haystack may be very long, and a match of needle found early,
- needle may be very long, and not even a short initial segment of
needle may be found in haystack. */
if (*needle != '\0')
{
/* Speed up the following searches of needle by caching its first
character. */
unsigned char b = tolower ((unsigned char) *needle);
needle++;
for (;; haystack++)
{
if (*haystack == '\0')
/* No match. */
return NULL;
if (tolower ((unsigned char) *haystack) == b)
/* The first character matches. */
{
const char *rhaystack = haystack + 1;
const char *rneedle = needle;
for (;; rhaystack++, rneedle++)
{
if (*rneedle == '\0')
/* Found a match. */
return (char *) haystack;
if (*rhaystack == '\0')
/* No match. */
return NULL;
if (tolower ((unsigned char) *rhaystack)
!= tolower ((unsigned char) *rneedle))
/* Nothing in this round. */
break;
}
}
}
}
else
return (char *) haystack;
}
diff --git a/beta/source/compat/strndup.c b/beta/source/compat/strndup.c
index 0106f2c..636a4cd 100644
--- a/beta/source/compat/strndup.c
+++ b/beta/source/compat/strndup.c
@@ -1,47 +1,43 @@
-#include <stdlib.h>
-#include "minmax.h"
-
-#undef strndup
+#include "defines.h"
/**
* Allocate a new character array. Copy into it at most
* maxBytes bytes.
*/
char *
rpl_strndup (const char *dupMe, size_t maxBytes)
{
char *ptr = NULL;
char *retMe = NULL;
/* Configure maxBytes to be the number of bytes to copy */
maxBytes = MIN(strlen(dupMe), maxBytes);
/* Allocate the return buffer. */
retMe = malloc (maxBytes + 1);
/* Was the allocation successful? */
if (NULL == retMe)
{
return NULL;
}
/*
* ptr will point to the byte to which to copy the next
* source byte.
*/
ptr = retMe;
/*
* Continue while dupMe is valid and we are < maxBytes number
* of bytes copied. This is typecase here because size_t is
* unsigned, so comparing against > 0 *should* produce a
* warning :)
*/
while (dupMe && (int) maxBytes-- > 0)
{
*ptr++ = *dupMe++;
}
/* Be sure to NULL terminate the array */
*ptr = 0;
return retMe;
}
-
diff --git a/beta/source/compat/strspn.c b/beta/source/compat/strspn.c
index 4bc2223..2bd3d07 100644
--- a/beta/source/compat/strspn.c
+++ b/beta/source/compat/strspn.c
@@ -1,44 +1,43 @@
/* Copyright (C) 1991, 1997, 2003 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA. */
-#include <string.h>
+#include "defines.h"
-#undef strspn
/* Return the length of the maximum initial segment
of S which contains only characters in ACCEPT. */
size_t
rpl_strspn (const char *s, const char *accept)
{
const char *p;
const char *a;
size_t count = 0;
for (p = s; *p != '\0'; ++p)
{
for (a = accept; *a != '\0'; ++a)
if (*p == *a)
break;
if (*a == '\0')
return count;
else
++count;
}
return count;
}
diff --git a/beta/source/compat/strstr.c b/beta/source/compat/strstr.c
index ba51754..c53b501 100644
--- a/beta/source/compat/strstr.c
+++ b/beta/source/compat/strstr.c
@@ -1,41 +1,37 @@
/* Simple implementation of strstr for systems without it.
This function is in the public domain. */
/*
@deftypefn Supplemental char* strstr (const char *@var{string}, const char *@var{sub})
This function searches for the substring @var{sub} in the string
@var{string}, not including the terminating null characters. A pointer
to the first occurrence of @var{sub} is returned, or @code{NULL} if the
substring is absent. If @var{sub} points to a string with zero
length, the function returns @var{string}.
@end deftypefn
*/
/* FIXME: The above description is ANSI compiliant. This routine has not
been validated to comply with it. -fnf */
-#include <stddef.h>
-
-//extern char *strchr (const char *, int);
-//extern int strncmp (const void *, const void *, size_t);
-//extern size_t strlen (const char *);
+#include "defines.h"
char *
rpl_strstr (const char *s1, const char *s2)
{
const char *p = s1;
const size_t len = strlen (s2);
for (; (p = strchr (p, *s2)) != 0; p++)
{
if (strncmp (p, s2, len) == 0)
return (char *)p;
}
return (0);
}
diff --git a/beta/source/compat/vfprintf.c b/beta/source/compat/vfprintf.c
index 1f05e88..30b85e6 100644
--- a/beta/source/compat/vfprintf.c
+++ b/beta/source/compat/vfprintf.c
@@ -1,15 +1,12 @@
/* Provide a version vfprintf in terms of _doprnt.
By Kaveh Ghazi (ghazi@caip.rutgers.edu) 3/29/98
Copyright (C) 1998 Free Software Foundation, Inc.
*/
-#include "ansidecl.h"
-#include <stdarg.h>
-#include <stdio.h>
-#undef vfprintf
+#include "defines.h"
int
rpl_vfprintf (FILE *stream, const char *format, va_list ap)
{
return _doprnt (format, ap, stream);
}
diff --git a/beta/source/compat/vsprintf.c b/beta/source/compat/vsprintf.c
index 96fc668..201bb47 100644
--- a/beta/source/compat/vsprintf.c
+++ b/beta/source/compat/vsprintf.c
@@ -1,56 +1,53 @@
/* Simple implementation of vsprintf for systems without it.
Highly system-dependent, but should work on most "traditional"
implementations of stdio; newer ones should already have vsprintf.
Written by Per Bothner of Cygnus Support.
Based on libg++'s "form" (written by Doug Lea; dl@rocky.oswego.edu).
Copyright (C) 1991, 1995, 2002 Free Software Foundation, Inc.
This file is part of the libiberty library. This library 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 2, or (at your option)
any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with GNU CC; see the file COPYING. If not, write to
the Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
As a special exception, if you link this library with files
compiled with a GNU compiler to produce an executable, this does not cause
the resulting executable to be covered by the GNU General Public License.
This exception does not however invalidate any other reasons why
the executable file might be covered by the GNU General Public License. */
-#include <ansidecl.h>
-#include <stdarg.h>
-#include <stdio.h>
-#undef vsprintf
+#include "defines.h"
#if defined _IOSTRG && defined _IOWRT
int
rpl_vsprintf (char *buf, const char *format, va_list ap)
{
FILE b;
int ret;
#ifdef VMS
b->_flag = _IOWRT|_IOSTRG;
b->_ptr = buf;
b->_cnt = 12000;
#else
b._flag = _IOWRT|_IOSTRG;
b._ptr = buf;
b._cnt = 12000;
#endif
ret = _doprnt(format, ap, &b);
putc('\0', &b);
return ret;
}
#endif
diff --git a/beta/source/configure.ac b/beta/source/configure.ac
index 404eefb..f5fca14 100644
--- a/beta/source/configure.ac
+++ b/beta/source/configure.ac
@@ -1,104 +1,109 @@
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.59)
AC_INIT([Darkbot],[8rc2],[ron@darkbot.org])
AC_COPYRIGHT([Copyright 1996 Darkbot Development Team])
AC_REVISION($Revision$)
AC_CONFIG_AUX_DIR([auxdir])
AC_CONFIG_LIBOBJ_DIR([../source/compat])
AC_CONFIG_MACRO_DIR([../m4])
AC_CONFIG_SRCDIR([../source/parse.c])
AC_CONFIG_HEADERS([config.h])
AM_INIT_AUTOMAKE([foreign 1.9 -Wall -Werror])
# Checks for programs.
AC_GNU_SOURCE
AC_PROG_CC
AC_PROG_INSTALL
AC_PROG_MAKE_SET
AC_PROG_RANLIB
gl_USE_SYSTEM_EXTENSIONS
# Checks for libraries.
AC_CHECK_LIB(crypt, crypt)
LIB_SOCKET_NSL
# Checks for header files.
AC_HEADER_DIRENT
AC_HEADER_STDC
AC_HEADER_STAT
AC_CHECK_HEADERS([arpa/inet.h errno.h fcntl.h limits.h netdb.h netinet/in.h stddef.h stdlib.h string.h sys/param.h sys/socket.h sys/time.h unistd.h])
+gl_MINMAX
# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STDBOOL
AC_C_CONST
AC_C_INLINE
AC_TYPE_SIZE_T
AC_HEADER_TIME
AC_C_VOLATILE
gl_TIMESPEC
# Checks for library functions.
AC_FUNC_CLOSEDIR_VOID
AC_FUNC_FORK
AC_FUNC_MALLOC
AC_FUNC_REALLOC
# FIXME: change all select()'s to cater to the detected results of AC_FUNC_SELECT_ARGTYPES.
# Probably not a lot can be done with the results actually.
AC_FUNC_SELECT_ARGTYPES
AC_TYPE_SIGNAL
AC_FUNC_LSTAT
AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK
AC_FUNC_STAT
AC_FUNC_VPRINTF
AC_CHECK_FUNCS([alarm gethostbyname memmove select socket strchr strrchr])
AC_REPLACE_FUNCS([crypt memset nanosleep snprintf strcasecmp strcasestr strndup strspn strstr vfprintf vsprintf])
# User enabled stuff.
# testing mode must be done first.
DB_ENABLE_GENERIC([testing],[no],[TESTING],[testing mode - for developers only])
DB_ENABLE_COMMAND([math],[yes],[MATH])
DB_ENABLE_COMMANDS([CTCP],[yes],[CTCP])
DB_ENABLE_COMMANDS([channel],[yes],[CHANNEL])
DB_ENABLE_COMMAND([google],[yes],[GOOGLE])
DB_ENABLE_COMMAND([weather],[yes],[WEATHER])
DB_ENABLE_COMMAND([METAR],[yes],[METAR])
DB_ENABLE_COMMAND([TAF],[yes],[TAF])
DB_ENABLE_COMMAND([quiz],[no],[QUIZ])
DB_ENABLE_COMMAND([randq],[yes],[RANDQ])
DB_ENABLE_GENERIC([status],[no],[STATUS],[display of network status])
DB_ENABLE_GENERIC([whois],[no],[WHOIS],[notification of users from questionable channels])
DB_ENABLE_GENERIC([stoned],[yes],[STONED_CHECK],[server stoned check])
DB_ENABLE_GENERIC([version],[no],[VERSION_CHECK],[new darkbot version check])
DB_ENABLE_GENERIC([verbose],[yes],[VERBOSE],[verbose startup])
DB_ENABLE_GENERIC([encrypt],[no],[ENCRYPT],[encryption of passwords])
DB_ENABLE_GENERIC([random],[yes],[RANDOM],[random utterences])
DB_ENABLE_VALUE([lang],[1],[LANG],[language])
DB_ENABLE_VALUE([sleep],[3],[SLEEP_LEVEL],[sleep command access level])
DB_ENABLE_VALUE([add],[1],[ADD_LEVEL],[topic adding access level])
DB_ENABLE_VALUE([del],[1],[DEL_LEVEL],[topic deleting access level])
DB_ENABLE_VALUE([random],[2],[RAND_LEVEL],[randomstuff command access level])
DB_ENABLE_VALUE([data],[400],[MAX_DATA_SIZE],[maximum data size])
DB_ENABLE_VALUE([topic],[50],[MAX_TOPIC_SIZE],[maximum topic size])
# If in testing mode, then make sure everything gets compiled.
if test "[${db_cv_enable_testing}]" = yes; then
AC_LIBOBJ([crypt])
+ AC_LIBOBJ([lstat])
+ AC_LIBOBJ([malloc])
AC_LIBOBJ([memset])
AC_LIBOBJ([nanosleep])
+ AC_LIBOBJ([realloc])
AC_LIBOBJ([snprintf])
+ AC_LIBOBJ([stat])
AC_LIBOBJ([strcasecmp])
AC_LIBOBJ([strcasestr])
AC_LIBOBJ([strndup])
AC_LIBOBJ([strspn])
AC_LIBOBJ([strstr])
AC_LIBOBJ([vfprintf])
AC_LIBOBJ([vsprintf])
fi
# Create output files.
AC_CONFIG_FILES([Makefile defines.h:../source/defines.h.in])
AC_OUTPUT
diff --git a/beta/source/defines.h.in b/beta/source/defines.h.in
index 60f31d0..e3f06a1 100755
--- a/beta/source/defines.h.in
+++ b/beta/source/defines.h.in
@@ -1,935 +1,950 @@
/* @configure_input@ */
#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
/* defines.h
*** Darkbot (c) 2002
* The Internet Relay Chat Talking Robot
*
*** Darkbot Creator - Jason Hamilton (play) Jason@superlink.net
* Project Administrator - LuizCB (Pincel) LuizCB@darkbot.info
* Recent Code Modifications - Ron (`ron) ron@darkbot.org
*
* Official Sites: http://www.darkbot.org
* http://darkbot.sourceforge.net
*
*** For any questions, suggestions, malfunctions, etc
* Use our support forum at http://forum.darkbot.org
*
* *******************************---******************************* */
/*
*** NOTES - READ before you start:
*** Lines beginning by # (hash) are peprocessor directives, they are not
* comments. You should NOT remove them.
*** #defines should only be changed to ON, OFF, #define, #undef
* or it's value defined on the very right end.
*** Areas between " " are messages Darkbot will send. Do not remove " ".
*** Double slash characters on de beginning of a line or slaches followed
* or preceded by * on the beginning and end of lines envolving some
* portion of text are comment characters combinations with help
* information for the delelopers or users. They do not have any effect
* in the behavior of the program.
*
,-----------------------------------------------------------------,
| Note that the defines bellow are the RECOMMENDED settings! |
| Modify it by changing it's values of the data. This file will |
| instruct the compiler to build the executable file. If you're |
| not sure of what to do, leave the default settings alone :) |
`-----------------------------------------------------------------' */
+#define ON 1
+#define OFF 0
+
+
/* ================ SYSTEM REQUIREMENTS ================ */
/*
* Change the Ansi C signal handling below if it's not in the standard place,
* usually on include/. Leave it as is if you don't know what that is. Type
* 'man signal' on your unix box for more info.
* (default = <signal.h>)
*/
//#include <signal.h>
/*
* Most BSD systems will not need this. If your bot will
* connect but don't react at all try turning this ON.
* (default = OFF)
*/
//#define NEED_LIBC5 OFF
/*
* SGI boxes (ie; IRIX system) need this
* define to run. (default = OFF)
*/
//#define SGI OFF
/* ================ LANGUAGE ================ */
/*
* Pick a number from the list below for the language you
* want your darkbot to speak. Default is 1, English.
* ------------------------------------------------------------------
* 1 = ENGLISH - play <jason@superlink.net>
* 2 = FRENCH - Inajira <inajira@videotron.ca>
* - EfX <michel.efx@globetrotter.net>
* - eCHaLoTTe <echalotte@cablevision.qc.ca>
* 3 = SPANISH - speed1 <speed@eduredes.edu.do>
* 4 = DUTCH - Asmodai <asmodai@wxs.nl>
* 5 = LATIN - Otaku <otaku@unixgeek.ml.org>
* 6 = GREEK - Chris_CY <chriscy@cylink.net>
* 7 = EBONICS - rapsux <bitter@ici.net>
* 8 = PIG LATIN- Cloud <burtner@usa.net>
* 9 = RUSSIAN - KOI8 encoding
* 10= RUSSIAN - CP1251 encoding
* - Oleg Drokin <green@ccssu.crimea.ua>
* 11= PORTUGUESE- Pincel <Pincel@darkbot.info>
* 12= GERMAN - C.Hoegl@gmx.net & marc@reymann.net
* 13= ITALIAN - daniele nicolucci <jollino@icemail.it>
* 14= CHINESE - James <jamespower@263.net>
* 15= SWEDISH - Ybznek <sunmo@seaside.se>
* 16= NORWEGIAN- [SoHo] <soho@int19h.com>
* 17= ROMANIAN - Radu <radu.negoescu@sante.univ-nantes.fr>
* 18= ARABIC - MrSiMo <mrsimo7@yahoo.fr>
* 19= TAIWANISH- ?
* ------------------------------------------------------------------
* ? = Email juice@darkbot.org if you want to help add other langs!
* ------------------------------------------------------------------
*/
//#define LANG 1
/* ================ STARTUP, CONNECTION, IRC ================ */
/* ==== ON START ==== */
/*
* Your darkbot tell you (at startup) what the latest version of
* darkbot is. If you DO NOT WANT THIS, then define this. We recommend
* keeping this defined.
*/
//#define ENABLE_VERSION_CHECK
/* ==== ON CONNECTION ==== */
/*
* Print out extra details while starting up?
*/
//#define VERB
/*
* Check if servers are not responding, is so
* connect to next server in list. (recommended)
* Some linux systems have problems with this.
* You'll know if you're one of them if your bot
* disconnects every 5 minutes.
*
* ALSO NOTE: If your bot seems to disconnect every 5 minutes, try
* turning off the CHECK_STONED code.
*/
//#define CHECK_STONED ON
/*
* This is the time that darkbot will wait for a connection
* to the server, before trying the next server. You may need
* to increase this if you are on a slow connection.
*/
//#define CONNECT_WAIT_TIMEOUT 10
/* ==== ON CONNECTED - IRC ==== */
/*
* Send everything that's in PERFORM.INI
* to the IRC server every 60 seconds?
* Useful if the bot is banned, or X was
* split at the time darkbot signed on.
*/
//#define PERFORM_TIMER ON
/*
* What user modes do you want for darkbot?
*/
//#define DEFAULT_UMODE "+i-ds"
/* ==== ON IRC ==== */
/*
* Reply to CTCP's? (PING/VERSION).
*/
//#define CTCP ON
/*
* Want your darkbot to always have less than
* 10 min idle? This isn't usually needed since
* darkbots tend to talk a lot. (default = undef)
*/
//#undef ANTI_IDLE
/* ==== ONJOIN ==== */
/*
* When bot joins a channel, sometimes it's hard
* to tell when it's "synced" and is no longer processing
* stuff -- this tells the channel the bot has finished
* syncing. For example, if you try to login while it's
* still syncing, it may just ignore your login request
* until it sees you in the channel. (default = OFF)
*/
//#define DISPLAY_SYNC OFF
/* ================ DATABASE MANAGEMENT ================ */
/* ==== ON START ==== */
/*
* Sort your info2.db on startup? Will take
* forever if u have a large db. If you have dividers or
* any sort of markers on your database and you want to
* preserve their position leave this directive undefined.
* Sorting the database will put all items listed in
* alphabetic order. (default = undef)
*/
//#undef SORT
/*
* When user's do the INFO command, and at
* startup, do you want to find and remove
* duplicates database entries? (default = undef)
*/
//#undef FIND_DUPS
/*
* When duplicate topics are found, do you
* want to save them? (in case some topics
* are accidently deleted) (default = define)
*/
//#define SAVE_DUPS
/* ==== PERMISSIONS ==== */
/*
* Do you want Darkbot to answer questions that match a topic
* without addressing the bot? (default = ON)
*/
//#define GENERAL_QUESTIONS ON
/*
* Turn this ON if you want to be able to use the ADD function
* in private message to the bot. (default = OFF)
*/
//#define ALLOW_ADD_IN_MSG OFF
/*
* Turn this ON if you want to be able to use the DEL function
* in private message to the bot. (default = OFF)
*/
//#define ALLOW_DEL_IN_MSG OFF
/*
* If you want your bot to be able to respond to things asked
* in private messages, turn this option ON. Use the above two
* defines to allow/disallow adding or deleting entries in private.
* (default = OFF)
*/
//#define MSG_RESPONSES OFF
/*
* Toggles the use of encrypted passwords in the userlist.db file.
* Turn this off if you don't want your passwords encrypted. Also
* note that if you're using encrypted passwords and you decide to
* turn this option off, you'll need to redo your userlist.db file.
* Note: If you're new to Darkbot, you may want to turn this option OFF.
*/
//#define ENCRYPT_PASSWORDS OFF
/*
* Minimal access level required to add
* topics? (default = define)
*/
//#define REQ_ACCESS_ADD
/*
* Minimal access level required to to delete
* topics? (default = define)
*/
//#define REQ_ACCESS_DEL
/* ==== LOGS ==== */
/*
* Do you want to log who adds/deletes topics? Log saved
* to dat/logs/add_delete.log (default = define)
*/
//#define LOG_ADD_DELETES
/*
* Do you want to log all privmsg's to your
* darkbot? (will be saved to dat/logs/ dir)
* (default = ON)
*/
//#define LOG_PRIVMSG ON
/* ==== SLEEP DIRECTIVES ==== */
/*
* Level at which user's can make darkbot shut up
* (aka hush). This is useful for help channels when
* they want darkbot to quit talking while they address
* something important in the chan (default = 3)
*/
//#define SLEEP_LEVEL 3
/*
* How many seconds to sleep for? (default = 300 (5 minutes))
*/
//#define SLEEP_TIME 300
/*
* What you would want your Darkbot to say when sleep and
* wake up commands are issued? (If you want you can change
* what is between 'ACTION' and '\1')
*/
//#define GOSLEEP_ACTION "\1ACTION falls asleep... ZzzZZzzZZzz\1"
//#define WAKEUP_ACTION "\1ACTION wakes up from a snooze..\1"
/* ==== DATA SIZE ==== */
/*
* The max length your database replies will be. This will be useful
* to people loading their database into ram - if your data is all
* less than 400 chars, then you can save some ram.... Longer replies
* allows you to do more, for example, with bitwise operator PIPE
* (default = 400)
*/
//#define MAX_DATA_SIZE 400
/*
* The max length your database topics will be. (default = 50)
*/
//#define MAX_TOPIC_SIZE 50
/* ==== OUTPUTS - TIMERS ==== */
/*
* LASTCOMM_TIME is the length of time (in seconds)
* that your bot will not reply to a topic already
* asked. Thus if someone asked your bot about "mirc"
* that question could not be asked again in the
* same format for N seconds (or till the question
* is out of buffer). This prevents the bot from
* falling prey to users who like to repeat.
* (default = 5)
*/
//#define LASTCOMM_TIME 5
/*
* BELOW is the output timers. Darkbot does not
* output text without first putting it into a
* queue list. If the bot has several lines of text
* waiting to be sent, it starts to delay longer
* and longer between output, so it can't flood
* itself off of IRC. Explanation:
*
* If text in queue is < OUTPUT1_COUNT, output it.
* If text in queue is > OUTPUT1_COUNT, delay
* OUTPUT1_DELAY seconds. If queue is > OUTPUT2_COUNT,
* delay OUTPUT2_DELAY seconds. If number of text
* in queue is higher than OUTPUT_PURGE_COUNT, then
* just delete all unneeded output (ie; any text
* and notices, but leaving in stuff like kicks
* and modes) The defaults below are recommended,
* as the bot isn't going to flood off. If you are
* having the bot delete output messages and you'd
* like to increase the queue, update the
* OUTPUT_PURGE_COUNT to a larger number. Just keep
* in mind if someone floods your bot with a lot of
* VERSION requests, the bot will sit there outputting
* a lot of version replies instead of deleting them,
* causing it to act as if it's just sitting there not
* doing anything when you ask it something in your
* channel. (defaults = 4) = 1) = 6) = 2)
*/
//#define OUTPUT1_COUNT 4
//#define OUTPUT1_DELAY 1
//#define OUTPUT2_COUNT 6
//#define OUTPUT2_DELAY 2
/*
* If still < OUTPUT_PURGE_COUNT and > OUTPUT2_COUNT
* then delay OUTPUT3_DELAY secs. (default = 3)
*/
//#define OUTPUT3_DELAY 3
/*
* When all else fails... if more than OUTPUT_PURGE_COUNT
* delete them all! No use in making the bot output slowly
* over a long period of time... imagine if you set this to
* 50, and had an OUTPUT3_DELAY of 3 secs.. thats 50*3 secs
* till the bot is ready to output any new data to you!
* (default = 7)
*/
//#define OUTPUT_PURGE_COUNT 7
/* ======== OUTPUT MESSAGES ======== */
/* ==== OUTPUT MESSAGES - ON TOPICS ==== */
/*
* Message to give when adding an existent topic
*/
//#define EXISTING_ENTRY "Sorry, there is an existing entry under keyword"
/*
* Message to give when there is no mentioned topic
*/
//#define NO_ENTRY "I was unable to find entry:"
/* ==== OUTPUT MESSAGES - ON SEARCH ==== */
/*
* These are the messages Darkbot will give on unaccomplished
* search queries. Change the areas between " " with what
* you want.
*/
//#define CANT_FIND "Was unable to find" /* ... */
//#define NO_TOPIC "Sorry, I don't have any entry for" /* ... */
//#define TRY_FIND "What am I trying to find"
/* ==== OUTPUT MESSAGES - ON NONEXISTENT TEXT ==== */
/*
* Answer to give in case Darkbot's nick is mentioned
* without any further text. Do not UNDEF. If you want
* change only what is between " ". Check next directive.
*/
//#define WHUT "hmmm?"
/*
* Gives a random response from dat/whut.rdb instead what
* is specified on 'define WHUT'. (default = ON)
*/
//#define RANDOM_WHUT ON
/*
* Answer to give in case there is no reply on Darkbot's database
* Do not UNDEF. If you want change only what is between " ". Check
* next directive.
*/
//#define DUNNO_Q "*shrug*"
/*
* For those wanting the DUNNO_Q response to be random, turn this
* option ON, and darkbot will ignore the default definition and
* use a random line from dat/dunno.db
*/
//#define RANDOM_DUNNO ON
/* ======== RANDOM STUFF ========= */
/*
* Will read from a random line in dat/randomstuff.ini and say
* something random in the home channel. ALSO if nothing is said
* in darkbot's home channel it will say a randomstuff every
* RAND_IDLE as long as no one says anything. (default = define)
* UNDEFining this directive will not allow you to add RDBs or
* randomstuff entries. If you really want your bot not to say
* anything from randomstuff.ini and keed adding random replies,
* increase the time _TIME and _IDLE defines to, for example,
* 54750, which corresponds to 365 days :)
*/
//#define RANDOM_STUFF
/*
* Time in seconds to randomly say something
* from randomstuff.ini (default = 3600 (1 hour))
*/
//#define RAND_STUFF_TIME 3600
/*
* Time in secs to say something in home chan when no
* one says anything. This overrides the RAND_STUFF_TIME
* counter. (default = 1800 (30 minutes))
*/
//#define RAND_IDLE 1800
/*
* Level at which user's can on-line add new
* randomstuff topics, this also is the level at which
* users will be able to add RDB topics (default = 2)
*/
//#define RAND_LEVEL 2
/*
* This is a new feature which enables the RANDQ
* channel command, which will output a random
* quote from your randomstuff.ini containing the
* specified search string. ( default = ON )
*/
//#define RANDQ ON
/*
* This define backs up your randomstuff file every time
* you add a random quote, in case you would like to do so.
* ( default = #undef )
*/
//#undef BACKUP_RANDOMSTUFF
/* ================ IRC - CHANNEL RELATED ================ */
/* ==== REGISTERED USERS ON JOIN ACTIONS ==== */
/*
* Have the bot do auto-greet (setinfo) to registered users?
* (default = ON)
*/
#define JOIN_GREET ON
/*
* This is the length of time to NOT allow someone to be recounted
* when they rejoin your channels, which tends to clutter up
* everyone's screen with the setinfo. This basically keeps track
* of who joined in the last ___ seconds, and does not do their
* setinfo during that amount of time. (default = 60 (seconds))
*/
#define SLASTCOMM_TIME 60
/*
* Have the bot VOICE users when they join? (default = OFF)
*/
#define VOICE_USERS_ON_JOIN OFF
/*
* Have the bot OP users when they login? (default = OFF)
*/
#define OP_USERS_ON_LOGIN OFF
/* ==== USERS LOOKOUT ==== */
/*
* Want to be alerted when a user who joins is in "questionable"
* other channels? This option only works on networks which their
* IRCD's allows NOTICE to be sent using /notice @#chan
* (default = OFF)
*/
//#define DO_WHOIS OFF
/*
* Max length in seconds to keep a lastseen
* (default = 604800 (7 days))
*/
#define MAX_LASTSEEN 604800
/*
* If you change the above time (MAX_LASTSEEN), be sure to
* update the SEEN_REPLY to the respective time length.
* (Change for what you want between " ")
*/
#define SEEN_REPLY "in the last 7 days."
/* ==== COMPLAINT MESSAGES ==== */
/*
* Message Darkbot will send to the channel where it was kicked
* from. (Change for what you want between " ")
*/
#define COMPLAIN_REASON "grrr, kick me again and I'm going to..."
/*
* will complain in the chan that the Darkbot is deoped in.
* (default = OFF)
*/
#define BITCH_ABOUT_DEOP OFF
/*
* What do you want your Darkbot to say when is not
* oped? (Change for what you want between " ")
*/
#if BITCH_ABOUT_DEOP == 1
#define BITCH_DEOP_REASON "grr, someone op me!"
#endif
/* ==== CHAN OP DIRECTIVES ==== */
/*
* Enable this if you want to make your darkbot bloated with
* stuff like !KICK, !UP, !WACK, etc. Basically anything
* dealing with channel modes and kicking commands. This
* includes PERMBANS. On linux, without this, your darkbot
* bin will shrink considerably. (default = ON)
*/
//#define DO_CHANBOT_CRAP ON
/*
* Autotopic time interval in seconds
* (default = 1800 (30 minutes))
*/
#define AUTOTOPIC_TIME 1800
/* ==== KICKS AND BANS ==== */
/*
* What do you want your Darkbot to say when kicks someone?
* Note when you apply a kick with reason this setting will
* not overwrite it. (Change for what you want between " ")
*/
#define DEFAULT_KICK "Requested!"
/*
* Kick people out when they are banned?
*/
#define KICK_ON_BAN OFF
/* ==== KICKS AND BANS - FLOODS ==== */
/*
* Sometimes morons like to /notice flood channels.
* This define will make the bot kick those people
* when they do a channel notice. (default = ON)
*/
#define KICK_ON_CHANNEL_NOTICE ON
/*
* If you want to take it a step further, you can also
* have the bot ban the user@host too. (default = OFF)
*/
#define BAN_ON_CHANNEL_NOTICE OFF
/*
* Finally, we can ban by *@host. This requires the
* above two to be turned on. (default = OFF)
*/
#define BAN_BY_HOST OFF
/* ==== KICKS AND BANS - DARKBOT'S OWN FLOOD PROTECTION ==== */
/*
* Define this if you want your Darkbot to KICK out the
* people who flood it. NOTE: This means flooding your BOT,
* not your CHANNEL. If you don't define this, it will just
* ignore the user. (default = define)
*/
#define FLOOD_KICK
/*
* What do you want your Darkbot to say when someone is
* flooding it? (Change for what you want between " ")
*/
#define FLOOD_REASON "Don't flood!"
/* ================ MISCELLANEOUS ================ */
/*
* Google search feature (default = ON)
*/
//#define GOOGLE ON
/*
* METAR search feature (default = ON)
*/
//#define METAR ON
/*
* WEATHER search feature (default = ON)
*/
//#define WEATHER ON
/*
* TAF search feature (default = ON)
*/
//#define TAF ON
/*
* Bot's online QUIZ (default = OFF)
*/
//#define QUIZ OFF
/*
* How long to wait before giving the answer? (default = 25)
*/
#define QUIZ_TIMER 25
/*
* Don't allow another quiz until this time has expired (since
* the last answer) (default = 20)
*/
#define QUIZ_REPEAT_TIMER 20
/*
* Do you want your bot to do math commands? (default = define)
*/
//#define DO_MATH_STUFF
/*
* Parse luser data? May cause SIG_SEGV on
* some ircd's (ie; non ircu) Basically all this does
* is display network info like opers, servers, avg #
* of users on the servers, etc.
*/
//#define STATUS OFF
/* ================ AID DIRECTIVES ================ */
/*
* Give user's who join a NOTICE with info on how to use the darkbot?
* I don't bother with this anymore since my bot knows how to respond
* to most general questions users ask. If your bot is new and doesn't
* know much, then you may want to have it tell people how to use it.
*/
#define HELP_GREET OFF
/*
* This define just sends a message to the channel, whenever a "Guest"
* user joins, asking the user if they need any help. This is useful
* for help channels.
*/
#define AUTOHELP_GUESTS OFF
/*
* If you change anything on the next 5 directives be careful not to
* remove or change the position of '%s' nor anything outside quotes.
*/
#define L100(s,a,b,c,d,e,f) S("NOTICE %s :I can be triggered by various \
forms of speech, all which must be addressed to me, in one of the \
following formats: %s %s %s or even %s .... In my database, you can \
find a topic by saying my nick, <topic> . eg; \37%s nuke\37 ..... \
to do a search on a word, or partial text, just type: <mynick>, search \
<text> ... eg; \37%s search nuke\37\n",s,a,b,c,d,e,f)
#define L101(a,b,c,d) S("NOTICE %s :I can also be triggered with even more \
human formats: \37%s who is bill gates?\37 .. You can also phrase it \
in a question: \37%s where is msie?\37 ...For more info \
about me, visit http://www.darkbot.org\n",a,b,c,d)
#define L102(a,b,c,d) S("NOTICE %s :Welcome to %s, %s. Before \
asking your question, type %cHELP for a list of help topics.\n", a,b,c,d)
#define mySetinfo "My !setinfo variables are: ^ nick, % Number of joins, & \
Channel, $ user@host. Example: !setinfo ^ has joined & % times!! (also, if \
you make the first char of your SETINFO a \"+\" the setinfo will be shown \
as an ACTION)"
/*(62)
* Below are variables for the data replys
*/
#define myVariables "data variables are: N~ (Nick), C~ (Chan), T~ \
(Time/date) B~ (Botnick), Q~ (Question asked), R~ (random nick), !~ \
(command char), S~ (current Server), P~ (current port) V~ (botVer), W~ \
(db WWW site), H~ (u@h), t~ (unixtime), BAN (sets a ban), TEMPBAN (bans \
for 60 sec)"
/* *******************************---******************************* */
/* --------------- Don't change anything else below! --------------- */
/* ***************************************************************** */
-#define fr 3 /* these two are the # of lines per secs */
-#define ft 3
-#define AIL 1
-#define WSEC 10
-#define USEC 0
-#define RECHECK 45
-#define DEFAULT_DBTIMERS_PATH "timers"
-#define DEFAULT_LOG_DIR "logs/"
-#define DEFAULT_RDB_DIR "rdb"
-#define DEFAULT_STATS_FILE "stats.db"
-#define DEFAULT_SEEN_FILE "seen.db"
-#define DEFAULT_URL2 "info2.db"
-#define DUNNO_FILE "dunno"
-#define WHUT_FILE "whut"
-#define DEFAULT_BACKUP_DUP "backup_dups.db"
-#define DEFAULT_ADD_DELETES "logs/add_delete.log"
-#define TMP_URL ".info.tmp"
-#define TMP_FILE ".file.tmp"
-#define DEFAULT_AUTOTOPIC_F "autotopic.ini"
-#define DEFAULT_HELPER_LIST "userlist.db"
-#define DEFAULT_QUIZ_FILE "quiz.db"
-#define DEFAULT_PERFORM "perform.ini"
-#define DEFAULT_DEOP "deop.ini"
-#define DEFAULT_RAND_SAY "random.ini"
-#define DEFAULT_RAND_FILE "randomstuff.ini"
-#define DEFAULT_RANDQ_TEMPFILE "randq.tmp"
-#define DEFAULT_RAND_BACKUP_FILE "randomstuff.bak"
-#define DEFAULT_SERVERS "servers.ini"
-#define DEFAULT_PERMBAN "permbans.db"
-#define DEFAULT_SETUP "setup.ini"
-#define MAX_SEARCH_LENGTH 350
-#define ERR_SOCK_OPT -1
-#define ERR_TIMED_OUT -1
-#define ERR_CONN_REFUSED -2
-#define ERR_NOT_ADDR -3
-#define ERR_NO_REACH -4
-#define ERR_CANT_CONNECT -5
-#define ERR_SERVER_BUSY -6
-#define ERR_NO_DATA -7
-#define SUCCESS 0
-
-#define ON 1
-#define OFF 0
-
-#define LEGAL_TEXT "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-"
-#define SAFE_LIST "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
-#define LEGAL_NICK_TEXT "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-\\|[]{}`"
-
-#define NUMBER_LIST "1234567890"
-#define MAX_NICK_LENGTH 35
-
-#ifndef LANG /* If not defined, default to english */
-#define LANG 1
-#endif
-
-#define NORMALR 0
-#define WHUTR 1
-#define DUNNOR 2
-#define RAND_NORMAL 0
-#define RAND_ACTION 1
-#define RAND_RAW 2
+//#include <sys/cdefs.h>
+//#include <sys/param.h>
+//#include <pwd.h>
-/* -------------------------------------------------- */
+/* Here we sort out what to do based on some autoconf detected things. */
#if defined _WIN32 || defined __CYGWIN__ || defined __CYGWIN32__ || defined __MINGW32__
# ifndef WIN32
# define WIN32
# endif
#endif
-#include "langs/lang.h"
-
#define _GNU_SOURCE 1
+#include <ansidecl.h>
#include <ctype.h>
#include <sys/resource.h>
+#include <limits.h>
+#include <stddef.h>
-/* Here we sort out what to do based on some autoconf detected things. */
#if HAVE_ERRNO_H
# include <errno.h>
#endif
#ifndef errno
extern int errno;
#endif
#if HAVE_NETDB_H
# include <netdb.h>
#endif
#if HAVE_NETINET_IN_H
# include <netinet/in.h>
#endif
#if HAVE_ARPA_INET_H
# include <arpa/inet.h>
#endif
#include <assert.h>
#if HAVE_FCNTL_H
# include <fcntl.h>
#endif
#ifdef WIN32
# include <windows.h>
#endif
#include <signal.h>
#include <sys/stat.h>
#include <stdio.h> /* The only one we can guarantee. */
#if HAVE_STDBOOL_H
# include <stdbool.h>
#else
# if ! HAVE__BOOL
# ifdef __cplusplus
typedef bool _Bool;
# else
typedef unsigned char _Bool;
# endif
# endif
# define bool _Bool
# define false 0
# define true 1
# define __bool_true_false_are_defined 1
#endif
#if STDC_HEADERS
# include <string.h>
# include <stdarg.h>
# include <stdlib.h>
#else
# if !HAVE_STRCHR
# define strchr index
# define strrchr rindex
# endif
char *strchr (), *strrchr ();
# if !HAVE_MEMMOVE
# define memcpy(d, s, n) bcopy ((s), (d), (n))
# define memmove(d, s, n) bcopy ((s), (d), (n))
# endif
#endif
#if HAVE_SYS_SOCKET_H
# include <sys/socket.h>
#endif
#if HAVE_UNISTD_H
#include <sys/types.h>
#include <unistd.h>
#endif
#if TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
#else
# if HAVE_SYS_TIME_H
# include <sys/time.h>
# else
# include <time.h>
# endif
#endif
+#include "stat-macros.h"
+#include "minmax.h"
+
#ifndef EXIT_SUCCESS
# define EXIT_SUCCESS 0
# define EXIT_FAILURE 1
#endif
-#include "stat-macros.h"
-#include "minmax.h"
-
+#if !LSTAT_FOLLOWS_SLASHED_SYMLINK
+extern int rpl_lstat (const char *name, struct stat *buf);
+# undef lstat
+# define lstat rpl_lstat
+#endif
#if !HAVE_MEMSET
# define memset rpl_memset
#endif
#if !HAVE_NANOSLEEP
# define nanosleep rpl_nanosleep
#endif
#if !HAVE_SNPRINTF
# define snprintf rpl_snprintf
#endif
#if !HAVE_STRCASECMP
# define strcasecmp rpl_strcasecmp
#endif
#if !HAVE_STRCASESTR
# define strcasestr rpl_strcasestr
#endif
#if !HAVE_STRNDUP
# define strndup rpl_strndup
#endif
#if !HAVE_STRSPN
# define strspn rpl_strspn
#endif
#if !HAVE_STRSTR
# define strstr rpl_strstr
#endif
#if !HAVE_VPRINTF
# define vsprintf rpl_vsprintf
# define vfprintf rpl_vfprintf
#endif
#if !HAVE_LIBCRYPT
# if !HAVE_CRYPT
# define crypt rpl_crypt
# endif
#endif
-#define ERR_CANT_MALLOC -1
-#define ERR_OPEN_SOCKET -2
-#define ERR_WRITE_SOCKET -3
-#define ERR_READ_SOCKET -5
-#define ERR_NO_DOCUMENTS -6
+/* -------------------------------------------------- */
+
+
+#define FR 3 /* these two are the # of lines per secs */
+#define FT 3
+#define AIL 1
+#define WSEC 10
+#define USEC 0
+#define RECHECK 45
+#define DEFAULT_DBTIMERS_PATH "timers"
+#define DEFAULT_LOG_DIR "logs/"
+#define DEFAULT_RDB_DIR "rdb"
+#define DEFAULT_STATS_FILE "stats.db"
+#define DEFAULT_SEEN_FILE "seen.db"
+#define DEFAULT_URL2 "info2.db"
+#define DUNNO_FILE "dunno"
+#define WHUT_FILE "whut"
+#define DEFAULT_BACKUP_DUP "backup_dups.db"
+#define DEFAULT_ADD_DELETES "logs/add_delete.log"
+#define TMP_URL ".info.tmp"
+#define TMP_FILE ".file.tmp"
+#define DEFAULT_AUTOTOPIC_F "autotopic.ini"
+#define DEFAULT_HELPER_LIST "userlist.db"
+#define DEFAULT_QUIZ_FILE "quiz.db"
+#define DEFAULT_PERFORM "perform.ini"
+#define DEFAULT_DEOP "deop.ini"
+#define DEFAULT_RAND_SAY "random.ini"
+#define DEFAULT_RAND_FILE "randomstuff.ini"
+#define DEFAULT_RANDQ_TEMPFILE "randq.tmp"
+#define DEFAULT_RAND_BACKUP_FILE "randomstuff.bak"
+#define DEFAULT_SERVERS "servers.ini"
+#define DEFAULT_PERMBAN "permbans.db"
+#define DEFAULT_SETUP "setup.ini"
+#define MAX_SEARCH_LENGTH 350
+#define ERR_SOCK_OPT -1
+#define ERR_TIMED_OUT -1
+#define ERR_CANT_MALLOC -1
+#define ERR_OPEN_SOCKET -2
+#define ERR_CONN_REFUSED -2
+#define ERR_NOT_ADDR -3
+#define ERR_WRITE_SOCKET -3
+#define ERR_NO_REACH -4
+#define ERR_CANT_CONNECT -5
+#define ERR_READ_SOCKET -5
+#define ERR_SERVER_BUSY -6
+#define ERR_NO_DOCUMENTS -6
+#define ERR_NO_DATA -7
+#define SUCCESS 0
+
+#define LEGAL_TEXT "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-"
+#define SAFE_LIST "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
+#define LEGAL_NICK_TEXT "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-\\|[]{}`"
+
+#define NUMBER_LIST "1234567890"
+#define MAX_NICK_LENGTH 35
+
+#ifndef LANG /* If not defined, default to english */
+#define LANG 1
+#endif
+
+#define NORMALR 0
+#define WHUTR 1
+#define DUNNOR 2
+
+#define RAND_NORMAL 0
+#define RAND_ACTION 1
+#define RAND_RAW 2
#define RANDQ_NORMAL 0
#define RANDQ_CASE 1
-#define RANDQ_RAND 2
+#define RANDQ_RAND 2
-#define RDB_NORMAL 0
-#define RDB_ACTION 1
-#define RDB_RAW 2
+#define RDB_NORMAL 0
+#define RDB_ACTION 1
+#define RDB_RAW 2
/* ////////////////////////////////////////////////////////////////////// */
-#define RESERVED1 "EXPLAIN"
-#define RESERVED2 "DECLARE"
+#define RESERVED1 "EXPLAIN"
+#define RESERVED2 "DECLARE"
+
+#include "langs/lang.h"

File Metadata

Mime Type
text/x-diff
Expires
Mon, Nov 25, 14:26 (1 d, 5 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2260363
Default Alt Text
(99 KB)

Event Timeline