Page Menu
Home
DevCentral
Search
Configure Global Search
Log In
Files
F10814215
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
51 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/beta/source/compat/crypt.c b/beta/source/compat/crypt.c
new file mode 100644
index 0000000..7203148
--- /dev/null
+++ b/beta/source/compat/crypt.c
@@ -0,0 +1,788 @@
+/* vi: set sw=4 ts=4: */
+/*
+ * 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 <crypt.h>
+#include <unistd.h>
+
+//extern char * __md5_crypt( const char *pw, const char *salt) attribute_hidden;
+extern char * __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 __md5_crypt(key, salt);
+// else
+ return __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 *__des_crypt(const char *key, const char *setting) attribute_hidden;
+char *
+__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/configure.ac b/beta/source/configure.ac
index 1f590a8..f7ac955 100644
--- a/beta/source/configure.ac
+++ b/beta/source/configure.ac
@@ -1,81 +1,81 @@
# 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
# 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])
# 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
# 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([memset nanosleep snprintf strcasecmp strcasestr strndup strspn strstr vfprintf vsprintf])
+AC_REPLACE_FUNCS([crypt memset nanosleep snprintf strcasecmp strcasestr strndup strspn strstr vfprintf vsprintf])
# User enabled stuff.
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_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_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])
# 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 00b2acb..6aeee29 100755
--- a/beta/source/defines.h.in
+++ b/beta/source/defines.h.in
@@ -1,933 +1,937 @@
/* @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 :) |
`-----------------------------------------------------------------' */
/* ================ 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 DONNO_Q "*shrug*"
/*
* For those wanting the DONNO_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
/* -------------------------------------------------- */
#if defined _WIN32 || defined __CYGWIN__ || defined __CYGWIN32__ || defined __MINGW32__
# ifndef WIN32
# define WIN32
# endif
#endif
#include "langs/lang.h"
#define _GNU_SOURCE 1
#include <ctype.h>
#include <sys/resource.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
#ifndef EXIT_SUCCESS
# define EXIT_SUCCESS 0
# define EXIT_FAILURE 1
#endif
#include "stat-macros.h"
#include "minmax.h"
#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
-#undef ENABLE_ENCRYPT
+# if !HAVE_CRYPT
+# define crypt rpl_crypt
+# else
+# undef ENABLE_ENCRYPT
+# 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 RANDQ_NORMAL 0
#define RANDQ_CASE 1
#define RANDQ_RAND 2
#define RDB_NORMAL 0
#define RDB_ACTION 1
#define RDB_RAW 2
/* ////////////////////////////////////////////////////////////////////// */
#define RESERVED1 "EXPLAIN"
#define RESERVED2 "DECLARE"
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Tue, Jul 29, 14:29 (11 h, 6 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
2851472
Default Alt Text
(51 KB)
Attached To
Mode
rDARKBOT Darkbot
Attached
Detach File
Event Timeline
Log In to Comment