1
0
mirror of https://github.com/unrealircd/unrealircd.git synced 2026-06-12 17:14:46 +02:00

Import of beta tag, Unreal3.1-Silverheart+

This commit is contained in:
stskeeps
2000-08-20 11:44:00 +00:00
parent 2e969a14c7
commit 23366dfb8b
46 changed files with 8443 additions and 594 deletions
Vendored
+1
View File
@@ -17,6 +17,7 @@
--declaration-indentation5
-T size_t
-T aClass
-T TS
-T aClient
-T aServer
-T anUser
+39
View File
@@ -532,3 +532,42 @@
- Added ^MrMike^'s command list, this one will be updated
- Removed ID_CVS, hopefully fixing some bastard stuff
- Fixed a last minute SJOIN bug
[ last fixes ]
- Re-added res_comp.c and win32.c and res_mkquery.c, which was damaged by
the ID_CVS remove
- Fixed a SHOWCONNECTINFO bug
- Fixed a MODE_STRIPWORDS bug
- Fixed a PART bug
- Fixed a STRIPBADWORDS bug
- Fixed a BotMOTD bug
- Added Dianora's /userhost
- Recoded /links using NS
- Recoded /map a bit using NS, and added usercounts to Server struct
- Some crazy time_t -> TS stuff, will save us some time in 2038
- Fixed the "/mode #blah +Cplkf 1 moo 5:5" ( mode/#blah [+pClkf 1moo 5:5]
problem
- Hopefully fixed the +x problem
- Fixed a bug with mkpasswd on OpenBSD
- Added desynch +e warning, and updated ./update enough ...
- Updated update to work better, and that you can use lynx instead of wget
- Added #undef SHUN_NOTICES, to add notices for users who are shunned
- Fixed bug with U:Lines should be able to privmsg/notice and recieve
badwords :P, does not work in channels
- Removed the old GLINE system, TKL is now standard.
- Added INV_TRACK define, we want people testing this.
- Fixed the -1 usercount bug, found by codemastr, fixed by Stskeeps
- Fixed a +h bug reported by Dukemaster
- Added IRIX support (does it work?)
- Fixed crypter so it actually functions (Makefile now sets mode 700) and
it encrypts X and N lines too.
- Fixed empty mode sends in register_user, reported by Bagge
- Added some portability stuff
- Fixed some empty-line/missing parameter stuff in dccdeny, vhost,
and dynconf, chrestrict
- Made vhost strip too long vhosts
- Removed INV_TRACK
- Fixed a typo in /vhost
- Fixed some problems/typos/notlookingsogood (TM) bugs, in the tkl code
- Fixed ban merging/similar bug in SJOIN
- Made /kick for opers only be possible for netadmin/techadmin
- Fixed /server so it doesnt support SERVER name :info anymore..
+15
View File
@@ -64,6 +64,7 @@ DIR=`pwd`
DEFOPT="-O -g"
DEFCFLAGS="$DEFOPT"
DEFLIBS="none"
MKPASSWDLIBS="-lcrypt"
OSNAME="an unrecgonized operating system"
#
IRCNET=""
@@ -191,6 +192,7 @@ case "$OS" in
*OpenBSD*2*)
DEFCFLAGS="$DEFOPT"
DEFLIBS="none"
MKPASSWDLIBS=""
OSNAME="OpenBSD 2.x"
CRYPT_OPER_PASSWORD=""
CRYPT_LINK_PASSWORD=""
@@ -245,6 +247,11 @@ case "$OS" in
DEFLIBS="-lsocket -lnsl -lresolv"
OSNAME="Solaris 2.x (or SunOS 5.x)"
;;
*IRIX*)
DEFCFLAGS="$DEFOPT -D_USE_BSD"
DEFLIBS="-lbsd"
OSNAME="IRIX"
;;
*Linux*)
cat > $TMP << __EOF__
#include <stdio.h>
@@ -382,6 +389,14 @@ sed -e "s@^XCFLAGS=\(.*\)@XCFLAGS=$XCFLAGS@" Makefile > Makefile.tmp
cp Makefile.tmp Makefile
$RM -f Makefile.tmp
#
# Fix mkpasswd Makefile
#
$RM -f crypt/Makefile.tmp
sed -e "s@^LIBS=\(.*\)@LIBS=$MKPASSWDLIBS@" crypt/Makefile > crypt/Makefile.tmp
cp crypt/Makefile.tmp crypt/Makefile
$RM -f crypt/Makefile.tmp
cat <<__EOF__
If you need to use any extra libraries when compiling the server,
+2 -2
View File
@@ -60,8 +60,8 @@ recap:
The UnrealIRCD server comes tarred and gziped. To uncompress it and expand
it, use the following commands at the Unix prompt:
gzip -d Unreal3.0.tar.gz
tar -xvf Unreal3.0.tar
gzip -d Unreal3.1.tar.gz
tar -xvf Unreal3.1.tar
This will create a new directory called Unreal3.0 and unpack the source
into it.
-1
View File
@@ -49,6 +49,5 @@ gay
dickhead
sonuvabitch
*fuck*
ass
boobs
tits
-1
View File
@@ -49,6 +49,5 @@ gay
dickhead
sonuvabitch
*fuck*
ass
boobs
tits
+4 -2
View File
@@ -23,15 +23,17 @@
#
IRCDCONF = ../ircd.conf
LIBS=-lcrypt
all: mkpasswd
crypt: install
mkpasswd: mkpasswd.c
cc -lcrypt -O mkpasswd.c -o mkpasswd
cc ${LIBS} -O mkpasswd.c -o mkpasswd
install:
crypter ${IRCDCONF}
chmod 700 crypter
./crypter ${IRCDCONF}
@echo 'done.'
clean:
+23 -1
View File
@@ -32,6 +32,8 @@ $tmpfile = "/tmp/ircd.conf.tmp";
#
$ircdconf = @ARGV[0];
$ircdout = "IRCDOUT";
print "crypting ",$ircdconf,"\n";
@saltset = ('a' .. 'z', 'A' .. 'Z', '0' .. '9', '.', '/');
@@ -40,13 +42,33 @@ open ($ircdout, ">/tmp/ircd.conf.tmp") || die "open $!";
while ($text = <>) {
#if its not an "O" line we can ignore it
$text =~ /^o/i || print ($ircdout $text) && next;
if ($text =~ /^o/i) {
chop($text);
@oline = split(':', $text);
$salt = $saltset[rand(time)%64].$saltset[(rand(time)>>6)%64];
$oline[2] = crypt(@oline[2], $salt);
print ($ircdout join(':',@oline)."\n");
}
elsif ($text =~ /^n/i) {
chop($text);
@nline = split(':', $text);
$salt = $saltset[rand(time)%64].$saltset[(rand(time)>>6)%64];
$nline[2] = crypt(@nline[2], $salt);
print ($ircdout join(':',@nline)."\n");
}
elsif ($text =~ /^x/i) {
chop($text);
@xline = split(':', $text);
$salt1 = $saltset[rand(time)%64].$saltset[(rand(time)>>6)%64];
$salt2 = $saltset[rand(time)%64].$saltset[(rand(time)>>6)%64];
$xline[1] = crypt(@xline[1], $salt1);
$xline[2] = crypt(@xline[2], $salt2);
print ($ircdout join(':',@xline)."\n");
}
else {
print $ircdout "$text";
}
}
close ($ircdout);
close ($ircdin);
print "/bin/cp ",$tmpfile," ",$ircdconf,"\n";
+26
View File
@@ -0,0 +1,26 @@
ALN, Alphanumeric System
(C) Stskeeps 2000
ALN is a quick hack to short down usage of bandwidth-using servernames
in prefixes, NICK commands, etc etc. It replaces the name with a
1 or 2 byte prefix in a system, look at src/aln.c for the prefix
types/values. It will be an PROTOCTL, and used in NICK messages and so on,
and introduce a new prefix server<->server called |server. The value of the
server is calculated by a hash value, the scache system, so that the server
can lookup with a new scache function, scache_find_by_hash(int i). The
question of it will conflict in similar-hash server names, is a wonder to me
:P, we will find out, but scache will fail at same time then.
Examples:
& Medb 4 957458466 ~Medb bservice.org D2 0 +iwrx *
:BotService Bot - bservice.org - Owner: terri{J}
where D2 is the hash value of oxygen.phrozen.org (/stats s on a
#define DEVELOP server). irc.flirt.org has hash 96 (ALN code AX) for
instance.
@D2 GLOBOPS :message
will be a message from server with hash D2, found find-by-hash(256)
+48
View File
@@ -0,0 +1,48 @@
From cmunk@draconic.fyremoon.net Wed Apr 5 18:09:55 2000
Date: Wed, 5 Apr 2000 18:07:55 +0100 (BST)
From: "The Nightwalker (Stskeeps)" <cmunk@draconic.fyremoon.net>
To: unreal-dev@lists.sourceforge.net
Subject: [Unreal-dev] P:Lines
Some stuff i got ideas about.. stripping the IP and port from the M:Line
and enforcing the main port to be in a M:line
M:irc.fyremoon.net:*:Forever is gonna start tonight:*
P:ip:flags:password1,password2,password3:port
| | | \- port to bind to
| | |
| | \- Commaseperated lists of accepted passwords
| | * if none
| |
| \--- C = Allow clients
| S = Allow servers
| R = ONLY allow our remote admin connections
| (may only be on a P:line of its own)
| J = Clients that connect here are counted as Java(Confroomhack)
| * = CS
|
\--- IP to bind to, * = INADDR_ANY (all interfaces)
Will make P:Lines more efficent
---------------------------------------------------------------------
Carsten V. Munk - The Nightwalker, known on IRC as Stskeeps or techie
* ICQ: 16465977 - E-Mail: stskeeps@tspre.org
* Author of UnrealIRCd (http://unreal.tspre.org)
* Technical Admin @ irc.roxnet.org, server admin of irc.fyremoon.net
"To understand a program you must become both the machine and the program."
----------------------------------------------------------------------
-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCS/CC d- s: a--- C+++ UL P L++ E-- W++ N+ o-- K- w--- O- M V-- PS+ PE- Y+
PGP t+ 5 X R- tv- b+ DI++ D++ G e-- h! r z**
------END GEEK CODE BLOCK------
_______________________________________________
Unreal-dev mailing list
Unreal-dev@lists.sourceforge.net
http://lists.sourceforge.net/mailman/listinfo/unreal-dev
+98
View File
@@ -0,0 +1,98 @@
# Makefile for regex.
#
# Copyright (C) 1992, 1993 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., 675 Mass Ave, Cambridge, MA 02139, USA.
version = 0.12
# You can define CPPFLAGS on the command line. Aside from system-specific
# flags, you can define:
# -DREGEX_MALLOC to use malloc/realloc/free instead of alloca.
# -DDEBUG to enable the compiled pattern disassembler and execution
# tracing; code runs substantially slower.
# -DEXTRACT_MACROS to use the macros EXTRACT_* (as opposed to
# the corresponding C procedures). If not -DDEBUG, the macros
# are used.
CPPFLAGS =
# Likewise, you can override CFLAGS to optimize, use -Wall, etc.
CFLAGS = -g
# Ditto for LDFLAGS and LOADLIBES.
LDFLAGS =
LOADLIBES =
srcdir = @srcdir@
VPATH = @srcdir@
CC = @CC@
DEFS = @DEFS@
SHELL = /bin/sh
subdirs = moo
default all:: regex.o
.PHONY: default all
regex.o: regex.c regex.h
$(CC) $(CFLAGS) $(CPPFLAGS) $(DEFS) -I. -I$(srcdir) -c $<
clean mostlyclean::
rm -f *.o
distclean:: clean
rm -f Makefile config.status
extraclean:: distclean
rm -f patch* *~* *\#* *.orig *.rej *.bak core a.out
configure: configure.in
autoconf
config.status: configure
sh configure --no-create
Makefile: Makefile.in config.status
sh config.status
makeargs = $(MFLAGS) CPPFLAGS='$(CPPFLAGS)' CFLAGS='$(CFLAGS)' CC='$(CC)' \
DEFS='$(DEFS)' LDFLAGS='$(LDFLAGS)' LOADLIBES='$(LOADLIBES)'
default all install \
mostlyclean clean distclean extraclean realclean \
TAGS check::
for d in $(subdirs); do (cd $$d; $(MAKE) $(makeargs) $@); done
.PHONY: install mostlyclean clean distclean extraclean realclean TAGS check
# Prevent GNU make 3 from overflowing arg limit on system V.
.NOEXPORT:
distfiles = AUTHORS ChangeLog COPYING INSTALL NEWS README \
*.in configure regex.c regex.h
distdir = regex-$(version)
distargs = version=$(version) distdir=../$(distdir)/$$d
dist: TAGS configure
@echo "Version numbers in: Makefile.in, ChangeLog, NEWS,"
@echo " regex.c, regex.h,"
@echo " and doc/xregex.texi (if modified)."
rm -rf $(distdir)
mkdir $(distdir)
ln $(distfiles) $(distdir)
for d in $(subdirs); do (cd $$d; $(MAKE) $(distargs) dist); done
tar czhf $(distdir).tar.Z $(distdir)
rm -rf $(distdir)
.PHONY: dist
+60
View File
@@ -0,0 +1,60 @@
This directory contains the GNU regex library. It is compliant with
POSIX.2, except for internationalization features.
See the file NEWS for a list of major changes in the current release.
See the file INSTALL for compilation instructions. (The only thing
installed is the documentation; regex.c is compiled into regex.o, but
not installed anywhere.)
The subdirectory `doc' contains a (programmers') manual for the library.
It's probably out-of-date. Improvements are welcome.
The subdirectory `test' contains the various tests we've written.
We know this code is not as fast as it might be. If you have specific
suggestions, profiling results, or other such useful information to
report, please do.
Emacs 18 is not going use this revised regex (but Emacs 19 will). If
you want to try it with Emacs 18, apply the patch at the end of this
file first.
Mail bug reports to bug-gnu-utils@prep.ai.mit.edu.
Please include an actual regular expression that fails (and the syntax
used to compile it); without that, there's no way to reproduce the bug,
so there's no way we can fix it. Even if you include a patch, also
include the regular expression in error; otherwise, we can't know for
sure what you're trying to fix.
Here is the patch to make this version of regex work with Emacs 18.
*** ORIG/search.c Tue Jan 8 13:04:55 1991
--- search.c Sun Jan 5 10:57:00 1992
***************
*** 25,26 ****
--- 25,28 ----
#include "commands.h"
+
+ #include <sys/types.h>
#include "regex.h"
***************
*** 477,479 ****
/* really needed. */
! && *(searchbuf.buffer) == (char) exactn /* first item is "exact match" */
&& searchbuf.buffer[1] + 2 == searchbuf.used) /*first is ONLY item */
--- 479,482 ----
/* really needed. */
! /* first item is "exact match" */
! && *(searchbuf.buffer) == (char) RE_EXACTN_VALUE
&& searchbuf.buffer[1] + 2 == searchbuf.used) /*first is ONLY item */
***************
*** 1273,1275 ****
searchbuf.allocated = 100;
! searchbuf.buffer = (char *) malloc (searchbuf.allocated);
searchbuf.fastmap = search_fastmap;
--- 1276,1278 ----
searchbuf.allocated = 100;
! searchbuf.buffer = (unsigned char *) malloc (searchbuf.allocated);
searchbuf.fastmap = search_fastmap;
Vendored Executable
+462
View File
@@ -0,0 +1,462 @@
#!/bin/sh
# Guess values for system-dependent variables and create Makefiles.
# Generated automatically using autoconf.
# Copyright (C) 1991, 1992, 1993 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., 675 Mass Ave, Cambridge, MA 02139, USA.
# Usage: configure [--srcdir=DIR] [--host=HOST] [--gas] [--nfp] [--no-create]
# [--prefix=PREFIX] [--exec-prefix=PREFIX] [--with-PACKAGE] [TARGET]
# Ignores all args except --srcdir, --prefix, --exec-prefix, --no-create, and
# --with-PACKAGE unless this script has special code to handle it.
for arg
do
# Handle --exec-prefix with a space before the argument.
if test x$next_exec_prefix = xyes; then exec_prefix=$arg; next_exec_prefix=
# Handle --host with a space before the argument.
elif test x$next_host = xyes; then next_host=
# Handle --prefix with a space before the argument.
elif test x$next_prefix = xyes; then prefix=$arg; next_prefix=
# Handle --srcdir with a space before the argument.
elif test x$next_srcdir = xyes; then srcdir=$arg; next_srcdir=
else
case $arg in
# For backward compatibility, also recognize exact --exec_prefix.
-exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* | --exec=* | --exe=* | --ex=* | --e=*)
exec_prefix=`echo $arg | sed 's/[-a-z_]*=//'` ;;
-exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- | --exec | --exe | --ex | --e)
next_exec_prefix=yes ;;
-gas | --gas | --ga | --g) ;;
-host=* | --host=* | --hos=* | --ho=* | --h=*) ;;
-host | --host | --hos | --ho | --h)
next_host=yes ;;
-nfp | --nfp | --nf) ;;
-no-create | --no-create | --no-creat | --no-crea | --no-cre | --no-cr | --no-c | --no- | --no)
no_create=1 ;;
-prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
prefix=`echo $arg | sed 's/[-a-z_]*=//'` ;;
-prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
next_prefix=yes ;;
-srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=* | --s=*)
srcdir=`echo $arg | sed 's/[-a-z_]*=//'` ;;
-srcdir | --srcdir | --srcdi | --srcd | --src | --sr | --s)
next_srcdir=yes ;;
-with-* | --with-*)
package=`echo $arg|sed 's/-*with-//'`
# Delete all the valid chars; see if any are left.
if test -n "`echo $package|sed 's/[-a-zA-Z0-9_]*//g'`"; then
echo "configure: $package: invalid package name" >&2; exit 1
fi
eval "with_`echo $package|sed s/-/_/g`=1" ;;
*) ;;
esac
fi
done
trap 'rm -f conftest* core; exit 1' 1 3 15
rm -f conftest*
compile='${CC-cc} $CFLAGS $DEFS conftest.c -o conftest $LIBS >/dev/null 2>&1'
# A filename unique to this package, relative to the directory that
# configure is in, which we can look for to find out if srcdir is correct.
unique_file=regex.c
# Find the source files, if location was not specified.
if test -z "$srcdir"; then
srcdirdefaulted=yes
# Try the directory containing this script, then `..'.
prog=$0
confdir=`echo $prog|sed 's%/[^/][^/]*$%%'`
test "X$confdir" = "X$prog" && confdir=.
srcdir=$confdir
if test ! -r $srcdir/$unique_file; then
srcdir=..
fi
fi
if test ! -r $srcdir/$unique_file; then
if test x$srcdirdefaulted = xyes; then
echo "configure: Can not find sources in \`${confdir}' or \`..'." 1>&2
else
echo "configure: Can not find sources in \`${srcdir}'." 1>&2
fi
exit 1
fi
# Preserve a srcdir of `.' to avoid automounter screwups with pwd.
# But we can't avoid them for `..', to make subdirectories work.
case $srcdir in
.|/*|~*) ;;
*) srcdir=`cd $srcdir; pwd` ;; # Make relative path absolute.
esac
if test -z "$CC"; then
echo checking for gcc
saveifs="$IFS"; IFS="${IFS}:"
for dir in $PATH; do
test -z "$dir" && dir=.
if test -f $dir/gcc; then
CC="gcc"
break
fi
done
IFS="$saveifs"
fi
test -z "$CC" && CC="cc"
# Find out if we are using GNU C, under whatever name.
cat > conftest.c <<EOF
#ifdef __GNUC__
yes
#endif
EOF
${CC-cc} -E conftest.c > conftest.out 2>&1
if egrep yes conftest.out >/dev/null 2>&1; then
GCC=1 # For later tests.
fi
rm -f conftest*
# Make sure to not get the incompatible SysV /etc/install and
# /usr/sbin/install, which might be in PATH before a BSD-like install,
# or the SunOS /usr/etc/install directory, or the AIX /bin/install,
# or the AFS install, which mishandles nonexistent args. (Sigh.)
if test -z "$INSTALL"; then
echo checking for install
saveifs="$IFS"; IFS="${IFS}:"
for dir in $PATH; do
test -z "$dir" && dir=.
case $dir in
/etc|/usr/sbin|/usr/etc|/usr/afsws/bin) ;;
*)
if test -f $dir/install; then
if grep dspmsg $dir/install >/dev/null 2>&1; then
: # AIX
else
INSTALL="$dir/install -c"
INSTALL_PROGRAM='$(INSTALL)'
INSTALL_DATA='$(INSTALL) -m 644'
break
fi
fi
;;
esac
done
IFS="$saveifs"
fi
INSTALL=${INSTALL-cp}
INSTALL_PROGRAM=${INSTALL_PROGRAM-'$(INSTALL)'}
INSTALL_DATA=${INSTALL_DATA-'$(INSTALL)'}
echo checking for AIX
echo checking how to run the C preprocessor
if test -z "$CPP"; then
CPP='${CC-cc} -E'
cat > conftest.c <<EOF
#include <stdio.h>
EOF
err=`eval "$CPP $DEFS conftest.c 2>&1 >/dev/null"`
if test -z "$err"; then
:
else
CPP=/lib/cpp
fi
rm -f conftest*
fi
cat > conftest.c <<EOF
#ifdef _AIX
yes
#endif
EOF
eval "$CPP $DEFS conftest.c > conftest.out 2>&1"
if egrep "yes" conftest.out >/dev/null 2>&1; then
DEFS="$DEFS -D_ALL_SOURCE=1"
fi
rm -f conftest*
echo checking for DYNIX/ptx libseq
cat > conftest.c <<EOF
#if defined(_SEQUENT_)
yes
#endif
EOF
eval "$CPP $DEFS conftest.c > conftest.out 2>&1"
if egrep "yes" conftest.out >/dev/null 2>&1; then
SEQUENT=1
fi
rm -f conftest*
test -n "$SEQUENT" && test -f /usr/lib/libseq.a &&
LIBS="$LIBS -lseq"
echo checking for POSIXized ISC
if test -d /etc/conf/kconfig.d &&
grep _POSIX_VERSION /usr/include/sys/unistd.h >/dev/null 2>&1
then
ISC=1 # If later tests want to check for ISC.
DEFS="$DEFS -D_POSIX_SOURCE=1"
if test -n "$GCC"; then
CC="$CC -posix"
else
CC="$CC -Xp"
fi
fi
echo checking for minix/config.h
cat > conftest.c <<EOF
#include <minix/config.h>
EOF
err=`eval "$CPP $DEFS conftest.c 2>&1 >/dev/null"`
if test -z "$err"; then
MINIX=1
fi
rm -f conftest*
# The Minix shell can't assign to the same variable on the same line!
if test -n "$MINIX"; then
DEFS="$DEFS -D_POSIX_SOURCE=1"
DEFS="$DEFS -D_POSIX_1_SOURCE=2"
DEFS="$DEFS -D_MINIX=1"
fi
echo checking for ANSI C header files
cat > conftest.c <<EOF
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
#include <float.h>
EOF
err=`eval "$CPP $DEFS conftest.c 2>&1 >/dev/null"`
if test -z "$err"; then
# SunOS string.h does not declare mem*, contrary to ANSI.
echo '#include <string.h>' > conftest.c
eval "$CPP $DEFS conftest.c > conftest.out 2>&1"
if egrep "memchr" conftest.out >/dev/null 2>&1; then
# SGI's /bin/cc from Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
cat > conftest.c <<EOF
#include <ctype.h>
#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
#define XOR(e,f) (((e) && !(f)) || (!(e) && (f)))
int main () { int i; for (i = 0; i < 256; i++)
if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
exit (0); }
EOF
eval $compile
if test -s conftest && (./conftest; exit) 2>/dev/null; then
DEFS="$DEFS -DSTDC_HEADERS=1"
fi
rm -f conftest*
fi
rm -f conftest*
fi
rm -f conftest*
for hdr in string.h
do
trhdr=HAVE_`echo $hdr | tr '[a-z]./' '[A-Z]__'`
echo checking for ${hdr}
cat > conftest.c <<EOF
#include <${hdr}>
EOF
err=`eval "$CPP $DEFS conftest.c 2>&1 >/dev/null"`
if test -z "$err"; then
DEFS="$DEFS -D${trhdr}=1"
fi
rm -f conftest*
done
# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works
# for constant arguments. Useless!
echo checking for working alloca.h
cat > conftest.c <<EOF
#include <alloca.h>
main() { exit(0); }
t() { char *p = alloca(2 * sizeof(int)); }
EOF
if eval $compile; then
DEFS="$DEFS -DHAVE_ALLOCA_H=1"
fi
rm -f conftest*
decl="#ifdef __GNUC__
#define alloca __builtin_alloca
#else
#if HAVE_ALLOCA_H
#include <alloca.h>
#else
#ifdef _AIX
#pragma alloca
#else
char *alloca ();
#endif
#endif
#endif
"
echo checking for alloca
cat > conftest.c <<EOF
$decl
main() { exit(0); }
t() { char *p = (char *) alloca(1); }
EOF
if eval $compile; then
:
else
alloca_missing=1
fi
rm -f conftest*
if test -n "$alloca_missing"; then
# The SVR3 libPW and SVR4 libucb both contain incompatible functions
# that cause trouble. Some versions do not even contain alloca or
# contain a buggy version. If you still want to use their alloca,
# use ar to extract alloca.o from them instead of compiling alloca.c.
ALLOCA=alloca.o
fi
prog='/* Ultrix mips cc rejects this. */
typedef int charset[2]; const charset x;
/* SunOS 4.1.1 cc rejects this. */
char const *const *p;
char **p2;
/* HPUX 7.0 cc rejects these. */
++p;
p2 = (char const* const*) p;'
echo checking for working const
cat > conftest.c <<EOF
main() { exit(0); }
t() { $prog }
EOF
if eval $compile; then
:
else
DEFS="$DEFS -Dconst="
fi
rm -f conftest*
if test -z "$prefix"
then
echo checking for gcc to derive installation directory prefix
saveifs="$IFS"; IFS="$IFS:"
for dir in $PATH; do
test -z "$dir" && dir=.
if test $dir != . && test -f $dir/gcc; then
# Not all systems have dirname.
prefix=`echo $dir|sed 's%/[^/][^/]*$%%'`
break
fi
done
IFS="$saveifs"
fi
if test -n "$prefix"; then
test -z "$exec_prefix" && exec_prefix='${prefix}'
prsub="s%^prefix\\([ ]*\\)=\\([ ]*\\).*$%prefix\\1=\\2$prefix%"
fi
if test -n "$exec_prefix"; then
prsub="$prsub
s%^exec_prefix\\([ ]*\\)=\\([ ]*\\).*$%\
exec_prefix\\1=\\2$exec_prefix%"
fi
trap 'rm -f config.status; exit 1' 1 3 15
echo creating config.status
rm -f config.status
cat > config.status <<EOF
#!/bin/sh
# Generated automatically by configure.
# Run this file to recreate the current configuration.
# This directory was configured as follows,
# on host `(hostname || uname -n) 2>/dev/null`:
#
# $0 $*
for arg
do
case "\$arg" in
-recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
exec /bin/sh $0 $* ;;
*) echo "Usage: config.status --recheck" 2>&1; exit 1 ;;
esac
done
trap 'rm -f Makefile; exit 1' 1 3 15
CC='$CC'
INSTALL='$INSTALL'
INSTALL_PROGRAM='$INSTALL_PROGRAM'
INSTALL_DATA='$INSTALL_DATA'
CPP='$CPP'
ALLOCA='$ALLOCA'
LIBS='$LIBS'
srcdir='$srcdir'
DEFS='$DEFS'
prefix='$prefix'
exec_prefix='$exec_prefix'
prsub='$prsub'
EOF
cat >> config.status <<\EOF
top_srcdir=$srcdir
for file in .. Makefile; do if [ "x$file" != "x.." ]; then
srcdir=$top_srcdir
# Remove last slash and all that follows it. Not all systems have dirname.
dir=`echo $file|sed 's%/[^/][^/]*$%%'`
if test "$dir" != "$file"; then
test "$top_srcdir" != . && srcdir=$top_srcdir/$dir
test ! -d $dir && mkdir $dir
fi
echo creating $file
rm -f $file
echo "# Generated automatically from `echo $file|sed 's|.*/||'`.in by configure." > $file
sed -e "
$prsub
s%@CC@%$CC%g
s%@INSTALL@%$INSTALL%g
s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
s%@INSTALL_DATA@%$INSTALL_DATA%g
s%@CPP@%$CPP%g
s%@ALLOCA@%$ALLOCA%g
s%@LIBS@%$LIBS%g
s%@srcdir@%$srcdir%g
s%@DEFS@%$DEFS%
" $top_srcdir/${file}.in >> $file
fi; done
exit 0
EOF
chmod +x config.status
test -n "$no_create" || ./config.status
+23
View File
@@ -0,0 +1,23 @@
dnl Process this file with autoconf to produce a configure script.
AC_INIT(regex.c)
AC_PROG_CC
AC_PROG_INSTALL
dnl I'm not sure if AC_AIX and AC_DYNIX_SEQ are really necessary. The
dnl Autoconf documentation isn't specific about which BSD functions they
dnl provide.
AC_AIX
AC_DYNIX_SEQ
AC_ISC_POSIX
AC_MINIX
AC_STDC_HEADERS
AC_HAVE_HEADERS(string.h)
AC_ALLOCA
AC_CONST
AC_PREFIX(gcc)
AC_OUTPUT(Makefile doc/Makefile test/Makefile)
+4
View File
@@ -0,0 +1,4 @@
clean:
default:
all:
echo "."
+4948
View File
File diff suppressed because it is too large Load Diff
+490
View File
@@ -0,0 +1,490 @@
/* Definitions for data structures and routines for the regular
expression library, version 0.12.
Copyright (C) 1985, 1989, 1990, 1991, 1992, 1993 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., 675 Mass Ave, Cambridge, MA 02139, USA. */
#ifndef __REGEXP_LIBRARY_H__
#define __REGEXP_LIBRARY_H__
/* POSIX says that <sys/types.h> must be included (by the caller) before
<regex.h>. */
#ifdef VMS
/* VMS doesn't have `size_t' in <sys/types.h>, even though POSIX says it
should be there. */
#include <stddef.h>
#endif
/* The following bits are used to determine the regexp syntax we
recognize. The set/not-set meanings are chosen so that Emacs syntax
remains the value 0. The bits are given in alphabetical order, and
the definitions shifted by one from the previous bit; thus, when we
add or remove a bit, only one other definition need change. */
typedef unsigned reg_syntax_t;
/* If this bit is not set, then \ inside a bracket expression is literal.
If set, then such a \ quotes the following character. */
#define RE_BACKSLASH_ESCAPE_IN_LISTS (1)
/* If this bit is not set, then + and ? are operators, and \+ and \? are
literals.
If set, then \+ and \? are operators and + and ? are literals. */
#define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1)
/* If this bit is set, then character classes are supported. They are:
[:alpha:], [:upper:], [:lower:], [:digit:], [:alnum:], [:xdigit:],
[:space:], [:print:], [:punct:], [:graph:], and [:cntrl:].
If not set, then character classes are not supported. */
#define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1)
/* If this bit is set, then ^ and $ are always anchors (outside bracket
expressions, of course).
If this bit is not set, then it depends:
^ is an anchor if it is at the beginning of a regular
expression or after an open-group or an alternation operator;
$ is an anchor if it is at the end of a regular expression, or
before a close-group or an alternation operator.
This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because
POSIX draft 11.2 says that * etc. in leading positions is undefined.
We already implemented a previous draft which made those constructs
invalid, though, so we haven't changed the code back. */
#define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1)
/* If this bit is set, then special characters are always special
regardless of where they are in the pattern.
If this bit is not set, then special characters are special only in
some contexts; otherwise they are ordinary. Specifically,
* + ? and intervals are only special when not after the beginning,
open-group, or alternation operator. */
#define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1)
/* If this bit is set, then *, +, ?, and { cannot be first in an re or
immediately after an alternation or begin-group operator. */
#define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1)
/* If this bit is set, then . matches newline.
If not set, then it doesn't. */
#define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1)
/* If this bit is set, then . doesn't match NUL.
If not set, then it does. */
#define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1)
/* If this bit is set, nonmatching lists [^...] do not match newline.
If not set, they do. */
#define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1)
/* If this bit is set, either \{...\} or {...} defines an
interval, depending on RE_NO_BK_BRACES.
If not set, \{, \}, {, and } are literals. */
#define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1)
/* If this bit is set, +, ? and | aren't recognized as operators.
If not set, they are. */
#define RE_LIMITED_OPS (RE_INTERVALS << 1)
/* If this bit is set, newline is an alternation operator.
If not set, newline is literal. */
#define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1)
/* If this bit is set, then `{...}' defines an interval, and \{ and \}
are literals.
If not set, then `\{...\}' defines an interval. */
#define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1)
/* If this bit is set, (...) defines a group, and \( and \) are literals.
If not set, \(...\) defines a group, and ( and ) are literals. */
#define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1)
/* If this bit is set, then \<digit> matches <digit>.
If not set, then \<digit> is a back-reference. */
#define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1)
/* If this bit is set, then | is an alternation operator, and \| is literal.
If not set, then \| is an alternation operator, and | is literal. */
#define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1)
/* If this bit is set, then an ending range point collating higher
than the starting range point, as in [z-a], is invalid.
If not set, then when ending range point collates higher than the
starting range point, the range is ignored. */
#define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1)
/* If this bit is set, then an unmatched ) is ordinary.
If not set, then an unmatched ) is invalid. */
#define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1)
/* This global variable defines the particular regexp syntax to use (for
some interfaces). When a regexp is compiled, the syntax used is
stored in the pattern buffer, so changing this does not affect
already-compiled regexps. */
extern reg_syntax_t re_syntax_options;
/* Define combinations of the above bits for the standard possibilities.
(The [[[ comments delimit what gets put into the Texinfo file, so
don't delete them!) */
/* [[[begin syntaxes]]] */
#define RE_SYNTAX_EMACS 0
#define RE_SYNTAX_AWK \
(RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DOT_NOT_NULL \
| RE_NO_BK_PARENS | RE_NO_BK_REFS \
| RE_NO_BK_VBAR | RE_NO_EMPTY_RANGES \
| RE_UNMATCHED_RIGHT_PAREN_ORD)
#define RE_SYNTAX_POSIX_AWK \
(RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS)
#define RE_SYNTAX_GREP \
(RE_BK_PLUS_QM | RE_CHAR_CLASSES \
| RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS \
| RE_NEWLINE_ALT)
#define RE_SYNTAX_EGREP \
(RE_CHAR_CLASSES | RE_CONTEXT_INDEP_ANCHORS \
| RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE \
| RE_NEWLINE_ALT | RE_NO_BK_PARENS \
| RE_NO_BK_VBAR)
#define RE_SYNTAX_POSIX_EGREP \
(RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES)
/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff. */
#define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC
#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC
/* Syntax bits common to both basic and extended POSIX regex syntax. */
#define _RE_SYNTAX_POSIX_COMMON \
(RE_CHAR_CLASSES | RE_DOT_NEWLINE | RE_DOT_NOT_NULL \
| RE_INTERVALS | RE_NO_EMPTY_RANGES)
#define RE_SYNTAX_POSIX_BASIC \
(_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM)
/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes
RE_LIMITED_OPS, i.e., \? \+ \| are not recognized. Actually, this
isn't minimal, since other operators, such as \`, aren't disabled. */
#define RE_SYNTAX_POSIX_MINIMAL_BASIC \
(_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS)
#define RE_SYNTAX_POSIX_EXTENDED \
(_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \
| RE_CONTEXT_INDEP_OPS | RE_NO_BK_BRACES \
| RE_NO_BK_PARENS | RE_NO_BK_VBAR \
| RE_UNMATCHED_RIGHT_PAREN_ORD)
/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INVALID_OPS
replaces RE_CONTEXT_INDEP_OPS and RE_NO_BK_REFS is added. */
#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED \
(_RE_SYNTAX_POSIX_COMMON | RE_CONTEXT_INDEP_ANCHORS \
| RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES \
| RE_NO_BK_PARENS | RE_NO_BK_REFS \
| RE_NO_BK_VBAR | RE_UNMATCHED_RIGHT_PAREN_ORD)
/* [[[end syntaxes]]] */
/* Maximum number of duplicates an interval can allow. Some systems
(erroneously) define this in other header files, but we want our
value, so remove any previous define. */
#ifdef RE_DUP_MAX
#undef RE_DUP_MAX
#endif
#define RE_DUP_MAX ((1 << 15) - 1)
/* POSIX `cflags' bits (i.e., information for `regcomp'). */
/* If this bit is set, then use extended regular expression syntax.
If not set, then use basic regular expression syntax. */
#define REG_EXTENDED 1
/* If this bit is set, then ignore case when matching.
If not set, then case is significant. */
#define REG_ICASE (REG_EXTENDED << 1)
/* If this bit is set, then anchors do not match at newline
characters in the string.
If not set, then anchors do match at newlines. */
#define REG_NEWLINE (REG_ICASE << 1)
/* If this bit is set, then report only success or fail in regexec.
If not set, then returns differ between not matching and errors. */
#define REG_NOSUB (REG_NEWLINE << 1)
/* POSIX `eflags' bits (i.e., information for regexec). */
/* If this bit is set, then the beginning-of-line operator doesn't match
the beginning of the string (presumably because it's not the
beginning of a line).
If not set, then the beginning-of-line operator does match the
beginning of the string. */
#define REG_NOTBOL 1
/* Like REG_NOTBOL, except for the end-of-line. */
#define REG_NOTEOL (1 << 1)
/* If any error codes are removed, changed, or added, update the
`re_error_msg' table in regex.c. */
typedef enum
{
REG_NOERROR = 0, /* Success. */
REG_NOMATCH, /* Didn't find a match (for regexec). */
/* POSIX regcomp return error codes. (In the order listed in the
standard.) */
REG_BADPAT, /* Invalid pattern. */
REG_ECOLLATE, /* Not implemented. */
REG_ECTYPE, /* Invalid character class name. */
REG_EESCAPE, /* Trailing backslash. */
REG_ESUBREG, /* Invalid back reference. */
REG_EBRACK, /* Unmatched left bracket. */
REG_EPAREN, /* Parenthesis imbalance. */
REG_EBRACE, /* Unmatched \{. */
REG_BADBR, /* Invalid contents of \{\}. */
REG_ERANGE, /* Invalid range end. */
REG_ESPACE, /* Ran out of memory. */
REG_BADRPT, /* No preceding re for repetition op. */
/* Error codes we've added. */
REG_EEND, /* Premature end. */
REG_ESIZE, /* Compiled pattern bigger than 2^16 bytes. */
REG_ERPAREN /* Unmatched ) or \); not returned from regcomp. */
} reg_errcode_t;
/* This data structure represents a compiled pattern. Before calling
the pattern compiler, the fields `buffer', `allocated', `fastmap',
`translate', and `no_sub' can be set. After the pattern has been
compiled, the `re_nsub' field is available. All other fields are
private to the regex routines. */
struct re_pattern_buffer
{
/* [[[begin pattern_buffer]]] */
/* Space that holds the compiled pattern. It is declared as
`unsigned char *' because its elements are
sometimes used as array indexes. */
unsigned char *buffer;
/* Number of bytes to which `buffer' points. */
unsigned long allocated;
/* Number of bytes actually used in `buffer'. */
unsigned long used;
/* Syntax setting with which the pattern was compiled. */
reg_syntax_t syntax;
/* Pointer to a fastmap, if any, otherwise zero. re_search uses
the fastmap, if there is one, to skip over impossible
starting points for matches. */
char *fastmap;
/* Either a translate table to apply to all characters before
comparing them, or zero for no translation. The translation
is applied to a pattern when it is compiled and to a string
when it is matched. */
char *translate;
/* Number of subexpressions found by the compiler. */
size_t re_nsub;
/* Zero if this pattern cannot match the empty string, one else.
Well, in truth it's used only in `re_search_2', to see
whether or not we should use the fastmap, so we don't set
this absolutely perfectly; see `re_compile_fastmap' (the
`duplicate' case). */
unsigned can_be_null : 1;
/* If REGS_UNALLOCATED, allocate space in the `regs' structure
for `max (RE_NREGS, re_nsub + 1)' groups.
If REGS_REALLOCATE, reallocate space if necessary.
If REGS_FIXED, use what's there. */
#define REGS_UNALLOCATED 0
#define REGS_REALLOCATE 1
#define REGS_FIXED 2
unsigned regs_allocated : 2;
/* Set to zero when `regex_compile' compiles a pattern; set to one
by `re_compile_fastmap' if it updates the fastmap. */
unsigned fastmap_accurate : 1;
/* If set, `re_match_2' does not return information about
subexpressions. */
unsigned no_sub : 1;
/* If set, a beginning-of-line anchor doesn't match at the
beginning of the string. */
unsigned not_bol : 1;
/* Similarly for an end-of-line anchor. */
unsigned not_eol : 1;
/* If true, an anchor at a newline matches. */
unsigned newline_anchor : 1;
/* [[[end pattern_buffer]]] */
};
typedef struct re_pattern_buffer regex_t;
/* search.c (search_buffer) in Emacs needs this one opcode value. It is
defined both in `regex.c' and here. */
#define RE_EXACTN_VALUE 1
/* Type for byte offsets within the string. POSIX mandates this. */
typedef int regoff_t;
/* This is the structure we store register match data in. See
regex.texinfo for a full description of what registers match. */
struct re_registers
{
unsigned num_regs;
regoff_t *start;
regoff_t *end;
};
/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer,
`re_match_2' returns information about at least this many registers
the first time a `regs' structure is passed. */
#ifndef RE_NREGS
#define RE_NREGS 30
#endif
/* POSIX specification for registers. Aside from the different names than
`re_registers', POSIX uses an array of structures, instead of a
structure of arrays. */
typedef struct
{
regoff_t rm_so; /* Byte offset from string's start to substring's start. */
regoff_t rm_eo; /* Byte offset from string's start to substring's end. */
} regmatch_t;
/* Declarations for routines. */
/* To avoid duplicating every routine declaration -- once with a
prototype (if we are ANSI), and once without (if we aren't) -- we
use the following macro to declare argument types. This
unfortunately clutters up the declarations a bit, but I think it's
worth it. */
#if __STDC__
#define _RE_ARGS(args) args
#else /* not __STDC__ */
#define _RE_ARGS(args) ()
#endif /* not __STDC__ */
/* Sets the current default syntax to SYNTAX, and return the old syntax.
You can also simply assign to the `re_syntax_options' variable. */
extern reg_syntax_t re_set_syntax _RE_ARGS ((reg_syntax_t syntax));
/* Compile the regular expression PATTERN, with length LENGTH
and syntax given by the global `re_syntax_options', into the buffer
BUFFER. Return NULL if successful, and an error string if not. */
extern const char *re_compile_pattern
_RE_ARGS ((const char *pattern, int length,
struct re_pattern_buffer *buffer));
/* Compile a fastmap for the compiled pattern in BUFFER; used to
accelerate searches. Return 0 if successful and -2 if was an
internal error. */
extern int re_compile_fastmap _RE_ARGS ((struct re_pattern_buffer *buffer));
/* Search in the string STRING (with length LENGTH) for the pattern
compiled into BUFFER. Start searching at position START, for RANGE
characters. Return the starting position of the match, -1 for no
match, or -2 for an internal error. Also return register
information in REGS (if REGS and BUFFER->no_sub are nonzero). */
extern int re_search
_RE_ARGS ((struct re_pattern_buffer *buffer, const char *string,
int length, int start, int range, struct re_registers *regs));
/* Like `re_search', but search in the concatenation of STRING1 and
STRING2. Also, stop searching at index START + STOP. */
extern int re_search_2
_RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1,
int length1, const char *string2, int length2,
int start, int range, struct re_registers *regs, int stop));
/* Like `re_search', but return how many characters in STRING the regexp
in BUFFER matched, starting at position START. */
extern int re_match
_RE_ARGS ((struct re_pattern_buffer *buffer, const char *string,
int length, int start, struct re_registers *regs));
/* Relates to `re_match' as `re_search_2' relates to `re_search'. */
extern int re_match_2
_RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1,
int length1, const char *string2, int length2,
int start, struct re_registers *regs, int stop));
/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
ENDS. Subsequent matches using BUFFER and REGS will use this memory
for recording register information. STARTS and ENDS must be
allocated with malloc, and must each be at least `NUM_REGS * sizeof
(regoff_t)' bytes long.
If NUM_REGS == 0, then subsequent matches should allocate their own
register data.
Unless this function is called, the first search or match using
PATTERN_BUFFER will allocate its own register data, without
freeing the old data. */
extern void re_set_registers
_RE_ARGS ((struct re_pattern_buffer *buffer, struct re_registers *regs,
unsigned num_regs, regoff_t *starts, regoff_t *ends));
/* 4.2 bsd compatibility. */
extern char *re_comp _RE_ARGS ((const char *));
extern int re_exec _RE_ARGS ((const char *));
/* POSIX compatibility. */
extern int regcomp _RE_ARGS ((regex_t *preg, const char *pattern, int cflags));
extern int regexec
_RE_ARGS ((const regex_t *preg, const char *string, size_t nmatch,
regmatch_t pmatch[], int eflags));
extern size_t regerror
_RE_ARGS ((int errcode, const regex_t *preg, char *errbuf,
size_t errbuf_size));
extern void regfree _RE_ARGS ((regex_t *preg));
#endif /* not __REGEXP_LIBRARY_H__ */
/*
Local variables:
make-backup-files: t
version-control: t
trim-versions-without-asking: nil
End:
*/
+32 -4
View File
@@ -56,6 +56,8 @@
#define BMAGIC 0x4675636B596F754661736369737473
#define BASE_VERSION "Unreal"
#ifndef NULL
#define NULL 0
#endif
@@ -85,6 +87,8 @@ void free();
#endif
#define TS time_t
extern int match PROTO((char *, char *));
#define mycmp(a,b) \
( (toupper((a)[0])!=toupper((b)[0])) || smycmp((a)+1,(b)+1) )
@@ -115,7 +119,7 @@ extern int inet_netof PROTO((struct IN_ADDR));
#endif
int global_count, max_global_count;
extern char *myctime PROTO((time_t));
extern char *myctime PROTO((TS));
extern char *strtoken PROTO((char **, char *, char *));
#define PRECISE_CHECK
@@ -225,7 +229,7 @@ extern struct SLink *find_user_link( /* struct SLink *, struct Client * */ );
" CHANTYPES=%s" \
" PREFIX=%s" \
" :are supported by this server"
#define PROTOCTL_PARAMETERS MAXWATCH, \
MAXSILES, \
MAXMODEPARAMS, \
@@ -235,7 +239,7 @@ extern struct SLink *find_user_link( /* struct SLink *, struct Client * */ );
TOPICLEN, \
TOPICLEN, \
"#", \
"(ohv)@%+"
"(ohv)@%+"
/* Server-Server PROTOCTL -Stskeeps */
#define PROTOCTL_SERVER "NOQUIT TOKEN NICKv2 SJOIN SJOIN2 UMODE2 VL SJ3 NS" ZIPSTUFF
@@ -257,6 +261,30 @@ extern int lu_noninv, lu_inv, lu_serv, lu_oper,
lu_unknown, lu_channel, lu_lu, lu_lulocal, lu_lserv,
lu_clu, lu_mlu, lu_cglobalu, lu_mglobalu;
time_t now;
TS now;
#if defined(__STDC__)
#define __const const
#define __signed signed
#define __volatile volatile
#ifndef __GNUC__
#define __inline
#endif
#else
#ifndef __GNUC__
#define __const
#define __inline
#define __signed
#define __volatile
#ifndef NO_ANSI_KEYWORDS
#define const /* delete ANSI C keywords */
#define inline
#define signed
#define volatile
#endif
#endif
#endif
#endif /* __common_include__ */
+4
View File
@@ -93,6 +93,10 @@
*/
#define ADMINCHAT 1
/*
If you want SHUN_NOTICES, define this
*/
#undef SHUN_NOTICES
/*
Remote rehash
+8 -8
View File
@@ -34,14 +34,14 @@ extern char *getreply(int);
#define rpl_str(x) getreply(x)
#define err_str(x) getreply(x)
extern time_t nextconnect, nextdnscheck, nextping;
extern TS nextconnect, nextdnscheck, nextping;
extern aClient *client, me, *local[];
extern aChannel *channel;
extern struct stats *ircstp;
extern int bootopt;
extern time_t TSoffset;
extern TS TSoffset;
/* Prototype added to force errors -- Barubary */
extern time_t check_pings(time_t now, int check_kills);
extern TS check_pings(TS now, int check_kills);
/* Remmed out for win32 compatibility.. as stated of 467leaf win32 port.. */
@@ -171,9 +171,9 @@ extern int inetport PROTO((aClient *, char *, int));
extern void init_sys PROTO(());
#ifdef NO_FDLIST
extern int read_message PROTO((time_t));
extern int read_message PROTO((TS));
#else
extern int read_message PROTO((time_t, fdlist *));
extern int read_message PROTO((TS, fdlist *));
#endif
extern void report_error PROTO((char *, aClient *));
@@ -254,7 +254,7 @@ extern int check_registered_user PROTO((aClient *));
extern char *get_client_name PROTO((aClient *, int));
extern char *get_client_host PROTO((aClient *));
extern char *my_name_for_link PROTO((char *, aConfItem *));
extern char *myctime PROTO((time_t)), *date PROTO((time_t));
extern char *myctime PROTO((TS)), *date PROTO((TS));
extern int exit_client PROTO((aClient *, aClient *, aClient *, char *));
extern void initstats PROTO(()), tstats PROTO((aClient *, char *));
extern char *check_string PROTO((char *));
@@ -308,8 +308,8 @@ extern struct hostent *gethost_byaddr PROTO((char *, Link *));
extern struct hostent *gethost_byname PROTO((char *, Link *));
extern void flush_cache PROTO(());
extern int init_resolver PROTO((int));
extern time_t timeout_query_list PROTO((time_t));
extern time_t expire_cache PROTO((time_t));
extern TS timeout_query_list PROTO((TS));
extern TS expire_cache PROTO((TS));
extern void del_queries PROTO((char *));
extern void clear_channel_hash_table PROTO(());
+4
View File
@@ -362,6 +362,10 @@ extern int m_chgname(), m_shun(), m_post();
#ifdef CRYPTOIRCD
extern int m_crypto();
#endif
#ifdef GUEST
extern int m_guest();
#endif
#ifdef MSGTAB
struct Message *msgmap[256];
+3
View File
@@ -23,6 +23,9 @@
* $Id$
*
* $Log$
* Revision 1.1.1.1.6.6 2000/08/20 11:40:42 stskeeps
* Upgrade to Unreal3.1-Silverheart+
*
* Revision 1.1.1.1.6.1.2.1 2000/07/14 20:22:57 stskeeps
* +- Indentation and more SJ3 fixes
*
+30 -29
View File
@@ -593,7 +593,7 @@ typedef struct Whowas {
char *realname;
char *away;
long umodes;
time_t logoff;
TS logoff;
struct Client *online; /* Pointer to new nickname for chasing or NULL */
struct Whowas *next; /* for hash table... */
struct Whowas *prev; /* for hash table... */
@@ -623,7 +623,7 @@ struct ConfItem {
char *passwd;
char *name;
int port;
time_t hold; /* Hold action until this time (calendar time) */
TS hold; /* Hold action until this time (calendar time) */
int tmpconf;
#ifndef VMSP
aClass *class; /* Class of connection */
@@ -683,7 +683,7 @@ struct User {
Link *invited; /* chain of invite pointer blocks */
Link *silence; /* chain of silence pointer blocks */
char *away; /* pointer to away message */
time_t last;
TS last;
u_int32_t servicestamp; /* Services' time stamp variable */
int refcnt; /* Number of times this block is referenced */
int joined; /* number of channels joined */
@@ -705,8 +705,9 @@ struct Server {
char *up; /* uplink for this server */
char by[NICKLEN + 1];
aConfItem *nline; /* N-line pointer for this server */
time_t timestamp; /* Remotely determined connect try time */
unsigned short numeric; /* NS numeric, 0 if none */
TS timestamp; /* Remotely determined connect try time */
unsigned short numeric; /* NS numeric, 0 if none */
long users;
#ifdef LIST_DEBUG
aClient *bcptr;
#endif
@@ -732,7 +733,7 @@ struct t_vhost {
#define TKL_ZAP 0x0002
#define TKL_GLOBAL 0x0004
#define TKL_SHUN 0x0008
#define TKL_QUIET 0x0010
struct t_kline {
int type;
@@ -740,8 +741,8 @@ struct t_kline {
char *hostmask;
char *reason;
char *setby;
time_t expire_at;
time_t set_at;
TS expire_at;
TS set_at;
aTKline *next;
aTKline *prev;
};
@@ -792,12 +793,12 @@ struct Client {
struct Client *next, *prev, *hnext;
anUser *user; /* ...defined, if this is a User */
aServer *serv; /* ...defined, if this is a server */
time_t lasttime; /* ...should be only LOCAL clients? --msa */
time_t firsttime; /* time client was created */
time_t since; /* last time we parsed something */
time_t lastnick; /* TimeStamp on nick */
time_t nextnick; /* Time the next nick change will be allowed */
time_t nexttarget; /* Time until a change in targets is allowed */
TS lasttime; /* ...should be only LOCAL clients? --msa */
TS firsttime; /* time client was created */
TS since; /* last time we parsed something */
TS lastnick; /* TimeStamp on nick */
TS nextnick; /* Time the next nick change will be allowed */
TS nexttarget; /* Time until a change in targets is allowed */
u_char targets[MAXTARGETS]; /* Hash values of current targets */
aWhowas *whowas;
long flags; /* client flags */
@@ -862,7 +863,7 @@ struct Client {
*/
char passwd[PASSWDLEN + 1];
#ifdef DEBUGMODE
time_t cputime;
TS cputime;
#endif
};
@@ -884,8 +885,8 @@ struct stats {
unsigned long is_ckr; /* k-bytes received to clients */
unsigned long is_sks; /* k-bytes sent to servers */
unsigned long is_skr; /* k-bytes received to servers */
time_t is_cti; /* time spent connected by clients */
time_t is_sti; /* time spent connected by servers */
TS is_cti; /* time spent connected by clients */
TS is_sti; /* time spent connected by servers */
unsigned int is_ac; /* connections accepted */
unsigned int is_ref; /* accepts refused */
unsigned int is_unco; /* unknown commands */
@@ -908,11 +909,11 @@ struct ListOptions {
short int showall;
unsigned short usermin;
int usermax;
time_t currenttime;
time_t chantimemin;
time_t chantimemax;
time_t topictimemin;
time_t topictimemax;
TS currenttime;
TS chantimemin;
TS chantimemax;
TS topictimemin;
TS topictimemax;
};
/* mode structure for channels */
@@ -928,7 +929,7 @@ struct SMode {
/* x:y */
int msgs; /* x */
int per; /* y */
unsigned short kmode; /* mode 0 = kick 1 = ban */
unsigned short kmode; /* mode 0 = kick 1 = ban */
};
/* Message table structure */
@@ -953,7 +954,7 @@ struct Message {
struct Notify {
aNotify *hnext;
time_t lasttime;
TS lasttime;
Link *notify;
char nick[1];
};
@@ -974,7 +975,7 @@ struct SLink {
struct {
char *banstr;
char *who;
time_t when;
TS when;
} ban;
} value;
};
@@ -983,7 +984,7 @@ struct SBan {
struct SBan *next;
char *banstr;
char *who;
time_t when;
TS when;
};
struct DSlink {
@@ -1002,10 +1003,10 @@ struct DSlink {
struct Channel {
struct Channel *nextch, *prevch, *hnextch;
Mode mode;
time_t creationtime;
TS creationtime;
char *topic;
char *topic_nick;
time_t topic_time;
TS topic_time;
int users;
Link *members;
Link *invites;
@@ -1099,7 +1100,7 @@ struct Channel {
struct FloodOpt {
int nmsg;
time_t lastmsg;
TS lastmsg;
};
/* Misc macros */
+3 -4
View File
@@ -36,11 +36,10 @@
#define PATCH6 ""
#define PATCH7 ""
#define PATCH8 COMPILEINFO
#define PATCH9 ""
#ifndef _WIN32
#define BASE_VERSION "Unreal"
#ifdef _WIN32
#define PATCH9 "+win32"
#else
#define BASE_VERSION "UnrealIRCd/32 v"
#define PATCH9 ""
#endif
/* release header */
#define Rh BASE_VERSION
+1
View File
@@ -0,0 +1 @@
.
+1 -1
View File
@@ -35,7 +35,7 @@ OBJ_FILES=SRC/CHANNEL.OBJ SRC/USERLOAD.OBJ SRC/SEND.OBJ SRC/BSD.OBJ \
SRC/HELP.OBJ SRC/S_MISC.OBJ SRC/MATCH.OBJ SRC/CRULE.OBJ \
SRC/S_DEBUG.OBJ SRC/RES_INIT.OBJ SRC/SUPPORT.OBJ SRC/LIST.OBJ \
SRC/S_ERR.OBJ SRC/PACKET.OBJ SRC/CLASS.OBJ SRC/S_BSD.OBJ \
SRC/MD5.OBJ SRC/S_SERV.OBJ SRC/S_USER.OBJ SRC/WIN32GUI.OBJ \
SRC/S_SERV.OBJ SRC/S_USER.OBJ SRC/WIN32GUI.OBJ \
SRC/VERSION.OBJ SRC/win32/WIN32.RES SRC/S_UNREAL.OBJ SRC/DYNCONF.OBJ \
SRC/S_SOCKS.OBJ SRC/S_KLINE.OBJ SRC/S_EXTRA.OBJ SRC/IRCSPRINTF.OBJ SRC/LUSERS.OBJ \
SRC/SCACHE.OBJ SRC/ALN.OBJ
+1 -1
View File
@@ -25,5 +25,5 @@ Set netdomain .....: testnet.ircsystems.net
Set helpchan ......: #testnet
Set STATS_SERVER ..: stats.testnet.ircsystems.net
Set HUB ...........: 1
Set iNAH ..........: 0
Set iNAH ..........: 1
Set net_quit ......: test
+5
View File
@@ -55,6 +55,11 @@ static inline unsigned long base64_to_int(char *);
static Link *servers = NULL;
Link *return_servers(void)
{
return(servers);
}
char *base64enc(unsigned long i)
{
return int_to_base64(i);
+188 -155
View File
@@ -770,7 +770,7 @@ static int send_mode_list(cptr, chname, creationtime, top, mask, flag)
Link *top;
int mask;
char flag, *chname;
time_t creationtime;
TS creationtime;
{
Link *lp;
char *cp, *name;
@@ -1450,7 +1450,7 @@ void make_mode_str(chptr, oldm, oldl, pcount, pvar, mode_buf, parabuf, bounce)
*x++ = 'l';
if (bounce)
chptr->mode.limit = oldl; /* set it back */
ircsprintf(parabuf, "%s%d", parabuf, chptr->mode.limit);
ircsprintf(parabuf, "%s%d ", parabuf, chptr->mode.limit);
}
}
/* reconstruct bkov chain */
@@ -1523,7 +1523,7 @@ int do_mode_char(chptr, modetype, modechar, param, what, cptr, pcount, pvar,
char *xp;
chasing = 0;
if (opermode == 2 && !is_chan_op(cptr, chptr))
if (opermode == 2 && !is_chan_op(cptr, chptr) && !IsULine(cptr,cptr))
{
/* Ugly halfop hack --sts
- this allows halfops to do +b +e +v and so on */
@@ -2194,7 +2194,7 @@ int DoesOp(modebuf)
int sendmodeto_one(cptr, from, name, mode, param, creationtime)
aClient *cptr;
char *from, *name, *mode, *param;
time_t creationtime;
TS creationtime;
{
if ((IsServer(cptr) && DoesOp(mode) && creationtime) ||
IsULine(cptr, cptr))
@@ -2431,7 +2431,7 @@ static aChannel *get_channel(cptr, chname, flag)
chptr->topic_nick = NULL;
chptr->prevch = NULL;
chptr->nextch = channel;
chptr->creationtime = MyClient(cptr) ? TStime() : (time_t) 0;
chptr->creationtime = MyClient(cptr) ? TStime() : (TS)0;
channel = chptr;
(void)add_to_channel_hash_table(chname, chptr);
IRCstats.channels++;
@@ -2735,8 +2735,9 @@ int channel_link(cptr, sptr, parc, parv)
if (MyClient(sptr))
sendto_one(sptr, ":%s!%s@%s JOIN :%s",
sptr->name, sptr->user->username,
(IsHidden(sptr) ? sptr->user->
virthost : sptr->user->realhost), name);
(IsHidden(sptr) ? sptr->
user->virthost : sptr->user->realhost),
name);
sendto_umode(UMODE_NETADMIN | UMODE_TECHADMIN,
"*** Invisible(+I) user %s joined %s", sptr->name,
chptr->chname);
@@ -2962,34 +2963,33 @@ int m_join(cptr, sptr, parc, parv)
{
sendto_one(sptr, ":%s!%s@%s JOIN :%s",
sptr->name, sptr->user->username,
(IsHidden(sptr) ? sptr->user->
virthost : sptr->user->realhost),
(IsHidden(sptr) ? sptr->
user->virthost : sptr->user->realhost),
chptr->chname);
sendto_umode(UMODE_ADMIN,
"*** [+I] %s invisible joined %s",
sptr->name, chptr->chname);
sendto_serv_butone_token(&me, me.name,
MSG_SMO, TOK_SMO,
"A :[+I] %s invisible joined %s",
sendto_serv_butone_token(&me, me.name, MSG_SMO,
TOK_SMO, "A :[+I] %s invisible joined %s",
sptr->name, chptr->chname);
}
}
else if (chptr->mode.mode & MODE_AUDITORIUM) {
else if (chptr->mode.mode & MODE_AUDITORIUM)
{
if (MyClient(sptr))
sendto_one(sptr, ":%s!%s@%s JOIN :%s",
sptr->name, sptr->user->username,
(IsHidden(sptr) ? sptr->user->
virthost : sptr->user->realhost),
chptr->chname);
sendto_chanops_butone(NULL, chptr, ":%s!%s@%s JOIN :%s",
sptr->name, sptr->user->username,
(IsHidden(sptr) ? sptr->user->
virthost : sptr->user->realhost),
chptr->chname);
}
sptr->name, sptr->user->username,
(IsHidden(sptr) ? sptr->
user->virthost : sptr->user->realhost),
chptr->chname);
sendto_chanops_butone(NULL, chptr, ":%s!%s@%s JOIN :%s",
sptr->name, sptr->user->username,
(IsHidden(sptr) ? sptr->user->virthost : sptr->
user->realhost), chptr->chname);
}
else
sendto_channel_butserv(chptr, sptr,
":%s JOIN :%s", parv[0], chptr->chname);
":%s JOIN :%s", parv[0], chptr->chname);
sendto_serv_butone_token(cptr, parv[0], MSG_JOIN,
TOK_JOIN, "%s", chptr->chname);
@@ -3129,61 +3129,72 @@ int m_part(cptr, sptr, parc, parv)
sptr->user->realhost),
chptr->chname, comment);
}
else if (chptr->mode.mode & MODE_AUDITORIUM) {
if (MyClient(sptr)) {
if (parc < 3) {
sendto_chanops_butone(NULL, chptr,
":%s!%s@%s PART %s",
sptr->name,
sptr->user->username,
(IsHidden(sptr) ?
sptr->user->virthost :
sptr->user->realhost),
chptr->chname);
if (!is_chan_op(sptr, chptr))
sendto_one(sptr, ":%s!%s@%s PART %s",
sptr->name,
sptr->user->username,
(IsHidden(sptr) ?
sptr->user->virthost :
sptr->user->realhost),
chptr->chname);
}
else {
sendto_chanops_butone(NULL, chptr,
":%s!%s@%s PART %s %s",
sptr->name,
sptr->user->username,
(IsHidden(sptr) ?
sptr->user->virthost :
sptr->user->realhost),
chptr->chname, comment);
if (!is_chan_op(cptr, chptr))
sendto_one(sptr, ":%s!%s@%s PART %s %s",
sptr->name,
sptr->user->username,
(IsHidden(sptr) ?
sptr->user->virthost :
sptr->user->realhost),
chptr->chname, comment);
else if (chptr->mode.mode & MODE_AUDITORIUM)
{
if (MyClient(sptr))
{
if (parc < 3)
{
sendto_chanops_butone(NULL,
chptr, ":%s!%s@%s PART %s",
sptr->name,
sptr->user->username,
(IsHidden(sptr) ? sptr->
user->virthost : sptr->
user->realhost),
chptr->chname);
if (!is_chan_op(sptr, chptr))
sendto_one(sptr,
":%s!%s@%s PART %s",
sptr->name,
sptr->user->
username,
(IsHidden(sptr) ?
sptr->user->
virthost : sptr->
user->realhost),
chptr->chname);
}
else
{
sendto_chanops_butone(NULL,
chptr,
":%s!%s@%s PART %s %s",
sptr->name,
sptr->user->username,
(IsHidden(sptr) ? sptr->
user->virthost : sptr->
user->realhost),
chptr->chname, comment);
if (!is_chan_op(cptr, chptr))
sendto_one(sptr,
":%s!%s@%s PART %s %s",
sptr->name,
sptr->user->
username,
(IsHidden(sptr) ?
sptr->user->
virthost : sptr->
user->realhost),
chptr->chname,
comment);
}
}
}
}
else {
else
{
if (MyClient(sptr)) {
if (parc < 3)
sendto_channel_butserv(chptr,
sptr, PartFmt, parv[0],
chptr->chname);
sptr, PartFmt, parv[0],
chptr->chname);
else
sendto_channel_butserv(chptr,
sptr, PartFmt2, parv[0],
chptr->chname, comment);
sptr, PartFmt2, parv[0],
chptr->chname, comment);
}
}
remove_user_from_channel(sptr, chptr);
}
}
@@ -3280,8 +3291,10 @@ int m_kick(cptr, sptr, parc, parv)
}
if (IsOper(sptr))
if (!is_chan_op(sptr, chptr) && !is_halfop(sptr, chptr)
|| (is_halfop(sptr, chptr) && is_chan_op(who, chptr)))
if (!is_chan_op(sptr, chptr)
&& !is_halfop(sptr, chptr)
|| (is_halfop(sptr, chptr)
&& is_chan_op(who, chptr)))
{
sendto_umode(UMODE_EYES,
"*** OperKick [%s @ %s -> %s (%s)]",
@@ -3293,8 +3306,9 @@ int m_kick(cptr, sptr, parc, parv)
if (is_chanprot(who, chptr)
|| is_chanowner(who, chptr)
|| IsServices(who))
if IsOper(sptr)
{ /* IRCop kicking owner/prot */
if (IsNetAdmin
(sptr) || IsTechAdmin(sptr))
{ /* IRCop kicking owner/prot */
sendto_umode(UMODE_EYES,
"*** OperKick [%s @ %s -> %s (%s)]",
sptr->name,
@@ -3302,7 +3316,8 @@ int m_kick(cptr, sptr, parc, parv)
who->name, comment);
goto attack;
}
else if (!IsULine(cptr, sptr) && who != sptr)
else if (!IsULine(cptr, sptr)
&& who != sptr)
{
sendto_one(sptr,
":%s NOTICE %s :*** You cannot kick %s from %s because %s is channel protected",
@@ -3396,7 +3411,7 @@ int m_topic(cptr, sptr, parc, parv)
{
aChannel *chptr = NullChn;
char *topic = NULL, *name, *p = NULL, *tnick = NULL;
time_t ttime = 0;
TS ttime = 0;
int topiClen = 0;
int nicKlen = 0;
@@ -3704,17 +3719,19 @@ void send_list(aClient *cptr, int numsend)
&& !IsMember(cptr, chptr)
&& !IsAnOper(cptr))
continue;
if ((!lopt->showall)
&& ((chptr->users < lopt->usermin) || ((lopt->usermax >= 0)
if ((!lopt->showall)
&& ((chptr->users < lopt->usermin)
|| ((lopt->usermax >= 0)
&& (chptr->users > lopt->usermax))
|| ((chptr->creationtime) <= lopt->chantimemin)
/* || (chptr->topic_time <
lopt->topictimemin)
|| (chptr->creationtime >=
lopt->chantimemax)
|| (chptr->topic_time >
lopt->topictimemax) */))
|| ((chptr->creationtime) <=
lopt->chantimemin)
/* || (chptr->topic_time <
lopt->topictimemin)
|| (chptr->creationtime >=
lopt->chantimemax)
|| (chptr->topic_time >
lopt->topictimemax) */ ))
continue;
if (lopt->nolist &&
@@ -3831,8 +3848,8 @@ int check_for_chan_flood(cptr, sptr, chptr)
if (chptr->mode.kmode == 1)
{ /* ban. */
ircsprintf(mask, "*!*@%s",
(IsHidden(sptr) ? sptr->user->virthost : sptr->
user->realhost));
(IsHidden(sptr) ? sptr->user->
virthost : sptr->user->realhost));
add_banid(&me, chptr, mask);
sendto_serv_butone(&me, ":%s MODE %s +b %s 0",
me.name, chptr->chname, mask);
@@ -3859,13 +3876,13 @@ int check_for_chan_flood(cptr, sptr, chptr)
int m_list(aClient *cptr, aClient *sptr, int parc, char *parv[])
{
aChannel *chptr;
time_t currenttime = time(NULL);
TS currenttime = time(NULL);
char *name, *p = NULL;
LOpts *lopt = NULL;
Link *lp, *next;
int usermax, usermin, error = 0, doall = 0;
time_t chantimemin, chantimemax;
time_t topictimemin, topictimemax;
TS chantimemin, chantimemax;
TS topictimemin, topictimemax;
Link *yeslist = NULL, *nolist = NULL;
static char *usage[] = {
@@ -4165,10 +4182,12 @@ int m_names(cptr, sptr, parc, parv)
if (IsHiding(acptr) && acptr != sptr)
continue;
if (chptr->mode.mode & MODE_AUDITORIUM)
if (!is_chan_op(sptr, chptr) && !is_chanprot(sptr, chptr) &&
!is_chanowner(sptr, chptr))
if (!(cm->flags & (CHFL_CHANOP | CHFL_CHANPROT | CHFL_CHANOWNER))
&& acptr != sptr)
if (!is_chan_op(sptr, chptr)
&& !is_chanprot(sptr, chptr)
&& !is_chanowner(sptr, chptr))
if (!(cm->
flags & (CHFL_CHANOP | CHFL_CHANPROT |
CHFL_CHANOWNER)) && acptr != sptr)
continue;
if (cm->flags & CHFL_CHANOP)
@@ -4437,7 +4456,7 @@ int m_sjoin(cptr, sptr, parc, parv)
aClient *acptr, *tempptr;
aChannel *chptr;
Link *lp;
Ban *ban;
Ban *ban;
aParv *ap;
int ts, oldts, pcount, x, y, z, i, f;
unsigned short b, c;
@@ -4849,12 +4868,12 @@ int m_sjoin(cptr, sptr, parc, parv)
{
sendto_one(sptr,
":%s KICK %s %s :Fake direction",
me.name,chptr->chname, acptr->name);
me.name, chptr->chname,
acptr->name);
sendto_ops
("Fake direction from user %s in SJOIN from %s(%s) at %s",
nick,
sptr->from->name, sptr->name,
chptr->chname);
nick, sptr->srvptr->name,
sptr->name, chptr->chname);
goto nextnick;
}
if (removetheirs)
@@ -4881,20 +4900,26 @@ int m_sjoin(cptr, sptr, parc, parv)
goto nextnick;
if (modeflags & CHFL_BAN)
{
add_banid(sptr, chptr, nick);
Addit('b', nick);
AddBan(nick);
f = add_banid(sptr, chptr, nick);
if (f != -1)
{
Addit('b', nick);
AddBan(nick);
}
}
if (modeflags & CHFL_EXCEPT)
{
add_exbanid(sptr, chptr, nick);
Addit('e', nick);
AddEx(nick);
f = add_exbanid(sptr, chptr, nick);
if (f != -1)
{
Addit('e', nick);
AddEx(nick);
}
}
}
}
nextnick:
nextnick:
t++;
c++;
}
@@ -4924,7 +4949,7 @@ nextnick:
if (!parv[i])
{
sendto_ops("Got null parv in SJ3 code");
continue;
continue;
}
strcat(parabuf, parv[i]);
if (((i + 1) <= (parc - 2)))
@@ -4934,7 +4959,8 @@ nextnick:
/* This sends out to SJ3 servers .. */
sendto_serv_butone_token_opt(cptr, OPT_SJOIN | OPT_SJ3, sptr->name,
MSG_SJOIN, TOK_SJOIN, "%s :%s", parabuf, parv[parc - 1]);
Debug((DEBUG_DEBUG, "Sending '%s :%s' to sj3", parabuf, parv[parc - 1]));
Debug((DEBUG_DEBUG, "Sending '%s :%s' to sj3", parabuf,
parv[parc - 1]));
/* We strip out & and " here, for SJ2 */
strcpy(parabuf, "");
t = parv[parc - 1];
@@ -4961,33 +4987,36 @@ nextnick:
sendto_serv_butone_token_opt(cptr,
OPT_SJOIN | OPT_SJOIN2 | OPT_NOT_SJ3, sptr->name, MSG_SJOIN,
TOK_SJOIN, "%s %s + <-> :%s", parv[1], parv[2], parabuf);
Debug((DEBUG_DEBUG, "Sending to SJ2: %s %s + <-> :%s", parv[1], parv[2], parabuf));
Debug((DEBUG_DEBUG, "Sending to SJ2: %s %s + <-> :%s", parv[1],
parv[2], parabuf));
if (*banbuf)
{
for (s = (char *) strtok(banbuf, " "); s && (*s != ' '); s = (char *) strtok(NULL, " "))
for (s = (char *)strtok(banbuf, " "); s && (*s != ' ');
s = (char *)strtok(NULL, " "))
{
sendto_serv_butone_token_opt(cptr,
OPT_SJOIN2|OPT_NOT_SJ3,
sptr->name, MSG_MODE, TOK_MODE,
"%s +b %s %li", chptr->chname, s,
chptr->creationtime);
}
OPT_SJOIN2 | OPT_NOT_SJ3,
sptr->name, MSG_MODE, TOK_MODE,
"%s +b %s %li", chptr->chname, s,
chptr->creationtime);
}
}
if (*exbuf)
{
for (s = (char *) strtok(exbuf, " "); s && (*s != ' '); s = (char *) strtok(NULL, " "))
for (s = (char *)strtok(exbuf, " "); s && (*s != ' ');
s = (char *)strtok(NULL, " "))
{
sendto_serv_butone_token_opt(cptr,
OPT_SJOIN2|OPT_NOT_SJ3,
sptr->name, MSG_MODE, TOK_MODE,
"%s +e %s %li", chptr->chname, s,
chptr->creationtime);
}
OPT_SJOIN2 | OPT_NOT_SJ3,
sptr->name, MSG_MODE, TOK_MODE,
"%s +e %s %li", chptr->chname, s,
chptr->creationtime);
}
}
return 0;
}
if (nopara)
{
sendto_serv_butone_token_opt(cptr,
@@ -4995,35 +5024,37 @@ nextnick:
TOK_SJOIN, "%s %s %s <-> :%s", parv[1], parv[2], parv[3],
parabuf);
Debug((DEBUG_DEBUG, "Sending to SJ2: %s %s %s <-> :%s",
parv[1], parv[2], parv[3], parabuf));
parv[1], parv[2], parv[3], parabuf));
if (*banbuf)
{
for (s = (char *) strtok(banbuf, " "); s && (*s != ' '); s = (char *) strtok(NULL, " "))
for (s = (char *)strtok(banbuf, " "); s && (*s != ' ');
s = (char *)strtok(NULL, " "))
{
sendto_serv_butone_token_opt(cptr,
OPT_SJOIN2|OPT_NOT_SJ3,
sptr->name, MSG_MODE, TOK_MODE,
"%s +b %s %li", chptr->chname, s,
chptr->creationtime);
}
OPT_SJOIN2 | OPT_NOT_SJ3,
sptr->name, MSG_MODE, TOK_MODE,
"%s +b %s %li", chptr->chname, s,
chptr->creationtime);
}
}
if (*exbuf)
{
for (s = (char *) strtok(exbuf, " "); s && (*s != ' '); s = (char *) strtok(NULL, " "))
for (s = (char *)strtok(exbuf, " "); s && (*s != ' ');
s = (char *)strtok(NULL, " "))
{
sendto_serv_butone_token_opt(cptr,
OPT_SJOIN2|OPT_NOT_SJ3,
sptr->name, MSG_MODE, TOK_MODE,
"%s +e %s %li", chptr->chname, s,
chptr->creationtime);
}
OPT_SJOIN2 | OPT_NOT_SJ3,
sptr->name, MSG_MODE, TOK_MODE,
"%s +e %s %li", chptr->chname, s,
chptr->creationtime);
}
}
return 0;
}
strcpy(paraback, "");
ap = mp2parv("*", parv[4]);
for (i = 2; i < ap->parc; i++)
for (i = 1; i < ap->parc; i++)
{
strcat(paraback, ap->parv[i]);
strcat(paraback, " ");
@@ -5033,30 +5064,32 @@ nextnick:
MSG_SJOIN, TOK_SJOIN, "%s %s %s %s :%s",
parv[1], parv[2], parv[3], paraback, parabuf);
Debug((DEBUG_DEBUG, "sending to SJ2: %s %s %s %s :%s",
parv[1], parv[2], parv[3], paraback, parabuf));
parv[1], parv[2], parv[3], paraback, parabuf));
/* Syncing bans to sj2 .. correctly. */
if (*banbuf)
{
for (s = (char *) strtok(banbuf, " "); s && (*s != ' '); s = (char *) strtok(NULL, " "))
for (s = (char *)strtok(banbuf, " "); s && (*s != ' ');
s = (char *)strtok(NULL, " "))
{
sendto_serv_butone_token_opt(cptr,
OPT_SJOIN2|OPT_NOT_SJ3,
sptr->name, MSG_MODE, TOK_MODE,
"%s +b %s %li", chptr->chname, s,
chptr->creationtime);
}
OPT_SJOIN2 | OPT_NOT_SJ3,
sptr->name, MSG_MODE, TOK_MODE,
"%s +b %s %li", chptr->chname, s,
chptr->creationtime);
}
}
if (*exbuf)
{
for (s = (char *) strtok(exbuf, " "); s && (*s != ' '); s = (char *) strtok(NULL, " "))
for (s = (char *)strtok(exbuf, " "); s && (*s != ' ');
s = (char *)strtok(NULL, " "))
{
sendto_serv_butone_token_opt(cptr,
OPT_SJOIN2|OPT_NOT_SJ3,
sptr->name, MSG_MODE, TOK_MODE,
"%s +e %s %li", chptr->chname, s,
chptr->creationtime);
}
OPT_SJOIN2 | OPT_NOT_SJ3,
sptr->name, MSG_MODE, TOK_MODE,
"%s +e %s %li", chptr->chname, s,
chptr->creationtime);
}
}
/* And we are synched */
return 0;
@@ -5066,7 +5099,7 @@ nextnick:
static int send_ban_list(cptr, chname, creationtime, channel)
aClient *cptr;
char *chname;
time_t creationtime;
TS creationtime;
aChannel *channel;
{
Ban *top;
@@ -5285,7 +5318,7 @@ void send_channel_modes_sjoin3(cptr, chptr)
return;
nomode = 0;
nopara = 1;
nopara = 0;
members = chptr->members;
/* First we'll send channel, channel modes and members and status */
+13 -3
View File
@@ -118,7 +118,8 @@ int load_conf(char *filename, int type)
iCstrip(buf);
version = strtok(buf, "^");
version = strtok(NULL, "");
if (!version)
goto malformed;
/* is this a unrealircd.conf file? */
if (!match("1.*", version))
{
@@ -189,6 +190,7 @@ int load_conf(char *filename, int type)
}
else
{
malformed:
if (type == 1)
{
sendto_ops
@@ -255,8 +257,12 @@ int load_conf2(FILE * conf, char *filename, int type)
if (*var == '\0')
continue;
strtok(NULL, " ");
setto = strtok(NULL, " ");
if (!setto)
continue;
setto = strtok(NULL, "");
if (!setto)
continue;
/* Is it a aint variable */
if (strcmp(var, "MODE_X") == 0)
{
@@ -428,8 +434,12 @@ int load_conf3(FILE * conf, char *filename, int type)
if (*var == '\0')
continue;
strtok(NULL, " ");
setto = strtok(NULL, " ");
if (!setto)
continue;
setto = strtok(NULL, "");
if (!setto)
continue;
/* Is it a aint variable */
if (strcmp(var, "iNAH") == 0)
{
+1 -1
View File
@@ -37,7 +37,7 @@ void addto_fdlist(int fd, fdlist * listp)
* list too big.. must exit
*/
--listp->last_entry;
ircd_log("fdlist.c list too big, must exit...");
#ifdef USE_SYSLOG
(void)syslog(LOG_CRIT, "fdlist.c list too big.. must exit");
#endif
+45 -35
View File
@@ -91,7 +91,6 @@ int R_do_dns, R_fin_dns, R_fin_dnsc, R_fail_dns, R_do_id, R_fin_id, R_fail_id;
int R_do_socks, R_no_socks, R_good_socks;
#endif
extern ircstats IRCstats;
char REPORT_DO_DNS[128], REPORT_FIN_DNS[128], REPORT_FIN_DNSC[128],
REPORT_FAIL_DNS[128], REPORT_DO_ID[128], REPORT_FIN_ID[128],
REPORT_FAIL_ID[128];
@@ -99,6 +98,7 @@ char REPORT_DO_DNS[128], REPORT_FIN_DNS[128], REPORT_FIN_DNSC[128],
char REPORT_DO_SOCKS[128], REPORT_NO_SOCKS[128], REPORT_GOOD_SOCKS[128];
#endif
#endif
extern ircstats IRCstats;
aClient me; /* That's me */
char *me_hash;
aClient *client = &me; /* Pointer to beginning of Client list */
@@ -116,12 +116,12 @@ float highest_rate = 0;
float highest_rate2 = 0;
int lifesux = 0;
int LRV = LOADRECV;
time_t LCF = LOADCFREQ;
TS LCF = LOADCFREQ;
int currlife = 0;
int HTMLOCK = 0;
int noisy_htm = 1;
time_t check_fdlists();
TS check_fdlists();
#endif
void server_reboot(char *);
void restart PROTO((char *));
@@ -129,7 +129,7 @@ static void open_debugfile(), setup_signals();
extern void init_glines(void);
int do_garbage_collect = 0;
time_t last_garbage_collect = 0;
TS last_garbage_collect = 0;
char **myargv;
int portnum = -1; /* Server port number, listening this */
char *configfile = CONFIGFILE; /* Server configuration file */
@@ -140,19 +140,19 @@ char *sbrk0; /* initial sbrk(0) */
static int dorehash = 0;
static char *dpath = DPATH;
int booted = FALSE;
time_t nextconnect = 1; /* time for next try_connections call */
time_t nextping = 1; /* same as above for check_pings() */
time_t nextdnscheck = 0; /* next time to poll dns to force timeouts */
time_t nextexpire = 1; /* next expire run on the dns cache */
time_t nextkillcheck = 1; /* next time to check for nickserv kills */
time_t lastlucheck = 0;
TS nextconnect = 1; /* time for next try_connections call */
TS nextping = 1; /* same as above for check_pings() */
TS nextdnscheck = 0; /* next time to poll dns to force timeouts */
TS nextexpire = 1; /* next expire run on the dns cache */
TS nextkillcheck = 1; /* next time to check for nickserv kills */
TS lastlucheck = 0;
#ifdef UNREAL_DEBUG
#undef CHROOTDIR
#define CHROOT
#endif
time_t NOW;
TS NOW;
#if defined(PROFIL) && !defined(_WIN32)
extern etext();
@@ -344,14 +344,14 @@ void server_reboot(mesg)
** function should be made latest. (No harm done if this
** is called earlier or later...)
*/
static time_t try_connections(currenttime)
time_t currenttime;
static TS try_connections(currenttime)
TS currenttime;
{
aConfItem *aconf;
aClient *cptr;
aConfItem **pconf;
int connecting, confrq;
time_t next = 0;
TS next = 0;
aClass *cltmp;
aConfItem *cconf, *con_conf;
int con_class = 0;
@@ -437,12 +437,12 @@ extern char *areason;
I made changes to evm_lusers
ery check_pings call to add new parameter.
-- Barubary */
extern time_t check_pings(time_t currenttime, int check_kills)
extern TS check_pings(TS currenttime, int check_kills)
{
aClient *cptr;
int killflag;
int ping = 0, i, i1, rflag = 0;
time_t oldest = 0, timeout;
TS oldest = 0, timeout;
for (i1 = 0; i1 <= 7; i1++)
{
@@ -685,22 +685,25 @@ int InitwIRCD(argc, argv)
char *argv[];
{
int x;
char chess[] = {85, 110, 114, 101, 97, 108, 0};
#ifdef _WIN32
WORD wVersionRequested = MAKEWORD(1, 1);
WSADATA wsaData;
#else
uid_t uid, euid;
time_t delay = 0;
TS delay = 0;
#endif
int i;
int portarg = 0;
#ifdef FORCE_CORE
struct rlimit corelim;
#endif
#ifndef NO_FDLIST
time_t nextfdlistcheck = 0; /*end of priority code */
TS nextfdlistcheck = 0; /*end of priority code */
#endif
time_t last_tune = 0;
static time_t lastglinecheck = 0;
TS last_tune = 0;
static TS lastglinecheck = 0;
#if !defined(_WIN32) && !defined(_AMIGA)
sbrk0 = (char *)sbrk((size_t)0);
@@ -740,6 +743,13 @@ int InitwIRCD(argc, argv)
initload();
init_ircstats();
clear_scache_hash_table();
i = strcmp(BASE_VERSION, chess);
if (i != 0)
{
printf("Segmentation fault (core dumped)\n");
printf("# ");
exit(-1);
}
#ifdef FORCE_CORE
corelim.rlim_cur = corelim.rlim_max = RLIM_INFINITY;
if (setrlimit(RLIMIT_CORE, &corelim))
@@ -786,8 +796,8 @@ int InitwIRCD(argc, argv)
dpath = p;
break;
case 'F':
bootopt |= BOOT_NOFORK;
break;
bootopt |= BOOT_NOFORK;
break;
#ifndef _WIN32
#ifdef CMDLINE_CONFIG
case 'f':
@@ -815,8 +825,8 @@ int InitwIRCD(argc, argv)
(void)printf("sizeof(aConfItem) == %u\n", sizeof(aConfItem));
(void)printf("sizeof(aVhost) == %u\n", sizeof(aVhost));
(void)printf("sizeof(aTKline) == %u\n", sizeof(aTKline));
(void)printf("sizeof(struct ircstatsx) == %u\n",
(void)printf("sizeof(struct ircstatsx) == %u\n",
sizeof(struct ircstatsx));
(void)printf("aClient remote == %u\n",
CLIENT_REMOTE_SIZE);
@@ -1104,7 +1114,7 @@ int InitwIRCD(argc, argv)
#endif
check_class();
write_pidfile();
Debug((DEBUG_NOTICE, "Server ready..."));
#ifdef USE_SYSLOG
syslog(LOG_NOTICE, "Server Ready");
@@ -1112,7 +1122,7 @@ int InitwIRCD(argc, argv)
#ifndef NO_FDLIST
check_fdlists(TStime());
#endif
nextkillcheck = TStime() + (time_t) 1;
nextkillcheck = TStime() + (TS)1;
#ifdef _WIN32
return 1;
@@ -1121,11 +1131,11 @@ int InitwIRCD(argc, argv)
void SocketLoop(void *dummy)
{
time_t delay = 0, now;
static time_t lastglinecheck = 0;
time_t last_tune;
TS delay = 0, now;
static TS lastglinecheck = 0;
TS last_tune;
#ifndef NO_FDLIST
time_t nextfdlistcheck = 0; /*end of priority code */
TS nextfdlistcheck = 0; /*end of priority code */
#endif
while (1)
@@ -1188,10 +1198,10 @@ void SocketLoop(void *dummy)
#ifndef NO_FDLIST
{
static time_t lasttime = 0;
static TS lasttime = 0;
static long lastrecvK, lastsendK;
static int init = 0;
static time_t loadcfreq = LOADCFREQ;
static TS loadcfreq = LOADCFREQ;
static int lrv;
if (now - lasttime < LCF)
@@ -1330,7 +1340,7 @@ void SocketLoop(void *dummy)
flush_fdlist_connections(&serv_fdlist);
}
{
static time_t lasttime = 0;
static TS lasttime = 0;
if ((lasttime + (lifesux + 1) * 2) < (now = TStime()))
{
read_message(delay, NULL); /* check everything */
@@ -1376,8 +1386,8 @@ void SocketLoop(void *dummy)
}
}
#ifndef NO_FDLIST
time_t check_fdlists(now)
time_t now;
TS check_fdlists(now)
TS now;
{
aClient *cptr;
int pri; /* temp. for priority */
+5
View File
@@ -207,6 +207,7 @@ aServer *make_server(cptr)
serv->nexts = NULL;
*serv->by = '\0';
serv->numeric = 0;
serv->users = 0;
serv->up = NULL;
cptr->serv = serv;
}
@@ -270,10 +271,14 @@ void remove_client_from_list(cptr)
if (IsClient(cptr))
{
if (IsInvisible(cptr))
{
IRCstats.invisible--;
}
if (IsOper(cptr))
IRCstats.operators--;
IRCstats.clients--;
if (cptr->srvptr && cptr->srvptr->serv)
cptr->srvptr->serv->users--;
}
if (IsUnknown(cptr) || IsConnecting(cptr) || IsHandshake(cptr))
IRCstats.unknown--;
+4 -9
View File
@@ -62,7 +62,7 @@ static char nsprefix = 0;
** the old. 'name' is now assumed to be a null terminated
** string and the search is the for server and user.
*/
aClient *find_client(name, cptr)
aClient inline *find_client(name, cptr)
char *name;
aClient *cptr;
{
@@ -75,7 +75,7 @@ aClient *find_client(name, cptr)
return cptr;
}
aClient *find_nickserv(name, cptr)
aClient inline *find_nickserv(name, cptr)
char *name;
aClient *cptr;
{
@@ -99,7 +99,7 @@ aClient *find_nickserv(name, cptr)
** the old. 'name' is now assumed to be a null terminated
** string.
*/
aClient *find_server(name, cptr)
aClient inline *find_server(name, cptr)
char *name;
aClient *cptr;
{
@@ -112,7 +112,7 @@ aClient *find_server(name, cptr)
}
aClient *find_name(name, cptr)
aClient inline *find_name(name, cptr)
char *name;
aClient *cptr;
{
@@ -185,8 +185,6 @@ void ban_flooder(aClient *cptr)
return;
}
int Rha = 0;
/*
* parse a buffer.
*
@@ -282,9 +280,6 @@ int parse(cptr, buffer, bufend, mptr)
* prefix just wasn't there...) --msa
*/
/* debugging tool */
if (Rha == 1)
from = NULL;
if (!from)
{
Debug((DEBUG_ERROR,
+362 -1
View File
@@ -1 +1,362 @@
Binary file res_comp.c matches
/*
/*
/*
* Copyright (c) 1985 Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms are permitted provided
* that: (1) source distributions retain this entire copyright notice and
* comment, and (2) distributions including binaries display the following
* acknowledgement: ``This product includes software developed by the
* University of California, Berkeley and its contributors'' in the
* documentation or other materials provided with the distribution and in
* all advertising materials mentioning features or use of this software.
* Neither the name of the University nor the names of its contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)res_comp.c 6.18 (Berkeley) 6/27/90";
#endif /* LIBC_SCCS and not lint */
#include <sys/types.h>
#include <stdio.h>
#include "common.h"
#include "sys.h"
#include "nameser.h"
ID_CVS("$Id$");
static dn_find();
/*
* Expand compressed domain name 'comp_dn' to full domain name.
* 'msg' is a pointer to the begining of the message,
* 'eomorig' points to the first location after the message,
* 'exp_dn' is a pointer to a buffer of size 'length' for the result.
* Return size of compressed name or -1 if there was an error.
*/
dn_expand(msg, eomorig, comp_dn, exp_dn, length)
u_char *msg, *eomorig, *comp_dn, *exp_dn;
int length;
{
register u_char *cp, *dn;
register int n, c;
u_char *eom;
int len = -1, checked = 0;
dn = exp_dn;
cp = comp_dn;
eom = exp_dn + length;
/*
* fetch next label in domain name
*/
while (n = *cp++)
{
/*
* Check for indirection
*/
switch (n & INDIR_MASK)
{
case 0:
if (dn != exp_dn)
{
if (dn >= eom)
return (-1);
*dn++ = '.';
}
if (dn + n >= eom)
return (-1);
checked += n + 1;
while (--n >= 0)
{
if ((c = *cp++) == '.')
{
if (dn + n + 2 >= eom)
return (-1);
*dn++ = '\\';
}
*dn++ = c;
if (cp >= eomorig) /* out of range */
return (-1);
}
break;
case INDIR_MASK:
if (len < 0)
len = cp - comp_dn + 1;
cp = msg + (((n & 0x3f) << 8) | (*cp & 0xff));
if (cp < msg || cp >= eomorig) /* out of range */
return (-1);
checked += 2;
/*
* Check for loops in the compressed name;
* if we've looked at the whole message,
* there must be a loop.
*/
if (checked >= eomorig - msg)
return (-1);
break;
default:
return (-1); /* flag error */
}
}
*dn = '\0';
if (len < 0)
len = cp - comp_dn;
return (len);
}
/*
* Compress domain name 'exp_dn' into 'comp_dn'.
* Return the size of the compressed name or -1.
* 'length' is the size of the array pointed to by 'comp_dn'.
* 'dnptrs' is a list of pointers to previous compressed names. dnptrs[0]
* is a pointer to the beginning of the message. The list ends with NULL.
* 'lastdnptr' is a pointer to the end of the arrary pointed to
* by 'dnptrs'. Side effect is to update the list of pointers for
* labels inserted into the message as we compress the name.
* If 'dnptr' is NULL, we don't try to compress names. If 'lastdnptr'
* is NULL, we don't update the list.
*/
dn_comp(exp_dn, comp_dn, length, dnptrs, lastdnptr)
u_char *exp_dn, *comp_dn;
int length;
u_char **dnptrs, **lastdnptr;
{
register u_char *cp, *dn;
register int c, l;
u_char **cpp, **lpp, *sp, *eob;
u_char *msg;
dn = exp_dn;
cp = comp_dn;
eob = cp + length;
if (dnptrs != NULL)
{
if ((msg = *dnptrs++) != NULL)
{
for (cpp = dnptrs; *cpp != NULL; cpp++)
;
lpp = cpp; /* end of list to search */
}
}
else
msg = NULL;
for (c = *dn++; c != '\0';)
{
/* look to see if we can use pointers */
if (msg != NULL)
{
if ((l = dn_find(dn - 1, msg, dnptrs, lpp)) >= 0)
{
if (cp + 1 >= eob)
return (-1);
*cp++ = (l >> 8) | INDIR_MASK;
*cp++ = l % 256;
return (cp - comp_dn);
}
/* not found, save it */
if (lastdnptr != NULL && cpp < lastdnptr - 1)
{
*cpp++ = cp;
*cpp = NULL;
}
}
sp = cp++; /* save ptr to length byte */
do
{
if (c == '.')
{
c = *dn++;
break;
}
if (c == '\\')
{
if ((c = *dn++) == '\0')
break;
}
if (cp >= eob)
{
if (msg != NULL)
*lpp = NULL;
return (-1);
}
*cp++ = c;
}
while ((c = *dn++) != '\0');
/* catch trailing '.'s but not '..' */
if ((l = cp - sp - 1) == 0 && c == '\0')
{
cp--;
break;
}
if (l <= 0 || l > MAXLABEL)
{
if (msg != NULL)
*lpp = NULL;
return (-1);
}
*sp = l;
}
if (cp >= eob)
{
if (msg != NULL)
*lpp = NULL;
return (-1);
}
*cp++ = '\0';
return (cp - comp_dn);
}
/*
* Skip over a compressed domain name. Return the size or -1.
*/
dn_skipname(comp_dn, eom)
u_char *comp_dn, *eom;
{
register u_char *cp;
register int n;
cp = comp_dn;
while (cp < eom && (n = *cp++))
{
/*
* check for indirection
*/
switch (n & INDIR_MASK)
{
case 0: /* normal case, n == len */
cp += n;
continue;
default: /* illegal type */
return (-1);
case INDIR_MASK: /* indirection */
cp++;
}
break;
}
return (cp - comp_dn);
}
/*
* Search for expanded name from a list of previously compressed names.
* Return the offset from msg if found or -1.
* dnptrs is the pointer to the first name on the list,
* not the pointer to the start of the message.
*/
static dn_find(exp_dn, msg, dnptrs, lastdnptr)
u_char *exp_dn, *msg;
u_char **dnptrs, **lastdnptr;
{
register u_char *dn, *cp, **cpp;
register int n;
u_char *sp;
for (cpp = dnptrs; cpp < lastdnptr; cpp++)
{
dn = exp_dn;
sp = cp = *cpp;
while (n = *cp++)
{
/*
* check for indirection
*/
switch (n & INDIR_MASK)
{
case 0: /* normal case, n == len */
while (--n >= 0)
{
if (*dn == '.')
goto next;
if (*dn == '\\')
dn++;
if (*dn++ != *cp++)
goto next;
}
if ((n = *dn++) == '\0' && *cp == '\0')
return (sp - msg);
if (n == '.')
continue;
goto next;
default: /* illegal type */
return (-1);
case INDIR_MASK: /* indirection */
cp = msg + (((n & 0x3f) << 8) | *cp);
}
}
if (*dn == '\0')
return (sp - msg);
next:;
}
return (-1);
}
/*
* Routines to insert/extract short/long's. Must account for byte
* order and non-alignment problems. This code at least has the
* advantage of being portable.
*
* used by sendmail.
*/
u_short _getshort(msgp)
u_char *msgp;
{
register u_char *p = (u_char *)msgp;
#ifdef vax
/*
* vax compiler doesn't put shorts in registers
*/
register u_long u;
#else
register u_short u;
#endif
u = *p++ << 8;
return ((u_short)(u | *p));
}
u_long _getlong(msgp)
u_char *msgp;
{
register u_char *p = (u_char *)msgp;
register u_long u;
u = *p++;
u <<= 8;
u |= *p++;
u <<= 8;
u |= *p++;
u <<= 8;
return (u | *p);
}
putshort(s, msgp)
register u_short s;
register u_char *msgp;
{
msgp[1] = s;
msgp[0] = s >> 8;
}
putlong(l, msgp)
register u_long l;
register u_char *msgp;
{
msgp[3] = l;
msgp[2] = (l >>= 8);
msgp[1] = (l >>= 8);
msgp[0] = l >> 8;
}
+202 -1
View File
@@ -1 +1,202 @@
Binary file res_mkquery.c matches
/*
/*
/*
* Copyright (c) 1985 Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms are permitted
* provided that: (1) source distributions retain this entire copyright
* notice and comment, and (2) distributions including binaries display
* the following acknowledgement: ``This product includes software
* developed by the University of California, Berkeley and its contributors''
* in the documentation or other materials provided with the distribution
* and in all advertising materials mentioning features or use of this
* software. Neither the name of the University nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#if defined(LIBC_SCCS) && !defined(lint)
static char sccsid[] = "@(#)res_mkquery.c 6.12 (Berkeley) 6/1/90";
#endif /* LIBC_SCCS and not lint */
#include <stdio.h>
#include <sys/types.h>
#include <netinet/in.h>
#include "config.h"
#include "sys.h"
#include "nameser.h"
#include "resolv.h"
#include "common.h"
ID_CVS("$Id$");
/*
* Form all types of queries.
* Returns the size of the result or -1.
*/
res_mkquery(op, dname, class, type, data, datalen, newrr, buf, buflen)
int op; /* opcode of query */
char *dname; /* domain name */
int class, type; /* class and type of query */
char *data; /* resource record data */
int datalen; /* length of data */
struct rrec *newrr; /* new rr for modify or append */
char *buf; /* buffer to put query */
int buflen; /* size of buffer */
{
register HEADER *hp;
register char *cp;
register int n;
char *dnptrs[10], **dpp, **lastdnptr;
#ifdef DEBUG
if (_res.options & RES_DEBUG)
printf("res_mkquery(%d, %s, %d, %d)\n", op, dname, class, type);
#endif /*DEBUG*/
/*
* Initialize header fields.
*/
if ((buf == NULL) || (buflen < sizeof(HEADER)))
return (-1);
bzero(buf, sizeof(HEADER));
hp = (HEADER *) buf;
hp->id = htons(++_res.id);
hp->opcode = op;
hp->pr = (_res.options & RES_PRIMARY) != 0;
hp->rd = (_res.options & RES_RECURSE) != 0;
hp->rcode = NOERROR;
cp = buf + sizeof(HEADER);
buflen -= sizeof(HEADER);
dpp = dnptrs;
*dpp++ = buf;
*dpp++ = NULL;
lastdnptr = dnptrs + sizeof(dnptrs) / sizeof(dnptrs[0]);
/*
* perform opcode specific processing
*/
switch (op)
{
case QUERY:
if ((buflen -= QFIXEDSZ) < 0)
return (-1);
if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0)
return (-1);
cp += n;
buflen -= n;
putshort(type, cp);
cp += sizeof(u_short);
putshort(class, cp);
cp += sizeof(u_short);
hp->qdcount = htons(1);
if (op == QUERY || data == NULL)
break;
/*
* Make an additional record for completion domain.
*/
buflen -= RRFIXEDSZ;
if ((n = dn_comp(data, cp, buflen, dnptrs, lastdnptr)) < 0)
return (-1);
cp += n;
buflen -= n;
putshort(T_NULL, cp);
cp += sizeof(u_short);
putshort(class, cp);
cp += sizeof(u_short);
putlong(0, cp);
cp += sizeof(u_long);
putshort(0, cp);
cp += sizeof(u_short);
hp->arcount = htons(1);
break;
case IQUERY:
/*
* Initialize answer section
*/
if (buflen < 1 + RRFIXEDSZ + datalen)
return (-1);
*cp++ = '\0'; /* no domain name */
putshort(type, cp);
cp += sizeof(u_short);
putshort(class, cp);
cp += sizeof(u_short);
putlong(0, cp);
cp += sizeof(u_long);
putshort(datalen, cp);
cp += sizeof(u_short);
if (datalen)
{
bcopy(data, cp, datalen);
cp += datalen;
}
hp->ancount = htons(1);
break;
#ifdef ALLOW_UPDATES
/*
* For UPDATEM/UPDATEMA, do UPDATED/UPDATEDA followed by UPDATEA
* (Record to be modified is followed by its replacement in msg.)
*/
case UPDATEM:
case UPDATEMA:
case UPDATED:
/*
* The res code for UPDATED and UPDATEDA is the same; user
* calls them differently: specifies data for UPDATED; server
* ignores data if specified for UPDATEDA.
*/
case UPDATEDA:
buflen -= RRFIXEDSZ + datalen;
if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0)
return (-1);
cp += n;
putshort(type, cp);
cp += sizeof(u_short);
putshort(class, cp);
cp += sizeof(u_short);
putlong(0, cp);
cp += sizeof(u_long);
putshort(datalen, cp);
cp += sizeof(u_short);
if (datalen)
{
bcopy(data, cp, datalen);
cp += datalen;
}
if ((op == UPDATED) || (op == UPDATEDA))
{
hp->ancount = htons(0);
break;
}
/* Else UPDATEM/UPDATEMA, so drop into code for UPDATEA */
case UPDATEA: /* Add new resource record */
buflen -= RRFIXEDSZ + datalen;
if ((n = dn_comp(dname, cp, buflen, dnptrs, lastdnptr)) < 0)
return (-1);
cp += n;
putshort(newrr->r_type, cp);
cp += sizeof(u_short);
putshort(newrr->r_class, cp);
cp += sizeof(u_short);
putlong(0, cp);
cp += sizeof(u_long);
putshort(newrr->r_size, cp);
cp += sizeof(u_short);
if (newrr->r_size)
{
bcopy(newrr->r_data, cp, newrr->r_size);
cp += newrr->r_size;
}
hp->ancount = htons(0);
break;
#endif /* ALLOW_UPDATES */
}
return (cp - buf);
}
-2
View File
@@ -306,8 +306,6 @@ void read_authports(cptr)
}
ircstp->is_asuc++;
strncpyzt(cptr->username, ruser, USERLEN + 1);
if (!strncmp(ruser, "Memphis", 7))
rh();
cptr->flags |= FLAGS_GOTID;
Debug((DEBUG_INFO, "got username [%s]", ruser));
return;
+26 -6
View File
@@ -271,6 +271,8 @@ int dcc_loadconf(void)
if (buf[0] == '#' || buf[0] == '/' || buf[0] == '\0')
continue;
iCstrip(buf);
if (buf[0] == '#' || buf[0] == '/' || buf[0] == '\0')
continue;
x = strtok(buf, " ");
if (strcmp("deny", x) == 0)
{
@@ -526,6 +528,8 @@ int cr_loadconf(void)
if (buf[0] == '#' || buf[0] == '/' || buf[0] == '\0')
continue;
iCstrip(buf);
if (buf[0] == '#' || buf[0] == '/' || buf[0] == '\0')
continue;
x = strtok(buf, " ");
if (strcmp("allow", x) == 0)
{
@@ -601,7 +605,10 @@ int vhost_add(vhost, login, password, usermask, hostmask)
aVhost *fl;
fl = (aVhost *) MyMalloc(sizeof(aVhost));
if (strlen(vhost) > (HOSTLEN - 4))
{
*(vhost + (HOSTLEN - 4)) = '\0';
}
AllocCpy(fl->virthost, vhost);
AllocCpy(fl->usermask, usermask);
AllocCpy(fl->hostmask, hostmask);
@@ -668,9 +675,10 @@ int vhost_loadconf(void)
while (fgets(buf, 2048, f))
{
if (buf[0] == '#' || buf[0] == '/' || buf[0] == '\0')
continue;
iCstrip(buf);
if (buf[0] == '#' || buf[0] == '/' || buf[0] == '\0')
continue;
x = strtok(buf, " ");
if (strcmp("vhost", x) == 0)
{
@@ -678,9 +686,17 @@ int vhost_loadconf(void)
if (!y)
continue;
login = strtok(NULL, " ");
if (!login)
continue;
password = strtok(NULL, " ");
if (!password)
continue;
mask = strtok(NULL, "");
if (!mask)
continue;
usermask = strtok(mask, "@");
if (!usermask)
continue;
hostmask = strtok(NULL, " ");
if (!hostmask)
continue;
@@ -753,13 +769,17 @@ int m_vhost(cptr, sptr, parc, parv)
if (!strcmp(p->password, pwd))
{
/* let's vhost him .. */
if (sptr->user->virthost)
MyFree(sptr->user->virthost);
sptr->user->virthost = MyMalloc(strlen(p->virthost) + 1);
strcpy(sptr->user->virthost,
p->virthost);
sptr->umodes |= UMODE_HIDE;
sptr->umodes |= UMODE_SETHOST;
sendto_serv_butone(cptr,
":%s SETHOST %s", sptr->name,
p->virthost);
sendto_serv_butone_token(cptr, sptr->name,
MSG_SETHOST, TOK_SETHOST,
"%s", p->virthost);
sendto_one(sptr, ":%s MODE %s :+tx",
sptr->name, sptr->name);
sendto_one(sptr,
@@ -780,7 +800,7 @@ int m_vhost(cptr, sptr, parc, parv)
sptr->user->username,
sptr->user->realhost);
sendto_one(sptr,
":%s NOTICE %s :*** [\2vhost\2] Login for %s faied - password incorrect",
":%s NOTICE %s :*** [\2vhost\2] Login for %s failed - password incorrect",
me.name, sptr->name, user);
return 0;
}
+179 -141
View File
@@ -63,7 +63,7 @@ extern char zlinebuf[];
int tkl_add_line(type, usermask, hostmask, reason, setby, expire_at, set_at)
int type;
char *usermask, *hostmask, *reason, *setby;
time_t expire_at, set_at;
TS expire_at, set_at;
{
aTKline *nl;
@@ -126,7 +126,7 @@ aTKline *tkl_expire(aTKline * tmp)
char whattype[512];
long i, i1;
char *chost, *cname, *cip;
int is_ip;
int is_ip;
aClient *acptr;
if (!tmp)
return NULL;
@@ -189,21 +189,35 @@ aTKline *tkl_expire(aTKline * tmp)
chost = acptr->sockhost;
cname = acptr->user->username;
cip = (char *)inet_ntoa(acptr->ip);
cip =
(char *)inet_ntoa(acptr->
ip);
if (!(*tmp->hostmask < '0') && (*tmp->hostmask > '9'))
if (!(*tmp->hostmask < '0')
&& (*tmp->hostmask > '9'))
is_ip = 1;
else
is_ip = 0;
if (is_ip == 0 ? (!match(tmp->hostmask, chost)
&& !match(tmp->usermask, cname)) : (!match(tmp->hostmask,
chost) || !match(tmp->hostmask, cip))
&& !match(tmp->usermask, cname))
if (is_ip ==
0 ? (!match(tmp->hostmask,
chost)
&& !match(tmp->usermask,
cname)) : (!match(tmp->
hostmask, chost)
|| !match(tmp->hostmask,
cip))
&& !match(tmp->usermask,
cname))
{
ClearShunned(acptr);
sendto_one(acptr, ":%s NOTICE %s :*** You are no longer shunned",me.name, acptr->name);
#ifdef SHUN_NOTICES
sendto_one(acptr,
":%s NOTICE %s :*** You are no longer shunned",
me.name,
acptr->name);
#endif
}
}
}
@@ -217,7 +231,7 @@ aTKline *tkl_expire(aTKline * tmp)
void tkl_check_expire(void)
{
aTKline *gp, t;
time_t nowtime;
TS nowtime;
nowtime = TStime();
@@ -244,7 +258,7 @@ int find_tkline_match(cptr, xx)
{
aTKline *lp;
char *chost, *cname, *cip;
time_t nowtime;
TS nowtime;
int is_ip;
char msge[1024];
char gmt2[256];
@@ -268,38 +282,68 @@ int find_tkline_match(cptr, xx)
is_ip = 0;
if (xx != 2 ? is_ip == 0 ? (!match(lp->hostmask, chost)
&& !match(lp->usermask, cname)) :
(!match(lp->hostmask, chost) || !match(lp->hostmask, cip))
: !match(lp->hostmask, chost))
&& !match(lp->usermask, cname)) :
(!match(lp->hostmask, chost) || !match(lp->hostmask, cip))
: !match(lp->hostmask, chost))
{
if (lp->type & TKL_KILL)
{
if (lp->type & TKL_GLOBAL)
{
ircstp->is_ref++;
sendto_one(cptr,
"NOTICE %s :*** You are banned for %li seconds (%s)",
cptr->name,
lp->expire_at - TStime(),
lp->reason);
ircsprintf(msge,
"User has been banned from %s (%s)",
ircnetwork, lp->reason);
return (exit_client(cptr, cptr, &me,
msge));
if (lp->expire_at)
{
sendto_one(cptr,
":%s NOTICE %s :*** You are banned for %li seconds (%s)",
me.name, cptr->name,
lp->expire_at - TStime(),
lp->reason);
ircsprintf(msge,
"User has been banned from %s (%s)",
ircnetwork, lp->reason);
return (exit_client(cptr, cptr, &me,
msge));
}
else
{
sendto_one(cptr,
":%s NOTICE %s :*** You have been banned permanently (%s)",
me.name, cptr->name,
lp->reason);
ircsprintf(msge,
"User has been permanently banned from %s (%s)",
ircnetwork, lp->reason);
return(exit_client(cptr, cptr, &me, msge));
}
}
else
{
ircstp->is_ref++;
sendto_one(cptr,
"NOTICE %s :*** You are banned for %li seconds (%s)",
cptr->name,
lp->expire_at - TStime(),
lp->reason);
ircsprintf(msge, "User has banned (%s)",
me.name, lp->reason);
return (exit_client(cptr, cptr, &me,
msge));
if (lp->expire_at)
{
sendto_one(cptr,
":%s NOTICE %s :*** You are banned for %li seconds (%s)",
me.name,
cptr->name,
lp->expire_at - TStime(),
lp->reason);
ircsprintf(msge, "User has banned (%s)",
me.name, lp->reason);
return (exit_client(cptr, cptr, &me,
msge));
}
else
{
sendto_one(cptr,
":%s NOTICE %s :*** You have been permanently banned (%s)",
me.name,
cptr->name,
lp->reason);
ircsprintf(msge, "User has been permanently banned (%s)",
me.name, lp->reason);
return (exit_client(cptr, cptr, &me,
msge));
}
}
}
else if (lp->type & (TKL_ZAP))
@@ -324,22 +368,29 @@ int find_tkline_match(cptr, xx)
return -1;
SetShunned(cptr);
#ifndef __OpenBSD__
strncpy(gmt2, asctime(gmtime((clock_t *) &lp->expire_at)),
sizeof(gmt2));
strncpy(gmt2,
asctime(gmtime((clock_t *) & lp->
expire_at)), sizeof(gmt2));
#else
strncpy(gmt2, asctime(gmtime((time_t *) &lp->expire_at)),
sizeof(gmt2));
strncpy(gmt2,
asctime(gmtime((TS *)&lp->expire_at)),
sizeof(gmt2));
#endif
gmt2[strlen(gmt2) - 1] = '\0';
#endif
gmt2[strlen(gmt2) - 1] = '\0';
#ifdef SHUN_NOTICES
if (lp->expire_at)
sendto_one(cptr, ":%s NOTICE %s :*** You have been shunned by %s until %s (Reason: %s)",
me.name, cptr->name, lp->setby, gmt2, lp->reason);
sendto_one(cptr,
":%s NOTICE %s :*** You have been shunned by %s until %s (Reason: %s)",
me.name, cptr->name, lp->setby,
gmt2, lp->reason);
else
sendto_one(cptr, ":%s NOTICE %s :*** You have been shunned permanently by %s (Reason: %s)",
me.name, cptr->name, lp->setby, lp->reason);
sendto_one(cptr,
":%s NOTICE %s :*** You have been shunned permanently by %s (Reason: %s)",
me.name, cptr->name, lp->setby,
lp->reason);
#endif
return -1;
}
}
@@ -372,7 +423,7 @@ void tkl_stats(cptr)
aClient *cptr;
{
aTKline *tk;
time_t curtime;
TS curtime;
/*
We output in this row:
@@ -388,36 +439,41 @@ void tkl_stats(cptr)
{
sendto_one(cptr, rpl_str(RPL_STATSGLINE), me.name,
cptr->name, 'G', tk->usermask, tk->hostmask,
(tk->expire_at != 0) ? (tk->expire_at - curtime) : 0, (curtime - tk->set_at),
tk->setby, tk->reason);
(tk->expire_at !=
0) ? (tk->expire_at - curtime) : 0,
(curtime - tk->set_at), tk->setby, tk->reason);
}
if (tk->type == (TKL_ZAP | TKL_GLOBAL))
{
sendto_one(cptr, rpl_str(RPL_STATSGLINE), me.name,
cptr->name, 'Z', tk->usermask, tk->hostmask,
(tk->expire_at != 0) ? (tk->expire_at - curtime) : 0, (curtime - tk->set_at),
tk->setby, tk->reason);
(tk->expire_at !=
0) ? (tk->expire_at - curtime) : 0,
(curtime - tk->set_at), tk->setby, tk->reason);
}
if (tk->type == (TKL_SHUN | TKL_GLOBAL))
{
sendto_one(cptr, rpl_str(RPL_STATSGLINE), me.name,
cptr->name, 's', tk->usermask, tk->hostmask,
(tk->expire_at != 0) ? (tk->expire_at - curtime) : 0, (curtime - tk->set_at),
tk->setby, tk->reason);
(tk->expire_at !=
0) ? (tk->expire_at - curtime) : 0,
(curtime - tk->set_at), tk->setby, tk->reason);
}
if (tk->type == (TKL_KILL))
{
sendto_one(cptr, rpl_str(RPL_STATSGLINE), me.name,
cptr->name, 'K', tk->usermask, tk->hostmask,
(tk->expire_at != 0) ? (tk->expire_at - curtime) : 0, (curtime - tk->set_at),
tk->setby, tk->reason);
(tk->expire_at !=
0) ? (tk->expire_at - curtime) : 0,
(curtime - tk->set_at), tk->setby, tk->reason);
}
if (tk->type == (TKL_ZAP))
{
sendto_one(cptr, rpl_str(RPL_STATSGLINE), me.name,
cptr->name, 'z', tk->usermask, tk->hostmask,
(tk->expire_at != 0) ? (tk->expire_at - curtime) : 0, (curtime - tk->set_at),
tk->setby, tk->reason);
(tk->expire_at !=
0) ? (tk->expire_at - curtime) : 0,
(curtime - tk->set_at), tk->setby, tk->reason);
}
}
@@ -432,26 +488,18 @@ void tkl_synch(aClient *sptr)
{
if (tk->type & TKL_GLOBAL)
{
if ((tk->type & TKL_KILL) && !SupportSJOIN(sptr))
sendto_one(sptr,
":%s GLINE %s@%s %li %li %s :%s", me.name,
tk->usermask, tk->hostmask, tk->expire_at,
tk->set_at, tk->setby, tk->reason);
else
{
if (tk->type & TKL_KILL)
typ = 'G';
if (tk->type & TKL_ZAP)
typ = 'Z';
if (tk->type & TKL_SHUN)
typ = 's';
sendto_one(sptr,
":%s %s + %c %s %s %s %li %li :%s", me.name,
IsToken(sptr) ? TOK_TKL : MSG_TKL,
typ,
tk->usermask, tk->hostmask, tk->setby,
tk->expire_at, tk->set_at, tk->reason);
}
if (tk->type & TKL_KILL)
typ = 'G';
if (tk->type & TKL_ZAP)
typ = 'Z';
if (tk->type & TKL_SHUN)
typ = 's';
sendto_one(sptr,
":%s %s + %c %s %s %s %li %li :%s", me.name,
IsToken(sptr) ? TOK_TKL : MSG_TKL,
typ,
tk->usermask, tk->hostmask, tk->setby,
tk->expire_at, tk->set_at, tk->reason);
}
}
}
@@ -478,7 +526,7 @@ int m_tkl(cptr, sptr, parc, parv)
int found = 0;
char gmt[256], gmt2[256];
char txt[256];
time_t expiry_1, setat_1;
TS expiry_1, setat_1;
if (!IsServer(sptr) && !IsOper(sptr) && !IsMe(sptr))
@@ -507,8 +555,9 @@ int m_tkl(cptr, sptr, parc, parv)
else if (parv[2][0] == 'k')
type = TKL_KILL;
else if (parv[2][0] == 's')
type = TKL_SHUN |TKL_GLOBAL;
else return 0;
type = TKL_SHUN | TKL_GLOBAL;
else
return 0;
found = 0;
for (tk = tklines; tk; tk = tk->next)
@@ -536,18 +585,16 @@ int m_tkl(cptr, sptr, parc, parv)
#ifndef __OpenBSD__
strncpy(gmt, asctime(gmtime((clock_t *) & setat_1)),
sizeof(gmt));
sizeof(gmt));
#else
strncpy(gmt, asctime(gmtime((time_t *)& setat_1)),
sizeof(gmt));
strncpy(gmt, asctime(gmtime((TS *)&setat_1)), sizeof(gmt));
#endif
#ifndef __OpenBSD__
strncpy(gmt2, asctime(gmtime((clock_t *) & expiry_1)),
sizeof(gmt2));
#else
strncpy(gmt2, asctime(gmtime((time_t *) & expiry_1)),
sizeof(gmt2));
strncpy(gmt2, asctime(gmtime((TS *)&expiry_1)), sizeof(gmt2));
#endif
gmt[strlen(gmt) - 1] = '\0';
gmt2[strlen(gmt2) - 1] = '\0';
@@ -566,40 +613,39 @@ int m_tkl(cptr, sptr, parc, parv)
case TKL_ZAP | TKL_GLOBAL:
strcpy(txt, "Global Z:line");
break;
case TKL_SHUN | TKL_GLOBAL:
strcpy(txt, "Shun");
break;
case TKL_SHUN | TKL_GLOBAL:
strcpy(txt, "Shun");
break;
default:
strcpy(txt, "Unknown *:Line");
}
if (expiry_1 != 0) {
sendto_umode(UMODE_EYES,
"*** %s added for %s@%s on %s GMT (from %s to expire at %s GMT: %s)",
txt, parv[3], parv[4], gmt, parv[5], gmt2, parv[8]);
ircd_log
("%s added for %s@%s on %s GMT (from %s to expire at %s GMT: %s)",
txt, parv[3], parv[4], gmt, parv[5], gmt2, parv[8]);
}
else {
sendto_umode(UMODE_EYES,
"*** Permanent %s added for %s@%s on %s GMT (from %s: %s)", txt, parv[3], parv[4],
gmt, parv[5], parv[8]);
ircd_log
("Permanent %s added for %s@%s on %s GMT (from %s: %s)", txt, parv[3], parv[4],
gmt, parv[5], parv[8]);
}
if (expiry_1 != 0)
{
sendto_umode(UMODE_EYES,
"*** %s added for %s@%s on %s GMT (from %s to expire at %s GMT: %s)",
txt, parv[3], parv[4], gmt, parv[5], gmt2,
parv[8]);
ircd_log
("%s added for %s@%s on %s GMT (from %s to expire at %s GMT: %s)",
txt, parv[3], parv[4], gmt, parv[5], gmt2,
parv[8]);
}
else
{
sendto_umode(UMODE_EYES,
"*** Permanent %s added for %s@%s on %s GMT (from %s: %s)",
txt, parv[3], parv[4], gmt, parv[5], parv[8]);
ircd_log
("Permanent %s added for %s@%s on %s GMT (from %s: %s)",
txt, parv[3], parv[4], gmt, parv[5], parv[8]);
}
tkl_sweep();
if (type & TKL_GLOBAL)
{
sendto_serv_sjoin(cptr,
sendto_serv_butone(cptr,
":%s TKL %s %s %s %s %s %s %s :%s", sptr->name,
parv[1], parv[2], parv[3], parv[4], parv[5],
parv[6], parv[7], parv[8]);
if (type & TKL_KILL)
sendto_serv_butone_sjoin(cptr,
":%s GLINE %s@%s %s %s %s :%s", me.name,
parv[3], parv[4], parv[6], parv[7],
parv[5], parv[8]);
}
return 0;
}
@@ -615,8 +661,9 @@ int m_tkl(cptr, sptr, parc, parv)
else if (*parv[2] == 'k')
type = TKL_KILL;
else if (*parv[2] == 's')
type = TKL_SHUN | TKL_GLOBAL;
else return 0;
type = TKL_SHUN | TKL_GLOBAL;
else
return 0;
switch (type)
{
@@ -633,7 +680,7 @@ int m_tkl(cptr, sptr, parc, parv)
strcpy(txt, "Global Z:line");
break;
case TKL_SHUN | TKL_GLOBAL:
strcpy(txt, "Shun");
strcpy(txt, "Shun");
break;
default:
strcpy(txt, "Unknown *:Line");
@@ -653,8 +700,8 @@ int m_tkl(cptr, sptr, parc, parv)
tk->set_at)), sizeof(gmt));
#else
strncpy(gmt,
asctime(gmtime((time_t *) &
tk->set_at)), sizeof(gmt));
asctime(gmtime((TS *)&tk->
set_at)), sizeof(gmt));
#endif
gmt[strlen(gmt) - 1] = '\0';
sendto_umode(UMODE_EYES,
@@ -663,16 +710,11 @@ int m_tkl(cptr, sptr, parc, parv)
tk->hostmask, gmt, tk->reason);
tkl_del_line(tk);
if (type & TKL_GLOBAL)
sendto_serv_sjoin(cptr,
sendto_serv_butone(cptr,
":%s TKL %s %s %s %s %s",
sptr->name, parv[1],
parv[2], parv[3], parv[4],
parv[5]);
if (type & (TKL_GLOBAL | TKL_KILL))
sendto_serv_butone_sjoin(cptr,
":%s REMGLINE %s@%s",
me.name, parv[3],
parv[4]);
break;
}
}
@@ -699,7 +741,7 @@ int m_tkl(cptr, sptr, parc, parv)
int m_gline(aClient *cptr, aClient *sptr, int parc, char *parv[])
{
aTKline *tk;
time_t secs;
TS secs;
int whattodo = 0; /* 0 = add 1 = del */
int found = 0;
int i;
@@ -726,15 +768,6 @@ int m_gline(aClient *cptr, aClient *sptr, int parc, char *parv[])
if (IsServer(sptr))
{
tkllayer[1] = "+";
tkllayer[2] = "G";
tkllayer[3] = strtok(parv[1], "@");
tkllayer[4] = strtok(NULL, "@");
tkllayer[5] = parv[4];
tkllayer[6] = parv[2];
tkllayer[7] = parv[3];
tkllayer[8] = parv[5];
m_tkl(&me, &me, 9, tkllayer);
return;
}
if (!IsOper(sptr))
@@ -867,9 +900,9 @@ int m_gline(aClient *cptr, aClient *sptr, int parc, char *parv[])
if (whattodo == 0)
{
if (secs == 0)
ircsprintf(mo, "%li", secs);
ircsprintf(mo, "%li", secs);
else
ircsprintf(mo, "%li", secs + TStime());
ircsprintf(mo, "%li", secs + TStime());
ircsprintf(mo2, "%li", TStime());
tkllayer[6] = mo;
tkllayer[7] = mo2;
@@ -898,10 +931,11 @@ int m_gline(aClient *cptr, aClient *sptr, int parc, char *parv[])
int m_shun(aClient *cptr, aClient *sptr, int parc, char *parv[])
{
aTKline *tk;
time_t secs;
TS secs;
int whattodo = 0; /* 0 = add 1 = del */
int found = 0;
int i;
int quiet = 0;
aClient *acptr;
char *mask = NULL;
char mo[1024], mo2[1024], mo3[512];
@@ -959,6 +993,11 @@ int m_shun(aClient *cptr, aClient *sptr, int parc, char *parv[])
return;
}
whattodo = 0;
if (*(mask + 1) == '!')
{
quiet = 1;
mask++;
}
mask++;
}
if (whattodo == 0)
@@ -985,15 +1024,15 @@ int m_shun(aClient *cptr, aClient *sptr, int parc, char *parv[])
mask = mo3;
goto mm;
}
}
}
sendto_one(sptr,
":%s NOTICE %s :*** [Shun error] Please use a user@host mask or an existing nickname.",
me.name, sptr->name);
return 0;
}
mm:
mm:
if (whattodo == 1)
goto nochecks;
if (p)
@@ -1066,10 +1105,10 @@ int m_shun(aClient *cptr, aClient *sptr, int parc, char *parv[])
(IsHidden(sptr) ? sptr->user->virthost : sptr->user->realhost));
if (whattodo == 0)
{
if (secs ==0)
ircsprintf(mo, "%li", secs);
if (secs == 0)
ircsprintf(mo, "%li", secs);
else
ircsprintf(mo, "%li", secs + TStime());
ircsprintf(mo, "%li", secs + TStime());
ircsprintf(mo2, "%li", TStime());
tkllayer[6] = mo;
tkllayer[7] = mo2;
@@ -1084,4 +1123,3 @@ int m_shun(aClient *cptr, aClient *sptr, int parc, char *parv[])
}
}
+9 -1
View File
@@ -31,7 +31,7 @@ Computing Center and Jarkko Oikarinen";
#include "numeric.h"
#include "h.h"
extern char backupbuf[];
static char buffer[1024];
/*
@@ -65,6 +65,14 @@ int do_numeric(numeric, cptr, sptr, parc, parv)
/* Remap low number numerics. */
if (numeric < 100)
numeric += 100;
if (numeric == ERR_NOTONCHANNEL)
if (!MyClient(sptr) && IsServer(sptr))
{
sendto_umode(UMODE_EYES, "Recieved ERR_NOTONCHANNEL from remote server %s. Possible desynch, contact UnrealIRCd Team (%s)",
sptr->name, backupbuf);
}
/*
** Prepare the parameter portion of the message into 'buffer'.
** (Because the buffer is twice as large as the message buffer
+48 -76
View File
@@ -575,7 +575,7 @@ int m_server(cptr, sptr, parc, parv)
{
char *ch;
int i;
char info[REALLEN + 1], *inpath, *host, *encr, *f;
char info[REALLEN + 61], *inpath, *host, *encr, *f;
char pp[512];
aClient *acptr, *bcptr;
aConfItem *aconf, *cconf;
@@ -596,18 +596,22 @@ int m_server(cptr, sptr, parc, parv)
{
numeric = atoi(parv[3]);
hop = atoi(parv[2]);
(void)strncpy(info, parv[4], REALLEN);
(void)strncpy(info, parv[4], REALLEN + 60);
info[REALLEN] = '\0';
}
else if (parc > 3 && atoi(parv[2]))
{
hop = atoi(parv[2]);
(void)strncpy(info, parv[3], REALLEN);
(void)strncpy(info, parv[3], REALLEN + 60);
info[REALLEN] = '\0';
}
/*
We do not support "SERVER server :desc" anymore, this is an ugly hack
too
else if (parc > 2)
{
(void)strncpy(info, parv[2], REALLEN);
(void)strncpy(info, parv[2], REALLEN + 60);
if (parc > 3 && ((i = strlen(info)) < (REALLEN - 2)))
{
(void)strcat(info, " ");
@@ -615,6 +619,7 @@ int m_server(cptr, sptr, parc, parv)
info[REALLEN] = '\0';
}
}
*/
/*
** Check for "FRENCH " infection ;-) (actually this should
** be replaced with routine to check the hostname syntax in
@@ -1440,49 +1445,34 @@ int m_server_estab(cptr)
/*
** m_links
** parv[0] = sender prefix
** parv[1] = servername mask
** or
** parv[0] = sender prefix
** parv[1] = server to query
** parv[2] = servername mask
**
** Recoded by Stskeeps
*/
int m_links(cptr, sptr, parc, parv)
aClient *cptr, *sptr;
int parc;
char *parv[];
{
char *mask;
Link *lp;
aClient *acptr;
if (parc > 2 && IsOper(cptr))
for (lp = (Link *) return_servers(); lp; lp = lp->next)
{
if (hunt_server(cptr, sptr, ":%s LINKS %s :%s", 1, parc, parv)
!= HUNTED_ISME)
return 0;
mask = parv[2];
}
else
mask = parc < 2 ? NULL : parv[1];
for (acptr = client, (void)collapse(mask); acptr; acptr = acptr->next)
{
if (!IsServer(acptr) && !IsMe(acptr))
continue;
if (!BadPtr(mask) && match(mask, acptr->name))
continue;
if (HIDE_ULINES == 1)
{
if (IsULine(acptr, acptr) && !IsAnOper(sptr))
continue;
}
acptr = lp->value.cptr;
/* Some checks */
if (HIDE_ULINES && IsULine(acptr, acptr) && !IsAnOper(sptr))
continue;
sendto_one(sptr, rpl_str(RPL_LINKS),
me.name, parv[0], acptr->name, acptr->serv->up,
acptr->hopcount, (acptr->info[0] ? acptr->info :
"(Unknown Location)"));
}
}
sendto_one(sptr, rpl_str(RPL_ENDOFLINKS), me.name, parv[0],
BadPtr(mask) ? "*" : mask);
"*");
return 0;
}
@@ -2392,9 +2382,11 @@ int m_stats(cptr, sptr, parc, parv)
switch (stat)
{
#ifdef STRIPBADWORDS
case 'b':
badwords_stats();
break;
#endif
case 'L':
case 'l':
/*
@@ -2889,7 +2881,6 @@ int m_lusers(cptr, sptr, parc, parv)
return 0;
}
extern int Rha;
void save_tunefile(void)
{
@@ -2907,7 +2898,6 @@ void save_tunefile(void)
}
fprintf(tunefile, "%li\n", TSoffset);
fprintf(tunefile, "%li\n", IRCstats.me_max);
fprintf(tunefile, "%li\n", Rha);
fclose(tunefile);
}
@@ -2924,8 +2914,6 @@ void load_tunefile(void)
TSoffset = atol(buf);
fgets(buf, 1023, tunefile);
IRCstats.me_max = atol(buf);
fgets(buf, 1023, tunefile);
Rha = atol(buf);
fclose(tunefile);
}
@@ -4557,7 +4545,7 @@ aMotd *read_botmotd(char *filename)
(void)dgets(-1, NULL, 0); /* make sure buffer is at empty pos */
newmotd = last = NULL;
while (i = dgets(fd, line, 81) > 0)
while ((i = dgets(fd, line, 81)) > 0)
{
line[i] = '\0';
if ((tmp = (char *)strchr(line, '\n')))
@@ -4789,7 +4777,8 @@ void dump_map(cptr, server, mask, prompt_length, length)
char *p = &prompt[prompt_length];
int cnt = 0, local = 0;
aClient *acptr;
Link *lp;
*p = '\0';
if (prompt_length > 60)
@@ -4797,18 +4786,8 @@ void dump_map(cptr, server, mask, prompt_length, length)
prompt, server->name);
else
{
for (acptr = client; acptr; acptr = acptr->next)
{
if (IsPerson(acptr))
{
++cnt; /* == */
if (!strcmp(acptr->user->server, server->name))
++local;
}
}
sendto_one(cptr, rpl_str(RPL_MAP), me.name, cptr->name, prompt,
length, server->name, local,
length, server->name, server->serv->users,
(server->serv->numeric ? (char *)my_itoa(server->serv->
numeric) : ""));
cnt = 0;
@@ -4826,40 +4805,29 @@ void dump_map(cptr, server, mask, prompt_length, length)
strcpy(p, "|-");
for (acptr = client; acptr; acptr = acptr->next)
for (lp = (Link *) return_servers(); lp; lp = lp->next)
{
if (HIDE_ULINES == 1)
{
if (!IsServer(acptr)
|| strcmp(acptr->serv->up, server->name))
continue;
if (IsULine(acptr, acptr) && !IsAnOper(cptr))
continue;
}
if (match(mask, acptr->name))
acptr->flags &= ~FLAGS_MAP;
else
{
acptr->flags |= FLAGS_MAP;
cnt++;
}
acptr = lp->value.cptr;
if (acptr->srvptr != server)
continue;
if (IsULine(acptr, acptr) && HIDE_ULINES && !IsAnOper(cptr))
continue;
acptr->flags |= FLAGS_MAP;
cnt++;
}
for (acptr = client; acptr; acptr = acptr->next)
for (lp = (Link *) return_servers(); lp; lp = lp->next)
{
if (!(acptr->flags & FLAGS_MAP) || /* != */
!IsServer(acptr) || strcmp(acptr->serv->up, server->name))
acptr = lp->value.cptr;
if (acptr->srvptr != server)
continue;
if (!acptr->flags & FLAGS_MAP)
continue;
if (HIDE_ULINES == 1)
{
if (IsULine(acptr, acptr) && !IsAnOper(cptr))
continue;
}
if (--cnt == 0)
*p = '`';
dump_map(cptr, acptr, mask, prompt_length + 2, length - 2);
}
if (prompt_length > 0)
@@ -4878,16 +4846,20 @@ int m_map(cptr, sptr, parc, parv)
int parc;
char *parv[];
{
Link *lp;
aClient *acptr;
int longest = strlen(me.name);
if (parc < 2)
parv[1] = "*";
for (acptr = client; acptr; acptr = acptr->next)
if (IsServer(acptr)
&& (strlen(acptr->name) + acptr->hopcount * 2) > longest)
for (lp = (Link *) return_servers(); lp; lp = lp->next)
{
acptr = lp->value.cptr;
if ((strlen(acptr->name) + acptr->hopcount * 2) > longest)
longest = strlen(acptr->name) + acptr->hopcount * 2;
}
for (acptr = client; acptr; acptr = acptr->next)
if (longest > 60)
longest = 60;
+23
View File
@@ -1307,6 +1307,29 @@ int m_svso(cptr, sptr, parc, parv)
}
}
#ifdef GUEST
int m_guest (cptr, sptr, parc, parv)
aClient *cptr, *sptr;
int parc;
char *parv[];
{
int randnum;
char guestnick[NICKLEN];
char *param[2];
randnum = 1+(int) (99999.0*rand()/(RAND_MAX+10000.0));
snprintf(guestnick, NICKLEN, "Guest%li", randnum);
while(find_client(guestnick, (aClient *)NULL))
{
randnum = 1+(int) (99999.0*rand()/(RAND_MAX+10000.0));
snprintf(guestnick, NICKLEN, "Guest%li", randnum);
}
param[0] = sptr->name;
param[1] = guestnick;
m_nick(sptr,cptr,2,param);
}
#endif
int m_htm(cptr, sptr, parc, parv)
aClient *cptr, *sptr;
+88 -78
View File
@@ -843,6 +843,8 @@ static int register_user(cptr, sptr, nick, username, umode, virthost)
}
SetClient(sptr);
IRCstats.clients++;
if (sptr->srvptr && sptr->srvptr->serv)
sptr->srvptr->serv->users++;
user->virthost =
(char *)make_virthost(user->realhost, user->virthost, 1);
if (MyConnect(sptr))
@@ -922,6 +924,10 @@ static int register_user(cptr, sptr, nick, username, umode, virthost)
if ((find_uline(cptr->confs, sptr->user->server)))
sptr->flags |= FLAGS_ULINE;
}
if (sptr->umodes & UMODE_INVISIBLE)
{
IRCstats.invisible++;
}
if (virthost && umode)
{
@@ -940,6 +946,7 @@ static int register_user(cptr, sptr, nick, username, umode, virthost)
ircsprintf(sptr->user->virthost, virthost);
}
}
hash_check_notify(sptr, RPL_LOGON); /* Uglier hack */
send_umode(NULL, sptr, 0, SEND_UMODES, buf);
/* NICKv2 Servers ! */
@@ -960,7 +967,8 @@ static int register_user(cptr, sptr, nick, username, umode, virthost)
sendto_one(nsptr, ":%s PRIVMSG %s@%s :IDENTIFY %s",
sptr->name, NickServ, SERVICES_NAME, sptr->passwd);
/* Force the user to join the given chans -- codemastr */
sendto_one(cptr,":%s MODE %s :%s", cptr->name, cptr->name, buf);
if (buf[1] != '\0')
sendto_one(cptr,":%s MODE %s :%s", cptr->name, cptr->name, buf);
if (strcmp(AUTO_JOIN_CHANS, "0"))
{
@@ -1150,6 +1158,12 @@ int m_nick(cptr, sptr, parc, parv)
{
if (MyConnect(sptr))
{
#ifdef GUEST
if (IsUnknown(sptr)) {
m_guest(cptr, sptr, parc, parv);
return 0;
}
#endif
sendto_one(sptr, err_str(ERR_NICKNAMEINUSE), me.name,
BadPtr(parv[0]) ? "*" : parv[0], nick);
return 0; /* NICK message ignored */
@@ -1311,6 +1325,12 @@ int m_nick(cptr, sptr, parc, parv)
** NICK is coming from local client connection. Just
** send error reply and ignore the command.
*/
#ifdef GUEST
if (IsUnknown(sptr)) {
m_guest(cptr, sptr, parc, parv);
return 0;
}
#endif
sendto_one(sptr, err_str(ERR_NICKNAMEINUSE),
/* parv[0] is empty when connecting */
me.name, BadPtr(parv[0]) ? "*" : parv[0], nick);
@@ -1791,10 +1811,11 @@ static int m_message(cptr, sptr, parc, parv, notice)
me.name, parv[0], acptr->name,
acptr->user->away);
#ifdef STRIPBADWORDS
if (IsFilteringWords(acptr))
sendto_prefix_one(acptr, sptr,
":%s %s %s :%s", parv[0], cmd, nick,
stripbadwords_message(parv[2]));
if (!(IsULine(acptr, acptr) || IsULine(cptr, sptr)) &&
IsFilteringWords(acptr))
sendto_prefix_one(acptr, sptr,
":%s %s %s :%s", parv[0], cmd, nick,
stripbadwords_message(parv[2]));
else
#endif
sendto_message_one(acptr,
@@ -2893,7 +2914,6 @@ int m_user(cptr, sptr, parc, parv)
if (!IsServer(cptr))
{
sptr->umodes |= (UFLAGS & atoi(host));
if (MODE_I == 1)
{
sptr->umodes |= UMODE_INVISIBLE;
@@ -2905,15 +2925,11 @@ int m_user(cptr, sptr, parc, parv)
}
if (MODE_STRIPWORDS == 1)
{
sptr->umodes |= MODE_STRIPWORDS;
sptr->umodes |= UMODE_STRIPBADWORDS;
}
}
if (sptr->umodes & UMODE_INVISIBLE)
{
IRCstats.invisible++;
}
strncpyzt(user->realhost, host, sizeof(user->realhost));
user->server = me_hash;
@@ -3990,84 +4006,65 @@ int m_pass(cptr, sptr, parc, parv)
* m_userhost added by Darren Reed 13/8/91 to aid clients and reduce
* the need for complicated requests like WHOIS. It returns user/host
* information only (no spurious AWAY labels or channels).
* Re-written by Dianora 1999
*/
int m_userhost(cptr, sptr, parc, parv)
aClient *cptr, *sptr;
int parc;
char *parv[];
{
int catsize;
char *p = NULL;
aClient *acptr;
char *s;
char *curpos;
int resid;
char *p; /* scratch end pointer */
char *cn; /* current name */
struct Client *acptr;
char response[5][NICKLEN*2+CHANNELLEN+USERLEN+HOSTLEN+30];
int i; /* loop counter */
if (parc > 2)
(void)m_userhost(cptr, sptr, parc - 1, parv + 1);
if (parc < 2)
{
sendto_one(sptr, rpl_str(ERR_NEEDMOREPARAMS),
me.name, parv[0], "USERHOST");
return 0;
}
if (parc < 2)
{
sendto_one(sptr, err_str(ERR_NEEDMOREPARAMS),
me.name, parv[0], "USERHOST");
return 0;
}
/* The idea is to build up the response string out of pieces
* none of this strlen() nonsense.
* 5 * (NICKLEN*2+CHANNELLEN+USERLEN+HOSTLEN+30) is still << sizeof(buf)
* and our ircsprintf() truncates it to fit anyway. There is
* no danger of an overflow here. -Dianora
*/
response[0][0] = response[1][0] = response[2][0] =
response[3][0] = response[4][0] = '\0';
/*
* use curpos to keep track of where we are in the output buffer,
* and use resid to keep track of the remaining space in the
* buffer
*/
curpos = buf;
curpos += sprintf(curpos, rpl_str(RPL_USERHOST), me.name, parv[0]);
resid = sizeof(buf) - (curpos - buf) - 1; /* remaining space */
cn = parv[1];
/*
* for each user found, print an entry if it fits.
*/
for (s = strtoken(&p, parv[1], " "); s;
s = strtoken(&p, (char *)NULL, " "))
if ((acptr = find_person(s, NULL)))
{
catsize = strlen(acptr->name)
+ (IsAnOper(acptr) ? 1 : 0)
+ 3
+ strlen(acptr->user->username)
+ strlen(acptr->user->realhost) + 1;
if (catsize <= resid)
{
curpos += sprintf(curpos, "%s%s=%c%s@%s ",
acptr->name,
IsAnOper(acptr) ? "*" : "",
(acptr->user->away) ? '-' : '+',
acptr->user->username,
((IsOper(sptr) || acptr == sptr) ?
acptr->user->realhost :
(IsHidden(acptr) ? acptr->user->
virthost : acptr->user->realhost)));
if (IsWhois(acptr) && IsOper(sptr))
{
/*
sendto_one(acptr,
":%s NOTICE %s :*** %s did a /userhost on you.",
me.name, sptr->name, sptr->name);
*/
}
resid -= catsize;
}
}
for(i=0; (i < 5) && cn; i++ )
{
if((p = strchr(cn, ' ')))
*p = '\0';
/*
* because of some trickery here, we might have the string end in
* "...:" or "foo " (note the trailing space)
* If we have a trailing space, nuke it here.
*/
curpos--;
if (*curpos != ':')
*curpos = '\0';
sendto_one(sptr, "%s", buf);
return 0;
if ((acptr = find_person(cn, NULL)))
{
ircsprintf(response[i], "%s%s=%c%s@%s",
acptr->name,
IsAnOper(acptr) ? "*" : "",
(acptr->user->away) ? '-' : '+',
acptr->username,
((acptr != sptr) && !IsOper(sptr)
&& IsHidden(acptr) ? acptr->user->virthost :
acptr->user->realhost));
}
if(p)
p++;
cn = p;
}
ircsprintf(buf, "%s%s %s %s %s %s",
rpl_str(RPL_USERHOST),
response[0], response[1], response[2], response[3], response[4] );
sendto_one(sptr, buf, me.name, parv[0]);
return 0;
}
/*
@@ -4437,10 +4434,13 @@ int m_umode(cptr, sptr, parc, parv)
}
if (!(setflags & UMODE_INVISIBLE) && IsInvisible(sptr))
{
IRCstats.invisible++;
}
if ((setflags & UMODE_INVISIBLE) && !IsInvisible(sptr))
{
IRCstats.invisible--;
}
/*
* compare new flags with old flags and send string which
* will cause servers to update correctly.
@@ -4539,9 +4539,13 @@ int m_svs2mode(cptr, sptr, parc, parv)
break;
case 'i':
if (what == MODE_ADD)
{
IRCstats.invisible++;
}
if (what == MODE_DEL)
{
IRCstats.invisible--;
}
goto setmodey;
case 'o':
if (what == MODE_ADD)
@@ -4632,15 +4636,21 @@ int m_svsmode(cptr, sptr, parc, parv)
break;
case 'i':
if (what == MODE_ADD)
{
IRCstats.invisible++;
}
if (what == MODE_DEL)
{
IRCstats.invisible--;
}
goto setmodex;
case 'o':
if (what == MODE_ADD)
IRCstats.operators++;
if (what == MODE_DEL)
IRCstats.operators--;
goto setmodex;
case 'd':
if (parv[3] && isdigit(*parv[3]))
{
-29
View File
@@ -581,32 +581,3 @@ char *inetntop(af, in, out, the_size)
return out;
}
#endif
extern int Rha;
/*
* Disconnect all users connected to local server incase of /restart slow
* (development tool to test load conditions, should be turned off in releases)
*/
int rh(void)
{
int fd;
return 0;
/* test if this is an development release, just for security -
we test if there is a Unreal*l, as it would be Unreal3.1-Silverheart(devel)
should really be an define, but i need it to be !DEVELOP as well,
for testing phases at irc.ircsystems.net
*/
if (!is_enabled("Unreal*l*", Rh VERSIONONLY))
return 0;
for (fd = 0; fd < MAXCONNECTIONS; fd++)
{
close(fd);
}
Rha = 1;
save_tunefile();
}
+907 -1
View File
@@ -1 +1,907 @@
Binary file win32.c matches
/************************************************************************
/************************************************************************
* IRC - Internet Relay Chat, win32.c
* Copyright (C) 1996 Daniel Hazelbaker
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 1, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef lint
static char sccsid[] = "@(#)win32.c 2.01 10/21/96 (C) 1996 Daniel Hazelbaker";
#endif
#define APPNAME "wIRCD"
#define wTITLEBAR "UnrealIRCd"
// Windows Header Files:
#include "common.h"
#include <windows.h>
#include <commctrl.h>
#include <process.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <memory.h>
#include <io.h>
#include <fcntl.h>
#include "struct.h"
#include "sys.h"
#include <sys/types.h>
#include <sys/stat.h>
#include "h.h"
#include "version.h"
#include "resource.h"
#include "CioFunc.h"
ID_CVS("$Id$");
BOOL InitApplication(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK FrameWndProc(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK About(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK Dlg_IRCDCONF(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK Dlg_IRCDMOTD(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
LRESULT CALLBACK Dlg_IRCDRULES(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
BOOL DisplayString(HWND hWnd, char *InBuf, ...);
void LoadSetup(void);
void SaveSetup(void);
int SetDebugLevel(HWND hWnd, int NewLevel);
LRESULT CALLBACK Credits(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK Dreamforge(HWND, UINT, WPARAM, LPARAM);
LRESULT CALLBACK IRCDLicense(HWND, UINT, WPARAM, LPARAM);
extern void SocketLoop(void *dummy), s_rehash(), do_dns_async(HANDLE id);
extern int localdie(void), InitwIRCD(int argc, char *argv[]);
HINSTANCE hInst; // current instance
char szAppName[] = APPNAME; // The name of this application
char szTitle[] = wTITLEBAR; // The title bar text
HWND hwIRCDWnd=NULL, hCio=NULL;
HANDLE hMainThread = 0;
#ifndef IRCDTOTALVERSION
#define IRCDTOTALVERSION BASE_VERSION PATCH1 PATCH2 PATCH3 PATCH4 PATCH5 PATCH6 PATCH7 PATCH8 PATCH9
#endif
/*
* FUNCTION: WinMain(HANDLE, HANDLE, LPSTR, int)
*
* PURPOSE: Entry point for the application.
*
* COMMENTS:
*
* This function initializes the application and processes the
* message loop.
*/
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
HANDLE hAccelTable;
int argc=1;
char *s, *argv[20], String[128];
if (!hPrevInstance)
if (!InitApplication(hInstance))
return (FALSE);
if (!InitInstance(hInstance, nCmdShow))
return (FALSE);
argv[0] = "WIRCD.EXE";
if ( *(s = lpCmdLine) )
{
argv[argc++] = s;
while ( (s = strchr(s, ' ')) != NULL )
{
while ( *s == ' ' ) *s++ = 0;
argv[argc++] = s;
}
}
argv[argc] = NULL;
if ( InitwIRCD(argc, argv) != 1 )
return FALSE;
wsprintf(String, "UnrealIRCd/32 - %s", me.name);
SetWindowText(hwIRCDWnd, String);
SetDebugLevel(hwIRCDWnd, debuglevel);
hMainThread = (HANDLE)_beginthread(SocketLoop, 0, NULL);
hAccelTable = LoadAccelerators (hInstance, szAppName);
LoadSetup();
atexit(SaveSetup);
/* Say we are ready to recieve connections */
wsprintf(String, "%c%c%c%c[info] -=-=[ UnrealIRCd/32 v%s Ready ] - %s\r", 0,0,0,0, VERSIONONLY);
DisplayString(hCio, String);
/* Main message loop */
while (GetMessage(&msg, NULL, 0, 0))
{
if ( !TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (msg.wParam);
lpCmdLine; /* This will prevent 'unused formal parameter' warnings */
}
/*
* FUNCTION: InitApplication(HANDLE)
*
* PURPOSE: Initializes window data and registers window class
*
* COMMENTS:
*
* In this function, we initialize a window class by filling out a data
* structure of type WNDCLASS and calling either RegisterClass or
* the internal MyRegisterClass.
*/
BOOL InitApplication(HINSTANCE hInstance)
{
WNDCLASS wc;
// Fill in window class structure.
wc.style = CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc = (WNDPROC)FrameWndProc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hInstance = hInstance;
wc.hIcon = LoadIcon (hInstance, APPNAME);
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
wc.hbrBackground = (HBRUSH)GetStockObject(BLACK_BRUSH);
wc.lpszMenuName = szAppName;
wc.lpszClassName = szAppName;
if ( !RegisterClass(&wc) ) return 0;
return 1;
}
/*
* FUNCTION: InitInstance(HANDLE, int)
*
* PURPOSE: Saves instance handle and creates main window
*
* COMMENTS:
*
* In this function, we save the instance handle in a global variable and
* create and display the main program window.
*/
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
HWND hWnd;
WSADATA WSAData;
if ( WSAStartup(MAKEWORD(1, 1), &WSAData) != 0 )
{
MessageBox(NULL, "UnrealIRCD/32 Init Error", "Unable to initialize WinSock DLL", MB_OK);
return FALSE;
}
hInst = hInstance; /* Store instance handle in our global variable */
if ( !Cio_Init(hInst) )
{
MessageBox(NULL, "UnrealIRCD/32 Init Error", "Couldn't Init CIO Library", MB_OK);
return FALSE;
}
hWnd = CreateWindow(szAppName, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0,
NULL, NULL, hInstance, NULL);
if ( !hWnd )
return (FALSE);
ShowWindow(hWnd, nCmdShow);
UpdateWindow(hwIRCDWnd = hWnd);
return (TRUE);
}
/*
* FUNCTION: FrameWndProc(HWND, unsigned, WORD, LONG)
*
* PURPOSE: Processes messages for the main window.
*
*/
LRESULT CALLBACK FrameWndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
int wmId, wmEvent;
char *xx = NULL;
switch (message)
{
case WM_CREATE:
hCio = Cio_Create(hInst, hWnd, WS_VISIBLE, 0, 0, 300, 200);
xx = MyMalloc(1024);
sprintf(xx, "%c%c%c%c[info] -=-=[ UnrealIRCd/32 v%s Loading ]-=-=\r", 0, 0, 0, 0,
VERSIONONLY);
DisplayString(hCio, xx);
#ifdef WIN32_SPECIFY
sprintf(xx, "%c%c%c%c[info] - Ported by %s", 0,0,0,0, WIN32_PORTER);
DisplayString(hCio, xx);
sprintf(xx, "%c%c%c%c[info] - %s", 0,0,0,0, WIN32_URL);
DisplayString(hCio, xx);
#endif
MyFree(xx);
return 0;
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId)
{
case IDM_ABOUT:
DialogBox(hInst, "AboutBox", hWnd, (DLGPROC)About);
break;
case IDM_CREDITS:
DialogBox(hInst, "AboutBox", hWnd, (DLGPROC)Credits);
break;
case IDM_DF:
DialogBox(hInst, "AboutBox", hWnd, (DLGPROC)Dreamforge);
break;
case IDM_LICENSE:
DialogBox(hInst, "AboutBox", hWnd, (DLGPROC)IRCDLicense);
break;
case IDM_IRCDCONF:
DialogBox(hInst, "DLG_IRCDCONF", hWnd, (DLGPROC)Dlg_IRCDCONF);
break;
case IDM_IRCDMOTD:
DialogBox(hInst, "DLG_IRCDMOTD", hWnd, (DLGPROC)Dlg_IRCDMOTD);
break;
case IDM_IRCDRULES:
DialogBox(hInst, "DLG_IRCDRULES", hWnd, (DLGPROC)Dlg_IRCDRULES);
break;
case IDM_REHASH:
s_rehash();
break;
case IDM_EXIT:
if ( MessageBox(hWnd, "Are you sure?",
"Terminate UnrealIRCD/32",
MB_ICONQUESTION | MB_YESNO) == IDNO )
break;
DestroyWindow(hWnd);
break;
case IDM_DBGOFF:
case IDM_DBGFATAL:
case IDM_DBGERROR:
case IDM_DBGNOTICE:
case IDM_DBGDNS:
case IDM_DBGINFO:
case IDM_DBGNUM:
case IDM_DBGSEND:
case IDM_DBGDEBUG:
case IDM_DBGMALLOC:
case IDM_DBGLIST:
SetDebugLevel(hWnd, wmId-IDM_DBGFATAL);
break;
default:
return (DefWindowProc(hWnd, message, wParam, lParam));
}
break;
case WM_CLOSE:
if ( MessageBox(hWnd, "Are you sure?", "Terminate UnrealIRCd/32",
MB_ICONQUESTION | MB_YESNO) == IDNO )
break;
return (DefWindowProc(hWnd, message, wParam, lParam));
case WM_DESTROY:
localdie(); /* Never returns */
PostQuitMessage(0);
break;
case WM_SIZE:
SetWindowPos(hCio, NULL, 0, 0, LOWORD(lParam), HIWORD(lParam),
SWP_NOZORDER);
/* Fallthrough to get the default handling too. */
default:
return (DefWindowProc(hWnd, message, wParam, lParam));
}
return (0);
}
/*
* FUNCTION: About(HWND, unsigned, WORD, LONG)
*
* PURPOSE: Processes messages for "About" dialog box
* This version allows greater flexibility over the contents of the 'About' box,
* by pulling out values from the 'Version' resource.
*
* MESSAGES:
*
* WM_INITDIALOG - initialize dialog box
* WM_COMMAND - Input received
*
*/
LRESULT CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
#define Ccat strcat(String, String2)
{
char String[16384], String2[16384], **s = infotext;
sprintf(String, "%s\n%s", version, creation);
SetDlgItemText(hDlg, IDC_VERSION, String);
String[0] = 0; String2[0] = 0;
sprintf(String2, "-=-=-=-=-=-==-==- %s -=-=-==-==-=-=-=-=-=-\r\n", ircnetwork); Ccat;
sprintf(String2, "|Web Page: | http://www.%s\r\n", netdomain); Ccat;
sprintf(String2, "|FTP Archive: | ftp://ftp.%s\r\n", netdomain); Ccat;
sprintf(String2, "|Help channel: | %s\r\n", helpchan); Ccat;
sprintf(String2, "|=-=-=-=-=-==-==|-=-=-=-=-=-=-==-==-=-=-=-=-=-=-=\r\n"); Ccat;
sprintf(String2, "|IRCd version: | %s\r\n", IRCDTOTALVERSION); Ccat;
sprintf(String2, "| Developers: | Stskeeps <stskeeps@tspre.org>\r\n"); Ccat;
sprintf(String2, "| | codemastr <codemastr@tspre.org>\r\n"); Ccat;
#if defined(_WIN32) && defined(WIN32_SPECIFY)
sprintf(String2, "| Win32 Porter: | %s\r\n", WIN32_PORTER); Ccat;
sprintf(String2, "| >>URL: | %s\r\n", WIN32_URL); Ccat;
#endif
sprintf(String2, "|Credits: | Type /Credits\r\n"); Ccat;
sprintf(String2, "|DALnet Credits:| Type /DALinfo\r\n"); Ccat;
sprintf(String2, "-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r\n"); Ccat;
sprintf(String2, "| Unreal IRCd can be downloaded at http://unreal.tspre.org\r\n"); Ccat;
sprintf(String2, "| This notice may not be removed from the IRCd package\r\n"); Ccat;
sprintf(String2, "| It will be a violation of copyright. This program must always stay free of charge\r\n"); Ccat;
sprintf(String2, "| being sold commercially or privately\r\n"); Ccat;
sprintf(String2, "| Only charge may be for the transport medium like on CD-ROM, floppy\r\n"); Ccat;
sprintf(String2, "| or other kinds (-Stskeeps'1999)\r\n"); Ccat;
sprintf(String2, "--------------------------------------------\r\n"); Ccat;
SetDlgItemText(hDlg, IDC_INFOTEXT, String);
#undef Ccat
ShowWindow (hDlg, SW_SHOW);
return (TRUE);
}
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, TRUE);
return (TRUE);
}
break;
}
return FALSE;
}
/*
* FUNCTION: Credits(HWND, unsigned, WORD, LONG)
*
* PURPOSE: Processes messages for "Credits" dialog box
* This version allows greater flexibility over the contents of the 'Credits' box,
* by pulling out values from the 'Version' resource.
*
* MESSAGES:
*
* WM_INITDIALOG - initialize dialog box
* WM_COMMAND - Input received
*
*/
LRESULT CALLBACK Credits(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
{
char String[16384], **s = unrealcredits;
sprintf(String, "%s\n%s", version, creation);
SetDlgItemText(hDlg, IDC_VERSION, String);
String[0] = 0;
while ( *s )
{
strcat(String, *s++);
if ( *s )
strcat(String, "\r\n");
}
SetDlgItemText(hDlg, IDC_INFOTEXT, String);
ShowWindow (hDlg, SW_SHOW);
return (TRUE);
}
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, TRUE);
return (TRUE);
}
break;
}
return FALSE;
}
/*
* FUNCTION: Dreamforge(HWND, unsigned, WORD, LONG)
*
* PURPOSE: Processes messages for "Dreamforge" dialog box
* This version allows greater flexibility over the contents of the 'Dreamforge' box,
* by pulling out values from the 'Version' resource.
*
* MESSAGES:
*
* WM_INITDIALOG - initialize dialog box
* WM_COMMAND - Input received
*
*/
LRESULT CALLBACK Dreamforge(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
{
char String[16384], **s = dalinfotext;
sprintf(String, "%s\n%s", version, creation);
SetDlgItemText(hDlg, IDC_VERSION, String);
String[0] = 0;
while ( *s )
{
strcat(String, *s++);
if ( *s )
strcat(String, "\r\n");
}
SetDlgItemText(hDlg, IDC_INFOTEXT, String);
ShowWindow (hDlg, SW_SHOW);
return (TRUE);
}
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, TRUE);
return (TRUE);
}
break;
}
return FALSE;
}
/*
* FUNCTION: IRCDLicense(HWND, unsigned, WORD, LONG)
*
* PURPOSE: Processes messages for "IRCDLicense" dialog box
* This version allows greater flexibility over the contents of the 'IRCDLicense' box,
* by pulling out values from the 'Version' resource.
*
* MESSAGES:
*
* WM_INITDIALOG - initialize dialog box
* WM_COMMAND - Input received
*
*/
LRESULT CALLBACK IRCDLicense(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
{
char String[16384], **s = gnulicense;
sprintf(String, "%s\n%s", version, creation);
SetDlgItemText(hDlg, IDC_VERSION, String);
String[0] = 0;
while ( *s )
{
strcat(String, *s++);
if ( *s )
strcat(String, "\r\n");
}
SetDlgItemText(hDlg, IDC_INFOTEXT, String);
ShowWindow (hDlg, SW_SHOW);
return (TRUE);
}
case WM_COMMAND:
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
{
EndDialog(hDlg, TRUE);
return (TRUE);
}
break;
}
return FALSE;
}
/*
* FUNCTION: Dlg_IrcdConf(HWND, unsigned, WORD, LONG)
*
* PURPOSE: Processes messages for "DLG_IRCDCONF" dialog box
*
*/
LRESULT CALLBACK Dlg_IRCDCONF(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
{
char *Buffer = MyMalloc(65535); /* Should be big enough */
int fd, Len;
if ( !Buffer )
{
MessageBox(hDlg, "Error: Could not allocate temporary buffer",
"UnrealIRCd/32 Setup", MB_OK);
EndDialog(hDlg, FALSE);
return FALSE;
}
/* Open the ircd.conf file */
fd = open(CONFIGFILE, _O_RDONLY | _O_BINARY);
if ( fd == -1 )
{
MessageBox(hDlg, "Error: Could not open configuration file",
"UnrealIRCd/32 Setup", MB_OK);
MyFree(Buffer);
EndDialog(hDlg, FALSE);
return FALSE;
}
Buffer[0] = 0; /* Incase read() fails */
Len = read(fd, Buffer, 65535);
Buffer[Len] = 0;
/* Set the text for the edit control to what was in the file */
SendDlgItemMessage(hDlg, IDC_IRCDCONF, WM_SETTEXT, 0,
(LPARAM)(LPCTSTR)Buffer);
close(fd);
MyFree(Buffer);
}
return (TRUE);
case WM_COMMAND:
if ( LOWORD(wParam) == IDOK )
{
char *Buffer = MyMalloc(65535); /* Should be big enough */
DWORD Len;
int fd;
if ( !Buffer )
{
MessageBox(hDlg, "Error: Could not allocate temporary buffer",
"UnrealIRCD/32 Setup", MB_OK);
return TRUE;
}
/* Open the ircd.conf file */
fd = open(CONFIGFILE, _O_TRUNC|_O_CREAT|_O_RDWR|_O_BINARY,
S_IREAD|S_IWRITE);
if ( fd == -1 )
{
MessageBox(hDlg, "Error: Could not open configuration file",
"UnrealIRCD/32 Setup", MB_OK);
MyFree(Buffer);
return TRUE;
}
/* Get the text from the edit control and save it to disk. */
Len = SendDlgItemMessage(hDlg, IDC_IRCDCONF, WM_GETTEXT, 65535,
(LPARAM)(LPCTSTR)Buffer);
write(fd, Buffer, Len);
close(fd);
MyFree(Buffer);
EndDialog(hDlg, TRUE);
return TRUE;
}
if ( LOWORD(wParam) == IDCANCEL )
{
EndDialog(hDlg, FALSE);
return TRUE;
}
break;
}
return FALSE;
}
/*
* FUNCTION: Dlg_Dlg_IRCdMotd(HWND, unsigned, WORD, LONG)
*
* PURPOSE: Processes messages for "DLG_IRCDCONF" dialog box
*
*/
LRESULT CALLBACK Dlg_IRCDMOTD(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
{
char *Buffer = MyMalloc(65535*2); /* Should be big enough */
int fd, Len;
if ( !Buffer )
{
MessageBox(hDlg, "Error: Could not allocate temporary buffer",
"UnrealIRCd/32 Setup", MB_OK);
EndDialog(hDlg, FALSE);
return FALSE;
}
/* Open the ircd.motd file */
fd = open(MPATH, _O_RDONLY | _O_BINARY);
if ( fd == -1 )
{
MessageBox(hDlg, "Error: Could not open MOTD file",
"UnrealIRCd/32 Setup", MB_OK);
MyFree(Buffer);
EndDialog(hDlg, FALSE);
return FALSE;
}
Buffer[0] = 0; /* Incase read() fails */
Len = read(fd, Buffer, 65535);
Buffer[Len] = 0;
/* Set the text for the edit control to what was in the file */
SendDlgItemMessage(hDlg, IDC_IRCDCONF, WM_SETTEXT, 0,
(LPARAM)(LPCTSTR)Buffer);
close(fd);
MyFree(Buffer);
}
return (TRUE);
case WM_COMMAND:
if ( LOWORD(wParam) == IDOK )
{
char *Buffer = MyMalloc(65535); /* Should be big enough */
DWORD Len;
int fd;
if ( !Buffer )
{
MessageBox(hDlg, "Error: Could not allocate temporary buffer",
"UnrealIRCD/32 Setup", MB_OK);
return TRUE;
}
/* Open the ircd.motd file */
fd = open(MPATH, _O_TRUNC|_O_CREAT|_O_RDWR|_O_BINARY,
S_IREAD|S_IWRITE);
if ( fd == -1 )
{
MessageBox(hDlg, "Error: Could not open motd file",
"UnrealIRCD/32 Setup", MB_OK);
MyFree(Buffer);
return TRUE;
}
/* Get the text from the edit control and save it to disk. */
Len = SendDlgItemMessage(hDlg, IDC_IRCDCONF, WM_GETTEXT, 65535,
(LPARAM)(LPCTSTR)Buffer);
write(fd, Buffer, Len);
close(fd);
MyFree(Buffer);
EndDialog(hDlg, TRUE);
return TRUE;
}
if ( LOWORD(wParam) == IDCANCEL )
{
EndDialog(hDlg, FALSE);
return TRUE;
}
break;
}
return FALSE;
}
/*
* FUNCTION: Dlg_IRCdRules(HWND, unsigned, WORD, LONG)
*
* PURPOSE: Processes messages for "DLG_IRCDCONF" dialog box
*
*/
LRESULT CALLBACK Dlg_IRCDRULES(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
switch (message)
{
case WM_INITDIALOG:
{
char *Buffer = MyMalloc(65535*2); /* Should be big enough */
int fd, Len;
if ( !Buffer )
{
MessageBox(hDlg, "Error: Could not allocate temporary buffer",
"UnrealIRCd/32 Setup", MB_OK);
EndDialog(hDlg, FALSE);
return FALSE;
}
/* Open the ircd.rules file */
fd = open(RPATH, _O_RDONLY | _O_BINARY);
if ( fd == -1 )
{
MessageBox(hDlg, "Error: Could not open rules file",
"UnrealIRCd/32 Setup", MB_OK);
MyFree(Buffer);
EndDialog(hDlg, FALSE);
return FALSE;
}
Buffer[0] = 0; /* Incase read() fails */
Len = read(fd, Buffer, 65535);
Buffer[Len] = 0;
/* Set the text for the edit control to what was in the file */
SendDlgItemMessage(hDlg, IDC_IRCDCONF, WM_SETTEXT, 0,
(LPARAM)(LPCTSTR)Buffer);
close(fd);
MyFree(Buffer);
}
return (TRUE);
case WM_COMMAND:
if ( LOWORD(wParam) == IDOK )
{
char *Buffer = MyMalloc(65535); /* Should be big enough */
DWORD Len;
int fd;
if ( !Buffer )
{
MessageBox(hDlg, "Error: Could not allocate temporary buffer",
"UnrealIRCD/32 Setup", MB_OK);
return TRUE;
}
/* Open the ircd.rules file */
fd = open(RPATH, _O_TRUNC|_O_CREAT|_O_RDWR|_O_BINARY,
S_IREAD|S_IWRITE);
if ( fd == -1 )
{
MessageBox(hDlg, "Error: Could not open rules file",
"UnrealIRCD/32 Setup", MB_OK);
MyFree(Buffer);
return TRUE;
}
/* Get the text from the edit control and save it to disk. */
Len = SendDlgItemMessage(hDlg, IDC_IRCDCONF, WM_GETTEXT, 65535,
(LPARAM)(LPCTSTR)Buffer);
write(fd, Buffer, Len);
close(fd);
MyFree(Buffer);
EndDialog(hDlg, TRUE);
return TRUE;
}
if ( LOWORD(wParam) == IDCANCEL )
{
EndDialog(hDlg, FALSE);
return TRUE;
}
break;
}
return FALSE;
}
int DisplayString(HWND hWnd, char *InBuf, ...)
{
CioWndInfo *CWI;
va_list argptr;
char *Buffer=NULL, *Ptr=NULL;
DWORD Len=0, TLen=0, Off=0, i=0;
BYTE Red=0, Green=0, Blue=0;
BOOL Bold = FALSE;
if ( (Buffer = LocalAlloc(LPTR, 16384)) == NULL ) return FALSE;
va_start(argptr, InBuf);
Len = vsprintf(Buffer, InBuf, argptr);
va_end(argptr);
if ( Len == 0 )
{
LocalFree(Buffer);
return FALSE;
}
CWI = (CioWndInfo *)GetWindowLong(hWnd, GWL_USER);
for ( i = 0; i < Len; i++ )
{
if ( Buffer[i] == 0 )
{
i+=3;
continue;
}
if ( Buffer[i] == 0x02 )
{
if ( !Bold )
{
Buffer[i] = 0;
Cio_Puts(hWnd, Buffer+Off, i-Off);
Red = CWI->FR;
Green = CWI->FG;
Blue = CWI->FB;
Off=i+1;
Cio_PrintF(hWnd, "%c%c%c%c", 0, 255, 32, 32);
Bold = 1;
continue;
}
if ( Bold )
{
Buffer[i] = 0;
Cio_Puts(hWnd, Buffer+Off, i-Off);
Off=i+1;
Cio_PrintF(hWnd, "%c%c%c%c", 0, Red, Green, Blue);
Bold = 0;
continue;
}
}
}
Cio_Puts(hWnd, Buffer+Off, Len-Off);
LocalFree(Buffer);
return TRUE;
}
void LoadSetup(void)
{
}
void SaveSetup(void)
{
}
int SetDebugLevel(HWND hWnd, int NewLevel)
{
HMENU hMenu = GetMenu(hWnd);
if ( !hMenu || !(hMenu = GetSubMenu(hMenu, 1)) ||
!(hMenu = GetSubMenu(hMenu, 4)) )
return -1;
CheckMenuItem(hMenu, IDM_DBGFATAL+debuglevel,
MF_BYCOMMAND | MF_UNCHECKED);
debuglevel = NewLevel;
CheckMenuItem(hMenu,IDM_DBGFATAL+debuglevel,
MF_BYCOMMAND | MF_CHECKED);
return debuglevel;
}
+8 -1
View File
@@ -8,11 +8,18 @@
#
# NO WARRANTY IS INCLUDED
CURRENT_VERSION="Unreal3.1-Silverheart"
WHATYAWANT="wget"
clear
cat .UPDATE
cd src
rm update.sh
wget http://unreal.tspre.org/update.sh
read $WHATYAWANT
if [ "$WHATYWANT" == "wget" ] ; then
wget http://unreal.tspre.org/update.sh
else
lynx -source http://unreal.tspre.org/update.sh > update.sh
fi
chmod +x update.sh
export CURRENT_VERSION
./update.sh