]> arthur.barton.de Git - ngircd.git/commitdiff
Merge branch 'bug109-CHARCONV'
authorAlexander Barton <alex@barton.de>
Sat, 6 Oct 2012 16:25:43 +0000 (18:25 +0200)
committerAlexander Barton <alex@barton.de>
Sat, 6 Oct 2012 16:26:25 +0000 (18:26 +0200)
This closes bug #109.

* bug109-CHARCONV:
  Debian: require "telnet" or "telnet-ssl" for building
  Debian ngircd-full[-dbg]: enable CHARCONV
  Add "CHARCONV" to "feature string" when enabled
  Implement new IRC+ "CHARCONV" command
  Added new configure option "--with-iconv"

Conflicts:
src/ngircd/messages.h

46 files changed:
.gitignore
INSTALL
Makefile.am
autogen.sh
configure.in [deleted file]
configure.ng [new file with mode: 0644]
contrib/MacOSX/config.h
doc/Makefile.am
doc/Modes.txt
doc/sample-ngircd.conf.tmpl
man/ngircd.conf.5.tmpl
src/ipaddr/.gitignore [new file with mode: 0644]
src/ipaddr/Makefile.am [deleted file]
src/ipaddr/Makefile.ng [new file with mode: 0644]
src/ngircd/.gitignore
src/ngircd/Makefile.am [deleted file]
src/ngircd/Makefile.ng [new file with mode: 0644]
src/ngircd/channel.c
src/ngircd/conf-ssl.h
src/ngircd/conf.c
src/ngircd/conf.h
src/ngircd/conn-ssl.c
src/ngircd/defines.h
src/ngircd/irc-channel.c
src/ngircd/irc-info.c
src/ngircd/irc-login.c
src/ngircd/irc-mode.c
src/ngircd/irc-op.c
src/ngircd/irc-oper.c
src/ngircd/irc-server.c
src/ngircd/messages.h
src/ngircd/ngircd.c
src/ngircd/numeric.c
src/portab/.gitignore
src/portab/Makefile.am [deleted file]
src/portab/Makefile.ng [new file with mode: 0644]
src/testsuite/.gitignore
src/testsuite/Makefile.am [deleted file]
src/testsuite/Makefile.ng [new file with mode: 0644]
src/testsuite/getpid.sh
src/testsuite/mode-test.e
src/testsuite/stress-server.sh
src/testsuite/tests.sh
src/tool/.gitignore [new file with mode: 0644]
src/tool/Makefile.am [deleted file]
src/tool/Makefile.ng [new file with mode: 0644]

index 19900414b6c60c2f68888aba8dfe734a26aefc01..e7ab75802c8ad942e1c9b14cf048733aeb2f2ffb 100644 (file)
@@ -4,11 +4,13 @@ aclocal.m4
 ansi2knr.1
 ansi2knr.c
 ansi2knr.h
+ar-lib
 autom4te.cache
 build-stamp-ngircd*
 config.log
 config.status
 configure
+configure.ac
 configure.lineno
 cscope.out
 debian
diff --git a/INSTALL b/INSTALL
index 4e1cd2fb7916e779824b1bb08077ff278061fd0c..b445958159e85bdd03cc4b6328c1c59bb0938df1 100644 (file)
--- a/INSTALL
+++ b/INSTALL
 I. Upgrade Information
 ~~~~~~~~~~~~~~~~~~~~~~
 
+Differences to version 19.x
+
+- Starting with ngIRCd 20, users can "cloak" their hostname only when the
+  configuration variable "CloakHostModeX" (introduced in 19.2) is set.
+  Otherwise, only IRC opertators, other servers, and services are allowed to
+  set mode +x. This prevents regular users from changing their hostmask to
+  the name of the IRC server itself, which confused quite a few people ;-)
+
 Differences to version 17
 
 - Support for ZeroConf/Bonjour/Rendezvous service registration has been
@@ -149,10 +157,14 @@ This step is therefore only interesting for developers.
 
 autogen.sh produces the Makefile.in's, which are necessary for the configure
 script itself, and some more files for make. To run autogen.sh you'll need
-GNU autoconf and GNU automake (use recent versions! autoconf 2.53 and
-automake 1.6.1 are known to work).
-
-Again: "end users" do not need this step!
+GNU autoconf and GNU automake: at least autoconf 2.61 and automake 1.10 are
+requird, newer is better. But don't use automake 1.12 or newer for creating
+distribution archives: it will work but lack "de-ANSI-fucation" support in the
+generated Makefile's! Stick with automake 1.11.x for this purpose ...
+So automake 1.11.x and autoconf 2.67+ is recommended.
+
+Again: "end users" do not need this step and neither need GNU autoconf nor GNU
+automake at all!
 
 
 2): "./configure"
index 58f202c959cc7a8d42c9ede26453819e7751e15f..f6a97ce638e71e352c8e351ac88b3386ec14039e 100644 (file)
@@ -1,6 +1,6 @@
 #
 # ngIRCd -- The Next Generation IRC Daemon
-# Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors
+# Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors
 #
 # 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
@@ -13,24 +13,26 @@ AUTOMAKE_OPTIONS = gnu
 
 SUBDIRS = doc src man contrib
 
+EXTRA_DIST = autogen.sh configure.ng .mailmap
+
 clean-local:
        rm -f build-stamp*
        rm -rf ngircd.dest
 
 maintainer-clean-local:
        rm -rf autom4te.cache
-       rm -f Makefile.in Makefile aclocal.m4 configure
-       rm -f mkinstalldirs missing depcomp install-sh
+       rm -f Makefile.in Makefile aclocal.m4 configure configure.ac
+       rm -f ar-lib mkinstalldirs missing depcomp install-sh
        rm -f config.log debian
 
 testsuite:
-       make -C src/testsuite check
+       cd src/testsuite && make check
 
 lint:
-       make -C src/ngircd lint
+       cd src/ngircd && make lint
 
 srcdoc:
-       make -C doc srcdoc
+       cd doc && make srcdoc
 
 have-xcodebuild:
        @xcodebuild -project contrib/MacOSX/ngIRCd.xcodeproj -list \
index cca200b2a452d02478224566f135fdf0b8ca4eed..6c2a8dd16b2c94fa7caced4af559bb1e1f76a315 100755 (executable)
 # GNU autoconf. It tries to be smart in finding the correct/usable/available
 # installed versions of these tools on your system.
 #
+# In addition, it enables or disables the "de-ANSI-fication" support of GNU
+# automake, which is supported up to autoconf 1.11.x an has been removed
+# in automake 1.12 -- make sure to use a version of automake supporting it
+# when generating distribution archives!
+#
 # The following strategy is used for each of aclocal, autoheader, automake,
 # and autoconf: first, "tool" (the regular name of the tool, e. g. "autoconf"
 # or "automake") is checked. If this fails, "tool<major><minor>" (for example
@@ -129,7 +134,7 @@ fi
 
 # Try to detect the needed tools when no environment variable already
 # specifies one:
-echo "Searching tools ..."
+echo "Searching for required tools ..."
 [ -z "$ACLOCAL" ] && ACLOCAL=`Search aclocal 1`
 [ "$VERBOSE" = "1" ] && echo " - ACLOCAL=$ACLOCAL"
 [ -z "$AUTOHEADER" ] && AUTOHEADER=`Search autoheader 2`
@@ -139,9 +144,8 @@ echo "Searching tools ..."
 [ -z "$AUTOCONF" ] && AUTOCONF=`Search autoconf 2`
 [ "$VERBOSE" = "1" ] && echo " - AUTOCONF=$AUTOCONF"
 
-# Call ./configure when parameters have been passed to this script and
-# GO isn't already defined.
-[ -z "$GO" -a $# -gt 0 ] && GO=1
+[ $# -gt 0 ] && CONFIGURE_ARGS=" $@" || CONFIGURE_ARGS=""
+[ -z "$GO" -a -n "$CONFIGURE_ARGS" ] && GO=1
 
 # Verify that all tools have been found
 [ -z "$ACLOCAL" ] && Notfound aclocal
@@ -149,10 +153,37 @@ echo "Searching tools ..."
 [ -z "$AUTOMAKE" ] && Notfound automake
 [ -z "$AUTOCONF" ] && Notfound autoconf
 
+AM_VERSION=`$AUTOMAKE --version|head -n 1|egrep -o "([1-9]\.[0-9]+(\.[0-9]+)*)"`
+ifs=$IFS; IFS="."; set $AM_VERSION; IFS=$ifs
+AM_MAJOR="$1"; AM_MINOR="$2"; AM_PATCHLEVEL="$3"
+
+AM_MAKEFILES="src/ipaddr/Makefile.ng src/ngircd/Makefile.ng src/testsuite/Makefile.ng src/tool/Makefile.ng"
+
+if [ "$AM_MAJOR" -eq "1" -a "$AM_MINOR" -lt "12" ]; then
+       # automake < 1.12 => automatic de-ANSI-fication support available
+       echo "Enabling de-ANSI-fication support (automake $AM_VERSION) ..."
+       sed -e "s|^__ng_PROTOTYPES__|AM_C_PROTOTYPES|g" configure.ng >configure.ac
+       DEANSI_START=""
+       DEANSI_END=""
+else
+       # automake >= 1.12 => no de-ANSI-fication support available
+       echo "Disabling de-ANSI-fication support (automake $AM_VERSION) ..."
+       sed -e "s|^__ng_PROTOTYPES__|AC_C_PROTOTYPES|g" configure.ng >configure.ac
+       DEANSI_START="#"
+       DEANSI_END="    # disabled by ./autogen.sh script"
+fi
+sed -e "s|^__ng_Makefile_am_template__|${DEANSI_START}AUTOMAKE_OPTIONS = ansi2knr${DEANSI_END}|g" \
+       src/portab/Makefile.ng >src/portab/Makefile.am
+for makefile_ng in $AM_MAKEFILES; do
+       makefile_am=`echo "$makefile_ng" | sed -e "s|\.ng\$|\.am|g"`
+       sed -e "s|^__ng_Makefile_am_template__|${DEANSI_START}AUTOMAKE_OPTIONS = ../portab/ansi2knr${DEANSI_END}|g" \
+               $makefile_ng >$makefile_am
+done
+
 export ACLOCAL AUTOHEADER AUTOMAKE AUTOCONF
 
 # Generate files
-echo "Generating files ..."
+echo "Generating files using GNU $AUTOCONF and $AUTOMAKE ..."
 Run $ACLOCAL && \
        Run $AUTOCONF && \
        Run $AUTOHEADER && \
@@ -164,8 +195,7 @@ if [ $? -eq 0 -a -x ./configure ]; then
        NAME=`grep PACKAGE_STRING= configure | cut -d"'" -f2`
        if [ "$GO" = "1" ]; then
                [ -n "$PREFIX" ] && p=" --prefix=$PREFIX" || p=""
-               [ -n "$*" ] && a=" $*" || a=""
-               c="./configure${p}${a}"
+               c="./configure${p}${CONFIGURE_ARGS}"
                echo "Okay, autogen.sh for $NAME done."
                echo "Calling \"$c\" ..."
                $c
diff --git a/configure.in b/configure.in
deleted file mode 100644 (file)
index cccda86..0000000
+++ /dev/null
@@ -1,704 +0,0 @@
-#
-# ngIRCd -- The Next Generation IRC Daemon
-# Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors
-#
-# 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 of the License, or
-# (at your option) any later version.
-# Please read the file COPYING, README and AUTHORS for more information.
-#
-
-define(VERSION_ID,esyscmd(git describe|sed -e 's/rel-//g'|sed -e 's/-/~/'|tr -d \\n))
-
-# -- Initialisation --
-
-AC_PREREQ([2.67])
-AC_INIT([ngIRCd], VERSION_ID,
-       [ngircd-ml@ngircd.barton.de], [ngircd], [http://ngircd.barton.de/])
-
-AC_CONFIG_SRCDIR([src/ngircd/ngircd.c])
-AC_CONFIG_HEADER([src/config.h])
-AC_CANONICAL_HOST
-
-AM_INIT_AUTOMAKE([1.11])
-
-m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
-
-# -- Templates for config.h --
-
-AH_TEMPLATE([DEBUG], [Define if debug-mode should be enabled])
-AH_TEMPLATE([HAVE_sockaddr_in_len], [Define if sockaddr_in.sin_len exists])
-AH_TEMPLATE([HAVE_socklen_t], [Define if socklen_t exists])
-AH_TEMPLATE([ICONV], [Define if libiconv can be used, e.g. for CHARCONV])
-AH_TEMPLATE([IDENTAUTH], [Define if the server should do IDENT requests])
-AH_TEMPLATE([IRCPLUS], [Define if IRC+ protocol should be used])
-AH_TEMPLATE([PAM], [Define if PAM should be used])
-AH_TEMPLATE([SNIFFER], [Define if IRC sniffer should be enabled])
-AH_TEMPLATE([STRICT_RFC], [Define if ngIRCd should behave strict RFC compliant])
-AH_TEMPLATE([SYSLOG], [Define if syslog should be used for logging])
-AH_TEMPLATE([TCPWRAP], [Define if TCP wrappers should be used])
-AH_TEMPLATE([WANT_IPV6], [Define if IPV6 protocol should be enabled])
-AH_TEMPLATE([ZLIB], [Define if zlib compression should be enabled])
-
-AH_TEMPLATE([HOST_OS], [Target operating system name])
-AH_TEMPLATE([HOST_VENDOR], [Target system vendor])
-AH_TEMPLATE([HOST_CPU], [Target CPU name])
-
-# -- C Compiler --
-
-AC_PROG_CC
-AC_PROG_CC_STDC
-
-# -- Helper programs --
-
-AC_PROG_AWK
-AC_PROG_INSTALL
-AC_PROG_LN_S
-AC_PROG_MAKE_SET
-AC_PROG_RANLIB
-
-# -- Compiler Features --
-
-AC_C_CONST
-AC_C_INLINE
-AM_C_PROTOTYPES
-
-# -- Hard coded system and compiler dependencies/features/options ... --
-
-AC_DEFUN([GCC_STACK_PROTECT_CC],[
-  ssp_cc=yes
-  # we use -fstack-protector-all for the test to enfoce the use of the guard variable 
-  AC_MSG_CHECKING([whether ${CC} accepts -fstack-protector])
-  ssp_old_cflags="$CFLAGS"
-  CFLAGS="$CFLAGS -fstack-protector-all"
-  AC_TRY_LINK(,,, ssp_cc=no)
-  echo $ssp_cc
-  CFLAGS="$ssp_old_cflags"
-  if test "X$ssp_cc" = "Xyes"; then
-      CFLAGS="$CFLAGS -fstack-protector"
-      AC_DEFINE([ENABLE_SSP_CC], 1, [Define if SSP C support is enabled.])
-  fi
-])
-
-if test "$GCC" = "yes"; then
-       # We are using the GNU C compiler. Good!
-       CFLAGS="$CFLAGS -pipe -W -Wall -Wpointer-arith -Wstrict-prototypes"
-
-       GCC_STACK_PROTECT_CC
-fi
-
-case "$host_os" in
-       hpux*)
-               # This is HP/UX, we need to define _XOPEN_SOURCE_EXTENDED
-               # (tested with HP/UX 11.11)
-               CFLAGS="$CFLAGS -D_XOPEN_SOURCE_EXTENDED"
-               ;;
-esac
-
-# Add additional CFLAGS, eventually specified on the command line:
-test -n "$CFLAGS_ADD" && CFLAGS="$CFLAGS $CFLAGS_ADD"
-
-CFLAGS="$CFLAGS -DSYSCONFDIR='\"\$(sysconfdir)\"'"
-
-# -- Headers --
-
-AC_HEADER_STDC
-AC_HEADER_SYS_WAIT
-AC_HEADER_TIME
-
-# Required header files
-AC_CHECK_HEADERS([ \
-       fcntl.h netdb.h netinet/in.h netinet/in_systm.h stdlib.h string.h \
-       strings.h sys/socket.h sys/time.h unistd.h \
-       ],,AC_MSG_ERROR([required C header missing!]))
-
-# Optional header files
-AC_CHECK_HEADERS_ONCE([ \
-       arpa/inet.h inttypes.h malloc.h netinet/ip.h stdbool.h stddef.h \
-       stdint.h varargs.h \
-       ])
-
-# -- Datatypes --
-
-AC_MSG_CHECKING(whether socklen_t exists)
-AC_TRY_COMPILE([
-#include <sys/types.h>
-#include <sys/socket.h>
-       ],[
-       socklen_t a, b;
-       a = 2; b = 4; a += b;
-       ],[
-       AC_DEFINE(HAVE_socklen_t) AC_MSG_RESULT(yes)
-       ],[
-       AC_MSG_RESULT(no)
-])
-
-AC_TYPE_PID_T
-AC_TYPE_SIGNAL
-AC_TYPE_SIZE_T
-AC_TYPE_SSIZE_T
-AC_TYPE_UID_T
-AC_TYPE_UINT16_T
-AC_TYPE_UINT32_T
-AC_TYPE_UINT8_T
-
-AC_CHECK_MEMBER([struct sockaddr_in.sin_len], AC_DEFINE(HAVE_sockaddr_in_len),,
- [#include <arpa/inet.h>])
-
-# -- Libraries --
-
-# memmove: A/UX libUTIL
-AC_SEARCH_LIBS([memmove], [UTIL], [], [
-       AC_MSG_ERROR([unable to find the memmove() function])
-])
-# gethostbyname: Solaris libnsl
-AC_SEARCH_LIBS([gethostbyname], [nsl], [], [
-       AC_MSG_ERROR([unable to find the gethostbyname() function])
-])
-# bind: SVR4 libsocket
-AC_SEARCH_LIBS([bind], [socket], [], [
-       AC_MSG_ERROR([unable to find the bind() function])
-])
-
-# -- Functions --
-
-AC_FUNC_FORK
-AC_FUNC_STRFTIME
-
-# Required functions
-AC_CHECK_FUNCS([ \
-       alarm dup2 endpwent gethostbyaddr gethostbyname gethostname \
-       gettimeofday inet_ntoa memmove memset setsid socket strcasecmp \
-       strchr strcspn strerror strncasecmp strrchr strspn strstr \
-       ],,
-       AC_MSG_ERROR([required function missing!]))
-
-# Optional functions
-AC_CHECK_FUNCS_ONCE([ \
-       gai_strerror getaddrinfo getnameinfo inet_aton sigaction sigprocmask \
-       snprintf vsnprintf strdup strlcpy strlcat strtok_r waitpid])
-
-# -- Configuration options --
-
-# use syslog?
-
-x_syslog_on=no
-AC_ARG_WITH(syslog,
-       AS_HELP_STRING([--without-syslog],
-                      [disable syslog (autodetected by default)]),
-       [       if test "$withval" != "no"; then
-                       if test "$withval" != "yes"; then
-                               CFLAGS="-I$withval/include $CFLAGS"
-                               CPPFLAGS="-I$withval/include $CPPFLAGS"
-                               LDFLAGS="-L$withval/lib $LDFLAGS"
-                       fi
-                       AC_SEARCH_LIBS([syslog], [be], [x_syslog_on=yes], [
-                               AC_MSG_ERROR([Can't enable syslog!])
-                       ])
-               fi
-       ],
-       [       AC_SEARCH_LIBS([syslog], [be], [x_syslog_on=yes])
-       ]
-)
-if test "$x_syslog_on" = "yes"; then
-       AC_DEFINE(SYSLOG, 1)
-       AC_CHECK_HEADERS(syslog.h,,AC_MSG_ERROR([required C header missing!]))
-fi
-
-# use zlib compression?
-
-x_zlib_on=no
-AC_ARG_WITH(zlib,
-       AS_HELP_STRING([--without-zlib],
-                      [disable zlib compression (autodetected by default)]),
-       [       if test "$withval" != "no"; then
-                       if test "$withval" != "yes"; then
-                               CFLAGS="-I$withval/include $CFLAGS"
-                               CPPFLAGS="-I$withval/include $CPPFLAGS"
-                               LDFLAGS="-L$withval/lib $LDFLAGS"
-                       fi
-                       AC_CHECK_LIB(z, deflate)
-                       AC_CHECK_FUNCS(deflate, x_zlib_on=yes,
-                               AC_MSG_ERROR([Can't enable zlib!])
-                       )
-               fi
-       ],
-       [       AC_CHECK_LIB(z, deflate)
-               AC_CHECK_FUNCS(deflate, x_zlib_on=yes)
-       ]
-)
-if test "$x_zlib_on" = "yes"; then
-       AC_DEFINE(ZLIB, 1)
-       AC_CHECK_HEADERS(zlib.h,,AC_MSG_ERROR([required C header missing!]))
-fi
-
-# detect which IO API to use:
-
-x_io_backend=none
-
-AC_ARG_WITH(select,
-       AS_HELP_STRING([--without-select],
-                      [disable select IO support (autodetected by default)]),
-       [       if test "$withval" != "no"; then
-                       if test "$withval" != "yes"; then
-                               CFLAGS="-I$withval/include $CFLAGS"
-                               CPPFLAGS="-I$withval/include $CPPFLAGS"
-                               LDFLAGS="-L$withval/lib $LDFLAGS"
-                       fi
-                       AC_CHECK_FUNCS(select, x_io_select=yes,
-                               AC_MSG_ERROR([Can't enable select IO support!])
-                       )
-               fi
-       ],
-       [
-               AC_CHECK_FUNCS(select, x_io_select=yes)
-       ]
-)
-
-AC_ARG_WITH(poll,
-       AS_HELP_STRING([--without-poll],
-                      [disable poll support (autodetected by default)]),
-       [       if test "$withval" != "no"; then
-                       if test "$withval" != "yes"; then
-                               CFLAGS="-I$withval/include $CFLAGS"
-                               CPPFLAGS="-I$withval/include $CPPFLAGS"
-                               LDFLAGS="-L$withval/lib $LDFLAGS"
-                       fi
-                       AC_CHECK_FUNCS(poll, [
-                               AC_CHECK_HEADERS(poll.h,
-                                       x_io_backend=poll\(\),
-                                       AC_MSG_ERROR(
-                                            [Can't enable poll IO support!])
-                               )
-                       ], [
-                               AC_MSG_ERROR([Can't enable poll IO support!])
-                       ])
-               fi
-       ],
-       [
-               AC_CHECK_FUNCS(poll, [
-                       AC_CHECK_HEADERS(poll.h, x_io_backend=poll\(\))
-               ])
-       ]
-)
-
-AC_ARG_WITH(devpoll,
-       AS_HELP_STRING([--without-devpoll],
-                      [disable /dev/poll IO support (autodetected by default)]),
-       [       if test "$withval" != "no"; then
-                       if test "$withval" != "yes"; then
-                               CFLAGS="-I$withval/include $CFLAGS"
-                               CPPFLAGS="-I$withval/include $CPPFLAGS"
-                               LDFLAGS="-L$withval/lib $LDFLAGS"
-                       fi
-
-                               AC_CHECK_HEADERS(sys/devpoll.h,,AC_MSG_ERROR([required C header missing!]))
-               fi
-       ],
-       [
-               AC_CHECK_HEADERS(sys/devpoll.h, x_io_backend=/dev/poll)
-       ]
-)
-
-AC_ARG_WITH(epoll,
-       AS_HELP_STRING([--without-epoll],
-                      [disable epoll IO support (autodetected by default)]),
-       [       if test "$withval" != "no"; then
-                       if test "$withval" != "yes"; then
-                               CFLAGS="-I$withval/include $CFLAGS"
-                               CPPFLAGS="-I$withval/include $CPPFLAGS"
-                               LDFLAGS="-L$withval/lib $LDFLAGS"
-                       fi
-                       AC_CHECK_FUNCS(epoll_create, x_io_epoll=yes,
-                               AC_MSG_ERROR([Can't enable epoll IO support!])
-                       )
-               fi
-       ],
-       [
-               AC_CHECK_FUNCS(epoll_create, x_io_epoll=yes)
-       ]
-)
-
-AC_ARG_WITH(kqueue,
-       AS_HELP_STRING([--without-kqueue],
-                      [disable kqueue IO support (autodetected by default)]),
-       [       if test "$withval" != "no"; then
-                       if test "$withval" != "yes"; then
-                               CFLAGS="-I$withval/include $CFLAGS"
-                               CPPFLAGS="-I$withval/include $CPPFLAGS"
-                               LDFLAGS="-L$withval/lib $LDFLAGS"
-                       fi
-                       AC_CHECK_FUNCS(kqueue, x_io_backend=kqueue\(\),
-                               AC_MSG_ERROR([Can't enable kqueue IO support!])
-                       )
-               fi
-       ],
-       [
-               AC_CHECK_FUNCS(kqueue, x_io_backend=kqueue\(\))
-       ]
-)
-
-if test "$x_io_epoll" = "yes" -a "$x_io_select" = "yes"; then
-       # when epoll() and select() are available, we'll use both!
-       x_io_backend="epoll(), select()"
-else
-       if test "$x_io_epoll" = "yes"; then
-               # we prefere epoll() if it is available
-               x_io_backend="epoll()"
-       else
-               if test "$x_io_select" = "yes" -a "$x_io_backend" = "none"; then
-                       # we'll use select, when available and no "better"
-                       # interface has been detected ...
-                       x_io_backend="select()"
-               fi
-       fi
-fi
-
-if test "$x_io_backend" = "none"; then
-       AC_MSG_ERROR([No useable IO API activated/found!?])
-fi
-
-# use SSL?
-
-AC_ARG_WITH(openssl,
-       AS_HELP_STRING([--with-openssl],
-                      [enable SSL support using OpenSSL]),
-       [       if test "$withval" != "no"; then
-                       if test "$withval" != "yes"; then
-                               CFLAGS="-I$withval/include $CFLAGS"
-                               CPPFLAGS="-I$withval/include $CPPFLAGS"
-                               LDFLAGS="-L$withval/lib $LDFLAGS"
-                       fi
-                       AC_CHECK_LIB(crypto, BIO_s_mem)
-                       AC_CHECK_LIB(ssl, SSL_library_init)
-                       AC_CHECK_FUNCS(SSL_library_init, x_ssl_openssl=yes,
-                               AC_MSG_ERROR([Can't enable openssl])
-                       )
-               fi
-       ]
-)
-
-AC_ARG_WITH(gnutls,
-       AS_HELP_STRING([--with-gnutls],
-                      [enable SSL support using gnutls]),
-       [       if test "$withval" != "no"; then
-                       if test "$withval" != "yes"; then
-                               CFLAGS="-I$withval/include $CFLAGS"
-                               CPPFLAGS="-I$withval/include $CPPFLAGS"
-                               LDFLAGS="-L$withval/lib $LDFLAGS"
-                       fi
-                       AC_CHECK_LIB(gnutls, gnutls_global_init)
-                       AC_CHECK_FUNCS(gnutls_global_init, x_ssl_gnutls=yes,
-                               AC_MSG_ERROR([Can't enable gnutls])
-                       )
-               fi
-       ]
-)
-
-x_ssl_lib="no"
-if test "$x_ssl_gnutls" = "yes"; then
-       if test "$x_ssl_openssl" = "yes";then
-               AC_MSG_ERROR([Cannot enable both gnutls and openssl])
-       fi
-       x_ssl_lib=gnutls
-fi
-if test "$x_ssl_openssl" = "yes"; then
-       x_ssl_lib=openssl
-fi
-
-# use TCP wrappers?
-
-x_tcpwrap_on=no
-AC_ARG_WITH(tcp-wrappers,
-       AS_HELP_STRING([--with-tcp-wrappers],
-                      [enable TCP wrappers support]),
-       [       if test "$withval" != "no"; then
-                       if test "$withval" != "yes"; then
-                               CFLAGS="-I$withval/include $CFLAGS"
-                               CPPFLAGS="-I$withval/include $CPPFLAGS"
-                               LDFLAGS="-L$withval/lib $LDFLAGS"
-                       fi
-                       AC_MSG_CHECKING(for hosts_access)
-                       LIBS="-lwrap $LIBS"
-                       AC_TRY_LINK([
-#include <tcpd.h>
-int allow_severity = 0;
-int deny_severity = 0;
-                               ],[
-                               tcpd_warn("link test");
-                               ],[
-                               AC_MSG_RESULT(yes)
-                               AC_DEFINE(TCPWRAP, 1)
-                               x_tcpwrap_on=yes
-                               ],[
-                               AC_MSG_RESULT(no)
-                               AC_MSG_ERROR([Can't enable TCP wrappers!])
-                       ])
-               fi
-       ]
-)
-
-# do IDENT requests using libident?
-
-x_identauth_on=no
-AC_ARG_WITH(ident,
-       AS_HELP_STRING([--with-ident],
-                      [enable "IDENT" ("AUTH") protocol support]),
-       [       if test "$withval" != "no"; then
-                       if test "$withval" != "yes"; then
-                               CFLAGS="-I$withval/include $CFLAGS"
-                               CPPFLAGS="-I$withval/include $CPPFLAGS"
-                               LDFLAGS="-L$withval/lib $LDFLAGS"
-                       fi
-                       AC_CHECK_LIB(ident, ident_id)
-                       AC_CHECK_FUNCS(ident_id, x_identauth_on=yes,
-                               AC_MSG_ERROR([Can't enable IDENT support!])
-                       )
-               fi
-       ]
-)
-if test "$x_identauth_on" = "yes"; then
-       AC_DEFINE(IDENTAUTH, 1)
-       AC_CHECK_HEADERS(ident.h,,AC_MSG_ERROR([required C header missing!]))
-fi
-
-# compile in PAM support?
-
-x_pam_on=no
-AC_ARG_WITH(pam,
-       AS_HELP_STRING([--with-pam],
-                      [enable user authentication using PAM]),
-       [       if test "$withval" != "no"; then
-                       if test "$withval" != "yes"; then
-                               CFLAGS="-I$withval/include $CFLAGS"
-                               CPPFLAGS="-I$withval/include $CPPFLAGS"
-                               LDFLAGS="-L$withval/lib $LDFLAGS"
-                       fi
-                       AC_CHECK_LIB(pam, pam_authenticate)
-                       AC_CHECK_FUNCS(pam_authenticate, x_pam_on=yes,
-                               AC_MSG_ERROR([Can't enable PAM support!])
-                       )
-               fi
-       ]
-)
-if test "$x_pam_on" = "yes"; then
-       AC_DEFINE(PAM, 1)
-       AC_CHECK_HEADERS(security/pam_appl.h,pam_ok=yes)
-       if test "$pam_ok" != "yes"; then
-               AC_CHECK_HEADERS(pam/pam_appl.h,pam_ok=yes,
-                       AC_MSG_ERROR([required C header missing!]))
-       fi
-fi
-
-# compile in IRC+ protocol support?
-
-x_ircplus_on=yes
-AC_ARG_ENABLE(ircplus,
-       AS_HELP_STRING([--disable-ircplus],
-                      [disable IRC+ protocol]),
-       if test "$enableval" = "no"; then x_ircplus_on=no; fi
-)
-if test "$x_ircplus_on" = "yes"; then
-       AC_DEFINE(IRCPLUS, 1)
-
-       # Compile in iconv support?
-       # We only check for it when IRC+ is enabled, because the IRC+ command
-       # CHARCONV is the only function depending on it.
-       x_iconv_on=no
-       AC_ARG_WITH(iconv,
-               [  --with-iconv            enable character conversation using libiconv],
-               [ if test "$withval" != "no"; then
-                       if test "$withval" != "yes"; then
-                               CFLAGS="-I$withval/include $CFLAGS"
-                               CPPFLAGS="-I$withval/include $CPPFLAGS"
-                               LDFLAGS="-L$withval/lib $LDFLAGS"
-                       fi
-                       AC_CHECK_LIB(iconv, iconv_open)
-                       AC_CHECK_FUNCS(iconv_open, x_iconv_on=yes,
-                               AC_MSG_ERROR([Can't enable libiconv support!])
-                       )
-                 fi
-               ]
-       )
-       if test "$x_iconv_on" = "yes"; then
-               AC_DEFINE(ICONV, 1)
-       fi
-fi
-
-# enable support for IPv6?
-x_ipv6_on=no
-AC_ARG_ENABLE(ipv6,
-       AS_HELP_STRING([--enable-ipv6],
-                      [enable IPv6 protocol support]),
-       if test "$enableval" = "yes"; then x_ipv6_on=yes; fi
-)
-if test "$x_ipv6_on" = "yes"; then
-       # getaddrinfo() and getnameinfo() are optional when not compiling
-       # with IPv6 support, but are required for IPv6 to work!
-       AC_CHECK_FUNCS([ \
-               getaddrinfo getnameinfo \
-               ],,AC_MSG_ERROR([required function missing for IPv6 support!]))
-       AC_DEFINE(WANT_IPV6, 1)
-fi
-
-# compile in IRC "sniffer"?
-
-x_sniffer_on=no; x_debug_on=no
-AC_ARG_ENABLE(sniffer,
-       AS_HELP_STRING([--enable-sniffer],
-                      [enable IRC traffic sniffer (enables debug mode)]),
-       if test "$enableval" = "yes"; then
-               AC_DEFINE(SNIFFER, 1)
-               x_sniffer_on=yes; x_debug_on=yes
-       fi
-)
-
-# enable additional debugging code?
-
-AC_ARG_ENABLE(debug,
-       AS_HELP_STRING([--enable-debug],
-                      [show additional debug output]),
-       if test "$enableval" = "yes"; then x_debug_on=yes; fi
-)
-if test "$x_debug_on" = "yes"; then
-       AC_DEFINE(DEBUG, 1)
-       test "$GCC" = "yes" && CFLAGS="-pedantic $CFLAGS"
-       AC_CHECK_FUNCS(mtrace)
-fi
-
-# enable "strict RFC rules"?
-
-x_strict_rfc_on=no
-AC_ARG_ENABLE(strict-rfc,
-       AS_HELP_STRING([--enable-strict-rfc],
-                      [strict RFC conformance -- may break clients!]),
-       if test "$enableval" = "yes"; then
-               AC_DEFINE(STRICT_RFC, 1)
-               x_strict_rfc_on=yes
-       fi
-)
-
-# -- Definitions --
-
-AC_DEFINE_UNQUOTED(HOST_CPU, "$host_cpu" )
-AC_DEFINE_UNQUOTED(HOST_VENDOR, "$host_vendor" )
-AC_DEFINE_UNQUOTED(HOST_OS, "$host_os" )
-
-# Add additional CFLAGS, eventually specified on the command line, but after
-# running this configure script. Useful for "-Werror" for example.
-test -n "$CFLAGS_END" && CFLAGS="$CFLAGS $CFLAGS_END"
-
-# -- Generate files --
-
-AC_CONFIG_FILES([ \
-       Makefile \
-       contrib/Anope/Makefile \
-       contrib/Debian/Makefile \
-       contrib/MacOSX/Makefile \
-       contrib/MacOSX/ngIRCd.pmdoc/Makefile \
-       contrib/MacOSX/ngIRCd.xcodeproj/Makefile \
-       contrib/Makefile \
-       doc/Makefile \
-       doc/src/Makefile \
-       man/Makefile \
-       src/ipaddr/Makefile \
-       src/Makefile \
-       src/ngircd/Makefile \
-       src/portab/Makefile \
-       src/testsuite/Makefile \
-       src/tool/Makefile \
-])
-
-AC_OUTPUT
-
-type dpkg >/dev/null 2>&1
-if test $? -eq 0; then
-       # Generate debian/ link if the dpkg command exists
-       # (read: if we are running on a debian compatible system)
-       echo "creating Debian-specific links ..."
-       test -f debian/rules || ln -s contrib/Debian debian
-fi
-
-# -- Result --
-
-echo
-echo "ngIRCd $PACKAGE_VERSION has been configured with the following options:"
-echo
-
-# Someone please show me a better way :)  [borrowed by OpenSSH]
-B=`eval echo ${bindir}` ; B=`eval echo ${B}`
-S=`eval echo ${sbindir}` ; S=`eval echo ${S}`
-C=`eval echo ${sysconfdir}` ; C=`eval echo ${C}`
-M=`eval echo ${mandir}` ; M=`eval echo ${M}`
-D=`eval echo ${docdir}` ; D=`eval echo ${D}`
-
-echo "               Host: ${host}"
-echo "           Compiler: ${CC}"
-test -n "$CFLAGS"      && echo "     Compiler flags: ${CFLAGS}"
-test -n "$CPPFLAGS"    && echo " Preprocessor flags: ${CPPFLAGS}"
-test -n "$LDFLAGS"     && echo "       Linker flags: ${LDFLAGS}"
-test -n "$LIBS"                && echo "          Libraries: ${LIBS}"
-echo
-echo "    'ngircd' binary: $S"
-echo " Configuration file: $C"
-echo "       Manual pages: $M"
-echo "      Documentation: $D"
-echo
-
-echo $ECHO_N "     Syslog support: $ECHO_C"
-test "$x_syslog_on" = "yes" \
-       && echo $ECHO_N "yes   $ECHO_C" \
-       || echo $ECHO_N "no    $ECHO_C"
-echo $ECHO_N "  Enable debug code: $ECHO_C"
-test "$x_debug_on" = "yes" \
-       && echo "yes" \
-       || echo "no"
-
-echo $ECHO_N "   zlib compression: $ECHO_C"
-test "$x_zlib_on" = "yes" \
-       && echo $ECHO_N "yes   $ECHO_C" \
-       || echo $ECHO_N "no    $ECHO_C"
-echo $ECHO_N "        IRC sniffer: $ECHO_C"
-test "$x_sniffer_on" = "yes" \
-       && echo "yes" \
-       || echo "no"
-
-echo $ECHO_N "   Use TCP Wrappers: $ECHO_C"
-test "$x_tcpwrap_on" = "yes" \
-       && echo $ECHO_N "yes   $ECHO_C" \
-       || echo $ECHO_N "no    $ECHO_C"
-echo $ECHO_N "    Strict RFC mode: $ECHO_C"
-test "$x_strict_rfc_on" = "yes" \
-       && echo "yes" \
-       || echo "no"
-
-echo $ECHO_N "      IDENT support: $ECHO_C"
-test "$x_identauth_on" = "yes" \
-       && echo $ECHO_N "yes   $ECHO_C" \
-       || echo $ECHO_N "no    $ECHO_C"
-echo $ECHO_N "      IRC+ protocol: $ECHO_C"
-test "$x_ircplus_on" = "yes" \
-       && echo "yes" \
-       || echo "no"
-
-echo $ECHO_N "      IPv6 protocol: $ECHO_C"
-test "$x_ipv6_on" = "yes" \
-       && echo $ECHO_N "yes   $ECHO_C" \
-       || echo $ECHO_N "no    $ECHO_C"
-echo $ECHO_N "        I/O backend: $ECHO_C"
-       echo "\"$x_io_backend\""
-
-echo $ECHO_N "        PAM support: $ECHO_C"
-test "$x_pam_on" = "yes" \
-       && echo $ECHO_N "yes   $ECHO_C" \
-       || echo $ECHO_N "no    $ECHO_C"
-echo $ECHO_N "        SSL support: $ECHO_C"
-echo "$x_ssl_lib"
-
-echo $ECHO_N "   libiconv support: $ECHO_C"
-       echo "$x_iconv_on"
-
-echo
-
-# -eof-
diff --git a/configure.ng b/configure.ng
new file mode 100644 (file)
index 0000000..a3cab6a
--- /dev/null
@@ -0,0 +1,723 @@
+#
+# ngIRCd -- The Next Generation IRC Daemon
+# Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors
+#
+# 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 of the License, or
+# (at your option) any later version.
+# Please read the file COPYING, README and AUTHORS for more information.
+#
+
+define(VERSION_ID,esyscmd([
+       V=`git describe 2>/dev/null | sed -e 's/rel-//g' | sed -e 's/-/~/'`;
+       [ -z "$V" -a -r configure ] \
+               && V=`grep "PACKAGE_STRING=" configure | cut -d"'" -f2 | cut -d' ' -f2`
+       ( [ -n "$V" ] && echo "$V" || echo "??" ) | tr -d '\n';
+]))
+
+m4_ifdef([AM_SILENT_RULES],
+       [m4_define([ng_color_tests], [color-tests])],
+       [m4_define([ng_color_tests], [])])
+
+# -- Initialisation --
+
+AC_PREREQ([2.61])
+AC_INIT([ngIRCd], VERSION_ID,
+       [ngircd-ml@ngircd.barton.de], [ngircd], [http://ngircd.barton.de/])
+
+AC_CONFIG_SRCDIR([src/ngircd/ngircd.c])
+AC_CONFIG_HEADER([src/config.h])
+AC_CANONICAL_HOST
+
+AM_INIT_AUTOMAKE([-Wall 1.10 ]ng_color_tests)
+
+m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
+
+# -- Templates for config.h --
+
+AH_TEMPLATE([DEBUG], [Define if debug-mode should be enabled])
+AH_TEMPLATE([HAVE_sockaddr_in_len], [Define if sockaddr_in.sin_len exists])
+AH_TEMPLATE([HAVE_socklen_t], [Define if socklen_t exists])
+AH_TEMPLATE([ICONV], [Define if libiconv can be used, e.g. for CHARCONV])
+AH_TEMPLATE([IDENTAUTH], [Define if the server should do IDENT requests])
+AH_TEMPLATE([IRCPLUS], [Define if IRC+ protocol should be used])
+AH_TEMPLATE([PAM], [Define if PAM should be used])
+AH_TEMPLATE([SNIFFER], [Define if IRC sniffer should be enabled])
+AH_TEMPLATE([STRICT_RFC], [Define if ngIRCd should behave strict RFC compliant])
+AH_TEMPLATE([SYSLOG], [Define if syslog should be used for logging])
+AH_TEMPLATE([TCPWRAP], [Define if TCP wrappers should be used])
+AH_TEMPLATE([WANT_IPV6], [Define if IPV6 protocol should be enabled])
+AH_TEMPLATE([ZLIB], [Define if zlib compression should be enabled])
+
+AH_TEMPLATE([HOST_OS], [Target operating system name])
+AH_TEMPLATE([HOST_VENDOR], [Target system vendor])
+AH_TEMPLATE([HOST_CPU], [Target CPU name])
+
+# -- C Compiler --
+
+AC_PROG_CC
+AC_PROG_CC_STDC
+
+# -- Helper programs --
+
+m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
+
+AC_PROG_AWK
+AC_PROG_INSTALL
+AC_PROG_LN_S
+AC_PROG_MAKE_SET
+AC_PROG_RANLIB
+
+# -- Compiler Features --
+
+AC_C_CONST
+AC_C_INLINE
+__ng_PROTOTYPES__
+
+# -- Hard coded system and compiler dependencies/features/options ... --
+
+AC_DEFUN([GCC_STACK_PROTECT_CC],[
+  ssp_cc=yes
+  # we use -fstack-protector-all for the test to enfoce the use of the guard variable 
+  AC_MSG_CHECKING([whether ${CC} accepts -fstack-protector])
+  ssp_old_cflags="$CFLAGS"
+  CFLAGS="$CFLAGS -fstack-protector-all"
+  AC_TRY_LINK(,,, ssp_cc=no)
+  echo $ssp_cc
+  CFLAGS="$ssp_old_cflags"
+  if test "X$ssp_cc" = "Xyes"; then
+      CFLAGS="$CFLAGS -fstack-protector"
+      AC_DEFINE([ENABLE_SSP_CC], 1, [Define if SSP C support is enabled.])
+  fi
+])
+
+if test "$GCC" = "yes"; then
+       # We are using the GNU C compiler. Good!
+       CFLAGS="$CFLAGS -pipe -W -Wall -Wpointer-arith -Wstrict-prototypes"
+
+       GCC_STACK_PROTECT_CC
+fi
+
+case "$host_os" in
+       hpux*)
+               # This is HP/UX, we need to define _XOPEN_SOURCE_EXTENDED
+               # (tested with HP/UX 11.11)
+               CFLAGS="$CFLAGS -D_XOPEN_SOURCE_EXTENDED"
+               ;;
+esac
+
+# Add additional CFLAGS, eventually specified on the command line:
+test -n "$CFLAGS_ADD" && CFLAGS="$CFLAGS $CFLAGS_ADD"
+
+CFLAGS="$CFLAGS -DSYSCONFDIR='\"\$(sysconfdir)\"'"
+
+# -- Headers --
+
+AC_HEADER_STDC
+AC_HEADER_SYS_WAIT
+AC_HEADER_TIME
+
+# Required header files
+AC_CHECK_HEADERS([ \
+       fcntl.h netdb.h netinet/in.h netinet/in_systm.h stdlib.h string.h \
+       strings.h sys/socket.h sys/time.h unistd.h \
+       ],,AC_MSG_ERROR([required C header missing!]))
+
+# Optional header files
+AC_CHECK_HEADERS_ONCE([ \
+       arpa/inet.h inttypes.h malloc.h netinet/ip.h stdbool.h stddef.h \
+       stdint.h varargs.h \
+       ])
+
+# -- Datatypes --
+
+AC_MSG_CHECKING(whether socklen_t exists)
+AC_TRY_COMPILE([
+#include <sys/types.h>
+#include <sys/socket.h>
+       ],[
+       socklen_t a, b;
+       a = 2; b = 4; a += b;
+       ],[
+       AC_DEFINE(HAVE_socklen_t) AC_MSG_RESULT(yes)
+       ],[
+       AC_MSG_RESULT(no)
+])
+
+AC_TYPE_PID_T
+AC_TYPE_SIGNAL
+AC_TYPE_SIZE_T
+AC_TYPE_SSIZE_T
+AC_TYPE_UID_T
+AC_TYPE_UINT16_T
+AC_TYPE_UINT32_T
+AC_TYPE_UINT8_T
+
+AC_CHECK_MEMBER([struct sockaddr_in.sin_len], AC_DEFINE(HAVE_sockaddr_in_len),,
+ [#include <arpa/inet.h>])
+
+# -- Libraries --
+
+# memmove: A/UX libUTIL
+AC_SEARCH_LIBS([memmove], [UTIL], [], [
+       AC_MSG_ERROR([unable to find the memmove() function])
+])
+# gethostbyname: Solaris libnsl
+AC_SEARCH_LIBS([gethostbyname], [nsl], [], [
+       AC_MSG_ERROR([unable to find the gethostbyname() function])
+])
+# bind: SVR4 libsocket
+AC_SEARCH_LIBS([bind], [socket], [], [
+       AC_MSG_ERROR([unable to find the bind() function])
+])
+
+# -- Functions --
+
+AC_FUNC_FORK
+AC_FUNC_STRFTIME
+
+# Required functions
+AC_CHECK_FUNCS([ \
+       alarm dup2 endpwent gethostbyaddr gethostbyname gethostname \
+       gettimeofday inet_ntoa memmove memset setsid socket strcasecmp \
+       strchr strcspn strerror strncasecmp strrchr strspn strstr \
+       ],,
+       AC_MSG_ERROR([required function missing!]))
+
+# Optional functions
+AC_CHECK_FUNCS_ONCE([ \
+       gai_strerror getaddrinfo getnameinfo inet_aton sigaction sigprocmask \
+       snprintf vsnprintf strdup strlcpy strlcat strtok_r waitpid])
+
+# -- Configuration options --
+
+# use syslog?
+
+x_syslog_on=no
+AC_ARG_WITH(syslog,
+       AS_HELP_STRING([--without-syslog],
+                      [disable syslog (autodetected by default)]),
+       [       if test "$withval" != "no"; then
+                       if test "$withval" != "yes"; then
+                               CFLAGS="-I$withval/include $CFLAGS"
+                               CPPFLAGS="-I$withval/include $CPPFLAGS"
+                               LDFLAGS="-L$withval/lib $LDFLAGS"
+                       fi
+                       AC_SEARCH_LIBS([syslog], [be], [x_syslog_on=yes], [
+                               AC_MSG_ERROR([Can't enable syslog!])
+                       ])
+               fi
+       ],
+       [       AC_SEARCH_LIBS([syslog], [be], [x_syslog_on=yes])
+       ]
+)
+if test "$x_syslog_on" = "yes"; then
+       AC_DEFINE(SYSLOG, 1)
+       AC_CHECK_HEADERS(syslog.h,,AC_MSG_ERROR([required C header missing!]))
+fi
+
+# use zlib compression?
+
+x_zlib_on=no
+AC_ARG_WITH(zlib,
+       AS_HELP_STRING([--without-zlib],
+                      [disable zlib compression (autodetected by default)]),
+       [       if test "$withval" != "no"; then
+                       if test "$withval" != "yes"; then
+                               CFLAGS="-I$withval/include $CFLAGS"
+                               CPPFLAGS="-I$withval/include $CPPFLAGS"
+                               LDFLAGS="-L$withval/lib $LDFLAGS"
+                       fi
+                       AC_CHECK_LIB(z, deflate)
+                       AC_CHECK_FUNCS(deflate, x_zlib_on=yes,
+                               AC_MSG_ERROR([Can't enable zlib!])
+                       )
+               fi
+       ],
+       [       AC_CHECK_LIB(z, deflate)
+               AC_CHECK_FUNCS(deflate, x_zlib_on=yes)
+       ]
+)
+if test "$x_zlib_on" = "yes"; then
+       AC_DEFINE(ZLIB, 1)
+       AC_CHECK_HEADERS(zlib.h,,AC_MSG_ERROR([required C header missing!]))
+fi
+
+# detect which IO API to use:
+
+x_io_backend=none
+
+AC_ARG_WITH(select,
+       AS_HELP_STRING([--without-select],
+                      [disable select IO support (autodetected by default)]),
+       [       if test "$withval" != "no"; then
+                       if test "$withval" != "yes"; then
+                               CFLAGS="-I$withval/include $CFLAGS"
+                               CPPFLAGS="-I$withval/include $CPPFLAGS"
+                               LDFLAGS="-L$withval/lib $LDFLAGS"
+                       fi
+                       AC_CHECK_FUNCS(select, x_io_select=yes,
+                               AC_MSG_ERROR([Can't enable select IO support!])
+                       )
+               fi
+       ],
+       [
+               AC_CHECK_FUNCS(select, x_io_select=yes)
+       ]
+)
+
+AC_ARG_WITH(poll,
+       AS_HELP_STRING([--without-poll],
+                      [disable poll support (autodetected by default)]),
+       [       if test "$withval" != "no"; then
+                       if test "$withval" != "yes"; then
+                               CFLAGS="-I$withval/include $CFLAGS"
+                               CPPFLAGS="-I$withval/include $CPPFLAGS"
+                               LDFLAGS="-L$withval/lib $LDFLAGS"
+                       fi
+                       AC_CHECK_FUNCS(poll, [
+                               AC_CHECK_HEADERS(poll.h,
+                                       x_io_backend=poll\(\),
+                                       AC_MSG_ERROR(
+                                            [Can't enable poll IO support!])
+                               )
+                       ], [
+                               AC_MSG_ERROR([Can't enable poll IO support!])
+                       ])
+               fi
+       ],
+       [
+               AC_CHECK_FUNCS(poll, [
+                       AC_CHECK_HEADERS(poll.h, x_io_backend=poll\(\))
+               ])
+       ]
+)
+
+AC_ARG_WITH(devpoll,
+       AS_HELP_STRING([--without-devpoll],
+                      [disable /dev/poll IO support (autodetected by default)]),
+       [       if test "$withval" != "no"; then
+                       if test "$withval" != "yes"; then
+                               CFLAGS="-I$withval/include $CFLAGS"
+                               CPPFLAGS="-I$withval/include $CPPFLAGS"
+                               LDFLAGS="-L$withval/lib $LDFLAGS"
+                       fi
+
+                               AC_CHECK_HEADERS(sys/devpoll.h,,AC_MSG_ERROR([required C header missing!]))
+               fi
+       ],
+       [
+               AC_CHECK_HEADERS(sys/devpoll.h, x_io_backend=/dev/poll)
+       ]
+)
+
+AC_ARG_WITH(epoll,
+       AS_HELP_STRING([--without-epoll],
+                      [disable epoll IO support (autodetected by default)]),
+       [       if test "$withval" != "no"; then
+                       if test "$withval" != "yes"; then
+                               CFLAGS="-I$withval/include $CFLAGS"
+                               CPPFLAGS="-I$withval/include $CPPFLAGS"
+                               LDFLAGS="-L$withval/lib $LDFLAGS"
+                       fi
+                       AC_CHECK_FUNCS(epoll_create, x_io_epoll=yes,
+                               AC_MSG_ERROR([Can't enable epoll IO support!])
+                       )
+               fi
+       ],
+       [
+               AC_CHECK_FUNCS(epoll_create, x_io_epoll=yes)
+       ]
+)
+
+AC_ARG_WITH(kqueue,
+       AS_HELP_STRING([--without-kqueue],
+                      [disable kqueue IO support (autodetected by default)]),
+       [       if test "$withval" != "no"; then
+                       if test "$withval" != "yes"; then
+                               CFLAGS="-I$withval/include $CFLAGS"
+                               CPPFLAGS="-I$withval/include $CPPFLAGS"
+                               LDFLAGS="-L$withval/lib $LDFLAGS"
+                       fi
+                       AC_CHECK_FUNCS(kqueue, x_io_backend=kqueue\(\),
+                               AC_MSG_ERROR([Can't enable kqueue IO support!])
+                       )
+               fi
+       ],
+       [
+               AC_CHECK_FUNCS(kqueue, x_io_backend=kqueue\(\))
+       ]
+)
+
+if test "$x_io_epoll" = "yes" -a "$x_io_select" = "yes"; then
+       # when epoll() and select() are available, we'll use both!
+       x_io_backend="epoll(), select()"
+else
+       if test "$x_io_epoll" = "yes"; then
+               # we prefere epoll() if it is available
+               x_io_backend="epoll()"
+       else
+               if test "$x_io_select" = "yes" -a "$x_io_backend" = "none"; then
+                       # we'll use select, when available and no "better"
+                       # interface has been detected ...
+                       x_io_backend="select()"
+               fi
+       fi
+fi
+
+if test "$x_io_backend" = "none"; then
+       AC_MSG_ERROR([No useable IO API activated/found!?])
+fi
+
+# use SSL?
+
+AC_ARG_WITH(openssl,
+       AS_HELP_STRING([--with-openssl],
+                      [enable SSL support using OpenSSL]),
+       [       if test "$withval" != "no"; then
+                       if test "$withval" != "yes"; then
+                               CFLAGS="-I$withval/include $CFLAGS"
+                               CPPFLAGS="-I$withval/include $CPPFLAGS"
+                               LDFLAGS="-L$withval/lib $LDFLAGS"
+                       fi
+                       AC_CHECK_LIB(crypto, BIO_s_mem)
+                       AC_CHECK_LIB(ssl, SSL_library_init)
+                       AC_CHECK_FUNCS(SSL_library_init, x_ssl_openssl=yes,
+                               AC_MSG_ERROR([Can't enable openssl])
+                       )
+               fi
+       ]
+)
+
+AC_ARG_WITH(gnutls,
+       AS_HELP_STRING([--with-gnutls],
+                      [enable SSL support using gnutls]),
+       [       if test "$withval" != "no"; then
+                       if test "$withval" != "yes"; then
+                               CFLAGS="-I$withval/include $CFLAGS"
+                               CPPFLAGS="-I$withval/include $CPPFLAGS"
+                               LDFLAGS="-L$withval/lib $LDFLAGS"
+                       fi
+                       AC_CHECK_LIB(gnutls, gnutls_global_init)
+                       AC_CHECK_FUNCS(gnutls_global_init, x_ssl_gnutls=yes,
+                               AC_MSG_ERROR([Can't enable gnutls])
+                       )
+               fi
+       ]
+)
+
+x_ssl_lib="no"
+if test "$x_ssl_gnutls" = "yes"; then
+       if test "$x_ssl_openssl" = "yes";then
+               AC_MSG_ERROR([Cannot enable both gnutls and openssl])
+       fi
+       x_ssl_lib=gnutls
+fi
+if test "$x_ssl_openssl" = "yes"; then
+       x_ssl_lib=openssl
+fi
+
+# use TCP wrappers?
+
+x_tcpwrap_on=no
+AC_ARG_WITH(tcp-wrappers,
+       AS_HELP_STRING([--with-tcp-wrappers],
+                      [enable TCP wrappers support]),
+       [       if test "$withval" != "no"; then
+                       if test "$withval" != "yes"; then
+                               CFLAGS="-I$withval/include $CFLAGS"
+                               CPPFLAGS="-I$withval/include $CPPFLAGS"
+                               LDFLAGS="-L$withval/lib $LDFLAGS"
+                       fi
+                       AC_MSG_CHECKING(for hosts_access)
+                       LIBS="-lwrap $LIBS"
+                       AC_TRY_LINK([
+#include <tcpd.h>
+int allow_severity = 0;
+int deny_severity = 0;
+                               ],[
+                               tcpd_warn("link test");
+                               ],[
+                               AC_MSG_RESULT(yes)
+                               AC_DEFINE(TCPWRAP, 1)
+                               x_tcpwrap_on=yes
+                               ],[
+                               AC_MSG_RESULT(no)
+                               AC_MSG_ERROR([Can't enable TCP wrappers!])
+                       ])
+               fi
+       ]
+)
+
+# do IDENT requests using libident?
+
+x_identauth_on=no
+AC_ARG_WITH(ident,
+       AS_HELP_STRING([--with-ident],
+                      [enable "IDENT" ("AUTH") protocol support]),
+       [       if test "$withval" != "no"; then
+                       if test "$withval" != "yes"; then
+                               CFLAGS="-I$withval/include $CFLAGS"
+                               CPPFLAGS="-I$withval/include $CPPFLAGS"
+                               LDFLAGS="-L$withval/lib $LDFLAGS"
+                       fi
+                       AC_CHECK_LIB(ident, ident_id)
+                       AC_CHECK_FUNCS(ident_id, x_identauth_on=yes,
+                               AC_MSG_ERROR([Can't enable IDENT support!])
+                       )
+               fi
+       ]
+)
+if test "$x_identauth_on" = "yes"; then
+       AC_DEFINE(IDENTAUTH, 1)
+       AC_CHECK_HEADERS(ident.h,,AC_MSG_ERROR([required C header missing!]))
+fi
+
+# compile in PAM support?
+
+x_pam_on=no
+AC_ARG_WITH(pam,
+       AS_HELP_STRING([--with-pam],
+                      [enable user authentication using PAM]),
+       [       if test "$withval" != "no"; then
+                       if test "$withval" != "yes"; then
+                               CFLAGS="-I$withval/include $CFLAGS"
+                               CPPFLAGS="-I$withval/include $CPPFLAGS"
+                               LDFLAGS="-L$withval/lib $LDFLAGS"
+                       fi
+                       AC_CHECK_LIB(pam, pam_authenticate)
+                       AC_CHECK_FUNCS(pam_authenticate, x_pam_on=yes,
+                               AC_MSG_ERROR([Can't enable PAM support!])
+                       )
+               fi
+       ]
+)
+if test "$x_pam_on" = "yes"; then
+       AC_DEFINE(PAM, 1)
+       AC_CHECK_HEADERS(security/pam_appl.h,pam_ok=yes)
+       if test "$pam_ok" != "yes"; then
+               AC_CHECK_HEADERS(pam/pam_appl.h,pam_ok=yes,
+                       AC_MSG_ERROR([required C header missing!]))
+       fi
+fi
+
+# compile in IRC+ protocol support?
+
+x_ircplus_on=yes
+AC_ARG_ENABLE(ircplus,
+       AS_HELP_STRING([--disable-ircplus],
+                      [disable IRC+ protocol]),
+       if test "$enableval" = "no"; then x_ircplus_on=no; fi
+)
+if test "$x_ircplus_on" = "yes"; then
+       AC_DEFINE(IRCPLUS, 1)
+
+       # Compile in iconv support?
+       # We only check for it when IRC+ is enabled, because the IRC+ command
+       # CHARCONV is the only function depending on it.
+       x_iconv_on=no
+       AC_ARG_WITH(iconv,
+               [  --with-iconv            enable character conversation using libiconv],
+               [ if test "$withval" != "no"; then
+                       if test "$withval" != "yes"; then
+                               CFLAGS="-I$withval/include $CFLAGS"
+                               CPPFLAGS="-I$withval/include $CPPFLAGS"
+                               LDFLAGS="-L$withval/lib $LDFLAGS"
+                       fi
+                       AC_CHECK_LIB(iconv, iconv_open)
+                       AC_CHECK_FUNCS(iconv_open, x_iconv_on=yes,
+                               AC_MSG_ERROR([Can't enable libiconv support!])
+                       )
+                 fi
+               ]
+       )
+       if test "$x_iconv_on" = "yes"; then
+               AC_DEFINE(ICONV, 1)
+       fi
+fi
+
+# enable support for IPv6?
+x_ipv6_on=no
+AC_ARG_ENABLE(ipv6,
+       AS_HELP_STRING([--enable-ipv6],
+                      [enable IPv6 protocol support]),
+       if test "$enableval" = "yes"; then x_ipv6_on=yes; fi
+)
+if test "$x_ipv6_on" = "yes"; then
+       # getaddrinfo() and getnameinfo() are optional when not compiling
+       # with IPv6 support, but are required for IPv6 to work!
+       AC_CHECK_FUNCS([ \
+               getaddrinfo getnameinfo \
+               ],,AC_MSG_ERROR([required function missing for IPv6 support!]))
+       AC_DEFINE(WANT_IPV6, 1)
+fi
+
+# compile in IRC "sniffer"?
+
+x_sniffer_on=no; x_debug_on=no
+AC_ARG_ENABLE(sniffer,
+       AS_HELP_STRING([--enable-sniffer],
+                      [enable IRC traffic sniffer (enables debug mode)]),
+       if test "$enableval" = "yes"; then
+               AC_DEFINE(SNIFFER, 1)
+               x_sniffer_on=yes; x_debug_on=yes
+       fi
+)
+
+# enable additional debugging code?
+
+AC_ARG_ENABLE(debug,
+       AS_HELP_STRING([--enable-debug],
+                      [show additional debug output]),
+       if test "$enableval" = "yes"; then x_debug_on=yes; fi
+)
+if test "$x_debug_on" = "yes"; then
+       AC_DEFINE(DEBUG, 1)
+       test "$GCC" = "yes" && CFLAGS="-pedantic $CFLAGS"
+       AC_CHECK_FUNCS(mtrace)
+fi
+
+# enable "strict RFC rules"?
+
+x_strict_rfc_on=no
+AC_ARG_ENABLE(strict-rfc,
+       AS_HELP_STRING([--enable-strict-rfc],
+                      [strict RFC conformance -- may break clients!]),
+       if test "$enableval" = "yes"; then
+               AC_DEFINE(STRICT_RFC, 1)
+               x_strict_rfc_on=yes
+       fi
+)
+
+# -- Definitions --
+
+AC_DEFINE_UNQUOTED(HOST_CPU, "$host_cpu" )
+AC_DEFINE_UNQUOTED(HOST_VENDOR, "$host_vendor" )
+AC_DEFINE_UNQUOTED(HOST_OS, "$host_os" )
+
+# Add additional CFLAGS, eventually specified on the command line, but after
+# running this configure script. Useful for "-Werror" for example.
+test -n "$CFLAGS_END" && CFLAGS="$CFLAGS $CFLAGS_END"
+
+# -- Generate files --
+
+AC_CONFIG_FILES([ \
+       Makefile \
+       contrib/Anope/Makefile \
+       contrib/Debian/Makefile \
+       contrib/MacOSX/Makefile \
+       contrib/MacOSX/ngIRCd.pmdoc/Makefile \
+       contrib/MacOSX/ngIRCd.xcodeproj/Makefile \
+       contrib/Makefile \
+       doc/Makefile \
+       doc/src/Makefile \
+       man/Makefile \
+       src/ipaddr/Makefile \
+       src/Makefile \
+       src/ngircd/Makefile \
+       src/portab/Makefile \
+       src/testsuite/Makefile \
+       src/tool/Makefile \
+])
+
+AC_OUTPUT
+
+type dpkg >/dev/null 2>&1
+if test $? -eq 0; then
+       # Generate debian/ link if the dpkg command exists
+       # (read: if we are running on a debian compatible system)
+       echo "creating Debian-specific links ..."
+       test -f debian/rules || ln -s contrib/Debian debian
+fi
+
+# -- Result --
+
+echo
+echo "ngIRCd $PACKAGE_VERSION has been configured with the following options:"
+echo
+
+# Someone please show me a better way :)  [borrowed by OpenSSH]
+B=`eval echo ${bindir}` ; B=`eval echo ${B}`
+S=`eval echo ${sbindir}` ; S=`eval echo ${S}`
+C=`eval echo ${sysconfdir}` ; C=`eval echo ${C}`
+M=`eval echo ${mandir}` ; M=`eval echo ${M}`
+D=`eval echo ${docdir}` ; D=`eval echo ${D}`
+
+echo "               Host: ${host}"
+echo "           Compiler: ${CC}"
+test -n "$CFLAGS"      && echo "     Compiler flags: ${CFLAGS}"
+test -n "$CPPFLAGS"    && echo " Preprocessor flags: ${CPPFLAGS}"
+test -n "$LDFLAGS"     && echo "       Linker flags: ${LDFLAGS}"
+test -n "$LIBS"                && echo "          Libraries: ${LIBS}"
+echo
+echo "    'ngircd' binary: $S"
+echo " Configuration file: $C"
+echo "       Manual pages: $M"
+echo "      Documentation: $D"
+echo
+
+echo $ECHO_N "     Syslog support: $ECHO_C"
+test "$x_syslog_on" = "yes" \
+       && echo $ECHO_N "yes   $ECHO_C" \
+       || echo $ECHO_N "no    $ECHO_C"
+echo $ECHO_N "  Enable debug code: $ECHO_C"
+test "$x_debug_on" = "yes" \
+       && echo "yes" \
+       || echo "no"
+
+echo $ECHO_N "   zlib compression: $ECHO_C"
+test "$x_zlib_on" = "yes" \
+       && echo $ECHO_N "yes   $ECHO_C" \
+       || echo $ECHO_N "no    $ECHO_C"
+echo $ECHO_N "        IRC sniffer: $ECHO_C"
+test "$x_sniffer_on" = "yes" \
+       && echo "yes" \
+       || echo "no"
+
+echo $ECHO_N "   Use TCP Wrappers: $ECHO_C"
+test "$x_tcpwrap_on" = "yes" \
+       && echo $ECHO_N "yes   $ECHO_C" \
+       || echo $ECHO_N "no    $ECHO_C"
+echo $ECHO_N "    Strict RFC mode: $ECHO_C"
+test "$x_strict_rfc_on" = "yes" \
+       && echo "yes" \
+       || echo "no"
+
+echo $ECHO_N "      IDENT support: $ECHO_C"
+test "$x_identauth_on" = "yes" \
+       && echo $ECHO_N "yes   $ECHO_C" \
+       || echo $ECHO_N "no    $ECHO_C"
+echo $ECHO_N "      IRC+ protocol: $ECHO_C"
+test "$x_ircplus_on" = "yes" \
+       && echo "yes" \
+       || echo "no"
+
+echo $ECHO_N "      IPv6 protocol: $ECHO_C"
+test "$x_ipv6_on" = "yes" \
+       && echo $ECHO_N "yes   $ECHO_C" \
+       || echo $ECHO_N "no    $ECHO_C"
+echo $ECHO_N "        I/O backend: $ECHO_C"
+       echo "\"$x_io_backend\""
+
+echo $ECHO_N "        PAM support: $ECHO_C"
+test "$x_pam_on" = "yes" \
+       && echo $ECHO_N "yes   $ECHO_C" \
+       || echo $ECHO_N "no    $ECHO_C"
+echo $ECHO_N "        SSL support: $ECHO_C"
+echo "$x_ssl_lib"
+
+echo $ECHO_N "   libiconv support: $ECHO_C"
+       echo "$x_iconv_on"
+
+echo
+
+if ! grep "^AUTOMAKE_OPTIONS = ../portab/ansi2knr" src/ngircd/Makefile.am >/dev/null 2>&1; then
+       echo "WARNING:"
+       echo "This GNU automake generated build system does not support \"de-ANSI-fication\","
+       echo "therefore don't use it to generate \"official\" distribution archives!"
+       echo "(Most probably you want to use GNU automake 1.11.x for this purpose ...)"
+       echo
+fi
+
+# -eof-
index a25d88617705646a25d38b56ebde1c62d5cea9ed..bf94d327fb337e024eeb8c44501c8821e827863d 100644 (file)
 #define HAVE_GETNAMEINFO 1
 /* Define to 1 if you have the `sigaction' function. */
 #define HAVE_SIGACTION 1
+/* Define to 1 if you have the `setsid' function. */
+#define HAVE_SETSID 1
 
 /* Define if socklen_t exists */
 #define HAVE_socklen_t 1
index 00f2530ce32e716fb2d186ea9b5f5a6457d4c724..cd51d7fe0de1d1c7d73231868f32068faf96b7ba 100644 (file)
@@ -19,6 +19,7 @@ SUFFIXES = .tmpl
 static_docs = \
        Bopm.txt \
        Capabilities.txt \
+       Contributing.txt \
        FAQ.txt \
        GIT.txt \
        HowToRelease.txt \
index c2c533f2a67e1784561869cfee1ac49c5bf0fd90..e3b754d69815c1aaa0729177b25a80b35986d447 100644 (file)
@@ -68,7 +68,12 @@ channel of which he is a member.
 
   mode since   description
 
+  q    20      User is channel owner can only be set by a service, other
+               owner and irc op. Can promote other users to q, a, o, h, v.
+  a    20      User is channel admin and can promote other users to v, h, o
   o    0.2.0   User is channel operator and can op/kick/... other members.
+  h    20      User is half op and can set channel modes imntvIbek and kick
+               voiced and normal users.
   v    0.2.0   User is "voiced" and can speak even if channel is moderated.
 
 
index 57e65892054b9bd20c1d2cc309dd9ccaca1c1a41..018855d5e1f4490f92291069b635f2afa0cf9c34 100644 (file)
        # they are not(!) channel-operators?
        ;OperCanUseMode = no
 
+       # Should IRC Operators get AutoOp (+o) in persistent (+P) channels?
+       ;OperChanPAutoOp = yes
+
        # Mask IRC Operator mode requests as if they were coming from the
        # server? (This is a compatibility hack for ircd-irc2 servers)
        ;OperServerMode = no
index aff11a67bf86ec6c79d0daae9cfadeff345662f2..c03cf740b4f67cae39c38e304a38ea5cbc828309 100644 (file)
@@ -268,6 +268,10 @@ while connecting. Default: no.
 Should IRC Operators be allowed to use the MODE command even if they are
 not(!) channel-operators? Default: no.
 .TP
+\fBOperChanPAutoOp\fR (boolean)
+Should IRC Operators get AutoOp (+o) in persistent (+P) channels?
+Default: yes.
+.TP
 \fBOperServerMode\fR (boolean)
 If \fBOperCanUseMode\fR is enabled, this may lead the compatibility problems
 with Servers that run the ircd-irc2 Software. This Option "masks" mode
diff --git a/src/ipaddr/.gitignore b/src/ipaddr/.gitignore
new file mode 100644 (file)
index 0000000..08a6d72
--- /dev/null
@@ -0,0 +1 @@
+Makefile.am
diff --git a/src/ipaddr/Makefile.am b/src/ipaddr/Makefile.am
deleted file mode 100644 (file)
index 6ce299f..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-#
-# ipaddr/Makefile.am
-# (c) 2008 Florian Westphal <fw@strlen.de>, public domain.
-#
-
-AUTOMAKE_OPTIONS = ../portab/ansi2knr
-
-INCLUDES = -I$(srcdir)/../portab
-
-noinst_LIBRARIES = libngipaddr.a
-
-libngipaddr_a_SOURCES = ng_ipaddr.c
-
-noinst_HEADERS = ng_ipaddr.h
-
-maintainer-clean-local:
-       rm -f Makefile Makefile.in
-
-# -eof-
diff --git a/src/ipaddr/Makefile.ng b/src/ipaddr/Makefile.ng
new file mode 100644 (file)
index 0000000..ecfce29
--- /dev/null
@@ -0,0 +1,21 @@
+#
+# ipaddr/Makefile.am
+# (c) 2008 Florian Westphal <fw@strlen.de>, public domain.
+#
+
+__ng_Makefile_am_template__
+
+EXTRA_DIST = Makefile.ng
+
+AM_CPPFLAGS = -I$(srcdir)/../portab
+
+noinst_LIBRARIES = libngipaddr.a
+
+libngipaddr_a_SOURCES = ng_ipaddr.c
+
+noinst_HEADERS = ng_ipaddr.h
+
+maintainer-clean-local:
+       rm -f Makefile Makefile.in Makefile.am
+
+# -eof-
index c25ba5e3426f430c39c09bf4ca00cafb9294ade6..d1148bfb7adb9d19931b22b39fbcd81584ee7859 100644 (file)
@@ -1,3 +1,4 @@
+Makefile.am
 check-help
 check-version
 ngircd
diff --git a/src/ngircd/Makefile.am b/src/ngircd/Makefile.am
deleted file mode 100644 (file)
index c1fd424..0000000
+++ /dev/null
@@ -1,148 +0,0 @@
-#
-# ngIRCd -- The Next Generation IRC Daemon
-# Copyright (c)2001-2012 Alexander Barton (alex@barton.de)
-#
-# 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 of the License, or
-# (at your option) any later version.
-# Please read the file COPYING, README and AUTHORS for more information.
-#
-
-AUTOMAKE_OPTIONS = ../portab/ansi2knr
-
-INCLUDES = -I$(srcdir)/../portab -I$(srcdir)/../tool -I$(srcdir)/../ipaddr
-
-LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN \
- -varuse -retvalother -emptyret -unrecog
-
-sbin_PROGRAMS = ngircd
-
-ngircd_SOURCES = \
-       ngircd.c \
-       array.c \
-       channel.c \
-       class.c \
-       client.c \
-       client-cap.c \
-       conf.c \
-       conn.c \
-       conn-encoding.c \
-       conn-func.c \
-       conn-ssl.c \
-       conn-zip.c \
-       hash.c \
-       io.c \
-       irc.c \
-       irc-cap.c \
-       irc-channel.c \
-       irc-encoding.c \
-       irc-info.c \
-       irc-login.c \
-       irc-mode.c \
-       irc-op.c \
-       irc-oper.c \
-       irc-server.c \
-       irc-write.c \
-       lists.c \
-       log.c \
-       login.c \
-       match.c \
-       numeric.c \
-       op.c \
-       pam.c \
-       parse.c \
-       proc.c \
-       resolve.c \
-       sighandlers.c
-
-ngircd_LDFLAGS = -L../portab -L../tool -L../ipaddr
-
-ngircd_LDADD = -lngportab -lngtool -lngipaddr
-
-noinst_HEADERS = \
-       ngircd.h \
-       array.h \
-       channel.h \
-       class.h \
-       client.h \
-       client-cap.h \
-       conf.h \
-       conf-ssl.h \
-       conn.h \
-       conn-encoding.h \
-       conn-func.h \
-       conn-ssl.h \
-       conn-zip.h \
-       defines.h \
-       hash.h \
-       io.h \
-       irc.h \
-       irc-cap.h \
-       irc-channel.h \
-       irc-encoding.h \
-       irc-info.h \
-       irc-login.h \
-       irc-mode.h \
-       irc-op.h \
-       irc-oper.h \
-       irc-server.h \
-       irc-write.h \
-       lists.h \
-       log.h \
-       login.h \
-       match.h \
-       messages.h \
-       numeric.h \
-       op.h \
-       pam.h \
-       parse.h \
-       proc.h \
-       resolve.h \
-       sighandlers.h
-
-clean-local:
-       rm -f check-version check-help lint.out
-
-maintainer-clean-local:
-       rm -f Makefile Makefile.in
-
-check-version: Makefile
-       echo "#!/bin/sh" > check-version
-       echo "./ngircd --version | grep ngircd >/dev/null 2>&1" >>check-version
-       chmod 755 check-version
-
-check-help: Makefile
-       echo "#!/bin/sh" > check-help
-       echo "./ngircd --help | grep help >/dev/null 2>&1" >>check-help
-       chmod 755 check-help
-
-lint:
-       @splint --version >/dev/null 2>&1 \
-        || ( echo; echo "Error: \"splint\" not found!"; echo; exit 1 )
-       @echo; warnings=0; files=0; \
-       for f in *.c; do \
-        echo "checking $$f ..."; \
-        splint $$f $(LINTARGS) -I$(srcdir) -I$(srcdir)/.. \
-         $(INCLUDES) $(AM_CFLAGS) >lint.out 2>&1; \
-        grep "no warnings" lint.out > /dev/null 2>&1; \
-        if [ $$? -ne 0 ]; then \
-         waswarning=1; \
-         echo; grep -v "^Command Line: " lint.out; echo; \
-         w=$$( grep "code warning" lint.out | $(AWK) "{ print \$$4 }" ); \
-         [ "$$w" -gt 0 ] && warnings=`expr $$warnings + $$w`; \
-         files=`expr $$files + 1`; \
-        else \
-         waswarning=0; \
-        fi; \
-        rm -f lint.out; \
-       done; \
-       [ $$waswarning -eq 0 ] && echo; \
-       [ $$warnings -gt 0 ] \
-        && echo "Result: $$warnings warning(s) in $$files file(s)!" \
-        || echo "Result: no warnings found."; \
-       echo; [ $$warnings -gt 0 ] && exit 1
-
-TESTS = check-version check-help
-
-# -eof-
diff --git a/src/ngircd/Makefile.ng b/src/ngircd/Makefile.ng
new file mode 100644 (file)
index 0000000..27b5c40
--- /dev/null
@@ -0,0 +1,150 @@
+#
+# ngIRCd -- The Next Generation IRC Daemon
+# Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors
+#
+# 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 of the License, or
+# (at your option) any later version.
+# Please read the file COPYING, README and AUTHORS for more information.
+#
+
+__ng_Makefile_am_template__
+
+EXTRA_DIST = Makefile.ng
+
+AM_CPPFLAGS = -I$(srcdir)/../portab -I$(srcdir)/../tool -I$(srcdir)/../ipaddr
+
+LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN \
+ -varuse -retvalother -emptyret -unrecog
+
+sbin_PROGRAMS = ngircd
+
+ngircd_SOURCES = \
+       ngircd.c \
+       array.c \
+       channel.c \
+       class.c \
+       client.c \
+       client-cap.c \
+       conf.c \
+       conn.c \
+       conn-encoding.c \
+       conn-func.c \
+       conn-ssl.c \
+       conn-zip.c \
+       hash.c \
+       io.c \
+       irc.c \
+       irc-cap.c \
+       irc-channel.c \
+       irc-encoding.c \
+       irc-info.c \
+       irc-login.c \
+       irc-mode.c \
+       irc-op.c \
+       irc-oper.c \
+       irc-server.c \
+       irc-write.c \
+       lists.c \
+       log.c \
+       login.c \
+       match.c \
+       numeric.c \
+       op.c \
+       pam.c \
+       parse.c \
+       proc.c \
+       resolve.c \
+       sighandlers.c
+
+ngircd_LDFLAGS = -L../portab -L../tool -L../ipaddr
+
+ngircd_LDADD = -lngportab -lngtool -lngipaddr
+
+noinst_HEADERS = \
+       ngircd.h \
+       array.h \
+       channel.h \
+       class.h \
+       client.h \
+       client-cap.h \
+       conf.h \
+       conf-ssl.h \
+       conn.h \
+       conn-encoding.h \
+       conn-func.h \
+       conn-ssl.h \
+       conn-zip.h \
+       defines.h \
+       hash.h \
+       io.h \
+       irc.h \
+       irc-cap.h \
+       irc-channel.h \
+       irc-encoding.h \
+       irc-info.h \
+       irc-login.h \
+       irc-mode.h \
+       irc-op.h \
+       irc-oper.h \
+       irc-server.h \
+       irc-write.h \
+       lists.h \
+       log.h \
+       login.h \
+       match.h \
+       messages.h \
+       numeric.h \
+       op.h \
+       pam.h \
+       parse.h \
+       proc.h \
+       resolve.h \
+       sighandlers.h
+
+clean-local:
+       rm -f check-version check-help lint.out
+
+maintainer-clean-local:
+       rm -f Makefile Makefile.in Makefile.am
+
+check-version: Makefile
+       echo "#!/bin/sh" > check-version
+       echo "./ngircd --version | grep ngircd >/dev/null 2>&1" >>check-version
+       chmod 755 check-version
+
+check-help: Makefile
+       echo "#!/bin/sh" > check-help
+       echo "./ngircd --help | grep help >/dev/null 2>&1" >>check-help
+       chmod 755 check-help
+
+lint:
+       @splint --version >/dev/null 2>&1 \
+        || ( echo; echo "Error: \"splint\" not found!"; echo; exit 1 )
+       @echo; warnings=0; files=0; \
+       for f in *.c; do \
+        echo "checking $$f ..."; \
+        splint $$f $(LINTARGS) -I$(srcdir) -I$(srcdir)/.. \
+         $(AM_CPPFLAGS) $(AM_CFLAGS) >lint.out 2>&1; \
+        grep "no warnings" lint.out > /dev/null 2>&1; \
+        if [ $$? -ne 0 ]; then \
+         waswarning=1; \
+         echo; grep -v "^Command Line: " lint.out; echo; \
+         w=$$( grep "code warning" lint.out | $(AWK) "{ print \$$4 }" ); \
+         [ "$$w" -gt 0 ] && warnings=`expr $$warnings + $$w`; \
+         files=`expr $$files + 1`; \
+        else \
+         waswarning=0; \
+        fi; \
+        rm -f lint.out; \
+       done; \
+       [ $$waswarning -eq 0 ] && echo; \
+       [ $$warnings -gt 0 ] \
+        && echo "Result: $$warnings warning(s) in $$files file(s)!" \
+        || echo "Result: no warnings found."; \
+       echo; [ $$warnings -gt 0 ] && exit 1
+
+TESTS = check-version check-help
+
+# -eof-
index f0a9525d348a5d992596f453fd9ba709cbd47c9a..10b05405b5ad50b0ebb464d1c9ce5139fc4d12ae 100644 (file)
@@ -299,6 +299,8 @@ Channel_Kick(CLIENT *Peer, CLIENT *Target, CLIENT *Origin, const char *Name,
             const char *Reason )
 {
        CHANNEL *chan;
+       char *ptr, *target_modes;
+       bool can_kick = false;
 
        assert(Peer != NULL);
        assert(Target != NULL);
@@ -319,14 +321,51 @@ Channel_Kick(CLIENT *Peer, CLIENT *Target, CLIENT *Origin, const char *Name,
                /* Check that user is on the specified channel */
                if (!Channel_IsMemberOf(chan, Origin)) {
                        IRC_WriteStrClient( Origin, ERR_NOTONCHANNEL_MSG,
-                                          Client_ID(Origin), Name);
+                                           Client_ID(Origin), Name);
                        return;
                }
+       }
+
+       if(Client_Type(Peer) == CLIENT_USER) {
+               /* Check if client has the rights to kick target */
+               ptr = Channel_UserModes(chan, Peer);
+               target_modes = Channel_UserModes(chan, Target);
+               while(*ptr) {
+                       /* Owner can kick everyone */
+                       if ( *ptr == 'q') {
+                               can_kick = true;
+                               break;
+                       }
+                       /* Admin can't kick owner */
+                       if ( *ptr == 'a' ) {
+                               if (!strchr(target_modes, 'q')) {
+                                       can_kick = true;
+                                       break;
+                               }
+                       }
+                       /* Op can't kick owner | admin */
+                       if ( *ptr == 'o' ) {
+                               if (!strchr(target_modes, 'q') &&
+                                   !strchr(target_modes, 'a')) {
+                                       can_kick = true;
+                                       break;
+                               }
+                       }
+                       /* Half Op can't kick owner | admin | op */ 
+                       if ( *ptr == 'h' ) {
+                               if (!strchr(target_modes, 'q') &&
+                                   !strchr(target_modes, 'a') &&
+                                   !strchr(target_modes, 'o')) {
+                                       can_kick = true;
+                                       break;
+                               }
+                       }
+                       ptr++;
+               }
 
-               /* Check if user has operator status */
-               if (!strchr(Channel_UserModes(chan, Origin), 'o')) {
-                       IRC_WriteStrClient(Origin, ERR_CHANOPRIVSNEEDED_MSG,
-                                          Client_ID(Origin), Name);
+               if(!can_kick) {
+                       IRC_WriteStrClient(Origin, ERR_CHANOPPRIVTOOLOW_MSG,
+                               Client_ID(Origin), Name);
                        return;
                }
        }
@@ -812,9 +851,9 @@ Channel_SetMaxUsers(CHANNEL *Chan, unsigned long Count)
 static bool
 Can_Send_To_Channel(CHANNEL *Chan, CLIENT *From)
 {
-       bool is_member, has_voice, is_op;
+       bool is_member, has_voice, is_halfop, is_op, is_chanadmin, is_owner;
 
-       is_member = has_voice = is_op = false;
+       is_member = has_voice = is_halfop = is_op = is_chanadmin = is_owner = false;
 
        /* The server itself always can send messages :-) */
        if (Client_ThisServer() == From)
@@ -824,8 +863,14 @@ Can_Send_To_Channel(CHANNEL *Chan, CLIENT *From)
                is_member = true;
                if (strchr(Channel_UserModes(Chan, From), 'v'))
                        has_voice = true;
+               if (strchr(Channel_UserModes(Chan, From), 'h'))
+                       is_halfop = true;
                if (strchr(Channel_UserModes(Chan, From), 'o'))
                        is_op = true;
+               if (strchr(Channel_UserModes(Chan, From), 'a'))
+                       is_chanadmin = true;
+               if (strchr(Channel_UserModes(Chan, From), 'q'))
+                       is_owner = true;
        }
 
        /*
@@ -841,7 +886,7 @@ Can_Send_To_Channel(CHANNEL *Chan, CLIENT *From)
            && !Client_HasMode(From, 'o'))
                return false;
 
-       if (is_op || has_voice)
+       if (has_voice || is_halfop || is_op || is_chanadmin || is_owner)
                return true;
 
        if (strchr(Channel_Modes(Chan), 'm'))
@@ -1196,64 +1241,6 @@ Channel_CheckKey(CHANNEL *Chan, CLIENT *Client, const char *Key)
 } /* Channel_CheckKey */
 
 
-/**
- * Check wether a client is allowed to administer a channel or not.
- *
- * @param Chan         The channel to test.
- * @param Client       The client from which the command has been received.
- * @param Origin       The originator of the command (or NULL).
- * @param OnChannel    Set to true if the originator is member of the channel.
- * @param AdminOk      Set to true if the client is allowed to do
- *                     administrative tasks on this channel.
- * @param UseServerMode        Set to true if ngIRCd should emulate "server mode",
- *                     that is send commands as if originating from a server
- *                     and not the originator of the command.
- */
-GLOBAL void
-Channel_CheckAdminRights(CHANNEL *Chan, CLIENT *Client, CLIENT *Origin,
-                        bool *OnChannel, bool *AdminOk, bool *UseServerMode)
-{
-       assert (Chan != NULL);
-       assert (Client != NULL);
-       assert (OnChannel != NULL);
-       assert (AdminOk != NULL);
-       assert (UseServerMode != NULL);
-
-       /* Use the client as origin, if no origin has been given (no prefix?) */
-       if (!Origin)
-               Origin = Client;
-
-       *OnChannel = false;
-       *AdminOk = false;
-       *UseServerMode = false;
-
-       if (Client_Type(Client) != CLIENT_USER
-           && Client_Type(Client) != CLIENT_SERVER
-           && Client_Type(Client) != CLIENT_SERVICE)
-               return;
-
-       /* Allow channel administration if the client is a server or service */
-       if (Client_Type(Client) != CLIENT_USER) {
-               *AdminOk = true;
-               return;
-       }
-
-       *OnChannel = Channel_IsMemberOf(Chan, Origin);
-
-       if (*OnChannel && strchr(Channel_UserModes(Chan, Origin), 'o')) {
-               /* User is a channel operator */
-               *AdminOk = true;
-       } else if (Conf_OperCanMode) {
-               /* IRC operators are allowed to administer channels as well */
-               if (Client_OperByMe(Origin)) {
-                       *AdminOk = true;
-                       if (Conf_OperServerMode)
-                               *UseServerMode = true;
-               }
-       }
-} /* Channel_CheckAdminRights */
-
-
 static CL2CHAN *
 Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan )
 {
index 3fab579ca7c41983756d38dc3f968e1e2abfc2fe..428bcf45570c1ae0a8192de5b33148b7af20b1ae 100644 (file)
@@ -39,13 +39,9 @@ struct ConnSSL_State {
 #endif
 };
 
-bool
-ConnSSL_InitLibrary(void);
-#else
-static inline bool
-ConnSSL_InitLibrary(void)
-{ return true; }
-#endif /* SSL_SUPPORT */
+#endif
+
+bool   ConnSSL_InitLibrary(void);
 
 #endif /* conf_ssl_h */
 
index 5853926e4df98dfc02a4c6e80e16f39135b7dca4..4ac37ad4033331e11692ee0aee6b87e96b6846ee 100644 (file)
@@ -104,6 +104,8 @@ ConfSSL_Init(void)
        free(Conf_SSLOptions.DHFile);
        Conf_SSLOptions.DHFile = NULL;
        array_free_wipe(&Conf_SSLOptions.KeyFilePassword);
+
+       array_free(&Conf_SSLOptions.ListenPorts);
 }
 
 /**
@@ -370,6 +372,7 @@ Conf_Test( void )
        printf("  MorePrivacy = %s\n", yesno_to_str(Conf_MorePrivacy));
        printf("  NoticeAuth = %s\n", yesno_to_str(Conf_NoticeAuth));
        printf("  OperCanUseMode = %s\n", yesno_to_str(Conf_OperCanMode));
+       printf("  OperChanPAutoOp = %s\n", yesno_to_str(Conf_OperChanPAutoOp));
        printf("  OperServerMode = %s\n", yesno_to_str(Conf_OperServerMode));
 #ifdef PAM
        printf("  PAM = %s\n", yesno_to_str(Conf_PAM));
@@ -689,6 +692,7 @@ Set_Defaults(bool InitServers)
                 PACKAGE_NAME, PACKAGE_VERSION);
        free(Conf_ListenAddress);
        Conf_ListenAddress = NULL;
+       array_free(&Conf_ListenPorts);
        array_free(&Conf_Motd);
        strlcpy(Conf_MotdFile, SYSCONFDIR, sizeof(Conf_MotdFile));
        strlcat(Conf_MotdFile, MOTD_FILE, sizeof(Conf_MotdFile));
@@ -730,6 +734,7 @@ Set_Defaults(bool InitServers)
        Conf_MorePrivacy = false;
        Conf_NoticeAuth = false;
        Conf_OperCanMode = false;
+       Conf_OperChanPAutoOp = true;
        Conf_OperServerMode = false;
 #ifdef PAM
        Conf_PAM = true;
@@ -1178,6 +1183,7 @@ CheckLegacyGlobalOption(int Line, char *Var, char *Arg)
            || strcasecmp(Var, "ConnectIPv4") == 0
            || strcasecmp(Var, "ConnectIPv6") == 0
            || strcasecmp(Var, "OperCanUseMode") == 0
+           || strcasecmp(Var, "OperChanPAutoOp") == 0
            || strcasecmp(Var, "OperServerMode") == 0
            || strcasecmp(Var, "PredefChannelsOnly") == 0
            || strcasecmp(Var, "SyslogFacility") == 0
@@ -1553,6 +1559,10 @@ Handle_OPTIONS(int Line, char *Var, char *Arg)
                Conf_OperCanMode = Check_ArgIsTrue(Arg);
                return;
        }
+       if (strcasecmp(Var, "OperChanPAutoOp") == 0) {
+               Conf_OperChanPAutoOp = Check_ArgIsTrue(Arg);
+               return;
+       }
        if (strcasecmp(Var, "OperServerMode") == 0) {
                Conf_OperServerMode = Check_ArgIsTrue(Arg);
                return;
index 7a4e38aa05b56a626a4aed84055a0e7d28fc081a..90d74d2096e42d2dd8f28537db28f307e700e5c2 100644 (file)
@@ -151,6 +151,9 @@ GLOBAL bool Conf_PredefChannelsOnly;
 /** Flag indicating if IRC operators are allowed to always use MODE (true) */
 GLOBAL bool Conf_OperCanMode;
 
+/** Flag indicating if IRC operators get AutoOp in persistent (+P) channels */
+GLOBAL bool Conf_OperChanPAutoOp;
+
 /**
  * If true, mask channel MODE commands of IRC operators to the server.
  * Background: ircd2 will ignore channel MODE commands if an IRC operator
index 8f7b70afccb0e310793013e0f53ee5f38522a614..59729e046628213937d932021591fd987c7b265b 100644 (file)
@@ -156,7 +156,7 @@ Load_DH_params(void)
        bool ret = true;
 
        if (!Conf_SSLOptions.DHFile) {
-               Log(LOG_NOTICE, "Configuration option \"SSLDHFile\" not set!");
+               Log(LOG_NOTICE, "Configuration option \"DHFile\" not set!");
                return false;
        }
        fp = fopen(Conf_SSLOptions.DHFile, "r");
@@ -201,7 +201,7 @@ Load_DH_params(void)
        }
        if (need_dhgenerate) {
                Log(LOG_WARNING,
-                   "SSLDHFile not set, generating %u bit DH parameters. This may take a while ...",
+                   "DHFile not set, generating %u bit DH parameters. This may take a while ...",
                    DH_BITS);
                err = gnutls_dh_params_generate2(tmp_dh_params, DH_BITS);
                if (err < 0) {
@@ -241,6 +241,9 @@ void ConnSSL_Free(CONNECTION *c)
 bool
 ConnSSL_InitLibrary( void )
 {
+       if (!array_bytes(&Conf_SSLOptions.ListenPorts))
+               return true;
+
 #ifdef HAVE_LIBSSL
        SSL_CTX *newctx;
 
@@ -256,12 +259,14 @@ ConnSSL_InitLibrary( void )
                 * According to OpenSSL RAND_egd(3): "The automatic query of /var/run/egd-pool et al was added in OpenSSL 0.9.7";
                 * so it makes little sense to deal with PRNGD seeding ourselves.
                 */
+               array_free(&Conf_SSLOptions.ListenPorts);
                return false;
        }
 
        newctx = SSL_CTX_new(SSLv23_method());
        if (!newctx) {
                LogOpenSSLError("SSL_CTX_new()", NULL);
+               array_free(&Conf_SSLOptions.ListenPorts);
                return false;
        }
 
@@ -276,6 +281,7 @@ ConnSSL_InitLibrary( void )
        return true;
 out:
        SSL_CTX_free(newctx);
+       array_free(&Conf_SSLOptions.ListenPorts);
        return false;
 #endif
 #ifdef HAVE_LIBGNUTLS
@@ -287,10 +293,13 @@ out:
        err = gnutls_global_init();
        if (err) {
                Log(LOG_ERR, "gnutls_global_init(): %s", gnutls_strerror(err));
+               array_free(&Conf_SSLOptions.ListenPorts);
                return false;
        }
-       if (!ConnSSL_LoadServerKey_gnutls())
+       if (!ConnSSL_LoadServerKey_gnutls()) {
+               array_free(&Conf_SSLOptions.ListenPorts);
                return false;
+       }
        Log(LOG_INFO, "gnutls %s initialized.", gnutls_check_version(NULL));
        initialized = true;
        return true;
@@ -313,7 +322,7 @@ ConnSSL_LoadServerKey_gnutls(void)
 
        cert_file = Conf_SSLOptions.CertFile ? Conf_SSLOptions.CertFile:Conf_SSLOptions.KeyFile;
        if (!cert_file) {
-               Log(LOG_NOTICE, "No SSL server key configured, SSL disabled.");
+               Log(LOG_ERR, "No SSL server key configured!");
                return false;
        }
 
@@ -344,7 +353,7 @@ ConnSSL_LoadServerKey_openssl(SSL_CTX *ctx)
 
        assert(ctx);
        if (!Conf_SSLOptions.KeyFile) {
-               Log(LOG_NOTICE, "No SSL server key configured, SSL disabled.");
+               Log(LOG_ERR, "No SSL server key configured!");
                return false;
        }
 
@@ -714,6 +723,13 @@ ConnSSL_GetCipherInfo(CONNECTION *c, char *buf, size_t len)
 #endif
 }
 
+#else
+
+bool
+ConnSSL_InitLibrary(void)
+{
+       return true;
+}
 
 #endif /* SSL_SUPPORT */
 /* -eof- */
index 82837599aadbb6485f0f044b447739d7b5f922fa..ba7adf17adb204840418b7482b75fef975844138 100644 (file)
 #define USERMODES "aBcCiorRswx"
 
 /** Supported channel modes. */
-#define CHANMODES "beiIklmMnoOPrRstvz"
+#define CHANMODES "abehiIklmMnoOPqrRstvz"
 
 /** Away message for users connected to linked servers. */
 #define DEFAULT_AWAY_MSG "Away"
index d714b48fcb8e3d28aed8cb2101bc6e452295290b..4a157d67e5fca76d8461f421644da3d00e7b7dd0 100644 (file)
@@ -167,8 +167,10 @@ join_set_channelmodes(CHANNEL *chan, CLIENT *target, const char *flags)
                }
        }
 
-       /* If channel persistent and client is ircop: make client chanop */
-       if (strchr(Channel_Modes(chan), 'P') && strchr(Client_Modes(target), 'o'))
+       /* If the channel is persistent (+P) and client is an IRC op:
+        * make client chanop, if not disabled in configuration. */
+       if (strchr(Channel_Modes(chan), 'P') && Conf_OperChanPAutoOp
+           && strchr(Client_Modes(target), 'o'))
                Channel_UserModeAdd(chan, target, 'o');
 } /* join_set_channelmodes */
 
@@ -510,7 +512,7 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
        CHANNEL *chan;
        CLIENT *from;
        char *topic;
-       bool onchannel, topicok, use_servermode, r;
+       bool r, is_oper;
 
        assert( Client != NULL );
        assert( Req != NULL );
@@ -533,10 +535,9 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
                return IRC_WriteStrClient(from, ERR_NOSUCHCHANNEL_MSG,
                                          Client_ID(from), Req->argv[0]);
 
-       Channel_CheckAdminRights(chan, Client, from,
-                                &onchannel, &topicok, &use_servermode);
-
-       if (!onchannel && !topicok)
+       /* Only IRC opers and channel members allowed */
+       is_oper = Client_OperByMe(from);
+       if (!Channel_IsMemberOf(chan, from) && !is_oper)
                return IRC_WriteStrClient(from, ERR_NOTONCHANNEL_MSG,
                                          Client_ID(from), Req->argv[0]);
 
@@ -565,8 +566,12 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
        }
 
        if (strchr(Channel_Modes(chan), 't')) {
-               /* Topic Lock. Is the user a channel or IRC operator? */
-               if (!topicok)
+               /* Topic Lock. Is the user a channel op or IRC operator? */
+               if(!strchr(Channel_UserModes(chan, from), 'h') &&
+                  !strchr(Channel_UserModes(chan, from), 'o') &&
+                  !strchr(Channel_UserModes(chan, from), 'a') &&
+                  !strchr(Channel_UserModes(chan, from), 'q') &&
+                  !is_oper)
                        return IRC_WriteStrClient(from, ERR_CHANOPRIVSNEEDED_MSG,
                                                  Client_ID(from),
                                                  Channel_Name(chan));
@@ -578,7 +583,7 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
                 Client_TypeText(from), Client_Mask(from), Channel_Name(chan),
                 Req->argv[1][0] ? Req->argv[1] : "<none>");
 
-       if (use_servermode)
+       if (Conf_OperServerMode)
                from = Client_ThisServer();
 
        /* Update channel and forward new topic to other servers */
@@ -666,7 +671,8 @@ IRC_LIST( CLIENT *Client, REQUEST *Req )
                        if (MatchCaseInsensitive(pattern, Channel_Name(chan))) {
                                /* Gotcha! */
                                if (!strchr(Channel_Modes(chan), 's')
-                                   || Channel_IsMemberOf(chan, from)) {
+                                   || Channel_IsMemberOf(chan, from)
+                                   || (!Conf_MorePrivacy && Client_OperByMe(Client))) {
                                        if (IRC_CheckListTooBig(from, count,
                                                                 MAX_RPL_LIST,
                                                                 "LIST"))
index fc04773ae14ef307d1ac5adb0b53f2a18a64dd03..4909a96a063a3a9940be0e52d9b9e070925a28c9 100644 (file)
@@ -117,7 +117,7 @@ IRC_INFO(CLIENT * Client, REQUEST * Req)
                target = Client_Search(Req->argv[0]);
        else
                target = Client_ThisServer();
-       
+
        /* Make sure that the target is a server */
        if (target && Client_Type(target) != CLIENT_SERVER)
                target = Client_Introducer(target);
@@ -807,22 +807,48 @@ who_flags_status(const char *client_modes)
 }
 
 
-static const char *
-who_flags_qualifier(CLIENT *Client, const char *chan_user_modes)
+/**
+ * Return channel user mode prefix(es).
+ *
+ * @param Client The client requesting the mode prefixes.
+ * @param chan_user_modes String with channel user modes.
+ * @param str String buffer to which the prefix(es) will be appended.
+ * @param len Size of "str" buffer.
+ * @return Pointer to "str".
+ */
+static char *
+who_flags_qualifier(CLIENT *Client, const char *chan_user_modes,
+                   char *str, size_t len)
 {
        assert(Client != NULL);
 
        if (Client_Cap(Client) & CLIENT_CAP_MULTI_PREFIX) {
-               if (strchr(chan_user_modes, 'o') &&
-                   strchr(chan_user_modes, 'v'))
-                       return "@+";
+               if (strchr(chan_user_modes, 'q'))
+                       strlcat(str, "~", len);
+               if (strchr(chan_user_modes, 'a'))
+                       strlcat(str, "&", len);
+               if (strchr(chan_user_modes, 'o'))
+                       strlcat(str, "@", len);
+               if (strchr(chan_user_modes, 'h'))
+                       strlcat(str, "%", len);
+               if (strchr(chan_user_modes, 'v'))
+                       strlcat(str, "+", len);
+
+               return str;
        }
 
-       if (strchr(chan_user_modes, 'o'))
-               return "@";
+       if (strchr(chan_user_modes, 'q'))
+               strlcat(str, "~", len);
+       else if (strchr(chan_user_modes, 'a'))
+               strlcat(str, "&", len);
+       else if (strchr(chan_user_modes, 'o'))
+               strlcat(str, "@", len);
+       else if (strchr(chan_user_modes, 'h'))
+               strlcat(str, "%", len);
        else if (strchr(chan_user_modes, 'v'))
-               return "+";
-       return "";
+               strlcat(str, "+", len);
+
+       return str;
 }
 
 
@@ -840,8 +866,7 @@ IRC_WHO_Channel(CLIENT *Client, CHANNEL *Chan, bool OnlyOps)
        bool is_visible, is_member, is_ircop;
        CL2CHAN *cl2chan;
        const char *client_modes;
-       const char *chan_user_modes;
-       char flags[8];
+       char flags[10];
        CLIENT *c;
        int count = 0;
 
@@ -872,9 +897,8 @@ IRC_WHO_Channel(CLIENT *Client, CHANNEL *Chan, bool OnlyOps)
                        if (is_ircop)
                                strlcat(flags, "*", sizeof(flags));
 
-                       chan_user_modes = Channel_UserModes(Chan, c);
-                       strlcat(flags, who_flags_qualifier(c, chan_user_modes),
-                               sizeof(flags));
+                       who_flags_qualifier(Client, Channel_UserModes(Chan, c),
+                                           flags, sizeof(flags));
 
                        if (!write_whoreply(Client, c, Channel_Name(Chan),
                                            flags))
@@ -1090,8 +1114,8 @@ IRC_WHOIS_SendReply(CLIENT *Client, CLIENT *from, CLIENT *c)
                if (str[strlen(str) - 1] != ':')
                        strlcat(str, " ", sizeof(str));
 
-               strlcat(str, who_flags_qualifier(c, Channel_UserModes(chan, c)),
-                                                sizeof(str));
+               who_flags_qualifier(Client, Channel_UserModes(chan, c),
+                                   str, sizeof(str));
                strlcat(str, Channel_Name(chan), sizeof(str));
 
                if (strlen(str) > (LINE_LEN - CHANNEL_NAME_LEN - 4)) {
@@ -1465,7 +1489,7 @@ IRC_Send_LUSERS(CLIENT *Client)
                        Conn_CountMax(), Conn_CountAccepted()))
                return DISCONNECTED;
 #endif
-       
+
        return CONNECTED;
 } /* IRC_Send_LUSERS */
 
@@ -1595,16 +1619,9 @@ IRC_Send_NAMES(CLIENT * Client, CHANNEL * Chan)
                if (is_member || is_visible) {
                        if (str[strlen(str) - 1] != ':')
                                strlcat(str, " ", sizeof(str));
-                       if (Client_Cap(Client) & CLIENT_CAP_MULTI_PREFIX && 
-                                       strchr(Channel_UserModes(Chan, cl), 'o') &&
-                                       strchr(Channel_UserModes(Chan, cl), 'v')) {
-                               strlcat(str, "@+", sizeof(str));
-                       } else {
-                               if (strchr(Channel_UserModes(Chan, cl), 'o'))
-                                       strlcat(str, "@", sizeof(str));
-                               else if (strchr(Channel_UserModes(Chan, cl), 'v'))
-                                       strlcat(str, "+", sizeof(str));
-                       }
+
+                       who_flags_qualifier(Client, Channel_UserModes(Chan, cl),
+                                           str, sizeof(str));
                        strlcat(str, Client_ID(cl), sizeof(str));
 
                        if (strlen(str) > (LINE_LEN - CLIENT_NICK_LEN - 4)) {
index 74d8b9d116b3bb71de2388a0c71838f0c86f4e29..99cd26f45818a1fa3a42bb36c67f58a4c7ac86b2 100644 (file)
@@ -18,6 +18,7 @@
 
 #include "imp.h"
 #include <assert.h>
+#include <ctype.h>
 #include <stdlib.h>
 #include <string.h>
 #include <strings.h>
@@ -422,11 +423,9 @@ IRC_USER(CLIENT * Client, REQUEST * Req)
                   punctuation is allowed.*/
                ptr = Req->argv[0];
                while (*ptr) {
-                       if ((*ptr < '0' || *ptr > '9') &&
-                           (*ptr < 'A' || *ptr > 'Z') &&
-                           (*ptr < 'a' || *ptr > 'z') &&
-                           (*ptr != '+') && (*ptr != '-') &&
-                           (*ptr != '.') && (*ptr != '_')) {
+                       if (!isalnum(*ptr) &&
+                           *ptr != '+' && *ptr != '-' &&
+                           *ptr != '.' && *ptr != '_') {
                                Conn_Close(Client_Conn(Client), NULL,
                                           "Invalid user name", true);
                                return DISCONNECTED;
index 71557201d8d938f4a5ff65416f50eb487f78333d..90f638d811219282b34af51c8cf8369e7548e4f7 100644 (file)
@@ -278,9 +278,15 @@ Client_Mode( CLIENT *Client, REQUEST *Req, CLIENT *Origin, CLIENT *Target )
                                ok = IRC_WriteStrClient(Origin,
                                                        ERR_RESTRICTED_MSG,
                                                        Client_ID(Origin));
-                       else
+                       else if (!set || Conf_CloakHostModeX[0]
+                                || Client_Type(Client) == CLIENT_SERVER
+                                || Client_OperByMe(Client)) {
                                x[0] = 'x';
                                send_RPL_HOSTHIDDEN_MSG = true;
+                       } else
+                               ok = IRC_WriteStrClient(Origin,
+                                                       ERR_NOPRIVILEGES_MSG,
+                                                       Client_ID(Origin));
                        break;
                default:
                        if (Client_Type(Client) != CLIENT_SERVER) {
@@ -418,13 +424,16 @@ static bool
 Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
 {
        char the_modes[COMMAND_LEN], the_args[COMMAND_LEN], x[2],
-           argadd[CLIENT_PASS_LEN], *mode_ptr;
-       bool connected, set, skiponce, retval, onchannel, modeok, use_servermode;
+           argadd[CLIENT_PASS_LEN], *mode_ptr, *o_mode_ptr;
+       bool connected, set, skiponce, retval, use_servermode,
+            is_halfop, is_op, is_admin, is_owner, is_machine, is_oper;
        int mode_arg, arg_arg, mode_arg_count = 0;
        CLIENT *client;
        long l;
        size_t len;
 
+       is_halfop = is_op = is_admin = is_owner = is_machine = is_oper = false;
+
        if (Channel_IsModeless(Channel))
                return IRC_WriteStrClient(Client, ERR_NOCHANMODES_MSG,
                                Client_ID(Client), Channel_Name(Channel));
@@ -433,10 +442,20 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
        if (Req->argc <= 1)
                return Channel_Mode_Answer_Request(Origin, Channel);
 
-       Channel_CheckAdminRights(Channel, Client, Origin,
-                                &onchannel, &modeok, &use_servermode);
+       /* Check if origin is oper and opers can use mode */
+       use_servermode = Conf_OperServerMode;
+       if(Client_OperByMe(Client) && Conf_OperCanMode) {
+               is_oper = true;
+       }
 
-       if (!onchannel && !modeok)
+       /* Check if client is a server/service */
+       if(Client_Type(Client) == CLIENT_SERVER ||
+          Client_Type(Client) == CLIENT_SERVICE) {
+               is_machine = true;
+       }
+
+       /* Check if client is member of channel or an oper or an server/service */
+       if(!Channel_IsMemberOf(Channel, Client) && !is_oper && !is_machine)
                return IRC_WriteStrClient(Origin, ERR_NOTONCHANNEL_MSG,
                                          Client_ID(Origin),
                                          Channel_Name(Channel));
@@ -515,21 +534,44 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
                if (arg_arg >= Req->argc)
                        arg_arg = -1;
 
+               if(!is_machine) {
+                       o_mode_ptr = Channel_UserModes(Channel, Client);
+                       while( *o_mode_ptr ) {
+                               if ( *o_mode_ptr == 'q')
+                                       is_owner = true;
+                               if ( *o_mode_ptr == 'a')
+                                       is_admin = true;
+                               if ( *o_mode_ptr == 'o')
+                                       is_op = true;
+                               if ( *o_mode_ptr == 'h')
+                                       is_halfop = true;
+                               o_mode_ptr++;
+                       }
+               }
+
                /* Validate modes */
                x[0] = '\0';
                argadd[0] = '\0';
                client = NULL;
                switch (*mode_ptr) {
                /* --- Channel modes --- */
+               case 'R': /* Registered users only */
+               case 's': /* Secret channel */
+               case 'z': /* Secure connections only */
+                       if(!is_oper && !is_machine && !is_owner &&
+                          !is_admin && !is_op) {
+                               connected = IRC_WriteStrClient(Origin,
+                                       ERR_CHANOPRIVSNEEDED_MSG,
+                                       Client_ID(Origin), Channel_Name(Channel));
+                               goto chan_exit;
+                       }
                case 'i': /* Invite only */
                case 'M': /* Only identified nicks can write */
                case 'm': /* Moderated */
                case 'n': /* Only members can write */
-               case 'R': /* Registered users only */
-               case 's': /* Secret channel */
                case 't': /* Topic locked */
-               case 'z': /* Secure connections only */
-                       if (modeok)
+                       if(is_oper || is_machine || is_owner ||
+                          is_admin || is_op || is_halfop)
                                x[0] = *mode_ptr;
                        else
                                connected = IRC_WriteStrClient(Origin,
@@ -540,7 +582,8 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
                        if (Mode_Limit_Reached(Client, mode_arg_count++))
                                goto chan_exit;
                        if (!set) {
-                               if (modeok)
+                               if (is_oper || is_machine || is_owner ||
+                                   is_admin || is_op || is_halfop)
                                        x[0] = *mode_ptr;
                                else
                                        connected = IRC_WriteStrClient(Origin,
@@ -550,7 +593,8 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
                                break;
                        }
                        if (arg_arg > mode_arg) {
-                               if (modeok) {
+                               if (is_oper || is_machine || is_owner ||
+                                   is_admin || is_op || is_halfop) {
                                        Channel_ModeDel(Channel, 'k');
                                        Channel_SetKey(Channel,
                                                       Req->argv[arg_arg]);
@@ -576,7 +620,8 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
                        if (Mode_Limit_Reached(Client, mode_arg_count++))
                                goto chan_exit;
                        if (!set) {
-                               if (modeok)
+                               if (is_oper || is_machine || is_owner ||
+                                   is_admin || is_op || is_halfop)
                                        x[0] = *mode_ptr;
                                else
                                        connected = IRC_WriteStrClient(Origin,
@@ -586,7 +631,8 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
                                break;
                        }
                        if (arg_arg > mode_arg) {
-                               if (modeok) {
+                               if (is_oper || is_machine || is_owner ||
+                                   is_admin || is_op || is_halfop) {
                                        l = atol(Req->argv[arg_arg]);
                                        if (l > 0 && l < 0xFFFF) {
                                                Channel_ModeDel(Channel, 'l');
@@ -611,44 +657,47 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
                        }
                        break;
                case 'O': /* IRC operators only */
-                       if (modeok) {
+                       if (set) {
                                /* Only IRC operators are allowed to
                                 * set the 'O' channel mode! */
-                               if (set && !(Client_OperByMe(Client)
-                                   || Client_Type(Client) == CLIENT_SERVER))
+                               if(is_oper || is_machine)
+                                       x[0] = 'O';
+                               else
                                        connected = IRC_WriteStrClient(Origin,
                                                ERR_NOPRIVILEGES_MSG,
                                                Client_ID(Origin));
-                               else
-                                       x[0] = 'O';
-                       } else
+                       } else if(is_oper || is_machine || is_owner ||
+                                 is_admin || is_op)
+                               x[0] = 'O';
+                       else
                                connected = IRC_WriteStrClient(Origin,
-                                               ERR_CHANOPRIVSNEEDED_MSG,
-                                               Client_ID(Origin),
-                                               Channel_Name(Channel));
-                               break;
+                                       ERR_CHANOPRIVSNEEDED_MSG,
+                                       Client_ID(Origin),
+                                       Channel_Name(Channel));
+                       break;
                case 'P': /* Persistent channel */
-                       if (modeok) {
+                       if (set) {
                                /* Only IRC operators are allowed to
                                 * set the 'P' channel mode! */
-                               if (set && !(Client_OperByMe(Client)
-                                   || Client_Type(Client) == CLIENT_SERVER))
+                               if(is_oper || is_machine)
+                                       x[0] = 'P';
+                               else
                                        connected = IRC_WriteStrClient(Origin,
                                                ERR_NOPRIVILEGES_MSG,
                                                Client_ID(Origin));
-                               else
-                                       x[0] = 'P';
-                       } else
+                       } else if(is_oper || is_machine || is_owner ||
+                                 is_admin || is_op)
+                               x[0] = 'P';
+                       else
                                connected = IRC_WriteStrClient(Origin,
                                        ERR_CHANOPRIVSNEEDED_MSG,
                                        Client_ID(Origin),
                                        Channel_Name(Channel));
                        break;
                /* --- Channel user modes --- */
-               case 'a':
-               case 'h':
-               case 'q':
-                       if (Client_Type(Client) != CLIENT_SERVER) {
+               case 'q': /* Owner */
+               case 'a': /* Channel admin */
+                       if(!is_oper && !is_machine && !is_owner) {
                                connected = IRC_WriteStrClient(Origin,
                                        ERR_CHANOPRIVSNEEDED_MSG,
                                        Client_ID(Origin),
@@ -656,16 +705,34 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
                                goto chan_exit;
                        }
                case 'o': /* Channel operator */
+                       if(!is_oper && !is_machine && !is_owner &&
+                          !is_admin && !is_op) {
+                               connected = IRC_WriteStrClient(Origin,
+                                       ERR_CHANOPRIVSNEEDED_MSG,
+                                       Client_ID(Origin),
+                                       Channel_Name(Channel));
+                               goto chan_exit;
+                       }
+               case 'h': /* Half Op */
+                       if(!is_oper && !is_machine && !is_owner &&
+                          !is_admin && !is_op) {
+                               connected = IRC_WriteStrClient(Origin,
+                                       ERR_CHANOPRIVSNEEDED_MSG,
+                                       Client_ID(Origin),
+                                       Channel_Name(Channel));
+                               goto chan_exit;
+                       }
                case 'v': /* Voice */
                        if (arg_arg > mode_arg) {
-                               if (modeok) {
+                               if (is_oper || is_machine || is_owner ||
+                                   is_admin || is_op || is_halfop) {
                                        client = Client_Search(Req->argv[arg_arg]);
                                        if (client)
                                                x[0] = *mode_ptr;
                                        else
-                                               connected = IRC_WriteStrClient(Client,
+                                               connected = IRC_WriteStrClient(Origin,
                                                        ERR_NOSUCHNICK_MSG,
-                                                       Client_ID(Client),
+                                                       Client_ID(Origin),
                                                        Req->argv[arg_arg]);
                                } else {
                                        connected = IRC_WriteStrClient(Origin,
@@ -690,7 +757,8 @@ Channel_Mode(CLIENT *Client, REQUEST *Req, CLIENT *Origin, CHANNEL *Channel)
                                goto chan_exit;
                        if (arg_arg > mode_arg) {
                                /* modify list */
-                               if (modeok) {
+                               if (is_oper || is_machine || is_owner ||
+                                   is_admin || is_op || is_halfop) {
                                        connected = set
                                           ? Add_To_List(*mode_ptr, Origin,
                                                Client, Channel,
index 5e36b02bef478ce9ac2a0d96e411deaf2e11c4cc..08495475f60520c7dd899d7cef9e10b4f4852550 100644 (file)
@@ -166,8 +166,11 @@ IRC_INVITE(CLIENT *Client, REQUEST *Req)
 
                /* Is the channel "invite-only"? */
                if (strchr(Channel_Modes(chan), 'i')) {
-                       /* Yes. The user must be channel operator! */
-                       if (!strchr(Channel_UserModes(chan, from), 'o'))
+                       /* Yes. The user must be channel owner/admin/operator/halfop! */
+                       if (!strchr(Channel_UserModes(chan, from), 'q') &&
+                           !strchr(Channel_UserModes(chan, from), 'a') &&
+                           !strchr(Channel_UserModes(chan, from), 'o') &&
+                           !strchr(Channel_UserModes(chan, from), 'h'))
                                return IRC_WriteStrClient(from, ERR_CHANOPRIVSNEEDED_MSG,
                                                Client_ID(from), Channel_Name(chan));
                        remember = true;
index 21577f00438956992141cf6c255767763fcdd409..237107f69b8f56c828f212122da415cee247ba1b 100644 (file)
@@ -183,6 +183,8 @@ IRC_REHASH( CLIENT *Client, REQUEST *Req )
 
        Log(LOG_NOTICE|LOG_snotice, "Got REHASH command from \"%s\" ...",
            Client_Mask(Client));
+       IRC_WriteStrClient(Client, RPL_REHASHING_MSG, Client_ID(Client));
+
        raise(SIGHUP);
 
        return CONNECTED;
index 8526a573ec361b0851222314343e079b447114f6..d605745c75d37655aeae29c57d73acf31c76ceb6 100644 (file)
@@ -54,7 +54,7 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
        CLIENT *from, *c;
        int i;
        CONN_ID con;
-       
+
        assert( Client != NULL );
        assert( Req != NULL );
 
@@ -88,7 +88,7 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
                        Conn_Close( Client_Conn( Client ), NULL, "Bad password", true);
                        return DISCONNECTED;
                }
-               
+
                /* Is there a registered server with this ID? */
                if( ! Client_CheckID( Client, Req->argv[0] )) return DISCONNECTED;
 
@@ -203,10 +203,10 @@ GLOBAL bool
 IRC_NJOIN( CLIENT *Client, REQUEST *Req )
 {
        char nick_in[COMMAND_LEN], nick_out[COMMAND_LEN], *channame, *ptr, modes[8];
-       bool is_op, is_voiced;
+       bool is_owner, is_chanadmin, is_op, is_halfop, is_voiced;
        CHANNEL *chan;
        CLIENT *c;
-       
+
        assert( Client != NULL );
        assert( Req != NULL );
 
@@ -219,12 +219,16 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req )
        ptr = strtok( nick_in, "," );
        while( ptr )
        {
-               is_op = is_voiced = false;
-               
+               is_owner = is_chanadmin = is_op = is_halfop = is_voiced = false;
+
                /* cut off prefixes */
-               while(( *ptr == '@' ) || ( *ptr == '+' ))
+               while(( *ptr == '~') || ( *ptr == '&' ) || ( *ptr == '@' ) ||
+                       ( *ptr == '%') || ( *ptr == '+' ))
                {
+                       if( *ptr == '~' ) is_owner = true;
+                       if( *ptr == '&' ) is_chanadmin = true;
                        if( *ptr == '@' ) is_op = true;
+                       if( *ptr == 'h' ) is_halfop = true;
                        if( *ptr == '+' ) is_voiced = true;
                        ptr++;
                }
@@ -235,8 +239,11 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req )
                        Channel_Join( c, channame );
                        chan = Channel_Search( channame );
                        assert( chan != NULL );
-                       
+
+                       if( is_owner ) Channel_UserModeAdd( chan, c, 'q' );
+                       if( is_chanadmin ) Channel_UserModeAdd( chan, c, 'a' );
                        if( is_op ) Channel_UserModeAdd( chan, c, 'o' );
+                       if( is_halfop ) Channel_UserModeAdd( chan, c, 'h' );
                        if( is_voiced ) Channel_UserModeAdd( chan, c, 'v' );
 
                        /* announce to channel... */
@@ -251,12 +258,15 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req )
                        }
 
                        if( nick_out[0] != '\0' ) strlcat( nick_out, ",", sizeof( nick_out ));
+                       if( is_owner ) strlcat( nick_out, "~", sizeof( nick_out ));
+                       if( is_chanadmin ) strlcat( nick_out, "&", sizeof( nick_out ));
                        if( is_op ) strlcat( nick_out, "@", sizeof( nick_out ));
+                       if( is_halfop ) strlcat( nick_out, "%", sizeof( nick_out ));
                        if( is_voiced ) strlcat( nick_out, "+", sizeof( nick_out ));
                        strlcat( nick_out, ptr, sizeof( nick_out ));
                }
                else Log( LOG_ERR, "Got NJOIN for unknown nick \"%s\" for channel \"%s\"!", ptr, channame );
-               
+
                /* search for next Nick */
                ptr = strtok( NULL, "," );
        }
index 99d258284eb4624e173b0e8576959f1ff368e2ee..35d621a6e685f988007325f54974623093b54215 100644 (file)
@@ -21,7 +21,7 @@
 #define RPL_YOURHOST_MSG               "002 %s :Your host is %s, running version ngircd-%s (%s/%s/%s)"
 #define RPL_CREATED_MSG                        "003 %s :This server has been started %s"
 #define RPL_MYINFO_MSG                 "004 %s %s ngircd-%s %s %s"
-#define RPL_ISUPPORT1_MSG              "005 %s RFC2812 IRCD=ngIRCd CHARSET=UTF-8 CASEMAPPING=ascii PREFIX=(ov)@+ CHANTYPES=#&+ CHANMODES=beI,k,l,imMnOPRstz CHANLIMIT=#&+:%d :are supported on this server"
+#define RPL_ISUPPORT1_MSG              "005 %s RFC2812 IRCD=ngIRCd CHARSET=UTF-8 CASEMAPPING=ascii PREFIX=(qaohv)~&@%%+ CHANTYPES=#&+ CHANMODES=beI,k,l,imMnOPRstz CHANLIMIT=#&+:%d :are supported on this server"
 #define RPL_ISUPPORT2_MSG              "005 %s CHANNELLEN=%d NICKLEN=%d TOPICLEN=%d AWAYLEN=%d KICKLEN=%d MODES=%d MAXLIST=beI:%d EXCEPTS=e INVEX=I PENALTY :are supported on this server"
 
 #define RPL_TRACELINK_MSG              "200 %s Link %s-%s %s %s V%s %ld %d %d"
@@ -93,6 +93,7 @@
 #define RPL_ENDOFMOTD_MSG              "376 %s :End of MOTD command"
 #define RPL_WHOISHOST_MSG              "378 %s %s :is connecting from *@%s %s"
 #define RPL_YOUREOPER_MSG              "381 %s :You are now an IRC Operator"
+#define RPL_REHASHING_MSG              "382 %s :Rehashing"
 #define RPL_YOURESERVICE_MSG           "383 %s :You are service %s"
 #define RPL_TIME_MSG                   "391 %s %s :%s"
 #define RPL_HOSTHIDDEN_MSG             "396 %s %s :is your displayed hostname now"
 #define ERR_NEEDMOREPARAMS_MSG         "461 %s %s :Syntax error"
 #define ERR_ALREADYREGISTRED_MSG       "462 %s :Connection already registered"
 #define ERR_PASSWDMISMATCH_MSG         "464 %s :Invalid password"
-#define ERR_CHANNELISFULL_MSG          "471 %s %s :Cannot join channel (+l) -- Channel is too full, try later"
+#define ERR_CHANNELISFULL_MSG          "471 %s %s :Cannot join channel (+l) -- Channel is full, try later"
 #define ERR_SECURECHANNEL_MSG          "471 %s %s :Cannot join channel (+z) -- SSL connections only"
 #define ERR_OPONLYCHANNEL_MSG          "471 %s %s :Cannot join channel (+O) -- IRC opers only"
 #define ERR_REGONLYCHANNEL_MSG         "471 %s %s :Cannot join channel (+R) -- Registered users only"
 #define ERR_LISTFULL_MSG               "478 %s %s %s: Channel list is full (%d)"
 #define ERR_NOPRIVILEGES_MSG           "481 %s :Permission denied"
 #define ERR_CHANOPRIVSNEEDED_MSG       "482 %s %s :You are not channel operator"
+#define ERR_CHANOPPRIVTOOLOW_MSG       "482 %s %s :Your privileges are too low"
 #define ERR_CANTKILLSERVER_MSG         "483 %s :You can't kill a server!"
 #define ERR_RESTRICTED_MSG             "484 %s :Your connection is restricted"
 #define ERR_NICKREGISTER_MSG           "484 %s :Cannot modify user mode (+R) -- Use IRC services"
index bbfc6ce1118ef688e107dcb412c1fbb79121788c..50d91ce8e2dbff20c87e9dc54505e0bac3406019 100644 (file)
@@ -669,7 +669,7 @@ NGIRCd_Init(bool NGIRCd_NoDaemon)
        /* SSL initialization */
        if (!ConnSSL_InitLibrary())
                Log(LOG_WARNING,
-                   "Warning: Error during SSL initialization, continuing ...");
+                   "Error during SSL initialization, continuing without SSL ...");
 
        /* Change root */
        if (Conf_Chroot[0]) {
index d59a1dc3a9be6895de5f2565337fe8e29a3fbb40..4bce60fb12a947908f14118b7aa200439f4284df 100644 (file)
@@ -67,10 +67,17 @@ Announce_Channel(CLIENT *Client, CHANNEL *Chan)
                         * (if user is channel operator or has voice) */
                        if (str[strlen(str) - 1] != ':')
                                strlcat(str, ",", sizeof(str));
-                       if (strchr(Channel_UserModes(Chan, cl), 'v'))
-                               strlcat(str, "+", sizeof(str));
+                       if (strchr(Channel_UserModes(Chan, cl), 'q'))
+                               strlcat(str, "~", sizeof(str));
+                       if (strchr(Channel_UserModes(Chan, cl), 'a'))
+                               strlcat(str, "&", sizeof(str));
                        if (strchr(Channel_UserModes(Chan, cl), 'o'))
                                strlcat(str, "@", sizeof(str));
+                       if (strchr(Channel_UserModes(Chan, cl), 'h'))
+                               strlcat(str, "%", sizeof(str));
+                       if (strchr(Channel_UserModes(Chan, cl), 'v'))
+                               strlcat(str, "+", sizeof(str));
+
                        strlcat(str, Client_ID(cl), sizeof(str));
 
                        /* Send the data if the buffer is "full" */
index 839a69fd918df3588412d3fb4bd767b566305603..9bac6ac1ad6c587487b2bd74aeff82e166af178f 100644 (file)
@@ -1 +1,2 @@
+Makefile.am
 portabtest
diff --git a/src/portab/Makefile.am b/src/portab/Makefile.am
deleted file mode 100644 (file)
index a57ea49..0000000
+++ /dev/null
@@ -1,34 +0,0 @@
-#
-# ngIRCd -- The Next Generation IRC Daemon
-# Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
-#
-# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
-# der GNU General Public License (GPL), wie von der Free Software Foundation
-# herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
-# der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
-# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
-# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
-#
-
-AUTOMAKE_OPTIONS = ansi2knr
-
-noinst_LIBRARIES = libngportab.a
-
-libngportab_a_SOURCES = strdup.c strlcpy.c strtok_r.c vsnprintf.c waitpid.c
-
-check_PROGRAMS = portabtest
-
-portabtest_SOURCES = portabtest.c
-
-portabtest_LDFLAGS = -L.
-
-portabtest_LDADD = -lngportab
-
-noinst_HEADERS = imp.h exp.h portab.h splint.h
-
-maintainer-clean-local:
-       rm -f Makefile Makefile.in
-
-TESTS = portabtest
-
-# -eof-
diff --git a/src/portab/Makefile.ng b/src/portab/Makefile.ng
new file mode 100644 (file)
index 0000000..dac329f
--- /dev/null
@@ -0,0 +1,35 @@
+#
+# ngIRCd -- The Next Generation IRC Daemon
+# Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors
+#
+# 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 of the License, or
+# (at your option) any later version.
+# Please read the file COPYING, README and AUTHORS for more information.
+#
+
+__ng_Makefile_am_template__
+
+EXTRA_DIST = Makefile.ng
+
+noinst_LIBRARIES = libngportab.a
+
+libngportab_a_SOURCES = strdup.c strlcpy.c strtok_r.c vsnprintf.c waitpid.c
+
+check_PROGRAMS = portabtest
+
+portabtest_SOURCES = portabtest.c
+
+portabtest_LDFLAGS = -L.
+
+portabtest_LDADD = -lngportab
+
+noinst_HEADERS = imp.h exp.h portab.h splint.h
+
+maintainer-clean-local:
+       rm -f Makefile Makefile.in Makefile.am
+
+TESTS = portabtest
+
+# -eof-
index 5884a486590f98b275cb7b52a1187349b377035e..b33a08f4be74918b6160bf726acfa496d820561d 100644 (file)
@@ -1,3 +1,4 @@
+Makefile.am
 T-ngircd1
 T-ngircd2
 channel-test
diff --git a/src/testsuite/Makefile.am b/src/testsuite/Makefile.am
deleted file mode 100644 (file)
index 9dc76a7..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-#
-# ngIRCd -- The Next Generation IRC Daemon
-# Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors.
-#
-# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
-# der GNU General Public License (GPL), wie von der Free Software Foundation
-# herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
-# der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
-# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
-# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
-#
-
-AUTOMAKE_OPTIONS = ../portab/ansi2knr
-
-INCLUDES = -I$(srcdir)/../portab
-
-EXTRA_DIST = \
-       README functions.inc getpid.sh \
-       start-server.sh stop-server.sh tests.sh stress-server.sh \
-       test-loop.sh wait-tests.sh \
-       channel-test.e connect-test.e check-idle.e invite-test.e \
-       join-test.e kick-test.e message-test.e misc-test.e mode-test.e \
-       opless-channel-test.e server-link-test.e who-test.e whois-test.e \
-       stress-A.e stress-B.e \
-       start-server1 stop-server1 ngircd-test1.conf \
-       start-server2 stop-server2 ngircd-test2.conf
-
-all:
-
-clean-local:
-       rm -rf logs tests *-test ngircd-test*.log procs.tmp \
-        T-ngircd1 ngircd-test1.motd T-ngircd2 ngircd-test2.motd
-
-maintainer-clean-local:
-       rm -f Makefile Makefile.in
-
-check_SCRIPTS = ngircd-TEST-Binary tests.sh
-
-ngircd-TEST-Binary:
-       cp ../ngircd/ngircd T-ngircd1
-       cp ../ngircd/ngircd T-ngircd2
-       [ -f getpid.sh ] || ln -s $(srcdir)/getpid.sh .
-
-connect-test: tests.sh
-       rm -f connect-test
-       ln -s $(srcdir)/tests.sh connect-test
-
-channel-test: tests.sh
-       rm -f channel-test
-       ln -s $(srcdir)/tests.sh channel-test
-
-invite-test: tests.sh
-       rm -f invite-test
-       ln -s $(srcdir)/tests.sh invite-test
-
-join-test: tests.sh
-       rm -f join-test
-       ln -s $(srcdir)/tests.sh join-test
-
-kick-test: tests.sh
-       rm -f kick-test
-       ln -s $(srcdir)/tests.sh kick-test
-
-message-test: tests.sh
-       rm -f message-test
-       ln -s $(srcdir)/tests.sh message-test
-
-misc-test: tests.sh
-       rm -f misc-test
-       ln -s $(srcdir)/tests.sh misc-test
-
-mode-test: tests.sh
-       rm -f mode-test
-       ln -s $(srcdir)/tests.sh mode-test
-
-opless-channel-test: tests.sh
-       rm -f opless-channel-test
-       ln -s $(srcdir)/tests.sh opless-channel-test
-
-server-link-test: tests.sh
-       rm -f server-link-test
-       ln -s $(srcdir)/tests.sh server-link-test
-
-who-test: tests.sh
-       rm -f who-test
-       ln -s $(srcdir)/tests.sh who-test
-
-whois-test: tests.sh
-       rm -f whois-test
-       ln -s $(srcdir)/tests.sh whois-test
-
-TESTS = start-server1 \
-       connect-test \
-       start-server2 \
-       channel-test \
-       invite-test \
-       join-test \
-       kick-test \
-       message-test \
-       misc-test \
-       mode-test \
-       opless-channel-test \
-       who-test \
-       whois-test \
-       server-link-test \
-       stop-server2 \
-       stress-server.sh \
-       stop-server1
-
-# -eof-
diff --git a/src/testsuite/Makefile.ng b/src/testsuite/Makefile.ng
new file mode 100644 (file)
index 0000000..b906091
--- /dev/null
@@ -0,0 +1,109 @@
+#
+# ngIRCd -- The Next Generation IRC Daemon
+# Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors
+#
+# 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 of the License, or
+# (at your option) any later version.
+# Please read the file COPYING, README and AUTHORS for more information.
+#
+
+__ng_Makefile_am_template__
+
+AM_CPPFLAGS = -I$(srcdir)/../portab
+
+EXTRA_DIST = \
+       Makefile.ng README functions.inc getpid.sh \
+       start-server.sh stop-server.sh tests.sh stress-server.sh \
+       test-loop.sh wait-tests.sh \
+       channel-test.e connect-test.e check-idle.e invite-test.e \
+       join-test.e kick-test.e message-test.e misc-test.e mode-test.e \
+       opless-channel-test.e server-link-test.e who-test.e whois-test.e \
+       stress-A.e stress-B.e \
+       start-server1 stop-server1 ngircd-test1.conf \
+       start-server2 stop-server2 ngircd-test2.conf
+
+all:
+
+clean-local:
+       rm -rf logs tests *-test ngircd-test*.log procs.tmp \
+        T-ngircd1 ngircd-test1.motd T-ngircd2 ngircd-test2.motd
+
+maintainer-clean-local:
+       rm -f Makefile Makefile.in Makefile.am
+
+check_SCRIPTS = ngircd-TEST-Binary tests.sh
+
+ngircd-TEST-Binary:
+       cp ../ngircd/ngircd T-ngircd1
+       cp ../ngircd/ngircd T-ngircd2
+       [ -f getpid.sh ] || ln -s $(srcdir)/getpid.sh .
+
+connect-test: tests.sh
+       rm -f connect-test
+       ln -s $(srcdir)/tests.sh connect-test
+
+channel-test: tests.sh
+       rm -f channel-test
+       ln -s $(srcdir)/tests.sh channel-test
+
+invite-test: tests.sh
+       rm -f invite-test
+       ln -s $(srcdir)/tests.sh invite-test
+
+join-test: tests.sh
+       rm -f join-test
+       ln -s $(srcdir)/tests.sh join-test
+
+kick-test: tests.sh
+       rm -f kick-test
+       ln -s $(srcdir)/tests.sh kick-test
+
+message-test: tests.sh
+       rm -f message-test
+       ln -s $(srcdir)/tests.sh message-test
+
+misc-test: tests.sh
+       rm -f misc-test
+       ln -s $(srcdir)/tests.sh misc-test
+
+mode-test: tests.sh
+       rm -f mode-test
+       ln -s $(srcdir)/tests.sh mode-test
+
+opless-channel-test: tests.sh
+       rm -f opless-channel-test
+       ln -s $(srcdir)/tests.sh opless-channel-test
+
+server-link-test: tests.sh
+       rm -f server-link-test
+       ln -s $(srcdir)/tests.sh server-link-test
+
+who-test: tests.sh
+       rm -f who-test
+       ln -s $(srcdir)/tests.sh who-test
+
+whois-test: tests.sh
+       rm -f whois-test
+       ln -s $(srcdir)/tests.sh whois-test
+
+TESTS = start-server1 \
+       connect-test \
+       start-server2 \
+       channel-test \
+       invite-test \
+       join-test \
+       kick-test \
+       message-test \
+       misc-test \
+       mode-test \
+       opless-channel-test \
+       who-test \
+       whois-test \
+       server-link-test \
+       stop-server2 \
+       stress-server.sh \
+       stop-server1
+
+# -eof-
index 19ced7620f13d9befb989eae635ab1fcdfc2e6a2..96ab474685111b1322e9c806282f3debfb01ba21 100755 (executable)
@@ -10,7 +10,7 @@ UNAME=`uname`
 if [ $UNAME = "FreeBSD" ]; then
   PS_FLAGS="-a"; PS_PIDCOL="1"; HEAD_FLAGS="-n 1"
 elif [ $UNAME = "A/UX" ]; then
-  PS_FLAGS="-ae"; PS_PIDCOL="1"; HEAD_FLAGS="-1"
+  PS_FLAGS="-af"; PS_PIDCOL="2"; HEAD_FLAGS="-1"
 elif [ $UNAME = "GNU" ]; then
   PS_FLAGS="-ax"; PS_PIDCOL="2"; HEAD_FLAGS="-n 1"
 elif [ $UNAME = "Linux" ]; then
index 260cd03c12898ae46c5e9d58b1f5f4fb4bcf74ff..44b6e5dfe5a3bb3cb05dddba1e08498e1cb58bdd 100644 (file)
@@ -31,6 +31,46 @@ expect {
        "@* MODE nick :-i"
 }
 
+send "join #usermode\r"
+expect {
+       timeout { exit 1 }
+       "@* JOIN :#usermode"
+}
+expect {
+       timeout { exit 1 }
+       "366"
+}
+
+send "mode #usermode +v nick\r"
+expect {
+       timeout { exit 1 }
+       "@* MODE #usermode +v nick\r"
+}
+
+send "mode #usermode +h nick\r"
+expect {
+       timeout { exit 1 }
+       "@* MODE #usermode +h nick\r"
+}
+
+send "mode #usermode +a nick\r"
+expect {
+       timeout { exit 1 }
+       "482 nick"
+}
+
+send "mode #usermode +q nick\r"
+expect {
+       timeout { exit 1 }
+       "482 nick"
+}
+
+send "mode #usermode -vho nick nick nick\r"
+expect {
+       timeout { exit 1 }
+       "@* MODE #usermode -vho nick nick nick"
+}
+
 send "oper TestOp 123\r"
 expect {
        timeout { exit 1 }
@@ -47,6 +87,34 @@ expect {
        "221 nick +o"
 }
 
+send "mode #usermode +a nick\r"
+expect {
+       timeout { exit 1 }
+       "@* MODE #usermode +a nick"
+}
+
+send "mode #usermode +q nick\r"
+expect {
+       timeout { exit 1 }
+       "@* MODE #usermode +q nick"
+}
+
+send "names #usermode\r"
+expect {
+       timeout { exit 1 }
+       "353 nick = #usermode :~nick"
+}
+expect {
+       timeout { exit 1 }
+       "366 nick #usermode"
+}
+
+send "part #usermode\r"
+expect {
+       timeout { exit 1 }
+       "@* PART #usermode"
+}
+
 send "join #channel\r"
 expect {
        timeout { exit 1 }
index 0f85958e98c3acce91ebe67899fe319aea33f02b..15d6df1f68582abbaf869de08faedf0da7115475 100755 (executable)
@@ -1,7 +1,7 @@
 #!/bin/sh
 #
 # ngIRCd Test Suite
-# Copyright (c)2002-2004 by Alexander Barton (alex@barton.de)
+# Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
 #
 # 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
@@ -9,8 +9,6 @@
 # (at your option) any later version.
 # Please read the file COPYING, README and AUTHORS for more information.
 #
-# $Id: stress-server.sh,v 1.16 2005/12/30 22:13:21 alex Exp $
-#
 
 # detect source directory
 [ -z "$srcdir" ] && srcdir=`dirname $0`
@@ -23,7 +21,8 @@
 name=`basename $0`
 
 # create directories
-mkdir -p logs tests
+[ -d logs ] || mkdir logs
+[ -d tests ] || mkdir tests
 
 # test for required external tools
 type expect > /dev/null 2>&1
index 2bd9ae402125adb05db0e5e0adf27e2e6712b8ec..dc184ffc1fc552fa891dec508a127fdbd7812e63 100755 (executable)
@@ -1,13 +1,21 @@
 #!/bin/sh
+#
 # ngIRCd Test Suite
-# $Id: tests.sh,v 1.7 2004/09/06 22:04:06 alex Exp $
+# Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
+#
+# 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 of the License, or
+# (at your option) any later version.
+# Please read the file COPYING, README and AUTHORS for more information.
+#
 
 # detect source directory
 [ -z "$srcdir" ] && srcdir=`dirname $0`
 
 name=`basename $0`
 test=`echo ${name} | cut -d '.' -f 1`
-mkdir -p logs
+[ -d logs ] || mkdir logs
 
 if [ ! -r "$test" ]; then
   echo "      ${name}: test \"$test\" not found!";  exit 77
diff --git a/src/tool/.gitignore b/src/tool/.gitignore
new file mode 100644 (file)
index 0000000..08a6d72
--- /dev/null
@@ -0,0 +1 @@
+Makefile.am
diff --git a/src/tool/Makefile.am b/src/tool/Makefile.am
deleted file mode 100644 (file)
index 8d6cda4..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-#
-# ngIRCd -- The Next Generation IRC Daemon
-# Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors
-#
-# 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 of the License, or
-# (at your option) any later version.
-# Please read the file COPYING, README and AUTHORS for more information.
-#
-
-AUTOMAKE_OPTIONS = ../portab/ansi2knr
-
-INCLUDES = -I$(srcdir)/../portab
-
-noinst_LIBRARIES = libngtool.a
-
-libngtool_a_SOURCES = tool.c
-
-noinst_HEADERS = tool.h
-
-maintainer-clean-local:
-       rm -f Makefile Makefile.in
-
-# -eof-
diff --git a/src/tool/Makefile.ng b/src/tool/Makefile.ng
new file mode 100644 (file)
index 0000000..d88bdc9
--- /dev/null
@@ -0,0 +1,27 @@
+#
+# ngIRCd -- The Next Generation IRC Daemon
+# Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors
+#
+# 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 of the License, or
+# (at your option) any later version.
+# Please read the file COPYING, README and AUTHORS for more information.
+#
+
+__ng_Makefile_am_template__
+
+EXTRA_DIST = Makefile.ng
+
+AM_CPPFLAGS = -I$(srcdir)/../portab
+
+noinst_LIBRARIES = libngtool.a
+
+libngtool_a_SOURCES = tool.c
+
+noinst_HEADERS = tool.h
+
+maintainer-clean-local:
+       rm -f Makefile Makefile.in Makefile.am
+
+# -eof-