mirror of
https://github.com/osmarks/ngircd.git
synced 2025-09-29 23:42:24 +00:00
Compare commits
65 Commits
rel-19-rc1
...
rel-19.2
Author | SHA1 | Date | |
---|---|---|---|
![]() |
b9e6cb3e55 | ||
![]() |
dffe5a9d60 | ||
![]() |
d7eb343ea0 | ||
![]() |
bf5610a3b9 | ||
![]() |
7bce6780ca | ||
![]() |
bf121ae95f | ||
![]() |
7b6b492bdd | ||
![]() |
aa7db2c0e9 | ||
![]() |
684e50f0a4 | ||
![]() |
4a90959cb5 | ||
![]() |
9b1cf420f1 | ||
![]() |
e7e47e77a3 | ||
![]() |
695df6532e | ||
![]() |
6680b536c4 | ||
![]() |
a21a7d8b66 | ||
![]() |
c0d059cd0e | ||
![]() |
7faa3ed7d6 | ||
![]() |
c9b152fa41 | ||
![]() |
ae27571414 | ||
![]() |
5e5377a063 | ||
![]() |
884c5bcff1 | ||
![]() |
3a2fcc32cd | ||
![]() |
a8aa8c6cbc | ||
![]() |
f01b09ce84 | ||
![]() |
2419a701d8 | ||
![]() |
110be707c3 | ||
![]() |
b2743af0ed | ||
![]() |
76565022fb | ||
![]() |
4602cb9891 | ||
![]() |
1d7e99531a | ||
![]() |
f0a9dbe3ad | ||
![]() |
245782897b | ||
![]() |
2327b17656 | ||
![]() |
359732af85 | ||
![]() |
1dea0d91a0 | ||
![]() |
d67d077a71 | ||
![]() |
69be7a85a2 | ||
![]() |
8ec17063a6 | ||
![]() |
da4c1ebe81 | ||
![]() |
bd3a7ccb15 | ||
![]() |
edfcc2f9d5 | ||
![]() |
ee362b3bd2 | ||
![]() |
67bd1bf34f | ||
![]() |
9f3af061cf | ||
![]() |
88c3d4896a | ||
![]() |
7b6ef3bc8e | ||
![]() |
fbaa751da8 | ||
![]() |
06b6327875 | ||
![]() |
0d9740b9fa | ||
![]() |
e9be3334d1 | ||
![]() |
0ae74ceaed | ||
![]() |
17ffda1c8a | ||
![]() |
0de11ead36 | ||
![]() |
9d486db460 | ||
![]() |
257fe922d2 | ||
![]() |
1068f88377 | ||
![]() |
9e7360e5fa | ||
![]() |
273d4bdd32 | ||
![]() |
27d244dfae | ||
![]() |
a39a1a5273 | ||
![]() |
ef392e7d37 | ||
![]() |
c38751191f | ||
![]() |
5cbdcf4f0d | ||
![]() |
3641e51109 | ||
![]() |
3f46e93ccc |
75
ChangeLog
75
ChangeLog
@@ -9,7 +9,58 @@
|
||||
-- ChangeLog --
|
||||
|
||||
|
||||
ngIRCd Release 19
|
||||
ngIRCd Release 19.2 (2012-06-19)
|
||||
|
||||
- doc/Capabilities.txt: document "multi-prefix" capability
|
||||
|
||||
ngIRCd 19.2~rc1 (2012-06-13)
|
||||
- New configuration option "CloakHostModeX" to configure the hostname
|
||||
that gets used for IRC clients which have user mode "+x" enabled.
|
||||
Up to now, the name of the IRC server itself has been used for this,
|
||||
which still is the default when "CloakHostModeX" isn't set.
|
||||
- Correctly handle asynchronously re-established server links: a race
|
||||
condition could let the daemon loose track of an already re-established
|
||||
incoming server link while preparing its own outgoing connection.
|
||||
Peers that both try to connect each other could have been affected.
|
||||
- Log a debug message when SIGUSR2 is handled in debug mode.
|
||||
- Only allow alphanumeric characters in user-supplied user names of
|
||||
USER command and IDENT replies.
|
||||
- Change wording of "TLS initialized" message to make it more consistent.
|
||||
- Don't leak file descriptors on error path when creating "PID files".
|
||||
- Add missing mode "r" to CHANMODES in 005 "ISUPPORT" numeric.
|
||||
- Update doc/Modes.txt and doc/Platforms.txt documents.
|
||||
- contrib/platformtest.sh: correctly detect Open64 C compiler and handle
|
||||
"CC=xxx MAKE=yyy ./platformtest.sh" calling convention.
|
||||
- Add instructions for setting up Atheme IRC services.
|
||||
- Implement support for IRC capability handling, the new "CAP" command,
|
||||
and capablity "multi-prefix" which allows both the NAME and WHO command
|
||||
handlers to return more than one "class prefix" to the client.
|
||||
- Update Xcode project files: reference missing documentation files.
|
||||
- Fix: Don't ignore "permission denied" errors when enabling chroot.
|
||||
- FAQ: enhance description of chroot setup.
|
||||
|
||||
ngIRCd Release 19.1 (2012-03-19)
|
||||
|
||||
- Fix gcc warning (v4.6.3), initialize "list" variable to NULL.
|
||||
- Fix typos: "recieved" -> "received", "Please not" -> "Please note",
|
||||
and fix lintian(1) warning ""hyphen-used-as-minus-sign", too.
|
||||
- Really include _all_ patches to build the Anope module into the
|
||||
distribution archive ... ooops!
|
||||
- getpid.sh: Fix test case error for Debian using sbuild(1).
|
||||
- Don't log "ngIRCd hello message" two times when starting up.
|
||||
|
||||
ngIRCd Release 19 (2012-02-29)
|
||||
|
||||
- Update build system: bump config.guess and config.sub files used by
|
||||
GNU autoconf/automake to recent versions.
|
||||
- Fix configuration file parser: don't accept "[SSL]" blocks in the
|
||||
configuration file when no SSL support is built in ngIRCd.
|
||||
- Fix building ngIRCd with old gcc versions (e. g. 2.7.2).
|
||||
- Correctly re-open syslog logging after reading of configuration
|
||||
file: Syslog logging has been initialized before reading the
|
||||
configuration, so ngIRCd always used the default facility and ignored
|
||||
the "SyslogFacility" configuration option ...
|
||||
Thanks to Patrik Schindler for reporting this issue!
|
||||
|
||||
ngIRCd 19~rc1 (2012-02-12)
|
||||
- Enhance command limits for server links: the limit now is dependent
|
||||
@@ -18,7 +69,7 @@ ngIRCd Release 19
|
||||
- Log more information about server synchronization.
|
||||
- Update preliminary ngIRCd protocol module for Anope 1.9.6, which now
|
||||
is the only supported version.
|
||||
- New numeric RPL_WHOISHOST_MSG(378), which returns the DNS hostname
|
||||
- New numeric RPL_WHOISHOST_MSG(378), which returns the DNS host name
|
||||
(if available) and the IP address of a client in the WHOIS reply.
|
||||
Only the user itself and local IRC operators get this numeric.
|
||||
- Implement channel exception list (mode 'e'). This allows a channel
|
||||
@@ -64,7 +115,7 @@ ngIRCd Release 19
|
||||
commands: this reduces the possibility of flooding channels with
|
||||
commands like "PRIVMSG/NOTICE #a,#n,#c,... :message" a little bit.
|
||||
Problem noticed by Cahata, thanks!
|
||||
- Display correct error message when "Server{UID|GID}" variabe in the
|
||||
- Display correct error message when "Server{UID|GID}" variable in the
|
||||
configuration file is invalid (not a number and no existing user).
|
||||
- Update Copyright notices for 2012 :-)
|
||||
- JOIN command: don't stop handling of channel lists when a single
|
||||
@@ -106,8 +157,8 @@ ngIRCd Release 19
|
||||
- ./configure: Fix logic and quoting of poll() detection code: only use
|
||||
poll() when poll.h exists as well.
|
||||
- Suppress 'Can't create pre-defined channel: invalid name: ""' message.
|
||||
- whois-test: handle local hostname = "localhost.localdomain" using the
|
||||
pattern "localhost*" for valid local hostnames.
|
||||
- whois-test: handle local host name = "localhost.localdomain" using the
|
||||
pattern "localhost*" for valid local host names.
|
||||
- sample-ngircd.conf: show correct default for "PAM" variable: The
|
||||
default of "PAM" is "yes" when ngIRCd has been configured to use it,
|
||||
so show the correct default value in the sample configuration file.
|
||||
@@ -221,8 +272,8 @@ ngIRCd Release 18 (2011-07-10)
|
||||
variable description.
|
||||
- Don't use "the.net" in sample-ngircd.conf, use "example.net".
|
||||
- Terminate incoming connections on HTTP commands "GET" and "POST".
|
||||
- New configuration option "CloakHost": when set, this hostname is used for
|
||||
every client instead of the real DNS hostname (or IP address).
|
||||
- New configuration option "CloakHost": when set, this host name is used for
|
||||
every client instead of the real DNS host name (or IP address).
|
||||
- New configuration option "CloakUserToNick": when enabled, ngIRCd sets
|
||||
every clients' user name to their nick name and hides the user name
|
||||
supplied by the IRC client.
|
||||
@@ -327,7 +378,7 @@ ngIRCd Release 17 (2010-11-07)
|
||||
- configure script: correctly indent IPv6 yes/no summary output.
|
||||
- Don't reset My_Connections[Idx].lastping when reading data, so the
|
||||
client lag debug-output is working again.
|
||||
- Implement user mode "x": hostname cloaking (closes: #102).
|
||||
- Implement user mode "x": host name cloaking (closes: #102).
|
||||
- Make configure switch "--docdir" work (closes: #108).
|
||||
- Reformat and update FAQ.txt a little bit.
|
||||
- INSTALL: mention SSL, IPv6, and changed handling of MotdFile.
|
||||
@@ -432,7 +483,7 @@ ngIRCd Release 14.1 (2009-05-05)
|
||||
- Allow ping timeout quit messages to show the timeout value.
|
||||
- Fix error handling on compressed links.
|
||||
- Fix server list announcement.
|
||||
- Do not remove hostnames from info text.
|
||||
- Do not remove host names from info text.
|
||||
|
||||
ngIRCd Release 14 (2009-04-20)
|
||||
|
||||
@@ -528,7 +579,7 @@ ngIRCd 0.12.0 (2008-05-13)
|
||||
- RPL_WHOREPLY messages generated by IRC_WHO didn't include flags (*,@,+).
|
||||
(Dana Dahlstrom)
|
||||
- IRC_WHO now supports search patterns and will test this against user
|
||||
nickname/servername/hostname, etc. as required by RFC 2812, Section 3.6.1.
|
||||
nickname/server name/host name, etc. as required by RFC 2812, Section 3.6.1.
|
||||
(reported by Dana Dahlstrom)
|
||||
- Add test cases for "WHO" command. (Dana Dahlstrom)
|
||||
- Implement RFC 2812 handling of "0" argument to 'JOIN': must be treated
|
||||
@@ -551,7 +602,7 @@ ngIRCd 0.11.0 (2008-01-15)
|
||||
ngircd to crash [from HEAD]. (CVE-2008-0285)
|
||||
|
||||
ngIRCd 0.11.0-pre1 (2008-01-02)
|
||||
- Use dotted-decimal IP address if hostname is >= 64.
|
||||
- Use dotted-decimal IP address if host name is >= 64.
|
||||
- Add support for /STAT u (server uptime) command.
|
||||
- New [Server] configuration Option "Bind" allows to specify
|
||||
the source IP address to use when connecting to remote server.
|
||||
@@ -777,7 +828,7 @@ ngIRCd 0.8.0 (2004-06-26)
|
||||
original ircd exactly: the unnecessary but missing ":" before the last
|
||||
parameter has been added.
|
||||
- Fixed TRACE: don't output "Serv" lines for ourself; display more info.
|
||||
- Results of the resolver (hostnames and IDENT names) are discarded after
|
||||
- Results of the resolver (host names and IDENT names) are discarded after
|
||||
the client is successfully registered with the server.
|
||||
- Better logging while establishing and shutting down connections.
|
||||
- The type of service (TOS) of all sockets is set to "interactive" now.
|
||||
|
27
INSTALL
27
INSTALL
@@ -93,7 +93,8 @@ automake ("configure") should be no problem.
|
||||
The normal installation procedure after getting (and expanding) the source
|
||||
files (using a distribution archive or GIT) is as following:
|
||||
|
||||
1) ./autogen.sh [only necessary when using GIT]
|
||||
0) Satisfy prerequisites
|
||||
1) ./autogen.sh [only necessary when using GIT]
|
||||
2) ./configure
|
||||
3) make
|
||||
4) make install
|
||||
@@ -114,6 +115,30 @@ possible options will be installed there. You'll find its template in the
|
||||
doc/ directory: sample-ngircd.conf.
|
||||
|
||||
|
||||
0): Satisfy prerequisites
|
||||
|
||||
When building from source, you'll need some other software to build ngIRCd:
|
||||
for example a working C compiler, make tool, GNU automake and autoconf (only
|
||||
when not using a distribution archive), and a few libraries depending on the
|
||||
features you want to compile in (like IDENT support, SSL, and PAM).
|
||||
|
||||
If you are using one of the "big" operating systems or Linux distributions,
|
||||
you can use the following commands to install all the required packages to
|
||||
build the sources including all optional features and to run the test suite:
|
||||
|
||||
* RedHat / Fedora based distributions:
|
||||
|
||||
yum install \
|
||||
autoconf automake expect gcc glibc-devel gnutls-devel \
|
||||
libident-devel make pam-devel tcp_wrappers-devel telnet zlib-devel
|
||||
|
||||
* Debian / Ubuntu based distributions:
|
||||
|
||||
apt-get install \
|
||||
autoconf automake build-essential expect libgnutls-dev \
|
||||
libident-dev libpam-dev libwrap0-dev libz-dev telnet
|
||||
|
||||
|
||||
1): "autogen.sh"
|
||||
|
||||
The first step, autogen.sh, is only necessary if the configure-script isn't
|
||||
|
30
NEWS
30
NEWS
@@ -8,12 +8,30 @@
|
||||
|
||||
-- NEWS --
|
||||
|
||||
ngIRCd Release 19
|
||||
|
||||
ngIRCd Release 19.2 (2012-06-19)
|
||||
|
||||
ngIRCd 19.2~rc1 (2012-06-13)
|
||||
- New configuration option "CloakHostModeX" to configure the hostname
|
||||
that gets used for IRC clients which have user mode "+x" enabled.
|
||||
Up to now, the name of the IRC server itself has been used for this,
|
||||
which still is the default when "CloakHostModeX" isn't set.
|
||||
- Add instructions for setting up Atheme IRC services.
|
||||
- Implement support for IRC capability handling, the new "CAP" command,
|
||||
and capablity "multi-prefix" which allows both the NAME and WHO command
|
||||
handlers to return more than one "class prefix" to the client.
|
||||
|
||||
ngIRCd Release 19.1 (2012-03-19)
|
||||
|
||||
- Really include _all_ patches to build the Anope module into the
|
||||
distribution archive ... ooops!
|
||||
|
||||
ngIRCd Release 19 (2012-02-29)
|
||||
|
||||
ngIRCd 19~rc1 (2012-02-12)
|
||||
- Update preliminary ngIRCd protocol module for Anope 1.9.6, which now
|
||||
is the only supported version.
|
||||
- New numeric RPL_WHOISHOST_MSG(378), which returns the DNS hostname
|
||||
- New numeric RPL_WHOISHOST_MSG(378), which returns the DNS host name
|
||||
(if available) and the IP address of a client in the WHOIS reply.
|
||||
Only the user itself and local IRC operators get this numeric.
|
||||
- Implement channel exception list (mode 'e'). This allows a channel
|
||||
@@ -128,8 +146,8 @@ ngIRCd Release 18 (2011-07-10)
|
||||
(booleans, text strings, integer numbers) and add type information to each
|
||||
variable description.
|
||||
- Terminate incoming connections on HTTP commands "GET" and "POST".
|
||||
- New configuration option "CloakHost": when set, this hostname is used for
|
||||
every client instead of the real DNS hostname (or IP address).
|
||||
- New configuration option "CloakHost": when set, this host name is used for
|
||||
every client instead of the real DNS host name (or IP address).
|
||||
- New configuration option "CloakUserToNick": when enabled, ngIRCd sets
|
||||
every clients' user name to their nick name and hides the user name
|
||||
supplied by the IRC client.
|
||||
@@ -181,7 +199,7 @@ ngIRCd Release 17 (2010-11-07)
|
||||
- Enable the daemon to disable and enable "debug mode" on runtime using
|
||||
signal SIGUSR1, when debug code is compiled in, not only on startup
|
||||
using the command line parameters.
|
||||
- Implement user mode "x": hostname cloaking (closes: #102).
|
||||
- Implement user mode "x": host name cloaking (closes: #102).
|
||||
- Change MOTD file handling: ngIRCd now caches the contens of the MOTD
|
||||
file, so the daemon now requires a HUP signal or REHASH command to
|
||||
re-read the MOTD file when its content changed.
|
||||
@@ -286,7 +304,7 @@ ngIRCd 0.12.0 (2008-05-13)
|
||||
- Implemented IRC commands INFO, SUMMON (dummy), and USERS (dummy) and
|
||||
enhanced test suite to check these commands. (Dana Dahlstrom)
|
||||
- IRC_WHO now supports search patterns and will test this against user
|
||||
nickname/servername/hostname, etc. as required by RFC 2812, Section 3.6.1.
|
||||
nickname/server name/host name, etc. as required by RFC 2812, Section 3.6.1.
|
||||
(reported by Dana Dahlstrom)
|
||||
- Implement RFC 2812 handling of "0" argument to 'JOIN': must be treated
|
||||
as if the user had sent PART commands for all channels the user is a
|
||||
|
546
config.guess
vendored
546
config.guess
vendored
@@ -1,10 +1,10 @@
|
||||
#! /bin/sh
|
||||
# Attempt to guess a canonical system name.
|
||||
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
||||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
|
||||
# Free Software Foundation, Inc.
|
||||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
|
||||
# 2011, 2012 Free Software Foundation, Inc.
|
||||
|
||||
timestamp='2008-01-23'
|
||||
timestamp='2012-02-10'
|
||||
|
||||
# This file is free software; you can redistribute it and/or modify it
|
||||
# under the terms of the GNU General Public License as published by
|
||||
@@ -17,9 +17,7 @@ timestamp='2008-01-23'
|
||||
# General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
|
||||
# 02110-1301, USA.
|
||||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
@@ -27,16 +25,16 @@ timestamp='2008-01-23'
|
||||
# the same distribution terms that you use for the rest of that program.
|
||||
|
||||
|
||||
# Originally written by Per Bothner <per@bothner.com>.
|
||||
# Please send patches to <config-patches@gnu.org>. Submit a context
|
||||
# diff and a properly formatted ChangeLog entry.
|
||||
# Originally written by Per Bothner. Please send patches (context
|
||||
# diff format) to <config-patches@gnu.org> and include a ChangeLog
|
||||
# entry.
|
||||
#
|
||||
# This script attempts to guess a canonical system name similar to
|
||||
# config.sub. If it succeeds, it prints the system name on stdout, and
|
||||
# exits with 0. Otherwise, it exits with 1.
|
||||
#
|
||||
# The plan is that this can be called by configure scripts if you
|
||||
# don't specify an explicit build system type.
|
||||
# You can get the latest version of this script from:
|
||||
# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
|
||||
|
||||
me=`echo "$0" | sed -e 's,.*/,,'`
|
||||
|
||||
@@ -56,8 +54,9 @@ version="\
|
||||
GNU config.guess ($timestamp)
|
||||
|
||||
Originally written by Per Bothner.
|
||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
|
||||
2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
|
||||
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This is free software; see the source for copying conditions. There is NO
|
||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
||||
@@ -144,7 +143,7 @@ UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
|
||||
case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
||||
*:NetBSD:*:*)
|
||||
# NetBSD (nbsd) targets should (where applicable) match one or
|
||||
# more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*,
|
||||
# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,
|
||||
# *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
|
||||
# switched to ELF, *-*-netbsd* would select the old
|
||||
# object file format. This provides both forward
|
||||
@@ -170,7 +169,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
||||
arm*|i386|m68k|ns32k|sh3*|sparc|vax)
|
||||
eval $set_cc_for_build
|
||||
if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
|
||||
| grep __ELF__ >/dev/null
|
||||
| grep -q __ELF__
|
||||
then
|
||||
# Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
|
||||
# Return netbsd for either. FIX?
|
||||
@@ -180,7 +179,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
os=netbsd
|
||||
os=netbsd
|
||||
;;
|
||||
esac
|
||||
# The OS release
|
||||
@@ -223,7 +222,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
||||
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
|
||||
;;
|
||||
*5.*)
|
||||
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
|
||||
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
|
||||
;;
|
||||
esac
|
||||
# According to Compaq, /usr/sbin/psrinfo has been available on
|
||||
@@ -269,7 +268,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
||||
# A Xn.n version is an unreleased experimental baselevel.
|
||||
# 1.2 uses "1.2" for uname -r.
|
||||
echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
|
||||
exit ;;
|
||||
# Reset EXIT trap before exiting to avoid spurious non-zero exit code.
|
||||
exitcode=$?
|
||||
trap '' 0
|
||||
exit $exitcode ;;
|
||||
Alpha\ *:Windows_NT*:*)
|
||||
# How do we know it's Interix rather than the generic POSIX subsystem?
|
||||
# Should we change UNAME_MACHINE based on the output of uname instead
|
||||
@@ -295,7 +297,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
||||
echo s390-ibm-zvmoe
|
||||
exit ;;
|
||||
*:OS400:*:*)
|
||||
echo powerpc-ibm-os400
|
||||
echo powerpc-ibm-os400
|
||||
exit ;;
|
||||
arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
|
||||
echo arm-acorn-riscix${UNAME_RELEASE}
|
||||
@@ -324,14 +326,33 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
||||
case `/usr/bin/uname -p` in
|
||||
sparc) echo sparc-icl-nx7; exit ;;
|
||||
esac ;;
|
||||
s390x:SunOS:*:*)
|
||||
echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||
exit ;;
|
||||
sun4H:SunOS:5.*:*)
|
||||
echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||
exit ;;
|
||||
sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
|
||||
echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||
exit ;;
|
||||
i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
|
||||
echo i386-pc-auroraux${UNAME_RELEASE}
|
||||
exit ;;
|
||||
i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
|
||||
echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||
eval $set_cc_for_build
|
||||
SUN_ARCH="i386"
|
||||
# If there is a compiler, see if it is configured for 64-bit objects.
|
||||
# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.
|
||||
# This test works for both compilers.
|
||||
if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
|
||||
if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \
|
||||
(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
|
||||
grep IS_64BIT_ARCH >/dev/null
|
||||
then
|
||||
SUN_ARCH="x86_64"
|
||||
fi
|
||||
fi
|
||||
echo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||
exit ;;
|
||||
sun4*:SunOS:6*:*)
|
||||
# According to config.sub, this is the proper way to canonicalize
|
||||
@@ -375,23 +396,23 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
||||
# MiNT. But MiNT is downward compatible to TOS, so this should
|
||||
# be no problem.
|
||||
atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
|
||||
echo m68k-atari-mint${UNAME_RELEASE}
|
||||
echo m68k-atari-mint${UNAME_RELEASE}
|
||||
exit ;;
|
||||
atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
|
||||
echo m68k-atari-mint${UNAME_RELEASE}
|
||||
exit ;;
|
||||
exit ;;
|
||||
*falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
|
||||
echo m68k-atari-mint${UNAME_RELEASE}
|
||||
echo m68k-atari-mint${UNAME_RELEASE}
|
||||
exit ;;
|
||||
milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
|
||||
echo m68k-milan-mint${UNAME_RELEASE}
|
||||
exit ;;
|
||||
echo m68k-milan-mint${UNAME_RELEASE}
|
||||
exit ;;
|
||||
hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
|
||||
echo m68k-hades-mint${UNAME_RELEASE}
|
||||
exit ;;
|
||||
echo m68k-hades-mint${UNAME_RELEASE}
|
||||
exit ;;
|
||||
*:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
|
||||
echo m68k-unknown-mint${UNAME_RELEASE}
|
||||
exit ;;
|
||||
echo m68k-unknown-mint${UNAME_RELEASE}
|
||||
exit ;;
|
||||
m68k:machten:*:*)
|
||||
echo m68k-apple-machten${UNAME_RELEASE}
|
||||
exit ;;
|
||||
@@ -461,8 +482,8 @@ EOF
|
||||
echo m88k-motorola-sysv3
|
||||
exit ;;
|
||||
AViiON:dgux:*:*)
|
||||
# DG/UX returns AViiON for all architectures
|
||||
UNAME_PROCESSOR=`/usr/bin/uname -p`
|
||||
# DG/UX returns AViiON for all architectures
|
||||
UNAME_PROCESSOR=`/usr/bin/uname -p`
|
||||
if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
|
||||
then
|
||||
if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
|
||||
@@ -475,7 +496,7 @@ EOF
|
||||
else
|
||||
echo i586-dg-dgux${UNAME_RELEASE}
|
||||
fi
|
||||
exit ;;
|
||||
exit ;;
|
||||
M88*:DolphinOS:*:*) # DolphinOS (SVR3)
|
||||
echo m88k-dolphin-sysv3
|
||||
exit ;;
|
||||
@@ -532,7 +553,7 @@ EOF
|
||||
echo rs6000-ibm-aix3.2
|
||||
fi
|
||||
exit ;;
|
||||
*:AIX:*:[456])
|
||||
*:AIX:*:[4567])
|
||||
IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
|
||||
if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
|
||||
IBM_ARCH=rs6000
|
||||
@@ -575,52 +596,52 @@ EOF
|
||||
9000/[678][0-9][0-9])
|
||||
if [ -x /usr/bin/getconf ]; then
|
||||
sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
|
||||
sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
|
||||
case "${sc_cpu_version}" in
|
||||
523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
|
||||
528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
|
||||
532) # CPU_PA_RISC2_0
|
||||
case "${sc_kernel_bits}" in
|
||||
32) HP_ARCH="hppa2.0n" ;;
|
||||
64) HP_ARCH="hppa2.0w" ;;
|
||||
sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
|
||||
case "${sc_cpu_version}" in
|
||||
523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
|
||||
528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
|
||||
532) # CPU_PA_RISC2_0
|
||||
case "${sc_kernel_bits}" in
|
||||
32) HP_ARCH="hppa2.0n" ;;
|
||||
64) HP_ARCH="hppa2.0w" ;;
|
||||
'') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
|
||||
esac ;;
|
||||
esac
|
||||
esac ;;
|
||||
esac
|
||||
fi
|
||||
if [ "${HP_ARCH}" = "" ]; then
|
||||
eval $set_cc_for_build
|
||||
sed 's/^ //' << EOF >$dummy.c
|
||||
sed 's/^ //' << EOF >$dummy.c
|
||||
|
||||
#define _HPUX_SOURCE
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#define _HPUX_SOURCE
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int main ()
|
||||
{
|
||||
#if defined(_SC_KERNEL_BITS)
|
||||
long bits = sysconf(_SC_KERNEL_BITS);
|
||||
#endif
|
||||
long cpu = sysconf (_SC_CPU_VERSION);
|
||||
int main ()
|
||||
{
|
||||
#if defined(_SC_KERNEL_BITS)
|
||||
long bits = sysconf(_SC_KERNEL_BITS);
|
||||
#endif
|
||||
long cpu = sysconf (_SC_CPU_VERSION);
|
||||
|
||||
switch (cpu)
|
||||
{
|
||||
case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
|
||||
case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
|
||||
case CPU_PA_RISC2_0:
|
||||
#if defined(_SC_KERNEL_BITS)
|
||||
switch (bits)
|
||||
{
|
||||
case 64: puts ("hppa2.0w"); break;
|
||||
case 32: puts ("hppa2.0n"); break;
|
||||
default: puts ("hppa2.0"); break;
|
||||
} break;
|
||||
#else /* !defined(_SC_KERNEL_BITS) */
|
||||
puts ("hppa2.0"); break;
|
||||
#endif
|
||||
default: puts ("hppa1.0"); break;
|
||||
}
|
||||
exit (0);
|
||||
}
|
||||
switch (cpu)
|
||||
{
|
||||
case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
|
||||
case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
|
||||
case CPU_PA_RISC2_0:
|
||||
#if defined(_SC_KERNEL_BITS)
|
||||
switch (bits)
|
||||
{
|
||||
case 64: puts ("hppa2.0w"); break;
|
||||
case 32: puts ("hppa2.0n"); break;
|
||||
default: puts ("hppa2.0"); break;
|
||||
} break;
|
||||
#else /* !defined(_SC_KERNEL_BITS) */
|
||||
puts ("hppa2.0"); break;
|
||||
#endif
|
||||
default: puts ("hppa1.0"); break;
|
||||
}
|
||||
exit (0);
|
||||
}
|
||||
EOF
|
||||
(CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
|
||||
test -z "$HP_ARCH" && HP_ARCH=hppa
|
||||
@@ -640,7 +661,7 @@ EOF
|
||||
# => hppa64-hp-hpux11.23
|
||||
|
||||
if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
|
||||
grep __LP64__ >/dev/null
|
||||
grep -q __LP64__
|
||||
then
|
||||
HP_ARCH="hppa2.0w"
|
||||
else
|
||||
@@ -711,22 +732,22 @@ EOF
|
||||
exit ;;
|
||||
C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
|
||||
echo c1-convex-bsd
|
||||
exit ;;
|
||||
exit ;;
|
||||
C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
|
||||
if getsysinfo -f scalar_acc
|
||||
then echo c32-convex-bsd
|
||||
else echo c2-convex-bsd
|
||||
fi
|
||||
exit ;;
|
||||
exit ;;
|
||||
C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
|
||||
echo c34-convex-bsd
|
||||
exit ;;
|
||||
exit ;;
|
||||
C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
|
||||
echo c38-convex-bsd
|
||||
exit ;;
|
||||
exit ;;
|
||||
C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
|
||||
echo c4-convex-bsd
|
||||
exit ;;
|
||||
exit ;;
|
||||
CRAY*Y-MP:*:*:*)
|
||||
echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
|
||||
exit ;;
|
||||
@@ -750,14 +771,14 @@ EOF
|
||||
exit ;;
|
||||
F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
|
||||
FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
|
||||
FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
|
||||
FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
|
||||
echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
|
||||
exit ;;
|
||||
FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
|
||||
FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
|
||||
echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
|
||||
exit ;;
|
||||
5000:UNIX_System_V:4.*:*)
|
||||
FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
|
||||
FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
|
||||
echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
|
||||
FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
|
||||
FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
|
||||
echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
|
||||
exit ;;
|
||||
i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
|
||||
echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
|
||||
@@ -769,13 +790,12 @@ EOF
|
||||
echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
|
||||
exit ;;
|
||||
*:FreeBSD:*:*)
|
||||
case ${UNAME_MACHINE} in
|
||||
pc98)
|
||||
echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
|
||||
UNAME_PROCESSOR=`/usr/bin/uname -p`
|
||||
case ${UNAME_PROCESSOR} in
|
||||
amd64)
|
||||
echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
|
||||
*)
|
||||
echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
|
||||
echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
|
||||
esac
|
||||
exit ;;
|
||||
i*:CYGWIN*:*)
|
||||
@@ -784,19 +804,22 @@ EOF
|
||||
*:MINGW*:*)
|
||||
echo ${UNAME_MACHINE}-pc-mingw32
|
||||
exit ;;
|
||||
i*:MSYS*:*)
|
||||
echo ${UNAME_MACHINE}-pc-msys
|
||||
exit ;;
|
||||
i*:windows32*:*)
|
||||
# uname -m includes "-pc" on this system.
|
||||
echo ${UNAME_MACHINE}-mingw32
|
||||
# uname -m includes "-pc" on this system.
|
||||
echo ${UNAME_MACHINE}-mingw32
|
||||
exit ;;
|
||||
i*:PW*:*)
|
||||
echo ${UNAME_MACHINE}-pc-pw32
|
||||
exit ;;
|
||||
*:Interix*:[3456]*)
|
||||
case ${UNAME_MACHINE} in
|
||||
*:Interix*:*)
|
||||
case ${UNAME_MACHINE} in
|
||||
x86)
|
||||
echo i586-pc-interix${UNAME_RELEASE}
|
||||
exit ;;
|
||||
EM64T | authenticamd)
|
||||
authenticamd | genuineintel | EM64T)
|
||||
echo x86_64-unknown-interix${UNAME_RELEASE}
|
||||
exit ;;
|
||||
IA64)
|
||||
@@ -806,6 +829,9 @@ EOF
|
||||
[345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
|
||||
echo i${UNAME_MACHINE}-pc-mks
|
||||
exit ;;
|
||||
8664:Windows_NT:*)
|
||||
echo x86_64-pc-mks
|
||||
exit ;;
|
||||
i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
|
||||
# How do we know it's Interix rather than the generic POSIX subsystem?
|
||||
# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
|
||||
@@ -835,92 +861,13 @@ EOF
|
||||
i*86:Minix:*:*)
|
||||
echo ${UNAME_MACHINE}-pc-minix
|
||||
exit ;;
|
||||
arm*:Linux:*:*)
|
||||
eval $set_cc_for_build
|
||||
if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
|
||||
| grep -q __ARM_EABI__
|
||||
then
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
else
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnueabi
|
||||
fi
|
||||
exit ;;
|
||||
avr32*:Linux:*:*)
|
||||
aarch64:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
cris:Linux:*:*)
|
||||
echo cris-axis-linux-gnu
|
||||
exit ;;
|
||||
crisv32:Linux:*:*)
|
||||
echo crisv32-axis-linux-gnu
|
||||
exit ;;
|
||||
frv:Linux:*:*)
|
||||
echo frv-unknown-linux-gnu
|
||||
exit ;;
|
||||
ia64:Linux:*:*)
|
||||
aarch64_be:Linux:*:*)
|
||||
UNAME_MACHINE=aarch64_be
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
m32r*:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
m68*:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
mips:Linux:*:*)
|
||||
eval $set_cc_for_build
|
||||
sed 's/^ //' << EOF >$dummy.c
|
||||
#undef CPU
|
||||
#undef mips
|
||||
#undef mipsel
|
||||
#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
|
||||
CPU=mipsel
|
||||
#else
|
||||
#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
|
||||
CPU=mips
|
||||
#else
|
||||
CPU=
|
||||
#endif
|
||||
#endif
|
||||
EOF
|
||||
eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
|
||||
/^CPU/{
|
||||
s: ::g
|
||||
p
|
||||
}'`"
|
||||
test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
|
||||
;;
|
||||
mips64:Linux:*:*)
|
||||
eval $set_cc_for_build
|
||||
sed 's/^ //' << EOF >$dummy.c
|
||||
#undef CPU
|
||||
#undef mips64
|
||||
#undef mips64el
|
||||
#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
|
||||
CPU=mips64el
|
||||
#else
|
||||
#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
|
||||
CPU=mips64
|
||||
#else
|
||||
CPU=
|
||||
#endif
|
||||
#endif
|
||||
EOF
|
||||
eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
|
||||
/^CPU/{
|
||||
s: ::g
|
||||
p
|
||||
}'`"
|
||||
test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
|
||||
;;
|
||||
or32:Linux:*:*)
|
||||
echo or32-unknown-linux-gnu
|
||||
exit ;;
|
||||
ppc:Linux:*:*)
|
||||
echo powerpc-unknown-linux-gnu
|
||||
exit ;;
|
||||
ppc64:Linux:*:*)
|
||||
echo powerpc64-unknown-linux-gnu
|
||||
exit ;;
|
||||
alpha:Linux:*:*)
|
||||
case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
|
||||
EV5) UNAME_MACHINE=alphaev5 ;;
|
||||
@@ -930,11 +877,90 @@ EOF
|
||||
EV6) UNAME_MACHINE=alphaev6 ;;
|
||||
EV67) UNAME_MACHINE=alphaev67 ;;
|
||||
EV68*) UNAME_MACHINE=alphaev68 ;;
|
||||
esac
|
||||
objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
|
||||
esac
|
||||
objdump --private-headers /bin/sh | grep -q ld.so.1
|
||||
if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
|
||||
exit ;;
|
||||
arm*:Linux:*:*)
|
||||
eval $set_cc_for_build
|
||||
if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \
|
||||
| grep -q __ARM_EABI__
|
||||
then
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
else
|
||||
if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \
|
||||
| grep -q __ARM_PCS_VFP
|
||||
then
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnueabi
|
||||
else
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnueabihf
|
||||
fi
|
||||
fi
|
||||
exit ;;
|
||||
avr32*:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
cris:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-axis-linux-gnu
|
||||
exit ;;
|
||||
crisv32:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-axis-linux-gnu
|
||||
exit ;;
|
||||
frv:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
hexagon:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
i*86:Linux:*:*)
|
||||
LIBC=gnu
|
||||
eval $set_cc_for_build
|
||||
sed 's/^ //' << EOF >$dummy.c
|
||||
#ifdef __dietlibc__
|
||||
LIBC=dietlibc
|
||||
#endif
|
||||
EOF
|
||||
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
|
||||
echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
|
||||
exit ;;
|
||||
ia64:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
m32r*:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
m68*:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
mips:Linux:*:* | mips64:Linux:*:*)
|
||||
eval $set_cc_for_build
|
||||
sed 's/^ //' << EOF >$dummy.c
|
||||
#undef CPU
|
||||
#undef ${UNAME_MACHINE}
|
||||
#undef ${UNAME_MACHINE}el
|
||||
#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)
|
||||
CPU=${UNAME_MACHINE}el
|
||||
#else
|
||||
#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)
|
||||
CPU=${UNAME_MACHINE}
|
||||
#else
|
||||
CPU=
|
||||
#endif
|
||||
#endif
|
||||
EOF
|
||||
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
|
||||
test x"${CPU}" != x && { echo "${CPU}-unknown-linux-gnu"; exit; }
|
||||
;;
|
||||
or32:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
padre:Linux:*:*)
|
||||
echo sparc-unknown-linux-gnu
|
||||
exit ;;
|
||||
parisc64:Linux:*:* | hppa64:Linux:*:*)
|
||||
echo hppa64-unknown-linux-gnu
|
||||
exit ;;
|
||||
parisc:Linux:*:* | hppa:Linux:*:*)
|
||||
# Look for CPU level
|
||||
case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
|
||||
@@ -943,14 +969,17 @@ EOF
|
||||
*) echo hppa-unknown-linux-gnu ;;
|
||||
esac
|
||||
exit ;;
|
||||
parisc64:Linux:*:* | hppa64:Linux:*:*)
|
||||
echo hppa64-unknown-linux-gnu
|
||||
ppc64:Linux:*:*)
|
||||
echo powerpc64-unknown-linux-gnu
|
||||
exit ;;
|
||||
ppc:Linux:*:*)
|
||||
echo powerpc-unknown-linux-gnu
|
||||
exit ;;
|
||||
s390:Linux:*:* | s390x:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-ibm-linux
|
||||
exit ;;
|
||||
sh64*:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
sh*:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
@@ -958,78 +987,18 @@ EOF
|
||||
sparc:Linux:*:* | sparc64:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
tile*:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
vax:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-dec-linux-gnu
|
||||
exit ;;
|
||||
x86_64:Linux:*:*)
|
||||
echo x86_64-unknown-linux-gnu
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
xtensa*:Linux:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||
exit ;;
|
||||
i*86:Linux:*:*)
|
||||
# The BFD linker knows what the default object file format is, so
|
||||
# first see if it will tell us. cd to the root directory to prevent
|
||||
# problems with other programs or directories called `ld' in the path.
|
||||
# Set LC_ALL=C to ensure ld outputs messages in English.
|
||||
ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \
|
||||
| sed -ne '/supported targets:/!d
|
||||
s/[ ][ ]*/ /g
|
||||
s/.*supported targets: *//
|
||||
s/ .*//
|
||||
p'`
|
||||
case "$ld_supported_targets" in
|
||||
elf32-i386)
|
||||
TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu"
|
||||
;;
|
||||
a.out-i386-linux)
|
||||
echo "${UNAME_MACHINE}-pc-linux-gnuaout"
|
||||
exit ;;
|
||||
coff-i386)
|
||||
echo "${UNAME_MACHINE}-pc-linux-gnucoff"
|
||||
exit ;;
|
||||
"")
|
||||
# Either a pre-BFD a.out linker (linux-gnuoldld) or
|
||||
# one that does not give us useful --help.
|
||||
echo "${UNAME_MACHINE}-pc-linux-gnuoldld"
|
||||
exit ;;
|
||||
esac
|
||||
# Determine whether the default compiler is a.out or elf
|
||||
eval $set_cc_for_build
|
||||
sed 's/^ //' << EOF >$dummy.c
|
||||
#include <features.h>
|
||||
#ifdef __ELF__
|
||||
# ifdef __GLIBC__
|
||||
# if __GLIBC__ >= 2
|
||||
LIBC=gnu
|
||||
# else
|
||||
LIBC=gnulibc1
|
||||
# endif
|
||||
# else
|
||||
LIBC=gnulibc1
|
||||
# endif
|
||||
#else
|
||||
#if defined(__INTEL_COMPILER) || defined(__PGI) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
|
||||
LIBC=gnu
|
||||
#else
|
||||
LIBC=gnuaout
|
||||
#endif
|
||||
#endif
|
||||
#ifdef __dietlibc__
|
||||
LIBC=dietlibc
|
||||
#endif
|
||||
EOF
|
||||
eval "`$CC_FOR_BUILD -E $dummy.c 2>/dev/null | sed -n '
|
||||
/^LIBC/{
|
||||
s: ::g
|
||||
p
|
||||
}'`"
|
||||
test x"${LIBC}" != x && {
|
||||
echo "${UNAME_MACHINE}-pc-linux-${LIBC}"
|
||||
exit
|
||||
}
|
||||
test x"${TENTATIVE}" != x && { echo "${TENTATIVE}"; exit; }
|
||||
;;
|
||||
i*86:DYNIX/ptx:4*:*)
|
||||
# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
|
||||
# earlier versions are messed up and put the nodename in both
|
||||
@@ -1037,11 +1006,11 @@ EOF
|
||||
echo i386-sequent-sysv4
|
||||
exit ;;
|
||||
i*86:UNIX_SV:4.2MP:2.*)
|
||||
# Unixware is an offshoot of SVR4, but it has its own version
|
||||
# number series starting with 2...
|
||||
# I am not positive that other SVR4 systems won't match this,
|
||||
# Unixware is an offshoot of SVR4, but it has its own version
|
||||
# number series starting with 2...
|
||||
# I am not positive that other SVR4 systems won't match this,
|
||||
# I just have to hope. -- rms.
|
||||
# Use sysv4.2uw... so that sysv4* matches it.
|
||||
# Use sysv4.2uw... so that sysv4* matches it.
|
||||
echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
|
||||
exit ;;
|
||||
i*86:OS/2:*:*)
|
||||
@@ -1058,7 +1027,7 @@ EOF
|
||||
i*86:syllable:*:*)
|
||||
echo ${UNAME_MACHINE}-pc-syllable
|
||||
exit ;;
|
||||
i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*)
|
||||
i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)
|
||||
echo i386-unknown-lynxos${UNAME_RELEASE}
|
||||
exit ;;
|
||||
i*86:*DOS:*:*)
|
||||
@@ -1073,7 +1042,7 @@ EOF
|
||||
fi
|
||||
exit ;;
|
||||
i*86:*:5:[678]*)
|
||||
# UnixWare 7.x, OpenUNIX and OpenServer 6.
|
||||
# UnixWare 7.x, OpenUNIX and OpenServer 6.
|
||||
case `/bin/uname -X | grep "^Machine"` in
|
||||
*486*) UNAME_MACHINE=i486 ;;
|
||||
*Pentium) UNAME_MACHINE=i586 ;;
|
||||
@@ -1101,10 +1070,13 @@ EOF
|
||||
exit ;;
|
||||
pc:*:*:*)
|
||||
# Left here for compatibility:
|
||||
# uname -m prints for DJGPP always 'pc', but it prints nothing about
|
||||
# the processor, so we play safe by assuming i386.
|
||||
echo i386-pc-msdosdjgpp
|
||||
exit ;;
|
||||
# uname -m prints for DJGPP always 'pc', but it prints nothing about
|
||||
# the processor, so we play safe by assuming i586.
|
||||
# Note: whatever this is, it MUST be the same as what config.sub
|
||||
# prints for the "djgpp" host, or else GDB configury will decide that
|
||||
# this is a cross-build.
|
||||
echo i586-pc-msdosdjgpp
|
||||
exit ;;
|
||||
Intel:Mach:3*:*)
|
||||
echo i386-pc-mach3
|
||||
exit ;;
|
||||
@@ -1139,8 +1111,18 @@ EOF
|
||||
/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
|
||||
&& { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
|
||||
3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
|
||||
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
|
||||
&& { echo i486-ncr-sysv4; exit; } ;;
|
||||
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
|
||||
&& { echo i486-ncr-sysv4; exit; } ;;
|
||||
NCR*:*:4.2:* | MPRAS*:*:4.2:*)
|
||||
OS_REL='.3'
|
||||
test -r /etc/.relid \
|
||||
&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
|
||||
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
|
||||
&& { echo i486-ncr-sysv4.3${OS_REL}; exit; }
|
||||
/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
|
||||
&& { echo i586-ncr-sysv4.3${OS_REL}; exit; }
|
||||
/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \
|
||||
&& { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
|
||||
m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
|
||||
echo m68k-unknown-lynxos${UNAME_RELEASE}
|
||||
exit ;;
|
||||
@@ -1153,7 +1135,7 @@ EOF
|
||||
rs6000:LynxOS:2.*:*)
|
||||
echo rs6000-unknown-lynxos${UNAME_RELEASE}
|
||||
exit ;;
|
||||
PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*)
|
||||
PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)
|
||||
echo powerpc-unknown-lynxos${UNAME_RELEASE}
|
||||
exit ;;
|
||||
SM[BE]S:UNIX_SV:*:*)
|
||||
@@ -1173,10 +1155,10 @@ EOF
|
||||
echo ns32k-sni-sysv
|
||||
fi
|
||||
exit ;;
|
||||
PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
|
||||
# says <Richard.M.Bartel@ccMail.Census.GOV>
|
||||
echo i586-unisys-sysv4
|
||||
exit ;;
|
||||
PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
|
||||
# says <Richard.M.Bartel@ccMail.Census.GOV>
|
||||
echo i586-unisys-sysv4
|
||||
exit ;;
|
||||
*:UNIX_System_V:4*:FTX*)
|
||||
# From Gerald Hewes <hewes@openmarket.com>.
|
||||
# How about differentiating between stratus architectures? -djm
|
||||
@@ -1202,11 +1184,11 @@ EOF
|
||||
exit ;;
|
||||
R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
|
||||
if [ -d /usr/nec ]; then
|
||||
echo mips-nec-sysv${UNAME_RELEASE}
|
||||
echo mips-nec-sysv${UNAME_RELEASE}
|
||||
else
|
||||
echo mips-unknown-sysv${UNAME_RELEASE}
|
||||
echo mips-unknown-sysv${UNAME_RELEASE}
|
||||
fi
|
||||
exit ;;
|
||||
exit ;;
|
||||
BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
|
||||
echo powerpc-be-beos
|
||||
exit ;;
|
||||
@@ -1216,6 +1198,9 @@ EOF
|
||||
BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
|
||||
echo i586-pc-beos
|
||||
exit ;;
|
||||
BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
|
||||
echo i586-pc-haiku
|
||||
exit ;;
|
||||
SX-4:SUPER-UX:*:*)
|
||||
echo sx4-nec-superux${UNAME_RELEASE}
|
||||
exit ;;
|
||||
@@ -1243,6 +1228,16 @@ EOF
|
||||
*:Darwin:*:*)
|
||||
UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
|
||||
case $UNAME_PROCESSOR in
|
||||
i386)
|
||||
eval $set_cc_for_build
|
||||
if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
|
||||
if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
|
||||
(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
|
||||
grep IS_64BIT_ARCH >/dev/null
|
||||
then
|
||||
UNAME_PROCESSOR="x86_64"
|
||||
fi
|
||||
fi ;;
|
||||
unknown) UNAME_PROCESSOR=powerpc ;;
|
||||
esac
|
||||
echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
|
||||
@@ -1258,6 +1253,9 @@ EOF
|
||||
*:QNX:*:4*)
|
||||
echo i386-pc-qnx
|
||||
exit ;;
|
||||
NEO-?:NONSTOP_KERNEL:*:*)
|
||||
echo neo-tandem-nsk${UNAME_RELEASE}
|
||||
exit ;;
|
||||
NSE-?:NONSTOP_KERNEL:*:*)
|
||||
echo nse-tandem-nsk${UNAME_RELEASE}
|
||||
exit ;;
|
||||
@@ -1303,13 +1301,13 @@ EOF
|
||||
echo pdp10-unknown-its
|
||||
exit ;;
|
||||
SEI:*:*:SEIUX)
|
||||
echo mips-sei-seiux${UNAME_RELEASE}
|
||||
echo mips-sei-seiux${UNAME_RELEASE}
|
||||
exit ;;
|
||||
*:DragonFly:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
|
||||
exit ;;
|
||||
*:*VMS:*:*)
|
||||
UNAME_MACHINE=`(uname -p) 2>/dev/null`
|
||||
UNAME_MACHINE=`(uname -p) 2>/dev/null`
|
||||
case "${UNAME_MACHINE}" in
|
||||
A*) echo alpha-dec-vms ; exit ;;
|
||||
I*) echo ia64-dec-vms ; exit ;;
|
||||
@@ -1324,6 +1322,12 @@ EOF
|
||||
i*86:rdos:*:*)
|
||||
echo ${UNAME_MACHINE}-pc-rdos
|
||||
exit ;;
|
||||
i*86:AROS:*:*)
|
||||
echo ${UNAME_MACHINE}-pc-aros
|
||||
exit ;;
|
||||
x86_64:VMkernel:*:*)
|
||||
echo ${UNAME_MACHINE}-unknown-esx
|
||||
exit ;;
|
||||
esac
|
||||
|
||||
#echo '(No uname command or uname output not recognized.)' 1>&2
|
||||
@@ -1346,11 +1350,11 @@ main ()
|
||||
#include <sys/param.h>
|
||||
printf ("m68k-sony-newsos%s\n",
|
||||
#ifdef NEWSOS4
|
||||
"4"
|
||||
"4"
|
||||
#else
|
||||
""
|
||||
""
|
||||
#endif
|
||||
); exit (0);
|
||||
); exit (0);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
269
config.sub
vendored
269
config.sub
vendored
@@ -1,10 +1,10 @@
|
||||
#! /bin/sh
|
||||
# Configuration validation subroutine script.
|
||||
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
||||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
|
||||
# Free Software Foundation, Inc.
|
||||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
|
||||
# 2011, 2012 Free Software Foundation, Inc.
|
||||
|
||||
timestamp='2008-01-16'
|
||||
timestamp='2012-02-10'
|
||||
|
||||
# This file is (in principle) common to ALL GNU software.
|
||||
# The presence of a machine in this file suggests that SOME GNU software
|
||||
@@ -21,9 +21,7 @@ timestamp='2008-01-16'
|
||||
# GNU General Public License for more details.
|
||||
#
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# along with this program; if not, write to the Free Software
|
||||
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
|
||||
# 02110-1301, USA.
|
||||
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# As a special exception to the GNU General Public License, if you
|
||||
# distribute this file as part of a program that contains a
|
||||
@@ -32,13 +30,16 @@ timestamp='2008-01-16'
|
||||
|
||||
|
||||
# Please send patches to <config-patches@gnu.org>. Submit a context
|
||||
# diff and a properly formatted ChangeLog entry.
|
||||
# diff and a properly formatted GNU ChangeLog entry.
|
||||
#
|
||||
# Configuration subroutine to validate and canonicalize a configuration type.
|
||||
# Supply the specified configuration type as an argument.
|
||||
# If it is invalid, we print an error message on stderr and exit with code 1.
|
||||
# Otherwise, we print the canonical config type on stdout and succeed.
|
||||
|
||||
# You can get the latest version of this script from:
|
||||
# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD
|
||||
|
||||
# This file is supposed to be the same for all GNU packages
|
||||
# and recognize all the CPU types, system types and aliases
|
||||
# that are meaningful with *any* GNU software.
|
||||
@@ -72,8 +73,9 @@ Report bugs and patches to <config-patches@gnu.org>."
|
||||
version="\
|
||||
GNU config.sub ($timestamp)
|
||||
|
||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
|
||||
2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
|
||||
2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This is free software; see the source for copying conditions. There is NO
|
||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
||||
@@ -120,12 +122,18 @@ esac
|
||||
# Here we must recognize all the valid KERNEL-OS combinations.
|
||||
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
|
||||
case $maybe_os in
|
||||
nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
|
||||
uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
|
||||
nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
|
||||
linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
|
||||
knetbsd*-gnu* | netbsd*-gnu* | \
|
||||
kopensolaris*-gnu* | \
|
||||
storm-chaos* | os2-emx* | rtmk-nova*)
|
||||
os=-$maybe_os
|
||||
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
|
||||
;;
|
||||
android-linux)
|
||||
os=-linux-android
|
||||
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown
|
||||
;;
|
||||
*)
|
||||
basic_machine=`echo $1 | sed 's/-[^-]*$//'`
|
||||
if [ $basic_machine != $1 ]
|
||||
@@ -148,10 +156,13 @@ case $os in
|
||||
-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
|
||||
-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
|
||||
-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
|
||||
-apple | -axis | -knuth | -cray)
|
||||
-apple | -axis | -knuth | -cray | -microblaze)
|
||||
os=
|
||||
basic_machine=$1
|
||||
;;
|
||||
-bluegene*)
|
||||
os=-cnk
|
||||
;;
|
||||
-sim | -cisco | -oki | -wec | -winbond)
|
||||
os=
|
||||
basic_machine=$1
|
||||
@@ -166,10 +177,10 @@ case $os in
|
||||
os=-chorusos
|
||||
basic_machine=$1
|
||||
;;
|
||||
-chorusrdb)
|
||||
os=-chorusrdb
|
||||
-chorusrdb)
|
||||
os=-chorusrdb
|
||||
basic_machine=$1
|
||||
;;
|
||||
;;
|
||||
-hiux*)
|
||||
os=-hiuxwe2
|
||||
;;
|
||||
@@ -238,24 +249,32 @@ case $basic_machine in
|
||||
# Some are omitted here because they have special meanings below.
|
||||
1750a | 580 \
|
||||
| a29k \
|
||||
| aarch64 | aarch64_be \
|
||||
| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
|
||||
| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
|
||||
| am33_2.0 \
|
||||
| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
|
||||
| be32 | be64 \
|
||||
| bfin \
|
||||
| c4x | clipper \
|
||||
| d10v | d30v | dlx | dsp16xx \
|
||||
| epiphany \
|
||||
| fido | fr30 | frv \
|
||||
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
|
||||
| hexagon \
|
||||
| i370 | i860 | i960 | ia64 \
|
||||
| ip2k | iq2000 \
|
||||
| le32 | le64 \
|
||||
| lm32 \
|
||||
| m32c | m32r | m32rle | m68000 | m68k | m88k \
|
||||
| maxq | mb | microblaze | mcore | mep \
|
||||
| maxq | mb | microblaze | mcore | mep | metag \
|
||||
| mips | mipsbe | mipseb | mipsel | mipsle \
|
||||
| mips16 \
|
||||
| mips64 | mips64el \
|
||||
| mips64vr | mips64vrel \
|
||||
| mips64octeon | mips64octeonel \
|
||||
| mips64orion | mips64orionel \
|
||||
| mips64r5900 | mips64r5900el \
|
||||
| mips64vr | mips64vrel \
|
||||
| mips64vr4100 | mips64vr4100el \
|
||||
| mips64vr4300 | mips64vr4300el \
|
||||
| mips64vr5000 | mips64vr5000el \
|
||||
@@ -268,29 +287,42 @@ case $basic_machine in
|
||||
| mipsisa64sr71k | mipsisa64sr71kel \
|
||||
| mipstx39 | mipstx39el \
|
||||
| mn10200 | mn10300 \
|
||||
| moxie \
|
||||
| mt \
|
||||
| msp430 \
|
||||
| nds32 | nds32le | nds32be \
|
||||
| nios | nios2 \
|
||||
| ns16k | ns32k \
|
||||
| open8 \
|
||||
| or32 \
|
||||
| pdp10 | pdp11 | pj | pjl \
|
||||
| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
|
||||
| powerpc | powerpc64 | powerpc64le | powerpcle \
|
||||
| pyramid \
|
||||
| rl78 | rx \
|
||||
| score \
|
||||
| sh | sh[1234] | sh[24]a | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
|
||||
| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
|
||||
| sh64 | sh64le \
|
||||
| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
|
||||
| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
|
||||
| spu | strongarm \
|
||||
| tahoe | thumb | tic4x | tic80 | tron \
|
||||
| v850 | v850e \
|
||||
| spu \
|
||||
| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
|
||||
| ubicom32 \
|
||||
| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
|
||||
| we32k \
|
||||
| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
|
||||
| z8k)
|
||||
| x86 | xc16x | xstormy16 | xtensa \
|
||||
| z8k | z80)
|
||||
basic_machine=$basic_machine-unknown
|
||||
;;
|
||||
m6811 | m68hc11 | m6812 | m68hc12)
|
||||
# Motorola 68HC11/12.
|
||||
c54x)
|
||||
basic_machine=tic54x-unknown
|
||||
;;
|
||||
c55x)
|
||||
basic_machine=tic55x-unknown
|
||||
;;
|
||||
c6x)
|
||||
basic_machine=tic6x-unknown
|
||||
;;
|
||||
m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)
|
||||
basic_machine=$basic_machine-unknown
|
||||
os=-none
|
||||
;;
|
||||
@@ -300,6 +332,21 @@ case $basic_machine in
|
||||
basic_machine=mt-unknown
|
||||
;;
|
||||
|
||||
strongarm | thumb | xscale)
|
||||
basic_machine=arm-unknown
|
||||
;;
|
||||
xgate)
|
||||
basic_machine=$basic_machine-unknown
|
||||
os=-none
|
||||
;;
|
||||
xscaleeb)
|
||||
basic_machine=armeb-unknown
|
||||
;;
|
||||
|
||||
xscaleel)
|
||||
basic_machine=armel-unknown
|
||||
;;
|
||||
|
||||
# We use `pc' rather than `unknown'
|
||||
# because (1) that's what they normally are, and
|
||||
# (2) the word "unknown" tends to confuse beginning users.
|
||||
@@ -314,29 +361,36 @@ case $basic_machine in
|
||||
# Recognize the basic CPU types with company name.
|
||||
580-* \
|
||||
| a29k-* \
|
||||
| aarch64-* | aarch64_be-* \
|
||||
| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
|
||||
| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
|
||||
| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
|
||||
| arm-* | armbe-* | armle-* | armeb-* | armv*-* \
|
||||
| avr-* | avr32-* \
|
||||
| be32-* | be64-* \
|
||||
| bfin-* | bs2000-* \
|
||||
| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
|
||||
| c[123]* | c30-* | [cjt]90-* | c4x-* \
|
||||
| clipper-* | craynv-* | cydra-* \
|
||||
| d10v-* | d30v-* | dlx-* \
|
||||
| elxsi-* \
|
||||
| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
|
||||
| h8300-* | h8500-* \
|
||||
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
|
||||
| hexagon-* \
|
||||
| i*86-* | i860-* | i960-* | ia64-* \
|
||||
| ip2k-* | iq2000-* \
|
||||
| le32-* | le64-* \
|
||||
| lm32-* \
|
||||
| m32c-* | m32r-* | m32rle-* \
|
||||
| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
|
||||
| m88110-* | m88k-* | maxq-* | mcore-* \
|
||||
| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
|
||||
| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
|
||||
| mips16-* \
|
||||
| mips64-* | mips64el-* \
|
||||
| mips64vr-* | mips64vrel-* \
|
||||
| mips64octeon-* | mips64octeonel-* \
|
||||
| mips64orion-* | mips64orionel-* \
|
||||
| mips64r5900-* | mips64r5900el-* \
|
||||
| mips64vr-* | mips64vrel-* \
|
||||
| mips64vr4100-* | mips64vr4100el-* \
|
||||
| mips64vr4300-* | mips64vr4300el-* \
|
||||
| mips64vr5000-* | mips64vr5000el-* \
|
||||
@@ -351,27 +405,32 @@ case $basic_machine in
|
||||
| mmix-* \
|
||||
| mt-* \
|
||||
| msp430-* \
|
||||
| nds32-* | nds32le-* | nds32be-* \
|
||||
| nios-* | nios2-* \
|
||||
| none-* | np1-* | ns16k-* | ns32k-* \
|
||||
| open8-* \
|
||||
| orion-* \
|
||||
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
|
||||
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
|
||||
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
|
||||
| pyramid-* \
|
||||
| romp-* | rs6000-* \
|
||||
| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
|
||||
| rl78-* | romp-* | rs6000-* | rx-* \
|
||||
| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
|
||||
| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
|
||||
| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
|
||||
| sparclite-* \
|
||||
| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
|
||||
| tahoe-* | thumb-* \
|
||||
| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
|
||||
| tahoe-* \
|
||||
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
|
||||
| tile*-* \
|
||||
| tron-* \
|
||||
| v850-* | v850e-* | vax-* \
|
||||
| ubicom32-* \
|
||||
| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
|
||||
| vax-* \
|
||||
| we32k-* \
|
||||
| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
|
||||
| x86-* | x86_64-* | xc16x-* | xps100-* \
|
||||
| xstormy16-* | xtensa*-* \
|
||||
| ymp-* \
|
||||
| z8k-*)
|
||||
| z8k-* | z80-*)
|
||||
;;
|
||||
# Recognize the basic CPU types without company name, with glob match.
|
||||
xtensa*)
|
||||
@@ -393,7 +452,7 @@ case $basic_machine in
|
||||
basic_machine=a29k-amd
|
||||
os=-udi
|
||||
;;
|
||||
abacus)
|
||||
abacus)
|
||||
basic_machine=abacus-unknown
|
||||
;;
|
||||
adobe68k)
|
||||
@@ -439,6 +498,10 @@ case $basic_machine in
|
||||
basic_machine=m68k-apollo
|
||||
os=-bsd
|
||||
;;
|
||||
aros)
|
||||
basic_machine=i386-pc
|
||||
os=-aros
|
||||
;;
|
||||
aux)
|
||||
basic_machine=m68k-apple
|
||||
os=-aux
|
||||
@@ -455,10 +518,27 @@ case $basic_machine in
|
||||
basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
os=-linux
|
||||
;;
|
||||
bluegene*)
|
||||
basic_machine=powerpc-ibm
|
||||
os=-cnk
|
||||
;;
|
||||
c54x-*)
|
||||
basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
c55x-*)
|
||||
basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
c6x-*)
|
||||
basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
c90)
|
||||
basic_machine=c90-cray
|
||||
os=-unicos
|
||||
;;
|
||||
cegcc)
|
||||
basic_machine=arm-unknown
|
||||
os=-cegcc
|
||||
;;
|
||||
convex-c1)
|
||||
basic_machine=c1-convex
|
||||
os=-bsd
|
||||
@@ -487,7 +567,7 @@ case $basic_machine in
|
||||
basic_machine=craynv-cray
|
||||
os=-unicosmp
|
||||
;;
|
||||
cr16)
|
||||
cr16 | cr16-*)
|
||||
basic_machine=cr16-unknown
|
||||
os=-elf
|
||||
;;
|
||||
@@ -526,6 +606,10 @@ case $basic_machine in
|
||||
basic_machine=m88k-motorola
|
||||
os=-sysv3
|
||||
;;
|
||||
dicos)
|
||||
basic_machine=i686-pc
|
||||
os=-dicos
|
||||
;;
|
||||
djgpp)
|
||||
basic_machine=i586-pc
|
||||
os=-msdosdjgpp
|
||||
@@ -641,7 +725,6 @@ case $basic_machine in
|
||||
i370-ibm* | ibm*)
|
||||
basic_machine=i370-ibm
|
||||
;;
|
||||
# I'm not sure what "Sysv32" means. Should this be sysv3.2?
|
||||
i*86v32)
|
||||
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
||||
os=-sysv32
|
||||
@@ -699,6 +782,9 @@ case $basic_machine in
|
||||
basic_machine=ns32k-utek
|
||||
os=-sysv
|
||||
;;
|
||||
microblaze)
|
||||
basic_machine=microblaze-xilinx
|
||||
;;
|
||||
mingw32)
|
||||
basic_machine=i386-pc
|
||||
os=-mingw32
|
||||
@@ -735,10 +821,18 @@ case $basic_machine in
|
||||
ms1-*)
|
||||
basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
|
||||
;;
|
||||
msys)
|
||||
basic_machine=i386-pc
|
||||
os=-msys
|
||||
;;
|
||||
mvs)
|
||||
basic_machine=i370-ibm
|
||||
os=-mvs
|
||||
;;
|
||||
nacl)
|
||||
basic_machine=le32-unknown
|
||||
os=-nacl
|
||||
;;
|
||||
ncr3000)
|
||||
basic_machine=i486-ncr
|
||||
os=-sysv4
|
||||
@@ -803,6 +897,12 @@ case $basic_machine in
|
||||
np1)
|
||||
basic_machine=np1-gould
|
||||
;;
|
||||
neo-tandem)
|
||||
basic_machine=neo-tandem
|
||||
;;
|
||||
nse-tandem)
|
||||
basic_machine=nse-tandem
|
||||
;;
|
||||
nsr-tandem)
|
||||
basic_machine=nsr-tandem
|
||||
;;
|
||||
@@ -885,9 +985,10 @@ case $basic_machine in
|
||||
;;
|
||||
power) basic_machine=power-ibm
|
||||
;;
|
||||
ppc) basic_machine=powerpc-unknown
|
||||
ppc | ppcbe) basic_machine=powerpc-unknown
|
||||
;;
|
||||
ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
ppc-* | ppcbe-*)
|
||||
basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
ppcle | powerpclittle | ppc-le | powerpc-little)
|
||||
basic_machine=powerpcle-unknown
|
||||
@@ -981,6 +1082,9 @@ case $basic_machine in
|
||||
basic_machine=i860-stratus
|
||||
os=-sysv4
|
||||
;;
|
||||
strongarm-* | thumb-*)
|
||||
basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||
;;
|
||||
sun2)
|
||||
basic_machine=m68000-sun
|
||||
;;
|
||||
@@ -1037,20 +1141,8 @@ case $basic_machine in
|
||||
basic_machine=t90-cray
|
||||
os=-unicos
|
||||
;;
|
||||
tic54x | c54x*)
|
||||
basic_machine=tic54x-unknown
|
||||
os=-coff
|
||||
;;
|
||||
tic55x | c55x*)
|
||||
basic_machine=tic55x-unknown
|
||||
os=-coff
|
||||
;;
|
||||
tic6x | c6x*)
|
||||
basic_machine=tic6x-unknown
|
||||
os=-coff
|
||||
;;
|
||||
tile*)
|
||||
basic_machine=tile-unknown
|
||||
basic_machine=$basic_machine-unknown
|
||||
os=-linux-gnu
|
||||
;;
|
||||
tx39)
|
||||
@@ -1120,6 +1212,9 @@ case $basic_machine in
|
||||
xps | xps100)
|
||||
basic_machine=xps100-honeywell
|
||||
;;
|
||||
xscale-* | xscalee[bl]-*)
|
||||
basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
|
||||
;;
|
||||
ymp)
|
||||
basic_machine=ymp-cray
|
||||
os=-unicos
|
||||
@@ -1128,6 +1223,10 @@ case $basic_machine in
|
||||
basic_machine=z8k-unknown
|
||||
os=-sim
|
||||
;;
|
||||
z80-*-coff)
|
||||
basic_machine=z80-unknown
|
||||
os=-sim
|
||||
;;
|
||||
none)
|
||||
basic_machine=none-none
|
||||
os=-none
|
||||
@@ -1166,7 +1265,7 @@ case $basic_machine in
|
||||
we32k)
|
||||
basic_machine=we32k-att
|
||||
;;
|
||||
sh[1234] | sh[24]a | sh[34]eb | sh[1234]le | sh[23]ele)
|
||||
sh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)
|
||||
basic_machine=sh-unknown
|
||||
;;
|
||||
sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
|
||||
@@ -1213,9 +1312,12 @@ esac
|
||||
if [ x"$os" != x"" ]
|
||||
then
|
||||
case $os in
|
||||
# First match some system type aliases
|
||||
# that might get confused with valid system types.
|
||||
# First match some system type aliases
|
||||
# that might get confused with valid system types.
|
||||
# -solaris* is a basic system type, with this one exception.
|
||||
-auroraux)
|
||||
os=-auroraux
|
||||
;;
|
||||
-solaris1 | -solaris1.*)
|
||||
os=`echo $os | sed -e 's|solaris1|sunos4|'`
|
||||
;;
|
||||
@@ -1236,10 +1338,11 @@ case $os in
|
||||
# Each alternative MUST END IN A *, to match a version number.
|
||||
# -sysv* is not here because it comes later, after sysvr4.
|
||||
-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
|
||||
| -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
|
||||
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
|
||||
| -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
|
||||
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
|
||||
| -sym* | -kopensolaris* \
|
||||
| -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
|
||||
| -aos* \
|
||||
| -aos* | -aros* \
|
||||
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
|
||||
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
|
||||
| -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
|
||||
@@ -1248,9 +1351,10 @@ case $os in
|
||||
| -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
|
||||
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
|
||||
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
|
||||
| -chorusos* | -chorusrdb* \
|
||||
| -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
|
||||
| -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
|
||||
| -chorusos* | -chorusrdb* | -cegcc* \
|
||||
| -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
|
||||
| -mingw32* | -linux-gnu* | -linux-android* \
|
||||
| -linux-newlib* | -linux-uclibc* \
|
||||
| -uxpv* | -beos* | -mpeix* | -udk* \
|
||||
| -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
|
||||
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
|
||||
@@ -1258,7 +1362,7 @@ case $os in
|
||||
| -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
|
||||
| -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
|
||||
| -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
|
||||
| -skyos* | -haiku* | -rdos* | -toppers* | -drops*)
|
||||
| -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
|
||||
# Remember, each alternative MUST END IN *, to match a version number.
|
||||
;;
|
||||
-qnx*)
|
||||
@@ -1297,7 +1401,7 @@ case $os in
|
||||
-opened*)
|
||||
os=-openedition
|
||||
;;
|
||||
-os400*)
|
||||
-os400*)
|
||||
os=-os400
|
||||
;;
|
||||
-wince*)
|
||||
@@ -1346,7 +1450,7 @@ case $os in
|
||||
-sinix*)
|
||||
os=-sysv4
|
||||
;;
|
||||
-tpf*)
|
||||
-tpf*)
|
||||
os=-tpf
|
||||
;;
|
||||
-triton*)
|
||||
@@ -1388,6 +1492,11 @@ case $os in
|
||||
-zvmoe)
|
||||
os=-zvmoe
|
||||
;;
|
||||
-dicos*)
|
||||
os=-dicos
|
||||
;;
|
||||
-nacl*)
|
||||
;;
|
||||
-none)
|
||||
;;
|
||||
*)
|
||||
@@ -1410,10 +1519,10 @@ else
|
||||
# system, and we'll never get to this point.
|
||||
|
||||
case $basic_machine in
|
||||
score-*)
|
||||
score-*)
|
||||
os=-elf
|
||||
;;
|
||||
spu-*)
|
||||
spu-*)
|
||||
os=-elf
|
||||
;;
|
||||
*-acorn)
|
||||
@@ -1425,8 +1534,17 @@ case $basic_machine in
|
||||
arm*-semi)
|
||||
os=-aout
|
||||
;;
|
||||
c4x-* | tic4x-*)
|
||||
os=-coff
|
||||
c4x-* | tic4x-*)
|
||||
os=-coff
|
||||
;;
|
||||
tic54x-*)
|
||||
os=-coff
|
||||
;;
|
||||
tic55x-*)
|
||||
os=-coff
|
||||
;;
|
||||
tic6x-*)
|
||||
os=-coff
|
||||
;;
|
||||
# This must come before the *-dec entry.
|
||||
pdp10-*)
|
||||
@@ -1446,14 +1564,11 @@ case $basic_machine in
|
||||
;;
|
||||
m68000-sun)
|
||||
os=-sunos3
|
||||
# This also exists in the configure program, but was not the
|
||||
# default.
|
||||
# os=-sunos4
|
||||
;;
|
||||
m68*-cisco)
|
||||
os=-aout
|
||||
;;
|
||||
mep-*)
|
||||
mep-*)
|
||||
os=-elf
|
||||
;;
|
||||
mips*-cisco)
|
||||
@@ -1480,7 +1595,7 @@ case $basic_machine in
|
||||
*-ibm)
|
||||
os=-aix
|
||||
;;
|
||||
*-knuth)
|
||||
*-knuth)
|
||||
os=-mmixware
|
||||
;;
|
||||
*-wec)
|
||||
@@ -1585,7 +1700,7 @@ case $basic_machine in
|
||||
-sunos*)
|
||||
vendor=sun
|
||||
;;
|
||||
-aix*)
|
||||
-cnk*|-aix*)
|
||||
vendor=ibm
|
||||
;;
|
||||
-beos*)
|
||||
|
@@ -12,7 +12,21 @@
|
||||
EXTRA_DIST = \
|
||||
README \
|
||||
0001-Revert-Removed-ngircd.patch \
|
||||
0002-ngircd-whitespace-fixes.patch
|
||||
0002-ngircd-whitespace-fixes.patch \
|
||||
0003-Update-ngIRCd-protocol-module-for-current-Anope-1.9.patch \
|
||||
0004-ngircd-Do-PING-PONG-on-server-burst-to-sync-servers.patch \
|
||||
0005-ngircd-always-prefix-modes-in-CHANINFO-with.patch \
|
||||
0006-ngircd-support-user-mode-R-and-channel-mode-R.patch \
|
||||
0007-ngircd-Fix-handling-of-JOIN-commands.patch \
|
||||
0008-ngircd-Allow-setting-modes-by-clients-on-burst.patch \
|
||||
0009-ngircd-Update-protocol-module-for-current-Anope-1.9.patch \
|
||||
0010-ngircd-Add-ProtongIRCd.patch \
|
||||
0011-ngircd-Update-protocol-module-for-current-Anope-1.9.patch \
|
||||
0012-ngircd-Channel-mode-r-is-supported-now.patch \
|
||||
0013-ngircd-Update-copyright-notice.patch \
|
||||
0014-ngircd-set-unset-GLINE-s-on-AKILL-commands.patch \
|
||||
0015-ngircd-ngIRCd-supports-channel-mode-e-now.patch \
|
||||
0016-ngircd-support-SQUERY-command.patch
|
||||
|
||||
maintainer-clean-local:
|
||||
rm -f Makefile Makefile.in
|
||||
|
@@ -1,3 +1,27 @@
|
||||
ngircd (19.2-0ab1) unstable; urgency=low
|
||||
|
||||
* New "upstream" release: ngIRCd 19.2.
|
||||
|
||||
-- Alexander Barton <alex@barton.de> Tue, 19 Jun 2012 11:03:12 +0200
|
||||
|
||||
ngircd (19.2~rc1-0ab1) unstable; urgency=low
|
||||
|
||||
* New "upstream" release candidate 1 for ngIRC Release 19.2.
|
||||
|
||||
-- Alexander Barton <alex@barton.de> Wed, 13 Jun 2012 10:59:34 +0200
|
||||
|
||||
ngircd (19.1-0ab1) unstable; urgency=low
|
||||
|
||||
* New "upstream" release: ngIRCd 19.1.
|
||||
|
||||
-- Alexander Barton <alex@barton.de> Mon, 19 Mar 2012 19:18:28 +0100
|
||||
|
||||
ngircd (19-0ab1) unstable; urgency=low
|
||||
|
||||
* New "upstream" release: ngIRCd 19.
|
||||
|
||||
-- Alexander Barton <alex@barton.de> Wed, 29 Feb 2012 17:34:08 +0100
|
||||
|
||||
ngircd (19~rc1-0ab1) unstable; urgency=low
|
||||
|
||||
* New "upstream" release candidate 1 for ngIRCd Release 19.
|
||||
|
@@ -156,7 +156,7 @@ Each version is given a distinguishing version number. If the Program specifies
|
||||
{\colortbl;\red255\green255\blue255;}
|
||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural
|
||||
|
||||
\f0\fs26 \cf0 Please not:\
|
||||
\f0\fs26 \cf0 Please note:\
|
||||
\
|
||||
\pard\tx260\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li260\fi-260\ql\qnatural\pardirnatural
|
||||
\cf0 \'95 You
|
||||
|
@@ -41,6 +41,9 @@
|
||||
FAA3D27B0F139CDC00B2447E /* conn-ssl.c in Sources */ = {isa = PBXBuildFile; fileRef = FAA3D2790F139CDC00B2447E /* conn-ssl.c */; };
|
||||
FAA97C57124A271400D5BBA9 /* sighandlers.c in Sources */ = {isa = PBXBuildFile; fileRef = FAA97C55124A271400D5BBA9 /* sighandlers.c */; };
|
||||
FAACD5F514A6099C006ED74F /* class.c in Sources */ = {isa = PBXBuildFile; fileRef = FAACD5F314A6099C006ED74F /* class.c */; };
|
||||
FAD5853215271AAB00328741 /* client-cap.c in Sources */ = {isa = PBXBuildFile; fileRef = FAD5853015271AAB00328741 /* client-cap.c */; };
|
||||
FAD5853515271AB800328741 /* irc-cap.c in Sources */ = {isa = PBXBuildFile; fileRef = FAD5853315271AB800328741 /* irc-cap.c */; };
|
||||
FAD5853815272C2600328741 /* login.c in Sources */ = {isa = PBXBuildFile; fileRef = FAD5853615272C2500328741 /* login.c */; };
|
||||
FAE5CC2E0CF2308A007D69B6 /* numeric.c in Sources */ = {isa = PBXBuildFile; fileRef = FAE5CC2D0CF2308A007D69B6 /* numeric.c */; };
|
||||
/* End PBXBuildFile section */
|
||||
|
||||
@@ -231,6 +234,19 @@
|
||||
FAA97C56124A271400D5BBA9 /* sighandlers.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = sighandlers.h; sourceTree = "<group>"; };
|
||||
FAACD5F314A6099C006ED74F /* class.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = class.c; sourceTree = "<group>"; };
|
||||
FAACD5F414A6099C006ED74F /* class.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = class.h; sourceTree = "<group>"; };
|
||||
FAD5852F15271A7800328741 /* Capabilities.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = Capabilities.txt; sourceTree = "<group>"; };
|
||||
FAD5853015271AAB00328741 /* client-cap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "client-cap.c"; sourceTree = "<group>"; };
|
||||
FAD5853115271AAB00328741 /* client-cap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "client-cap.h"; sourceTree = "<group>"; };
|
||||
FAD5853315271AB800328741 /* irc-cap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "irc-cap.c"; sourceTree = "<group>"; };
|
||||
FAD5853415271AB800328741 /* irc-cap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "irc-cap.h"; sourceTree = "<group>"; };
|
||||
FAD5853615272C2500328741 /* login.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = login.c; sourceTree = "<group>"; };
|
||||
FAD5853715272C2500328741 /* login.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = login.h; sourceTree = "<group>"; };
|
||||
FAE22BD215270EA300F1A5AB /* Bopm.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = Bopm.txt; sourceTree = "<group>"; };
|
||||
FAE22BD415270EA300F1A5AB /* Contributing.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = Contributing.txt; sourceTree = "<group>"; };
|
||||
FAE22BD515270EB500F1A5AB /* HowToRelease.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = HowToRelease.txt; sourceTree = "<group>"; };
|
||||
FAE22BD615270EB500F1A5AB /* Modes.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = Modes.txt; sourceTree = "<group>"; };
|
||||
FAE22BD715270EB500F1A5AB /* PAM.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = PAM.txt; sourceTree = "<group>"; };
|
||||
FAE22BD815270EC400F1A5AB /* README-Interix.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = "README-Interix.txt"; sourceTree = "<group>"; };
|
||||
FAE5CC2C0CF2308A007D69B6 /* numeric.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = numeric.h; sourceTree = "<group>"; };
|
||||
FAE5CC2D0CF2308A007D69B6 /* numeric.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = numeric.c; sourceTree = "<group>"; };
|
||||
/* End PBXFileReference section */
|
||||
@@ -298,8 +314,7 @@
|
||||
FA322CD70CEF74B1001761B3 /* ngircd */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FAA3D2790F139CDC00B2447E /* conn-ssl.c */,
|
||||
FAA3D27A0F139CDC00B2447E /* conn-ssl.h */,
|
||||
FA322D020CEF74B1001761B3 /* Makefile.am */,
|
||||
FA322CD90CEF74B1001761B3 /* array.c */,
|
||||
FA322CDA0CEF74B1001761B3 /* array.h */,
|
||||
FA322CDB0CEF74B1001761B3 /* channel.c */,
|
||||
@@ -308,6 +323,8 @@
|
||||
FAACD5F414A6099C006ED74F /* class.h */,
|
||||
FA322CDD0CEF74B1001761B3 /* client.c */,
|
||||
FA322CDE0CEF74B1001761B3 /* client.h */,
|
||||
FAD5853015271AAB00328741 /* client-cap.c */,
|
||||
FAD5853115271AAB00328741 /* client-cap.h */,
|
||||
FA322CDF0CEF74B1001761B3 /* conf.c */,
|
||||
FA322CE00CEF74B1001761B3 /* conf.h */,
|
||||
FAA3D2780F139CDC00B2447E /* conf-ssl.h */,
|
||||
@@ -317,11 +334,15 @@
|
||||
FA322CE40CEF74B1001761B3 /* conn-zip.h */,
|
||||
FA322CE50CEF74B1001761B3 /* conn.c */,
|
||||
FA322CE60CEF74B1001761B3 /* conn.h */,
|
||||
FAA3D2790F139CDC00B2447E /* conn-ssl.c */,
|
||||
FAA3D27A0F139CDC00B2447E /* conn-ssl.h */,
|
||||
FA322CE70CEF74B1001761B3 /* defines.h */,
|
||||
FA322CE80CEF74B1001761B3 /* hash.c */,
|
||||
FA322CE90CEF74B1001761B3 /* hash.h */,
|
||||
FA322CEA0CEF74B1001761B3 /* io.c */,
|
||||
FA322CEB0CEF74B1001761B3 /* io.h */,
|
||||
FAD5853315271AB800328741 /* irc-cap.c */,
|
||||
FAD5853415271AB800328741 /* irc-cap.h */,
|
||||
FA322CEC0CEF74B1001761B3 /* irc-channel.c */,
|
||||
FA322CED0CEF74B1001761B3 /* irc-channel.h */,
|
||||
FA322CEE0CEF74B1001761B3 /* irc-info.c */,
|
||||
@@ -344,7 +365,8 @@
|
||||
FA322CFF0CEF74B1001761B3 /* lists.h */,
|
||||
FA322D000CEF74B1001761B3 /* log.c */,
|
||||
FA322D010CEF74B1001761B3 /* log.h */,
|
||||
FA322D020CEF74B1001761B3 /* Makefile.am */,
|
||||
FAD5853615272C2500328741 /* login.c */,
|
||||
FAD5853715272C2500328741 /* login.h */,
|
||||
FA322D030CEF74B1001761B3 /* match.c */,
|
||||
FA322D040CEF74B1001761B3 /* match.h */,
|
||||
FA322D050CEF74B1001761B3 /* messages.h */,
|
||||
@@ -563,18 +585,25 @@
|
||||
FA322D970CEF752C001761B3 /* doc */ = {
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
FAA3D2800F139D1500B2447E /* Services.txt */,
|
||||
FA407F380DB15AC700271AF1 /* GIT.txt */,
|
||||
FA322D9A0CEF752C001761B3 /* FAQ.txt */,
|
||||
FA322D9B0CEF752C001761B3 /* Makefile.am */,
|
||||
FAE22BD215270EA300F1A5AB /* Bopm.txt */,
|
||||
FAD5852F15271A7800328741 /* Capabilities.txt */,
|
||||
FAE22BD415270EA300F1A5AB /* Contributing.txt */,
|
||||
FA322D9A0CEF752C001761B3 /* FAQ.txt */,
|
||||
FA407F380DB15AC700271AF1 /* GIT.txt */,
|
||||
FAE22BD515270EB500F1A5AB /* HowToRelease.txt */,
|
||||
FAE22BD615270EB500F1A5AB /* Modes.txt */,
|
||||
FAE22BD715270EB500F1A5AB /* PAM.txt */,
|
||||
FA322D9C0CEF752C001761B3 /* Platforms.txt */,
|
||||
FA322D9D0CEF752C001761B3 /* Protocol.txt */,
|
||||
FA322D9E0CEF752C001761B3 /* README-AUX.txt */,
|
||||
FA322D9F0CEF752C001761B3 /* README-BeOS.txt */,
|
||||
FAE22BD815270EC400F1A5AB /* README-Interix.txt */,
|
||||
FA322DA00CEF752C001761B3 /* RFC.txt */,
|
||||
FAA3D2800F139D1500B2447E /* Services.txt */,
|
||||
FA322DA90CEF752C001761B3 /* SSL.txt */,
|
||||
FA77849A133FB9FF00740057 /* sample-ngircd.conf.tmpl */,
|
||||
FA322DA20CEF752C001761B3 /* src */,
|
||||
FA322DA90CEF752C001761B3 /* SSL.txt */,
|
||||
);
|
||||
name = doc;
|
||||
path = ../../doc;
|
||||
@@ -653,7 +682,7 @@
|
||||
08FB7793FE84155DC02AAC07 /* Project object */ = {
|
||||
isa = PBXProject;
|
||||
attributes = {
|
||||
LastUpgradeCheck = 0420;
|
||||
LastUpgradeCheck = 0430;
|
||||
};
|
||||
buildConfigurationList = 1DEB928908733DD80010E9CD /* Build configuration list for PBXProject "ngIRCd" */;
|
||||
compatibilityVersion = "Xcode 3.2";
|
||||
@@ -718,6 +747,9 @@
|
||||
FA2D564A11EA158B00D37A35 /* pam.c in Sources */,
|
||||
FAA97C57124A271400D5BBA9 /* sighandlers.c in Sources */,
|
||||
FAACD5F514A6099C006ED74F /* class.c in Sources */,
|
||||
FAD5853215271AAB00328741 /* client-cap.c in Sources */,
|
||||
FAD5853515271AB800328741 /* irc-cap.c in Sources */,
|
||||
FAD5853815272C2600328741 /* login.c in Sources */,
|
||||
);
|
||||
runOnlyForDeploymentPostprocessing = 0;
|
||||
};
|
||||
|
@@ -1,5 +1,5 @@
|
||||
%define name ngircd
|
||||
%define version 19~rc1
|
||||
%define version 19.2
|
||||
%define release 1
|
||||
%define prefix %{_prefix}
|
||||
|
||||
|
@@ -1,7 +1,7 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# ngIRCd -- The Next Generation IRC Daemon
|
||||
# Copyright (c)2001-2010 Alexander Barton <alex@barton.de>
|
||||
# Copyright (c)2001-2011 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
|
||||
@@ -21,13 +21,16 @@ PLATFORM=
|
||||
COMPILER="unknown"
|
||||
VERSION="unknown"
|
||||
DATE=`date "+%y-%m-%d"`
|
||||
|
||||
CONFIGURE=
|
||||
MAKE=
|
||||
CHECK=
|
||||
RUN=
|
||||
COMMENT=
|
||||
|
||||
R_CONFIGURE=
|
||||
R_MAKE=
|
||||
R_CHECK=
|
||||
R_RUN=
|
||||
|
||||
[ -n "$MAKE" ] || MAKE="make"
|
||||
export MAKE CC
|
||||
|
||||
while [ $# -gt 0 ]; do
|
||||
case "$1" in
|
||||
"-v")
|
||||
@@ -61,20 +64,20 @@ if [ -r ./configure ]; then
|
||||
echo "$NAME: Running \"./configure\" script ..."
|
||||
[ -n "$VERBOSE" ] && ./configure || ./configure >/dev/null
|
||||
if [ $? -eq 0 -a -r ./Makefile ]; then
|
||||
CONFIGURE=1
|
||||
echo "$NAME: Running \"make\" ..."
|
||||
[ -n "$VERBOSE" ] && make || make >/dev/null
|
||||
R_CONFIGURE=1
|
||||
echo "$NAME: Running \"$MAKE\" ..."
|
||||
[ -n "$VERBOSE" ] && "$MAKE" || "$MAKE" >/dev/null
|
||||
if [ $? -eq 0 -a -x src/ngircd/ngircd ]; then
|
||||
MAKE=1
|
||||
echo "$NAME: Running \"make check\" ..."
|
||||
[ -n "$VERBOSE" ] && make check || make check >/dev/null
|
||||
R_MAKE=1
|
||||
echo "$NAME: Running \"$MAKE check\" ..."
|
||||
[ -n "$VERBOSE" ] && "$MAKE" check || "$MAKE" check >/dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
CHECK=1
|
||||
RUN=$CHECK
|
||||
R_CHECK=1
|
||||
R_RUN=$R_CHECK
|
||||
else
|
||||
./src/ngircd/ngircd --help 2>/dev/null \
|
||||
| grep "^ngircd" >/dev/null
|
||||
[ $? -eq 0 ] && RUN=1
|
||||
[ $? -eq 0 ] && R_RUN=1
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
@@ -96,9 +99,14 @@ if [ -r "Makefile" ]; then
|
||||
CC=$(grep "^CC = " Makefile | cut -d' ' -f3)
|
||||
$CC --version 2>&1 | grep -i "GCC" >/dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
COMPILER=$($CC --version | head -1 \
|
||||
| cut -d')' -f2 | cut -d' ' -f2)
|
||||
COMPILER="gcc $COMPILER"
|
||||
$CC --version 2>&1 | grep -i "Open64" >/dev/null
|
||||
if [ $? -eq 0 ]; then
|
||||
COMPILER="Open64"
|
||||
else
|
||||
COMPILER=$($CC --version | head -1 \
|
||||
| cut -d')' -f2 | cut -d' ' -f2)
|
||||
COMPILER="gcc $COMPILER"
|
||||
fi
|
||||
else
|
||||
case "$CC" in
|
||||
gcc*)
|
||||
@@ -130,10 +138,10 @@ else
|
||||
[ $? -eq 0 ] && COMMENT="(3)"
|
||||
fi
|
||||
|
||||
[ -n "$CONFIGURE" ] && C="Y" || C="N"
|
||||
[ -n "$MAKE" ] && M="Y" || M="N"
|
||||
[ -n "$CHECK" ] && T="Y" || T="N"
|
||||
[ -n "$RUN" ] && R="Y" || R="N"
|
||||
[ -n "$R_CONFIGURE" ] && C="Y" || C="N"
|
||||
[ -n "$R_MAKE" ] && M="Y" || M="N"
|
||||
[ -n "$R_CHECK" ] && T="Y" || T="N"
|
||||
[ -n "$R_RUN" ] && R="Y" || R="N"
|
||||
[ -n "$COMMENT" ] && COMMENT=" $COMMENT"
|
||||
|
||||
echo
|
||||
|
28
doc/Capabilities.txt
Normal file
28
doc/Capabilities.txt
Normal file
@@ -0,0 +1,28 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
http://ngircd.barton.de/
|
||||
|
||||
(c)2001-2012 Alexander Barton and Contributors.
|
||||
ngIRCd is free software and published under the
|
||||
terms of the GNU General Public License.
|
||||
|
||||
-- Capabilities.txt --
|
||||
|
||||
|
||||
This document lists and describes the "IRC capabilities" that ngIRCd supports
|
||||
and can be requested by a IRC/IRCv3 client that supports the "CAP" command.
|
||||
|
||||
ngIRCd implements the "IRC Client Capabilities Extension" as described here:
|
||||
<http://www.leeh.co.uk/draft-mitchell-irc-capabilities-02.html>
|
||||
|
||||
|
||||
I. Supported Capabilities
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
* "multi-prefix"
|
||||
|
||||
When requested, the multi-prefix client capability will cause the IRC
|
||||
server to send all possible prefixes which apply to a user in NAMES and
|
||||
WHO output.
|
||||
|
||||
See <http://ircv3.atheme.org/extensions/multi-prefix-3.1>.
|
14
doc/FAQ.txt
14
doc/FAQ.txt
@@ -64,11 +64,19 @@ A: ngIRCd does not write its own log file. Instead, ngIRCd uses syslog(3).
|
||||
|
||||
Q: I cannot connect to remote peers when I use the chroot option, the
|
||||
following is logged: "Can't resolve example.com: unknown error!".
|
||||
A: see next question blow ...
|
||||
|
||||
Q: When running ngIRCd inside a chroot, no IP addresses can be translated
|
||||
in DNS names, errors like "Name or service not known" are logged.
|
||||
A: On Linux/glibc with chroot enabled you need to put some libraries inside
|
||||
the chroot as well, notably libnss_dns; maybe others. Unfortunately, even
|
||||
linking ngIRCd statically does not help this. The only known workaround
|
||||
is to either disable chroot support or to link against dietlibc instead
|
||||
of glibc. (tnx to Sebastian Siewior)
|
||||
linking ngIRCd statically does not help this. So you can either copy
|
||||
all the required files into the chroot directory:
|
||||
$ mkdir -p ./chroot/etc ./chroot/lib
|
||||
$ cp -a /etc/hosts /etc/resolv.conf /etc/nsswitch.conf ./chroot/etc/
|
||||
$ cp -a /lib/libresolv* /lib/libnss_* ./chroot/lib/
|
||||
Or you can try to link ngIRCd against an other C library (like dietlibc)
|
||||
that doesn't depend on NSS modules and/or these files.
|
||||
|
||||
Q: I have added an [Oper] section, how do i log on as IRC operator?
|
||||
A: You can use the /OPER command in your IRC client to become an IRC operator.
|
||||
|
@@ -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
|
||||
@@ -16,9 +16,22 @@
|
||||
|
||||
SUFFIXES = .tmpl
|
||||
|
||||
static_docs = Bopm.txt FAQ.txt GIT.txt HowToRelease.txt Modes.txt PAM.txt \
|
||||
Platforms.txt Protocol.txt README-AUX.txt README-BeOS.txt \
|
||||
README-Interix.txt RFC.txt SSL.txt Services.txt
|
||||
static_docs = \
|
||||
Bopm.txt \
|
||||
Capabilities.txt \
|
||||
FAQ.txt \
|
||||
GIT.txt \
|
||||
HowToRelease.txt \
|
||||
Modes.txt \
|
||||
PAM.txt \
|
||||
Platforms.txt \
|
||||
Protocol.txt \
|
||||
README-AUX.txt \
|
||||
README-BeOS.txt \
|
||||
README-Interix.txt \
|
||||
RFC.txt \
|
||||
Services.txt \
|
||||
SSL.txt
|
||||
|
||||
doc_templates = sample-ngircd.conf.tmpl
|
||||
|
||||
|
@@ -43,6 +43,7 @@ users to lists (e.g. "invite list", "ban list"), others have parameters
|
||||
mode since description
|
||||
|
||||
b 0.5.0 Add/remove a host mask to the ban list.
|
||||
e 19 Add/remove a host mask to the exception list.
|
||||
i 0.5.0 Channel is "invite only".
|
||||
I 0.5.0 Add/remove a host mask to the invite list.
|
||||
k 0.6.0 Channel has a "key" (a password).
|
||||
|
@@ -2,7 +2,7 @@
|
||||
ngIRCd - Next Generation IRC Server
|
||||
http://ngircd.barton.de/
|
||||
|
||||
(c)2001-2011 Alexander Barton and Contributors.
|
||||
(c)2001-2012 Alexander Barton and Contributors.
|
||||
ngIRCd is free software and published under the
|
||||
terms of the GNU General Public License.
|
||||
|
||||
@@ -26,52 +26,56 @@ list can be updated. Thanks for your help!
|
||||
Platform Compiler ngIRCd Date Tester C M T R See
|
||||
--------------------------- ------------ ---------- -------- ------ - - - - ---
|
||||
alpha/unknown/netbsd3.0 gcc 3.3.3 CVSHEAD 06-05-07 fw Y Y Y Y (3)
|
||||
armv6l/unkn./linux-gnueabi gcc 4.4.5 19.1 12-06-04 goetz Y Y Y Y (5)
|
||||
armv7l/unkn./linux-gnueabi gcc 4.4.3 19.1 12-04-29 goetz Y Y Y Y (5)
|
||||
hppa/unknown/openbsd3.5 gcc 2.95.3 CVSHEAD 04-05-25 alex Y Y Y Y
|
||||
hppa1.1/unknown/linux-gnu gcc 3.3.3 0.8.0 04-05-30 alex Y Y Y Y
|
||||
hppa2.0/unknown/linux-gnu gcc 3.3.5 13~rc1 08-12-02 alex Y Y Y Y
|
||||
hppa2.0w-hp-hpux11.11 gcc 4.2.3 14.1 09-07-22 goetz Y Y Y Y
|
||||
i386/apple/darwin9.7.0 gcc 4.0.1 14.1 09-08-04 alex Y Y Y Y (3)
|
||||
i386/apple/darwin10.7.0 gcc 4.2.1 18 11-07-05 alex Y Y Y Y (3)
|
||||
i386/apple/darwin11.0.0 gcc 4.2.1 18 11-07-02 alex Y Y Y Y (3)
|
||||
i386/apple/darwin10.8.0 gcc 4.2.1 19 12-02-26 alex Y Y Y Y (3)
|
||||
i386/apple/darwin11.3.0 gcc 4.2.1 19 12-02-26 alex Y Y Y Y (3)
|
||||
i386/pc/solaris2.9 gcc 3.2.2 CVSHEAD 04-02-24 alex Y Y Y Y
|
||||
i386/pc/solaris2.11 gcc 3.4.3 18 11-07-10 alex Y Y N Y (4)
|
||||
i386/pc/solaris2.11 gcc 4.2.3 18 11-08-17 goetz Y Y Y Y (4)
|
||||
i386/pc/solaris2.11 gcc 3.4.3 19 12-02-26 alex Y Y N Y (4)
|
||||
i386/pc/solaris2.11 gcc 4.2.3 19.1 12-05-29 goetz Y Y Y Y (4)
|
||||
i386/unknown/freebsd5.2.1 gcc 3.3.3 0.8.0 04-05-30 alex Y Y Y Y
|
||||
i386/unknown/freebsd6.2 gcc 3.4.6 18 11-07-10 alex Y Y Y Y (3)
|
||||
i386/unknown/freebsd7.3 gcc 4.2.1 18 11-07-10 alex Y Y Y Y (3)
|
||||
i686/unknown/gnu0.3 gcc 4.4.5 18 11-07-10 alex Y Y Y Y
|
||||
i386/unknown/freebsd6.2 gcc 3.4.6 19 12-02-26 alex Y Y Y Y (3)
|
||||
i386/unknown/freebsd7.3 gcc 4.2.1 19 12-02-26 alex Y Y Y Y (3)
|
||||
i686/unknown/gnu0.3 gcc 4.4.5 19 12-02-29 alex Y Y Y Y
|
||||
i686/unkn./kfreebsd7.2-gnu gcc 4.3.4 15 09-12-02 alex Y Y Y Y (3)
|
||||
i386/unknown/netbsdelf1.6.2 gcc 2.95.3 18 11-07-10 goetz Y Y Y Y
|
||||
i386/unknown/netbsdelf3.0.1 gcc 3.3.3 0.10.0-p1 06-08-30 alex Y Y Y Y (3)
|
||||
i386/unknown/netbsdelf4.0 gcc 4.1.2 18 11-07-10 alex Y Y Y Y (3)
|
||||
i386/unknown/netbsdelf5.0.2 gcc 4.1.3 18 11-07-10 alex Y Y Y Y (3)
|
||||
i386/unknown/netbsdelf4.0 gcc 4.1.2 19 12-02-29 alex Y Y Y Y (3)
|
||||
i386/unknown/netbsdelf5.0.2 gcc 4.1.3 19 12-02-26 alex Y Y Y Y (3)
|
||||
i386/unknown/openbsd3.9 gcc 3.3.5 0.10.0-p1 06-08-30 alex Y Y Y Y (3)
|
||||
i386/unknown/openbsd4.1 gcc 3.3.5 16 10-04-11 alex Y Y Y Y (3)
|
||||
i586/pc/interix3.5 gcc 3.3 18 11-07-10 alex Y Y N Y
|
||||
i586/pc/interix3.5 gcc 3.3 19 12-02-29 alex Y Y N Y
|
||||
i686/pc/cygwin gcc 3.3.1 0.8.0 04-05-30 alex Y Y N Y
|
||||
i686/pc/linux-gnu gcc 2.7.2 19.1 12-05-30 goetz Y Y Y Y (1)
|
||||
i686/pc/linux-gnu gcc 2.95.4 0.8.0 04-05-30 alex Y Y Y Y (1)
|
||||
i686/pc/linux-gnu gcc 3.3.5 14.1 09-08-04 alex Y Y Y Y (1)
|
||||
i386/pc/linux-gnu gcc 4.1.2 13~rc1 08-12-05 alex Y Y Y Y (1)
|
||||
i686/pc/linux-gnu gcc 4.3.2 14.1 09-08-04 alex Y Y Y Y (1)
|
||||
m68k/apple/aux3.0.1 gcc 2.7.2 17 10-11-07 alex Y Y N Y
|
||||
m68k/apple/aux3.0.1 Orig. A/UX 17 10-11-07 alex Y Y N Y (2)
|
||||
m68k/apple/aux3.1.1 gcc 2.7.2 18 11-07-02 alex Y Y N Y
|
||||
m68k/apple/aux3.1.1 Orig. A/UX 18 11-07-02 alex Y Y N Y (2)
|
||||
m68k/apple/aux3.1.1 gcc 2.7.2 19 12-02-26 alex Y Y N Y
|
||||
m68k/apple/aux3.1.1 Orig. A/UX 19 12-02-26 alex Y Y N Y (2)
|
||||
m68k/hp/hp-ux9.10 Orig. HPUX 0.7.x-CVS 03-04-30 goetz Y Y Y Y
|
||||
m88k/dg/dgux5.4R3.10 gcc 2.5.8 CVSHEAD 04-03-15 alex Y Y ? ?
|
||||
mipsel/unknown/linux-gnu gcc 4.1.2 18 11-07-05 goetz Y Y N Y (1)
|
||||
mipsel/unknown/linux-gnu gcc 4.4.5 18 11-07-30 goetz Y Y Y Y (1)
|
||||
powerpc/apple/darwin6.5 gcc 3.1 0.7.x-CVS 03-04-23 alex Y Y Y Y
|
||||
powerpc/apple/darwin7.9.0 gcc 3.3 CVSHEAD 06-05-07 fw Y Y Y Y (3)
|
||||
powerpc/apple/darwin7.9.0 gcc 3.3 19.1 12-05-22 goetz Y Y Y Y (3)
|
||||
powerpc/apple/darwin8.11.0 gcc 4.0.1 18 11-07-02 goetz Y Y Y Y (3)
|
||||
powerpc/unknown/linux-gnu gcc 3.3.3 0.8.0 04-05-30 alex Y Y Y Y
|
||||
powerpc/unknown/openbsd3.6 gcc 2.95.3 0.10.0 06-10-08 alex Y Y N Y
|
||||
sparc/sun/solaris2.6 gcc 2.95.3 0.7.x-CVS 03-04-22 alex Y Y Y Y
|
||||
sparc/sun/solaris2.7 gcc 3.3 0.8.0 04-05-30 alex Y Y Y Y
|
||||
sparc/unkn./netbsdelf1.6.1 gcc 2.95.3 0.8.0 04-05-30 alex Y Y Y Y
|
||||
x86_64/unknown/freebsd8.1 gcc 4.2.1 18 11-07-10 alex Y Y Y Y (3)
|
||||
x86_64/unknown/linux-gnu gcc 4.4.5 18 11-07-02 alex Y Y Y Y (1)
|
||||
x86_64/unknown/openbsd4.7 gcc 3.3.5 18 11-07-10 alex Y Y Y Y (3)
|
||||
x86_64/unknown/freebsd8.1 gcc 4.2.1 19 12-02-26 alex Y Y Y Y (3)
|
||||
x86_64/unkn./freebsd8.1-gnu gcc 4.4.5 19 12-02-26 alex Y Y Y Y (3)
|
||||
x86_64/unknown/linux-gnu gcc 4.4.5 19 12-02-26 alex Y Y Y Y (1)
|
||||
x86_64/unknown/openbsd4.7 gcc 3.3.5 19 12-02-26 alex Y Y Y Y (3)
|
||||
|
||||
|
||||
Notes
|
||||
|
@@ -1,12 +1,10 @@
|
||||
|
||||
ngIRCd - Next Generation IRC Server
|
||||
|
||||
(c)2001-2010 Alexander Barton,
|
||||
alex@barton.de, http://www.barton.de/
|
||||
ngIRCd - Next Generation IRC Server
|
||||
http://ngircd.barton.de/
|
||||
|
||||
(c)2001-2012 Alexander Barton and Contributors.
|
||||
ngIRCd is free software and published under the
|
||||
terms of the GNU General Public License.
|
||||
|
||||
terms of the GNU General Public License.
|
||||
|
||||
-- README-Interix.txt --
|
||||
|
||||
@@ -20,10 +18,13 @@ Windows Server 2003. SUA is supported on Windows Server 2003 R2, Windows
|
||||
Server 2008 & 2008 R2, Windows Vista, and Windows 7 -- so ngIRCd should be
|
||||
able to run on all of these platforms.
|
||||
|
||||
But please note that the poll() API function is not fully implemented by
|
||||
SFU/SUA and therefore can't be used by ngIRCd -- which normally would be
|
||||
the default. Please see <http://www.suacommunity.com/faqs.aspx> section
|
||||
4.25 for details:
|
||||
But please note that two things:
|
||||
|
||||
1. Don't use the poll() IO API
|
||||
|
||||
The poll() API function is not fully implemented by SFU/SUA and therefore
|
||||
can't be used by ngIRCd -- which normally would be the default. Please see
|
||||
<http://www.suacommunity.com/faqs.aspx> section 4.25 for details:
|
||||
|
||||
"If you do try to use the poll() API your program will block on the
|
||||
API call forever. You must direct your program to build using the
|
||||
@@ -35,3 +36,9 @@ So when running the ./configure script, you HAVE TO DISABLE poll() support:
|
||||
|
||||
ngIRCd then defaults to using the select() API function which works fine.
|
||||
|
||||
2. Use GNU make(1)
|
||||
|
||||
Starting with ngIRCd 18, our build system doesn't work with the default
|
||||
make(1) binary of Interix, you should use GNU make instead (tested with
|
||||
version 3.82 built from source).
|
||||
|
||||
|
@@ -14,8 +14,9 @@ But services acting as a "regular server" are supported, either using the IRC
|
||||
protocol defined in RFC 1459 or RFC 2812.
|
||||
|
||||
Support for Services has been tested using "IRC Services" version 5.x by
|
||||
Andrew Church (<http://achurch.org/services/>), and a Anope 1.9 using a
|
||||
preliminary protocol module for ngIRCd (<http://www.anope.org/>).
|
||||
Andrew Church (<http://achurch.org/services/>), Anope 1.9 using a
|
||||
preliminary protocol module for ngIRCd (<http://www.anope.org/>), and
|
||||
Atheme 7.0.2 or later.
|
||||
|
||||
This document describes setting up ngIRCd and these services.
|
||||
|
||||
@@ -93,5 +94,24 @@ The documentation of IRC Services can be found here:
|
||||
<http://www.ircservices.za.net/docs/>
|
||||
|
||||
|
||||
Setting up Atheme 7.0.2 or later
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
Atheme 7.0.2 or later may be used with ngIRCd using the "ngircd" protocol
|
||||
module.
|
||||
|
||||
The following settings need to be in atheme.conf:
|
||||
|
||||
loadmodule "modules/protocol/ngircd";
|
||||
|
||||
uplink "server.irc.net" {
|
||||
password = "123abc";
|
||||
port = 6667;
|
||||
};
|
||||
|
||||
The documentation of Atheme can be found in the doc/ directory of the
|
||||
Atheme source distribution.
|
||||
|
||||
|
||||
Please let us know if you are successfully using other IRC service packages or
|
||||
which problems you encounter, thanks!
|
||||
|
@@ -127,7 +127,13 @@
|
||||
# Set this hostname for every client instead of the real one.
|
||||
# Please note: don't use the percentage sign ("%"), it is reserved for
|
||||
# future extensions!
|
||||
;CloakHost = irc.example.net
|
||||
;CloakHost = cloaked.host
|
||||
|
||||
# Use this hostname for hostname cloaking on clients that have the
|
||||
# user mode "+x" set, instead of the name of the server.
|
||||
# Please note: don't use the percentage sign ("%"), it is reserved for
|
||||
# future extensions!
|
||||
;CloakHostModeX = cloaked.user
|
||||
|
||||
# Set every clients' user name to their nick name
|
||||
;CloakUserToNick = yes
|
||||
|
@@ -1,7 +1,7 @@
|
||||
.\"
|
||||
.\" ngircd(8) manual page template
|
||||
.\"
|
||||
.TH ngircd 8 "Jul 2011" ngircd "ngIRCd Manual"
|
||||
.TH ngircd 8 "Mar 2012" ngircd "ngIRCd Manual"
|
||||
.SH NAME
|
||||
ngIRCd \- the next generation IRC daemon
|
||||
.SH SYNOPSIS
|
||||
@@ -78,7 +78,7 @@ It's wise to use "ngircd \-\-configtest" to validate the configuration file
|
||||
after changing it.
|
||||
.SH DEBUGGING
|
||||
When ngIRCd is compiled with debug code, that is, its source code has
|
||||
been ./configure'd with "--enable-debug" and/or "--enable-sniffer" (witch
|
||||
been ./configure'd with "\-\-enable\-debug" and/or "\-\-enable\-sniffer" (witch
|
||||
enables debug mode automatically as well), you can use two more command
|
||||
line options and two more signals to debug problems with the daemon itself
|
||||
or IRC clients:
|
||||
@@ -91,7 +91,7 @@ Enable debug mode and log extra messages.
|
||||
\fB\-s\fR, \fB\-\-sniffer\fR
|
||||
Enable IRC protocol sniffer, which logs all sent and received IRC commands to
|
||||
the console/syslog. This option requires that ngIRCd has been ./configure'd
|
||||
with "--enable-sniffer" and enables debug mode automatically, too.
|
||||
with "\-\-enable\-sniffer" and enables debug mode automatically, too.
|
||||
.PP
|
||||
\fBSignals:\fR
|
||||
.TP
|
||||
|
@@ -1,7 +1,7 @@
|
||||
.\"
|
||||
.\" ngircd.conf(5) manual page template
|
||||
.\"
|
||||
.TH ngircd.conf 5 "Jun 2011" ngircd "ngIRCd Manual"
|
||||
.TH ngircd.conf 5 "Mar 2012" ngircd "ngIRCd Manual"
|
||||
.SH NAME
|
||||
ngircd.conf \- configuration file of ngIRCd
|
||||
.SH SYNOPSIS
|
||||
@@ -220,6 +220,17 @@ don't change.
|
||||
Don't use the percentage sign ("%"), it is reserved for future extensions!
|
||||
.RE
|
||||
.TP
|
||||
\fBCloakHostModeX\fR (string)
|
||||
Use this hostname for hostname cloaking on clients that have the user mode
|
||||
"+x" set, instead of the name of the server. Default: empty, use the name
|
||||
of the server.
|
||||
.PP
|
||||
.RS
|
||||
.B Please note:
|
||||
.br
|
||||
Don't use the percentage sign ("%"), it is reserved for future extensions!
|
||||
.RE
|
||||
.TP
|
||||
\fBCloakUserToNick\fR (boolean)
|
||||
Set every clients' user name to their nick name and hide the one supplied
|
||||
by the IRC client. Default: no.
|
||||
|
@@ -1,6 +1,6 @@
|
||||
#
|
||||
# ngIRCd -- The Next Generation IRC Daemon
|
||||
# Copyright (c)2001-2010 Alexander Barton (alex@barton.de)
|
||||
# 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
|
||||
@@ -18,21 +18,84 @@ LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN \
|
||||
|
||||
sbin_PROGRAMS = ngircd
|
||||
|
||||
ngircd_SOURCES = ngircd.c array.c channel.c class.c client.c conf.c conn.c \
|
||||
conn-func.c conn-ssl.c conn-zip.c hash.c io.c irc.c irc-channel.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 match.c op.c numeric.c pam.c parse.c \
|
||||
proc.c resolve.c sighandlers.c
|
||||
ngircd_SOURCES = \
|
||||
ngircd.c \
|
||||
array.c \
|
||||
channel.c \
|
||||
class.c \
|
||||
client.c \
|
||||
client-cap.c \
|
||||
conf.c \
|
||||
conn.c \
|
||||
conn-func.c \
|
||||
conn-ssl.c \
|
||||
conn-zip.c \
|
||||
hash.c \
|
||||
io.c \
|
||||
irc.c \
|
||||
irc-cap.c \
|
||||
irc-channel.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 conf.h \
|
||||
conf-ssl.h conn.h conn-func.h conn-ssl.h conn-zip.h hash.h io.h \
|
||||
irc.h irc-channel.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 match.h numeric.h \
|
||||
op.h pam.h parse.h proc.h resolve.h sighandlers.h defines.h messages.h
|
||||
noinst_HEADERS = \
|
||||
ngircd.h \
|
||||
array.h \
|
||||
channel.h \
|
||||
class.h \
|
||||
client.h \
|
||||
client-cap.h \
|
||||
conf.h \
|
||||
conf-ssl.h \
|
||||
conn.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-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
|
||||
|
73
src/ngircd/client-cap.c
Normal file
73
src/ngircd/client-cap.c
Normal file
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
* 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 __client_cap_c__
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Functions to deal with IRC Capabilities
|
||||
*/
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
|
||||
#include "defines.h"
|
||||
#include "conn.h"
|
||||
#include "client.h"
|
||||
#include "log.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "client-cap.h"
|
||||
|
||||
GLOBAL int
|
||||
Client_Cap(CLIENT *Client)
|
||||
{
|
||||
assert (Client != NULL);
|
||||
|
||||
return Client->capabilities;
|
||||
}
|
||||
|
||||
GLOBAL void
|
||||
Client_CapSet(CLIENT *Client, int Cap)
|
||||
{
|
||||
assert(Client != NULL);
|
||||
assert(Cap >= 0);
|
||||
|
||||
Client->capabilities = Cap;
|
||||
LogDebug("Set new capability of \"%s\" to %d.",
|
||||
Client_ID(Client), Client->capabilities);
|
||||
}
|
||||
|
||||
GLOBAL void
|
||||
Client_CapAdd(CLIENT *Client, int Cap)
|
||||
{
|
||||
assert(Client != NULL);
|
||||
assert(Cap > 0);
|
||||
|
||||
Client->capabilities |= Cap;
|
||||
LogDebug("Add capability %d, new capability of \"%s\" is %d.",
|
||||
Cap, Client_ID(Client), Client->capabilities);
|
||||
}
|
||||
|
||||
GLOBAL void
|
||||
Client_CapDel(CLIENT *Client, int Cap)
|
||||
{
|
||||
assert(Client != NULL);
|
||||
assert(Cap > 0);
|
||||
|
||||
Client->capabilities &= ~Cap;
|
||||
LogDebug("Delete capability %d, new capability of \"%s\" is %d.",
|
||||
Cap, Client_ID(Client), Client->capabilities);
|
||||
}
|
||||
|
||||
/* -eof- */
|
31
src/ngircd/client-cap.h
Normal file
31
src/ngircd/client-cap.h
Normal file
@@ -0,0 +1,31 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __client_cap_h__
|
||||
#define __client_cap_h__
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Functions to deal with IRC Capabilities (header)
|
||||
*/
|
||||
|
||||
#define CLIENT_CAP_PENDING 1 /* Capability negotiation pending */
|
||||
#define CLIENT_CAP_SUPPORTED 2 /* Client supports IRC capabilities */
|
||||
|
||||
#define CLIENT_CAP_MULTI_PREFIX 4 /* multi-prefix */
|
||||
|
||||
GLOBAL int Client_Cap PARAMS((CLIENT *Client));
|
||||
|
||||
GLOBAL void Client_CapSet PARAMS((CLIENT *Client, int Cap));
|
||||
GLOBAL void Client_CapAdd PARAMS((CLIENT *Client, int Cap));
|
||||
GLOBAL void Client_CapDel PARAMS((CLIENT *Client, int Cap));
|
||||
|
||||
#endif
|
@@ -37,6 +37,7 @@
|
||||
#include "ngircd.h"
|
||||
#include "channel.h"
|
||||
#include "conf.h"
|
||||
#include "conn-func.h"
|
||||
#include "hash.h"
|
||||
#include "irc-write.h"
|
||||
#include "log.h"
|
||||
@@ -69,6 +70,8 @@ static CLIENT *Init_New_Client PARAMS((CONN_ID Idx, CLIENT *Introducer,
|
||||
static void Destroy_UserOrService PARAMS((CLIENT *Client,const char *Txt, const char *FwdMsg,
|
||||
bool SendQuit));
|
||||
|
||||
static void cb_introduceClient PARAMS((CLIENT *Client, CLIENT *Prefix,
|
||||
void *i));
|
||||
|
||||
GLOBAL void
|
||||
Client_Init( void )
|
||||
@@ -822,7 +825,9 @@ Client_MaskCloaked(CLIENT *Client)
|
||||
return Client_Mask(Client);
|
||||
|
||||
snprintf(Mask_Buffer, GETID_LEN, "%s!%s@%s",
|
||||
Client->id, Client->user, Client_ID(Client->introducer));
|
||||
Client->id, Client->user,
|
||||
*Conf_CloakHostModeX ? Conf_CloakHostModeX
|
||||
: Client_ID(Client->introducer));
|
||||
return Mask_Buffer;
|
||||
} /* Client_MaskCloaked */
|
||||
|
||||
@@ -1142,6 +1147,46 @@ Client_Reject(CLIENT *Client, const char *Reason, bool InformClient)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Introduce a new user or service client in the network.
|
||||
*
|
||||
* @param From Remote server introducing the client or NULL (local).
|
||||
* @param Client New client.
|
||||
* @param Type Type of the client (CLIENT_USER or CLIENT_SERVICE).
|
||||
*/
|
||||
GLOBAL void
|
||||
Client_Introduce(CLIENT *From, CLIENT *Client, int Type)
|
||||
{
|
||||
/* Set client type (user or service) */
|
||||
Client_SetType(Client, Type);
|
||||
|
||||
if (From) {
|
||||
if (Conf_IsService(Conf_GetServer(Client_Conn(From)),
|
||||
Client_ID(Client)))
|
||||
Client_SetType(Client, CLIENT_SERVICE);
|
||||
LogDebug("%s \"%s\" (+%s) registered (via %s, on %s, %d hop%s).",
|
||||
Client_TypeText(Client), Client_Mask(Client),
|
||||
Client_Modes(Client), Client_ID(From),
|
||||
Client_ID(Client_Introducer(Client)),
|
||||
Client_Hops(Client), Client_Hops(Client) > 1 ? "s": "");
|
||||
} else {
|
||||
Log(LOG_NOTICE, "%s \"%s\" registered (connection %d).",
|
||||
Client_TypeText(Client), Client_Mask(Client),
|
||||
Client_Conn(Client));
|
||||
Log_ServerNotice('c', "Client connecting: %s (%s@%s) [%s] - %s",
|
||||
Client_ID(Client), Client_User(Client),
|
||||
Client_Hostname(Client),
|
||||
Conn_IPA(Client_Conn(Client)),
|
||||
Client_TypeText(Client));
|
||||
}
|
||||
|
||||
/* Inform other servers */
|
||||
IRC_WriteStrServersPrefixFlag_CB(From,
|
||||
From != NULL ? From : Client_ThisServer(),
|
||||
'\0', cb_introduceClient, (void *)Client);
|
||||
} /* Client_Introduce */
|
||||
|
||||
|
||||
static unsigned long
|
||||
Count( CLIENT_TYPE Type )
|
||||
{
|
||||
@@ -1361,6 +1406,59 @@ Destroy_UserOrService(CLIENT *Client, const char *Txt, const char *FwdMsg, bool
|
||||
} /* Destroy_UserOrService */
|
||||
|
||||
|
||||
/**
|
||||
* Introduce a new user or service client to a remote server.
|
||||
*
|
||||
* This function differentiates between RFC1459 and RFC2813 server links and
|
||||
* generates the appropriate commands to register the new user or service.
|
||||
*
|
||||
* @param To The remote server to inform.
|
||||
* @param Prefix Prefix for the generated commands.
|
||||
* @param data CLIENT structure of the new client.
|
||||
*/
|
||||
static void
|
||||
cb_introduceClient(CLIENT *To, CLIENT *Prefix, void *data)
|
||||
{
|
||||
CLIENT *c = (CLIENT *)data;
|
||||
CONN_ID conn;
|
||||
char *modes, *user, *host;
|
||||
|
||||
modes = Client_Modes(c);
|
||||
user = Client_User(c) ? Client_User(c) : "-";
|
||||
host = Client_Hostname(c) ? Client_Hostname(c) : "-";
|
||||
|
||||
conn = Client_Conn(To);
|
||||
if (Conn_Options(conn) & CONN_RFC1459) {
|
||||
/* RFC 1459 mode: separate NICK and USER commands */
|
||||
Conn_WriteStr(conn, "NICK %s :%d", Client_ID(c),
|
||||
Client_Hops(c) + 1);
|
||||
Conn_WriteStr(conn, ":%s USER %s %s %s :%s",
|
||||
Client_ID(c), user, host,
|
||||
Client_ID(Client_Introducer(c)), Client_Info(c));
|
||||
if (modes[0])
|
||||
Conn_WriteStr(conn, ":%s MODE %s +%s",
|
||||
Client_ID(c), Client_ID(c), modes);
|
||||
} else {
|
||||
/* RFC 2813 mode: one combined NICK or SERVICE command */
|
||||
if (Client_Type(c) == CLIENT_SERVICE
|
||||
&& strchr(Client_Flags(To), 'S'))
|
||||
IRC_WriteStrClientPrefix(To, Prefix,
|
||||
"SERVICE %s %d * +%s %d :%s",
|
||||
Client_Mask(c),
|
||||
Client_MyToken(Client_Introducer(c)),
|
||||
Client_Modes(c), Client_Hops(c) + 1,
|
||||
Client_Info(c));
|
||||
else
|
||||
IRC_WriteStrClientPrefix(To, Prefix,
|
||||
"NICK %s %d %s %s %d +%s :%s",
|
||||
Client_ID(c), Client_Hops(c) + 1,
|
||||
user, host,
|
||||
Client_MyToken(Client_Introducer(c)),
|
||||
modes, Client_Info(c));
|
||||
}
|
||||
} /* cb_introduceClient */
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
|
||||
GLOBAL void
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001-2008 Alexander Barton (alex@barton.de)
|
||||
* 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
|
||||
@@ -29,12 +29,13 @@
|
||||
#ifndef STRICT_RFC
|
||||
# define CLIENT_WAITAUTHPING 512 /* waiting for AUTH PONG from client */
|
||||
#endif
|
||||
#define CLIENT_WAITCAPEND 1024 /* waiting for "CAP END" command */
|
||||
|
||||
#define CLIENT_TYPE int
|
||||
|
||||
#include "defines.h"
|
||||
|
||||
#if defined(__client_c__) | defined(S_SPLINT_S)
|
||||
#if defined(__client_c__) | defined(__client_cap_c__) | defined(S_SPLINT_S)
|
||||
|
||||
typedef struct _CLIENT
|
||||
{
|
||||
@@ -58,6 +59,7 @@ typedef struct _CLIENT
|
||||
bool oper_by_me; /* client is local IRC operator on this server? */
|
||||
char away[CLIENT_AWAY_LEN]; /* AWAY text (valid if mode 'a' is set) */
|
||||
char flags[CLIENT_FLAGS_LEN]; /* flags of the client */
|
||||
int capabilities; /* enabled IRC capabilities */
|
||||
} CLIENT;
|
||||
|
||||
#else
|
||||
@@ -165,6 +167,8 @@ GLOBAL const char *Client_TypeText PARAMS((CLIENT *Client));
|
||||
|
||||
GLOBAL void Client_Reject PARAMS((CLIENT *Client, const char *Reason,
|
||||
bool InformClient));
|
||||
GLOBAL void Client_Introduce PARAMS((CLIENT *From, CLIENT *Client, int Type));
|
||||
|
||||
|
||||
#ifdef DEBUG
|
||||
GLOBAL void Client_DebugDump PARAMS((void));
|
||||
|
@@ -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
|
||||
@@ -58,7 +58,7 @@ static int New_Server_Idx;
|
||||
static char Conf_MotdFile[FNAME_LEN];
|
||||
|
||||
static void Set_Defaults PARAMS(( bool InitServers ));
|
||||
static bool Read_Config PARAMS(( bool ngircd_starting ));
|
||||
static bool Read_Config PARAMS(( bool TestOnly, bool IsStarting ));
|
||||
static bool Validate_Config PARAMS(( bool TestOnly, bool Rehash ));
|
||||
|
||||
static void Handle_GLOBAL PARAMS(( int Line, char *Var, char *Arg ));
|
||||
@@ -206,7 +206,7 @@ ports_parse(array *a, int Line, char *Arg)
|
||||
GLOBAL void
|
||||
Conf_Init( void )
|
||||
{
|
||||
Read_Config( true );
|
||||
Read_Config(false, true);
|
||||
Validate_Config(false, false);
|
||||
}
|
||||
|
||||
@@ -218,7 +218,7 @@ Conf_Init( void )
|
||||
GLOBAL bool
|
||||
Conf_Rehash( void )
|
||||
{
|
||||
if (!Read_Config(false))
|
||||
if (!Read_Config(false, false))
|
||||
return false;
|
||||
Validate_Config(false, true);
|
||||
|
||||
@@ -299,7 +299,7 @@ Conf_Test( void )
|
||||
|
||||
Use_Log = false;
|
||||
|
||||
if (! Read_Config(true))
|
||||
if (!Read_Config(true, true))
|
||||
return 1;
|
||||
|
||||
config_valid = Validate_Config(true, false);
|
||||
@@ -358,6 +358,7 @@ Conf_Test( void )
|
||||
printf(" AllowRemoteOper = %s\n", yesno_to_str(Conf_AllowRemoteOper));
|
||||
printf(" ChrootDir = %s\n", Conf_Chroot);
|
||||
printf(" CloakHost = %s\n", Conf_CloakHost);
|
||||
printf(" CloakHostModeX = %s\n", Conf_CloakHostModeX);
|
||||
printf(" CloakUserToNick = %s\n", yesno_to_str(Conf_CloakUserToNick));
|
||||
#ifdef WANT_IPV6
|
||||
printf(" ConnectIPv4 = %s\n", yesno_to_str(Conf_ConnectIPv6));
|
||||
@@ -492,6 +493,14 @@ Conf_SetServer( int ConfServer, CONN_ID Idx )
|
||||
assert( ConfServer > NONE );
|
||||
assert( Idx > NONE );
|
||||
|
||||
if (Conf_Server[ConfServer].conn_id > NONE &&
|
||||
Conf_Server[ConfServer].conn_id != Idx) {
|
||||
Log(LOG_ALERT,
|
||||
"Trying to update connection index for already registered server \"%s\": %d/%d - ignored.",
|
||||
Conf_Server[ConfServer].name,
|
||||
Conf_Server[ConfServer].conn_id, Idx);
|
||||
return;
|
||||
}
|
||||
Conf_Server[ConfServer].conn_id = Idx;
|
||||
}
|
||||
|
||||
@@ -676,6 +685,7 @@ Set_Defaults(bool InitServers)
|
||||
#endif
|
||||
strlcpy(Conf_Chroot, CHROOT_DIR, sizeof(Conf_Chroot));
|
||||
strcpy(Conf_CloakHost, "");
|
||||
strcpy(Conf_CloakHostModeX, "");
|
||||
Conf_CloakUserToNick = false;
|
||||
Conf_ConnectIPv4 = true;
|
||||
#ifdef WANT_IPV6
|
||||
@@ -778,7 +788,7 @@ Read_Motd(const char *filename)
|
||||
* successfully; false otherwise.
|
||||
*/
|
||||
static bool
|
||||
Read_Config( bool ngircd_starting )
|
||||
Read_Config(bool TestOnly, bool IsStarting)
|
||||
{
|
||||
char section[LINE_LEN], str[LINE_LEN], *var, *arg, *ptr;
|
||||
const UINT16 defaultport = 6667;
|
||||
@@ -792,16 +802,19 @@ Read_Config( bool ngircd_starting )
|
||||
/* No configuration file found! */
|
||||
Config_Error( LOG_ALERT, "Can't read configuration \"%s\": %s",
|
||||
NGIRCd_ConfFile, strerror( errno ));
|
||||
if (!ngircd_starting)
|
||||
if (!IsStarting)
|
||||
return false;
|
||||
Config_Error( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME );
|
||||
exit( 1 );
|
||||
}
|
||||
|
||||
opers_free();
|
||||
Set_Defaults( ngircd_starting );
|
||||
Set_Defaults(IsStarting);
|
||||
|
||||
Config_Error( LOG_INFO, "Reading configuration from \"%s\" ...", NGIRCd_ConfFile );
|
||||
if (TestOnly)
|
||||
Config_Error(LOG_INFO,
|
||||
"Reading configuration from \"%s\" ...",
|
||||
NGIRCd_ConfFile );
|
||||
|
||||
/* Clean up server configuration structure: mark all already
|
||||
* configured servers as "once" so that they are deleted
|
||||
@@ -854,10 +867,13 @@ Read_Config( bool ngircd_starting )
|
||||
/* Is this the beginning of a new section? */
|
||||
if(( str[0] == '[' ) && ( str[strlen( str ) - 1] == ']' )) {
|
||||
strlcpy( section, str, sizeof( section ));
|
||||
if (strcasecmp(section, "[GLOBAL]") == 0 ||
|
||||
strcasecmp(section, "[LIMITS]") == 0 ||
|
||||
strcasecmp(section, "[OPTIONS]") == 0 ||
|
||||
strcasecmp(section, "[SSL]") == 0)
|
||||
if (strcasecmp(section, "[GLOBAL]") == 0
|
||||
|| strcasecmp(section, "[LIMITS]") == 0
|
||||
|| strcasecmp(section, "[OPTIONS]") == 0
|
||||
#ifdef SSL_SUPPORT
|
||||
|| strcasecmp(section, "[SSL]") == 0
|
||||
#endif
|
||||
)
|
||||
continue;
|
||||
|
||||
if( strcasecmp( section, "[SERVER]" ) == 0 ) {
|
||||
@@ -1463,6 +1479,12 @@ Handle_OPTIONS(int Line, char *Var, char *Arg)
|
||||
Config_Error_TooLong(Line, Var);
|
||||
return;
|
||||
}
|
||||
if (strcasecmp(Var, "CloakHostModeX") == 0) {
|
||||
len = strlcpy(Conf_CloakHostModeX, Arg, sizeof(Conf_CloakHostModeX));
|
||||
if (len >= sizeof(Conf_CloakHostModeX))
|
||||
Config_Error_TooLong(Line, Var);
|
||||
return;
|
||||
}
|
||||
if (strcasecmp(Var, "CloakUserToNick") == 0) {
|
||||
Conf_CloakUserToNick = Check_ArgIsTrue(Arg);
|
||||
return;
|
||||
|
@@ -166,6 +166,9 @@ GLOBAL bool Conf_AllowRemoteOper;
|
||||
/** Cloaked hostname of the clients */
|
||||
GLOBAL char Conf_CloakHost[CLIENT_ID_LEN];
|
||||
|
||||
/** Cloaked hostname for clients that did +x */
|
||||
GLOBAL char Conf_CloakHostModeX[CLIENT_ID_LEN];
|
||||
|
||||
/** Use nick name as user name? */
|
||||
GLOBAL bool Conf_CloakUserToNick;
|
||||
|
||||
|
@@ -549,17 +549,18 @@ ConnSSL_LogCertInfo( CONNECTION *c )
|
||||
|
||||
assert(ssl);
|
||||
|
||||
Log(LOG_INFO, "New %s connection using cipher %s on socket %d.",
|
||||
SSL_get_version(ssl), SSL_get_cipher(ssl), c->sock);
|
||||
Log(LOG_INFO, "Connection %d: initialized %s using cipher %s.",
|
||||
c->sock, SSL_get_version(ssl), SSL_get_cipher(ssl));
|
||||
#endif
|
||||
#ifdef HAVE_LIBGNUTLS
|
||||
gnutls_session_t sess = c->ssl_state.gnutls_session;
|
||||
gnutls_cipher_algorithm_t cipher = gnutls_cipher_get(sess);
|
||||
|
||||
Log(LOG_INFO, "New %s connection using cipher %s-%s on socket %d.",
|
||||
Log(LOG_INFO, "Connection %d: initialized %s using cipher %s-%s.",
|
||||
c->sock,
|
||||
gnutls_protocol_get_name(gnutls_protocol_get_version(sess)),
|
||||
gnutls_cipher_get_name(cipher),
|
||||
gnutls_mac_get_name(gnutls_mac_get(sess)), c->sock);
|
||||
gnutls_mac_get_name(gnutls_mac_get(sess)));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@@ -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
|
||||
@@ -1589,7 +1589,7 @@ Read_Request( CONN_ID Idx )
|
||||
if (!array_catb(&My_Connections[Idx].zip.rbuf, readbuf,
|
||||
(size_t) len)) {
|
||||
Log(LOG_ERR,
|
||||
"Could not append recieved data to zip input buffer (connection %d): %d bytes!",
|
||||
"Could not append received data to zip input buffer (connection %d): %d bytes!",
|
||||
Idx, len);
|
||||
Conn_Close(Idx, "Receive buffer space exhausted", NULL,
|
||||
false);
|
||||
@@ -1600,7 +1600,7 @@ Read_Request( CONN_ID Idx )
|
||||
{
|
||||
if (!array_catb( &My_Connections[Idx].rbuf, readbuf, len)) {
|
||||
Log(LOG_ERR,
|
||||
"Could not append recieved data to input buffer (connection %d): %d bytes!",
|
||||
"Could not append received data to input buffer (connection %d): %d bytes!",
|
||||
Idx, len);
|
||||
Conn_Close(Idx, "Receive buffer space exhausted", NULL, false );
|
||||
}
|
||||
@@ -1935,6 +1935,14 @@ New_Server( int Server , ng_ipaddr_t *dest)
|
||||
|
||||
assert( Server > NONE );
|
||||
|
||||
/* Make sure that the remote server hasn't re-linked to this server
|
||||
* asynchronously on its own */
|
||||
if (Conf_Server[Server].conn_id > NONE) {
|
||||
Log(LOG_INFO,
|
||||
"Connection to \"%s\" meanwhile re-established, aborting preparation.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (!ng_ipaddr_tostr_r(dest, ip_str)) {
|
||||
Log(LOG_WARNING, "New_Server: Could not convert IP to string");
|
||||
return;
|
||||
@@ -2008,7 +2016,7 @@ New_Server( int Server , ng_ipaddr_t *dest)
|
||||
Client_SetToken( c, TOKEN_OUTBOUND );
|
||||
|
||||
/* Register connection */
|
||||
Conf_Server[Server].conn_id = new_sock;
|
||||
Conf_SetServer(Server, new_sock);
|
||||
My_Connections[new_sock].sock = new_sock;
|
||||
My_Connections[new_sock].addr = *dest;
|
||||
My_Connections[new_sock].client = c;
|
||||
@@ -2174,6 +2182,7 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events )
|
||||
char *identptr;
|
||||
#ifdef IDENTAUTH
|
||||
char readbuf[HOST_LEN + 2 + CLIENT_USER_LEN];
|
||||
char *ptr;
|
||||
#else
|
||||
char readbuf[HOST_LEN + 1];
|
||||
#endif
|
||||
@@ -2226,11 +2235,30 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events )
|
||||
#ifdef IDENTAUTH
|
||||
++identptr;
|
||||
if (*identptr) {
|
||||
Log(LOG_INFO, "IDENT lookup for connection %d: \"%s\".", i, identptr);
|
||||
Client_SetUser(c, identptr, true);
|
||||
if (Conf_NoticeAuth)
|
||||
ptr = identptr;
|
||||
while (*ptr) {
|
||||
if ((*ptr < '0' || *ptr > '9') &&
|
||||
(*ptr < 'A' || *ptr > 'Z') &&
|
||||
(*ptr < 'a' || *ptr > 'z'))
|
||||
break;
|
||||
ptr++;
|
||||
}
|
||||
if (*ptr) {
|
||||
/* Erroneous IDENT reply */
|
||||
Log(LOG_NOTICE,
|
||||
"Got invalid IDENT reply for connection %d! Ignored.",
|
||||
i);
|
||||
} else {
|
||||
Log(LOG_INFO,
|
||||
"IDENT lookup for connection %d: \"%s\".",
|
||||
i, identptr);
|
||||
Client_SetUser(c, identptr, true);
|
||||
}
|
||||
if (Conf_NoticeAuth) {
|
||||
(void)Conn_WriteStr(i,
|
||||
"NOTICE AUTH :*** Got ident response");
|
||||
"NOTICE AUTH :*** Got %sident response",
|
||||
*ptr ? "invalid " : "");
|
||||
}
|
||||
} else {
|
||||
Log(LOG_INFO, "IDENT lookup for connection %d: no result.", i);
|
||||
if (Conf_NoticeAuth && Conf_Ident)
|
||||
|
@@ -161,7 +161,7 @@
|
||||
#define USERMODES "acCiorRswx"
|
||||
|
||||
/** Supported channel modes. */
|
||||
#define CHANMODES "beiIklmnoOPRstvz"
|
||||
#define CHANMODES "beiIklmnoOPrRstvz"
|
||||
|
||||
/** Away message for users connected to linked servers. */
|
||||
#define DEFAULT_AWAY_MSG "Away"
|
||||
|
291
src/ngircd/irc-cap.c
Normal file
291
src/ngircd/irc-cap.c
Normal file
@@ -0,0 +1,291 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Handler for IRC capability ("CAP") commands
|
||||
*/
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "defines.h"
|
||||
#include "conn.h"
|
||||
#include "channel.h"
|
||||
#include "client-cap.h"
|
||||
#include "irc-write.h"
|
||||
#include "log.h"
|
||||
#include "login.h"
|
||||
#include "messages.h"
|
||||
#include "parse.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "irc-cap.h"
|
||||
|
||||
bool Handle_CAP_LS PARAMS((CLIENT *Client, char *Arg));
|
||||
bool Handle_CAP_LIST PARAMS((CLIENT *Client, char *Arg));
|
||||
bool Handle_CAP_REQ PARAMS((CLIENT *Client, char *Arg));
|
||||
bool Handle_CAP_ACK PARAMS((CLIENT *Client, char *Arg));
|
||||
bool Handle_CAP_CLEAR PARAMS((CLIENT *Client));
|
||||
bool Handle_CAP_END PARAMS((CLIENT *Client));
|
||||
|
||||
void Set_CAP_Negotiation PARAMS((CLIENT *Client));
|
||||
|
||||
int Parse_CAP PARAMS((int Capabilities, char *Args));
|
||||
char *Get_CAP_String PARAMS((int Capabilities));
|
||||
|
||||
/**
|
||||
* Handler for the IRCv3 "CAP" command.
|
||||
*
|
||||
* @param Client The client from which this command has been received.
|
||||
* @param Req Request structure with prefix and all parameters.
|
||||
* @returns CONNECTED or DISCONNECTED.
|
||||
*/
|
||||
GLOBAL bool
|
||||
IRC_CAP(CLIENT *Client, REQUEST *Req)
|
||||
{
|
||||
assert(Client != NULL);
|
||||
assert(Req != NULL);
|
||||
|
||||
/* Bad number of prameters? */
|
||||
if (Req->argc < 1 || Req->argc > 2)
|
||||
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||
Client_ID(Client), Req->command);
|
||||
|
||||
LogDebug("Got \"%s %s\" command from \"%s\" ...",
|
||||
Req->command, Req->argv[0], Client_ID(Client));
|
||||
|
||||
if (Req->argc == 1) {
|
||||
if (strcasecmp(Req->argv[0], "CLEAR") == 0)
|
||||
return Handle_CAP_CLEAR(Client);
|
||||
if (strcasecmp(Req->argv[0], "END") == 0)
|
||||
return Handle_CAP_END(Client);
|
||||
}
|
||||
if (Req->argc >= 1 && Req->argc <= 2) {
|
||||
if (strcasecmp(Req->argv[0], "LS") == 0)
|
||||
return Handle_CAP_LS(Client, Req->argv[1]);
|
||||
if (strcasecmp(Req->argv[0], "LIST") == 0)
|
||||
return Handle_CAP_LIST(Client, Req->argv[1]);
|
||||
}
|
||||
if (Req->argc == 2) {
|
||||
if (strcasecmp(Req->argv[0], "REQ") == 0)
|
||||
return Handle_CAP_REQ(Client, Req->argv[1]);
|
||||
if (strcasecmp(Req->argv[0], "ACK") == 0)
|
||||
return Handle_CAP_ACK(Client, Req->argv[1]);
|
||||
}
|
||||
|
||||
return IRC_WriteStrClient(Client, ERR_INVALIDCAP_MSG,
|
||||
Client_ID(Client), Req->argv[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handler for the "CAP LS" command.
|
||||
*
|
||||
* @param Client The client from which this command has been received.
|
||||
* @param Arg Command argument or NULL.
|
||||
* @returns CONNECTED or DISCONNECTED.
|
||||
*/
|
||||
bool
|
||||
Handle_CAP_LS(CLIENT *Client, UNUSED char *Arg)
|
||||
{
|
||||
assert(Client != NULL);
|
||||
|
||||
Set_CAP_Negotiation(Client);
|
||||
|
||||
return IRC_WriteStrClient(Client,
|
||||
"CAP %s LS :multi-prefix",
|
||||
Client_ID(Client));
|
||||
}
|
||||
|
||||
/**
|
||||
* Handler for the "CAP LIST" command.
|
||||
*
|
||||
* @param Client The client from which this command has been received.
|
||||
* @param Arg Command argument or NULL.
|
||||
* @returns CONNECTED or DISCONNECTED.
|
||||
*/
|
||||
bool
|
||||
Handle_CAP_LIST(CLIENT *Client, UNUSED char *Arg)
|
||||
{
|
||||
assert(Client != NULL);
|
||||
|
||||
return IRC_WriteStrClient(Client, "CAP %s LIST :%s", Client_ID(Client),
|
||||
Get_CAP_String(Client_Cap(Client)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Handler for the "CAP REQ" command.
|
||||
*
|
||||
* @param Client The client from which this command has been received.
|
||||
* @param Arg Command argument.
|
||||
* @returns CONNECTED or DISCONNECTED.
|
||||
*/
|
||||
bool
|
||||
Handle_CAP_REQ(CLIENT *Client, char *Arg)
|
||||
{
|
||||
int new_cap;
|
||||
|
||||
assert(Client != NULL);
|
||||
assert(Arg != NULL);
|
||||
|
||||
Set_CAP_Negotiation(Client);
|
||||
|
||||
new_cap = Parse_CAP(Client_Cap(Client), Arg);
|
||||
|
||||
if (new_cap < 0)
|
||||
return IRC_WriteStrClient(Client, "CAP %s NAK :%s",
|
||||
Client_ID(Client), Arg);
|
||||
|
||||
Client_CapSet(Client, new_cap);
|
||||
return IRC_WriteStrClient(Client, "CAP %s ACK :%s",
|
||||
Client_ID(Client), Arg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handler for the "CAP ACK" command.
|
||||
*
|
||||
* @param Client The client from which this command has been received.
|
||||
* @param Arg Command argument.
|
||||
* @returns CONNECTED or DISCONNECTED.
|
||||
*/
|
||||
bool
|
||||
Handle_CAP_ACK(UNUSED CLIENT *Client, UNUSED char *Arg)
|
||||
{
|
||||
assert(Client != NULL);
|
||||
assert(Arg != NULL);
|
||||
|
||||
return CONNECTED;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handler for the "CAP CLEAR" command.
|
||||
*
|
||||
* @param Client The client from which this command has been received.
|
||||
* @returns CONNECTED or DISCONNECTED.
|
||||
*/
|
||||
bool
|
||||
Handle_CAP_CLEAR(CLIENT *Client)
|
||||
{
|
||||
int cap_old;
|
||||
|
||||
assert(Client != NULL);
|
||||
|
||||
cap_old = Client_Cap(Client);
|
||||
if (cap_old & CLIENT_CAP_MULTI_PREFIX)
|
||||
Client_CapDel(Client, CLIENT_CAP_MULTI_PREFIX);
|
||||
|
||||
return IRC_WriteStrClient(Client, "CAP %s ACK :%s", Client_ID(Client),
|
||||
Get_CAP_String(cap_old));
|
||||
}
|
||||
|
||||
/**
|
||||
* Handler for the "CAP END" command.
|
||||
*
|
||||
* @param Client The client from which this command has been received.
|
||||
* @returns CONNECTED or DISCONNECTED.
|
||||
*/
|
||||
bool
|
||||
Handle_CAP_END(CLIENT *Client)
|
||||
{
|
||||
assert(Client != NULL);
|
||||
|
||||
if (Client_Type(Client) != CLIENT_USER) {
|
||||
/* User is still logging in ... */
|
||||
Client_CapDel(Client, CLIENT_CAP_PENDING);
|
||||
|
||||
if (Client_Type(Client) == CLIENT_WAITCAPEND) {
|
||||
/* Only "CAP END" was missing: log in! */
|
||||
return Login_User(Client);
|
||||
}
|
||||
}
|
||||
|
||||
return CONNECTED;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set CAP negotiation status and mark client as "supports capabilities".
|
||||
*
|
||||
* @param Client The client to handle.
|
||||
*/
|
||||
void
|
||||
Set_CAP_Negotiation(CLIENT *Client)
|
||||
{
|
||||
assert(Client != NULL);
|
||||
|
||||
if (Client_Type(Client) != CLIENT_USER)
|
||||
Client_CapAdd(Client, CLIENT_CAP_PENDING);
|
||||
Client_CapAdd(Client, CLIENT_CAP_SUPPORTED);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse capability string and return numeric flag value.
|
||||
*
|
||||
* @param Args The string containing space-separated capability names.
|
||||
* @return Changed capability flags or 0 on error.
|
||||
*/
|
||||
int
|
||||
Parse_CAP(int Capabilities, char *Args)
|
||||
{
|
||||
static char tmp[COMMAND_LEN];
|
||||
char *ptr;
|
||||
|
||||
assert(Args != NULL);
|
||||
|
||||
strlcpy(tmp, Args, sizeof(tmp));
|
||||
|
||||
ptr = strtok(tmp, " ");
|
||||
while (ptr) {
|
||||
if (*ptr == '-') {
|
||||
/* drop capabilities */
|
||||
ptr++;
|
||||
if (strcmp(ptr, "multi-prefix") == 0)
|
||||
Capabilities &= ~CLIENT_CAP_MULTI_PREFIX;
|
||||
else
|
||||
return -1;
|
||||
} else {
|
||||
/* request capabilities */
|
||||
if (strcmp(ptr, "multi-prefix") == 0)
|
||||
Capabilities |= CLIENT_CAP_MULTI_PREFIX;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
ptr = strtok(NULL, " ");
|
||||
}
|
||||
|
||||
return Capabilities;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return textual representation of capability flags.
|
||||
*
|
||||
* Please note: this function returns a pointer to a global buffer and
|
||||
* therefore isn't thread safe!
|
||||
*
|
||||
* @param Capabilities Capability flags (bitmask).
|
||||
* @return Pointer to textual representation.
|
||||
*/
|
||||
char
|
||||
*Get_CAP_String(int Capabilities)
|
||||
{
|
||||
static char txt[COMMAND_LEN];
|
||||
|
||||
txt[0] = '\0';
|
||||
|
||||
if (Capabilities & CLIENT_CAP_MULTI_PREFIX)
|
||||
strlcat(txt, "multi-prefix ", sizeof(txt));
|
||||
|
||||
return txt;
|
||||
}
|
||||
|
||||
/* -eof- */
|
24
src/ngircd/irc-cap.h
Normal file
24
src/ngircd/irc-cap.h
Normal file
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001-2010 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.
|
||||
*/
|
||||
|
||||
#ifndef __irc_cap_h__
|
||||
#define __irc_cap_h__
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Handler for IRC capability ("CAP") commands (header)
|
||||
*/
|
||||
|
||||
GLOBAL bool IRC_CAP PARAMS((CLIENT *Client, REQUEST *Req));
|
||||
|
||||
#endif
|
||||
|
||||
/* -eof- */
|
@@ -82,7 +82,7 @@ static bool
|
||||
join_allowed(CLIENT *Client, CHANNEL *chan, const char *channame,
|
||||
const char *key)
|
||||
{
|
||||
bool is_invited, is_banned, is_exception;;
|
||||
bool is_invited, is_banned, is_exception;
|
||||
const char *channel_modes;
|
||||
|
||||
/* Allow IRC operators to overwrite channel limits */
|
||||
|
@@ -39,6 +39,7 @@
|
||||
#include "parse.h"
|
||||
#include "irc.h"
|
||||
#include "irc-write.h"
|
||||
#include "client-cap.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "irc-info.h"
|
||||
@@ -807,8 +808,16 @@ who_flags_status(const char *client_modes)
|
||||
|
||||
|
||||
static const char *
|
||||
who_flags_qualifier(const char *chan_user_modes)
|
||||
who_flags_qualifier(CLIENT *Client, const char *chan_user_modes)
|
||||
{
|
||||
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, 'o'))
|
||||
return "@";
|
||||
else if (strchr(chan_user_modes, 'v'))
|
||||
@@ -865,7 +874,7 @@ IRC_WHO_Channel(CLIENT *Client, CHANNEL *Chan, bool OnlyOps)
|
||||
strlcat(flags, "*", sizeof(flags));
|
||||
|
||||
chan_user_modes = Channel_UserModes(Chan, c);
|
||||
strlcat(flags, who_flags_qualifier(chan_user_modes),
|
||||
strlcat(flags, who_flags_qualifier(c, chan_user_modes),
|
||||
sizeof(flags));
|
||||
|
||||
if (!write_whoreply(Client, c, Channel_Name(Chan),
|
||||
@@ -1078,7 +1087,7 @@ IRC_WHOIS_SendReply(CLIENT *Client, CLIENT *from, CLIENT *c)
|
||||
if (str[strlen(str) - 1] != ':')
|
||||
strlcat(str, " ", sizeof(str));
|
||||
|
||||
strlcat(str, who_flags_qualifier(Channel_UserModes(chan, c)),
|
||||
strlcat(str, who_flags_qualifier(c, Channel_UserModes(chan, c)),
|
||||
sizeof(str));
|
||||
strlcat(str, Channel_Name(chan), sizeof(str));
|
||||
|
||||
@@ -1524,60 +1533,77 @@ IRC_Show_MOTD( CLIENT *Client )
|
||||
} /* IRC_Show_MOTD */
|
||||
|
||||
|
||||
/**
|
||||
* Send NAMES reply for a specific client and channel.
|
||||
*
|
||||
* @param Client The client requesting the NAMES information.
|
||||
* @param Chan The channel
|
||||
* @return CONNECTED or DISCONNECTED.
|
||||
*/
|
||||
GLOBAL bool
|
||||
IRC_Send_NAMES( CLIENT *Client, CHANNEL *Chan )
|
||||
IRC_Send_NAMES(CLIENT * Client, CHANNEL * Chan)
|
||||
{
|
||||
bool is_visible, is_member;
|
||||
char str[LINE_LEN + 1];
|
||||
CL2CHAN *cl2chan;
|
||||
CLIENT *cl;
|
||||
|
||||
assert( Client != NULL );
|
||||
assert( Chan != NULL );
|
||||
assert(Client != NULL);
|
||||
assert(Chan != NULL);
|
||||
|
||||
if( Channel_IsMemberOf( Chan, Client )) is_member = true;
|
||||
else is_member = false;
|
||||
if (Channel_IsMemberOf(Chan, Client))
|
||||
is_member = true;
|
||||
else
|
||||
is_member = false;
|
||||
|
||||
/* Do not print info on channel memberships to anyone that is not member? */
|
||||
if (Conf_MorePrivacy && !is_member)
|
||||
return CONNECTED;
|
||||
|
||||
/* Secret channel? */
|
||||
if( ! is_member && strchr( Channel_Modes( Chan ), 's' )) return CONNECTED;
|
||||
if (!is_member && strchr(Channel_Modes(Chan), 's'))
|
||||
return CONNECTED;
|
||||
|
||||
/* Alle Mitglieder suchen */
|
||||
snprintf( str, sizeof( str ), RPL_NAMREPLY_MSG, Client_ID( Client ), "=", Channel_Name( Chan ));
|
||||
cl2chan = Channel_FirstMember( Chan );
|
||||
while( cl2chan )
|
||||
{
|
||||
cl = Channel_GetClient( cl2chan );
|
||||
snprintf(str, sizeof(str), RPL_NAMREPLY_MSG, Client_ID(Client), "=",
|
||||
Channel_Name(Chan));
|
||||
cl2chan = Channel_FirstMember(Chan);
|
||||
while (cl2chan) {
|
||||
cl = Channel_GetClient(cl2chan);
|
||||
|
||||
if( strchr( Client_Modes( cl ), 'i' )) is_visible = false;
|
||||
else is_visible = true;
|
||||
if (strchr(Client_Modes(cl), 'i'))
|
||||
is_visible = false;
|
||||
else
|
||||
is_visible = true;
|
||||
|
||||
if( is_member || is_visible )
|
||||
{
|
||||
/* Nick anhaengen */
|
||||
if( str[strlen( str ) - 1] != ':' ) strlcat( str, " ", sizeof( str ));
|
||||
if( strchr( Channel_UserModes( Chan, cl ), 'o' )) strlcat( str, "@", sizeof( str ));
|
||||
else if( strchr( Channel_UserModes( Chan, cl ), 'v' )) strlcat( str, "+", sizeof( str ));
|
||||
strlcat( str, Client_ID( cl ), sizeof( str ));
|
||||
if (is_member || is_visible) {
|
||||
if (str[strlen(str) - 1] != ':')
|
||||
strlcat(str, " ", sizeof(str));
|
||||
if (Client_Cap(cl) & CLIENT_CAP_MULTI_PREFIX) {
|
||||
if (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));
|
||||
}
|
||||
strlcat(str, Client_ID(cl), sizeof(str));
|
||||
|
||||
if( strlen( str ) > ( LINE_LEN - CLIENT_NICK_LEN - 4 ))
|
||||
{
|
||||
/* Zeile wird zu lang: senden! */
|
||||
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
|
||||
snprintf( str, sizeof( str ), RPL_NAMREPLY_MSG, Client_ID( Client ), "=", Channel_Name( Chan ));
|
||||
if (strlen(str) > (LINE_LEN - CLIENT_NICK_LEN - 4)) {
|
||||
if (!IRC_WriteStrClient(Client, "%s", str))
|
||||
return DISCONNECTED;
|
||||
snprintf(str, sizeof(str), RPL_NAMREPLY_MSG,
|
||||
Client_ID(Client), "=",
|
||||
Channel_Name(Chan));
|
||||
}
|
||||
}
|
||||
|
||||
/* naechstes Mitglied suchen */
|
||||
cl2chan = Channel_NextMember( Chan, cl2chan );
|
||||
cl2chan = Channel_NextMember(Chan, cl2chan);
|
||||
}
|
||||
if( str[strlen( str ) - 1] != ':')
|
||||
{
|
||||
/* Es sind noch Daten da, die gesendet werden muessen */
|
||||
if( ! IRC_WriteStrClient( Client, "%s", str )) return DISCONNECTED;
|
||||
if (str[strlen(str) - 1] != ':') {
|
||||
if (!IRC_WriteStrClient(Client, "%s", str))
|
||||
return DISCONNECTED;
|
||||
}
|
||||
|
||||
return CONNECTED;
|
||||
|
@@ -18,22 +18,17 @@
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
#include <signal.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "ngircd.h"
|
||||
#include "conn-func.h"
|
||||
#include "class.h"
|
||||
#include "conf.h"
|
||||
#include "channel.h"
|
||||
#include "io.h"
|
||||
#include "log.h"
|
||||
#include "login.h"
|
||||
#include "messages.h"
|
||||
#include "pam.h"
|
||||
#include "parse.h"
|
||||
#include "irc.h"
|
||||
#include "irc-info.h"
|
||||
@@ -42,18 +37,7 @@
|
||||
#include "exp.h"
|
||||
#include "irc-login.h"
|
||||
|
||||
|
||||
static bool Hello_User PARAMS(( CLIENT *Client ));
|
||||
static bool Hello_User_PostAuth PARAMS(( CLIENT *Client ));
|
||||
static void Kill_Nick PARAMS(( char *Nick, char *Reason ));
|
||||
static void Introduce_Client PARAMS((CLIENT *To, CLIENT *Client, int Type));
|
||||
|
||||
static void cb_introduceClient PARAMS((CLIENT *Client, CLIENT *Prefix,
|
||||
void *i));
|
||||
|
||||
#ifdef PAM
|
||||
static void cb_Read_Auth_Result PARAMS((int r_fd, UNUSED short events));
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Handler for the IRC "PASS" command.
|
||||
@@ -285,7 +269,7 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
|
||||
/* If we received a valid USER command already then
|
||||
* register the new client! */
|
||||
if( Client_Type( Client ) == CLIENT_GOTUSER )
|
||||
return Hello_User( Client );
|
||||
return Login_User( Client );
|
||||
else
|
||||
Client_SetType( Client, CLIENT_GOTNICK );
|
||||
} else {
|
||||
@@ -395,7 +379,7 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
|
||||
Client_Mask(c));
|
||||
Client_SetType(c, CLIENT_GOTNICK);
|
||||
} else
|
||||
Introduce_Client(Client, c, CLIENT_USER);
|
||||
Client_Introduce(Client, c, CLIENT_USER);
|
||||
|
||||
return CONNECTED;
|
||||
}
|
||||
@@ -416,9 +400,7 @@ GLOBAL bool
|
||||
IRC_USER(CLIENT * Client, REQUEST * Req)
|
||||
{
|
||||
CLIENT *c;
|
||||
#ifdef IDENTAUTH
|
||||
char *ptr;
|
||||
#endif
|
||||
|
||||
assert(Client != NULL);
|
||||
assert(Req != NULL);
|
||||
@@ -436,7 +418,19 @@ IRC_USER(CLIENT * Client, REQUEST * Req)
|
||||
Client_ID(Client),
|
||||
Req->command);
|
||||
|
||||
/* User name */
|
||||
/* User name: only alphanumeric characters are allowed! */
|
||||
ptr = Req->argv[0];
|
||||
while (*ptr) {
|
||||
if ((*ptr < '0' || *ptr > '9') &&
|
||||
(*ptr < 'A' || *ptr > 'Z') &&
|
||||
(*ptr < 'a' || *ptr > 'z')) {
|
||||
Conn_Close(Client_Conn(Client), NULL,
|
||||
"Invalid user name", true);
|
||||
return DISCONNECTED;
|
||||
}
|
||||
ptr++;
|
||||
}
|
||||
|
||||
#ifdef IDENTAUTH
|
||||
ptr = Client_User(Client);
|
||||
if (!ptr || !*ptr || *ptr == '~')
|
||||
@@ -457,7 +451,7 @@ IRC_USER(CLIENT * Client, REQUEST * Req)
|
||||
LogDebug("Connection %d: got valid USER command ...",
|
||||
Client_Conn(Client));
|
||||
if (Client_Type(Client) == CLIENT_GOTNICK)
|
||||
return Hello_User(Client);
|
||||
return Login_User(Client);
|
||||
else
|
||||
Client_SetType(Client, CLIENT_GOTUSER);
|
||||
return CONNECTED;
|
||||
@@ -487,7 +481,7 @@ IRC_USER(CLIENT * Client, REQUEST * Req)
|
||||
/* RFC 1459 style user registration?
|
||||
* Introduce client to network: */
|
||||
if (Client_Type(c) == CLIENT_GOTNICK)
|
||||
Introduce_Client(Client, c, CLIENT_USER);
|
||||
Client_Introduce(Client, c, CLIENT_USER);
|
||||
|
||||
return CONNECTED;
|
||||
} else if (Client_Type(Client) == CLIENT_USER) {
|
||||
@@ -601,7 +595,7 @@ IRC_SERVICE(CLIENT *Client, REQUEST *Req)
|
||||
return CONNECTED;
|
||||
}
|
||||
|
||||
Introduce_Client(Client, c, CLIENT_SERVICE);
|
||||
Client_Introduce(Client, c, CLIENT_SERVICE);
|
||||
return CONNECTED;
|
||||
} /* IRC_SERVICE */
|
||||
|
||||
@@ -880,7 +874,7 @@ IRC_PONG(CLIENT *Client, REQUEST *Req)
|
||||
if (auth_ping == atoi(Req->argv[0])) {
|
||||
Conn_SetAuthPing(conn, 0);
|
||||
if (Client_Type(Client) == CLIENT_WAITAUTHPING)
|
||||
Hello_User(Client);
|
||||
Login_User(Client);
|
||||
} else
|
||||
if (!IRC_WriteStrClient(Client,
|
||||
"To connect, type /QUOTE PONG %ld",
|
||||
@@ -903,196 +897,6 @@ IRC_PONG(CLIENT *Client, REQUEST *Req)
|
||||
} /* IRC_PONG */
|
||||
|
||||
|
||||
/**
|
||||
* Initiate client registration.
|
||||
*
|
||||
* This function is called after the daemon received the required NICK and
|
||||
* USER commands of a new client. If the daemon is compiled with support for
|
||||
* PAM, the authentication sub-processs is forked; otherwise the global server
|
||||
* password is checked.
|
||||
*
|
||||
* @param Client The client logging in.
|
||||
* @returns CONNECTED or DISCONNECTED.
|
||||
*/
|
||||
static bool
|
||||
Hello_User(CLIENT * Client)
|
||||
{
|
||||
#ifdef PAM
|
||||
int pipefd[2], result;
|
||||
pid_t pid;
|
||||
#endif
|
||||
CONN_ID conn;
|
||||
|
||||
assert(Client != NULL);
|
||||
conn = Client_Conn(Client);
|
||||
|
||||
#ifndef STRICT_RFC
|
||||
if (Conf_AuthPing) {
|
||||
/* Did we receive the "auth PONG" already? */
|
||||
if (Conn_GetAuthPing(conn)) {
|
||||
Client_SetType(Client, CLIENT_WAITAUTHPING);
|
||||
LogDebug("Connection %d: Waiting for AUTH PONG ...", conn);
|
||||
return CONNECTED;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef PAM
|
||||
if (!Conf_PAM) {
|
||||
/* Don't do any PAM authentication at all, instead emulate
|
||||
* the beahiour of the daemon compiled without PAM support:
|
||||
* because there can't be any "server password", all
|
||||
* passwords supplied are classified as "wrong". */
|
||||
if(Client_Password(Client)[0] == '\0')
|
||||
return Hello_User_PostAuth(Client);
|
||||
Client_Reject(Client, "Non-empty password", false);
|
||||
return DISCONNECTED;
|
||||
}
|
||||
|
||||
if (Conf_PAMIsOptional && strcmp(Client_Password(Client), "") == 0) {
|
||||
/* Clients are not required to send a password and to be PAM-
|
||||
* authenticated at all. If not, they won't become "identified"
|
||||
* and keep the "~" in their supplied user name.
|
||||
* Therefore it is sensible to either set Conf_PAMisOptional or
|
||||
* to enable IDENT lookups -- not both. */
|
||||
return Hello_User_PostAuth(Client);
|
||||
}
|
||||
|
||||
/* Fork child process for PAM authentication; and make sure that the
|
||||
* process timeout is set higher than the login timeout! */
|
||||
pid = Proc_Fork(Conn_GetProcStat(conn), pipefd,
|
||||
cb_Read_Auth_Result, Conf_PongTimeout + 1);
|
||||
if (pid > 0) {
|
||||
LogDebug("Authenticator for connection %d created (PID %d).",
|
||||
conn, pid);
|
||||
return CONNECTED;
|
||||
} else {
|
||||
/* Sub process */
|
||||
Log_Init_Subprocess("Auth");
|
||||
Conn_CloseAllSockets(NONE);
|
||||
result = PAM_Authenticate(Client);
|
||||
if (write(pipefd[1], &result, sizeof(result)) != sizeof(result))
|
||||
Log_Subprocess(LOG_ERR,
|
||||
"Failed to pipe result to parent!");
|
||||
Log_Exit_Subprocess("Auth");
|
||||
exit(0);
|
||||
}
|
||||
#else
|
||||
/* Check global server password ... */
|
||||
if (strcmp(Client_Password(Client), Conf_ServerPwd) != 0) {
|
||||
/* Bad password! */
|
||||
Client_Reject(Client, "Bad server password", false);
|
||||
return DISCONNECTED;
|
||||
}
|
||||
return Hello_User_PostAuth(Client);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
#ifdef PAM
|
||||
|
||||
/**
|
||||
* Read result of the authenticatior sub-process from pipe
|
||||
*
|
||||
* @param r_fd File descriptor of the pipe.
|
||||
* @param events (ignored IO specification)
|
||||
*/
|
||||
static void
|
||||
cb_Read_Auth_Result(int r_fd, UNUSED short events)
|
||||
{
|
||||
CONN_ID conn;
|
||||
CLIENT *client;
|
||||
int result;
|
||||
size_t len;
|
||||
PROC_STAT *proc;
|
||||
|
||||
LogDebug("Auth: Got callback on fd %d, events %d", r_fd, events);
|
||||
conn = Conn_GetFromProc(r_fd);
|
||||
if (conn == NONE) {
|
||||
/* Ops, none found? Probably the connection has already
|
||||
* been closed!? We'll ignore that ... */
|
||||
io_close(r_fd);
|
||||
LogDebug("Auth: Got callback for unknown connection!?");
|
||||
return;
|
||||
}
|
||||
proc = Conn_GetProcStat(conn);
|
||||
client = Conn_GetClient(conn);
|
||||
|
||||
/* Read result from pipe */
|
||||
len = Proc_Read(proc, &result, sizeof(result));
|
||||
Proc_Close(proc);
|
||||
if (len == 0)
|
||||
return;
|
||||
|
||||
if (len != sizeof(result)) {
|
||||
Log(LOG_CRIT, "Auth: Got malformed result!");
|
||||
Client_Reject(client, "Internal error", false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (result == true) {
|
||||
Client_SetUser(client, Client_OrigUser(client), true);
|
||||
(void)Hello_User_PostAuth(client);
|
||||
} else
|
||||
Client_Reject(client, "Bad password", false);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
* Finish client registration.
|
||||
*
|
||||
* Introduce the new client to the network and send all "hello messages"
|
||||
* to it after authentication has been succeeded.
|
||||
*
|
||||
* @param Client The client logging in.
|
||||
* @returns CONNECTED or DISCONNECTED.
|
||||
*/
|
||||
static bool
|
||||
Hello_User_PostAuth(CLIENT *Client)
|
||||
{
|
||||
assert(Client != NULL);
|
||||
|
||||
if (Class_HandleServerBans(Client) != CONNECTED)
|
||||
return DISCONNECTED;
|
||||
|
||||
Introduce_Client(NULL, Client, CLIENT_USER);
|
||||
|
||||
if (!IRC_WriteStrClient
|
||||
(Client, RPL_WELCOME_MSG, Client_ID(Client), Client_Mask(Client)))
|
||||
return false;
|
||||
if (!IRC_WriteStrClient
|
||||
(Client, RPL_YOURHOST_MSG, Client_ID(Client),
|
||||
Client_ID(Client_ThisServer()), PACKAGE_VERSION, TARGET_CPU,
|
||||
TARGET_VENDOR, TARGET_OS))
|
||||
return false;
|
||||
if (!IRC_WriteStrClient
|
||||
(Client, RPL_CREATED_MSG, Client_ID(Client), NGIRCd_StartStr))
|
||||
return false;
|
||||
if (!IRC_WriteStrClient
|
||||
(Client, RPL_MYINFO_MSG, Client_ID(Client),
|
||||
Client_ID(Client_ThisServer()), PACKAGE_VERSION, USERMODES,
|
||||
CHANMODES))
|
||||
return false;
|
||||
|
||||
/* Features supported by this server (005 numeric, ISUPPORT),
|
||||
* see <http://www.irc.org/tech_docs/005.html> for details. */
|
||||
if (!IRC_Send_ISUPPORT(Client))
|
||||
return DISCONNECTED;
|
||||
|
||||
if (!IRC_Send_LUSERS(Client))
|
||||
return DISCONNECTED;
|
||||
if (!IRC_Show_MOTD(Client))
|
||||
return DISCONNECTED;
|
||||
|
||||
/* Suspend the client for a second ... */
|
||||
IRC_SetPenalty(Client, 1);
|
||||
|
||||
return CONNECTED;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Kill all users with a specific nick name in the network.
|
||||
*
|
||||
@@ -1119,97 +923,4 @@ Kill_Nick(char *Nick, char *Reason)
|
||||
} /* Kill_Nick */
|
||||
|
||||
|
||||
/**
|
||||
* Introduce a new user or service client in the network.
|
||||
*
|
||||
* @param From Remote server introducing the client or NULL (local).
|
||||
* @param Client New client.
|
||||
* @param Type Type of the client (CLIENT_USER or CLIENT_SERVICE).
|
||||
*/
|
||||
static void
|
||||
Introduce_Client(CLIENT *From, CLIENT *Client, int Type)
|
||||
{
|
||||
/* Set client type (user or service) */
|
||||
Client_SetType(Client, Type);
|
||||
|
||||
if (From) {
|
||||
if (Conf_IsService(Conf_GetServer(Client_Conn(From)),
|
||||
Client_ID(Client)))
|
||||
Client_SetType(Client, CLIENT_SERVICE);
|
||||
LogDebug("%s \"%s\" (+%s) registered (via %s, on %s, %d hop%s).",
|
||||
Client_TypeText(Client), Client_Mask(Client),
|
||||
Client_Modes(Client), Client_ID(From),
|
||||
Client_ID(Client_Introducer(Client)),
|
||||
Client_Hops(Client), Client_Hops(Client) > 1 ? "s": "");
|
||||
} else {
|
||||
Log(LOG_NOTICE, "%s \"%s\" registered (connection %d).",
|
||||
Client_TypeText(Client), Client_Mask(Client),
|
||||
Client_Conn(Client));
|
||||
Log_ServerNotice('c', "Client connecting: %s (%s@%s) [%s] - %s",
|
||||
Client_ID(Client), Client_User(Client),
|
||||
Client_Hostname(Client),
|
||||
Conn_IPA(Client_Conn(Client)),
|
||||
Client_TypeText(Client));
|
||||
}
|
||||
|
||||
/* Inform other servers */
|
||||
IRC_WriteStrServersPrefixFlag_CB(From,
|
||||
From != NULL ? From : Client_ThisServer(),
|
||||
'\0', cb_introduceClient, (void *)Client);
|
||||
} /* Introduce_Client */
|
||||
|
||||
|
||||
/**
|
||||
* Introduce a new user or service client to a remote server.
|
||||
*
|
||||
* This function differentiates between RFC1459 and RFC2813 server links and
|
||||
* generates the appropriate commands to register the new user or service.
|
||||
*
|
||||
* @param To The remote server to inform.
|
||||
* @param Prefix Prefix for the generated commands.
|
||||
* @param data CLIENT structure of the new client.
|
||||
*/
|
||||
static void
|
||||
cb_introduceClient(CLIENT *To, CLIENT *Prefix, void *data)
|
||||
{
|
||||
CLIENT *c = (CLIENT *)data;
|
||||
CONN_ID conn;
|
||||
char *modes, *user, *host;
|
||||
|
||||
modes = Client_Modes(c);
|
||||
user = Client_User(c) ? Client_User(c) : "-";
|
||||
host = Client_Hostname(c) ? Client_Hostname(c) : "-";
|
||||
|
||||
conn = Client_Conn(To);
|
||||
if (Conn_Options(conn) & CONN_RFC1459) {
|
||||
/* RFC 1459 mode: separate NICK and USER commands */
|
||||
Conn_WriteStr(conn, "NICK %s :%d", Client_ID(c),
|
||||
Client_Hops(c) + 1);
|
||||
Conn_WriteStr(conn, ":%s USER %s %s %s :%s",
|
||||
Client_ID(c), user, host,
|
||||
Client_ID(Client_Introducer(c)), Client_Info(c));
|
||||
if (modes[0])
|
||||
Conn_WriteStr(conn, ":%s MODE %s +%s",
|
||||
Client_ID(c), Client_ID(c), modes);
|
||||
} else {
|
||||
/* RFC 2813 mode: one combined NICK or SERVICE command */
|
||||
if (Client_Type(c) == CLIENT_SERVICE
|
||||
&& strchr(Client_Flags(To), 'S'))
|
||||
IRC_WriteStrClientPrefix(To, Prefix,
|
||||
"SERVICE %s %d * +%s %d :%s",
|
||||
Client_Mask(c),
|
||||
Client_MyToken(Client_Introducer(c)),
|
||||
Client_Modes(c), Client_Hops(c) + 1,
|
||||
Client_Info(c));
|
||||
else
|
||||
IRC_WriteStrClientPrefix(To, Prefix,
|
||||
"NICK %s %d %s %s %d +%s :%s",
|
||||
Client_ID(c), Client_Hops(c) + 1,
|
||||
user, host,
|
||||
Client_MyToken(Client_Introducer(c)),
|
||||
modes, Client_Info(c));
|
||||
}
|
||||
} /* cb_introduceClient */
|
||||
|
||||
|
||||
/* -eof- */
|
||||
|
@@ -856,7 +856,7 @@ Add_To_List(char what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel,
|
||||
const char *Pattern)
|
||||
{
|
||||
const char *mask;
|
||||
struct list_head *list;
|
||||
struct list_head *list = NULL;
|
||||
long int current_count;
|
||||
|
||||
assert(Client != NULL);
|
||||
@@ -923,7 +923,7 @@ Del_From_List(char what, CLIENT *Prefix, CLIENT *Client, CHANNEL *Channel,
|
||||
const char *Pattern)
|
||||
{
|
||||
const char *mask;
|
||||
struct list_head *list;
|
||||
struct list_head *list = NULL;
|
||||
|
||||
assert(Client != NULL);
|
||||
assert(Channel != NULL);
|
||||
|
@@ -147,10 +147,8 @@ Lists_Add(struct list_head *h, const char *Mask, time_t ValidUntil,
|
||||
|
||||
strlcpy(newelem->mask, Mask, sizeof(newelem->mask));
|
||||
if (Reason) {
|
||||
newelem->reason = malloc(strlen(Reason) + 1);
|
||||
if (newelem->reason)
|
||||
strlcpy(newelem->reason, Reason, strlen(Reason) + 1);
|
||||
else
|
||||
newelem->reason = strdup(Reason);
|
||||
if (!newelem->reason)
|
||||
Log(LOG_EMERG,
|
||||
"Can't allocate memory for new list reason text!");
|
||||
}
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001-2010 Alexander Barton (alex@barton.de)
|
||||
* 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
|
||||
@@ -44,7 +44,6 @@
|
||||
#include "log.h"
|
||||
|
||||
|
||||
static char Init_Txt[127];
|
||||
static bool Is_Daemon;
|
||||
|
||||
|
||||
@@ -65,47 +64,46 @@ Log_Message(int Level, const char *msg)
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Initialitze logging.
|
||||
* This function is called before the configuration file is read in.
|
||||
*
|
||||
* @param Daemon_Mode Set to true if ngIRCd is running as daemon.
|
||||
*/
|
||||
GLOBAL void
|
||||
Log_Init( bool Daemon_Mode )
|
||||
Log_Init(bool Daemon_Mode)
|
||||
{
|
||||
Is_Daemon = Daemon_Mode;
|
||||
|
||||
|
||||
#ifdef SYSLOG
|
||||
#ifndef LOG_CONS /* Kludge: mips-dec-ultrix4.5 has no LOG_CONS */
|
||||
#define LOG_CONS 0
|
||||
#endif
|
||||
#ifdef LOG_DAEMON
|
||||
openlog(PACKAGE_NAME, LOG_CONS|LOG_PID, LOG_DAEMON);
|
||||
#else
|
||||
openlog(PACKAGE_NAME, LOG_CONS|LOG_PID, 0);
|
||||
#endif
|
||||
#endif
|
||||
} /* Log_Init */
|
||||
|
||||
|
||||
/**
|
||||
* Re-init logging after reading the configuration file.
|
||||
*/
|
||||
GLOBAL void
|
||||
Log_ReInit(void)
|
||||
{
|
||||
#ifdef SYSLOG
|
||||
#ifndef LOG_CONS /* Kludge: mips-dec-ultrix4.5 has no LOG_CONS */
|
||||
#define LOG_CONS 0
|
||||
#endif
|
||||
closelog();
|
||||
openlog(PACKAGE_NAME, LOG_CONS|LOG_PID, Conf_SyslogFacility);
|
||||
#endif
|
||||
|
||||
Log( LOG_NOTICE, "%s started.", NGIRCd_Version );
|
||||
|
||||
/* Information about "Operation Mode" */
|
||||
Init_Txt[0] = '\0';
|
||||
#ifdef DEBUG
|
||||
if( NGIRCd_Debug )
|
||||
{
|
||||
strlcpy( Init_Txt, "debug-mode", sizeof Init_Txt );
|
||||
}
|
||||
#endif
|
||||
if( ! Is_Daemon )
|
||||
{
|
||||
if( Init_Txt[0] ) strlcat( Init_Txt, ", ", sizeof Init_Txt );
|
||||
strlcat( Init_Txt, "no-daemon-mode", sizeof Init_Txt );
|
||||
}
|
||||
if( NGIRCd_Passive )
|
||||
{
|
||||
if( Init_Txt[0] ) strlcat( Init_Txt, ", ", sizeof Init_Txt );
|
||||
strlcat( Init_Txt, "passive-mode", sizeof Init_Txt );
|
||||
}
|
||||
#ifdef SNIFFER
|
||||
if( NGIRCd_Sniffer )
|
||||
{
|
||||
if( Init_Txt[0] ) strlcat( Init_Txt, ", ", sizeof Init_Txt );
|
||||
strlcat( Init_Txt, "network sniffer", sizeof Init_Txt );
|
||||
}
|
||||
#endif
|
||||
if( Init_Txt[0] ) Log( LOG_INFO, "Activating: %s.", Init_Txt );
|
||||
} /* Log_Init */
|
||||
Log(LOG_NOTICE, "%s started.", NGIRCd_Version);
|
||||
Log(LOG_INFO, "Using configuration file \"%s\" ...", NGIRCd_ConfFile);
|
||||
}
|
||||
|
||||
|
||||
GLOBAL void
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* ngIRCd -- The Next Generation IRC Daemon
|
||||
* Copyright (c)2001-2010 Alexander Barton (alex@barton.de)
|
||||
* 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
|
||||
@@ -36,6 +36,7 @@ GLOBAL void Log_Init PARAMS(( bool Daemon_Mode ));
|
||||
GLOBAL void Log_Exit PARAMS(( void ));
|
||||
|
||||
GLOBAL void Log PARAMS(( int Level, const char *Format, ... ));
|
||||
GLOBAL void Log_ReInit PARAMS((void));
|
||||
|
||||
GLOBAL void Log_ServerNotice PARAMS((char UserMode, const char *Format, ...));
|
||||
|
||||
|
243
src/ngircd/login.c
Normal file
243
src/ngircd/login.c
Normal file
@@ -0,0 +1,243 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#include "portab.h"
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Functions to deal with client logins
|
||||
*/
|
||||
|
||||
#include "imp.h"
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <strings.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include "defines.h"
|
||||
#include "conn.h"
|
||||
#include "class.h"
|
||||
#include "client.h"
|
||||
#include "client-cap.h"
|
||||
#include "channel.h"
|
||||
#include "conf.h"
|
||||
#include "io.h"
|
||||
#include "parse.h"
|
||||
#include "log.h"
|
||||
#include "messages.h"
|
||||
#include "ngircd.h"
|
||||
#include "pam.h"
|
||||
#include "irc-info.h"
|
||||
#include "irc-write.h"
|
||||
|
||||
#include "exp.h"
|
||||
#include "login.h"
|
||||
|
||||
#ifdef PAM
|
||||
static void cb_Read_Auth_Result PARAMS((int r_fd, UNUSED short events));
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Initiate client login.
|
||||
*
|
||||
* This function is called after the daemon received the required NICK and
|
||||
* USER commands of a new client. If the daemon is compiled with support for
|
||||
* PAM, the authentication sub-processs is forked; otherwise the global server
|
||||
* password is checked.
|
||||
*
|
||||
* @param Client The client logging in.
|
||||
* @returns CONNECTED or DISCONNECTED.
|
||||
*/
|
||||
GLOBAL bool
|
||||
Login_User(CLIENT * Client)
|
||||
{
|
||||
#ifdef PAM
|
||||
int pipefd[2], result;
|
||||
pid_t pid;
|
||||
#endif
|
||||
CONN_ID conn;
|
||||
|
||||
assert(Client != NULL);
|
||||
conn = Client_Conn(Client);
|
||||
|
||||
#ifndef STRICT_RFC
|
||||
if (Conf_AuthPing) {
|
||||
/* Did we receive the "auth PONG" already? */
|
||||
if (Conn_GetAuthPing(conn)) {
|
||||
Client_SetType(Client, CLIENT_WAITAUTHPING);
|
||||
LogDebug("Connection %d: Waiting for AUTH PONG ...", conn);
|
||||
return CONNECTED;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Still waiting for "CAP END" command? */
|
||||
if (Client_Cap(Client) & CLIENT_CAP_PENDING) {
|
||||
Client_SetType(Client, CLIENT_WAITCAPEND);
|
||||
LogDebug("Connection %d: Waiting for CAP END ...", conn);
|
||||
return CONNECTED;
|
||||
}
|
||||
|
||||
#ifdef PAM
|
||||
if (!Conf_PAM) {
|
||||
/* Don't do any PAM authentication at all, instead emulate
|
||||
* the beahiour of the daemon compiled without PAM support:
|
||||
* because there can't be any "server password", all
|
||||
* passwords supplied are classified as "wrong". */
|
||||
if(Client_Password(Client)[0] == '\0')
|
||||
return Login_User_PostAuth(Client);
|
||||
Client_Reject(Client, "Non-empty password", false);
|
||||
return DISCONNECTED;
|
||||
}
|
||||
|
||||
if (Conf_PAMIsOptional && strcmp(Client_Password(Client), "") == 0) {
|
||||
/* Clients are not required to send a password and to be PAM-
|
||||
* authenticated at all. If not, they won't become "identified"
|
||||
* and keep the "~" in their supplied user name.
|
||||
* Therefore it is sensible to either set Conf_PAMisOptional or
|
||||
* to enable IDENT lookups -- not both. */
|
||||
return Login_User_PostAuth(Client);
|
||||
}
|
||||
|
||||
/* Fork child process for PAM authentication; and make sure that the
|
||||
* process timeout is set higher than the login timeout! */
|
||||
pid = Proc_Fork(Conn_GetProcStat(conn), pipefd,
|
||||
cb_Read_Auth_Result, Conf_PongTimeout + 1);
|
||||
if (pid > 0) {
|
||||
LogDebug("Authenticator for connection %d created (PID %d).",
|
||||
conn, pid);
|
||||
return CONNECTED;
|
||||
} else {
|
||||
/* Sub process */
|
||||
Log_Init_Subprocess("Auth");
|
||||
Conn_CloseAllSockets(NONE);
|
||||
result = PAM_Authenticate(Client);
|
||||
if (write(pipefd[1], &result, sizeof(result)) != sizeof(result))
|
||||
Log_Subprocess(LOG_ERR,
|
||||
"Failed to pipe result to parent!");
|
||||
Log_Exit_Subprocess("Auth");
|
||||
exit(0);
|
||||
}
|
||||
#else
|
||||
/* Check global server password ... */
|
||||
if (strcmp(Client_Password(Client), Conf_ServerPwd) != 0) {
|
||||
/* Bad password! */
|
||||
Client_Reject(Client, "Bad server password", false);
|
||||
return DISCONNECTED;
|
||||
}
|
||||
return Login_User_PostAuth(Client);
|
||||
#endif
|
||||
}
|
||||
|
||||
/**
|
||||
* Finish client registration.
|
||||
*
|
||||
* Introduce the new client to the network and send all "hello messages"
|
||||
* to it after authentication has been succeeded.
|
||||
*
|
||||
* @param Client The client logging in.
|
||||
* @return CONNECTED or DISCONNECTED.
|
||||
*/
|
||||
GLOBAL bool
|
||||
Login_User_PostAuth(CLIENT *Client)
|
||||
{
|
||||
assert(Client != NULL);
|
||||
|
||||
if (Class_HandleServerBans(Client) != CONNECTED)
|
||||
return DISCONNECTED;
|
||||
|
||||
Client_Introduce(NULL, Client, CLIENT_USER);
|
||||
|
||||
if (!IRC_WriteStrClient
|
||||
(Client, RPL_WELCOME_MSG, Client_ID(Client), Client_Mask(Client)))
|
||||
return false;
|
||||
if (!IRC_WriteStrClient
|
||||
(Client, RPL_YOURHOST_MSG, Client_ID(Client),
|
||||
Client_ID(Client_ThisServer()), PACKAGE_VERSION, TARGET_CPU,
|
||||
TARGET_VENDOR, TARGET_OS))
|
||||
return false;
|
||||
if (!IRC_WriteStrClient
|
||||
(Client, RPL_CREATED_MSG, Client_ID(Client), NGIRCd_StartStr))
|
||||
return false;
|
||||
if (!IRC_WriteStrClient
|
||||
(Client, RPL_MYINFO_MSG, Client_ID(Client),
|
||||
Client_ID(Client_ThisServer()), PACKAGE_VERSION, USERMODES,
|
||||
CHANMODES))
|
||||
return false;
|
||||
|
||||
/* Features supported by this server (005 numeric, ISUPPORT),
|
||||
* see <http://www.irc.org/tech_docs/005.html> for details. */
|
||||
if (!IRC_Send_ISUPPORT(Client))
|
||||
return DISCONNECTED;
|
||||
|
||||
if (!IRC_Send_LUSERS(Client))
|
||||
return DISCONNECTED;
|
||||
if (!IRC_Show_MOTD(Client))
|
||||
return DISCONNECTED;
|
||||
|
||||
/* Suspend the client for a second ... */
|
||||
IRC_SetPenalty(Client, 1);
|
||||
|
||||
return CONNECTED;
|
||||
}
|
||||
|
||||
#ifdef PAM
|
||||
|
||||
/**
|
||||
* Read result of the authenticatior sub-process from pipe
|
||||
*
|
||||
* @param r_fd File descriptor of the pipe.
|
||||
* @param events (ignored IO specification)
|
||||
*/
|
||||
static void
|
||||
cb_Read_Auth_Result(int r_fd, UNUSED short events)
|
||||
{
|
||||
CONN_ID conn;
|
||||
CLIENT *client;
|
||||
int result;
|
||||
size_t len;
|
||||
PROC_STAT *proc;
|
||||
|
||||
LogDebug("Auth: Got callback on fd %d, events %d", r_fd, events);
|
||||
conn = Conn_GetFromProc(r_fd);
|
||||
if (conn == NONE) {
|
||||
/* Ops, none found? Probably the connection has already
|
||||
* been closed!? We'll ignore that ... */
|
||||
io_close(r_fd);
|
||||
LogDebug("Auth: Got callback for unknown connection!?");
|
||||
return;
|
||||
}
|
||||
proc = Conn_GetProcStat(conn);
|
||||
client = Conn_GetClient(conn);
|
||||
|
||||
/* Read result from pipe */
|
||||
len = Proc_Read(proc, &result, sizeof(result));
|
||||
Proc_Close(proc);
|
||||
if (len == 0)
|
||||
return;
|
||||
|
||||
if (len != sizeof(result)) {
|
||||
Log(LOG_CRIT, "Auth: Got malformed result!");
|
||||
Client_Reject(client, "Internal error", false);
|
||||
return;
|
||||
}
|
||||
|
||||
if (result == true) {
|
||||
Client_SetUser(client, Client_OrigUser(client), true);
|
||||
(void)Login_User_PostAuth(client);
|
||||
} else
|
||||
Client_Reject(client, "Bad password", false);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
/* -eof- */
|
25
src/ngircd/login.h
Normal file
25
src/ngircd/login.h
Normal file
@@ -0,0 +1,25 @@
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef __login_h__
|
||||
#define __login_h__
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Functions to deal with client logins (header)
|
||||
*/
|
||||
|
||||
GLOBAL bool Login_User PARAMS((CLIENT * Client));
|
||||
GLOBAL bool Login_User_PostAuth PARAMS((CLIENT *Client));
|
||||
|
||||
#endif
|
||||
|
||||
/* -eof- */
|
@@ -103,6 +103,7 @@
|
||||
#define ERR_TOOMANYCHANNELS_MSG "405 %s %s :You have joined too many channels"
|
||||
#define ERR_WASNOSUCHNICK_MSG "406 %s %s :There was no such nickname"
|
||||
#define ERR_NOORIGIN_MSG "409 %s :No origin specified"
|
||||
#define ERR_INVALIDCAP_MSG "410 %s %s :Invalid CAP subcommand"
|
||||
#define ERR_NORECIPIENT_MSG "411 %s :No recipient given (%s)"
|
||||
#define ERR_NOTEXTTOSEND_MSG "412 %s :No text to send"
|
||||
#define ERR_WILDTOPLEVEL "414 %s :Wildcard in toplevel domain"
|
||||
|
@@ -255,11 +255,11 @@ main(int argc, const char *argv[])
|
||||
NGIRCd_SignalRestart = false;
|
||||
NGIRCd_SignalQuit = false;
|
||||
|
||||
Random_Init();
|
||||
|
||||
/* Initialize modules, part I */
|
||||
Log_Init(!NGIRCd_NoDaemon);
|
||||
Random_Init();
|
||||
Conf_Init();
|
||||
Log_ReInit();
|
||||
|
||||
/* Initialize the "main program": chroot environment, user and
|
||||
* group ID, ... */
|
||||
@@ -498,7 +498,8 @@ Pidfile_Create(pid_t pid)
|
||||
|
||||
len = snprintf(pidbuf, sizeof pidbuf, "%ld\n", (long)pid);
|
||||
if (len < 0 || len >= (int)sizeof pidbuf) {
|
||||
Log( LOG_ERR, "Error converting pid");
|
||||
Log(LOG_ERR, "Error converting pid");
|
||||
close(pidfd);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -642,12 +643,10 @@ NGIRCd_Init(bool NGIRCd_NoDaemon)
|
||||
}
|
||||
|
||||
if (chroot(Conf_Chroot) != 0) {
|
||||
if (errno != EPERM) {
|
||||
Log(LOG_ERR,
|
||||
"Can't change root directory to \"%s\": %s",
|
||||
Conf_Chroot, strerror(errno));
|
||||
goto out;
|
||||
}
|
||||
Log(LOG_ERR,
|
||||
"Can't change root directory to \"%s\": %s",
|
||||
Conf_Chroot, strerror(errno));
|
||||
goto out;
|
||||
} else {
|
||||
chrooted = true;
|
||||
Log(LOG_INFO,
|
||||
|
@@ -36,6 +36,7 @@
|
||||
|
||||
#include "imp.h"
|
||||
#include "irc.h"
|
||||
#include "irc-cap.h"
|
||||
#include "irc-channel.h"
|
||||
#include "irc-info.h"
|
||||
#include "irc-login.h"
|
||||
@@ -113,6 +114,7 @@ static COMMAND My_Commands[] =
|
||||
{ "CHANINFO", IRC_CHANINFO, CLIENT_SERVER, 0, 0, 0 },
|
||||
#endif
|
||||
#ifndef STRICT_RFC
|
||||
{ "CAP", IRC_CAP, 0xFFFF, 0, 0, 0 },
|
||||
{ "GET", IRC_QUIT_HTTP, CLIENT_UNKNOWN, 0, 0, 0 },
|
||||
{ "POST", IRC_QUIT_HTTP, CLIENT_UNKNOWN, 0, 0, 0 },
|
||||
#endif
|
||||
|
@@ -218,8 +218,11 @@ Signal_Handler_BH(int Signal)
|
||||
break;
|
||||
#ifdef DEBUG
|
||||
case SIGUSR2:
|
||||
if (NGIRCd_Debug)
|
||||
if (NGIRCd_Debug) {
|
||||
Log(LOG_INFO|LOG_snotice,
|
||||
"Got SIGUSR2, dumping internal state ...");
|
||||
Dump_State();
|
||||
}
|
||||
break;
|
||||
default:
|
||||
Log(LOG_DEBUG, "Got signal %d! Ignored.", Signal);
|
||||
|
@@ -13,6 +13,8 @@ elif [ $UNAME = "A/UX" ]; then
|
||||
PS_FLAGS="-ae"; PS_PIDCOL="1"; HEAD_FLAGS="-1"
|
||||
elif [ $UNAME = "GNU" ]; then
|
||||
PS_FLAGS="-ax"; PS_PIDCOL="2"; HEAD_FLAGS="-n 1"
|
||||
elif [ $UNAME = "Linux" ]; then
|
||||
PS_FLAGS="ax"; PS_PIDCOL="1"; HEAD_FLAGS="-n 1"
|
||||
elif [ $UNAME = "SunOS" ]; then
|
||||
PS_FLAGS="-af"; PS_PIDCOL=2; HEAD_FLAGS="-n 1"
|
||||
else
|
||||
|
Reference in New Issue
Block a user