mirror of
https://github.com/osmarks/ngircd.git
synced 2025-11-05 08:22:59 +00:00
Compare commits
439 Commits
rel-18-rc2
...
rel-20.3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bb6e277963 | ||
|
|
d24df64397 | ||
|
|
c45d9dd1f0 | ||
|
|
b3d4cf9081 | ||
|
|
1265eb15b8 | ||
|
|
84612fe773 | ||
|
|
84f5839c17 | ||
|
|
cb3b411166 | ||
|
|
121bcacb98 | ||
|
|
4105635566 | ||
|
|
90fce2ed16 | ||
|
|
21493731df | ||
|
|
1f59821270 | ||
|
|
3e47bc9af5 | ||
|
|
5d92198487 | ||
|
|
20ddffca0d | ||
|
|
25e56a5e83 | ||
|
|
1e5a7aac87 | ||
|
|
b5b3dd9cfd | ||
|
|
92fba63ad8 | ||
|
|
25d35dd6f4 | ||
|
|
a445abc10e | ||
|
|
1342f78b09 | ||
|
|
a0d57a6afd | ||
|
|
c6ae353756 | ||
|
|
12768e7a54 | ||
|
|
35e2dcff88 | ||
|
|
dc89e42ef5 | ||
|
|
4a2d74c9ab | ||
|
|
cd48b8128e | ||
|
|
301d4915bc | ||
|
|
8061056cec | ||
|
|
44926b7f9f | ||
|
|
d11a700589 | ||
|
|
0a26079af2 | ||
|
|
b6e49f3920 | ||
|
|
4123118d5a | ||
|
|
e29d198700 | ||
|
|
6f531a3c99 | ||
|
|
53917fa4b8 | ||
|
|
646218e6f4 | ||
|
|
4185c4a44a | ||
|
|
45b0bb5aff | ||
|
|
c7db2f8429 | ||
|
|
f0b86e6c26 | ||
|
|
7871a904d7 | ||
|
|
40e3daf560 | ||
|
|
44b7ff02fd | ||
|
|
35ed57e6c1 | ||
|
|
79731a57f3 | ||
|
|
a7f37cebdc | ||
|
|
47b99c69cc | ||
|
|
757f3497bc | ||
|
|
f2455cbe33 | ||
|
|
e3f300d323 | ||
|
|
497edbaf3e | ||
|
|
48326e061a | ||
|
|
84e9dcbab0 | ||
|
|
30b32e84fe | ||
|
|
fb92493376 | ||
|
|
eb4f9eac0c | ||
|
|
d7b5dd1bbf | ||
|
|
b18e81b631 | ||
|
|
8ff153d7d4 | ||
|
|
32f63abb59 | ||
|
|
23572af942 | ||
|
|
8d9cfa157a | ||
|
|
58abd0777b | ||
|
|
3ee98d9f72 | ||
|
|
b1a5ade88f | ||
|
|
73229249d8 | ||
|
|
e0da56fc7b | ||
|
|
cdaaae0cb2 | ||
|
|
c319fb8eaa | ||
|
|
538e612a47 | ||
|
|
9d97004a28 | ||
|
|
87deb43012 | ||
|
|
a9cbb375b7 | ||
|
|
161adbb1aa | ||
|
|
de2fa78d92 | ||
|
|
8bede388af | ||
|
|
c9d166747d | ||
|
|
56cdc2175c | ||
|
|
de453d71cb | ||
|
|
23b07bdf50 | ||
|
|
9ac94339dc | ||
|
|
46b0eef721 | ||
|
|
d3ae351236 | ||
|
|
4790d78c98 | ||
|
|
c66e20ce6e | ||
|
|
343a90dc37 | ||
|
|
09ab0704f4 | ||
|
|
114644cdb0 | ||
|
|
cf9f9e1f30 | ||
|
|
19ce256a95 | ||
|
|
eba53f652c | ||
|
|
d8ee498a65 | ||
|
|
e3a1a61868 | ||
|
|
1a2bdd9e4c | ||
|
|
384f965fba | ||
|
|
005340c83f | ||
|
|
d21afce2b6 | ||
|
|
808c291c76 | ||
|
|
62a07596d6 | ||
|
|
b730b64bbe | ||
|
|
3e22fc32f3 | ||
|
|
e65a35e964 | ||
|
|
78d189fbf7 | ||
|
|
8cfb910441 | ||
|
|
039a939cb8 | ||
|
|
d7d5f4330b | ||
|
|
79c1222896 | ||
|
|
a3f3a1097b | ||
|
|
d4df626d88 | ||
|
|
eed8a4ee6e | ||
|
|
b1b83831d1 | ||
|
|
8e1beae4e7 | ||
|
|
baed0618ed | ||
|
|
e3e181f4b3 | ||
|
|
1f2aa4da6f | ||
|
|
fc39146f48 | ||
|
|
192e304b94 | ||
|
|
1744a8d145 | ||
|
|
b12acddf4f | ||
|
|
ef82ef4ddb | ||
|
|
bb20aeb9bc | ||
|
|
e9d0b2f039 | ||
|
|
222ecbffbb | ||
|
|
ce736fc15b | ||
|
|
1413a4886f | ||
|
|
cfec819f0d | ||
|
|
107bfdc821 | ||
|
|
5c160921ff | ||
|
|
fe3bef55b7 | ||
|
|
5300f0082c | ||
|
|
85abfd84be | ||
|
|
005ffeaa8c | ||
|
|
5c8c6d3c70 | ||
|
|
7eb3932d3a | ||
|
|
ebf2f991b5 | ||
|
|
a451cb22f1 | ||
|
|
82bf4eb059 | ||
|
|
d53d58fff2 | ||
|
|
a072180c92 | ||
|
|
0fd9a8505a | ||
|
|
b2482b39e4 | ||
|
|
74c7d7131f | ||
|
|
4dd1c31dc7 | ||
|
|
2e13e821f8 | ||
|
|
2478c5816b | ||
|
|
47ad9afcf3 | ||
|
|
67e882d4bb | ||
|
|
25c216cbdf | ||
|
|
f5441d2170 | ||
|
|
0d67be3f30 | ||
|
|
f37600ee01 | ||
|
|
f38a9035e5 | ||
|
|
a12d6ff257 | ||
|
|
2205227c3b | ||
|
|
d2d867ea36 | ||
|
|
b232ae2f17 | ||
|
|
53b2acc00b | ||
|
|
01b62202b2 | ||
|
|
b68bb560e9 | ||
|
|
21467c76f1 | ||
|
|
33fae67579 | ||
|
|
864015fa3f | ||
|
|
1d3def0cc6 | ||
|
|
e01e8f1cb6 | ||
|
|
186ab51137 | ||
|
|
74be904018 | ||
|
|
298cd9a327 | ||
|
|
414bfe65eb | ||
|
|
c519ba9920 | ||
|
|
fee8ff37b3 | ||
|
|
fee591b759 | ||
|
|
16f94546f5 | ||
|
|
55859c1bef | ||
|
|
bcefdef1ea | ||
|
|
f79d41e927 | ||
|
|
1680ea02da | ||
|
|
1aaf54ac24 | ||
|
|
a5984c702a | ||
|
|
9a82304ae9 | ||
|
|
a26e37b746 | ||
|
|
c2b39fdede | ||
|
|
8349a1c0d9 | ||
|
|
360a254be0 | ||
|
|
ab1fcebeff | ||
|
|
a6dd2e33c2 | ||
|
|
9d8974d509 | ||
|
|
037b4b76df | ||
|
|
be97fa8ab1 | ||
|
|
164954a788 | ||
|
|
c1d7f6216f | ||
|
|
7df4c12da9 | ||
|
|
0d5de60584 | ||
|
|
4b0f526006 | ||
|
|
4cf65b973c | ||
|
|
160f728530 | ||
|
|
922540306e | ||
|
|
d48e440a72 | ||
|
|
0709a0f050 | ||
|
|
097c72aa65 | ||
|
|
7b01bb833f | ||
|
|
cfd0bddc30 | ||
|
|
b53b12aa5f | ||
|
|
d0bb185cf5 | ||
|
|
49385a98b2 | ||
|
|
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 | ||
|
|
8e3c56e5b2 | ||
|
|
e1026d5dd1 | ||
|
|
f7bdee5f13 | ||
|
|
391aa8d1f7 | ||
|
|
89d99e2ff9 | ||
|
|
c16133c5ee | ||
|
|
4888984429 | ||
|
|
44bb22d23e | ||
|
|
c7dd5ea0ba | ||
|
|
871760583c | ||
|
|
bc20f9ec10 | ||
|
|
5a200e1543 | ||
|
|
d2df7396a8 | ||
|
|
3d27073d61 | ||
|
|
b6f19ea8fe | ||
|
|
8c46067b34 | ||
|
|
594fdd02aa | ||
|
|
6a308fcb42 | ||
|
|
1537c79132 | ||
|
|
e0c9931ad8 | ||
|
|
eba95bb0d2 | ||
|
|
51a6a33056 | ||
|
|
6e28f4a7d1 | ||
|
|
9882e578e9 | ||
|
|
73781c1b38 | ||
|
|
f2fa1045e2 | ||
|
|
33a165721b | ||
|
|
a3a4b5f696 | ||
|
|
39412d6486 | ||
|
|
c1656256df | ||
|
|
1f4711a547 | ||
|
|
4d0069c3a8 | ||
|
|
12c60a670e | ||
|
|
2f7d0c0839 | ||
|
|
1afbf71236 | ||
|
|
7ed08f01ef | ||
|
|
81cc5f82b5 | ||
|
|
78a3b4c7d6 | ||
|
|
39d630c00d | ||
|
|
4fe6b42c53 | ||
|
|
d4d8102fc9 | ||
|
|
77f68b4fd1 | ||
|
|
2f8877ded4 | ||
|
|
4bff3daf92 | ||
|
|
c5beca8aab | ||
|
|
f8405b1a4f | ||
|
|
fdfc27265e | ||
|
|
a4d1e6007f | ||
|
|
9260759cec | ||
|
|
c2ac1ad3ba | ||
|
|
470d2e2362 | ||
|
|
888664435a | ||
|
|
98493077a2 | ||
|
|
1fa2af5b3a | ||
|
|
05cc9bf9b0 | ||
|
|
cc06e1ff89 | ||
|
|
9fbf592924 | ||
|
|
adf92302bf | ||
|
|
566a451299 | ||
|
|
e0f8ce093a | ||
|
|
5e3449a241 | ||
|
|
762b0325df | ||
|
|
6b62a5ec4f | ||
|
|
b24d645ca1 | ||
|
|
1bb2fbedcc | ||
|
|
3193d5477c | ||
|
|
edab86e0f8 | ||
|
|
e4006a93e3 | ||
|
|
9069380ddf | ||
|
|
ab188c1486 | ||
|
|
5eb9f2e717 | ||
|
|
abfc5c6e27 | ||
|
|
565523cbb4 | ||
|
|
013298d4c6 | ||
|
|
af13732ec7 | ||
|
|
408a74b865 | ||
|
|
f47904bf95 | ||
|
|
70eb8219f5 | ||
|
|
9e5b9ddad0 | ||
|
|
56b7e67307 | ||
|
|
b681aa5b9f | ||
|
|
b32f3b76e9 | ||
|
|
1a5ed654b4 | ||
|
|
9cbb8f3bb8 | ||
|
|
e19ce437ca | ||
|
|
4e550bf9ef | ||
|
|
1d29a59f7e | ||
|
|
765c2f26ea | ||
|
|
69fa6f268a | ||
|
|
43509fd22c | ||
|
|
a71abfef4b | ||
|
|
8a8e8a3a23 | ||
|
|
65befdafaa | ||
|
|
15fec92ed7 | ||
|
|
1e4a00f94f | ||
|
|
338758799d | ||
|
|
164e15b8c6 | ||
|
|
32bfafafd9 | ||
|
|
6ef20e0f9a | ||
|
|
e86e193e01 | ||
|
|
ae5ebfb9f0 | ||
|
|
e9e6224aae | ||
|
|
e23f025dd6 | ||
|
|
3ca8703309 | ||
|
|
fc82efc3e8 | ||
|
|
dc9fcb0fb2 | ||
|
|
2b95c69ea1 | ||
|
|
af70c3dbc9 | ||
|
|
1e054e0b82 | ||
|
|
06a20b87c4 | ||
|
|
fea2194fc0 | ||
|
|
872dc5042d | ||
|
|
e1315f30fd | ||
|
|
0a85c58878 | ||
|
|
ee21490887 | ||
|
|
8fa92f0a24 | ||
|
|
8e193df973 | ||
|
|
9d348d00d9 | ||
|
|
9e48f3f8f8 | ||
|
|
e4a06844a3 | ||
|
|
20ccc1bba7 | ||
|
|
13d9e0c5a7 | ||
|
|
a7911e35af | ||
|
|
60812b6fdf | ||
|
|
1ea6811616 | ||
|
|
d2f54abbed | ||
|
|
07dbb73c92 | ||
|
|
30796698a9 | ||
|
|
f173a974be | ||
|
|
8aac366802 | ||
|
|
69803d6ff1 | ||
|
|
be6994aece | ||
|
|
1361b3742d | ||
|
|
d3036c74e9 | ||
|
|
553e8b6aa3 | ||
|
|
51d7674ee7 | ||
|
|
1189200d4a | ||
|
|
7795b07c53 | ||
|
|
d9325e8030 | ||
|
|
641045249c | ||
|
|
69f81a359a | ||
|
|
be03bc672c | ||
|
|
160c52400f | ||
|
|
0b8acf1205 | ||
|
|
88f6fc5fd8 | ||
|
|
da897a2a14 | ||
|
|
989c9fa531 | ||
|
|
2fd42667c2 | ||
|
|
2dfa24d2fa | ||
|
|
1ed602eb47 | ||
|
|
ea725b99b7 | ||
|
|
3dc3a03538 | ||
|
|
95f0e4033c | ||
|
|
409b2c86c8 | ||
|
|
d692286d7a | ||
|
|
456e55921d | ||
|
|
9f3690c39c | ||
|
|
6cbe13085d | ||
|
|
b7780e3f2a | ||
|
|
04744e9d89 | ||
|
|
54f04f81e9 | ||
|
|
95e156b519 | ||
|
|
e160121698 | ||
|
|
54566b6b32 | ||
|
|
c041bb340c |
2
.gitignore
vendored
2
.gitignore
vendored
@@ -4,11 +4,13 @@ aclocal.m4
|
|||||||
ansi2knr.1
|
ansi2knr.1
|
||||||
ansi2knr.c
|
ansi2knr.c
|
||||||
ansi2knr.h
|
ansi2knr.h
|
||||||
|
ar-lib
|
||||||
autom4te.cache
|
autom4te.cache
|
||||||
build-stamp-ngircd*
|
build-stamp-ngircd*
|
||||||
config.log
|
config.log
|
||||||
config.status
|
config.status
|
||||||
configure
|
configure
|
||||||
|
configure.ac
|
||||||
configure.lineno
|
configure.lineno
|
||||||
cscope.out
|
cscope.out
|
||||||
debian
|
debian
|
||||||
|
|||||||
9
AUTHORS
9
AUTHORS
@@ -2,7 +2,7 @@
|
|||||||
ngIRCd - Next Generation IRC Server
|
ngIRCd - Next Generation IRC Server
|
||||||
http://ngircd.barton.de/
|
http://ngircd.barton.de/
|
||||||
|
|
||||||
(c)2001-2011 Alexander Barton and Contributors.
|
(c)2001-2013 Alexander Barton and Contributors.
|
||||||
ngIRCd is free software and published under the
|
ngIRCd is free software and published under the
|
||||||
terms of the GNU General Public License.
|
terms of the GNU General Public License.
|
||||||
|
|
||||||
@@ -10,9 +10,10 @@
|
|||||||
|
|
||||||
|
|
||||||
Note: If you have critics, patches or something else, please feel free to
|
Note: If you have critics, patches or something else, please feel free to
|
||||||
post a mail to the ngIRCd mailing list: <ngircd-ml@arthur.ath.cx> (please see
|
post a mail to the ngIRCd mailing list: <ngircd-ml@arthur.barton.de> (please
|
||||||
<http://ngircd.barton.de/#ml> for details). Don't mail the contributors
|
see <http://ngircd.barton.de/#ml> for details).
|
||||||
directly, if possible!
|
|
||||||
|
Don't mail the people listed here directly, if possible!
|
||||||
|
|
||||||
|
|
||||||
Main Authors
|
Main Authors
|
||||||
|
|||||||
39
COPYING
39
COPYING
@@ -1,12 +1,12 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
Version 2, June 1991
|
Version 2, June 1991
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
of this license document, but changing it is not allowed.
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
Preamble
|
Preamble
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
The licenses for most software are designed to take away your
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
@@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This
|
|||||||
General Public License applies to most of the Free Software
|
General Public License applies to most of the Free Software
|
||||||
Foundation's software and to any other program whose authors commit to
|
Foundation's software and to any other program whose authors commit to
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
the GNU Library General Public License instead.) You can apply it to
|
the GNU Lesser General Public License instead.) You can apply it to
|
||||||
your programs, too.
|
your programs, too.
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
When we speak of free software, we are referring to freedom, not
|
||||||
@@ -55,8 +55,8 @@ patent must be licensed for everyone's free use or not licensed at all.
|
|||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
The precise terms and conditions for copying, distribution and
|
||||||
modification follow.
|
modification follow.
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
0. This License applies to any program or other work which contains
|
||||||
@@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions:
|
|||||||
License. (Exception: if the Program itself is interactive but
|
License. (Exception: if the Program itself is interactive but
|
||||||
does not normally print such an announcement, your work based on
|
does not normally print such an announcement, your work based on
|
||||||
the Program is not required to print an announcement.)
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
These requirements apply to the modified work as a whole. If
|
||||||
identifiable sections of that work are not derived from the Program,
|
identifiable sections of that work are not derived from the Program,
|
||||||
and can be reasonably considered independent and separate works in
|
and can be reasonably considered independent and separate works in
|
||||||
@@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent
|
|||||||
access to copy the source code from the same place counts as
|
access to copy the source code from the same place counts as
|
||||||
distribution of the source code, even though third parties are not
|
distribution of the source code, even though third parties are not
|
||||||
compelled to copy the source along with the object code.
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
except as expressly provided under this License. Any attempt
|
except as expressly provided under this License. Any attempt
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
@@ -225,7 +225,7 @@ impose that choice.
|
|||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
This section is intended to make thoroughly clear what is believed to
|
||||||
be a consequence of the rest of this License.
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
original copyright holder who places the Program under this License
|
original copyright holder who places the Program under this License
|
||||||
@@ -255,7 +255,7 @@ make exceptions for this. Our decision will be guided by the two goals
|
|||||||
of preserving the free status of all derivatives of our free software and
|
of preserving the free status of all derivatives of our free software and
|
||||||
of promoting the sharing and reuse of software generally.
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
NO WARRANTY
|
NO WARRANTY
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
@@ -277,9 +277,9 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
If you develop a new program, and you want it to be of the greatest
|
||||||
possible use to the public, the best way to achieve this is to make it
|
possible use to the public, the best way to achieve this is to make it
|
||||||
@@ -303,10 +303,9 @@ the "copyright" line and a pointer to where the full notice is found.
|
|||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License along
|
||||||
along with this program; if not, write to the Free Software
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
@@ -336,5 +335,5 @@ necessary. Here is a sample; alter the names:
|
|||||||
This General Public License does not permit incorporating your program into
|
This General Public License does not permit incorporating your program into
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
consider it more useful to permit linking proprietary applications with the
|
consider it more useful to permit linking proprietary applications with the
|
||||||
library. If this is what you want to do, use the GNU Library General
|
library. If this is what you want to do, use the GNU Lesser General
|
||||||
Public License instead of this License.
|
Public License instead of this License.
|
||||||
|
|||||||
434
ChangeLog
434
ChangeLog
@@ -2,14 +2,418 @@
|
|||||||
ngIRCd - Next Generation IRC Server
|
ngIRCd - Next Generation IRC Server
|
||||||
http://ngircd.barton.de/
|
http://ngircd.barton.de/
|
||||||
|
|
||||||
(c)2001-2011 Alexander Barton and Contributors.
|
(c)2001-2013 Alexander Barton and Contributors.
|
||||||
ngIRCd is free software and published under the
|
ngIRCd is free software and published under the
|
||||||
terms of the GNU General Public License.
|
terms of the GNU General Public License.
|
||||||
|
|
||||||
-- ChangeLog --
|
-- ChangeLog --
|
||||||
|
|
||||||
|
|
||||||
ngIRCd Release 18
|
ngIRCd 20.3 (2013-08-23)
|
||||||
|
|
||||||
|
- Security: Fix a denial of service bug (server crash) which could happen
|
||||||
|
when the configuration option "NoticeAuth" is enabled (which is NOT the
|
||||||
|
default) and ngIRCd failed to send the "notice auth" messages to new
|
||||||
|
clients connecting to the server (CVE-2013-5580).
|
||||||
|
|
||||||
|
ngIRCd 20.2 (2013-02-15)
|
||||||
|
|
||||||
|
- Security: Fix a denial of service bug in the function handling KICK
|
||||||
|
commands that could be used by arbitrary users to to crash the daemon
|
||||||
|
(CVE-2013-1747).
|
||||||
|
- WHO command: Use the currently "displayed hostname" (which can be cloaked!)
|
||||||
|
for hostname matching, not the real one. In other words: don't display all
|
||||||
|
the cloaked users on a specific real hostname!
|
||||||
|
- configure: The header file "netinet/in_systm.h" already is optional in
|
||||||
|
ngIRCd, so don't require it in the configure script. Now ngIRCd can be
|
||||||
|
built on Minix 3 again :-)
|
||||||
|
- Return better "Connection not registered as server link" errors: Now ngIRCd
|
||||||
|
returns a more specific error message for numeric ERR_NOTREGISTERED(451)
|
||||||
|
when a regular user tries to use a command that isn't allowed for users but
|
||||||
|
for servers.
|
||||||
|
- Don't report ERR_NEEDMOREPARAMS(461) when a MDOE command with more modes
|
||||||
|
than nicknames is handled, as well as for channel limit and key changes
|
||||||
|
without specifying the limit or key parameters.
|
||||||
|
This is how a lot (all?) other IRC servers behave, including ircd2.11,
|
||||||
|
InspIRCd, and ircd-seven. And because of clients (tested with Textual and
|
||||||
|
mIRC) sending bogus MODE commands like "MODE -ooo nick", end-users got the
|
||||||
|
expected result as well as correct but misleading error messages ...
|
||||||
|
- Correctly detect when SSL subsystem must be initialized and take
|
||||||
|
outgoing connections (server links!) into account, too.
|
||||||
|
- autogen.sh: Enforce serial test harness on GNU automake >=1.13. The
|
||||||
|
new parallel test harness which is enabled by default starting with
|
||||||
|
automake 1.13 isn't compatible with our test suite.
|
||||||
|
And don't use "egrep -o", insetead use "sed", because it isn't portable
|
||||||
|
and not available on OpenBSD, for example.
|
||||||
|
|
||||||
|
ngIRCd 20.1 (2013-01-02)
|
||||||
|
|
||||||
|
- Allow ERROR command on server and service links only, ignore them and
|
||||||
|
add a penalty time on all other link types.
|
||||||
|
- Enforced mode setting by IRC Operators: Only check the channel user
|
||||||
|
modes of the initiator if he is joined to the channel and not an IRC
|
||||||
|
operator enforcing modes (which requires the configuration option
|
||||||
|
"OperCanUseMode" to be enabled), because trying to check channel user
|
||||||
|
modes of a non-member results in an assertion when running with debug
|
||||||
|
code or could crash the daemon otherwise. This closes bug #147, thanks
|
||||||
|
to James Kirwill <james.kirwill@bk.ru> for tracking this down!
|
||||||
|
- Fix build system to cope with spaces in path names.
|
||||||
|
- Code cleanups, mostly to fix build warnings on Cygwin.
|
||||||
|
|
||||||
|
ngIRCd 20 (2012-12-17)
|
||||||
|
|
||||||
|
- Allow user names ("INDENT") up to 20 characters when ngIRCd has not
|
||||||
|
been configured for "strict RFC mode". This is useful if you are using
|
||||||
|
external (PAM) authenticaion mechanisms that require longer user names.
|
||||||
|
Patch suggested by Brett Smith <brett@w3.org>, see
|
||||||
|
<http://arthur.barton.de/pipermail/ngircd-ml/2012-October/000579.html>.
|
||||||
|
|
||||||
|
ngIRCd 20~rc2 (2012-12-02)
|
||||||
|
- Rework cloaked hostname handling and implement the "METADATA cloakhost"
|
||||||
|
subcommand: Now ngIRCd uses two fields internally, one to store the
|
||||||
|
"real" hostname and one to save the "cloaked" hostname. This allows
|
||||||
|
"foreign servers" (aka "IRC services") to alter the real and cloaked
|
||||||
|
hostnames of clients without problems, even when the user itself issues
|
||||||
|
additional "MODE +x" and "MODE -x" commands.
|
||||||
|
- RPL_UMODEIS: send correct target name, even on server links.
|
||||||
|
- Update platformtest.sh to follow autoconf changes and only generate
|
||||||
|
the "configure" script when it is missing.
|
||||||
|
- Fix the test suite to correctly execute test scripts even when stdout
|
||||||
|
is redirected.
|
||||||
|
- Fix some compiler warnings on NetBSD and OpenBSD.
|
||||||
|
|
||||||
|
ngIRCd 20~rc1 (2012-11-11)
|
||||||
|
- Update doc/Services.txt: describe the upcoming version of Anope 1.9.8,
|
||||||
|
then including a protocol module for ngIRCd. And remove our own patches
|
||||||
|
in ./contrib/Anope because they aren't supported any more ...
|
||||||
|
- Implement new "METADATA" command which can be used by remote servers
|
||||||
|
and IRC services to update client metadata like the client info text
|
||||||
|
("real name"), user name, and hostname, and use this command to
|
||||||
|
configure an cloaked hostname (user mode "+x") on remote servers:
|
||||||
|
This prevents "double cloaking" of hostnames and even cloaked
|
||||||
|
hostnames are in sync on all servers supporting "METADATA" now.
|
||||||
|
- Fix error message when trying to join non-predefined channels and the
|
||||||
|
"PredefChannelsOnly" configuration option is set.
|
||||||
|
- Implement new IRC "SVSNICK" command to allow remote servers (and IRC
|
||||||
|
services) to change nicknames of already registered users. The SVSNICK
|
||||||
|
command itself doesn't change the nickname, but it becomes forwarded
|
||||||
|
to the server to which the user is connected to. And then this server
|
||||||
|
initiates the real nickname changing using regular NICK commands.
|
||||||
|
This allows to run mixed networks with old servers not supporting the
|
||||||
|
SVSNICK command, because SVSNICK commands for nicknames on such servers
|
||||||
|
are silently ignored and don't cause a desynchronization of the network.
|
||||||
|
- Make server reconnect time a little bit more random, so that two
|
||||||
|
servers trying to connect to each other asynchronously don't try this
|
||||||
|
in exactly the same time periods and kick each other off ...
|
||||||
|
- Don't accept connections for servers already being linked: there was a
|
||||||
|
time frame that could result in one connection overwriting the other,
|
||||||
|
e. g. the incoming connection overwriting the status of the outgoing
|
||||||
|
one. And this could lead to all kind of weirdness (even crashes!) later
|
||||||
|
on: now such incoming connections are dropped.
|
||||||
|
- New configuration option "MaxListSize" to configure the maximum number
|
||||||
|
of channels returned by a LIST command. The default is 100, as before.
|
||||||
|
- Implement user mode "b", "block messages": when a user has set mode "b",
|
||||||
|
all private messages and notices to this user are blocked if they don't
|
||||||
|
originate from a registered user, an IRC Op, server or service. The
|
||||||
|
originator gets an error numeric sent back in this case,
|
||||||
|
ERR_NONONREG_MSG (486), which is used by UnrealIRCd, too. (Closes #144)
|
||||||
|
- WHOIS: Not only show RPL_WHOISHOST_MSG to local IRC operators, but show
|
||||||
|
it to all IRC operators in the network. And don't show it to anybody if
|
||||||
|
the "more privacy" configuration option is enabled. (Closes #134)
|
||||||
|
- Test suite: make expect scripts more verbose displaying dots for each
|
||||||
|
reply of the server that it is waiting for.
|
||||||
|
- WHOIS: Implement numeric RPL_WHOISMODES_MSG (379) and show user modes in
|
||||||
|
the reply of the WHOIS command for the user himself or, if MorePrivacy
|
||||||
|
isn't set, for request initiated by an IRC operator. (Closes #129)
|
||||||
|
- Implement channel mode "V" (invite disallow): If the new channel mode
|
||||||
|
"V" is set, the INVITE command becomes invalid and all clients get the
|
||||||
|
new ERR_NOINVITE_MSG (518) reply. (Closes #143)
|
||||||
|
- KICK-protect IRC services.
|
||||||
|
- Implement channel mode "Q" and user mode "q": Both modes protect users
|
||||||
|
from channel kicks: only IRC operators and servers can kick users having
|
||||||
|
mode "q" or in channels with mode "Q". (Closes #141)
|
||||||
|
- Debian: require "telnet" or "telnet-ssl" for building and enable
|
||||||
|
CHARCONV in ngircd-full[-dbg] variants.
|
||||||
|
- Send RPL_REHASHING (382) numeric if a REHASH command was accepted.
|
||||||
|
- Fix spelling and variable names in some log messages.
|
||||||
|
- Allow users to "cloak" their hostname only when the configuration
|
||||||
|
variable "CloakHostModeX" (introduced in 19.2) is set. Otherwise, only
|
||||||
|
IRC operators, other servers, and services are allowed to set the user
|
||||||
|
mode "+x": this prevents regular users from changing their hostmask to
|
||||||
|
the name of the IRC server itself, which confused quite a few people ;-)
|
||||||
|
(Closes #133)
|
||||||
|
- New configuration option "OperChanPAutoOp": If disabled, IRC operators
|
||||||
|
don't become channel operators in persistent channels when joining.
|
||||||
|
Enabled by default, which has been the behavior of ngIRCd up to this
|
||||||
|
patch. (Closes #135)
|
||||||
|
- Allow IRC operators to see secret (+s) channels in LIST command as long
|
||||||
|
as the "MorePrivacy" configuration option isn't enabled in the
|
||||||
|
configuration file. (Closes #136)
|
||||||
|
- Enhance build system: Support new (>=1.12) and old (<=1.11) GNU automake
|
||||||
|
versions, update checks for required and optional features, enable
|
||||||
|
colored test output of automake (if available), rename configure.in to
|
||||||
|
more modern configure.ac, include .mailmap and all build-system files in
|
||||||
|
distribution archives and no longer require a GIT tree to detect the
|
||||||
|
correct version string.
|
||||||
|
- Update documentation: add doc/Contributing.txt and include version
|
||||||
|
numbers in doc/Modes.txt.
|
||||||
|
- Free all listen ports on initialization: now listen ports can be
|
||||||
|
reconfigured on runtime using a configuration reload.
|
||||||
|
- Initialize SSL when needed only, and disable SSL on errors.
|
||||||
|
- Implement new (optional) IRC+ "CHARCONV" command to set a client
|
||||||
|
character set that the server translates all messages to/from UTF-8.
|
||||||
|
This feature requires the "libiconv" library and must be enabled using
|
||||||
|
the new "--with-iconv" option of the ./configure script. See
|
||||||
|
doc/Protocol.txt for details. (Closes #109)
|
||||||
|
- Allow limited punctuation in usernames, for better PAM integration.
|
||||||
|
- Correctly re-initialize signal handlers on RESTART commands.
|
||||||
|
- Show a warning on startup if the configuration file is not a full path:
|
||||||
|
ngIRCd is a long-running process and changes its working directory to
|
||||||
|
"/" to not block mounted filesystems and the like when running as daemon
|
||||||
|
("not in the foreground"); therefore the path to the configuration file
|
||||||
|
must be relative to "/" (or the chroot() directory), which basically is
|
||||||
|
"not relative", to ensure that "kill -HUP" and the "REHASH" command work
|
||||||
|
as expected later on. (Closes #127)
|
||||||
|
- Make the "&SERVER" channel definable in a [Channel] configuration block,
|
||||||
|
which enables server operators to overwrite the built-in topic and
|
||||||
|
channel modes. (Closes #131)
|
||||||
|
- Don't limit list size of "WHO #channel" commands, because it makes no
|
||||||
|
sense to not return all the users in that channel, so I removed the
|
||||||
|
check. But if there are more than MAX_RPL_WHO(25) replies, the client
|
||||||
|
requesting the list will be "penalized" one second more, then 2 in
|
||||||
|
total. (Closes #125)
|
||||||
|
- Make ngIRCd buildable using the kqueue() IO interface on FreeBSD 4.x.
|
||||||
|
- Fix the "NoticeAuth" configuration option when using SSL connections and
|
||||||
|
enhance the message to show the hostname and IDENT reply of the client.
|
||||||
|
- Introduce numeric RPL_HOSTHIDDEN_MSG (396): This numeric is sent to the
|
||||||
|
client each time it changes its displayed hostname using "MODE +/-x",
|
||||||
|
and if "CloakHost" is set right after the MOTD has been sent.
|
||||||
|
- Fix USERHOST not displaying the correctly cloaked hostname.
|
||||||
|
- Implement user mode "B" ("Bot flag"): it is settable and unsettable by
|
||||||
|
every (non-restricted) client. This is how Unreal and InspIRCd do
|
||||||
|
behave, and so do we :-)
|
||||||
|
- Dynamically allocate memory for connection passwords: This a) saves
|
||||||
|
memory for clients not using passwords at all and b) allows for
|
||||||
|
"arbitrarily" long passwords.
|
||||||
|
- Implement channel mode "M": Only the server, identified users and IRC
|
||||||
|
operators are able to talk in such a channel.
|
||||||
|
- Block nicknames that are reserved for services and are defined using the
|
||||||
|
configuration variable "ServiceMask" in "Server" blocks; And this
|
||||||
|
variable now can handle more than one mask separated by commas.
|
||||||
|
- Now "make uninstall" removes the installed "ngircd.conf" file, if it is
|
||||||
|
still equal to our "sample-ngircd.conf" file and therefore hasn't been
|
||||||
|
modified by the user. If it has been modified, it isn't removed and a
|
||||||
|
notice is displayed to the user. And "make install" now displays a
|
||||||
|
message when no ngircd.conf file exists and the "sample-ngircd.conf"
|
||||||
|
file will be installed as a starting point.
|
||||||
|
- Add contrib/ngircd.service, a systemd service file for ngircd.
|
||||||
|
- Implemented XOP channel user modes: "Half Op" ("+h", prefix "%") can set
|
||||||
|
the channel modes +imntvIbek and kick all +v and normal users; "Admin"
|
||||||
|
("+a", prefix "&") can set channel modes +imntvIbekoRsz and kick all +o,
|
||||||
|
+h, +v and normal users; and "Owner" ("+q", prefix "~") can set channel
|
||||||
|
modes +imntvIbekoRsz and kick all +a, +o, +h, +v and normal users.
|
||||||
|
- Implement hashed cloaked hostnames for both the "CloakHost" and
|
||||||
|
"CloakHostModeX" configuration options: now the admin can use the new
|
||||||
|
'%x' placeholder to insert a hashed version of the clients hostname,
|
||||||
|
and the new configuration option "CloakHostSalt" defines the salt for
|
||||||
|
the hash function. When "CloakHostSalt" is not set (the default), a
|
||||||
|
random salt will be generated after each server restart. (Closes #133)
|
||||||
|
|
||||||
|
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
|
||||||
|
on the number of users connected in the network and higher while
|
||||||
|
servers are joining the network to make the login of servers faster.
|
||||||
|
- 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 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
|
||||||
|
operator to define exception masks that allow users to join the
|
||||||
|
channel even when a "ban" would match and prevent them from joining:
|
||||||
|
the exception list (e) overrides the ban list (b).
|
||||||
|
- PRIVMSG and NOTICE: Handle nick!user@host masks case-insensitive.
|
||||||
|
- Implement user mode 'C': If the target user of a PRIVMSG or NOTICE
|
||||||
|
command has the user mode 'C' set, it is required that both sender
|
||||||
|
and receiver are on the same channel. This prevents private flooding
|
||||||
|
by completely unknown clients.
|
||||||
|
- New RPL_WHOISREGNICK_MSG(307) numeric in WHOIS command replies: it
|
||||||
|
indicates if a nickname is registered (if user mode 'R' set).
|
||||||
|
- Limit channel invite, ban, and exception lists to 50 entries and fix
|
||||||
|
duplicate check and error messages when adding already listed entries
|
||||||
|
or deleting no (longer) existing ones.
|
||||||
|
- Fix both ERR_SUMMONDISABLED(445) and ERR_USERSDISABLED(446) replies.
|
||||||
|
- MODE command: correctly return ERR_UNKNOWNMODE(472) numeric for
|
||||||
|
unknown channel modes, instead of ERR_UMODEUNKNOWNFLAG(501).
|
||||||
|
- ISUPPORT(005) numeric: add "O", "R", and "z" modes to "CHANMODES",
|
||||||
|
add "EXCEPTS=e" and "INVEX=I", add "MAXLIST=beI:50".
|
||||||
|
- Limit the number of list items in the reply of LIST (100), WHO (25),
|
||||||
|
WHOIS (10), and WHOWAS (25) commands.
|
||||||
|
- LIST command: compare pattern case insensitive.
|
||||||
|
- Limit the MODE command to handle a maximum number of 5 channel modes
|
||||||
|
that require an argument (+Ibkl) per call and report this number
|
||||||
|
in the ISUPPORT(005) numeric: "MODES=5".
|
||||||
|
- Fix handling of channel mode sequence with/without arguments.
|
||||||
|
For example, don't generate wrong error messages when handling
|
||||||
|
"MODE #chan +IIIIItn *!aa@b *!bb@c *!cc@d *!dd@e *!ee@f".
|
||||||
|
- When sending data on a connection, only try to get the type of
|
||||||
|
the client if there still is one assigned. This could trigger an
|
||||||
|
assertion and end the daemon in some error paths.
|
||||||
|
- Don't try to close already closed/invalid sockets to forked child
|
||||||
|
processes. This could potentially crash the daemon in some cases
|
||||||
|
with IDENT lookups enabled.
|
||||||
|
- WHOIS command: make sure that the reply ends with RPL_ENDOFWHOIS,
|
||||||
|
don't answer queries for IRC servers, make sure mask matching is
|
||||||
|
case-insensitive, and that RPL_ENDOFWHOIS numeric is sent with the
|
||||||
|
unmodified mask (like it has been received from the client).
|
||||||
|
- LINKS command: support <mask> parameter to limit the reply.
|
||||||
|
- Add 1 second penalty for every further target on PRIVMSG/NOTICE
|
||||||
|
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}" 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
|
||||||
|
channel cannot be joined (because of bad name, wrong key or channel
|
||||||
|
limit reached), but report an error and continue. And don't check
|
||||||
|
the channel limit and don't report with "too many channels" when
|
||||||
|
trying to join a channel that the client already is a member of.
|
||||||
|
- ISON command: reply with the correct upper-/lowercase nicknames.
|
||||||
|
- New configuration option "PAMIsOptional": when set, clients not
|
||||||
|
sending a password are still allowed to connect: they won't become
|
||||||
|
"identified" and keep the "~" character prepended to their supplied
|
||||||
|
user name. See "man 5 ngircd.conf" for details.
|
||||||
|
- Fixed handling of WHO commands. This fixes two bugs: "WHO <nick>"
|
||||||
|
returned nothing at all if the user was "+i" (reported by Cahata,
|
||||||
|
thanks) and "WHO <nick|nickmask>" returned channel names instead
|
||||||
|
of "*" when the user was member of a (visible) channel.
|
||||||
|
- Fixed some spelling errors in documentation and code comments
|
||||||
|
(Thanks to Christoph Biedl).
|
||||||
|
- contrib/Debian/control: Update and complete "Build-Depends" and
|
||||||
|
update our Debian package descriptions with "official" ones.
|
||||||
|
- Fixed typo in two error messages.
|
||||||
|
- LUSERS reply: only count channels that are visible to the requesting
|
||||||
|
client, so the existence of secret channels is no longer revealed by
|
||||||
|
using LUSERS. Reported by Cahata, thanks!
|
||||||
|
- Unknown user and channel modes no longer stop the mode parser, but
|
||||||
|
are simply ignored. Therefore modes after the unknown one are now
|
||||||
|
handled. This is how ircd2.10/ircd2.11/ircd-seven behave, at least.
|
||||||
|
Reported by Cahata, thanks!
|
||||||
|
- README: Update list of implemented commands.
|
||||||
|
- Log better error messages when rejecting clients.
|
||||||
|
- Implement IRC commands "GLINE" and "KLINE" to ban users. G-Lines are
|
||||||
|
synchronized between server on peering, K-Lines are local only.
|
||||||
|
If you use "*!<user>@<host>" or "*!*@<host>" masks, these connections
|
||||||
|
are blocked even before the user is fully logged in (before PASS,
|
||||||
|
NICK, and USER commands have been processed) and before the child
|
||||||
|
processes for authentication are forked, so resource usage is smaller.
|
||||||
|
- Xcode: update project file for Xcode 4.2 and define HAVE_GAI_STRERROR
|
||||||
|
for Mac OS X Xcode builds.
|
||||||
|
- ./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 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.
|
||||||
|
(Closes #119)
|
||||||
|
- Update GPL 2 license text to current version.
|
||||||
|
- Only close "unrelated" sockets in forked child processes: This fixes
|
||||||
|
the problem that ngIRCd can't do any IDENT lookups because of the
|
||||||
|
socket has already been closed in the child process.
|
||||||
|
The bug has been introduced starting with ngIRCd 17 ... :-(
|
||||||
|
(commit ID 6ebb31ab35e)
|
||||||
|
- Added doc/Modes.txt: document modes supported by ngIRCd.
|
||||||
|
- Implement user mode "R": indicates that the nickname of this user
|
||||||
|
is "registered". This mode isn't handled by ngIRCd itself, but must
|
||||||
|
be set and unset by IRC services like Anope.
|
||||||
|
- Implement channel mode "R": only registered users (having the user
|
||||||
|
mode "R" set) are allowed to join this channel.
|
||||||
|
- Test suite: bind to loopback (127.0.0.1) interface only.
|
||||||
|
- New 2nd message "Nickname too long" for error code 432.
|
||||||
|
- Xcode: Mac OS X config.h: support 10.5 as well as 10.6/10.7 SDK.
|
||||||
|
- Xcode: exclude more Xcode 4 specific directories in ".gitignore".
|
||||||
|
- Disconnect directly linked servers sending QUIT. Without this,
|
||||||
|
the server becomes removed from the network and the client list,
|
||||||
|
but the connection isn't shut down at all ...
|
||||||
|
- contrib/ngindent: detect "gindent" as GNU indent.
|
||||||
|
- Handle unknown user and channel modes: these modes are saved and
|
||||||
|
forwarded to other servers, but ignored otherwise.
|
||||||
|
- Handle channel user modes 'a', 'h', and 'q' from remote servers.
|
||||||
|
These channel user modes aren't used for anything at the moment,
|
||||||
|
but ngIRCd knows that these three modes are "channel user modes"
|
||||||
|
and not "channel modes", that is that these modes take an "nickname"
|
||||||
|
argument. Like unknown user and channel modes, these modes are saved
|
||||||
|
and forwarded to other servers, but ignored otherwise.
|
||||||
|
- Correctly inform clients when other servers change their user modes.
|
||||||
|
This is required for some services to work correctly.
|
||||||
|
- Test suite: make getpid.sh work even when run as root.
|
||||||
|
- Spoofed prefixes: close connection on non-server links only.
|
||||||
|
On server-links, spoofed prefixes can happen because of the
|
||||||
|
asynchronous nature of the IRC protocol. So don't break server-
|
||||||
|
links, only log a message and ignore the command. (Closes #113)
|
||||||
|
|
||||||
|
ngIRCd Release 18 (2011-07-10)
|
||||||
|
|
||||||
|
- Update timestamp of ngircd(8) manual page.
|
||||||
|
- Add preliminary ngIRCd protocol module for Anope 1.9 to contrib/Anope/.
|
||||||
|
- Don't register WHOWAS information when "MorePrivacy" option is in effect.
|
||||||
|
|
||||||
ngIRCd 18~rc2 (2011-06-29)
|
ngIRCd 18~rc2 (2011-06-29)
|
||||||
- Update documentation, fix some wording, and use a spellchecker :-)
|
- Update documentation, fix some wording, and use a spellchecker :-)
|
||||||
@@ -78,10 +482,10 @@ ngIRCd Release 18
|
|||||||
variable description.
|
variable description.
|
||||||
- Don't use "the.net" in sample-ngircd.conf, use "example.net".
|
- Don't use "the.net" in sample-ngircd.conf, use "example.net".
|
||||||
- Terminate incoming connections on HTTP commands "GET" and "POST".
|
- Terminate incoming connections on HTTP commands "GET" and "POST".
|
||||||
- New configuration option "CloakHost": when set, this hostname is used for
|
- New configuration option "CloakHost": when set, this host name is used for
|
||||||
every client instead of the real DNS hostname (or IP address).
|
every client instead of the real DNS host name (or IP address).
|
||||||
- New configuration option "CloakUserToNick": when enabled, ngIRCd sets
|
- New configuration option "CloakUserToNick": when enabled, ngIRCd sets
|
||||||
every clients' user name to their nick name and hides the user name
|
every clients' user name to their nickname and hides the user name
|
||||||
supplied by the IRC client.
|
supplied by the IRC client.
|
||||||
- doc/Protocol.txt: Update description of the CHANINFO and WEBIRC commands.
|
- doc/Protocol.txt: Update description of the CHANINFO and WEBIRC commands.
|
||||||
- Doxygen'ify (document) much more source files; code cleanup ...
|
- Doxygen'ify (document) much more source files; code cleanup ...
|
||||||
@@ -184,7 +588,7 @@ ngIRCd Release 17 (2010-11-07)
|
|||||||
- configure script: correctly indent IPv6 yes/no summary output.
|
- configure script: correctly indent IPv6 yes/no summary output.
|
||||||
- Don't reset My_Connections[Idx].lastping when reading data, so the
|
- Don't reset My_Connections[Idx].lastping when reading data, so the
|
||||||
client lag debug-output is working again.
|
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).
|
- Make configure switch "--docdir" work (closes: #108).
|
||||||
- Reformat and update FAQ.txt a little bit.
|
- Reformat and update FAQ.txt a little bit.
|
||||||
- INSTALL: mention SSL, IPv6, and changed handling of MotdFile.
|
- INSTALL: mention SSL, IPv6, and changed handling of MotdFile.
|
||||||
@@ -289,7 +693,7 @@ ngIRCd Release 14.1 (2009-05-05)
|
|||||||
- Allow ping timeout quit messages to show the timeout value.
|
- Allow ping timeout quit messages to show the timeout value.
|
||||||
- Fix error handling on compressed links.
|
- Fix error handling on compressed links.
|
||||||
- Fix server list announcement.
|
- 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)
|
ngIRCd Release 14 (2009-04-20)
|
||||||
|
|
||||||
@@ -385,7 +789,7 @@ ngIRCd 0.12.0 (2008-05-13)
|
|||||||
- RPL_WHOREPLY messages generated by IRC_WHO didn't include flags (*,@,+).
|
- RPL_WHOREPLY messages generated by IRC_WHO didn't include flags (*,@,+).
|
||||||
(Dana Dahlstrom)
|
(Dana Dahlstrom)
|
||||||
- IRC_WHO now supports search patterns and will test this against user
|
- 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)
|
(reported by Dana Dahlstrom)
|
||||||
- Add test cases for "WHO" command. (Dana Dahlstrom)
|
- Add test cases for "WHO" command. (Dana Dahlstrom)
|
||||||
- Implement RFC 2812 handling of "0" argument to 'JOIN': must be treated
|
- Implement RFC 2812 handling of "0" argument to 'JOIN': must be treated
|
||||||
@@ -408,12 +812,12 @@ ngIRCd 0.11.0 (2008-01-15)
|
|||||||
ngircd to crash [from HEAD]. (CVE-2008-0285)
|
ngircd to crash [from HEAD]. (CVE-2008-0285)
|
||||||
|
|
||||||
ngIRCd 0.11.0-pre1 (2008-01-02)
|
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.
|
- Add support for /STAT u (server uptime) command.
|
||||||
- New [Server] configuration Option "Bind" allows to specify
|
- New [Server] configuration Option "Bind" allows to specify
|
||||||
the source IP address to use when connecting to remote server.
|
the source IP address to use when connecting to remote server.
|
||||||
- New configuration option "MaxNickLength" to specify the allowed maximum
|
- New configuration option "MaxNickLength" to specify the allowed maximum
|
||||||
length of user nick names. Note: must be unique in an IRC network!
|
length of user nicknames. Note: must be unique in an IRC network!
|
||||||
- Enhanced the IRC+ protocol to support an enhanced "server handshake" and
|
- Enhanced the IRC+ protocol to support an enhanced "server handshake" and
|
||||||
enable server to recognize numeric 005 (ISUPPORT) and 376 (ENDOFMOTD).
|
enable server to recognize numeric 005 (ISUPPORT) and 376 (ENDOFMOTD).
|
||||||
See doc/Protocol.txt for details.
|
See doc/Protocol.txt for details.
|
||||||
@@ -634,7 +1038,7 @@ ngIRCd 0.8.0 (2004-06-26)
|
|||||||
original ircd exactly: the unnecessary but missing ":" before the last
|
original ircd exactly: the unnecessary but missing ":" before the last
|
||||||
parameter has been added.
|
parameter has been added.
|
||||||
- Fixed TRACE: don't output "Serv" lines for ourself; display more info.
|
- 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.
|
the client is successfully registered with the server.
|
||||||
- Better logging while establishing and shutting down connections.
|
- Better logging while establishing and shutting down connections.
|
||||||
- The type of service (TOS) of all sockets is set to "interactive" now.
|
- The type of service (TOS) of all sockets is set to "interactive" now.
|
||||||
@@ -793,7 +1197,7 @@ ngIRCd 0.6.0, 2002-12-24
|
|||||||
werden (beide Server versuchen sich dann gegenseitig zu connectieren).
|
werden (beide Server versuchen sich dann gegenseitig zu connectieren).
|
||||||
- Test-Suite und Dokumentation an A/UX angepasst.
|
- Test-Suite und Dokumentation an A/UX angepasst.
|
||||||
- unter HP-UX definiert das configure-Script nun _XOPEN_SOURCE_EXTENDED.
|
- unter HP-UX definiert das configure-Script nun _XOPEN_SOURCE_EXTENDED.
|
||||||
- Server identifizieren sich nun mit asyncronen Passwoertern, d.h. das
|
- Server identifizieren sich nun mit asynchronen Passwoertern, d.h. das
|
||||||
Passwort, welches A an B schickt, kann ein anderes sein als das, welches
|
Passwort, welches A an B schickt, kann ein anderes sein als das, welches
|
||||||
B als Antwort an A sendet. In der Konfig.-Datei, Abschnitt "Server",
|
B als Antwort an A sendet. In der Konfig.-Datei, Abschnitt "Server",
|
||||||
wurde "Password" dazu durch "MyPassword" und "PeerPassword" ersetzt.
|
wurde "Password" dazu durch "MyPassword" und "PeerPassword" ersetzt.
|
||||||
@@ -923,7 +1327,7 @@ ngIRCd 0.5.0, 20.09.2002
|
|||||||
- Protokoll- und Server-ID bei PASS-Befehlen auf neues Format umgestellt;
|
- Protokoll- und Server-ID bei PASS-Befehlen auf neues Format umgestellt;
|
||||||
bei empfangenen PASS-Befehlen werden diese zudem nun auch ausgewertet.
|
bei empfangenen PASS-Befehlen werden diese zudem nun auch ausgewertet.
|
||||||
Die unterstuetzten Flags sind in doc/Protocol.txt beschrieben.
|
Die unterstuetzten Flags sind in doc/Protocol.txt beschrieben.
|
||||||
- mit dem neuen Befehl CHANINFO syncronisieren Server, die das IRC+-
|
- mit dem neuen Befehl CHANINFO synchronisieren Server, die das IRC+-
|
||||||
Protokoll unterstuetzen, Channel-Modes und Topics.
|
Protokoll unterstuetzen, Channel-Modes und Topics.
|
||||||
- neue Option "--disable-ircplus" fuer das configure-Script, um das
|
- neue Option "--disable-ircplus" fuer das configure-Script, um das
|
||||||
IRC+-Protokoll abzuschalten (per Default ist es aktiviert).
|
IRC+-Protokoll abzuschalten (per Default ist es aktiviert).
|
||||||
@@ -1028,7 +1432,7 @@ ngIRCd 0.3.0, 02.03.2002
|
|||||||
- PRIVMSG beachtet nun die Channel-Modes "n" und "m".
|
- PRIVMSG beachtet nun die Channel-Modes "n" und "m".
|
||||||
- AWAY implementiert. PRIVMSG, MODE, USERHOST und WHOIS angepasst.
|
- AWAY implementiert. PRIVMSG, MODE, USERHOST und WHOIS angepasst.
|
||||||
- der ngIRCd unterstuetzt nun Channel-Topics (TOPIC-Befehl).
|
- der ngIRCd unterstuetzt nun Channel-Topics (TOPIC-Befehl).
|
||||||
- ausgehende Server-Verbindungen werden nun asyncron connectiert und
|
- ausgehende Server-Verbindungen werden nun asynchron connectiert und
|
||||||
blockieren nicht mehr den ganzen Server, wenn die Gegenseite nicht
|
blockieren nicht mehr den ganzen Server, wenn die Gegenseite nicht
|
||||||
erreicht werden kann (bis zum Timeout konnten Minuten vergehen!).
|
erreicht werden kann (bis zum Timeout konnten Minuten vergehen!).
|
||||||
- Wert der Konfigurations-Variable "ConnectRetry" wird besser beachtet.
|
- Wert der Konfigurations-Variable "ConnectRetry" wird besser beachtet.
|
||||||
@@ -1107,7 +1511,7 @@ ngIRCd 0.0.2, 06.01.2002
|
|||||||
- NICK kann nun die Gross- und Kleinschreibung eines Nicks aendern.
|
- NICK kann nun die Gross- und Kleinschreibung eines Nicks aendern.
|
||||||
- ein Server-Passwort ist nun konfigurierbar.
|
- ein Server-Passwort ist nun konfigurierbar.
|
||||||
- neue Befehle: ERROR, SERVER, NJOIN (nur als "Fake"), SQUIT.
|
- neue Befehle: ERROR, SERVER, NJOIN (nur als "Fake"), SQUIT.
|
||||||
- Asyncroner Resolver Hostname->IP implementiert.
|
- Asynchroner Resolver Hostname->IP implementiert.
|
||||||
- Server-Links teilweise implementiert: bisher kann der ngIRCd jedoch
|
- Server-Links teilweise implementiert: bisher kann der ngIRCd jedoch
|
||||||
nur "leafed server" sein, d.h. keine "Client-Server" haben. Einige
|
nur "leafed server" sein, d.h. keine "Client-Server" haben. Einige
|
||||||
Befehle sind auch noch nicht (optimal) angepasst: PRIVMSG funktioniert
|
Befehle sind auch noch nicht (optimal) angepasst: PRIVMSG funktioniert
|
||||||
|
|||||||
47
INSTALL
47
INSTALL
@@ -2,7 +2,7 @@
|
|||||||
ngIRCd - Next Generation IRC Server
|
ngIRCd - Next Generation IRC Server
|
||||||
http://ngircd.barton.de/
|
http://ngircd.barton.de/
|
||||||
|
|
||||||
(c)2001-2011 Alexander Barton and Contributors.
|
(c)2001-2013 Alexander Barton and Contributors.
|
||||||
ngIRCd is free software and published under the
|
ngIRCd is free software and published under the
|
||||||
terms of the GNU General Public License.
|
terms of the GNU General Public License.
|
||||||
|
|
||||||
@@ -12,6 +12,14 @@
|
|||||||
I. Upgrade Information
|
I. Upgrade Information
|
||||||
~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Differences to version 19.x
|
||||||
|
|
||||||
|
- Starting with ngIRCd 20, users can "cloak" their hostname only when the
|
||||||
|
configuration variable "CloakHostModeX" (introduced in 19.2) is set.
|
||||||
|
Otherwise, only IRC opertators, other servers, and services are allowed to
|
||||||
|
set mode +x. This prevents regular users from changing their hostmask to
|
||||||
|
the name of the IRC server itself, which confused quite a few people ;-)
|
||||||
|
|
||||||
Differences to version 17
|
Differences to version 17
|
||||||
|
|
||||||
- Support for ZeroConf/Bonjour/Rendezvous service registration has been
|
- Support for ZeroConf/Bonjour/Rendezvous service registration has been
|
||||||
@@ -93,7 +101,8 @@ automake ("configure") should be no problem.
|
|||||||
The normal installation procedure after getting (and expanding) the source
|
The normal installation procedure after getting (and expanding) the source
|
||||||
files (using a distribution archive or GIT) is as following:
|
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
|
2) ./configure
|
||||||
3) make
|
3) make
|
||||||
4) make install
|
4) make install
|
||||||
@@ -114,6 +123,30 @@ possible options will be installed there. You'll find its template in the
|
|||||||
doc/ directory: sample-ngircd.conf.
|
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"
|
1): "autogen.sh"
|
||||||
|
|
||||||
The first step, autogen.sh, is only necessary if the configure-script isn't
|
The first step, autogen.sh, is only necessary if the configure-script isn't
|
||||||
@@ -124,10 +157,14 @@ This step is therefore only interesting for developers.
|
|||||||
|
|
||||||
autogen.sh produces the Makefile.in's, which are necessary for the configure
|
autogen.sh produces the Makefile.in's, which are necessary for the configure
|
||||||
script itself, and some more files for make. To run autogen.sh you'll need
|
script itself, and some more files for make. To run autogen.sh you'll need
|
||||||
GNU autoconf and GNU automake (use recent versions! autoconf 2.53 and
|
GNU autoconf and GNU automake: at least autoconf 2.61 and automake 1.10 are
|
||||||
automake 1.6.1 are known to work).
|
requird, newer is better. But don't use automake 1.12 or newer for creating
|
||||||
|
distribution archives: it will work but lack "de-ANSI-fucation" support in the
|
||||||
|
generated Makefile's! Stick with automake 1.11.x for this purpose ...
|
||||||
|
So automake 1.11.x and autoconf 2.67+ is recommended.
|
||||||
|
|
||||||
Again: "end users" do not need this step!
|
Again: "end users" do not need this step and neither need GNU autoconf nor GNU
|
||||||
|
automake at all!
|
||||||
|
|
||||||
|
|
||||||
2): "./configure"
|
2): "./configure"
|
||||||
|
|||||||
14
Makefile.am
14
Makefile.am
@@ -1,6 +1,6 @@
|
|||||||
#
|
#
|
||||||
# ngIRCd -- The Next Generation IRC Daemon
|
# 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
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
@@ -13,24 +13,26 @@ AUTOMAKE_OPTIONS = gnu
|
|||||||
|
|
||||||
SUBDIRS = doc src man contrib
|
SUBDIRS = doc src man contrib
|
||||||
|
|
||||||
|
EXTRA_DIST = autogen.sh configure.ng .mailmap
|
||||||
|
|
||||||
clean-local:
|
clean-local:
|
||||||
rm -f build-stamp*
|
rm -f build-stamp*
|
||||||
rm -rf ngircd.dest
|
rm -rf ngircd.dest
|
||||||
|
|
||||||
maintainer-clean-local:
|
maintainer-clean-local:
|
||||||
rm -rf autom4te.cache
|
rm -rf autom4te.cache
|
||||||
rm -f Makefile.in Makefile aclocal.m4 configure
|
rm -f Makefile.in Makefile aclocal.m4 configure configure.ac
|
||||||
rm -f mkinstalldirs missing depcomp install-sh
|
rm -f ar-lib mkinstalldirs missing depcomp install-sh
|
||||||
rm -f config.log debian
|
rm -f config.log debian
|
||||||
|
|
||||||
testsuite:
|
testsuite:
|
||||||
make -C src/testsuite check
|
cd src/testsuite && make check
|
||||||
|
|
||||||
lint:
|
lint:
|
||||||
make -C src/ngircd lint
|
cd src/ngircd && make lint
|
||||||
|
|
||||||
srcdoc:
|
srcdoc:
|
||||||
make -C doc srcdoc
|
cd doc && make srcdoc
|
||||||
|
|
||||||
have-xcodebuild:
|
have-xcodebuild:
|
||||||
@xcodebuild -project contrib/MacOSX/ngIRCd.xcodeproj -list \
|
@xcodebuild -project contrib/MacOSX/ngIRCd.xcodeproj -list \
|
||||||
|
|||||||
216
NEWS
216
NEWS
@@ -2,13 +2,205 @@
|
|||||||
ngIRCd - Next Generation IRC Server
|
ngIRCd - Next Generation IRC Server
|
||||||
http://ngircd.barton.de/
|
http://ngircd.barton.de/
|
||||||
|
|
||||||
(c)2001-2011 Alexander Barton and Contributors.
|
(c)2001-2013 Alexander Barton and Contributors.
|
||||||
ngIRCd is free software and published under the
|
ngIRCd is free software and published under the
|
||||||
terms of the GNU General Public License.
|
terms of the GNU General Public License.
|
||||||
|
|
||||||
-- NEWS --
|
-- NEWS --
|
||||||
|
|
||||||
ngIRCd Release 18
|
|
||||||
|
ngIRCd 20.3 (2013-08-23)
|
||||||
|
|
||||||
|
- This release is a bugfix release only, without new features.
|
||||||
|
- Security: Fix a denial of service bug (server crash) which could happen
|
||||||
|
when the configuration option "NoticeAuth" is enabled (which is NOT the
|
||||||
|
default) and ngIRCd failed to send the "notice auth" messages to new
|
||||||
|
clients connecting to the server (CVE-2013-5580).
|
||||||
|
|
||||||
|
ngIRCd 20.2 (2013-02-15)
|
||||||
|
|
||||||
|
- This release is a bugfix release only, without new features.
|
||||||
|
- Security: Fix a denial of service bug in the function handling KICK
|
||||||
|
commands that could be used by arbitrary users to to crash the daemon
|
||||||
|
(CVE-2013-1747).
|
||||||
|
|
||||||
|
ngIRCd 20.1 (2013-01-02)
|
||||||
|
|
||||||
|
- This release is a bugfix release only, without new features.
|
||||||
|
|
||||||
|
ngIRCd 20 (2012-12-17)
|
||||||
|
|
||||||
|
- Allow user names ("INDENT") up to 20 characters when ngIRCd has not
|
||||||
|
been configured for "strict RFC mode". This is useful if you are using
|
||||||
|
external (PAM) authenticaion mechanisms that require longer user names.
|
||||||
|
Patch suggested by Brett Smith <brett@w3.org>, see
|
||||||
|
<http://arthur.barton.de/pipermail/ngircd-ml/2012-October/000579.html>.
|
||||||
|
|
||||||
|
ngIRCd 20~rc2 (2012-12-02)
|
||||||
|
- Rework cloaked hostname handling and implement the "METADATA cloakhost"
|
||||||
|
subcommand: Now ngIRCd uses two fields internally, one to store the
|
||||||
|
"real" hostname and one to save the "cloaked" hostname. This allows
|
||||||
|
"foreign servers" (aka "IRC services") to alter the real and cloaked
|
||||||
|
hostnames of clients without problems, even when the user itself issues
|
||||||
|
additional "MODE +x" and "MODE -x" commands.
|
||||||
|
|
||||||
|
ngIRCd 20~rc1 (2012-11-11)
|
||||||
|
- Update doc/Services.txt: describe the upcoming version of Anope 1.9.8,
|
||||||
|
then including a protocol module for ngIRCd. And remove our own patches
|
||||||
|
in ./contrib/Anope because they aren't supported any more ...
|
||||||
|
- Implement new "METADATA" command which can be used by remote servers
|
||||||
|
and IRC services to update client metadata like the client info text
|
||||||
|
("real name"), user name, and hostname, and use this command to
|
||||||
|
configure an cloaked hostname (user mode "+x") on remote servers:
|
||||||
|
This prevents "double cloaking" of hostnames and even cloaked
|
||||||
|
hostnames are in sync on all servers supporting "METADATA" now.
|
||||||
|
- Implement new IRC "SVSNICK" command to allow remote servers (and IRC
|
||||||
|
services) to change nicknames of already registered users. The SVSNICK
|
||||||
|
command itself doesn't change the nickname, but it becomes forwarded
|
||||||
|
to the server to which the user is connected to. And then this server
|
||||||
|
initiates the real nickname changing using regular NICK commands.
|
||||||
|
This allows to run mixed networks with old servers not supporting the
|
||||||
|
SVSNICK command, because SVSNICK commands for nicknames on such servers
|
||||||
|
are silently ignored and don't cause a desynchronization of the network.
|
||||||
|
- New configuration option "MaxListSize" to configure the maximum number
|
||||||
|
of channels returned by a LIST command. The default is 100, as before.
|
||||||
|
- Implement user mode "b", "block messages": when a user has set mode "b",
|
||||||
|
all private messages and notices to this user are blocked if they don't
|
||||||
|
originate from a registered user, an IRC Op, server or service. The
|
||||||
|
originator gets an error numeric sent back in this case,
|
||||||
|
ERR_NONONREG_MSG (486), which is used by UnrealIRCd, too. (Closes #144)
|
||||||
|
- Implement channel mode "V" (invite disallow): If the new channel mode
|
||||||
|
"V" is set, the INVITE command becomes invalid and all clients get the
|
||||||
|
new ERR_NOINVITE_MSG (518) reply. (Closes #143)
|
||||||
|
- Implement channel mode "Q" and user mode "q": Both modes protect users
|
||||||
|
from channel kicks: only IRC operators and servers can kick users having
|
||||||
|
mode "q" or in channels with mode "Q". (Closes #141)
|
||||||
|
- Allow users to "cloak" their hostname only when the configuration
|
||||||
|
variable "CloakHostModeX" (introduced in 19.2) is set. Otherwise, only
|
||||||
|
IRC operators, other servers, and services are allowed to set the user
|
||||||
|
mode "+x": this prevents regular users from changing their hostmask to
|
||||||
|
the name of the IRC server itself, which confused quite a few people ;-)
|
||||||
|
(Closes #133)
|
||||||
|
- New configuration option "OperChanPAutoOp": If disabled, IRC operators
|
||||||
|
don't become channel operators in persistent channels when joining.
|
||||||
|
Enabled by default, which has been the behavior of ngIRCd up to this
|
||||||
|
patch. (Closes #135)
|
||||||
|
- Allow IRC operators to see secret (+s) channels in LIST command as long
|
||||||
|
as the "MorePrivacy" configuration option isn't enabled in the
|
||||||
|
configuration file. (Closes #136)
|
||||||
|
- Implement new (optional) IRC+ "CHARCONV" command to set a client
|
||||||
|
character set that the server translates all messages to/from UTF-8.
|
||||||
|
This feature requires the "libiconv" library and must be enabled using
|
||||||
|
the new "--with-iconv" option of the ./configure script. See
|
||||||
|
doc/Protocol.txt for details. (Closes #109)
|
||||||
|
- Implement user mode "B" ("Bot flag"): it is settable and unsettable by
|
||||||
|
every (non-restricted) client. This is how Unreal and InspIRCd do
|
||||||
|
behave, and so do we :-)
|
||||||
|
- Implement channel mode "M": Only the server, identified users and IRC
|
||||||
|
operators are able to talk in such a channel.
|
||||||
|
- Block nicknames that are reserved for services and are defined using the
|
||||||
|
configuration variable "ServiceMask" in "Server" blocks; And this
|
||||||
|
variable now can handle more than one mask separated by commas.
|
||||||
|
- Implemented XOP channel user modes: "Half Op" ("+h", prefix "%") can set
|
||||||
|
the channel modes +imntvIbek and kick all +v and normal users; "Admin"
|
||||||
|
("+a", prefix "&") can set channel modes +imntvIbekoRsz and kick all +o,
|
||||||
|
+h, +v and normal users; and "Owner" ("+q", prefix "~") can set channel
|
||||||
|
modes +imntvIbekoRsz and kick all +a, +o, +h, +v and normal users.
|
||||||
|
- Implement hashed cloaked hostnames for both the "CloakHost" and
|
||||||
|
"CloakHostModeX" configuration options: now the admin can use the new
|
||||||
|
'%x' placeholder to insert a hashed version of the clients hostname,
|
||||||
|
and the new configuration option "CloakHostSalt" defines the salt for
|
||||||
|
the hash function. When "CloakHostSalt" is not set (the default), a
|
||||||
|
random salt will be generated after each server restart.
|
||||||
|
|
||||||
|
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 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
|
||||||
|
operator to define exception masks that allow users to join the
|
||||||
|
channel even when a "ban" would match and prevent them from joining:
|
||||||
|
the exception list (e) overrides the ban list (b).
|
||||||
|
- Implement user mode 'C': If the target user of a PRIVMSG or NOTICE
|
||||||
|
command has the user mode 'C' set, it is required that both sender
|
||||||
|
and receiver are on the same channel. This prevents private flooding
|
||||||
|
by completely unknown clients.
|
||||||
|
- New RPL_WHOISREGNICK_MSG(307) numeric in WHOIS command replies: it
|
||||||
|
indicates if a nickname is registered (if user mode 'R' set).
|
||||||
|
- Limit channel invite, ban, and exception lists to 50 entries and fix
|
||||||
|
duplicate check and error messages when adding already listed entries
|
||||||
|
or deleting no (longer) existing ones.
|
||||||
|
- Limit the number of list items in the reply of LIST (100), WHO (25),
|
||||||
|
WHOIS (10), and WHOWAS (25) commands.
|
||||||
|
- Limit the MODE command to handle a maximum number of 5 channel modes
|
||||||
|
that require an argument (+Ibkl) per call and report this number
|
||||||
|
in the ISUPPORT(005) numeric: "MODES=5".
|
||||||
|
- LINKS command: support <mask> parameter to limit the reply.
|
||||||
|
- Add 1 second penalty for every further target on PRIVMSG/NOTICE
|
||||||
|
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!
|
||||||
|
- New configuration option "PAMIsOptional": when set, clients not
|
||||||
|
sending a password are still allowed to connect: they won't become
|
||||||
|
"identified" and keep the "~" character prepended to their supplied
|
||||||
|
user name. See "man 5 ngircd.conf" for details.
|
||||||
|
- Fixed handling of WHO commands. This fixes two bugs: "WHO <nick>"
|
||||||
|
returned nothing at all if the user was "+i" (reported by Cahata,
|
||||||
|
thanks) and "WHO <nick|nickmask>" returned channel names instead
|
||||||
|
of "*" when the user was member of a (visible) channel.
|
||||||
|
- LUSERS reply: only count channels that are visible to the requesting
|
||||||
|
client, so the existence of secret channels is no longer revealed by
|
||||||
|
using LUSERS. Reported by Cahata, thanks!
|
||||||
|
- Unknown user and channel modes no longer stop the mode parser, but
|
||||||
|
are simply ignored. Therefore modes after the unknown one are now
|
||||||
|
handled. This is how ircd2.10/ircd2.11/ircd-seven behave, at least.
|
||||||
|
Reported by Cahata, thanks!
|
||||||
|
- Implement IRC commands "GLINE" and "KLINE" to ban users. G-Lines are
|
||||||
|
synchronized between server on peering, K-Lines are local only.
|
||||||
|
If you use "*!<user>@<host>" or "*!*@<host>" masks, these connections
|
||||||
|
are blocked even before the user is fully logged in (before PASS,
|
||||||
|
NICK, and USER commands have been processed) and before the child
|
||||||
|
processes for authentication are forked, so resource usage is smaller.
|
||||||
|
- Added doc/Modes.txt: document modes supported by ngIRCd.
|
||||||
|
- Implement user mode "R": indicates that the nickname of this user
|
||||||
|
is "registered". This mode isn't handled by ngIRCd itself, but must
|
||||||
|
be set and unset by IRC services like Anope.
|
||||||
|
- Implement channel mode "R": only registered users (having the user
|
||||||
|
mode "R" set) are allowed to join this channel.
|
||||||
|
- Test suite: bind to loopback (127.0.0.1) interface only.
|
||||||
|
- Handle unknown user and channel modes: these modes are saved and
|
||||||
|
forwarded to other servers, but ignored otherwise.
|
||||||
|
- Handle channel user modes 'a', 'h', and 'q' from remote servers.
|
||||||
|
These channel user modes aren't used for anything at the moment,
|
||||||
|
but ngIRCd knows that these three modes are "channel user modes"
|
||||||
|
and not "channel modes", that is that these modes take an "nickname"
|
||||||
|
argument. Like unknown user and channel modes, these modes are saved
|
||||||
|
and forwarded to other servers, but ignored otherwise.
|
||||||
|
|
||||||
|
ngIRCd Release 18 (2011-07-10)
|
||||||
|
|
||||||
|
- Add preliminary ngIRCd protocol module for Anope 1.9 to contrib/Anope/.
|
||||||
|
|
||||||
ngIRCd 18~rc2 (2011-06-29)
|
ngIRCd 18~rc2 (2011-06-29)
|
||||||
- GnuTLS: use 1024 bits as minimum size of the DH prime. This enables
|
- GnuTLS: use 1024 bits as minimum size of the DH prime. This enables
|
||||||
@@ -58,10 +250,10 @@ ngIRCd Release 18
|
|||||||
(booleans, text strings, integer numbers) and add type information to each
|
(booleans, text strings, integer numbers) and add type information to each
|
||||||
variable description.
|
variable description.
|
||||||
- Terminate incoming connections on HTTP commands "GET" and "POST".
|
- Terminate incoming connections on HTTP commands "GET" and "POST".
|
||||||
- New configuration option "CloakHost": when set, this hostname is used for
|
- New configuration option "CloakHost": when set, this host name is used for
|
||||||
every client instead of the real DNS hostname (or IP address).
|
every client instead of the real DNS host name (or IP address).
|
||||||
- New configuration option "CloakUserToNick": when enabled, ngIRCd sets
|
- New configuration option "CloakUserToNick": when enabled, ngIRCd sets
|
||||||
every clients' user name to their nick name and hides the user name
|
every clients' user name to their nickname and hides the user name
|
||||||
supplied by the IRC client.
|
supplied by the IRC client.
|
||||||
- Make write buffers bigger, but flush early. Before this change, a client
|
- Make write buffers bigger, but flush early. Before this change, a client
|
||||||
got disconnected if the buffer flushing at 4k failed, now regular clients
|
got disconnected if the buffer flushing at 4k failed, now regular clients
|
||||||
@@ -111,7 +303,7 @@ ngIRCd Release 17 (2010-11-07)
|
|||||||
- Enable the daemon to disable and enable "debug mode" on runtime using
|
- Enable the daemon to disable and enable "debug mode" on runtime using
|
||||||
signal SIGUSR1, when debug code is compiled in, not only on startup
|
signal SIGUSR1, when debug code is compiled in, not only on startup
|
||||||
using the command line parameters.
|
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
|
- 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
|
file, so the daemon now requires a HUP signal or REHASH command to
|
||||||
re-read the MOTD file when its content changed.
|
re-read the MOTD file when its content changed.
|
||||||
@@ -216,7 +408,7 @@ ngIRCd 0.12.0 (2008-05-13)
|
|||||||
- Implemented IRC commands INFO, SUMMON (dummy), and USERS (dummy) and
|
- Implemented IRC commands INFO, SUMMON (dummy), and USERS (dummy) and
|
||||||
enhanced test suite to check these commands. (Dana Dahlstrom)
|
enhanced test suite to check these commands. (Dana Dahlstrom)
|
||||||
- IRC_WHO now supports search patterns and will test this against user
|
- 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)
|
(reported by Dana Dahlstrom)
|
||||||
- Implement RFC 2812 handling of "0" argument to 'JOIN': must be treated
|
- 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
|
as if the user had sent PART commands for all channels the user is a
|
||||||
@@ -229,7 +421,7 @@ ngIRCd 0.11.0 (2008-01-15)
|
|||||||
- New [Server] configuration Option "Bind" allows to specify
|
- New [Server] configuration Option "Bind" allows to specify
|
||||||
the source IP address to use when connecting to remote server.
|
the source IP address to use when connecting to remote server.
|
||||||
- New configuration option "MaxNickLength" to specify the allowed maximum
|
- New configuration option "MaxNickLength" to specify the allowed maximum
|
||||||
length of user nick names. Note: must be unique in an IRC network!
|
length of user nicknames. Note: must be unique in an IRC network!
|
||||||
- Numeric 317: implemented "signon time" (displayed in WHOIS result).
|
- Numeric 317: implemented "signon time" (displayed in WHOIS result).
|
||||||
- Added new server configuration option "Passive" for "Server" blocks to
|
- Added new server configuration option "Passive" for "Server" blocks to
|
||||||
disable automatic outgoing connections (similar to -p option to ngircd,
|
disable automatic outgoing connections (similar to -p option to ngircd,
|
||||||
@@ -349,7 +541,7 @@ ngIRCd 0.6.0, 2002-12-24
|
|||||||
ausgehende Verbindung zu diesem auufzubauen. Dadurch kann nun auf beiden
|
ausgehende Verbindung zu diesem auufzubauen. Dadurch kann nun auf beiden
|
||||||
Servern in der Konfiguration ein Port fuer den Connect konfiguriert
|
Servern in der Konfiguration ein Port fuer den Connect konfiguriert
|
||||||
werden (beide Server versuchen sich dann gegenseitig zu connectieren).
|
werden (beide Server versuchen sich dann gegenseitig zu connectieren).
|
||||||
- Server identifizieren sich nun mit asyncronen Passwoertern, d.h. das
|
- Server identifizieren sich nun mit asynchronen Passwoertern, d.h. das
|
||||||
Passwort, welches A an B schickt, kann ein anderes sein als das, welches
|
Passwort, welches A an B schickt, kann ein anderes sein als das, welches
|
||||||
B als Antwort an A sendet. In der Konfig.-Datei, Abschnitt "Server",
|
B als Antwort an A sendet. In der Konfig.-Datei, Abschnitt "Server",
|
||||||
wurde "Password" dazu durch "MyPassword" und "PeerPassword" ersetzt.
|
wurde "Password" dazu durch "MyPassword" und "PeerPassword" ersetzt.
|
||||||
@@ -375,7 +567,7 @@ ngIRCd 0.5.0, 20.09.2002
|
|||||||
Konfiguration "sample-ngircd.conf") und bleiben auch dann bestehen,
|
Konfiguration "sample-ngircd.conf") und bleiben auch dann bestehen,
|
||||||
wenn kein User mehr im Channel ist.
|
wenn kein User mehr im Channel ist.
|
||||||
- neue IRC-Befehle: KICK, INVITE, ADMIN, CHANINFO; LIST wurde erweitert.
|
- neue IRC-Befehle: KICK, INVITE, ADMIN, CHANINFO; LIST wurde erweitert.
|
||||||
Mit dem neuen Befehl CHANINFO syncronisieren Server, die das IRC+-
|
Mit dem neuen Befehl CHANINFO synchronisieren Server, die das IRC+-
|
||||||
Protokoll unterstuetzen, Channel-Modes und Topics. Fuer den ADMIN-Befehl
|
Protokoll unterstuetzen, Channel-Modes und Topics. Fuer den ADMIN-Befehl
|
||||||
gibt es neue Konfigurationsoptionen (Sektion "Global"): "AdminInfo1",
|
gibt es neue Konfigurationsoptionen (Sektion "Global"): "AdminInfo1",
|
||||||
"AdminInfo2" und "AdminEMail".
|
"AdminInfo2" und "AdminEMail".
|
||||||
@@ -461,7 +653,3 @@ ngIRCd 0.0.2, 06.01.2002
|
|||||||
ngIRCd 0.0.1, 31.12.2001
|
ngIRCd 0.0.1, 31.12.2001
|
||||||
|
|
||||||
- erste oeffentliche Version von ngIRCd als "public preview" :-)
|
- erste oeffentliche Version von ngIRCd als "public preview" :-)
|
||||||
|
|
||||||
|
|
||||||
--
|
|
||||||
$Id: NEWS,v 1.88 2008/02/26 22:05:42 fw Exp $
|
|
||||||
|
|||||||
45
README
45
README
@@ -2,7 +2,7 @@
|
|||||||
ngIRCd - Next Generation IRC Server
|
ngIRCd - Next Generation IRC Server
|
||||||
http://ngircd.barton.de/
|
http://ngircd.barton.de/
|
||||||
|
|
||||||
(c)2001-2011 Alexander Barton and Contributors.
|
(c)2001-2013 Alexander Barton and Contributors.
|
||||||
ngIRCd is free software and published under the
|
ngIRCd is free software and published under the
|
||||||
terms of the GNU General Public License.
|
terms of the GNU General Public License.
|
||||||
|
|
||||||
@@ -12,11 +12,15 @@
|
|||||||
I. Introduction
|
I. Introduction
|
||||||
~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
ngIRCd is an Open Source server for the Internet Relay Chat (IRC), which
|
ngIRCd is a free, portable and lightweight Internet Relay Chat server for
|
||||||
is developed and published under the terms of the GNU General Public
|
small or private networks, developed under the GNU General Public License
|
||||||
Licence (URL: http://www.gnu.org/licenses/gpl.html). ngIRCd means "next
|
(GPL; please see the file COPYING for details). It is simple to configure,
|
||||||
generation IRC daemon", it's written from scratch and not deduced from the
|
can cope with dynamic IP addresses, and supports IPv6 as well as SSL. It is
|
||||||
"grandfather of IRC daemons", the daemon of the IRCNet.
|
written from scratch and not based on the original IRCd.
|
||||||
|
|
||||||
|
The name ngIRCd means next generation IRC daemon, which is a little bit
|
||||||
|
exaggerated: lightweight Internet Relay Chat server most probably would be a
|
||||||
|
better name :-)
|
||||||
|
|
||||||
Please see the INSTALL document for installation and upgrade information!
|
Please see the INSTALL document for installation and upgrade information!
|
||||||
|
|
||||||
@@ -33,22 +37,24 @@ used in real IRC networks.
|
|||||||
|
|
||||||
Implemented IRC-commands are:
|
Implemented IRC-commands are:
|
||||||
|
|
||||||
ADMIN, AWAY, CHANINFO, CONNECT, DIE, DISCONNECT, ERROR, HELP, INFO, INVITE,
|
ADMIN, AWAY, CHANINFO, CONNECT, DIE, DISCONNECT, ERROR, GLINE, HELP, INFO,
|
||||||
ISON, JOIN, KICK, KILL, LINKS, LIST, LUSERS, MODE, MOTD, NAMES, NICK, NJOIN,
|
INVITE, ISON, JOIN, KICK, KILL, KLINE, LINKS, LIST, LUSERS, MODE, MOTD,
|
||||||
NOTICE, OPER, PART, PASS, PING, PONG, PRIVMSG, QUIT, REHASH, RESTART, SERVER,
|
NAMES, NICK, NJOIN, NOTICE, OPER, PART, PASS, PING, PONG, PRIVMSG, QUIT,
|
||||||
SERVICE, SERVLIST, SQUERY, SQUIT, STATS, SUMMON, TIME, TOPIC, TRACE, USER,
|
REHASH, RESTART, SERVER, SERVICE, SERVLIST, SQUERY, SQUIT, STATS, SUMMON,
|
||||||
USERHOST, USERS, VERSION, WALLOPS, WEBIRC, WHO, WHOIS, WHOWAS.
|
TIME, TOPIC, TRACE, USER, USERHOST, USERS, VERSION, WALLOPS, WEBIRC, WHO,
|
||||||
|
WHOIS, WHOWAS.
|
||||||
|
|
||||||
III. Features (or: why use ngIRCd?)
|
III. Features (or: why use ngIRCd?)
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
- no problems with servers which have dynamic IP addresses
|
- well arranged (lean) configuration file
|
||||||
- simple, easy understandable configuration file,
|
- simple to build/install, configure and maintain
|
||||||
- freely published open-source C source code,
|
- supports IPv6 and SSL
|
||||||
- ngIRCd will be developed on in the future.
|
- no problems with servers that have dynamic IP addresses
|
||||||
|
- freely available, modern, portable and tidy C-source
|
||||||
- wide field of supported platforms, including AIX, A/UX, FreeBSD, HP-UX,
|
- wide field of supported platforms, including AIX, A/UX, FreeBSD, HP-UX,
|
||||||
IRIX, Linux, Mac OS X, NetBSD, OpenBSD, Solaris, and Windows with Cygwin.
|
IRIX, Linux, Mac OS X, NetBSD, OpenBSD, Solaris, and Windows with Cygwin.
|
||||||
|
- ngIRCd is being actively developed since 2001.
|
||||||
|
|
||||||
|
|
||||||
IV. Documentation
|
IV. Documentation
|
||||||
@@ -68,7 +74,7 @@ releases there.
|
|||||||
If you are interested in the latest development versions (which are not
|
If you are interested in the latest development versions (which are not
|
||||||
always stable), then please read the section about "GIT" on the homepage and
|
always stable), then please read the section about "GIT" on the homepage and
|
||||||
the file "doc/GIT.txt" which describes the use of GIT, the version control
|
the file "doc/GIT.txt" which describes the use of GIT, the version control
|
||||||
system used by ngIRCd (homepage: http://git.or.cz/).
|
system used by ngIRCd (homepage: http://git-scm.com/).
|
||||||
|
|
||||||
|
|
||||||
VI. Bugs
|
VI. Bugs
|
||||||
@@ -82,5 +88,6 @@ them at the following URL:
|
|||||||
There you can read about known bugs and limitations, too.
|
There you can read about known bugs and limitations, too.
|
||||||
|
|
||||||
If you have critics, patches or something else, please feel free to post a
|
If you have critics, patches or something else, please feel free to post a
|
||||||
mail to the ngIRCd mailing list: <ngircd-ml@arthur.ath.cx> (please see
|
mail to the ngIRCd mailing list: <ngircd-ml@arthur.barton.de> (please see
|
||||||
<http://ngircd.barton.de/support.php#ml> for details).
|
<http://ngircd.barton.de/support.php#ml> for details) or join the ngIRCd
|
||||||
|
IRC channel: <irc://irc.barton.de/ngircd>.
|
||||||
|
|||||||
78
autogen.sh
78
autogen.sh
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
#
|
#
|
||||||
# ngIRCd -- The Next Generation IRC Daemon
|
# ngIRCd -- The Next Generation IRC Daemon
|
||||||
# Copyright (c)2001-2008 Alexander Barton <alex@barton.de>
|
# Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
@@ -16,6 +16,11 @@
|
|||||||
# GNU autoconf. It tries to be smart in finding the correct/usable/available
|
# GNU autoconf. It tries to be smart in finding the correct/usable/available
|
||||||
# installed versions of these tools on your system.
|
# installed versions of these tools on your system.
|
||||||
#
|
#
|
||||||
|
# In addition, it enables or disables the "de-ANSI-fication" support of GNU
|
||||||
|
# automake, which is supported up to autoconf 1.11.x an has been removed
|
||||||
|
# in automake 1.12 -- make sure to use a version of automake supporting it
|
||||||
|
# when generating distribution archives!
|
||||||
|
#
|
||||||
# The following strategy is used for each of aclocal, autoheader, automake,
|
# The following strategy is used for each of aclocal, autoheader, automake,
|
||||||
# and autoconf: first, "tool" (the regular name of the tool, e. g. "autoconf"
|
# and autoconf: first, "tool" (the regular name of the tool, e. g. "autoconf"
|
||||||
# or "automake") is checked. If this fails, "tool<major><minor>" (for example
|
# or "automake") is checked. If this fails, "tool<major><minor>" (for example
|
||||||
@@ -98,6 +103,12 @@ Notfound()
|
|||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Run()
|
||||||
|
{
|
||||||
|
[ "$VERBOSE" = "1" ] && echo " - running \"$@\" ..."
|
||||||
|
$@
|
||||||
|
}
|
||||||
|
|
||||||
# Reset locale settings to suppress warning messages of Perl
|
# Reset locale settings to suppress warning messages of Perl
|
||||||
unset LC_ALL
|
unset LC_ALL
|
||||||
unset LANG
|
unset LANG
|
||||||
@@ -123,19 +134,18 @@ fi
|
|||||||
|
|
||||||
# Try to detect the needed tools when no environment variable already
|
# Try to detect the needed tools when no environment variable already
|
||||||
# specifies one:
|
# specifies one:
|
||||||
echo "Searching tools ..."
|
echo "Searching for required tools ..."
|
||||||
[ -z "$ACLOCAL" ] && ACLOCAL=`Search aclocal 1`
|
[ -z "$ACLOCAL" ] && ACLOCAL=`Search aclocal 1`
|
||||||
[ "$VERBOSE" = "1" ] && echo "ACLOCAL=$ACLOCAL"
|
[ "$VERBOSE" = "1" ] && echo " - ACLOCAL=$ACLOCAL"
|
||||||
[ -z "$AUTOHEADER" ] && AUTOHEADER=`Search autoheader 2`
|
[ -z "$AUTOHEADER" ] && AUTOHEADER=`Search autoheader 2`
|
||||||
[ "$VERBOSE" = "1" ] && echo "AUTOHEADER=$AUTOHEADER"
|
[ "$VERBOSE" = "1" ] && echo " - AUTOHEADER=$AUTOHEADER"
|
||||||
[ -z "$AUTOMAKE" ] && AUTOMAKE=`Search automake 1`
|
[ -z "$AUTOMAKE" ] && AUTOMAKE=`Search automake 1`
|
||||||
[ "$VERBOSE" = "1" ] && echo "AUTOMAKE=$AUTOMAKE"
|
[ "$VERBOSE" = "1" ] && echo " - AUTOMAKE=$AUTOMAKE"
|
||||||
[ -z "$AUTOCONF" ] && AUTOCONF=`Search autoconf 2`
|
[ -z "$AUTOCONF" ] && AUTOCONF=`Search autoconf 2`
|
||||||
[ "$VERBOSE" = "1" ] && echo "AUTOCONF=$AUTOCONF"
|
[ "$VERBOSE" = "1" ] && echo " - AUTOCONF=$AUTOCONF"
|
||||||
|
|
||||||
# Call ./configure when parameters have been passed to this script and
|
[ $# -gt 0 ] && CONFIGURE_ARGS=" $@" || CONFIGURE_ARGS=""
|
||||||
# GO isn't already defined.
|
[ -z "$GO" -a -n "$CONFIGURE_ARGS" ] && GO=1
|
||||||
[ -z "$GO" -a $# -gt 0 ] && GO=1
|
|
||||||
|
|
||||||
# Verify that all tools have been found
|
# Verify that all tools have been found
|
||||||
[ -z "$ACLOCAL" ] && Notfound aclocal
|
[ -z "$ACLOCAL" ] && Notfound aclocal
|
||||||
@@ -143,14 +153,51 @@ echo "Searching tools ..."
|
|||||||
[ -z "$AUTOMAKE" ] && Notfound automake
|
[ -z "$AUTOMAKE" ] && Notfound automake
|
||||||
[ -z "$AUTOCONF" ] && Notfound autoconf
|
[ -z "$AUTOCONF" ] && Notfound autoconf
|
||||||
|
|
||||||
|
AM_VERSION=`$AUTOMAKE --version | head -n 1 | sed -e 's/.* //g'`
|
||||||
|
ifs=$IFS; IFS="."; set $AM_VERSION; IFS=$ifs
|
||||||
|
AM_MAJOR="$1"; AM_MINOR="$2"; AM_PATCHLEVEL="$3"
|
||||||
|
|
||||||
|
AM_MAKEFILES="src/ipaddr/Makefile.ng src/ngircd/Makefile.ng src/testsuite/Makefile.ng src/tool/Makefile.ng"
|
||||||
|
|
||||||
|
if [ "$AM_MAJOR" -eq "1" -a "$AM_MINOR" -lt "12" ]; then
|
||||||
|
# automake < 1.12 => automatic de-ANSI-fication support available
|
||||||
|
echo "Enabling de-ANSI-fication support (automake $AM_VERSION) ..."
|
||||||
|
sed -e "s|^__ng_PROTOTYPES__|AM_C_PROTOTYPES|g" configure.ng >configure.ac
|
||||||
|
DEANSI_START=""
|
||||||
|
DEANSI_END=""
|
||||||
|
else
|
||||||
|
# automake >= 1.12 => no de-ANSI-fication support available
|
||||||
|
echo "Disabling de-ANSI-fication support (automake $AM_VERSION) ..."
|
||||||
|
sed -e "s|^__ng_PROTOTYPES__|AC_C_PROTOTYPES|g" configure.ng >configure.ac
|
||||||
|
DEANSI_START="#"
|
||||||
|
DEANSI_END=" # disabled by ./autogen.sh script"
|
||||||
|
fi
|
||||||
|
# Serial test harness?
|
||||||
|
if [ "$AM_MAJOR" -eq "1" -a "$AM_MINOR" -ge "13" ]; then
|
||||||
|
# automake >= 1.13 => enforce "serial test harness"
|
||||||
|
echo " - Enforcing serial test harness."
|
||||||
|
SERIAL_TESTS="serial-tests"
|
||||||
|
else
|
||||||
|
# automake < 1.13 => no new test harness, nothing to do
|
||||||
|
SERIAL_TEST=""
|
||||||
|
fi
|
||||||
|
|
||||||
|
sed -e "s|^__ng_Makefile_am_template__|AUTOMAKE_OPTIONS = ${SERIAL_TESTS} ${DEANSI_START}ansi2knr${DEANSI_END}|g" \
|
||||||
|
src/portab/Makefile.ng >src/portab/Makefile.am
|
||||||
|
for makefile_ng in $AM_MAKEFILES; do
|
||||||
|
makefile_am=`echo "$makefile_ng" | sed -e "s|\.ng\$|\.am|g"`
|
||||||
|
sed -e "s|^__ng_Makefile_am_template__|AUTOMAKE_OPTIONS = ${SERIAL_TESTS} ${DEANSI_START}../portab/ansi2knr${DEANSI_END}|g" \
|
||||||
|
$makefile_ng >$makefile_am
|
||||||
|
done
|
||||||
|
|
||||||
export ACLOCAL AUTOHEADER AUTOMAKE AUTOCONF
|
export ACLOCAL AUTOHEADER AUTOMAKE AUTOCONF
|
||||||
|
|
||||||
# Generate files
|
# Generate files
|
||||||
echo "Generating files ..."
|
echo "Generating files using GNU $AUTOCONF and $AUTOMAKE ..."
|
||||||
$ACLOCAL && \
|
Run $ACLOCAL && \
|
||||||
$AUTOHEADER && \
|
Run $AUTOCONF && \
|
||||||
$AUTOMAKE --add-missing && \
|
Run $AUTOHEADER && \
|
||||||
$AUTOCONF --force
|
Run $AUTOMAKE --add-missing --no-force
|
||||||
|
|
||||||
if [ $? -eq 0 -a -x ./configure ]; then
|
if [ $? -eq 0 -a -x ./configure ]; then
|
||||||
# Success: if we got some parameters we call ./configure and pass
|
# Success: if we got some parameters we call ./configure and pass
|
||||||
@@ -158,8 +205,7 @@ if [ $? -eq 0 -a -x ./configure ]; then
|
|||||||
NAME=`grep PACKAGE_STRING= configure | cut -d"'" -f2`
|
NAME=`grep PACKAGE_STRING= configure | cut -d"'" -f2`
|
||||||
if [ "$GO" = "1" ]; then
|
if [ "$GO" = "1" ]; then
|
||||||
[ -n "$PREFIX" ] && p=" --prefix=$PREFIX" || p=""
|
[ -n "$PREFIX" ] && p=" --prefix=$PREFIX" || p=""
|
||||||
[ -n "$*" ] && a=" $*" || a=""
|
c="./configure${p}${CONFIGURE_ARGS}"
|
||||||
c="./configure${p}${a}"
|
|
||||||
echo "Okay, autogen.sh for $NAME done."
|
echo "Okay, autogen.sh for $NAME done."
|
||||||
echo "Calling \"$c\" ..."
|
echo "Calling \"$c\" ..."
|
||||||
$c
|
$c
|
||||||
|
|||||||
561
config.guess
vendored
561
config.guess
vendored
@@ -1,10 +1,10 @@
|
|||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Attempt to guess a canonical system name.
|
# Attempt to guess a canonical system name.
|
||||||
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
||||||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
|
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
|
||||||
# Free Software Foundation, Inc.
|
# 2011, 2012 Free Software Foundation, Inc.
|
||||||
|
|
||||||
timestamp='2008-01-23'
|
timestamp='2012-08-14'
|
||||||
|
|
||||||
# This file is free software; you can redistribute it and/or modify it
|
# 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
|
# 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.
|
# General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software
|
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
|
|
||||||
# 02110-1301, USA.
|
|
||||||
#
|
#
|
||||||
# As a special exception to the GNU General Public License, if you
|
# As a special exception to the GNU General Public License, if you
|
||||||
# distribute this file as part of a program that contains a
|
# 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.
|
# the same distribution terms that you use for the rest of that program.
|
||||||
|
|
||||||
|
|
||||||
# Originally written by Per Bothner <per@bothner.com>.
|
# Originally written by Per Bothner. Please send patches (context
|
||||||
# Please send patches to <config-patches@gnu.org>. Submit a context
|
# diff format) to <config-patches@gnu.org> and include a ChangeLog
|
||||||
# diff and a properly formatted ChangeLog entry.
|
# entry.
|
||||||
#
|
#
|
||||||
# This script attempts to guess a canonical system name similar to
|
# This script attempts to guess a canonical system name similar to
|
||||||
# config.sub. If it succeeds, it prints the system name on stdout, and
|
# config.sub. If it succeeds, it prints the system name on stdout, and
|
||||||
# exits with 0. Otherwise, it exits with 1.
|
# exits with 0. Otherwise, it exits with 1.
|
||||||
#
|
#
|
||||||
# The plan is that this can be called by configure scripts if you
|
# You can get the latest version of this script from:
|
||||||
# don't specify an explicit build system type.
|
# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
|
||||||
|
|
||||||
me=`echo "$0" | sed -e 's,.*/,,'`
|
me=`echo "$0" | sed -e 's,.*/,,'`
|
||||||
|
|
||||||
@@ -56,8 +54,9 @@ version="\
|
|||||||
GNU config.guess ($timestamp)
|
GNU config.guess ($timestamp)
|
||||||
|
|
||||||
Originally written by Per Bothner.
|
Originally written by Per Bothner.
|
||||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
|
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
|
||||||
2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
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
|
This is free software; see the source for copying conditions. There is NO
|
||||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
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
|
case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
||||||
*:NetBSD:*:*)
|
*:NetBSD:*:*)
|
||||||
# NetBSD (nbsd) targets should (where applicable) match one or
|
# 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
|
# *-*-netbsdecoff* and *-*-netbsd*. For targets that recently
|
||||||
# switched to ELF, *-*-netbsd* would select the old
|
# switched to ELF, *-*-netbsd* would select the old
|
||||||
# object file format. This provides both forward
|
# 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)
|
arm*|i386|m68k|ns32k|sh3*|sparc|vax)
|
||||||
eval $set_cc_for_build
|
eval $set_cc_for_build
|
||||||
if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
|
if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
|
||||||
| grep __ELF__ >/dev/null
|
| grep -q __ELF__
|
||||||
then
|
then
|
||||||
# Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
|
# Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).
|
||||||
# Return netbsd for either. FIX?
|
# Return netbsd for either. FIX?
|
||||||
@@ -180,7 +179,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
|||||||
fi
|
fi
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
os=netbsd
|
os=netbsd
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
# The OS release
|
# The OS release
|
||||||
@@ -201,6 +200,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
|||||||
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
|
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
|
||||||
echo "${machine}-${os}${release}"
|
echo "${machine}-${os}${release}"
|
||||||
exit ;;
|
exit ;;
|
||||||
|
*:Bitrig:*:*)
|
||||||
|
UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
|
||||||
|
echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}
|
||||||
|
exit ;;
|
||||||
*:OpenBSD:*:*)
|
*:OpenBSD:*:*)
|
||||||
UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
|
UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`
|
||||||
echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
|
echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}
|
||||||
@@ -223,7 +226,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
|||||||
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
|
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`
|
||||||
;;
|
;;
|
||||||
*5.*)
|
*5.*)
|
||||||
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
|
UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
# According to Compaq, /usr/sbin/psrinfo has been available on
|
# According to Compaq, /usr/sbin/psrinfo has been available on
|
||||||
@@ -269,7 +272,10 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
|||||||
# A Xn.n version is an unreleased experimental baselevel.
|
# A Xn.n version is an unreleased experimental baselevel.
|
||||||
# 1.2 uses "1.2" for uname -r.
|
# 1.2 uses "1.2" for uname -r.
|
||||||
echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
|
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*:*)
|
Alpha\ *:Windows_NT*:*)
|
||||||
# How do we know it's Interix rather than the generic POSIX subsystem?
|
# 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
|
# Should we change UNAME_MACHINE based on the output of uname instead
|
||||||
@@ -295,7 +301,7 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
|||||||
echo s390-ibm-zvmoe
|
echo s390-ibm-zvmoe
|
||||||
exit ;;
|
exit ;;
|
||||||
*:OS400:*:*)
|
*:OS400:*:*)
|
||||||
echo powerpc-ibm-os400
|
echo powerpc-ibm-os400
|
||||||
exit ;;
|
exit ;;
|
||||||
arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
|
arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
|
||||||
echo arm-acorn-riscix${UNAME_RELEASE}
|
echo arm-acorn-riscix${UNAME_RELEASE}
|
||||||
@@ -324,14 +330,33 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
|||||||
case `/usr/bin/uname -p` in
|
case `/usr/bin/uname -p` in
|
||||||
sparc) echo sparc-icl-nx7; exit ;;
|
sparc) echo sparc-icl-nx7; exit ;;
|
||||||
esac ;;
|
esac ;;
|
||||||
|
s390x:SunOS:*:*)
|
||||||
|
echo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||||
|
exit ;;
|
||||||
sun4H:SunOS:5.*:*)
|
sun4H:SunOS:5.*:*)
|
||||||
echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||||
exit ;;
|
exit ;;
|
||||||
sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
|
sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
|
||||||
echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
|
||||||
exit ;;
|
exit ;;
|
||||||
|
i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)
|
||||||
|
echo i386-pc-auroraux${UNAME_RELEASE}
|
||||||
|
exit ;;
|
||||||
i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)
|
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 ;;
|
exit ;;
|
||||||
sun4*:SunOS:6*:*)
|
sun4*:SunOS:6*:*)
|
||||||
# According to config.sub, this is the proper way to canonicalize
|
# According to config.sub, this is the proper way to canonicalize
|
||||||
@@ -375,23 +400,23 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
|
|||||||
# MiNT. But MiNT is downward compatible to TOS, so this should
|
# MiNT. But MiNT is downward compatible to TOS, so this should
|
||||||
# be no problem.
|
# be no problem.
|
||||||
atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
|
atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)
|
||||||
echo m68k-atari-mint${UNAME_RELEASE}
|
echo m68k-atari-mint${UNAME_RELEASE}
|
||||||
exit ;;
|
exit ;;
|
||||||
atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
|
atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)
|
||||||
echo m68k-atari-mint${UNAME_RELEASE}
|
echo m68k-atari-mint${UNAME_RELEASE}
|
||||||
exit ;;
|
exit ;;
|
||||||
*falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
|
*falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)
|
||||||
echo m68k-atari-mint${UNAME_RELEASE}
|
echo m68k-atari-mint${UNAME_RELEASE}
|
||||||
exit ;;
|
exit ;;
|
||||||
milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
|
milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)
|
||||||
echo m68k-milan-mint${UNAME_RELEASE}
|
echo m68k-milan-mint${UNAME_RELEASE}
|
||||||
exit ;;
|
exit ;;
|
||||||
hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
|
hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)
|
||||||
echo m68k-hades-mint${UNAME_RELEASE}
|
echo m68k-hades-mint${UNAME_RELEASE}
|
||||||
exit ;;
|
exit ;;
|
||||||
*:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
|
*:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)
|
||||||
echo m68k-unknown-mint${UNAME_RELEASE}
|
echo m68k-unknown-mint${UNAME_RELEASE}
|
||||||
exit ;;
|
exit ;;
|
||||||
m68k:machten:*:*)
|
m68k:machten:*:*)
|
||||||
echo m68k-apple-machten${UNAME_RELEASE}
|
echo m68k-apple-machten${UNAME_RELEASE}
|
||||||
exit ;;
|
exit ;;
|
||||||
@@ -461,8 +486,8 @@ EOF
|
|||||||
echo m88k-motorola-sysv3
|
echo m88k-motorola-sysv3
|
||||||
exit ;;
|
exit ;;
|
||||||
AViiON:dgux:*:*)
|
AViiON:dgux:*:*)
|
||||||
# DG/UX returns AViiON for all architectures
|
# DG/UX returns AViiON for all architectures
|
||||||
UNAME_PROCESSOR=`/usr/bin/uname -p`
|
UNAME_PROCESSOR=`/usr/bin/uname -p`
|
||||||
if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
|
if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]
|
||||||
then
|
then
|
||||||
if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
|
if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \
|
||||||
@@ -475,7 +500,7 @@ EOF
|
|||||||
else
|
else
|
||||||
echo i586-dg-dgux${UNAME_RELEASE}
|
echo i586-dg-dgux${UNAME_RELEASE}
|
||||||
fi
|
fi
|
||||||
exit ;;
|
exit ;;
|
||||||
M88*:DolphinOS:*:*) # DolphinOS (SVR3)
|
M88*:DolphinOS:*:*) # DolphinOS (SVR3)
|
||||||
echo m88k-dolphin-sysv3
|
echo m88k-dolphin-sysv3
|
||||||
exit ;;
|
exit ;;
|
||||||
@@ -532,7 +557,7 @@ EOF
|
|||||||
echo rs6000-ibm-aix3.2
|
echo rs6000-ibm-aix3.2
|
||||||
fi
|
fi
|
||||||
exit ;;
|
exit ;;
|
||||||
*:AIX:*:[456])
|
*:AIX:*:[4567])
|
||||||
IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`
|
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
|
if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then
|
||||||
IBM_ARCH=rs6000
|
IBM_ARCH=rs6000
|
||||||
@@ -575,52 +600,52 @@ EOF
|
|||||||
9000/[678][0-9][0-9])
|
9000/[678][0-9][0-9])
|
||||||
if [ -x /usr/bin/getconf ]; then
|
if [ -x /usr/bin/getconf ]; then
|
||||||
sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
|
sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`
|
||||||
sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
|
sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`
|
||||||
case "${sc_cpu_version}" in
|
case "${sc_cpu_version}" in
|
||||||
523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
|
523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0
|
||||||
528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
|
528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1
|
||||||
532) # CPU_PA_RISC2_0
|
532) # CPU_PA_RISC2_0
|
||||||
case "${sc_kernel_bits}" in
|
case "${sc_kernel_bits}" in
|
||||||
32) HP_ARCH="hppa2.0n" ;;
|
32) HP_ARCH="hppa2.0n" ;;
|
||||||
64) HP_ARCH="hppa2.0w" ;;
|
64) HP_ARCH="hppa2.0w" ;;
|
||||||
'') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
|
'') HP_ARCH="hppa2.0" ;; # HP-UX 10.20
|
||||||
esac ;;
|
esac ;;
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
if [ "${HP_ARCH}" = "" ]; then
|
if [ "${HP_ARCH}" = "" ]; then
|
||||||
eval $set_cc_for_build
|
eval $set_cc_for_build
|
||||||
sed 's/^ //' << EOF >$dummy.c
|
sed 's/^ //' << EOF >$dummy.c
|
||||||
|
|
||||||
#define _HPUX_SOURCE
|
#define _HPUX_SOURCE
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
int main ()
|
int main ()
|
||||||
{
|
{
|
||||||
#if defined(_SC_KERNEL_BITS)
|
#if defined(_SC_KERNEL_BITS)
|
||||||
long bits = sysconf(_SC_KERNEL_BITS);
|
long bits = sysconf(_SC_KERNEL_BITS);
|
||||||
#endif
|
#endif
|
||||||
long cpu = sysconf (_SC_CPU_VERSION);
|
long cpu = sysconf (_SC_CPU_VERSION);
|
||||||
|
|
||||||
switch (cpu)
|
switch (cpu)
|
||||||
{
|
{
|
||||||
case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
|
case CPU_PA_RISC1_0: puts ("hppa1.0"); break;
|
||||||
case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
|
case CPU_PA_RISC1_1: puts ("hppa1.1"); break;
|
||||||
case CPU_PA_RISC2_0:
|
case CPU_PA_RISC2_0:
|
||||||
#if defined(_SC_KERNEL_BITS)
|
#if defined(_SC_KERNEL_BITS)
|
||||||
switch (bits)
|
switch (bits)
|
||||||
{
|
{
|
||||||
case 64: puts ("hppa2.0w"); break;
|
case 64: puts ("hppa2.0w"); break;
|
||||||
case 32: puts ("hppa2.0n"); break;
|
case 32: puts ("hppa2.0n"); break;
|
||||||
default: puts ("hppa2.0"); break;
|
default: puts ("hppa2.0"); break;
|
||||||
} break;
|
} break;
|
||||||
#else /* !defined(_SC_KERNEL_BITS) */
|
#else /* !defined(_SC_KERNEL_BITS) */
|
||||||
puts ("hppa2.0"); break;
|
puts ("hppa2.0"); break;
|
||||||
#endif
|
#endif
|
||||||
default: puts ("hppa1.0"); break;
|
default: puts ("hppa1.0"); break;
|
||||||
}
|
}
|
||||||
exit (0);
|
exit (0);
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
(CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
|
(CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`
|
||||||
test -z "$HP_ARCH" && HP_ARCH=hppa
|
test -z "$HP_ARCH" && HP_ARCH=hppa
|
||||||
@@ -640,7 +665,7 @@ EOF
|
|||||||
# => hppa64-hp-hpux11.23
|
# => hppa64-hp-hpux11.23
|
||||||
|
|
||||||
if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
|
if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |
|
||||||
grep __LP64__ >/dev/null
|
grep -q __LP64__
|
||||||
then
|
then
|
||||||
HP_ARCH="hppa2.0w"
|
HP_ARCH="hppa2.0w"
|
||||||
else
|
else
|
||||||
@@ -711,22 +736,22 @@ EOF
|
|||||||
exit ;;
|
exit ;;
|
||||||
C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
|
C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
|
||||||
echo c1-convex-bsd
|
echo c1-convex-bsd
|
||||||
exit ;;
|
exit ;;
|
||||||
C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
|
C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
|
||||||
if getsysinfo -f scalar_acc
|
if getsysinfo -f scalar_acc
|
||||||
then echo c32-convex-bsd
|
then echo c32-convex-bsd
|
||||||
else echo c2-convex-bsd
|
else echo c2-convex-bsd
|
||||||
fi
|
fi
|
||||||
exit ;;
|
exit ;;
|
||||||
C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
|
C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
|
||||||
echo c34-convex-bsd
|
echo c34-convex-bsd
|
||||||
exit ;;
|
exit ;;
|
||||||
C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
|
C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
|
||||||
echo c38-convex-bsd
|
echo c38-convex-bsd
|
||||||
exit ;;
|
exit ;;
|
||||||
C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
|
C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
|
||||||
echo c4-convex-bsd
|
echo c4-convex-bsd
|
||||||
exit ;;
|
exit ;;
|
||||||
CRAY*Y-MP:*:*:*)
|
CRAY*Y-MP:*:*:*)
|
||||||
echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
|
echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/'
|
||||||
exit ;;
|
exit ;;
|
||||||
@@ -750,14 +775,14 @@ EOF
|
|||||||
exit ;;
|
exit ;;
|
||||||
F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
|
F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)
|
||||||
FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
|
FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`
|
||||||
FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
|
FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
|
||||||
FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
|
FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
|
||||||
echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
|
echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
|
||||||
exit ;;
|
exit ;;
|
||||||
5000:UNIX_System_V:4.*:*)
|
5000:UNIX_System_V:4.*:*)
|
||||||
FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
|
FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'`
|
||||||
FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
|
FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`
|
||||||
echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
|
echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
|
||||||
exit ;;
|
exit ;;
|
||||||
i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
|
i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*)
|
||||||
echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
|
echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
|
||||||
@@ -769,34 +794,39 @@ EOF
|
|||||||
echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
|
echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}
|
||||||
exit ;;
|
exit ;;
|
||||||
*:FreeBSD:*:*)
|
*:FreeBSD:*:*)
|
||||||
case ${UNAME_MACHINE} in
|
UNAME_PROCESSOR=`/usr/bin/uname -p`
|
||||||
pc98)
|
case ${UNAME_PROCESSOR} in
|
||||||
echo i386-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
|
|
||||||
amd64)
|
amd64)
|
||||||
echo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;
|
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
|
esac
|
||||||
exit ;;
|
exit ;;
|
||||||
i*:CYGWIN*:*)
|
i*:CYGWIN*:*)
|
||||||
echo ${UNAME_MACHINE}-pc-cygwin
|
echo ${UNAME_MACHINE}-pc-cygwin
|
||||||
exit ;;
|
exit ;;
|
||||||
|
*:MINGW64*:*)
|
||||||
|
echo ${UNAME_MACHINE}-pc-mingw64
|
||||||
|
exit ;;
|
||||||
*:MINGW*:*)
|
*:MINGW*:*)
|
||||||
echo ${UNAME_MACHINE}-pc-mingw32
|
echo ${UNAME_MACHINE}-pc-mingw32
|
||||||
exit ;;
|
exit ;;
|
||||||
|
i*:MSYS*:*)
|
||||||
|
echo ${UNAME_MACHINE}-pc-msys
|
||||||
|
exit ;;
|
||||||
i*:windows32*:*)
|
i*:windows32*:*)
|
||||||
# uname -m includes "-pc" on this system.
|
# uname -m includes "-pc" on this system.
|
||||||
echo ${UNAME_MACHINE}-mingw32
|
echo ${UNAME_MACHINE}-mingw32
|
||||||
exit ;;
|
exit ;;
|
||||||
i*:PW*:*)
|
i*:PW*:*)
|
||||||
echo ${UNAME_MACHINE}-pc-pw32
|
echo ${UNAME_MACHINE}-pc-pw32
|
||||||
exit ;;
|
exit ;;
|
||||||
*:Interix*:[3456]*)
|
*:Interix*:*)
|
||||||
case ${UNAME_MACHINE} in
|
case ${UNAME_MACHINE} in
|
||||||
x86)
|
x86)
|
||||||
echo i586-pc-interix${UNAME_RELEASE}
|
echo i586-pc-interix${UNAME_RELEASE}
|
||||||
exit ;;
|
exit ;;
|
||||||
EM64T | authenticamd)
|
authenticamd | genuineintel | EM64T)
|
||||||
echo x86_64-unknown-interix${UNAME_RELEASE}
|
echo x86_64-unknown-interix${UNAME_RELEASE}
|
||||||
exit ;;
|
exit ;;
|
||||||
IA64)
|
IA64)
|
||||||
@@ -806,6 +836,9 @@ EOF
|
|||||||
[345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
|
[345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)
|
||||||
echo i${UNAME_MACHINE}-pc-mks
|
echo i${UNAME_MACHINE}-pc-mks
|
||||||
exit ;;
|
exit ;;
|
||||||
|
8664:Windows_NT:*)
|
||||||
|
echo x86_64-pc-mks
|
||||||
|
exit ;;
|
||||||
i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
|
i*:Windows_NT*:* | Pentium*:Windows_NT*:*)
|
||||||
# How do we know it's Interix rather than the generic POSIX subsystem?
|
# 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
|
# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we
|
||||||
@@ -835,92 +868,13 @@ EOF
|
|||||||
i*86:Minix:*:*)
|
i*86:Minix:*:*)
|
||||||
echo ${UNAME_MACHINE}-pc-minix
|
echo ${UNAME_MACHINE}-pc-minix
|
||||||
exit ;;
|
exit ;;
|
||||||
arm*:Linux:*:*)
|
aarch64: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:*:*)
|
|
||||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||||
exit ;;
|
exit ;;
|
||||||
cris:Linux:*:*)
|
aarch64_be:Linux:*:*)
|
||||||
echo cris-axis-linux-gnu
|
UNAME_MACHINE=aarch64_be
|
||||||
exit ;;
|
|
||||||
crisv32:Linux:*:*)
|
|
||||||
echo crisv32-axis-linux-gnu
|
|
||||||
exit ;;
|
|
||||||
frv:Linux:*:*)
|
|
||||||
echo frv-unknown-linux-gnu
|
|
||||||
exit ;;
|
|
||||||
ia64:Linux:*:*)
|
|
||||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||||
exit ;;
|
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:*:*)
|
alpha:Linux:*:*)
|
||||||
case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
|
case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in
|
||||||
EV5) UNAME_MACHINE=alphaev5 ;;
|
EV5) UNAME_MACHINE=alphaev5 ;;
|
||||||
@@ -930,11 +884,90 @@ EOF
|
|||||||
EV6) UNAME_MACHINE=alphaev6 ;;
|
EV6) UNAME_MACHINE=alphaev6 ;;
|
||||||
EV67) UNAME_MACHINE=alphaev67 ;;
|
EV67) UNAME_MACHINE=alphaev67 ;;
|
||||||
EV68*) UNAME_MACHINE=alphaev68 ;;
|
EV68*) UNAME_MACHINE=alphaev68 ;;
|
||||||
esac
|
esac
|
||||||
objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null
|
objdump --private-headers /bin/sh | grep -q ld.so.1
|
||||||
if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
|
if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi
|
||||||
echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
|
echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC}
|
||||||
exit ;;
|
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:*:*)
|
parisc:Linux:*:* | hppa:Linux:*:*)
|
||||||
# Look for CPU level
|
# Look for CPU level
|
||||||
case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
|
case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in
|
||||||
@@ -943,14 +976,17 @@ EOF
|
|||||||
*) echo hppa-unknown-linux-gnu ;;
|
*) echo hppa-unknown-linux-gnu ;;
|
||||||
esac
|
esac
|
||||||
exit ;;
|
exit ;;
|
||||||
parisc64:Linux:*:* | hppa64:Linux:*:*)
|
ppc64:Linux:*:*)
|
||||||
echo hppa64-unknown-linux-gnu
|
echo powerpc64-unknown-linux-gnu
|
||||||
|
exit ;;
|
||||||
|
ppc:Linux:*:*)
|
||||||
|
echo powerpc-unknown-linux-gnu
|
||||||
exit ;;
|
exit ;;
|
||||||
s390:Linux:*:* | s390x:Linux:*:*)
|
s390:Linux:*:* | s390x:Linux:*:*)
|
||||||
echo ${UNAME_MACHINE}-ibm-linux
|
echo ${UNAME_MACHINE}-ibm-linux
|
||||||
exit ;;
|
exit ;;
|
||||||
sh64*:Linux:*:*)
|
sh64*:Linux:*:*)
|
||||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||||
exit ;;
|
exit ;;
|
||||||
sh*:Linux:*:*)
|
sh*:Linux:*:*)
|
||||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||||
@@ -958,78 +994,18 @@ EOF
|
|||||||
sparc:Linux:*:* | sparc64:Linux:*:*)
|
sparc:Linux:*:* | sparc64:Linux:*:*)
|
||||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||||
exit ;;
|
exit ;;
|
||||||
|
tile*:Linux:*:*)
|
||||||
|
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||||
|
exit ;;
|
||||||
vax:Linux:*:*)
|
vax:Linux:*:*)
|
||||||
echo ${UNAME_MACHINE}-dec-linux-gnu
|
echo ${UNAME_MACHINE}-dec-linux-gnu
|
||||||
exit ;;
|
exit ;;
|
||||||
x86_64:Linux:*:*)
|
x86_64:Linux:*:*)
|
||||||
echo x86_64-unknown-linux-gnu
|
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||||
exit ;;
|
exit ;;
|
||||||
xtensa*:Linux:*:*)
|
xtensa*:Linux:*:*)
|
||||||
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
echo ${UNAME_MACHINE}-unknown-linux-gnu
|
||||||
exit ;;
|
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*:*)
|
i*86:DYNIX/ptx:4*:*)
|
||||||
# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
|
# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.
|
||||||
# earlier versions are messed up and put the nodename in both
|
# earlier versions are messed up and put the nodename in both
|
||||||
@@ -1037,11 +1013,11 @@ EOF
|
|||||||
echo i386-sequent-sysv4
|
echo i386-sequent-sysv4
|
||||||
exit ;;
|
exit ;;
|
||||||
i*86:UNIX_SV:4.2MP:2.*)
|
i*86:UNIX_SV:4.2MP:2.*)
|
||||||
# Unixware is an offshoot of SVR4, but it has its own version
|
# Unixware is an offshoot of SVR4, but it has its own version
|
||||||
# number series starting with 2...
|
# number series starting with 2...
|
||||||
# I am not positive that other SVR4 systems won't match this,
|
# I am not positive that other SVR4 systems won't match this,
|
||||||
# I just have to hope. -- rms.
|
# 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}
|
echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}
|
||||||
exit ;;
|
exit ;;
|
||||||
i*86:OS/2:*:*)
|
i*86:OS/2:*:*)
|
||||||
@@ -1058,7 +1034,7 @@ EOF
|
|||||||
i*86:syllable:*:*)
|
i*86:syllable:*:*)
|
||||||
echo ${UNAME_MACHINE}-pc-syllable
|
echo ${UNAME_MACHINE}-pc-syllable
|
||||||
exit ;;
|
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}
|
echo i386-unknown-lynxos${UNAME_RELEASE}
|
||||||
exit ;;
|
exit ;;
|
||||||
i*86:*DOS:*:*)
|
i*86:*DOS:*:*)
|
||||||
@@ -1073,7 +1049,7 @@ EOF
|
|||||||
fi
|
fi
|
||||||
exit ;;
|
exit ;;
|
||||||
i*86:*:5:[678]*)
|
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
|
case `/bin/uname -X | grep "^Machine"` in
|
||||||
*486*) UNAME_MACHINE=i486 ;;
|
*486*) UNAME_MACHINE=i486 ;;
|
||||||
*Pentium) UNAME_MACHINE=i586 ;;
|
*Pentium) UNAME_MACHINE=i586 ;;
|
||||||
@@ -1101,10 +1077,13 @@ EOF
|
|||||||
exit ;;
|
exit ;;
|
||||||
pc:*:*:*)
|
pc:*:*:*)
|
||||||
# Left here for compatibility:
|
# Left here for compatibility:
|
||||||
# uname -m prints for DJGPP always 'pc', but it prints nothing about
|
# uname -m prints for DJGPP always 'pc', but it prints nothing about
|
||||||
# the processor, so we play safe by assuming i386.
|
# the processor, so we play safe by assuming i586.
|
||||||
echo i386-pc-msdosdjgpp
|
# Note: whatever this is, it MUST be the same as what config.sub
|
||||||
exit ;;
|
# 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*:*)
|
Intel:Mach:3*:*)
|
||||||
echo i386-pc-mach3
|
echo i386-pc-mach3
|
||||||
exit ;;
|
exit ;;
|
||||||
@@ -1139,8 +1118,18 @@ EOF
|
|||||||
/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
|
/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
|
||||||
&& { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
|
&& { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;
|
||||||
3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
|
3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
|
||||||
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
|
/bin/uname -p 2>/dev/null | grep 86 >/dev/null \
|
||||||
&& { echo i486-ncr-sysv4; exit; } ;;
|
&& { 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*:*)
|
m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)
|
||||||
echo m68k-unknown-lynxos${UNAME_RELEASE}
|
echo m68k-unknown-lynxos${UNAME_RELEASE}
|
||||||
exit ;;
|
exit ;;
|
||||||
@@ -1153,7 +1142,7 @@ EOF
|
|||||||
rs6000:LynxOS:2.*:*)
|
rs6000:LynxOS:2.*:*)
|
||||||
echo rs6000-unknown-lynxos${UNAME_RELEASE}
|
echo rs6000-unknown-lynxos${UNAME_RELEASE}
|
||||||
exit ;;
|
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}
|
echo powerpc-unknown-lynxos${UNAME_RELEASE}
|
||||||
exit ;;
|
exit ;;
|
||||||
SM[BE]S:UNIX_SV:*:*)
|
SM[BE]S:UNIX_SV:*:*)
|
||||||
@@ -1173,10 +1162,10 @@ EOF
|
|||||||
echo ns32k-sni-sysv
|
echo ns32k-sni-sysv
|
||||||
fi
|
fi
|
||||||
exit ;;
|
exit ;;
|
||||||
PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
|
PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
|
||||||
# says <Richard.M.Bartel@ccMail.Census.GOV>
|
# says <Richard.M.Bartel@ccMail.Census.GOV>
|
||||||
echo i586-unisys-sysv4
|
echo i586-unisys-sysv4
|
||||||
exit ;;
|
exit ;;
|
||||||
*:UNIX_System_V:4*:FTX*)
|
*:UNIX_System_V:4*:FTX*)
|
||||||
# From Gerald Hewes <hewes@openmarket.com>.
|
# From Gerald Hewes <hewes@openmarket.com>.
|
||||||
# How about differentiating between stratus architectures? -djm
|
# How about differentiating between stratus architectures? -djm
|
||||||
@@ -1202,11 +1191,11 @@ EOF
|
|||||||
exit ;;
|
exit ;;
|
||||||
R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
|
R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)
|
||||||
if [ -d /usr/nec ]; then
|
if [ -d /usr/nec ]; then
|
||||||
echo mips-nec-sysv${UNAME_RELEASE}
|
echo mips-nec-sysv${UNAME_RELEASE}
|
||||||
else
|
else
|
||||||
echo mips-unknown-sysv${UNAME_RELEASE}
|
echo mips-unknown-sysv${UNAME_RELEASE}
|
||||||
fi
|
fi
|
||||||
exit ;;
|
exit ;;
|
||||||
BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
|
BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only.
|
||||||
echo powerpc-be-beos
|
echo powerpc-be-beos
|
||||||
exit ;;
|
exit ;;
|
||||||
@@ -1216,6 +1205,12 @@ EOF
|
|||||||
BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
|
BePC:BeOS:*:*) # BeOS running on Intel PC compatible.
|
||||||
echo i586-pc-beos
|
echo i586-pc-beos
|
||||||
exit ;;
|
exit ;;
|
||||||
|
BePC:Haiku:*:*) # Haiku running on Intel PC compatible.
|
||||||
|
echo i586-pc-haiku
|
||||||
|
exit ;;
|
||||||
|
x86_64:Haiku:*:*)
|
||||||
|
echo x86_64-unknown-haiku
|
||||||
|
exit ;;
|
||||||
SX-4:SUPER-UX:*:*)
|
SX-4:SUPER-UX:*:*)
|
||||||
echo sx4-nec-superux${UNAME_RELEASE}
|
echo sx4-nec-superux${UNAME_RELEASE}
|
||||||
exit ;;
|
exit ;;
|
||||||
@@ -1243,6 +1238,16 @@ EOF
|
|||||||
*:Darwin:*:*)
|
*:Darwin:*:*)
|
||||||
UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
|
UNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown
|
||||||
case $UNAME_PROCESSOR in
|
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 ;;
|
unknown) UNAME_PROCESSOR=powerpc ;;
|
||||||
esac
|
esac
|
||||||
echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
|
echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
|
||||||
@@ -1258,7 +1263,10 @@ EOF
|
|||||||
*:QNX:*:4*)
|
*:QNX:*:4*)
|
||||||
echo i386-pc-qnx
|
echo i386-pc-qnx
|
||||||
exit ;;
|
exit ;;
|
||||||
NSE-?:NONSTOP_KERNEL:*:*)
|
NEO-?:NONSTOP_KERNEL:*:*)
|
||||||
|
echo neo-tandem-nsk${UNAME_RELEASE}
|
||||||
|
exit ;;
|
||||||
|
NSE-*:NONSTOP_KERNEL:*:*)
|
||||||
echo nse-tandem-nsk${UNAME_RELEASE}
|
echo nse-tandem-nsk${UNAME_RELEASE}
|
||||||
exit ;;
|
exit ;;
|
||||||
NSR-?:NONSTOP_KERNEL:*:*)
|
NSR-?:NONSTOP_KERNEL:*:*)
|
||||||
@@ -1303,13 +1311,13 @@ EOF
|
|||||||
echo pdp10-unknown-its
|
echo pdp10-unknown-its
|
||||||
exit ;;
|
exit ;;
|
||||||
SEI:*:*:SEIUX)
|
SEI:*:*:SEIUX)
|
||||||
echo mips-sei-seiux${UNAME_RELEASE}
|
echo mips-sei-seiux${UNAME_RELEASE}
|
||||||
exit ;;
|
exit ;;
|
||||||
*:DragonFly:*:*)
|
*:DragonFly:*:*)
|
||||||
echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
|
echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
|
||||||
exit ;;
|
exit ;;
|
||||||
*:*VMS:*:*)
|
*:*VMS:*:*)
|
||||||
UNAME_MACHINE=`(uname -p) 2>/dev/null`
|
UNAME_MACHINE=`(uname -p) 2>/dev/null`
|
||||||
case "${UNAME_MACHINE}" in
|
case "${UNAME_MACHINE}" in
|
||||||
A*) echo alpha-dec-vms ; exit ;;
|
A*) echo alpha-dec-vms ; exit ;;
|
||||||
I*) echo ia64-dec-vms ; exit ;;
|
I*) echo ia64-dec-vms ; exit ;;
|
||||||
@@ -1324,11 +1332,14 @@ EOF
|
|||||||
i*86:rdos:*:*)
|
i*86:rdos:*:*)
|
||||||
echo ${UNAME_MACHINE}-pc-rdos
|
echo ${UNAME_MACHINE}-pc-rdos
|
||||||
exit ;;
|
exit ;;
|
||||||
|
i*86:AROS:*:*)
|
||||||
|
echo ${UNAME_MACHINE}-pc-aros
|
||||||
|
exit ;;
|
||||||
|
x86_64:VMkernel:*:*)
|
||||||
|
echo ${UNAME_MACHINE}-unknown-esx
|
||||||
|
exit ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
#echo '(No uname command or uname output not recognized.)' 1>&2
|
|
||||||
#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
|
|
||||||
|
|
||||||
eval $set_cc_for_build
|
eval $set_cc_for_build
|
||||||
cat >$dummy.c <<EOF
|
cat >$dummy.c <<EOF
|
||||||
#ifdef _SEQUENT_
|
#ifdef _SEQUENT_
|
||||||
@@ -1346,11 +1357,11 @@ main ()
|
|||||||
#include <sys/param.h>
|
#include <sys/param.h>
|
||||||
printf ("m68k-sony-newsos%s\n",
|
printf ("m68k-sony-newsos%s\n",
|
||||||
#ifdef NEWSOS4
|
#ifdef NEWSOS4
|
||||||
"4"
|
"4"
|
||||||
#else
|
#else
|
||||||
""
|
""
|
||||||
#endif
|
#endif
|
||||||
); exit (0);
|
); exit (0);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
284
config.sub
vendored
284
config.sub
vendored
@@ -1,10 +1,10 @@
|
|||||||
#! /bin/sh
|
#! /bin/sh
|
||||||
# Configuration validation subroutine script.
|
# Configuration validation subroutine script.
|
||||||
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
|
||||||
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
|
# 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
|
||||||
# Free Software Foundation, Inc.
|
# 2011, 2012 Free Software Foundation, Inc.
|
||||||
|
|
||||||
timestamp='2008-01-16'
|
timestamp='2012-08-18'
|
||||||
|
|
||||||
# This file is (in principle) common to ALL GNU software.
|
# This file is (in principle) common to ALL GNU software.
|
||||||
# The presence of a machine in this file suggests that SOME 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.
|
# GNU General Public License for more details.
|
||||||
#
|
#
|
||||||
# You should have received a copy of the GNU General Public License
|
# You should have received a copy of the GNU General Public License
|
||||||
# along with this program; if not, write to the Free Software
|
# along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||||||
# Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
|
|
||||||
# 02110-1301, USA.
|
|
||||||
#
|
#
|
||||||
# As a special exception to the GNU General Public License, if you
|
# As a special exception to the GNU General Public License, if you
|
||||||
# distribute this file as part of a program that contains a
|
# 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
|
# 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.
|
# Configuration subroutine to validate and canonicalize a configuration type.
|
||||||
# Supply the specified configuration type as an argument.
|
# Supply the specified configuration type as an argument.
|
||||||
# If it is invalid, we print an error message on stderr and exit with code 1.
|
# 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.
|
# 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
|
# This file is supposed to be the same for all GNU packages
|
||||||
# and recognize all the CPU types, system types and aliases
|
# and recognize all the CPU types, system types and aliases
|
||||||
# that are meaningful with *any* GNU software.
|
# that are meaningful with *any* GNU software.
|
||||||
@@ -72,8 +73,9 @@ Report bugs and patches to <config-patches@gnu.org>."
|
|||||||
version="\
|
version="\
|
||||||
GNU config.sub ($timestamp)
|
GNU config.sub ($timestamp)
|
||||||
|
|
||||||
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001,
|
Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
|
||||||
2002, 2003, 2004, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
|
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
|
This is free software; see the source for copying conditions. There is NO
|
||||||
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
|
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.
|
# Here we must recognize all the valid KERNEL-OS combinations.
|
||||||
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
|
maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
|
||||||
case $maybe_os in
|
case $maybe_os in
|
||||||
nto-qnx* | linux-gnu* | linux-dietlibc | linux-newlib* | linux-uclibc* | \
|
nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
|
||||||
uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | \
|
linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
|
||||||
|
knetbsd*-gnu* | netbsd*-gnu* | \
|
||||||
|
kopensolaris*-gnu* | \
|
||||||
storm-chaos* | os2-emx* | rtmk-nova*)
|
storm-chaos* | os2-emx* | rtmk-nova*)
|
||||||
os=-$maybe_os
|
os=-$maybe_os
|
||||||
basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
|
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/-[^-]*$//'`
|
basic_machine=`echo $1 | sed 's/-[^-]*$//'`
|
||||||
if [ $basic_machine != $1 ]
|
if [ $basic_machine != $1 ]
|
||||||
@@ -148,10 +156,13 @@ case $os in
|
|||||||
-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
|
-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
|
||||||
-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
|
-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
|
||||||
-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
|
-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
|
||||||
-apple | -axis | -knuth | -cray)
|
-apple | -axis | -knuth | -cray | -microblaze)
|
||||||
os=
|
os=
|
||||||
basic_machine=$1
|
basic_machine=$1
|
||||||
;;
|
;;
|
||||||
|
-bluegene*)
|
||||||
|
os=-cnk
|
||||||
|
;;
|
||||||
-sim | -cisco | -oki | -wec | -winbond)
|
-sim | -cisco | -oki | -wec | -winbond)
|
||||||
os=
|
os=
|
||||||
basic_machine=$1
|
basic_machine=$1
|
||||||
@@ -166,10 +177,10 @@ case $os in
|
|||||||
os=-chorusos
|
os=-chorusos
|
||||||
basic_machine=$1
|
basic_machine=$1
|
||||||
;;
|
;;
|
||||||
-chorusrdb)
|
-chorusrdb)
|
||||||
os=-chorusrdb
|
os=-chorusrdb
|
||||||
basic_machine=$1
|
basic_machine=$1
|
||||||
;;
|
;;
|
||||||
-hiux*)
|
-hiux*)
|
||||||
os=-hiuxwe2
|
os=-hiuxwe2
|
||||||
;;
|
;;
|
||||||
@@ -214,6 +225,12 @@ case $os in
|
|||||||
-isc*)
|
-isc*)
|
||||||
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
|
||||||
;;
|
;;
|
||||||
|
-lynx*178)
|
||||||
|
os=-lynxos178
|
||||||
|
;;
|
||||||
|
-lynx*5)
|
||||||
|
os=-lynxos5
|
||||||
|
;;
|
||||||
-lynx*)
|
-lynx*)
|
||||||
os=-lynxos
|
os=-lynxos
|
||||||
;;
|
;;
|
||||||
@@ -238,24 +255,32 @@ case $basic_machine in
|
|||||||
# Some are omitted here because they have special meanings below.
|
# Some are omitted here because they have special meanings below.
|
||||||
1750a | 580 \
|
1750a | 580 \
|
||||||
| a29k \
|
| a29k \
|
||||||
|
| aarch64 | aarch64_be \
|
||||||
| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
|
| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \
|
||||||
| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
|
| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \
|
||||||
| am33_2.0 \
|
| am33_2.0 \
|
||||||
| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
|
| arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr | avr32 \
|
||||||
|
| be32 | be64 \
|
||||||
| bfin \
|
| bfin \
|
||||||
| c4x | clipper \
|
| c4x | clipper \
|
||||||
| d10v | d30v | dlx | dsp16xx \
|
| d10v | d30v | dlx | dsp16xx \
|
||||||
|
| epiphany \
|
||||||
| fido | fr30 | frv \
|
| fido | fr30 | frv \
|
||||||
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
|
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
|
||||||
|
| hexagon \
|
||||||
| i370 | i860 | i960 | ia64 \
|
| i370 | i860 | i960 | ia64 \
|
||||||
| ip2k | iq2000 \
|
| ip2k | iq2000 \
|
||||||
|
| le32 | le64 \
|
||||||
|
| lm32 \
|
||||||
| m32c | m32r | m32rle | m68000 | m68k | m88k \
|
| m32c | m32r | m32rle | m68000 | m68k | m88k \
|
||||||
| maxq | mb | microblaze | mcore | mep \
|
| maxq | mb | microblaze | mcore | mep | metag \
|
||||||
| mips | mipsbe | mipseb | mipsel | mipsle \
|
| mips | mipsbe | mipseb | mipsel | mipsle \
|
||||||
| mips16 \
|
| mips16 \
|
||||||
| mips64 | mips64el \
|
| mips64 | mips64el \
|
||||||
| mips64vr | mips64vrel \
|
| mips64octeon | mips64octeonel \
|
||||||
| mips64orion | mips64orionel \
|
| mips64orion | mips64orionel \
|
||||||
|
| mips64r5900 | mips64r5900el \
|
||||||
|
| mips64vr | mips64vrel \
|
||||||
| mips64vr4100 | mips64vr4100el \
|
| mips64vr4100 | mips64vr4100el \
|
||||||
| mips64vr4300 | mips64vr4300el \
|
| mips64vr4300 | mips64vr4300el \
|
||||||
| mips64vr5000 | mips64vr5000el \
|
| mips64vr5000 | mips64vr5000el \
|
||||||
@@ -268,29 +293,42 @@ case $basic_machine in
|
|||||||
| mipsisa64sr71k | mipsisa64sr71kel \
|
| mipsisa64sr71k | mipsisa64sr71kel \
|
||||||
| mipstx39 | mipstx39el \
|
| mipstx39 | mipstx39el \
|
||||||
| mn10200 | mn10300 \
|
| mn10200 | mn10300 \
|
||||||
|
| moxie \
|
||||||
| mt \
|
| mt \
|
||||||
| msp430 \
|
| msp430 \
|
||||||
|
| nds32 | nds32le | nds32be \
|
||||||
| nios | nios2 \
|
| nios | nios2 \
|
||||||
| ns16k | ns32k \
|
| ns16k | ns32k \
|
||||||
|
| open8 \
|
||||||
| or32 \
|
| or32 \
|
||||||
| pdp10 | pdp11 | pj | pjl \
|
| pdp10 | pdp11 | pj | pjl \
|
||||||
| powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \
|
| powerpc | powerpc64 | powerpc64le | powerpcle \
|
||||||
| pyramid \
|
| pyramid \
|
||||||
|
| rl78 | rx \
|
||||||
| score \
|
| 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 \
|
| sh64 | sh64le \
|
||||||
| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
|
| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
|
||||||
| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
|
| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
|
||||||
| spu | strongarm \
|
| spu \
|
||||||
| tahoe | thumb | tic4x | tic80 | tron \
|
| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
|
||||||
| v850 | v850e \
|
| ubicom32 \
|
||||||
|
| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
|
||||||
| we32k \
|
| we32k \
|
||||||
| x86 | xc16x | xscale | xscalee[bl] | xstormy16 | xtensa \
|
| x86 | xc16x | xstormy16 | xtensa \
|
||||||
| z8k)
|
| z8k | z80)
|
||||||
basic_machine=$basic_machine-unknown
|
basic_machine=$basic_machine-unknown
|
||||||
;;
|
;;
|
||||||
m6811 | m68hc11 | m6812 | m68hc12)
|
c54x)
|
||||||
# Motorola 68HC11/12.
|
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
|
basic_machine=$basic_machine-unknown
|
||||||
os=-none
|
os=-none
|
||||||
;;
|
;;
|
||||||
@@ -300,6 +338,21 @@ case $basic_machine in
|
|||||||
basic_machine=mt-unknown
|
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'
|
# We use `pc' rather than `unknown'
|
||||||
# because (1) that's what they normally are, and
|
# because (1) that's what they normally are, and
|
||||||
# (2) the word "unknown" tends to confuse beginning users.
|
# (2) the word "unknown" tends to confuse beginning users.
|
||||||
@@ -314,29 +367,36 @@ case $basic_machine in
|
|||||||
# Recognize the basic CPU types with company name.
|
# Recognize the basic CPU types with company name.
|
||||||
580-* \
|
580-* \
|
||||||
| a29k-* \
|
| a29k-* \
|
||||||
|
| aarch64-* | aarch64_be-* \
|
||||||
| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
|
| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \
|
||||||
| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
|
| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \
|
||||||
| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
|
| alphapca5[67]-* | alpha64pca5[67]-* | arc-* \
|
||||||
| arm-* | armbe-* | armle-* | armeb-* | armv*-* \
|
| arm-* | armbe-* | armle-* | armeb-* | armv*-* \
|
||||||
| avr-* | avr32-* \
|
| avr-* | avr32-* \
|
||||||
|
| be32-* | be64-* \
|
||||||
| bfin-* | bs2000-* \
|
| bfin-* | bs2000-* \
|
||||||
| c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \
|
| c[123]* | c30-* | [cjt]90-* | c4x-* \
|
||||||
| clipper-* | craynv-* | cydra-* \
|
| clipper-* | craynv-* | cydra-* \
|
||||||
| d10v-* | d30v-* | dlx-* \
|
| d10v-* | d30v-* | dlx-* \
|
||||||
| elxsi-* \
|
| elxsi-* \
|
||||||
| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
|
| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
|
||||||
| h8300-* | h8500-* \
|
| h8300-* | h8500-* \
|
||||||
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
|
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
|
||||||
|
| hexagon-* \
|
||||||
| i*86-* | i860-* | i960-* | ia64-* \
|
| i*86-* | i860-* | i960-* | ia64-* \
|
||||||
| ip2k-* | iq2000-* \
|
| ip2k-* | iq2000-* \
|
||||||
|
| le32-* | le64-* \
|
||||||
|
| lm32-* \
|
||||||
| m32c-* | m32r-* | m32rle-* \
|
| m32c-* | m32r-* | m32rle-* \
|
||||||
| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
|
| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \
|
||||||
| m88110-* | m88k-* | maxq-* | mcore-* \
|
| m88110-* | m88k-* | maxq-* | mcore-* | metag-* | microblaze-* \
|
||||||
| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
|
| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \
|
||||||
| mips16-* \
|
| mips16-* \
|
||||||
| mips64-* | mips64el-* \
|
| mips64-* | mips64el-* \
|
||||||
| mips64vr-* | mips64vrel-* \
|
| mips64octeon-* | mips64octeonel-* \
|
||||||
| mips64orion-* | mips64orionel-* \
|
| mips64orion-* | mips64orionel-* \
|
||||||
|
| mips64r5900-* | mips64r5900el-* \
|
||||||
|
| mips64vr-* | mips64vrel-* \
|
||||||
| mips64vr4100-* | mips64vr4100el-* \
|
| mips64vr4100-* | mips64vr4100el-* \
|
||||||
| mips64vr4300-* | mips64vr4300el-* \
|
| mips64vr4300-* | mips64vr4300el-* \
|
||||||
| mips64vr5000-* | mips64vr5000el-* \
|
| mips64vr5000-* | mips64vr5000el-* \
|
||||||
@@ -351,27 +411,32 @@ case $basic_machine in
|
|||||||
| mmix-* \
|
| mmix-* \
|
||||||
| mt-* \
|
| mt-* \
|
||||||
| msp430-* \
|
| msp430-* \
|
||||||
|
| nds32-* | nds32le-* | nds32be-* \
|
||||||
| nios-* | nios2-* \
|
| nios-* | nios2-* \
|
||||||
| none-* | np1-* | ns16k-* | ns32k-* \
|
| none-* | np1-* | ns16k-* | ns32k-* \
|
||||||
|
| open8-* \
|
||||||
| orion-* \
|
| orion-* \
|
||||||
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
|
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
|
||||||
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \
|
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
|
||||||
| pyramid-* \
|
| pyramid-* \
|
||||||
| romp-* | rs6000-* \
|
| rl78-* | romp-* | rs6000-* | rx-* \
|
||||||
| sh-* | sh[1234]-* | sh[24]a-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
|
| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
|
||||||
| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
|
| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
|
||||||
| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
|
| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
|
||||||
| sparclite-* \
|
| sparclite-* \
|
||||||
| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | strongarm-* | sv1-* | sx?-* \
|
| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
|
||||||
| tahoe-* | thumb-* \
|
| tahoe-* \
|
||||||
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
|
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
|
||||||
|
| tile*-* \
|
||||||
| tron-* \
|
| tron-* \
|
||||||
| v850-* | v850e-* | vax-* \
|
| ubicom32-* \
|
||||||
|
| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
|
||||||
|
| vax-* \
|
||||||
| we32k-* \
|
| we32k-* \
|
||||||
| x86-* | x86_64-* | xc16x-* | xps100-* | xscale-* | xscalee[bl]-* \
|
| x86-* | x86_64-* | xc16x-* | xps100-* \
|
||||||
| xstormy16-* | xtensa*-* \
|
| xstormy16-* | xtensa*-* \
|
||||||
| ymp-* \
|
| ymp-* \
|
||||||
| z8k-*)
|
| z8k-* | z80-*)
|
||||||
;;
|
;;
|
||||||
# Recognize the basic CPU types without company name, with glob match.
|
# Recognize the basic CPU types without company name, with glob match.
|
||||||
xtensa*)
|
xtensa*)
|
||||||
@@ -393,7 +458,7 @@ case $basic_machine in
|
|||||||
basic_machine=a29k-amd
|
basic_machine=a29k-amd
|
||||||
os=-udi
|
os=-udi
|
||||||
;;
|
;;
|
||||||
abacus)
|
abacus)
|
||||||
basic_machine=abacus-unknown
|
basic_machine=abacus-unknown
|
||||||
;;
|
;;
|
||||||
adobe68k)
|
adobe68k)
|
||||||
@@ -439,6 +504,10 @@ case $basic_machine in
|
|||||||
basic_machine=m68k-apollo
|
basic_machine=m68k-apollo
|
||||||
os=-bsd
|
os=-bsd
|
||||||
;;
|
;;
|
||||||
|
aros)
|
||||||
|
basic_machine=i386-pc
|
||||||
|
os=-aros
|
||||||
|
;;
|
||||||
aux)
|
aux)
|
||||||
basic_machine=m68k-apple
|
basic_machine=m68k-apple
|
||||||
os=-aux
|
os=-aux
|
||||||
@@ -455,10 +524,27 @@ case $basic_machine in
|
|||||||
basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
|
basic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||||
os=-linux
|
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)
|
c90)
|
||||||
basic_machine=c90-cray
|
basic_machine=c90-cray
|
||||||
os=-unicos
|
os=-unicos
|
||||||
;;
|
;;
|
||||||
|
cegcc)
|
||||||
|
basic_machine=arm-unknown
|
||||||
|
os=-cegcc
|
||||||
|
;;
|
||||||
convex-c1)
|
convex-c1)
|
||||||
basic_machine=c1-convex
|
basic_machine=c1-convex
|
||||||
os=-bsd
|
os=-bsd
|
||||||
@@ -487,7 +573,7 @@ case $basic_machine in
|
|||||||
basic_machine=craynv-cray
|
basic_machine=craynv-cray
|
||||||
os=-unicosmp
|
os=-unicosmp
|
||||||
;;
|
;;
|
||||||
cr16)
|
cr16 | cr16-*)
|
||||||
basic_machine=cr16-unknown
|
basic_machine=cr16-unknown
|
||||||
os=-elf
|
os=-elf
|
||||||
;;
|
;;
|
||||||
@@ -526,6 +612,10 @@ case $basic_machine in
|
|||||||
basic_machine=m88k-motorola
|
basic_machine=m88k-motorola
|
||||||
os=-sysv3
|
os=-sysv3
|
||||||
;;
|
;;
|
||||||
|
dicos)
|
||||||
|
basic_machine=i686-pc
|
||||||
|
os=-dicos
|
||||||
|
;;
|
||||||
djgpp)
|
djgpp)
|
||||||
basic_machine=i586-pc
|
basic_machine=i586-pc
|
||||||
os=-msdosdjgpp
|
os=-msdosdjgpp
|
||||||
@@ -641,7 +731,6 @@ case $basic_machine in
|
|||||||
i370-ibm* | ibm*)
|
i370-ibm* | ibm*)
|
||||||
basic_machine=i370-ibm
|
basic_machine=i370-ibm
|
||||||
;;
|
;;
|
||||||
# I'm not sure what "Sysv32" means. Should this be sysv3.2?
|
|
||||||
i*86v32)
|
i*86v32)
|
||||||
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
|
||||||
os=-sysv32
|
os=-sysv32
|
||||||
@@ -699,6 +788,13 @@ case $basic_machine in
|
|||||||
basic_machine=ns32k-utek
|
basic_machine=ns32k-utek
|
||||||
os=-sysv
|
os=-sysv
|
||||||
;;
|
;;
|
||||||
|
microblaze)
|
||||||
|
basic_machine=microblaze-xilinx
|
||||||
|
;;
|
||||||
|
mingw64)
|
||||||
|
basic_machine=x86_64-pc
|
||||||
|
os=-mingw64
|
||||||
|
;;
|
||||||
mingw32)
|
mingw32)
|
||||||
basic_machine=i386-pc
|
basic_machine=i386-pc
|
||||||
os=-mingw32
|
os=-mingw32
|
||||||
@@ -735,10 +831,18 @@ case $basic_machine in
|
|||||||
ms1-*)
|
ms1-*)
|
||||||
basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
|
basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`
|
||||||
;;
|
;;
|
||||||
|
msys)
|
||||||
|
basic_machine=i386-pc
|
||||||
|
os=-msys
|
||||||
|
;;
|
||||||
mvs)
|
mvs)
|
||||||
basic_machine=i370-ibm
|
basic_machine=i370-ibm
|
||||||
os=-mvs
|
os=-mvs
|
||||||
;;
|
;;
|
||||||
|
nacl)
|
||||||
|
basic_machine=le32-unknown
|
||||||
|
os=-nacl
|
||||||
|
;;
|
||||||
ncr3000)
|
ncr3000)
|
||||||
basic_machine=i486-ncr
|
basic_machine=i486-ncr
|
||||||
os=-sysv4
|
os=-sysv4
|
||||||
@@ -803,6 +907,12 @@ case $basic_machine in
|
|||||||
np1)
|
np1)
|
||||||
basic_machine=np1-gould
|
basic_machine=np1-gould
|
||||||
;;
|
;;
|
||||||
|
neo-tandem)
|
||||||
|
basic_machine=neo-tandem
|
||||||
|
;;
|
||||||
|
nse-tandem)
|
||||||
|
basic_machine=nse-tandem
|
||||||
|
;;
|
||||||
nsr-tandem)
|
nsr-tandem)
|
||||||
basic_machine=nsr-tandem
|
basic_machine=nsr-tandem
|
||||||
;;
|
;;
|
||||||
@@ -885,9 +995,10 @@ case $basic_machine in
|
|||||||
;;
|
;;
|
||||||
power) basic_machine=power-ibm
|
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)
|
ppcle | powerpclittle | ppc-le | powerpc-little)
|
||||||
basic_machine=powerpcle-unknown
|
basic_machine=powerpcle-unknown
|
||||||
@@ -981,6 +1092,9 @@ case $basic_machine in
|
|||||||
basic_machine=i860-stratus
|
basic_machine=i860-stratus
|
||||||
os=-sysv4
|
os=-sysv4
|
||||||
;;
|
;;
|
||||||
|
strongarm-* | thumb-*)
|
||||||
|
basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`
|
||||||
|
;;
|
||||||
sun2)
|
sun2)
|
||||||
basic_machine=m68000-sun
|
basic_machine=m68000-sun
|
||||||
;;
|
;;
|
||||||
@@ -1037,20 +1151,8 @@ case $basic_machine in
|
|||||||
basic_machine=t90-cray
|
basic_machine=t90-cray
|
||||||
os=-unicos
|
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*)
|
tile*)
|
||||||
basic_machine=tile-unknown
|
basic_machine=$basic_machine-unknown
|
||||||
os=-linux-gnu
|
os=-linux-gnu
|
||||||
;;
|
;;
|
||||||
tx39)
|
tx39)
|
||||||
@@ -1120,6 +1222,9 @@ case $basic_machine in
|
|||||||
xps | xps100)
|
xps | xps100)
|
||||||
basic_machine=xps100-honeywell
|
basic_machine=xps100-honeywell
|
||||||
;;
|
;;
|
||||||
|
xscale-* | xscalee[bl]-*)
|
||||||
|
basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`
|
||||||
|
;;
|
||||||
ymp)
|
ymp)
|
||||||
basic_machine=ymp-cray
|
basic_machine=ymp-cray
|
||||||
os=-unicos
|
os=-unicos
|
||||||
@@ -1128,6 +1233,10 @@ case $basic_machine in
|
|||||||
basic_machine=z8k-unknown
|
basic_machine=z8k-unknown
|
||||||
os=-sim
|
os=-sim
|
||||||
;;
|
;;
|
||||||
|
z80-*-coff)
|
||||||
|
basic_machine=z80-unknown
|
||||||
|
os=-sim
|
||||||
|
;;
|
||||||
none)
|
none)
|
||||||
basic_machine=none-none
|
basic_machine=none-none
|
||||||
os=-none
|
os=-none
|
||||||
@@ -1166,7 +1275,7 @@ case $basic_machine in
|
|||||||
we32k)
|
we32k)
|
||||||
basic_machine=we32k-att
|
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
|
basic_machine=sh-unknown
|
||||||
;;
|
;;
|
||||||
sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
|
sparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)
|
||||||
@@ -1213,9 +1322,12 @@ esac
|
|||||||
if [ x"$os" != x"" ]
|
if [ x"$os" != x"" ]
|
||||||
then
|
then
|
||||||
case $os in
|
case $os in
|
||||||
# First match some system type aliases
|
# First match some system type aliases
|
||||||
# that might get confused with valid system types.
|
# that might get confused with valid system types.
|
||||||
# -solaris* is a basic system type, with this one exception.
|
# -solaris* is a basic system type, with this one exception.
|
||||||
|
-auroraux)
|
||||||
|
os=-auroraux
|
||||||
|
;;
|
||||||
-solaris1 | -solaris1.*)
|
-solaris1 | -solaris1.*)
|
||||||
os=`echo $os | sed -e 's|solaris1|sunos4|'`
|
os=`echo $os | sed -e 's|solaris1|sunos4|'`
|
||||||
;;
|
;;
|
||||||
@@ -1236,21 +1348,23 @@ case $os in
|
|||||||
# Each alternative MUST END IN A *, to match a version number.
|
# Each alternative MUST END IN A *, to match a version number.
|
||||||
# -sysv* is not here because it comes later, after sysvr4.
|
# -sysv* is not here because it comes later, after sysvr4.
|
||||||
-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
|
-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
|
||||||
| -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
|
| -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\
|
||||||
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
|
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
|
||||||
|
| -sym* | -kopensolaris* \
|
||||||
| -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
|
| -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
|
||||||
| -aos* \
|
| -aos* | -aros* \
|
||||||
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
|
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
|
||||||
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
|
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
|
||||||
| -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
|
| -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
|
||||||
| -openbsd* | -solidbsd* \
|
| -bitrig* | -openbsd* | -solidbsd* \
|
||||||
| -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
|
| -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \
|
||||||
| -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
|
| -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \
|
||||||
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
|
| -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
|
||||||
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
|
| -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
|
||||||
| -chorusos* | -chorusrdb* \
|
| -chorusos* | -chorusrdb* | -cegcc* \
|
||||||
| -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
|
| -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
|
||||||
| -mingw32* | -linux-gnu* | -linux-newlib* | -linux-uclibc* \
|
| -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
|
||||||
|
| -linux-newlib* | -linux-musl* | -linux-uclibc* \
|
||||||
| -uxpv* | -beos* | -mpeix* | -udk* \
|
| -uxpv* | -beos* | -mpeix* | -udk* \
|
||||||
| -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
|
| -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
|
||||||
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
|
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
|
||||||
@@ -1258,7 +1372,7 @@ case $os in
|
|||||||
| -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
|
| -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
|
||||||
| -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
|
| -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
|
||||||
| -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
|
| -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.
|
# Remember, each alternative MUST END IN *, to match a version number.
|
||||||
;;
|
;;
|
||||||
-qnx*)
|
-qnx*)
|
||||||
@@ -1297,7 +1411,7 @@ case $os in
|
|||||||
-opened*)
|
-opened*)
|
||||||
os=-openedition
|
os=-openedition
|
||||||
;;
|
;;
|
||||||
-os400*)
|
-os400*)
|
||||||
os=-os400
|
os=-os400
|
||||||
;;
|
;;
|
||||||
-wince*)
|
-wince*)
|
||||||
@@ -1346,7 +1460,7 @@ case $os in
|
|||||||
-sinix*)
|
-sinix*)
|
||||||
os=-sysv4
|
os=-sysv4
|
||||||
;;
|
;;
|
||||||
-tpf*)
|
-tpf*)
|
||||||
os=-tpf
|
os=-tpf
|
||||||
;;
|
;;
|
||||||
-triton*)
|
-triton*)
|
||||||
@@ -1388,6 +1502,11 @@ case $os in
|
|||||||
-zvmoe)
|
-zvmoe)
|
||||||
os=-zvmoe
|
os=-zvmoe
|
||||||
;;
|
;;
|
||||||
|
-dicos*)
|
||||||
|
os=-dicos
|
||||||
|
;;
|
||||||
|
-nacl*)
|
||||||
|
;;
|
||||||
-none)
|
-none)
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
@@ -1410,10 +1529,10 @@ else
|
|||||||
# system, and we'll never get to this point.
|
# system, and we'll never get to this point.
|
||||||
|
|
||||||
case $basic_machine in
|
case $basic_machine in
|
||||||
score-*)
|
score-*)
|
||||||
os=-elf
|
os=-elf
|
||||||
;;
|
;;
|
||||||
spu-*)
|
spu-*)
|
||||||
os=-elf
|
os=-elf
|
||||||
;;
|
;;
|
||||||
*-acorn)
|
*-acorn)
|
||||||
@@ -1425,8 +1544,20 @@ case $basic_machine in
|
|||||||
arm*-semi)
|
arm*-semi)
|
||||||
os=-aout
|
os=-aout
|
||||||
;;
|
;;
|
||||||
c4x-* | tic4x-*)
|
c4x-* | tic4x-*)
|
||||||
os=-coff
|
os=-coff
|
||||||
|
;;
|
||||||
|
hexagon-*)
|
||||||
|
os=-elf
|
||||||
|
;;
|
||||||
|
tic54x-*)
|
||||||
|
os=-coff
|
||||||
|
;;
|
||||||
|
tic55x-*)
|
||||||
|
os=-coff
|
||||||
|
;;
|
||||||
|
tic6x-*)
|
||||||
|
os=-coff
|
||||||
;;
|
;;
|
||||||
# This must come before the *-dec entry.
|
# This must come before the *-dec entry.
|
||||||
pdp10-*)
|
pdp10-*)
|
||||||
@@ -1446,14 +1577,11 @@ case $basic_machine in
|
|||||||
;;
|
;;
|
||||||
m68000-sun)
|
m68000-sun)
|
||||||
os=-sunos3
|
os=-sunos3
|
||||||
# This also exists in the configure program, but was not the
|
|
||||||
# default.
|
|
||||||
# os=-sunos4
|
|
||||||
;;
|
;;
|
||||||
m68*-cisco)
|
m68*-cisco)
|
||||||
os=-aout
|
os=-aout
|
||||||
;;
|
;;
|
||||||
mep-*)
|
mep-*)
|
||||||
os=-elf
|
os=-elf
|
||||||
;;
|
;;
|
||||||
mips*-cisco)
|
mips*-cisco)
|
||||||
@@ -1480,7 +1608,7 @@ case $basic_machine in
|
|||||||
*-ibm)
|
*-ibm)
|
||||||
os=-aix
|
os=-aix
|
||||||
;;
|
;;
|
||||||
*-knuth)
|
*-knuth)
|
||||||
os=-mmixware
|
os=-mmixware
|
||||||
;;
|
;;
|
||||||
*-wec)
|
*-wec)
|
||||||
@@ -1585,7 +1713,7 @@ case $basic_machine in
|
|||||||
-sunos*)
|
-sunos*)
|
||||||
vendor=sun
|
vendor=sun
|
||||||
;;
|
;;
|
||||||
-aix*)
|
-cnk*|-aix*)
|
||||||
vendor=ibm
|
vendor=ibm
|
||||||
;;
|
;;
|
||||||
-beos*)
|
-beos*)
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#
|
#
|
||||||
# ngIRCd -- The Next Generation IRC Daemon
|
# ngIRCd -- The Next Generation IRC Daemon
|
||||||
# Copyright (c)2001-2010 Alexander Barton <alex@barton.de>
|
# Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
@@ -9,46 +9,60 @@
|
|||||||
# Please read the file COPYING, README and AUTHORS for more information.
|
# Please read the file COPYING, README and AUTHORS for more information.
|
||||||
#
|
#
|
||||||
|
|
||||||
define(VERSION_ID,esyscmd(git describe|sed -e 's/rel-//g'|sed -e 's/-/~/'|tr -d \\n))
|
define(VERSION_ID,esyscmd([
|
||||||
|
V=`git describe 2>/dev/null | sed -e 's/rel-//g' | sed -e 's/-/~/'`;
|
||||||
|
[ -z "$V" -a -r configure ] \
|
||||||
|
&& V=`grep "PACKAGE_STRING=" configure | cut -d"'" -f2 | cut -d' ' -f2`
|
||||||
|
( [ -n "$V" ] && echo "$V" || echo "??" ) | tr -d '\n';
|
||||||
|
]))
|
||||||
|
|
||||||
|
m4_ifdef([AM_SILENT_RULES],
|
||||||
|
[m4_define([ng_color_tests], [color-tests])],
|
||||||
|
[m4_define([ng_color_tests], [])])
|
||||||
|
|
||||||
# -- Initialisation --
|
# -- Initialisation --
|
||||||
|
|
||||||
AC_PREREQ(2.50)
|
AC_PREREQ([2.61])
|
||||||
AC_INIT(ngircd, VERSION_ID)
|
AC_INIT([ngIRCd], VERSION_ID,
|
||||||
AC_CONFIG_SRCDIR(src/ngircd/ngircd.c)
|
[ngircd-ml@ngircd.barton.de], [ngircd], [http://ngircd.barton.de/])
|
||||||
AC_CANONICAL_TARGET
|
|
||||||
AM_INIT_AUTOMAKE(1.6)
|
AC_CONFIG_SRCDIR([src/ngircd/ngircd.c])
|
||||||
AM_CONFIG_HEADER(src/config.h)
|
AC_CONFIG_HEADER([src/config.h])
|
||||||
|
AC_CANONICAL_HOST
|
||||||
|
|
||||||
|
AM_INIT_AUTOMAKE([-Wall 1.10 ]ng_color_tests)
|
||||||
|
|
||||||
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
|
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
|
||||||
|
|
||||||
# -- Templates for config.h --
|
# -- Templates for config.h --
|
||||||
|
|
||||||
AH_TEMPLATE([DEBUG], [Define if debug-mode should be enabled])
|
AH_TEMPLATE([DEBUG], [Define if debug-mode should be enabled])
|
||||||
|
AH_TEMPLATE([HAVE_sockaddr_in_len], [Define if sockaddr_in.sin_len exists])
|
||||||
AH_TEMPLATE([HAVE_socklen_t], [Define if socklen_t exists])
|
AH_TEMPLATE([HAVE_socklen_t], [Define if socklen_t exists])
|
||||||
|
AH_TEMPLATE([ICONV], [Define if libiconv can be used, e.g. for CHARCONV])
|
||||||
|
AH_TEMPLATE([IDENTAUTH], [Define if the server should do IDENT requests])
|
||||||
|
AH_TEMPLATE([IRCPLUS], [Define if IRC+ protocol should be used])
|
||||||
|
AH_TEMPLATE([PAM], [Define if PAM should be used])
|
||||||
AH_TEMPLATE([SNIFFER], [Define if IRC sniffer should be enabled])
|
AH_TEMPLATE([SNIFFER], [Define if IRC sniffer should be enabled])
|
||||||
AH_TEMPLATE([STRICT_RFC], [Define if ngIRCd should behave strict RFC compliant])
|
AH_TEMPLATE([STRICT_RFC], [Define if ngIRCd should behave strict RFC compliant])
|
||||||
AH_TEMPLATE([SYSLOG], [Define if syslog should be used for logging])
|
AH_TEMPLATE([SYSLOG], [Define if syslog should be used for logging])
|
||||||
AH_TEMPLATE([ZLIB], [Define if zlib compression should be enabled])
|
|
||||||
AH_TEMPLATE([TCPWRAP], [Define if TCP wrappers should be used])
|
AH_TEMPLATE([TCPWRAP], [Define if TCP wrappers should be used])
|
||||||
AH_TEMPLATE([IRCPLUS], [Define if IRC+ protocol should be used])
|
|
||||||
AH_TEMPLATE([WANT_IPV6], [Define if IPV6 protocol should be enabled])
|
AH_TEMPLATE([WANT_IPV6], [Define if IPV6 protocol should be enabled])
|
||||||
AH_TEMPLATE([IDENTAUTH], [Define if the server should do IDENT requests])
|
AH_TEMPLATE([ZLIB], [Define if zlib compression should be enabled])
|
||||||
AH_TEMPLATE([PAM], [Define if PAM should be used])
|
|
||||||
AH_TEMPLATE([HAVE_sockaddr_in_len], [Define if sockaddr_in.sin_len exists])
|
|
||||||
|
|
||||||
AH_TEMPLATE([TARGET_OS], [Target operating system name])
|
AH_TEMPLATE([HOST_OS], [Target operating system name])
|
||||||
AH_TEMPLATE([TARGET_VENDOR], [Target system vendor])
|
AH_TEMPLATE([HOST_VENDOR], [Target system vendor])
|
||||||
AH_TEMPLATE([TARGET_CPU], [Target CPU name])
|
AH_TEMPLATE([HOST_CPU], [Target CPU name])
|
||||||
|
|
||||||
# -- C Compiler --
|
# -- C Compiler --
|
||||||
|
|
||||||
AC_PROG_CC
|
AC_PROG_CC
|
||||||
AC_PROG_CC_STDC
|
AC_PROG_CC_STDC
|
||||||
AC_C_PROTOTYPES
|
|
||||||
|
|
||||||
# -- Helper programs --
|
# -- Helper programs --
|
||||||
|
|
||||||
|
m4_ifdef([AM_PROG_AR], [AM_PROG_AR])
|
||||||
|
|
||||||
AC_PROG_AWK
|
AC_PROG_AWK
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
AC_PROG_LN_S
|
AC_PROG_LN_S
|
||||||
@@ -57,9 +71,9 @@ AC_PROG_RANLIB
|
|||||||
|
|
||||||
# -- Compiler Features --
|
# -- Compiler Features --
|
||||||
|
|
||||||
AM_C_PROTOTYPES
|
|
||||||
AC_C_CONST
|
AC_C_CONST
|
||||||
AC_C_INLINE
|
AC_C_INLINE
|
||||||
|
__ng_PROTOTYPES__
|
||||||
|
|
||||||
# -- Hard coded system and compiler dependencies/features/options ... --
|
# -- Hard coded system and compiler dependencies/features/options ... --
|
||||||
|
|
||||||
@@ -85,7 +99,7 @@ if test "$GCC" = "yes"; then
|
|||||||
GCC_STACK_PROTECT_CC
|
GCC_STACK_PROTECT_CC
|
||||||
fi
|
fi
|
||||||
|
|
||||||
case "$target_os" in
|
case "$host_os" in
|
||||||
hpux*)
|
hpux*)
|
||||||
# This is HP/UX, we need to define _XOPEN_SOURCE_EXTENDED
|
# This is HP/UX, we need to define _XOPEN_SOURCE_EXTENDED
|
||||||
# (tested with HP/UX 11.11)
|
# (tested with HP/UX 11.11)
|
||||||
@@ -101,28 +115,20 @@ CFLAGS="$CFLAGS -DSYSCONFDIR='\"\$(sysconfdir)\"'"
|
|||||||
# -- Headers --
|
# -- Headers --
|
||||||
|
|
||||||
AC_HEADER_STDC
|
AC_HEADER_STDC
|
||||||
AC_HEADER_TIME
|
|
||||||
AC_HEADER_SYS_WAIT
|
AC_HEADER_SYS_WAIT
|
||||||
|
AC_HEADER_TIME
|
||||||
|
|
||||||
|
# Required header files
|
||||||
AC_CHECK_HEADERS([ \
|
AC_CHECK_HEADERS([ \
|
||||||
ctype.h errno.h fcntl.h netdb.h netinet/in.h netinet/in_systm.h \
|
fcntl.h netdb.h netinet/in.h stdlib.h string.h \
|
||||||
stdlib.h string.h strings.h sys/socket.h sys/time.h unistd.h \
|
strings.h sys/socket.h sys/time.h unistd.h \
|
||||||
],,AC_MSG_ERROR([required C header missing!]))
|
],,AC_MSG_ERROR([required C header missing!]))
|
||||||
|
|
||||||
AC_CHECK_HEADERS([ \
|
# Optional header files
|
||||||
arpa/inet.h ctype.h malloc.h netinet/ip.h stdbool.h stddef.h varargs.h \
|
AC_CHECK_HEADERS_ONCE([ \
|
||||||
],[],[],[[
|
arpa/inet.h inttypes.h malloc.h netinet/in_systm.h netinet/ip.h \
|
||||||
#ifdef HAVE_SYS_TYPES_H
|
stdbool.h stddef.h stdint.h varargs.h \
|
||||||
#include <sys/types.h>
|
])
|
||||||
#endif
|
|
||||||
#ifdef HAVE_SYS_SOCKET_H
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#endif
|
|
||||||
#ifdef HAVE_NETINET_IN_H
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#endif
|
|
||||||
]]
|
|
||||||
)
|
|
||||||
|
|
||||||
# -- Datatypes --
|
# -- Datatypes --
|
||||||
|
|
||||||
@@ -139,31 +145,50 @@ AC_TRY_COMPILE([
|
|||||||
AC_MSG_RESULT(no)
|
AC_MSG_RESULT(no)
|
||||||
])
|
])
|
||||||
|
|
||||||
|
AC_TYPE_PID_T
|
||||||
AC_TYPE_SIGNAL
|
AC_TYPE_SIGNAL
|
||||||
AC_TYPE_SIZE_T
|
AC_TYPE_SIZE_T
|
||||||
|
AC_TYPE_SSIZE_T
|
||||||
|
AC_TYPE_UID_T
|
||||||
|
AC_TYPE_UINT16_T
|
||||||
|
AC_TYPE_UINT32_T
|
||||||
|
AC_TYPE_UINT8_T
|
||||||
|
|
||||||
AC_CHECK_MEMBER([struct sockaddr_in.sin_len], AC_DEFINE(HAVE_sockaddr_in_len),,
|
AC_CHECK_MEMBER([struct sockaddr_in.sin_len], AC_DEFINE(HAVE_sockaddr_in_len),,
|
||||||
[#include <arpa/inet.h>])
|
[#include <arpa/inet.h>])
|
||||||
|
|
||||||
# -- Libraries --
|
# -- Libraries --
|
||||||
|
|
||||||
# A/UX needs this.
|
# memmove: A/UX libUTIL
|
||||||
AC_CHECK_LIB(UTIL,memmove)
|
AC_SEARCH_LIBS([memmove], [UTIL], [], [
|
||||||
# needed on solaris. GNU libc also has a libnsl, but we do not need it.
|
AC_MSG_ERROR([unable to find the memmove() function])
|
||||||
AC_SEARCH_LIBS(gethostbyname,nsl)
|
])
|
||||||
AC_CHECK_LIB(socket,bind)
|
# gethostbyname: Solaris libnsl
|
||||||
|
AC_SEARCH_LIBS([gethostbyname], [bind nsl network], [], [
|
||||||
|
AC_MSG_ERROR([unable to find the gethostbyname() function])
|
||||||
|
])
|
||||||
|
# bind: SVR4 libsocket
|
||||||
|
AC_SEARCH_LIBS([bind], [socket network], [], [
|
||||||
|
AC_MSG_ERROR([unable to find the bind() function])
|
||||||
|
])
|
||||||
|
|
||||||
# -- Functions --
|
# -- Functions --
|
||||||
|
|
||||||
AC_FUNC_FORK
|
AC_FUNC_FORK
|
||||||
AC_FUNC_STRFTIME
|
AC_FUNC_STRFTIME
|
||||||
|
|
||||||
|
# Required functions
|
||||||
AC_CHECK_FUNCS([ \
|
AC_CHECK_FUNCS([ \
|
||||||
bind gethostbyaddr gethostbyname gethostname inet_ntoa \
|
alarm dup2 endpwent gethostbyaddr gethostbyname gethostname \
|
||||||
setsid setsockopt socket strcasecmp waitpid],,AC_MSG_ERROR([required function missing!]))
|
gettimeofday inet_ntoa memmove memset setsid socket strcasecmp \
|
||||||
|
strchr strcspn strerror strncasecmp strrchr strspn strstr \
|
||||||
|
],,
|
||||||
|
AC_MSG_ERROR([required function missing!]))
|
||||||
|
|
||||||
AC_CHECK_FUNCS(getaddrinfo getnameinfo inet_aton sigaction sigprocmask snprintf \
|
# Optional functions
|
||||||
vsnprintf strdup strlcpy strlcat strtok_r)
|
AC_CHECK_FUNCS_ONCE([ \
|
||||||
|
gai_strerror getaddrinfo getnameinfo inet_aton sigaction sigprocmask \
|
||||||
|
snprintf vsnprintf strdup strlcpy strlcat strtok_r waitpid])
|
||||||
|
|
||||||
# -- Configuration options --
|
# -- Configuration options --
|
||||||
|
|
||||||
@@ -171,22 +196,20 @@ AC_CHECK_FUNCS(getaddrinfo getnameinfo inet_aton sigaction sigprocmask snprintf
|
|||||||
|
|
||||||
x_syslog_on=no
|
x_syslog_on=no
|
||||||
AC_ARG_WITH(syslog,
|
AC_ARG_WITH(syslog,
|
||||||
[ --without-syslog disable syslog (autodetected by default)],
|
AS_HELP_STRING([--without-syslog],
|
||||||
|
[disable syslog (autodetected by default)]),
|
||||||
[ if test "$withval" != "no"; then
|
[ if test "$withval" != "no"; then
|
||||||
if test "$withval" != "yes"; then
|
if test "$withval" != "yes"; then
|
||||||
CFLAGS="-I$withval/include $CFLAGS"
|
CFLAGS="-I$withval/include $CFLAGS"
|
||||||
CPPFLAGS="-I$withval/include $CPPFLAGS"
|
CPPFLAGS="-I$withval/include $CPPFLAGS"
|
||||||
LDFLAGS="-L$withval/lib $LDFLAGS"
|
LDFLAGS="-L$withval/lib $LDFLAGS"
|
||||||
fi
|
fi
|
||||||
AC_CHECK_LIB(be, syslog)
|
AC_SEARCH_LIBS([syslog], [be], [x_syslog_on=yes], [
|
||||||
AC_CHECK_FUNCS(syslog, x_syslog_on=yes,
|
|
||||||
AC_MSG_ERROR([Can't enable syslog!])
|
AC_MSG_ERROR([Can't enable syslog!])
|
||||||
)
|
])
|
||||||
fi
|
fi
|
||||||
],
|
],
|
||||||
[
|
[ AC_SEARCH_LIBS([syslog], [be], [x_syslog_on=yes])
|
||||||
AC_CHECK_LIB(be, syslog)
|
|
||||||
AC_CHECK_FUNCS(syslog, x_syslog_on=yes)
|
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
if test "$x_syslog_on" = "yes"; then
|
if test "$x_syslog_on" = "yes"; then
|
||||||
@@ -198,7 +221,8 @@ fi
|
|||||||
|
|
||||||
x_zlib_on=no
|
x_zlib_on=no
|
||||||
AC_ARG_WITH(zlib,
|
AC_ARG_WITH(zlib,
|
||||||
[ --without-zlib disable zlib compression (autodetected by default)],
|
AS_HELP_STRING([--without-zlib],
|
||||||
|
[disable zlib compression (autodetected by default)]),
|
||||||
[ if test "$withval" != "no"; then
|
[ if test "$withval" != "no"; then
|
||||||
if test "$withval" != "yes"; then
|
if test "$withval" != "yes"; then
|
||||||
CFLAGS="-I$withval/include $CFLAGS"
|
CFLAGS="-I$withval/include $CFLAGS"
|
||||||
@@ -225,7 +249,8 @@ fi
|
|||||||
x_io_backend=none
|
x_io_backend=none
|
||||||
|
|
||||||
AC_ARG_WITH(select,
|
AC_ARG_WITH(select,
|
||||||
[ --without-select disable select IO support (autodetected by default)],
|
AS_HELP_STRING([--without-select],
|
||||||
|
[disable select IO support (autodetected by default)]),
|
||||||
[ if test "$withval" != "no"; then
|
[ if test "$withval" != "no"; then
|
||||||
if test "$withval" != "yes"; then
|
if test "$withval" != "yes"; then
|
||||||
CFLAGS="-I$withval/include $CFLAGS"
|
CFLAGS="-I$withval/include $CFLAGS"
|
||||||
@@ -243,25 +268,35 @@ AC_ARG_WITH(select,
|
|||||||
)
|
)
|
||||||
|
|
||||||
AC_ARG_WITH(poll,
|
AC_ARG_WITH(poll,
|
||||||
[ --without-poll disable poll support (autodetected by default)],
|
AS_HELP_STRING([--without-poll],
|
||||||
|
[disable poll support (autodetected by default)]),
|
||||||
[ if test "$withval" != "no"; then
|
[ if test "$withval" != "no"; then
|
||||||
if test "$withval" != "yes"; then
|
if test "$withval" != "yes"; then
|
||||||
CFLAGS="-I$withval/include $CFLAGS"
|
CFLAGS="-I$withval/include $CFLAGS"
|
||||||
CPPFLAGS="-I$withval/include $CPPFLAGS"
|
CPPFLAGS="-I$withval/include $CPPFLAGS"
|
||||||
LDFLAGS="-L$withval/lib $LDFLAGS"
|
LDFLAGS="-L$withval/lib $LDFLAGS"
|
||||||
fi
|
fi
|
||||||
AC_CHECK_FUNCS(poll, x_io_backend=poll\(\),
|
AC_CHECK_FUNCS(poll, [
|
||||||
|
AC_CHECK_HEADERS(poll.h,
|
||||||
|
x_io_backend=poll\(\),
|
||||||
|
AC_MSG_ERROR(
|
||||||
|
[Can't enable poll IO support!])
|
||||||
|
)
|
||||||
|
], [
|
||||||
AC_MSG_ERROR([Can't enable poll IO support!])
|
AC_MSG_ERROR([Can't enable poll IO support!])
|
||||||
)
|
])
|
||||||
fi
|
fi
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
AC_CHECK_FUNCS(poll, x_io_backend=poll\(\))
|
AC_CHECK_FUNCS(poll, [
|
||||||
|
AC_CHECK_HEADERS(poll.h, x_io_backend=poll\(\))
|
||||||
|
])
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
AC_ARG_WITH(devpoll,
|
AC_ARG_WITH(devpoll,
|
||||||
[ --without-devpoll disable /dev/poll IO support (autodetected by default)],
|
AS_HELP_STRING([--without-devpoll],
|
||||||
|
[disable /dev/poll IO support (autodetected by default)]),
|
||||||
[ if test "$withval" != "no"; then
|
[ if test "$withval" != "no"; then
|
||||||
if test "$withval" != "yes"; then
|
if test "$withval" != "yes"; then
|
||||||
CFLAGS="-I$withval/include $CFLAGS"
|
CFLAGS="-I$withval/include $CFLAGS"
|
||||||
@@ -278,7 +313,8 @@ AC_ARG_WITH(devpoll,
|
|||||||
)
|
)
|
||||||
|
|
||||||
AC_ARG_WITH(epoll,
|
AC_ARG_WITH(epoll,
|
||||||
[ --without-epoll disable epoll IO support (autodetected by default)],
|
AS_HELP_STRING([--without-epoll],
|
||||||
|
[disable epoll IO support (autodetected by default)]),
|
||||||
[ if test "$withval" != "no"; then
|
[ if test "$withval" != "no"; then
|
||||||
if test "$withval" != "yes"; then
|
if test "$withval" != "yes"; then
|
||||||
CFLAGS="-I$withval/include $CFLAGS"
|
CFLAGS="-I$withval/include $CFLAGS"
|
||||||
@@ -296,7 +332,8 @@ AC_ARG_WITH(epoll,
|
|||||||
)
|
)
|
||||||
|
|
||||||
AC_ARG_WITH(kqueue,
|
AC_ARG_WITH(kqueue,
|
||||||
[ --without-kqueue disable kqueue IO support (autodetected by default)],
|
AS_HELP_STRING([--without-kqueue],
|
||||||
|
[disable kqueue IO support (autodetected by default)]),
|
||||||
[ if test "$withval" != "no"; then
|
[ if test "$withval" != "no"; then
|
||||||
if test "$withval" != "yes"; then
|
if test "$withval" != "yes"; then
|
||||||
CFLAGS="-I$withval/include $CFLAGS"
|
CFLAGS="-I$withval/include $CFLAGS"
|
||||||
@@ -330,13 +367,14 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if test "$x_io_backend" = "none"; then
|
if test "$x_io_backend" = "none"; then
|
||||||
AC_MSG_ERROR([No useabe IO API activated/found!?])
|
AC_MSG_ERROR([No useable IO API activated/found!?])
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# use SSL?
|
# use SSL?
|
||||||
|
|
||||||
AC_ARG_WITH(openssl,
|
AC_ARG_WITH(openssl,
|
||||||
[ --with-openssl enable SSL support using OpenSSL],
|
AS_HELP_STRING([--with-openssl],
|
||||||
|
[enable SSL support using OpenSSL]),
|
||||||
[ if test "$withval" != "no"; then
|
[ if test "$withval" != "no"; then
|
||||||
if test "$withval" != "yes"; then
|
if test "$withval" != "yes"; then
|
||||||
CFLAGS="-I$withval/include $CFLAGS"
|
CFLAGS="-I$withval/include $CFLAGS"
|
||||||
@@ -353,7 +391,8 @@ AC_ARG_WITH(openssl,
|
|||||||
)
|
)
|
||||||
|
|
||||||
AC_ARG_WITH(gnutls,
|
AC_ARG_WITH(gnutls,
|
||||||
[ --with-gnutls enable SSL support using gnutls],
|
AS_HELP_STRING([--with-gnutls],
|
||||||
|
[enable SSL support using gnutls]),
|
||||||
[ if test "$withval" != "no"; then
|
[ if test "$withval" != "no"; then
|
||||||
if test "$withval" != "yes"; then
|
if test "$withval" != "yes"; then
|
||||||
CFLAGS="-I$withval/include $CFLAGS"
|
CFLAGS="-I$withval/include $CFLAGS"
|
||||||
@@ -383,7 +422,8 @@ fi
|
|||||||
|
|
||||||
x_tcpwrap_on=no
|
x_tcpwrap_on=no
|
||||||
AC_ARG_WITH(tcp-wrappers,
|
AC_ARG_WITH(tcp-wrappers,
|
||||||
[ --with-tcp-wrappers enable TCP wrappers support],
|
AS_HELP_STRING([--with-tcp-wrappers],
|
||||||
|
[enable TCP wrappers support]),
|
||||||
[ if test "$withval" != "no"; then
|
[ if test "$withval" != "no"; then
|
||||||
if test "$withval" != "yes"; then
|
if test "$withval" != "yes"; then
|
||||||
CFLAGS="-I$withval/include $CFLAGS"
|
CFLAGS="-I$withval/include $CFLAGS"
|
||||||
@@ -414,7 +454,8 @@ int deny_severity = 0;
|
|||||||
|
|
||||||
x_identauth_on=no
|
x_identauth_on=no
|
||||||
AC_ARG_WITH(ident,
|
AC_ARG_WITH(ident,
|
||||||
[ --with-ident enable "IDENT" ("AUTH") protocol support],
|
AS_HELP_STRING([--with-ident],
|
||||||
|
[enable "IDENT" ("AUTH") protocol support]),
|
||||||
[ if test "$withval" != "no"; then
|
[ if test "$withval" != "no"; then
|
||||||
if test "$withval" != "yes"; then
|
if test "$withval" != "yes"; then
|
||||||
CFLAGS="-I$withval/include $CFLAGS"
|
CFLAGS="-I$withval/include $CFLAGS"
|
||||||
@@ -437,7 +478,8 @@ fi
|
|||||||
|
|
||||||
x_pam_on=no
|
x_pam_on=no
|
||||||
AC_ARG_WITH(pam,
|
AC_ARG_WITH(pam,
|
||||||
[ --with-pam enable user authentication using PAM],
|
AS_HELP_STRING([--with-pam],
|
||||||
|
[enable user authentication using PAM]),
|
||||||
[ if test "$withval" != "no"; then
|
[ if test "$withval" != "no"; then
|
||||||
if test "$withval" != "yes"; then
|
if test "$withval" != "yes"; then
|
||||||
CFLAGS="-I$withval/include $CFLAGS"
|
CFLAGS="-I$withval/include $CFLAGS"
|
||||||
@@ -464,17 +506,42 @@ fi
|
|||||||
|
|
||||||
x_ircplus_on=yes
|
x_ircplus_on=yes
|
||||||
AC_ARG_ENABLE(ircplus,
|
AC_ARG_ENABLE(ircplus,
|
||||||
[ --disable-ircplus disable IRC+ protocol],
|
AS_HELP_STRING([--disable-ircplus],
|
||||||
|
[disable IRC+ protocol]),
|
||||||
if test "$enableval" = "no"; then x_ircplus_on=no; fi
|
if test "$enableval" = "no"; then x_ircplus_on=no; fi
|
||||||
)
|
)
|
||||||
if test "$x_ircplus_on" = "yes"; then
|
if test "$x_ircplus_on" = "yes"; then
|
||||||
AC_DEFINE(IRCPLUS, 1)
|
AC_DEFINE(IRCPLUS, 1)
|
||||||
|
|
||||||
|
# Compile in iconv support?
|
||||||
|
# We only check for it when IRC+ is enabled, because the IRC+ command
|
||||||
|
# CHARCONV is the only function depending on it.
|
||||||
|
x_iconv_on=no
|
||||||
|
AC_ARG_WITH(iconv,
|
||||||
|
[ --with-iconv enable character conversation using libiconv],
|
||||||
|
[ if test "$withval" != "no"; then
|
||||||
|
if test "$withval" != "yes"; then
|
||||||
|
CFLAGS="-I$withval/include $CFLAGS"
|
||||||
|
CPPFLAGS="-I$withval/include $CPPFLAGS"
|
||||||
|
LDFLAGS="-L$withval/lib $LDFLAGS"
|
||||||
|
fi
|
||||||
|
AC_CHECK_LIB(iconv, iconv_open)
|
||||||
|
AC_CHECK_FUNCS(iconv_open, x_iconv_on=yes,
|
||||||
|
AC_MSG_ERROR([Can't enable libiconv support!])
|
||||||
|
)
|
||||||
|
fi
|
||||||
|
]
|
||||||
|
)
|
||||||
|
if test "$x_iconv_on" = "yes"; then
|
||||||
|
AC_DEFINE(ICONV, 1)
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# enable support for IPv6?
|
# enable support for IPv6?
|
||||||
x_ipv6_on=no
|
x_ipv6_on=no
|
||||||
AC_ARG_ENABLE(ipv6,
|
AC_ARG_ENABLE(ipv6,
|
||||||
[ --enable-ipv6 enable IPv6 protocol support],
|
AS_HELP_STRING([--enable-ipv6],
|
||||||
|
[enable IPv6 protocol support]),
|
||||||
if test "$enableval" = "yes"; then x_ipv6_on=yes; fi
|
if test "$enableval" = "yes"; then x_ipv6_on=yes; fi
|
||||||
)
|
)
|
||||||
if test "$x_ipv6_on" = "yes"; then
|
if test "$x_ipv6_on" = "yes"; then
|
||||||
@@ -490,7 +557,8 @@ fi
|
|||||||
|
|
||||||
x_sniffer_on=no; x_debug_on=no
|
x_sniffer_on=no; x_debug_on=no
|
||||||
AC_ARG_ENABLE(sniffer,
|
AC_ARG_ENABLE(sniffer,
|
||||||
[ --enable-sniffer enable IRC traffic sniffer (enables debug mode)],
|
AS_HELP_STRING([--enable-sniffer],
|
||||||
|
[enable IRC traffic sniffer (enables debug mode)]),
|
||||||
if test "$enableval" = "yes"; then
|
if test "$enableval" = "yes"; then
|
||||||
AC_DEFINE(SNIFFER, 1)
|
AC_DEFINE(SNIFFER, 1)
|
||||||
x_sniffer_on=yes; x_debug_on=yes
|
x_sniffer_on=yes; x_debug_on=yes
|
||||||
@@ -500,7 +568,8 @@ AC_ARG_ENABLE(sniffer,
|
|||||||
# enable additional debugging code?
|
# enable additional debugging code?
|
||||||
|
|
||||||
AC_ARG_ENABLE(debug,
|
AC_ARG_ENABLE(debug,
|
||||||
[ --enable-debug show additional debug output],
|
AS_HELP_STRING([--enable-debug],
|
||||||
|
[show additional debug output]),
|
||||||
if test "$enableval" = "yes"; then x_debug_on=yes; fi
|
if test "$enableval" = "yes"; then x_debug_on=yes; fi
|
||||||
)
|
)
|
||||||
if test "$x_debug_on" = "yes"; then
|
if test "$x_debug_on" = "yes"; then
|
||||||
@@ -513,7 +582,8 @@ fi
|
|||||||
|
|
||||||
x_strict_rfc_on=no
|
x_strict_rfc_on=no
|
||||||
AC_ARG_ENABLE(strict-rfc,
|
AC_ARG_ENABLE(strict-rfc,
|
||||||
[ --enable-strict-rfc strict RFC conformance -- may break clients!],
|
AS_HELP_STRING([--enable-strict-rfc],
|
||||||
|
[strict RFC conformance -- may break clients!]),
|
||||||
if test "$enableval" = "yes"; then
|
if test "$enableval" = "yes"; then
|
||||||
AC_DEFINE(STRICT_RFC, 1)
|
AC_DEFINE(STRICT_RFC, 1)
|
||||||
x_strict_rfc_on=yes
|
x_strict_rfc_on=yes
|
||||||
@@ -522,9 +592,9 @@ AC_ARG_ENABLE(strict-rfc,
|
|||||||
|
|
||||||
# -- Definitions --
|
# -- Definitions --
|
||||||
|
|
||||||
AC_DEFINE_UNQUOTED(TARGET_CPU, "$target_cpu" )
|
AC_DEFINE_UNQUOTED(HOST_CPU, "$host_cpu" )
|
||||||
AC_DEFINE_UNQUOTED(TARGET_VENDOR, "$target_vendor" )
|
AC_DEFINE_UNQUOTED(HOST_VENDOR, "$host_vendor" )
|
||||||
AC_DEFINE_UNQUOTED(TARGET_OS, "$target_os" )
|
AC_DEFINE_UNQUOTED(HOST_OS, "$host_os" )
|
||||||
|
|
||||||
# Add additional CFLAGS, eventually specified on the command line, but after
|
# Add additional CFLAGS, eventually specified on the command line, but after
|
||||||
# running this configure script. Useful for "-Werror" for example.
|
# running this configure script. Useful for "-Werror" for example.
|
||||||
@@ -532,24 +602,26 @@ test -n "$CFLAGS_END" && CFLAGS="$CFLAGS $CFLAGS_END"
|
|||||||
|
|
||||||
# -- Generate files --
|
# -- Generate files --
|
||||||
|
|
||||||
AC_OUTPUT([ \
|
AC_CONFIG_FILES([ \
|
||||||
Makefile \
|
Makefile \
|
||||||
doc/Makefile \
|
|
||||||
doc/src/Makefile \
|
|
||||||
src/Makefile \
|
|
||||||
src/portab/Makefile \
|
|
||||||
src/ipaddr/Makefile \
|
|
||||||
src/tool/Makefile \
|
|
||||||
src/ngircd/Makefile \
|
|
||||||
src/testsuite/Makefile \
|
|
||||||
man/Makefile \
|
|
||||||
contrib/Makefile \
|
|
||||||
contrib/Debian/Makefile \
|
contrib/Debian/Makefile \
|
||||||
contrib/MacOSX/Makefile \
|
contrib/MacOSX/Makefile \
|
||||||
contrib/MacOSX/ngIRCd.xcodeproj/Makefile \
|
|
||||||
contrib/MacOSX/ngIRCd.pmdoc/Makefile \
|
contrib/MacOSX/ngIRCd.pmdoc/Makefile \
|
||||||
|
contrib/MacOSX/ngIRCd.xcodeproj/Makefile \
|
||||||
|
contrib/Makefile \
|
||||||
|
doc/Makefile \
|
||||||
|
doc/src/Makefile \
|
||||||
|
man/Makefile \
|
||||||
|
src/ipaddr/Makefile \
|
||||||
|
src/Makefile \
|
||||||
|
src/ngircd/Makefile \
|
||||||
|
src/portab/Makefile \
|
||||||
|
src/testsuite/Makefile \
|
||||||
|
src/tool/Makefile \
|
||||||
])
|
])
|
||||||
|
|
||||||
|
AC_OUTPUT
|
||||||
|
|
||||||
type dpkg >/dev/null 2>&1
|
type dpkg >/dev/null 2>&1
|
||||||
if test $? -eq 0; then
|
if test $? -eq 0; then
|
||||||
# Generate debian/ link if the dpkg command exists
|
# Generate debian/ link if the dpkg command exists
|
||||||
@@ -571,8 +643,7 @@ C=`eval echo ${sysconfdir}` ; C=`eval echo ${C}`
|
|||||||
M=`eval echo ${mandir}` ; M=`eval echo ${M}`
|
M=`eval echo ${mandir}` ; M=`eval echo ${M}`
|
||||||
D=`eval echo ${docdir}` ; D=`eval echo ${D}`
|
D=`eval echo ${docdir}` ; D=`eval echo ${D}`
|
||||||
|
|
||||||
echo " Target: ${target}"
|
echo " Host: ${host}"
|
||||||
test "$target" != "$host" && echo " Host: ${host}"
|
|
||||||
echo " Compiler: ${CC}"
|
echo " Compiler: ${CC}"
|
||||||
test -n "$CFLAGS" && echo " Compiler flags: ${CFLAGS}"
|
test -n "$CFLAGS" && echo " Compiler flags: ${CFLAGS}"
|
||||||
test -n "$CPPFLAGS" && echo " Preprocessor flags: ${CPPFLAGS}"
|
test -n "$CPPFLAGS" && echo " Preprocessor flags: ${CPPFLAGS}"
|
||||||
@@ -635,6 +706,18 @@ test "$x_pam_on" = "yes" \
|
|||||||
echo $ECHO_N " SSL support: $ECHO_C"
|
echo $ECHO_N " SSL support: $ECHO_C"
|
||||||
echo "$x_ssl_lib"
|
echo "$x_ssl_lib"
|
||||||
|
|
||||||
|
echo $ECHO_N " libiconv support: $ECHO_C"
|
||||||
|
echo "$x_iconv_on"
|
||||||
|
|
||||||
echo
|
echo
|
||||||
|
|
||||||
|
define(_automake_regex_,[[^AUTOMAKE_OPTIONS = [a-z .\-]*/portab/ansi2knr]])
|
||||||
|
if ! grep "_automake_regex_" src/ngircd/Makefile.am >/dev/null 2>&1; then
|
||||||
|
echo "WARNING:"
|
||||||
|
echo "This GNU automake generated build system does not support \"de-ANSI-fication\","
|
||||||
|
echo "therefore don't use it to generate \"official\" distribution archives!"
|
||||||
|
echo "(Most probably you want to use GNU automake 1.11.x for this purpose ...)"
|
||||||
|
echo
|
||||||
|
fi
|
||||||
|
|
||||||
# -eof-
|
# -eof-
|
||||||
@@ -1,3 +1,75 @@
|
|||||||
|
ngircd (20.3-0ab1) unstable; urgency=high
|
||||||
|
|
||||||
|
* New "upstream" release, fixing a security related bug: ngIRCd 20.3.
|
||||||
|
|
||||||
|
-- Alexander Barton <alex@barton.de> Fri, 23 Aug 2013 21:53:21 +0200
|
||||||
|
|
||||||
|
ngircd (20.2-0ab1) unstable; urgency=high
|
||||||
|
|
||||||
|
* New "upstream" release, fixing a security related bug: ngIRCd 20.2.
|
||||||
|
|
||||||
|
-- Alexander Barton <alex@barton.de> Fri, 15 Feb 2013 12:17:00 +0100
|
||||||
|
|
||||||
|
ngircd (20.1-0ab1) unstable; urgency=low
|
||||||
|
|
||||||
|
* New "upstream" release: ngIRCd 20.1.
|
||||||
|
|
||||||
|
-- Alexander Barton <alex@barton.de> Wed, 02 Jan 2013 22:37:26 +0100
|
||||||
|
|
||||||
|
ngircd (20-0ab1) unstable; urgency=low
|
||||||
|
|
||||||
|
* New "upstream" release: ngIRCd 20.
|
||||||
|
|
||||||
|
-- Alexander Barton <alex@barton.de> Mon, 17 Dec 2012 13:04:15 +0100
|
||||||
|
|
||||||
|
ngircd (20~rc2-0ab1) unstable; urgency=low
|
||||||
|
|
||||||
|
* New "upstream" release candidate 2 for ngIRCd Release 20.
|
||||||
|
|
||||||
|
-- Alexander Barton <alex@barton.de> Sun, 02 Dec 2012 18:51:06 +0100
|
||||||
|
|
||||||
|
ngircd (20~rc1-0ab1) unstable; urgency=low
|
||||||
|
|
||||||
|
* New "upstream" release candidate 1 for ngIRCd Release 20.
|
||||||
|
|
||||||
|
-- Alexander Barton <alex@barton.de> Sun, 11 Nov 2012 16:03:32 +0100
|
||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
-- Alexander Barton <alex@barton.de> Sun, 12 Feb 2012 17:47:51 +0100
|
||||||
|
|
||||||
|
ngircd (18-0ab1) unstable; urgency=low
|
||||||
|
|
||||||
|
* New "upstream" release: ngIRCd 18.
|
||||||
|
|
||||||
|
-- Alexander Barton <alex@barton.de> Sun, 10 Jul 2011 20:03:20 +0200
|
||||||
|
|
||||||
ngircd (18~rc2-0ab1) unstable; urgency=low
|
ngircd (18~rc2-0ab1) unstable; urgency=low
|
||||||
|
|
||||||
* New "upstream" release candidate 2 for ngIRCd Release 18.
|
* New "upstream" release candidate 2 for ngIRCd Release 18.
|
||||||
|
|||||||
@@ -2,64 +2,60 @@ Source: ngircd
|
|||||||
Section: net
|
Section: net
|
||||||
Priority: optional
|
Priority: optional
|
||||||
Maintainer: Alexander Barton <alex@barton.de>
|
Maintainer: Alexander Barton <alex@barton.de>
|
||||||
Build-Depends: debhelper (>> 4.0.0), libz-dev, libwrap0-dev, libident-dev, libgnutls-dev, libpam0g-dev
|
Build-Depends: debhelper (>> 4.0.0),
|
||||||
|
autotools-dev,
|
||||||
|
expect,
|
||||||
|
libz-dev,
|
||||||
|
libwrap0-dev,
|
||||||
|
libident-dev,
|
||||||
|
libgnutls-dev,
|
||||||
|
libpam0g-dev,
|
||||||
|
telnet | telnet-ssl,
|
||||||
Standards-Version: 3.9.1
|
Standards-Version: 3.9.1
|
||||||
|
|
||||||
Package: ngircd
|
Package: ngircd
|
||||||
Architecture: any
|
Architecture: any
|
||||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
Depends: ${shlibs:Depends}, ${misc:Depends}
|
||||||
Provides: ircd
|
Provides: ircd
|
||||||
Description: A lightweight daemon for the Internet Relay Chat (IRC)
|
Description: lightweight Internet Relay Chat server
|
||||||
ngIRCd is a free open source daemon for the Internet Relay Chat (IRC)
|
This package provides ngIRCd, a portable and lightweight Internet Relay
|
||||||
network. It is written from scratch and is not based upon the original
|
Chat server for small or private networks, developed under the GNU
|
||||||
IRCd like many others.
|
General Public License (GPL). It is simple to configure, can cope with
|
||||||
|
dynamic IP addresses, and supports IPv6 as well as SSL. It is written
|
||||||
|
from scratch and not based on the original IRCd.
|
||||||
.
|
.
|
||||||
This package contains the "standard distribution", including support for
|
This package contains the "standard distribution", including support for
|
||||||
syslog logging and compressed server-links using zlib. Please have a look
|
syslog logging and compressed server-links using zlib. Please have a look
|
||||||
at the "ngircd-full" package if you need advanced functionality like support
|
at the "ngircd-full" package if you need advanced functionality like support
|
||||||
for IPv6 or SSL.
|
for IPv6 or SSL.
|
||||||
.
|
|
||||||
Advantages of ngIRCd:
|
|
||||||
- no problems with servers using changing/non-static IP addresses.
|
|
||||||
- small and lean configuration file.
|
|
||||||
- free, modern and open source C code.
|
|
||||||
- still under active development.
|
|
||||||
.
|
|
||||||
ngIRCd is compatible to the "original" ircd 2.10.3p3, so you can run
|
|
||||||
mixed networks.
|
|
||||||
|
|
||||||
Package: ngircd-full
|
Package: ngircd-full
|
||||||
Architecture: any
|
Architecture: any
|
||||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
Depends: ${shlibs:Depends}, ${misc:Depends}
|
||||||
Provides: ircd
|
Provides: ircd
|
||||||
Conflicts: ngircd, ngircd-dbg
|
Conflicts: ngircd, ngircd-dbg
|
||||||
Description: A lightweight daemon for the Internet Relay Chat (IRC)
|
Description: lightweight Internet Relay Chat server
|
||||||
ngIRCd is a free open source daemon for the Internet Relay Chat (IRC)
|
This package provides ngIRCd, a portable and lightweight Internet Relay
|
||||||
network. It is written from scratch and is not based upon the original
|
Chat server for small or private networks, developed under the GNU
|
||||||
IRCd like many others.
|
General Public License (GPL). It is simple to configure, can cope with
|
||||||
|
dynamic IP addresses, and supports IPv6 as well as SSL. It is written
|
||||||
|
from scratch and not based on the original IRCd.
|
||||||
.
|
.
|
||||||
In addition to the features of the "standard package", this package
|
In addition to the features of the "standard package", this package
|
||||||
includes support for TCP wrappers, IDENT requests, the IPv6 protocol and
|
includes support for TCP wrappers, IDENT requests, the IPv6 protocol and
|
||||||
SSL encrypted client and server links.
|
SSL encrypted client and server links.
|
||||||
.
|
|
||||||
Advantages of ngIRCd:
|
|
||||||
- no problems with servers using changing/non-static IP addresses.
|
|
||||||
- small and lean configuration file.
|
|
||||||
- free, modern and open source C code.
|
|
||||||
- still under active development.
|
|
||||||
.
|
|
||||||
ngIRCd is compatible to the "original" ircd 2.10.3p3, so you can run
|
|
||||||
mixed networks.
|
|
||||||
|
|
||||||
Package: ngircd-full-dbg
|
Package: ngircd-full-dbg
|
||||||
Architecture: any
|
Architecture: any
|
||||||
Depends: ${shlibs:Depends}, ${misc:Depends}
|
Depends: ${shlibs:Depends}, ${misc:Depends}
|
||||||
Provides: ircd
|
Provides: ircd
|
||||||
Conflicts: ngircd, ngircd-full
|
Conflicts: ngircd, ngircd-full
|
||||||
Description: A lightweight daemon for the Internet Relay Chat (IRC)
|
Description: lightweight Internet Relay Chat server
|
||||||
ngIRCd is a free open source daemon for the Internet Relay Chat (IRC)
|
This package provides ngIRCd, a portable and lightweight Internet Relay
|
||||||
network. It is written from scratch and is not based upon the original
|
Chat server for small or private networks, developed under the GNU
|
||||||
IRCd like many others.
|
General Public License (GPL). It is simple to configure, can cope with
|
||||||
|
dynamic IP addresses, and supports IPv6 as well as SSL. It is written
|
||||||
|
from scratch and not based on the original IRCd.
|
||||||
.
|
.
|
||||||
In addition to the features of the "standard package", this package
|
In addition to the features of the "standard package", this package
|
||||||
includes support for TCP wrappers, IDENT requests, the IPv6 protocol and
|
includes support for TCP wrappers, IDENT requests, the IPv6 protocol and
|
||||||
@@ -67,12 +63,3 @@ Description: A lightweight daemon for the Internet Relay Chat (IRC)
|
|||||||
.
|
.
|
||||||
And in addition to the "full" variant, the binaries contained in this
|
And in addition to the "full" variant, the binaries contained in this
|
||||||
package are build with debug code and contain debug symbols.
|
package are build with debug code and contain debug symbols.
|
||||||
.
|
|
||||||
Advantages of ngIRCd:
|
|
||||||
- no problems with servers using changing/non-static IP addresses.
|
|
||||||
- small and lean configuration file.
|
|
||||||
- free, modern and open source C code.
|
|
||||||
- still under active development.
|
|
||||||
.
|
|
||||||
ngIRCd is compatible to the "original" ircd 2.10.3p3, so you can run
|
|
||||||
mixed networks.
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/make -f
|
#!/usr/bin/make -f
|
||||||
#
|
#
|
||||||
# ngIRCd -- The Next Generation IRC Daemon
|
# ngIRCd -- The Next Generation IRC Daemon
|
||||||
# Copyright (c)2001-2009 Alexander Barton <alex@barton.de>
|
# Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
@@ -53,7 +53,8 @@ configure-ngircd-full: configure
|
|||||||
--sysconfdir=/etc/ngircd \
|
--sysconfdir=/etc/ngircd \
|
||||||
--mandir=\$${prefix}/share/man \
|
--mandir=\$${prefix}/share/man \
|
||||||
--with-syslog --with-zlib \
|
--with-syslog --with-zlib \
|
||||||
--with-gnutls --with-ident --with-tcp-wrappers --with-pam \
|
--with-gnutls --with-iconv --with-ident --with-tcp-wrappers \
|
||||||
|
--with-pam \
|
||||||
--enable-ipv6
|
--enable-ipv6
|
||||||
|
|
||||||
configure-ngircd-full-dbg: configure
|
configure-ngircd-full-dbg: configure
|
||||||
@@ -66,7 +67,8 @@ configure-ngircd-full-dbg: configure
|
|||||||
--mandir=\$${prefix}/share/man \
|
--mandir=\$${prefix}/share/man \
|
||||||
--enable-debug --enable-sniffer \
|
--enable-debug --enable-sniffer \
|
||||||
--with-syslog --with-zlib \
|
--with-syslog --with-zlib \
|
||||||
--with-gnutls --with-ident --with-tcp-wrappers --with-pam \
|
--with-gnutls --with-iconv --with-ident --with-tcp-wrappers \
|
||||||
|
--with-pam \
|
||||||
--enable-ipv6
|
--enable-ipv6
|
||||||
|
|
||||||
build:
|
build:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2010 Alexander Barton (alex@barton.de).
|
* Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -11,7 +11,8 @@
|
|||||||
* Static configuration file for Mac OS X Xcode project
|
* Static configuration file for Mac OS X Xcode project
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define PACKAGE_NAME "ngircd"
|
#define PACKAGE_NAME "ngIRCd"
|
||||||
|
#define PACKAGE "ngircd"
|
||||||
#ifndef VERSION
|
#ifndef VERSION
|
||||||
#define VERSION "??("__DATE__")"
|
#define VERSION "??("__DATE__")"
|
||||||
#endif
|
#endif
|
||||||
@@ -51,6 +52,9 @@
|
|||||||
/* Define if PAM should be used */
|
/* Define if PAM should be used */
|
||||||
#define PAM 1
|
#define PAM 1
|
||||||
|
|
||||||
|
/* Define if libiconv can be used, e.g. for CHARCONV */
|
||||||
|
#define ICONV 1
|
||||||
|
|
||||||
/* -- Supported features -- */
|
/* -- Supported features -- */
|
||||||
|
|
||||||
/* Define if SSP C support is enabled. */
|
/* Define if SSP C support is enabled. */
|
||||||
@@ -74,6 +78,10 @@
|
|||||||
/* Define to 1 if you have the <netinet/ip.h> header file. */
|
/* Define to 1 if you have the <netinet/ip.h> header file. */
|
||||||
#define HAVE_NETINET_IP_H 1
|
#define HAVE_NETINET_IP_H 1
|
||||||
|
|
||||||
|
/* Define to 1 if you have the `gai_strerror' function. */
|
||||||
|
#define HAVE_GAI_STRERROR 1
|
||||||
|
/* Define to 1 if you have the `iconv_open' function. */
|
||||||
|
#define HAVE_ICONV_OPEN 1
|
||||||
/* Define to 1 if you have the `kqueue' function. */
|
/* Define to 1 if you have the `kqueue' function. */
|
||||||
#define HAVE_KQUEUE 1
|
#define HAVE_KQUEUE 1
|
||||||
/* Define to 1 if you have the `inet_ntoa' function. */
|
/* Define to 1 if you have the `inet_ntoa' function. */
|
||||||
@@ -96,6 +104,8 @@
|
|||||||
#define HAVE_GETNAMEINFO 1
|
#define HAVE_GETNAMEINFO 1
|
||||||
/* Define to 1 if you have the `sigaction' function. */
|
/* Define to 1 if you have the `sigaction' function. */
|
||||||
#define HAVE_SIGACTION 1
|
#define HAVE_SIGACTION 1
|
||||||
|
/* Define to 1 if you have the `setsid' function. */
|
||||||
|
#define HAVE_SETSID 1
|
||||||
|
|
||||||
/* Define if socklen_t exists */
|
/* Define if socklen_t exists */
|
||||||
#define HAVE_socklen_t 1
|
#define HAVE_socklen_t 1
|
||||||
@@ -103,10 +113,15 @@
|
|||||||
#ifdef PAM
|
#ifdef PAM
|
||||||
/* Define to 1 if you have the `pam_authenticate' function. */
|
/* Define to 1 if you have the `pam_authenticate' function. */
|
||||||
#define HAVE_PAM_AUTHENTICATE 1
|
#define HAVE_PAM_AUTHENTICATE 1
|
||||||
|
#if (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1060)
|
||||||
/* Define to 1 if you have the <pam/pam_appl.h> header file. */
|
/* Define to 1 if you have the <pam/pam_appl.h> header file. */
|
||||||
#define HAVE_PAM_PAM_APPL_H 1
|
#define HAVE_PAM_PAM_APPL_H 1
|
||||||
/* Mac OS X <10.6 doesn't have pam_fail_delay() */
|
/* Mac OS X <10.6 doesn't have pam_fail_delay() */
|
||||||
#define NO_PAM_FAIL_DELAY 1
|
#define NO_PAM_FAIL_DELAY 1
|
||||||
|
#else
|
||||||
|
/* Define to 1 if you have the <security/pam_appl.h> header file. */
|
||||||
|
#define HAVE_SECURITY_PAM_APPL_H 1
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* -eof- */
|
/* -eof- */
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\qc\pardirnatural
|
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\qc\pardirnatural
|
||||||
|
|
||||||
\f0\i\fs24 \cf0 ngIRCd -- The Next Generation IRC Daemon\
|
\f0\i\fs24 \cf0 ngIRCd -- The Next Generation IRC Daemon\
|
||||||
Copyright (c)2001-2011 Alexander Barton and Contributors.\
|
Copyright (c)2001-2013 Alexander Barton and Contributors.\
|
||||||
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural
|
\pard\tx566\tx1133\tx1700\tx2267\tx2834\tx3401\tx3968\tx4535\tx5102\tx5669\tx6236\tx6803\ql\qnatural\pardirnatural
|
||||||
|
|
||||||
\i0 \cf0 \
|
\i0 \cf0 \
|
||||||
@@ -156,7 +156,7 @@ Each version is given a distinguishing version number. If the Program specifies
|
|||||||
{\colortbl;\red255\green255\blue255;}
|
{\colortbl;\red255\green255\blue255;}
|
||||||
\pard\tx560\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\ql\qnatural\pardirnatural
|
\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
|
\pard\tx260\tx1120\tx1680\tx2240\tx2800\tx3360\tx3920\tx4480\tx5040\tx5600\tx6160\tx6720\li260\fi-260\ql\qnatural\pardirnatural
|
||||||
\cf0 \'95 You
|
\cf0 \'95 You
|
||||||
|
|||||||
2
contrib/MacOSX/ngIRCd.xcodeproj/.gitignore
vendored
2
contrib/MacOSX/ngIRCd.xcodeproj/.gitignore
vendored
@@ -1,2 +1,4 @@
|
|||||||
|
project.xcworkspace
|
||||||
|
xcuserdata
|
||||||
*.mode1v3
|
*.mode1v3
|
||||||
*.pbxuser
|
*.pbxuser
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
archiveVersion = 1;
|
archiveVersion = 1;
|
||||||
classes = {
|
classes = {
|
||||||
};
|
};
|
||||||
objectVersion = 44;
|
objectVersion = 46;
|
||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
@@ -36,10 +36,18 @@
|
|||||||
FA322DBE0CEF7766001761B3 /* tool.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D330CEF74B1001761B3 /* tool.c */; };
|
FA322DBE0CEF7766001761B3 /* tool.c in Sources */ = {isa = PBXBuildFile; fileRef = FA322D330CEF74B1001761B3 /* tool.c */; };
|
||||||
FA322DC10CEF77CB001761B3 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FA322DC00CEF77CB001761B3 /* libz.dylib */; };
|
FA322DC10CEF77CB001761B3 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FA322DC00CEF77CB001761B3 /* libz.dylib */; };
|
||||||
FA407F2E0DB159F400271AF1 /* ng_ipaddr.c in Sources */ = {isa = PBXBuildFile; fileRef = FA407F2C0DB159F400271AF1 /* ng_ipaddr.c */; };
|
FA407F2E0DB159F400271AF1 /* ng_ipaddr.c in Sources */ = {isa = PBXBuildFile; fileRef = FA407F2C0DB159F400271AF1 /* ng_ipaddr.c */; };
|
||||||
|
FA4F165A164836B100DBD011 /* irc-metadata.c in Sources */ = {isa = PBXBuildFile; fileRef = FA4F1659164836B100DBD011 /* irc-metadata.c */; };
|
||||||
|
FA6BBC631605F0AC0004247A /* conn-encoding.c in Sources */ = {isa = PBXBuildFile; fileRef = FA6BBC5F1605F0AB0004247A /* conn-encoding.c */; };
|
||||||
|
FA6BBC641605F0AC0004247A /* irc-encoding.c in Sources */ = {isa = PBXBuildFile; fileRef = FA6BBC611605F0AC0004247A /* irc-encoding.c */; };
|
||||||
|
FA6BBC661605F6D60004247A /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FA6BBC651605F6D60004247A /* libiconv.dylib */; };
|
||||||
FA85178C0FA061EC006A1F5A /* op.c in Sources */ = {isa = PBXBuildFile; fileRef = FA85178B0FA061EC006A1F5A /* op.c */; };
|
FA85178C0FA061EC006A1F5A /* op.c in Sources */ = {isa = PBXBuildFile; fileRef = FA85178B0FA061EC006A1F5A /* op.c */; };
|
||||||
FA99428C10E82A27007F27ED /* proc.c in Sources */ = {isa = PBXBuildFile; fileRef = FA99428B10E82A27007F27ED /* proc.c */; };
|
FA99428C10E82A27007F27ED /* proc.c in Sources */ = {isa = PBXBuildFile; fileRef = FA99428B10E82A27007F27ED /* proc.c */; };
|
||||||
FAA3D27B0F139CDC00B2447E /* conn-ssl.c in Sources */ = {isa = PBXBuildFile; fileRef = FAA3D2790F139CDC00B2447E /* conn-ssl.c */; };
|
FAA3D27B0F139CDC00B2447E /* conn-ssl.c in Sources */ = {isa = PBXBuildFile; fileRef = FAA3D2790F139CDC00B2447E /* conn-ssl.c */; };
|
||||||
FAA97C57124A271400D5BBA9 /* sighandlers.c in Sources */ = {isa = PBXBuildFile; fileRef = FAA97C55124A271400D5BBA9 /* sighandlers.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 */; };
|
FAE5CC2E0CF2308A007D69B6 /* numeric.c in Sources */ = {isa = PBXBuildFile; fileRef = FAE5CC2D0CF2308A007D69B6 /* numeric.c */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
@@ -170,7 +178,6 @@
|
|||||||
FA322D8E0CEF7523001761B3 /* ngIRCd.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = ngIRCd.xcodeproj; sourceTree = "<group>"; };
|
FA322D8E0CEF7523001761B3 /* ngIRCd.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; path = ngIRCd.xcodeproj; sourceTree = "<group>"; };
|
||||||
FA322D910CEF7523001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
|
FA322D910CEF7523001761B3 /* Makefile.am */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = Makefile.am; sourceTree = "<group>"; };
|
||||||
FA322D920CEF7523001761B3 /* ngindent */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = ngindent; sourceTree = "<group>"; };
|
FA322D920CEF7523001761B3 /* ngindent */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = ngindent; sourceTree = "<group>"; };
|
||||||
FA322D930CEF7523001761B3 /* ngircd.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = ngircd.sh; sourceTree = "<group>"; };
|
|
||||||
FA322D940CEF7523001761B3 /* ngircd.spec */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = ngircd.spec; sourceTree = "<group>"; };
|
FA322D940CEF7523001761B3 /* ngircd.spec */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = ngircd.spec; sourceTree = "<group>"; };
|
||||||
FA322D950CEF7523001761B3 /* README */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = README; sourceTree = "<group>"; };
|
FA322D950CEF7523001761B3 /* README */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = README; sourceTree = "<group>"; };
|
||||||
FA322D960CEF7523001761B3 /* systrace.policy */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = systrace.policy; sourceTree = "<group>"; };
|
FA322D960CEF7523001761B3 /* systrace.policy */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = systrace.policy; sourceTree = "<group>"; };
|
||||||
@@ -196,6 +203,17 @@
|
|||||||
FA407F2C0DB159F400271AF1 /* ng_ipaddr.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = ng_ipaddr.c; path = ipaddr/ng_ipaddr.c; sourceTree = "<group>"; };
|
FA407F2C0DB159F400271AF1 /* ng_ipaddr.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; name = ng_ipaddr.c; path = ipaddr/ng_ipaddr.c; sourceTree = "<group>"; };
|
||||||
FA407F2D0DB159F400271AF1 /* ng_ipaddr.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = ng_ipaddr.h; path = ipaddr/ng_ipaddr.h; sourceTree = "<group>"; };
|
FA407F2D0DB159F400271AF1 /* ng_ipaddr.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; name = ng_ipaddr.h; path = ipaddr/ng_ipaddr.h; sourceTree = "<group>"; };
|
||||||
FA407F380DB15AC700271AF1 /* GIT.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = GIT.txt; sourceTree = "<group>"; };
|
FA407F380DB15AC700271AF1 /* GIT.txt */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text; path = GIT.txt; sourceTree = "<group>"; };
|
||||||
|
FA4B08E513E7F8FB00765BA3 /* ngircd-bsd.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = "ngircd-bsd.sh"; sourceTree = "<group>"; };
|
||||||
|
FA4B08E613E7F91700765BA3 /* ngIRCd-Logo.gif */ = {isa = PBXFileReference; lastKnownFileType = image.gif; path = "ngIRCd-Logo.gif"; sourceTree = "<group>"; };
|
||||||
|
FA4B08E713E7F91700765BA3 /* ngircd-redhat.init */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = "ngircd-redhat.init"; sourceTree = "<group>"; };
|
||||||
|
FA4B08E813E7F91C00765BA3 /* platformtest.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = platformtest.sh; sourceTree = "<group>"; };
|
||||||
|
FA4F1659164836B100DBD011 /* irc-metadata.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "irc-metadata.c"; sourceTree = "<group>"; };
|
||||||
|
FA4F165C164836BF00DBD011 /* irc-metadata.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "irc-metadata.h"; sourceTree = "<group>"; };
|
||||||
|
FA6BBC5F1605F0AB0004247A /* conn-encoding.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "conn-encoding.c"; sourceTree = "<group>"; };
|
||||||
|
FA6BBC601605F0AC0004247A /* conn-encoding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "conn-encoding.h"; sourceTree = "<group>"; };
|
||||||
|
FA6BBC611605F0AC0004247A /* irc-encoding.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "irc-encoding.c"; sourceTree = "<group>"; };
|
||||||
|
FA6BBC621605F0AC0004247A /* irc-encoding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "irc-encoding.h"; sourceTree = "<group>"; };
|
||||||
|
FA6BBC651605F6D60004247A /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = ../../../../../../../usr/lib/libiconv.dylib; sourceTree = "<group>"; };
|
||||||
FA77849A133FB9FF00740057 /* sample-ngircd.conf.tmpl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "sample-ngircd.conf.tmpl"; sourceTree = "<group>"; };
|
FA77849A133FB9FF00740057 /* sample-ngircd.conf.tmpl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "sample-ngircd.conf.tmpl"; sourceTree = "<group>"; };
|
||||||
FA85178A0FA061EC006A1F5A /* op.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = op.h; sourceTree = "<group>"; };
|
FA85178A0FA061EC006A1F5A /* op.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = op.h; sourceTree = "<group>"; };
|
||||||
FA85178B0FA061EC006A1F5A /* op.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = op.c; sourceTree = "<group>"; };
|
FA85178B0FA061EC006A1F5A /* op.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = op.c; sourceTree = "<group>"; };
|
||||||
@@ -225,6 +243,21 @@
|
|||||||
FAA3D28B0F139D2E00B2447E /* preinstall.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = preinstall.sh; sourceTree = "<group>"; };
|
FAA3D28B0F139D2E00B2447E /* preinstall.sh */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = text.script.sh; path = preinstall.sh; sourceTree = "<group>"; };
|
||||||
FAA97C55124A271400D5BBA9 /* sighandlers.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = sighandlers.c; sourceTree = "<group>"; };
|
FAA97C55124A271400D5BBA9 /* sighandlers.c */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.c; path = sighandlers.c; sourceTree = "<group>"; };
|
||||||
FAA97C56124A271400D5BBA9 /* sighandlers.h */ = {isa = PBXFileReference; fileEncoding = 5; lastKnownFileType = sourcecode.c.h; path = sighandlers.h; sourceTree = "<group>"; };
|
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>"; };
|
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>"; };
|
FAE5CC2D0CF2308A007D69B6 /* numeric.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = numeric.c; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
@@ -236,6 +269,7 @@
|
|||||||
files = (
|
files = (
|
||||||
FA322DC10CEF77CB001761B3 /* libz.dylib in Frameworks */,
|
FA322DC10CEF77CB001761B3 /* libz.dylib in Frameworks */,
|
||||||
FA2D567B11EA1AB300D37A35 /* libpam.dylib in Frameworks */,
|
FA2D567B11EA1AB300D37A35 /* libpam.dylib in Frameworks */,
|
||||||
|
FA6BBC661605F6D60004247A /* libiconv.dylib in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -261,8 +295,9 @@
|
|||||||
FA322D600CEF750F001761B3 /* configure.in */,
|
FA322D600CEF750F001761B3 /* configure.in */,
|
||||||
FA322D630CEF750F001761B3 /* Makefile.am */,
|
FA322D630CEF750F001761B3 /* Makefile.am */,
|
||||||
1AB674ADFE9D54B511CA2CBB /* Products */,
|
1AB674ADFE9D54B511CA2CBB /* Products */,
|
||||||
FA322DC00CEF77CB001761B3 /* libz.dylib */,
|
FA6BBC651605F6D60004247A /* libiconv.dylib */,
|
||||||
FA2D567A11EA1AB300D37A35 /* libpam.dylib */,
|
FA2D567A11EA1AB300D37A35 /* libpam.dylib */,
|
||||||
|
FA322DC00CEF77CB001761B3 /* libz.dylib */,
|
||||||
);
|
);
|
||||||
name = ngIRCd;
|
name = ngIRCd;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -292,34 +327,49 @@
|
|||||||
FA322CD70CEF74B1001761B3 /* ngircd */ = {
|
FA322CD70CEF74B1001761B3 /* ngircd */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
FAA3D2780F139CDC00B2447E /* conf-ssl.h */,
|
FA322D020CEF74B1001761B3 /* Makefile.am */,
|
||||||
FAA3D2790F139CDC00B2447E /* conn-ssl.c */,
|
|
||||||
FAA3D27A0F139CDC00B2447E /* conn-ssl.h */,
|
|
||||||
FA322CD90CEF74B1001761B3 /* array.c */,
|
FA322CD90CEF74B1001761B3 /* array.c */,
|
||||||
FA322CDA0CEF74B1001761B3 /* array.h */,
|
FA322CDA0CEF74B1001761B3 /* array.h */,
|
||||||
FA322CDB0CEF74B1001761B3 /* channel.c */,
|
FA322CDB0CEF74B1001761B3 /* channel.c */,
|
||||||
FA322CDC0CEF74B1001761B3 /* channel.h */,
|
FA322CDC0CEF74B1001761B3 /* channel.h */,
|
||||||
|
FAACD5F314A6099C006ED74F /* class.c */,
|
||||||
|
FAACD5F414A6099C006ED74F /* class.h */,
|
||||||
FA322CDD0CEF74B1001761B3 /* client.c */,
|
FA322CDD0CEF74B1001761B3 /* client.c */,
|
||||||
FA322CDE0CEF74B1001761B3 /* client.h */,
|
FA322CDE0CEF74B1001761B3 /* client.h */,
|
||||||
|
FAD5853015271AAB00328741 /* client-cap.c */,
|
||||||
|
FAD5853115271AAB00328741 /* client-cap.h */,
|
||||||
FA322CDF0CEF74B1001761B3 /* conf.c */,
|
FA322CDF0CEF74B1001761B3 /* conf.c */,
|
||||||
FA322CE00CEF74B1001761B3 /* conf.h */,
|
FA322CE00CEF74B1001761B3 /* conf.h */,
|
||||||
|
FAA3D2780F139CDC00B2447E /* conf-ssl.h */,
|
||||||
|
FA322CE50CEF74B1001761B3 /* conn.c */,
|
||||||
|
FA322CE60CEF74B1001761B3 /* conn.h */,
|
||||||
|
FA6BBC5F1605F0AB0004247A /* conn-encoding.c */,
|
||||||
|
FA6BBC601605F0AC0004247A /* conn-encoding.h */,
|
||||||
FA322CE10CEF74B1001761B3 /* conn-func.c */,
|
FA322CE10CEF74B1001761B3 /* conn-func.c */,
|
||||||
FA322CE20CEF74B1001761B3 /* conn-func.h */,
|
FA322CE20CEF74B1001761B3 /* conn-func.h */,
|
||||||
FA322CE30CEF74B1001761B3 /* conn-zip.c */,
|
FA322CE30CEF74B1001761B3 /* conn-zip.c */,
|
||||||
FA322CE40CEF74B1001761B3 /* conn-zip.h */,
|
FA322CE40CEF74B1001761B3 /* conn-zip.h */,
|
||||||
FA322CE50CEF74B1001761B3 /* conn.c */,
|
FAA3D2790F139CDC00B2447E /* conn-ssl.c */,
|
||||||
FA322CE60CEF74B1001761B3 /* conn.h */,
|
FAA3D27A0F139CDC00B2447E /* conn-ssl.h */,
|
||||||
FA322CE70CEF74B1001761B3 /* defines.h */,
|
FA322CE70CEF74B1001761B3 /* defines.h */,
|
||||||
FA322CE80CEF74B1001761B3 /* hash.c */,
|
FA322CE80CEF74B1001761B3 /* hash.c */,
|
||||||
FA322CE90CEF74B1001761B3 /* hash.h */,
|
FA322CE90CEF74B1001761B3 /* hash.h */,
|
||||||
FA322CEA0CEF74B1001761B3 /* io.c */,
|
FA322CEA0CEF74B1001761B3 /* io.c */,
|
||||||
FA322CEB0CEF74B1001761B3 /* io.h */,
|
FA322CEB0CEF74B1001761B3 /* io.h */,
|
||||||
|
FA322CFC0CEF74B1001761B3 /* irc.c */,
|
||||||
|
FA322CFD0CEF74B1001761B3 /* irc.h */,
|
||||||
|
FAD5853315271AB800328741 /* irc-cap.c */,
|
||||||
|
FAD5853415271AB800328741 /* irc-cap.h */,
|
||||||
FA322CEC0CEF74B1001761B3 /* irc-channel.c */,
|
FA322CEC0CEF74B1001761B3 /* irc-channel.c */,
|
||||||
FA322CED0CEF74B1001761B3 /* irc-channel.h */,
|
FA322CED0CEF74B1001761B3 /* irc-channel.h */,
|
||||||
|
FA6BBC611605F0AC0004247A /* irc-encoding.c */,
|
||||||
|
FA6BBC621605F0AC0004247A /* irc-encoding.h */,
|
||||||
FA322CEE0CEF74B1001761B3 /* irc-info.c */,
|
FA322CEE0CEF74B1001761B3 /* irc-info.c */,
|
||||||
FA322CEF0CEF74B1001761B3 /* irc-info.h */,
|
FA322CEF0CEF74B1001761B3 /* irc-info.h */,
|
||||||
FA322CF00CEF74B1001761B3 /* irc-login.c */,
|
FA322CF00CEF74B1001761B3 /* irc-login.c */,
|
||||||
FA322CF10CEF74B1001761B3 /* irc-login.h */,
|
FA322CF10CEF74B1001761B3 /* irc-login.h */,
|
||||||
|
FA4F1659164836B100DBD011 /* irc-metadata.c */,
|
||||||
|
FA4F165C164836BF00DBD011 /* irc-metadata.h */,
|
||||||
FA322CF20CEF74B1001761B3 /* irc-mode.c */,
|
FA322CF20CEF74B1001761B3 /* irc-mode.c */,
|
||||||
FA322CF30CEF74B1001761B3 /* irc-mode.h */,
|
FA322CF30CEF74B1001761B3 /* irc-mode.h */,
|
||||||
FA322CF40CEF74B1001761B3 /* irc-op.c */,
|
FA322CF40CEF74B1001761B3 /* irc-op.c */,
|
||||||
@@ -330,13 +380,12 @@
|
|||||||
FA322CF90CEF74B1001761B3 /* irc-server.h */,
|
FA322CF90CEF74B1001761B3 /* irc-server.h */,
|
||||||
FA322CFA0CEF74B1001761B3 /* irc-write.c */,
|
FA322CFA0CEF74B1001761B3 /* irc-write.c */,
|
||||||
FA322CFB0CEF74B1001761B3 /* irc-write.h */,
|
FA322CFB0CEF74B1001761B3 /* irc-write.h */,
|
||||||
FA322CFC0CEF74B1001761B3 /* irc.c */,
|
|
||||||
FA322CFD0CEF74B1001761B3 /* irc.h */,
|
|
||||||
FA322CFE0CEF74B1001761B3 /* lists.c */,
|
FA322CFE0CEF74B1001761B3 /* lists.c */,
|
||||||
FA322CFF0CEF74B1001761B3 /* lists.h */,
|
FA322CFF0CEF74B1001761B3 /* lists.h */,
|
||||||
FA322D000CEF74B1001761B3 /* log.c */,
|
FA322D000CEF74B1001761B3 /* log.c */,
|
||||||
FA322D010CEF74B1001761B3 /* log.h */,
|
FA322D010CEF74B1001761B3 /* log.h */,
|
||||||
FA322D020CEF74B1001761B3 /* Makefile.am */,
|
FAD5853615272C2500328741 /* login.c */,
|
||||||
|
FAD5853715272C2500328741 /* login.h */,
|
||||||
FA322D030CEF74B1001761B3 /* match.c */,
|
FA322D030CEF74B1001761B3 /* match.c */,
|
||||||
FA322D040CEF74B1001761B3 /* match.h */,
|
FA322D040CEF74B1001761B3 /* match.h */,
|
||||||
FA322D050CEF74B1001761B3 /* messages.h */,
|
FA322D050CEF74B1001761B3 /* messages.h */,
|
||||||
@@ -346,6 +395,8 @@
|
|||||||
FAE5CC2C0CF2308A007D69B6 /* numeric.h */,
|
FAE5CC2C0CF2308A007D69B6 /* numeric.h */,
|
||||||
FA85178B0FA061EC006A1F5A /* op.c */,
|
FA85178B0FA061EC006A1F5A /* op.c */,
|
||||||
FA85178A0FA061EC006A1F5A /* op.h */,
|
FA85178A0FA061EC006A1F5A /* op.h */,
|
||||||
|
FA2D564911EA158B00D37A35 /* pam.c */,
|
||||||
|
FA2D564811EA158B00D37A35 /* pam.h */,
|
||||||
FA322D080CEF74B1001761B3 /* parse.c */,
|
FA322D080CEF74B1001761B3 /* parse.c */,
|
||||||
FA322D090CEF74B1001761B3 /* parse.h */,
|
FA322D090CEF74B1001761B3 /* parse.h */,
|
||||||
FA99428B10E82A27007F27ED /* proc.c */,
|
FA99428B10E82A27007F27ED /* proc.c */,
|
||||||
@@ -354,8 +405,6 @@
|
|||||||
FA322D0D0CEF74B1001761B3 /* resolve.h */,
|
FA322D0D0CEF74B1001761B3 /* resolve.h */,
|
||||||
FAA97C55124A271400D5BBA9 /* sighandlers.c */,
|
FAA97C55124A271400D5BBA9 /* sighandlers.c */,
|
||||||
FAA97C56124A271400D5BBA9 /* sighandlers.h */,
|
FAA97C56124A271400D5BBA9 /* sighandlers.h */,
|
||||||
FA2D564811EA158B00D37A35 /* pam.h */,
|
|
||||||
FA2D564911EA158B00D37A35 /* pam.c */,
|
|
||||||
);
|
);
|
||||||
path = ngircd;
|
path = ngircd;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -432,8 +481,11 @@
|
|||||||
FA322D730CEF7523001761B3 /* MacOSX */,
|
FA322D730CEF7523001761B3 /* MacOSX */,
|
||||||
FA322D910CEF7523001761B3 /* Makefile.am */,
|
FA322D910CEF7523001761B3 /* Makefile.am */,
|
||||||
FA322D920CEF7523001761B3 /* ngindent */,
|
FA322D920CEF7523001761B3 /* ngindent */,
|
||||||
FA322D930CEF7523001761B3 /* ngircd.sh */,
|
FA4B08E513E7F8FB00765BA3 /* ngircd-bsd.sh */,
|
||||||
|
FA4B08E613E7F91700765BA3 /* ngIRCd-Logo.gif */,
|
||||||
|
FA4B08E713E7F91700765BA3 /* ngircd-redhat.init */,
|
||||||
FA322D940CEF7523001761B3 /* ngircd.spec */,
|
FA322D940CEF7523001761B3 /* ngircd.spec */,
|
||||||
|
FA4B08E813E7F91C00765BA3 /* platformtest.sh */,
|
||||||
FA322D950CEF7523001761B3 /* README */,
|
FA322D950CEF7523001761B3 /* README */,
|
||||||
FA322D960CEF7523001761B3 /* systrace.policy */,
|
FA322D960CEF7523001761B3 /* systrace.policy */,
|
||||||
);
|
);
|
||||||
@@ -552,18 +604,25 @@
|
|||||||
FA322D970CEF752C001761B3 /* doc */ = {
|
FA322D970CEF752C001761B3 /* doc */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
FAA3D2800F139D1500B2447E /* Services.txt */,
|
|
||||||
FA407F380DB15AC700271AF1 /* GIT.txt */,
|
|
||||||
FA322D9A0CEF752C001761B3 /* FAQ.txt */,
|
|
||||||
FA322D9B0CEF752C001761B3 /* Makefile.am */,
|
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 */,
|
FA322D9C0CEF752C001761B3 /* Platforms.txt */,
|
||||||
FA322D9D0CEF752C001761B3 /* Protocol.txt */,
|
FA322D9D0CEF752C001761B3 /* Protocol.txt */,
|
||||||
FA322D9E0CEF752C001761B3 /* README-AUX.txt */,
|
FA322D9E0CEF752C001761B3 /* README-AUX.txt */,
|
||||||
FA322D9F0CEF752C001761B3 /* README-BeOS.txt */,
|
FA322D9F0CEF752C001761B3 /* README-BeOS.txt */,
|
||||||
|
FAE22BD815270EC400F1A5AB /* README-Interix.txt */,
|
||||||
FA322DA00CEF752C001761B3 /* RFC.txt */,
|
FA322DA00CEF752C001761B3 /* RFC.txt */,
|
||||||
|
FAA3D2800F139D1500B2447E /* Services.txt */,
|
||||||
|
FA322DA90CEF752C001761B3 /* SSL.txt */,
|
||||||
FA77849A133FB9FF00740057 /* sample-ngircd.conf.tmpl */,
|
FA77849A133FB9FF00740057 /* sample-ngircd.conf.tmpl */,
|
||||||
FA322DA20CEF752C001761B3 /* src */,
|
FA322DA20CEF752C001761B3 /* src */,
|
||||||
FA322DA90CEF752C001761B3 /* SSL.txt */,
|
|
||||||
);
|
);
|
||||||
name = doc;
|
name = doc;
|
||||||
path = ../../doc;
|
path = ../../doc;
|
||||||
@@ -641,8 +700,11 @@
|
|||||||
/* Begin PBXProject section */
|
/* Begin PBXProject section */
|
||||||
08FB7793FE84155DC02AAC07 /* Project object */ = {
|
08FB7793FE84155DC02AAC07 /* Project object */ = {
|
||||||
isa = PBXProject;
|
isa = PBXProject;
|
||||||
|
attributes = {
|
||||||
|
LastUpgradeCheck = 0430;
|
||||||
|
};
|
||||||
buildConfigurationList = 1DEB928908733DD80010E9CD /* Build configuration list for PBXProject "ngIRCd" */;
|
buildConfigurationList = 1DEB928908733DD80010E9CD /* Build configuration list for PBXProject "ngIRCd" */;
|
||||||
compatibilityVersion = "Xcode 3.0";
|
compatibilityVersion = "Xcode 3.2";
|
||||||
developmentRegion = English;
|
developmentRegion = English;
|
||||||
hasScannedForEncodings = 1;
|
hasScannedForEncodings = 1;
|
||||||
knownRegions = (
|
knownRegions = (
|
||||||
@@ -703,6 +765,13 @@
|
|||||||
FA99428C10E82A27007F27ED /* proc.c in Sources */,
|
FA99428C10E82A27007F27ED /* proc.c in Sources */,
|
||||||
FA2D564A11EA158B00D37A35 /* pam.c in Sources */,
|
FA2D564A11EA158B00D37A35 /* pam.c in Sources */,
|
||||||
FAA97C57124A271400D5BBA9 /* sighandlers.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 */,
|
||||||
|
FA6BBC631605F0AC0004247A /* conn-encoding.c in Sources */,
|
||||||
|
FA6BBC641605F0AC0004247A /* irc-encoding.c in Sources */,
|
||||||
|
FA4F165A164836B100DBD011 /* irc-metadata.c in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -713,6 +782,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
|
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
|
||||||
|
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
|
GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
|
||||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
|
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
|
||||||
@@ -731,20 +801,20 @@
|
|||||||
GCC_WARN_UNUSED_PARAMETER = YES;
|
GCC_WARN_UNUSED_PARAMETER = YES;
|
||||||
GCC_WARN_UNUSED_VALUE = YES;
|
GCC_WARN_UNUSED_VALUE = YES;
|
||||||
INSTALL_PATH = /usr/local/bin;
|
INSTALL_PATH = /usr/local/bin;
|
||||||
PRODUCT_NAME = ngIRCd;
|
PRODUCT_NAME = ngircd;
|
||||||
};
|
};
|
||||||
name = Default;
|
name = Default;
|
||||||
};
|
};
|
||||||
1DEB928B08733DD80010E9CD /* Default */ = {
|
1DEB928B08733DD80010E9CD /* Default */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ARCHS = "$(ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1)";
|
ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
|
||||||
ARCHS_STANDARD_32_64_BIT_PRE_XCODE_3_1 = "x86_64 i386 ppc";
|
CODE_SIGN_IDENTITY = "";
|
||||||
GCC_VERSION = 4.0;
|
GCC_VERSION = "";
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
PREBINDING = NO;
|
MACOSX_DEPLOYMENT_TARGET = 10.6;
|
||||||
SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.5.sdk";
|
SDKROOT = "";
|
||||||
};
|
};
|
||||||
name = Default;
|
name = Default;
|
||||||
};
|
};
|
||||||
@@ -754,11 +824,11 @@
|
|||||||
ARCHS = "$(NATIVE_ARCH_ACTUAL)";
|
ARCHS = "$(NATIVE_ARCH_ACTUAL)";
|
||||||
GCC_DEBUGGING_SYMBOLS = full;
|
GCC_DEBUGGING_SYMBOLS = full;
|
||||||
GCC_OPTIMIZATION_LEVEL = 0;
|
GCC_OPTIMIZATION_LEVEL = 0;
|
||||||
GCC_VERSION = 4.0;
|
GCC_VERSION = "";
|
||||||
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
GCC_WARN_ABOUT_RETURN_TYPE = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
|
MACOSX_DEPLOYMENT_TARGET = 10.6;
|
||||||
ONLY_ACTIVE_ARCH = YES;
|
ONLY_ACTIVE_ARCH = YES;
|
||||||
PREBINDING = NO;
|
|
||||||
SDKROOT = "";
|
SDKROOT = "";
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = Debug;
|
||||||
@@ -767,6 +837,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
|
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
|
||||||
|
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
|
||||||
GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
|
GCC_WARN_ABOUT_MISSING_NEWLINE = YES;
|
||||||
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
|
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
|
||||||
@@ -785,7 +856,7 @@
|
|||||||
GCC_WARN_UNUSED_PARAMETER = YES;
|
GCC_WARN_UNUSED_PARAMETER = YES;
|
||||||
GCC_WARN_UNUSED_VALUE = YES;
|
GCC_WARN_UNUSED_VALUE = YES;
|
||||||
INSTALL_PATH = /usr/local/bin;
|
INSTALL_PATH = /usr/local/bin;
|
||||||
PRODUCT_NAME = ngIRCd;
|
PRODUCT_NAME = ngircd;
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = Debug;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#
|
#
|
||||||
# ngIRCd -- The Next Generation IRC Daemon
|
# ngIRCd -- The Next Generation IRC Daemon
|
||||||
# Copyright (c)2001-2009 Alexander Barton (alex@barton.de)
|
# Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
@@ -11,8 +11,15 @@
|
|||||||
|
|
||||||
SUBDIRS = Debian MacOSX
|
SUBDIRS = Debian MacOSX
|
||||||
|
|
||||||
EXTRA_DIST = README ngircd.spec systrace.policy ngindent ngircd-bsd.sh \
|
EXTRA_DIST = README \
|
||||||
ngIRCd-Logo.gif ngircd-redhat.init platformtest.sh
|
ngindent \
|
||||||
|
ngircd-bsd.sh \
|
||||||
|
ngIRCd-Logo.gif \
|
||||||
|
ngircd-redhat.init \
|
||||||
|
ngircd.service \
|
||||||
|
ngircd.spec \
|
||||||
|
platformtest.sh \
|
||||||
|
systrace.policy
|
||||||
|
|
||||||
maintainer-clean-local:
|
maintainer-clean-local:
|
||||||
rm -f Makefile Makefile.in
|
rm -f Makefile Makefile.in
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
|
|
||||||
ngIRCd - Next Generation IRC Server
|
ngIRCd - Next Generation IRC Server
|
||||||
|
http://ngircd.barton.de/
|
||||||
|
|
||||||
(c)2001-2009 Alexander Barton,
|
(c)2001-2011 Alexander Barton and Contributors.
|
||||||
alex@barton.de, http://www.barton.de/
|
|
||||||
|
|
||||||
ngIRCd is free software and published under the
|
ngIRCd is free software and published under the
|
||||||
terms of the GNU General Public License.
|
terms of the GNU General Public License.
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ INDENTARGS="-kr -i8 -ts8 -l80 -c3 -cd41 -ss -ncs -psl"
|
|||||||
|
|
||||||
# check if indent(1) is available
|
# check if indent(1) is available
|
||||||
type indent >/dev/null 2>&1 && INDENT="indent"
|
type indent >/dev/null 2>&1 && INDENT="indent"
|
||||||
|
type gindent >/dev/null 2>&1 && INDENT="gindent"
|
||||||
type gnuindent >/dev/null 2>&1 && INDENT="gnuindent"
|
type gnuindent >/dev/null 2>&1 && INDENT="gnuindent"
|
||||||
|
|
||||||
if [ -z "$INDENT" ]; then
|
if [ -z "$INDENT" ]; then
|
||||||
|
|||||||
11
contrib/ngircd.service
Normal file
11
contrib/ngircd.service
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Next Generation IRC Daemon
|
||||||
|
After=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
# don't daemonize to simplify stuff
|
||||||
|
ExecStart=/usr/sbin/ngircd -n
|
||||||
|
ExecReload=/bin/kill -HUP $MAINPID
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
%define name ngircd
|
%define name ngircd
|
||||||
%define version 18~rc2
|
%define version 20.3
|
||||||
%define release 1
|
%define release 1
|
||||||
%define prefix %{_prefix}
|
%define prefix %{_prefix}
|
||||||
|
|
||||||
@@ -15,18 +15,19 @@ BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
|
|||||||
BuildRequires: zlib-devel, openssl-devel
|
BuildRequires: zlib-devel, openssl-devel
|
||||||
|
|
||||||
%description
|
%description
|
||||||
ngIRCd is a free open source daemon for the Internet Relay Chat (IRC),
|
This package provides ngIRCd, a portable and lightweight Internet Relay
|
||||||
developed under the GNU General Public License (GPL). It's written from
|
Chat server for small or private networks, developed under the GNU
|
||||||
scratch and is not based upon the original IRCd like many others.
|
General Public License (GPL). It is simple to configure, can cope with
|
||||||
|
dynamic IP addresses, and supports IPv6 as well as SSL. It is written
|
||||||
|
from scratch and not based on the original IRCd.
|
||||||
|
|
||||||
Advantages:
|
Advantages:
|
||||||
- no problems with servers using changing/non-static IP addresses.
|
- well arranged (lean) configuration file
|
||||||
- small and lean configuration file.
|
- simple to build/install, configure and maintain
|
||||||
- free, modern and open source C code.
|
- supports IPv6 and SSL
|
||||||
- still under active development.
|
- no problems with servers that have dynamic IP addresses
|
||||||
|
- freely available, modern, portable and tidy C-source
|
||||||
ngIRCd is compatible to the "original" ircd 2.10.3p3, so you can run
|
- ngIRCd is being actively developed since 11 years.
|
||||||
mixed networks.
|
|
||||||
|
|
||||||
%prep
|
%prep
|
||||||
%setup -q
|
%setup -q
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
#
|
#
|
||||||
# ngIRCd -- The Next Generation IRC Daemon
|
# 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
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
@@ -21,13 +21,16 @@ PLATFORM=
|
|||||||
COMPILER="unknown"
|
COMPILER="unknown"
|
||||||
VERSION="unknown"
|
VERSION="unknown"
|
||||||
DATE=`date "+%y-%m-%d"`
|
DATE=`date "+%y-%m-%d"`
|
||||||
|
|
||||||
CONFIGURE=
|
|
||||||
MAKE=
|
|
||||||
CHECK=
|
|
||||||
RUN=
|
|
||||||
COMMENT=
|
COMMENT=
|
||||||
|
|
||||||
|
R_CONFIGURE=
|
||||||
|
R_MAKE=
|
||||||
|
R_CHECK=
|
||||||
|
R_RUN=
|
||||||
|
|
||||||
|
[ -n "$MAKE" ] || MAKE="make"
|
||||||
|
export MAKE CC
|
||||||
|
|
||||||
while [ $# -gt 0 ]; do
|
while [ $# -gt 0 ]; do
|
||||||
case "$1" in
|
case "$1" in
|
||||||
"-v")
|
"-v")
|
||||||
@@ -51,8 +54,8 @@ if [ $? -ne 0 ]; then
|
|||||||
cd ..
|
cd ..
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo "$NAME: Checking for \"./autogen.sh\" script ..."
|
echo "$NAME: Checking for \"./configure\" script ..."
|
||||||
if [ -r ./autogen.sh ]; then
|
if [ ! -e ./configure ]; then
|
||||||
echo "$NAME: Running \"./autogen.sh\" ..."
|
echo "$NAME: Running \"./autogen.sh\" ..."
|
||||||
[ -n "$VERBOSE" ] && ./autogen.sh || ./autogen.sh >/dev/null
|
[ -n "$VERBOSE" ] && ./autogen.sh || ./autogen.sh >/dev/null
|
||||||
fi
|
fi
|
||||||
@@ -61,20 +64,20 @@ if [ -r ./configure ]; then
|
|||||||
echo "$NAME: Running \"./configure\" script ..."
|
echo "$NAME: Running \"./configure\" script ..."
|
||||||
[ -n "$VERBOSE" ] && ./configure || ./configure >/dev/null
|
[ -n "$VERBOSE" ] && ./configure || ./configure >/dev/null
|
||||||
if [ $? -eq 0 -a -r ./Makefile ]; then
|
if [ $? -eq 0 -a -r ./Makefile ]; then
|
||||||
CONFIGURE=1
|
R_CONFIGURE=1
|
||||||
echo "$NAME: Running \"make\" ..."
|
echo "$NAME: Running \"$MAKE\" ..."
|
||||||
[ -n "$VERBOSE" ] && make || make >/dev/null
|
[ -n "$VERBOSE" ] && "$MAKE" || "$MAKE" >/dev/null
|
||||||
if [ $? -eq 0 -a -x src/ngircd/ngircd ]; then
|
if [ $? -eq 0 -a -x src/ngircd/ngircd ]; then
|
||||||
MAKE=1
|
R_MAKE=1
|
||||||
echo "$NAME: Running \"make check\" ..."
|
echo "$NAME: Running \"$MAKE check\" ..."
|
||||||
[ -n "$VERBOSE" ] && make check || make check >/dev/null
|
[ -n "$VERBOSE" ] && "$MAKE" check || "$MAKE" check >/dev/null
|
||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then
|
||||||
CHECK=1
|
R_CHECK=1
|
||||||
RUN=$CHECK
|
R_RUN=$R_CHECK
|
||||||
else
|
else
|
||||||
./src/ngircd/ngircd --help 2>/dev/null \
|
./src/ngircd/ngircd --help 2>/dev/null \
|
||||||
| grep "^ngircd" >/dev/null
|
| grep "^ngIRCd" >/dev/null
|
||||||
[ $? -eq 0 ] && RUN=1
|
[ $? -eq 0 ] && R_RUN=1
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
@@ -82,9 +85,9 @@ fi
|
|||||||
|
|
||||||
# Get target platform information
|
# Get target platform information
|
||||||
if [ -r "src/config.h" ]; then
|
if [ -r "src/config.h" ]; then
|
||||||
CPU=`grep "TARGET_CPU" "src/config.h" | cut -d'"' -f2`
|
CPU=`grep "HOST_CPU" "src/config.h" | cut -d'"' -f2`
|
||||||
OS=`grep "TARGET_OS" "src/config.h" | cut -d'"' -f2`
|
OS=`grep "HOST_OS" "src/config.h" | cut -d'"' -f2`
|
||||||
VENDOR=`grep "TARGET_VENDOR" "src/config.h" | cut -d'"' -f2`
|
VENDOR=`grep "HOST_VENDOR" "src/config.h" | cut -d'"' -f2`
|
||||||
PLATFORM="$CPU/$VENDOR/$OS"
|
PLATFORM="$CPU/$VENDOR/$OS"
|
||||||
fi
|
fi
|
||||||
if [ -z "$PLATFORM" ]; then
|
if [ -z "$PLATFORM" ]; then
|
||||||
@@ -96,9 +99,14 @@ if [ -r "Makefile" ]; then
|
|||||||
CC=$(grep "^CC = " Makefile | cut -d' ' -f3)
|
CC=$(grep "^CC = " Makefile | cut -d' ' -f3)
|
||||||
$CC --version 2>&1 | grep -i "GCC" >/dev/null
|
$CC --version 2>&1 | grep -i "GCC" >/dev/null
|
||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then
|
||||||
COMPILER=$($CC --version | head -1 \
|
$CC --version 2>&1 | grep -i "Open64" >/dev/null
|
||||||
| cut -d')' -f2 | cut -d' ' -f2)
|
if [ $? -eq 0 ]; then
|
||||||
COMPILER="gcc $COMPILER"
|
COMPILER="Open64"
|
||||||
|
else
|
||||||
|
COMPILER=$($CC --version | head -1 \
|
||||||
|
| cut -d')' -f2 | cut -d' ' -f2)
|
||||||
|
COMPILER="gcc $COMPILER"
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
case "$CC" in
|
case "$CC" in
|
||||||
gcc*)
|
gcc*)
|
||||||
@@ -130,10 +138,10 @@ else
|
|||||||
[ $? -eq 0 ] && COMMENT="(3)"
|
[ $? -eq 0 ] && COMMENT="(3)"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
[ -n "$CONFIGURE" ] && C="Y" || C="N"
|
[ -n "$R_CONFIGURE" ] && C="Y" || C="N"
|
||||||
[ -n "$MAKE" ] && M="Y" || M="N"
|
[ -n "$R_MAKE" ] && M="Y" || M="N"
|
||||||
[ -n "$CHECK" ] && T="Y" || T="N"
|
[ -n "$R_CHECK" ] && T="Y" || T="N"
|
||||||
[ -n "$RUN" ] && R="Y" || R="N"
|
[ -n "$R_RUN" ] && R="Y" || R="N"
|
||||||
[ -n "$COMMENT" ] && COMMENT=" $COMMENT"
|
[ -n "$COMMENT" ] && COMMENT=" $COMMENT"
|
||||||
|
|
||||||
echo
|
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
|
Q: I cannot connect to remote peers when I use the chroot option, the
|
||||||
following is logged: "Can't resolve example.com: unknown error!".
|
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
|
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
|
the chroot as well, notably libnss_dns; maybe others. Unfortunately, even
|
||||||
linking ngIRCd statically does not help this. The only known workaround
|
linking ngIRCd statically does not help this. So you can either copy
|
||||||
is to either disable chroot support or to link against dietlibc instead
|
all the required files into the chroot directory:
|
||||||
of glibc. (tnx to Sebastian Siewior)
|
$ 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?
|
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.
|
A: You can use the /OPER command in your IRC client to become an IRC operator.
|
||||||
|
|||||||
37
doc/GIT.txt
37
doc/GIT.txt
@@ -9,13 +9,23 @@
|
|||||||
-- GIT.txt --
|
-- GIT.txt --
|
||||||
|
|
||||||
|
|
||||||
The source code of ngIRCd is maintained using git, the stupid content
|
The source code of ngIRCd is maintained using GIT, an distributed version
|
||||||
tracker.
|
control system. Homepage including documentation: <http://git-scm.com/>.
|
||||||
|
|
||||||
|
|
||||||
I. Getting the source code
|
I. Viewing the source code online
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
To access the source tree anonymously, run:
|
|
||||||
|
The ngIRCd "GITweb" interface allows you to browse the GIT repository and
|
||||||
|
to see all individual files, tags, branches, commits etc.:
|
||||||
|
|
||||||
|
<http://arthur.barton.de/cgi-bin/gitweb.cgi?p=ngircd.git>
|
||||||
|
|
||||||
|
|
||||||
|
II. Getting the source code
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
To access (copy, clone) the source tree repository anonymously, run:
|
||||||
|
|
||||||
$ git clone git://ngircd.barton.de/ngircd.git
|
$ git clone git://ngircd.barton.de/ngircd.git
|
||||||
|
|
||||||
@@ -23,23 +33,23 @@ Thereby a new folder "ngircd" will be created containing all the individual
|
|||||||
source files.
|
source files.
|
||||||
|
|
||||||
The newly created directory ("ngircd") is the "working directory", all
|
The newly created directory ("ngircd") is the "working directory", all
|
||||||
git commands will be executed from within this directory in the future.
|
GIT commands will be executed from within this directory in the future.
|
||||||
|
|
||||||
Please note: When checking out a fresh copy of ngIRCd using git, the
|
Please note: When checking out a fresh copy of ngIRCd using GIT, the
|
||||||
configure script doesn't exist; you have to run the autogen.sh shell script
|
configure script doesn't exist; you have to run the autogen.sh shell script
|
||||||
(which is included in the source tree) to generate it. This requires you to
|
(which is included in the source tree) to generate it. This requires you to
|
||||||
have GNU automake and GNU autoconf installed on your system. Please see the
|
have GNU automake and GNU autoconf installed on your system. Please see the
|
||||||
file INSTALL for details!
|
file INSTALL for details!
|
||||||
|
|
||||||
To update the git tree:
|
To update the local GIT repository:
|
||||||
|
|
||||||
$ git pull
|
$ git pull
|
||||||
|
|
||||||
This retrieves all changes and merges them into the current branch.
|
This retrieves all changes and merges them into the current branch.
|
||||||
|
|
||||||
|
|
||||||
II. Contributing
|
III. Contributing
|
||||||
~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Patches should be sent to the ngircd mailing list. List homepage:
|
Patches should be sent to the ngircd mailing list. List homepage:
|
||||||
http://arthur.barton.de/mailman/listinfo/ngircd-ml
|
http://arthur.barton.de/mailman/listinfo/ngircd-ml
|
||||||
@@ -48,7 +58,8 @@ If you do not want to send them to the list, you can also mail them
|
|||||||
to Alex Barton, <alex@barton.de>.
|
to Alex Barton, <alex@barton.de>.
|
||||||
|
|
||||||
|
|
||||||
III. Write Access
|
IV. Write Access
|
||||||
~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~
|
||||||
If you want to contribute a couple of patches and write access to the git
|
|
||||||
|
If you want to contribute a couple of patches and write access to the GIT
|
||||||
repository would be handy, please contact Alex Barton, <alex@barton.de>.
|
repository would be handy, please contact Alex Barton, <alex@barton.de>.
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ a) Make sure the source tree is in a releasable state ;-)
|
|||||||
|
|
||||||
b) Make sure you have working versions of GNU autoconf and GNU automake
|
b) Make sure you have working versions of GNU autoconf and GNU automake
|
||||||
installed on the system you use for generating the release:
|
installed on the system you use for generating the release:
|
||||||
as of October 2010 we are using GNU autoconf 2.61 and GNU automake 1.10.1
|
as of October 2010 we are using GNU autoconf 2.67 and GNU automake 1.11.1
|
||||||
which seem to work just fine.
|
which seem to work just fine.
|
||||||
|
|
||||||
c) Update the files describing the new release:
|
c) Update the files describing the new release:
|
||||||
|
|||||||
@@ -1,25 +1,38 @@
|
|||||||
#
|
#
|
||||||
# ngIRCd -- The Next Generation IRC Daemon
|
# ngIRCd -- The Next Generation IRC Daemon
|
||||||
# Copyright (c)2001-2010 Alexander Barton (alex@barton.de)
|
# Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors
|
||||||
#
|
#
|
||||||
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
# This program is free software; you can redistribute it and/or modify
|
||||||
# der GNU General Public License (GPL), wie von der Free Software Foundation
|
# it under the terms of the GNU General Public License as published by
|
||||||
# herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
# (at your option) any later version.
|
||||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
# Please read the file COPYING, README and AUTHORS for more information.
|
||||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
|
||||||
#
|
#
|
||||||
|
|
||||||
.tmpl:
|
.tmpl:
|
||||||
sed \
|
$(AM_V_GEN)sed \
|
||||||
-e s@:ETCDIR:@${sysconfdir}@ \
|
-e "s@:ETCDIR:@${sysconfdir}@" \
|
||||||
<$< >$@
|
<$< >$@
|
||||||
|
|
||||||
SUFFIXES = .tmpl
|
SUFFIXES = .tmpl
|
||||||
|
|
||||||
static_docs = Bopm.txt FAQ.txt GIT.txt HowToRelease.txt PAM.txt Platforms.txt \
|
static_docs = \
|
||||||
Protocol.txt README-AUX.txt README-BeOS.txt README-Interix.txt RFC.txt \
|
Bopm.txt \
|
||||||
SSL.txt Services.txt
|
Capabilities.txt \
|
||||||
|
Contributing.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
|
doc_templates = sample-ngircd.conf.tmpl
|
||||||
|
|
||||||
@@ -40,8 +53,8 @@ all: $(generated_docs)
|
|||||||
|
|
||||||
install-data-hook: $(static_docs) $(toplevel_docs) $(generated_docs)
|
install-data-hook: $(static_docs) $(toplevel_docs) $(generated_docs)
|
||||||
$(mkinstalldirs) $(DESTDIR)$(sysconfdir)
|
$(mkinstalldirs) $(DESTDIR)$(sysconfdir)
|
||||||
if [ ! -f $(DESTDIR)$(sysconfdir)/ngircd.conf ]; then \
|
@if [ ! -f $(DESTDIR)$(sysconfdir)/ngircd.conf ]; then \
|
||||||
$(INSTALL) -m 600 -c sample-ngircd.conf $(DESTDIR)$(sysconfdir)/ngircd.conf; \
|
make install-config; \
|
||||||
fi
|
fi
|
||||||
$(mkinstalldirs) $(DESTDIR)$(docdir)
|
$(mkinstalldirs) $(DESTDIR)$(docdir)
|
||||||
for f in $(static_docs) $(toplevel_docs); do \
|
for f in $(static_docs) $(toplevel_docs); do \
|
||||||
@@ -51,10 +64,30 @@ install-data-hook: $(static_docs) $(toplevel_docs) $(generated_docs)
|
|||||||
$(INSTALL) -m 644 -c $$f $(DESTDIR)$(docdir)/; \
|
$(INSTALL) -m 644 -c $$f $(DESTDIR)$(docdir)/; \
|
||||||
done
|
done
|
||||||
|
|
||||||
|
install-config:
|
||||||
|
$(INSTALL) -m 600 -c sample-ngircd.conf $(DESTDIR)$(sysconfdir)/ngircd.conf
|
||||||
|
@echo; \
|
||||||
|
echo " ** NOTE: Installed sample configuration file:"; \
|
||||||
|
echo " ** \"$(DESTDIR)$(sysconfdir)/ngircd.conf\""; \
|
||||||
|
echo
|
||||||
|
|
||||||
uninstall-hook:
|
uninstall-hook:
|
||||||
rm -rf $(DESTDIR)$(docdir)
|
rm -rf $(DESTDIR)$(docdir)
|
||||||
|
@if cmp --silent sample-ngircd.conf $(DESTDIR)$(sysconfdir)/ngircd.conf; then \
|
||||||
|
make uninstall-config; \
|
||||||
|
else \
|
||||||
|
echo; \
|
||||||
|
echo " ** NOTE: Not uninstalling changed configuration file:"; \
|
||||||
|
echo " ** \"$(DESTDIR)$(sysconfdir)/ngircd.conf\""; \
|
||||||
|
echo; \
|
||||||
|
fi
|
||||||
|
|
||||||
|
uninstall-config:
|
||||||
|
rm -f $(DESTDIR)$(sysconfdir)/ngircd.conf
|
||||||
|
|
||||||
srcdoc:
|
srcdoc:
|
||||||
make -C src srcdoc
|
make -C src srcdoc
|
||||||
|
|
||||||
|
.PHONY: install-config uninstall-config srcdoc
|
||||||
|
|
||||||
# -eof-
|
# -eof-
|
||||||
|
|||||||
88
doc/Modes.txt
Normal file
88
doc/Modes.txt
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
|
||||||
|
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.
|
||||||
|
|
||||||
|
-- Modes.txt --
|
||||||
|
|
||||||
|
|
||||||
|
This document lists the different user modes, channel modes, and channel
|
||||||
|
user modes that ngIRCd supports.
|
||||||
|
|
||||||
|
|
||||||
|
I. User Modes
|
||||||
|
~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
User modes are attributes a user has in the network, regardless of the
|
||||||
|
channels he is using at the moment.
|
||||||
|
|
||||||
|
mode since description
|
||||||
|
|
||||||
|
a 0.3.0 User is away.
|
||||||
|
b 20 User blocks private messages and notices.
|
||||||
|
B 20 User is flagged as a "bot".
|
||||||
|
c 17 IRC operator wants to receive connect/disconnect NOTICEs.
|
||||||
|
C 19 Only users that share a channel are allowed to send messages.
|
||||||
|
i 0.0.1 User is "invisible".
|
||||||
|
o 0.0.1 User is IRC operator.
|
||||||
|
q 20 User is protected, can not be kicked from a channel.
|
||||||
|
r 0.0.1 User is restricted.
|
||||||
|
R (1) 19 User is registered (e.g. by NickServ).
|
||||||
|
s 0.4.0 User wants to receive server notices.
|
||||||
|
w 0.11.0 User wants to receive WALLOPS messages.
|
||||||
|
x 17 Hostname of this user is "cloaked".
|
||||||
|
|
||||||
|
II. Channel Modes
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Channel modes are attributes of specific channels which are valid for all
|
||||||
|
users joined (or trying to join) to this channel. Some modes add and remove
|
||||||
|
users to lists (e.g. "invite list", "ban list"), others have parameters
|
||||||
|
(like "channel key"), most are simple flags (like "moderated").
|
||||||
|
|
||||||
|
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).
|
||||||
|
l 0.6.0 Channel has a user limit.
|
||||||
|
m 0.3.0 Channel is moderated, only "voiced" users can send messages.
|
||||||
|
M 20 Only registered users (and IRC Ops) can send messages.
|
||||||
|
n 0.3.0 Channel doesn't allow messages of users not being members.
|
||||||
|
O 18 Only IRC operators are allowed to join this channel.
|
||||||
|
P 0.5.0 Channel is "persistent".
|
||||||
|
Q 20 Nobody can be kicked from the channel.
|
||||||
|
r (1) 19 Channel is "registered" (e.g. by ChanServ).
|
||||||
|
R 19 Only registered users are allowed to join this channel.
|
||||||
|
s 0.9.0 Channel is "secret".
|
||||||
|
t 0.3.0 Only ChanOps are allowed to modify the channel topic.
|
||||||
|
V 20 Channel doesn't allow invites.
|
||||||
|
z 16 Only users connected via SSL are allowed to join the channel.
|
||||||
|
|
||||||
|
III. Channel User Modes
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Channel user modes are attributes that a particular user has in a specific
|
||||||
|
channel of which he is a member.
|
||||||
|
|
||||||
|
mode since description
|
||||||
|
|
||||||
|
q 20 User is channel owner can only be set by a service, other
|
||||||
|
owner and irc op. Can promote other users to q, a, o, h, v.
|
||||||
|
a 20 User is channel admin and can promote other users to v, h, o
|
||||||
|
o 0.2.0 User is channel operator and can op/kick/... other members.
|
||||||
|
h 20 User is half op and can set channel modes imntvIbek and kick
|
||||||
|
voiced and normal users.
|
||||||
|
v 0.2.0 User is "voiced" and can speak even if channel is moderated.
|
||||||
|
|
||||||
|
|
||||||
|
Notes
|
||||||
|
~~~~~
|
||||||
|
|
||||||
|
(1) This mode is not set by ngIRCd itself but by services. ngIRCd handles
|
||||||
|
the mode transparently and possibly adjusts its behaviour.
|
||||||
@@ -1,9 +1,8 @@
|
|||||||
|
|
||||||
ngIRCd - Next Generation IRC Server
|
ngIRCd - Next Generation IRC Server
|
||||||
|
http://ngircd.barton.de/
|
||||||
|
|
||||||
(c)2001-2010 Alexander Barton
|
(c)2001-2012 Alexander Barton and Contributors.
|
||||||
alex@barton.de, http://www.barton.de/
|
|
||||||
|
|
||||||
ngIRCd is free software and published under the
|
ngIRCd is free software and published under the
|
||||||
terms of the GNU General Public License.
|
terms of the GNU General Public License.
|
||||||
|
|
||||||
@@ -27,53 +26,65 @@ list can be updated. Thanks for your help!
|
|||||||
Platform Compiler ngIRCd Date Tester C M T R See
|
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)
|
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
|
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
|
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.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
|
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/darwin9.7.0 gcc 4.0.1 14.1 09-08-04 alex Y Y Y Y (3)
|
||||||
i386/apple/darwin10.4.0 gcc 4.2.1 17 10-11-07 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.9 gcc 3.2.2 CVSHEAD 04-02-24 alex Y Y Y Y
|
||||||
i386/pc/solaris2.11 gcc 3.4.3 17 10-11-07 alex Y Y N 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/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 17 10-11-07 alex Y Y Y Y (3)
|
i386/unknown/freebsd6.2 gcc 3.4.6 20~rc1 12-11-13 alex Y Y Y Y (3)
|
||||||
i386/unknown/freebsd7.3 gcc 4.2.1 17 10-11-07 alex Y Y Y Y (3)
|
i386/unknown/freebsd7.3 gcc 4.2.1 20~rc1 12-11-13 alex Y Y Y Y (3)
|
||||||
i686/unknown/gnu0.3 gcc 4.4.5 17 10-11-07 alex Y Y Y Y
|
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)
|
i686/unkn./kfreebsd7.2-gnu gcc 4.3.4 15 09-12-02 alex Y Y Y Y (3)
|
||||||
i386/unknown/netbsdelf1.6.1 gcc 2.95.3 CVSHEAD 04-02-24 alex Y Y Y Y
|
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/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 17 10-11-07 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 17 10-11-07 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/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)
|
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 15 10-01-22 alex Y Y N Y
|
i586/pc/haiku gcc 2.95.3 19.2~138 12-10-11 user Y Y N N
|
||||||
|
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/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 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)
|
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)
|
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)
|
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 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.0.1 Orig. A/UX 17 10-11-07 alex Y Y N Y (2)
|
||||||
m68k/apple/aux3.1.1 Orig. A/UX 0.7.x-CVS 03-04-22 alex Y Y Y 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
|
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 ? ?
|
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/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.1.0 gcc 4.0 0.9.x-CVS 05-06-27 alex Y Y Y Y
|
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/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
|
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.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/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
|
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 17 10-11-07 alex Y Y Y Y (3)
|
x86_64/apple/darwin12.2.0 gcc 4.2.1 20~rc1 12-11-13 alex Y Y Y Y (3)
|
||||||
x86_64/unknown/linux-gnu gcc 4.3.2 17 10-11-07 alex Y Y Y Y (1)
|
x86_64/unknown/freebsd8.1 gcc 4.2.1 20~rc1 12-11-13 alex Y Y Y Y (3)
|
||||||
x86_64/unknown/openbsd4.7 gcc 3.3.5 17 10-11-07 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 20~rc1 12-02-26 alex Y Y Y Y (1)
|
||||||
|
x86_64/unknown/openbsd4.7 gcc 3.3.5 20~rc1 12-02-26 alex Y Y Y Y (3)
|
||||||
|
x86_64/unknown/openbsd4.8 gcc 4.2.1 20~rc1 12-11-13 alex Y Y Y Y (3)
|
||||||
|
|
||||||
|
|
||||||
Notes
|
Notes
|
||||||
~~~~~
|
~~~~~
|
||||||
|
|
||||||
(1) i686/pc/linux-gnu & x86_64/unknown/linux-gnu:
|
(1) */*/linux-gnu (Linux platforms):
|
||||||
ngIRCd has been tested with various Linux distributions, such as SuSE,
|
ngIRCd has been tested with various Linux distributions, such as SuSE,
|
||||||
RedHat, Debian, and Gentoo using Kernels 2.2.x, 2.4.x and 2.6.x with
|
RedHat, Debian, and Gentoo using Kernels 2.2.x, 2.4.x and 2.6.x with
|
||||||
various versions of the GNU C compiler (starting with 2.95.x and up to
|
various versions of the GNU C compiler (starting with 2.95.x and up to
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
|
|
||||||
ngIRCd - Next Generation IRC Server
|
ngIRCd - Next Generation IRC Server
|
||||||
|
http://ngircd.barton.de/
|
||||||
|
|
||||||
(c)2001-2008 Alexander Barton,
|
(c)2001-2012 Alexander Barton and Contributors.
|
||||||
alex@barton.de, http://www.barton.de/
|
|
||||||
|
|
||||||
ngIRCd is free software and published under the
|
ngIRCd is free software and published under the
|
||||||
terms of the GNU General Public License.
|
terms of the GNU General Public License.
|
||||||
|
|
||||||
@@ -82,11 +81,17 @@ The following <serverflags> are defined at the moment:
|
|||||||
- H: The server supports the "enhanced server handshake", see section II.2
|
- H: The server supports the "enhanced server handshake", see section II.2
|
||||||
for a detailed description.
|
for a detailed description.
|
||||||
|
|
||||||
|
- M: Changing client "metadata" (hostname, real name, ...) using the
|
||||||
|
METADATA command is supported.
|
||||||
|
|
||||||
- o: IRC operators are allowed to change channel- and channel-user-modes
|
- o: IRC operators are allowed to change channel- and channel-user-modes
|
||||||
even if they aren't channel-operator of the affected channel.
|
even if they aren't channel-operator of the affected channel.
|
||||||
|
|
||||||
- S: The server supports the SERVICE command (on this link).
|
- S: The server supports the SERVICE command (on this link).
|
||||||
|
|
||||||
|
- X: Server supports XOP channel modes (owner, admin, halfop) and supports
|
||||||
|
these user prefixes in CHANINFO commands, for example.
|
||||||
|
|
||||||
- Z: Compressed server links are supported by the server.
|
- Z: Compressed server links are supported by the server.
|
||||||
|
|
||||||
Example for a complete <flags> string: "ngircd|0.7.5:CZ".
|
Example for a complete <flags> string: "ngircd|0.7.5:CZ".
|
||||||
@@ -134,7 +139,7 @@ protocol which allows at max 15 arguments per command).
|
|||||||
Please see <http://www.irc.org/tech_docs/005.html> for details.
|
Please see <http://www.irc.org/tech_docs/005.html> for details.
|
||||||
|
|
||||||
The information exchanged using ISUPPORT can be used to detect configuration
|
The information exchanged using ISUPPORT can be used to detect configuration
|
||||||
incompatibilities (different maximum nick name length, for example) and
|
incompatibilities (different maximum nickname length, for example) and
|
||||||
therefore to disconnect the peer prior to registering it in the network.
|
therefore to disconnect the peer prior to registering it in the network.
|
||||||
|
|
||||||
|
|
||||||
@@ -181,3 +186,69 @@ first command sent to the server, even before USER and NICK commands!
|
|||||||
The <password> must be set in the server configuration file to prevent
|
The <password> must be set in the server configuration file to prevent
|
||||||
unauthorized clients to fake their identity; it is an arbitrary string.
|
unauthorized clients to fake their identity; it is an arbitrary string.
|
||||||
|
|
||||||
|
|
||||||
|
II.5 Client character encoding conversion
|
||||||
|
|
||||||
|
Command: CHARCONV
|
||||||
|
Parameters: <client-charset>
|
||||||
|
Used by: registered clients
|
||||||
|
Replies: RPL_IP_CHARCONV, ERR_IP_CHARCONV
|
||||||
|
|
||||||
|
A client can set its character set encoding using the CHARCONV command:
|
||||||
|
after receiving such a command, the server translates all message data
|
||||||
|
received from the client using the set <client-charset> to the server
|
||||||
|
encoding (UTF-8), and all message data which is to be sent to the client
|
||||||
|
from the server encoding (UTF-8) to <client-charset>.
|
||||||
|
|
||||||
|
The list of supported client character sets is implementation dependent.
|
||||||
|
|
||||||
|
If a client sets its <client-charset> to the server encoding (UTF-8),
|
||||||
|
it disables all conversions; the connection behaves as if no CHARCONV
|
||||||
|
command has been sent at all in this session.
|
||||||
|
|
||||||
|
|
||||||
|
II.6 Update client "metadata"
|
||||||
|
|
||||||
|
Command: METADATA
|
||||||
|
Parameters: <target> <key> <value>
|
||||||
|
Used by: servers only
|
||||||
|
|
||||||
|
The METADATA command is used on server-links to update "metadata" information
|
||||||
|
of clients, like the hostname, the info text ("real name"), or the user name.
|
||||||
|
|
||||||
|
The server updates its client database according to the received <key> and
|
||||||
|
<value> parameters, and passes the METADATA command on to all the other
|
||||||
|
servers in the network that support this command (see section II.1 "Register
|
||||||
|
new server link", <serverflag> "M"), even if it doesn't support the given
|
||||||
|
<key> itself: unknown <key> names are ignored silently!
|
||||||
|
|
||||||
|
The following <key> names are defined:
|
||||||
|
|
||||||
|
- "host": the hostname of a client (can't be empty)
|
||||||
|
- "cloakhost": the cloaked hostname of a client
|
||||||
|
- "info": info text ("real name") of a client
|
||||||
|
- "user": the user name of a client (can't be empty)
|
||||||
|
|
||||||
|
|
||||||
|
III. Numerics used by IRC+ Protocol
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
The IRC+ protocol uses numerics in the range 800-899 which aren't used by
|
||||||
|
RFC 2812 and hopefully don't clash with other implementations ...
|
||||||
|
|
||||||
|
Numerics 800-849 are used for status and success messages, and numerics
|
||||||
|
850-899 are failure and error messages.
|
||||||
|
|
||||||
|
|
||||||
|
III.1 IRC+ status and success numerics
|
||||||
|
|
||||||
|
801 - RPL_IP_CHARCONV
|
||||||
|
%1 :Client encoding set"
|
||||||
|
|
||||||
|
%1 client character set
|
||||||
|
|
||||||
|
|
||||||
|
III.2 IRC+ failure and error numerics
|
||||||
|
|
||||||
|
851 - ERR_IP_CHARCONV
|
||||||
|
:Can't initialize client encoding
|
||||||
|
|||||||
@@ -1,12 +1,10 @@
|
|||||||
|
|
||||||
ngIRCd - Next Generation IRC Server
|
ngIRCd - Next Generation IRC Server
|
||||||
|
http://ngircd.barton.de/
|
||||||
(c)2001-2010 Alexander Barton,
|
|
||||||
alex@barton.de, http://www.barton.de/
|
|
||||||
|
|
||||||
|
(c)2001-2012 Alexander Barton and Contributors.
|
||||||
ngIRCd is free software and published under the
|
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 --
|
-- 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
|
Server 2008 & 2008 R2, Windows Vista, and Windows 7 -- so ngIRCd should be
|
||||||
able to run on all of these platforms.
|
able to run on all of these platforms.
|
||||||
|
|
||||||
But please note that the poll() API function is not fully implemented by
|
But please note that two things:
|
||||||
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
|
1. Don't use the poll() IO API
|
||||||
4.25 for details:
|
|
||||||
|
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
|
"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
|
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.
|
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).
|
||||||
|
|
||||||
|
|||||||
@@ -1,22 +1,27 @@
|
|||||||
|
|
||||||
ngIRCd - Next Generation IRC Server
|
ngIRCd - Next Generation IRC Server
|
||||||
|
http://ngircd.barton.de/
|
||||||
|
|
||||||
(c)2001-2008 Alexander Barton,
|
(c)2001-2011 Alexander Barton and Contributors.
|
||||||
alex@barton.de, http://www.barton.de/
|
|
||||||
|
|
||||||
ngIRCd is free software and published under the
|
ngIRCd is free software and published under the
|
||||||
terms of the GNU General Public License.
|
terms of the GNU General Public License.
|
||||||
|
|
||||||
-- Services.txt --
|
-- Services.txt --
|
||||||
|
|
||||||
|
|
||||||
At the moment, ngIRCd doesn't implement a "special IRC services interface".
|
ngIRCd doesn't implement a "special IRC services interface", but services
|
||||||
But services acting as a "regular server" are supported, either using the IRC
|
acting as a "regular servers" ("pseudo servers") are supported, either
|
||||||
protocol defined in RFC 1459 or RFC 2812.
|
using the IRC protocol as defined in RFC 1459 or RFC 2812.
|
||||||
|
|
||||||
Services have been tested using "IRC Services" version 5.x by Andrew Church,
|
Support for Services has been tested using
|
||||||
homepage: <http://www.ircservices.za.net/>. This document describes setting up
|
- Anope 1.9.8 or later (<http://www.anope.org/>; unreleased!)
|
||||||
ngIRCd and these services.
|
- Atheme 7.0.2 or later (<http://www.atheme.net>)
|
||||||
|
- "IRC Services" 5.1.x by Andrew Church (<http://achurch.org/services/>)
|
||||||
|
|
||||||
|
This document describes setting up ngIRCd and these services.
|
||||||
|
|
||||||
|
Please let us know if you are successfully using other IRC service packages or
|
||||||
|
which problems you encounter -- thanks!
|
||||||
|
|
||||||
|
|
||||||
Setting up ngIRCd
|
Setting up ngIRCd
|
||||||
@@ -36,6 +41,72 @@ Example:
|
|||||||
ServiceMask = *Serv
|
ServiceMask = *Serv
|
||||||
|
|
||||||
|
|
||||||
|
Setting up Anope 1.9.x
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Anope 1.9.8 or later (<http://www.anope.org/>; unreleased as of 2012-11-10)
|
||||||
|
may be used with ngIRCd using the "ngircd" protocol module.
|
||||||
|
Until Anope 1.9.8 is released, you have to use the sources from the Anope
|
||||||
|
development GIT tree, see <http://sourceforge.net/projects/anope/develop/>!
|
||||||
|
|
||||||
|
At least the following settings have to be tweaked, in addition to all the
|
||||||
|
settings marked as required by Anope:
|
||||||
|
|
||||||
|
In conf/services.conf:
|
||||||
|
|
||||||
|
define
|
||||||
|
{
|
||||||
|
name = "services.host"
|
||||||
|
value = "services.irc.net"
|
||||||
|
}
|
||||||
|
|
||||||
|
uplink
|
||||||
|
{
|
||||||
|
host = "server.irc.net"
|
||||||
|
port = 6667
|
||||||
|
password = "123abc"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Load ngIRCd protocol module
|
||||||
|
module { name = "ngircd" }
|
||||||
|
|
||||||
|
networkinfo
|
||||||
|
{
|
||||||
|
# Must be set to the "MaxNickLength" setting of ngIRCd!
|
||||||
|
nicklen = 9
|
||||||
|
|
||||||
|
chanlen = 50
|
||||||
|
}
|
||||||
|
|
||||||
|
In conf/nickserv.conf:
|
||||||
|
|
||||||
|
nickserv
|
||||||
|
{
|
||||||
|
# not required if you are running ngIRCd with a higher nickname limit
|
||||||
|
# ("MaxNickLength") than 11 characters, but REQUIRED by default!
|
||||||
|
guestnickprefix = "G-"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Setting up Atheme 7.0.2 or later
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Atheme 7.0.2 or later (<http://www.atheme.net>) 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.
|
||||||
|
|
||||||
|
|
||||||
Setting up IRC Services 5.1.x
|
Setting up IRC Services 5.1.x
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
@@ -65,6 +136,3 @@ In modules.conf:
|
|||||||
|
|
||||||
The documentation of IRC Services can be found here:
|
The documentation of IRC Services can be found here:
|
||||||
<http://www.ircservices.za.net/docs/>
|
<http://www.ircservices.za.net/docs/>
|
||||||
|
|
||||||
Please let us know if you are successfully using other IRC service packages or
|
|
||||||
which problems you encounter, thanks!
|
|
||||||
|
|||||||
@@ -95,11 +95,15 @@
|
|||||||
# Maximum number of channels a user can be member of (0: no limit):
|
# Maximum number of channels a user can be member of (0: no limit):
|
||||||
;MaxJoins = 10
|
;MaxJoins = 10
|
||||||
|
|
||||||
# Maximum length of an user nick name (Default: 9, as in RFC 2812).
|
# Maximum length of an user nickname (Default: 9, as in RFC 2812).
|
||||||
# Please note that all servers in an IRC network MUST use the same
|
# Please note that all servers in an IRC network MUST use the same
|
||||||
# maximum nick name length!
|
# maximum nickname length!
|
||||||
;MaxNickLength = 9
|
;MaxNickLength = 9
|
||||||
|
|
||||||
|
# Maximum number of channels returned in response to a /list
|
||||||
|
# command (0: unlimited):
|
||||||
|
;MaxListSize = 100
|
||||||
|
|
||||||
# After <PingTimeout> seconds of inactivity the server will send a
|
# After <PingTimeout> seconds of inactivity the server will send a
|
||||||
# PING to the peer to test whether it is alive or not.
|
# PING to the peer to test whether it is alive or not.
|
||||||
;PingTimeout = 120
|
;PingTimeout = 120
|
||||||
@@ -125,11 +129,19 @@
|
|||||||
;ChrootDir = /var/empty
|
;ChrootDir = /var/empty
|
||||||
|
|
||||||
# Set this hostname for every client instead of the real one.
|
# Set this hostname for every client instead of the real one.
|
||||||
# Please note: don't use the percentage sign ("%"), it is reserved for
|
# Use %x to add the hashed value of the original hostname.
|
||||||
# future extensions!
|
;CloakHost = cloaked.host
|
||||||
;CloakHost = irc.example.net
|
|
||||||
|
|
||||||
# Set every clients' user name to their nick name
|
# Use this hostname for hostname cloaking on clients that have the
|
||||||
|
# user mode "+x" set, instead of the name of the server.
|
||||||
|
# Use %x to add the hashed value of the original hostname.
|
||||||
|
;CloakHostModeX = cloaked.user
|
||||||
|
|
||||||
|
# The Salt for cloaked hostname hashing. When undefined a random
|
||||||
|
# hash is generated after each server start.
|
||||||
|
;CloakHostSalt = abcdefghijklmnopqrstuvwxyz
|
||||||
|
|
||||||
|
# Set every clients' user name to their nickname
|
||||||
;CloakUserToNick = yes
|
;CloakUserToNick = yes
|
||||||
|
|
||||||
# Try to connect to other IRC servers using IPv4 and IPv6, if possible.
|
# Try to connect to other IRC servers using IPv4 and IPv6, if possible.
|
||||||
@@ -140,6 +152,8 @@
|
|||||||
;DNS = yes
|
;DNS = yes
|
||||||
|
|
||||||
# Do IDENT lookups if ngIRCd has been compiled with support for it.
|
# Do IDENT lookups if ngIRCd has been compiled with support for it.
|
||||||
|
# Users identified using IDENT are registered without the "~" character
|
||||||
|
# prepended to their user name.
|
||||||
;Ident = yes
|
;Ident = yes
|
||||||
|
|
||||||
# Enhance user privacy slightly (useful for IRC server on TOR or I2P)
|
# Enhance user privacy slightly (useful for IRC server on TOR or I2P)
|
||||||
@@ -155,12 +169,30 @@
|
|||||||
# they are not(!) channel-operators?
|
# they are not(!) channel-operators?
|
||||||
;OperCanUseMode = no
|
;OperCanUseMode = no
|
||||||
|
|
||||||
|
# Should IRC Operators get AutoOp (+o) in persistent (+P) channels?
|
||||||
|
;OperChanPAutoOp = yes
|
||||||
|
|
||||||
# Mask IRC Operator mode requests as if they were coming from the
|
# Mask IRC Operator mode requests as if they were coming from the
|
||||||
# server? (This is a compatibility hack for ircd-irc2 servers)
|
# server? (This is a compatibility hack for ircd-irc2 servers)
|
||||||
;OperServerMode = no
|
;OperServerMode = no
|
||||||
|
|
||||||
# Use PAM if ngIRCd has been compiled with support for it.
|
# Use PAM if ngIRCd has been compiled with support for it.
|
||||||
;PAM = no
|
# Users identified using PAM are registered without the "~" character
|
||||||
|
# prepended to their user name.
|
||||||
|
;PAM = yes
|
||||||
|
|
||||||
|
# When PAM is enabled, all clients are required to be authenticated
|
||||||
|
# using PAM; connecting to the server without successful PAM
|
||||||
|
# authentication isn't possible.
|
||||||
|
# If this option is set, clients not sending a password are still
|
||||||
|
# allowed to connect: they won't become "identified" and keep the "~"
|
||||||
|
# character prepended to their supplied user name.
|
||||||
|
# Please note: To make some use of this behavior, it most probably
|
||||||
|
# isn't useful to enable "Ident", "PAM" and "PAMIsOptional" at the
|
||||||
|
# same time, because you wouldn't be able to distinguish between
|
||||||
|
# Ident'ified and PAM-authenticated users: both don't have a "~"
|
||||||
|
# character prepended to their respective user names!
|
||||||
|
;PAMIsOptional = no
|
||||||
|
|
||||||
# Allow Pre-Defined Channels only (see Section [Channels])
|
# Allow Pre-Defined Channels only (see Section [Channels])
|
||||||
;PredefChannelsOnly = no
|
;PredefChannelsOnly = no
|
||||||
@@ -209,7 +241,7 @@
|
|||||||
# [Operator] sections are used to define IRC Operators. There may be
|
# [Operator] sections are used to define IRC Operators. There may be
|
||||||
# more than one [Operator] block, one for each local operator.
|
# more than one [Operator] block, one for each local operator.
|
||||||
|
|
||||||
# ID of the operator (may be different of the nick name)
|
# ID of the operator (may be different of the nickname)
|
||||||
;Name = TheOper
|
;Name = TheOper
|
||||||
|
|
||||||
# Password of the IRC operator
|
# Password of the IRC operator
|
||||||
@@ -272,15 +304,16 @@
|
|||||||
# Connect to the remote server using TLS/SSL (Default: false)
|
# Connect to the remote server using TLS/SSL (Default: false)
|
||||||
;SSLConnect = yes
|
;SSLConnect = yes
|
||||||
|
|
||||||
# Define a (case insensitive) mask matching nick names that should be
|
# Define a (case insensitive) list of masks matching nicknames that
|
||||||
# treated as IRC services when introduced via this remote server.
|
# should be treated as IRC services when introduced via this remote
|
||||||
|
# server, separated by commas (",").
|
||||||
# REGULAR SERVERS DON'T NEED this parameter, so leave it empty
|
# REGULAR SERVERS DON'T NEED this parameter, so leave it empty
|
||||||
# (which is the default).
|
# (which is the default).
|
||||||
# When you are connecting IRC services which mask as a IRC server
|
# When you are connecting IRC services which mask as a IRC server
|
||||||
# and which use "virtual users" to communicate with, for example
|
# and which use "virtual users" to communicate with, for example
|
||||||
# "NickServ" and "ChanServ", you should set this parameter to
|
# "NickServ" and "ChanServ", you should set this parameter to
|
||||||
# something like "*Serv".
|
# something like "*Serv" or "NickServ,ChanServ,XyzServ".
|
||||||
;ServiceMask = *Serv
|
;ServiceMask = *Serv,Global
|
||||||
|
|
||||||
[Server]
|
[Server]
|
||||||
# More [Server] sections, if you like ...
|
# More [Server] sections, if you like ...
|
||||||
|
|||||||
@@ -1,15 +1,12 @@
|
|||||||
#
|
#
|
||||||
# ngIRCd -- The Next Generation IRC Daemon
|
# ngIRCd -- The Next Generation IRC Daemon
|
||||||
# Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
# Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors
|
||||||
#
|
#
|
||||||
# Dieses Programm ist freie Software. Sie koennen es unter den Bedingungen
|
# This program is free software; you can redistribute it and/or modify
|
||||||
# der GNU General Public License (GPL), wie von der Free Software Foundation
|
# it under the terms of the GNU General Public License as published by
|
||||||
# herausgegeben, weitergeben und/oder modifizieren, entweder unter Version 2
|
# the Free Software Foundation; either version 2 of the License, or
|
||||||
# der Lizenz oder (wenn Sie es wuenschen) jeder spaeteren Version.
|
# (at your option) any later version.
|
||||||
# Naehere Informationen entnehmen Sie bitter der Datei COPYING. Eine Liste
|
# Please read the file COPYING, README and AUTHORS for more information.
|
||||||
# der an ngIRCd beteiligten Autoren finden Sie in der Datei AUTHORS.
|
|
||||||
#
|
|
||||||
# $Id: Makefile.am,v 1.6 2006/12/25 16:13:26 alex Exp $
|
|
||||||
#
|
#
|
||||||
|
|
||||||
TEMPLATE_MANS = ngircd.conf.5.tmpl ngircd.8.tmpl
|
TEMPLATE_MANS = ngircd.conf.5.tmpl ngircd.8.tmpl
|
||||||
@@ -17,10 +14,10 @@ TEMPLATE_MANS = ngircd.conf.5.tmpl ngircd.8.tmpl
|
|||||||
SUFFIXES = .tmpl .
|
SUFFIXES = .tmpl .
|
||||||
|
|
||||||
.tmpl:
|
.tmpl:
|
||||||
sed \
|
$(AM_V_GEN)sed \
|
||||||
-e s@:SBINDIR:@${sbindir}@ \
|
-e "s@:SBINDIR:@${sbindir}@" \
|
||||||
-e s@:BINDIR:@${bindir}@ \
|
-e "s@:BINDIR:@${bindir}@" \
|
||||||
-e s@:ETCDIR:@${sysconfdir}@ \
|
-e "s@:ETCDIR:@${sysconfdir}@" \
|
||||||
<$< >$@
|
<$< >$@
|
||||||
|
|
||||||
man_MANS = ngircd.conf.5 ngircd.8
|
man_MANS = ngircd.conf.5 ngircd.8
|
||||||
|
|||||||
@@ -1,30 +1,35 @@
|
|||||||
.\"
|
.\"
|
||||||
.\" ngircd(8) manual page template
|
.\" ngircd(8) manual page template
|
||||||
.\"
|
.\"
|
||||||
.TH ngircd 8 "Dec 2010" ngircd "ngIRCd Manual"
|
.TH ngircd 8 "Oct 2012" ngIRCd "ngIRCd Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
ngIRCd \- the next generation IRC daemon
|
ngIRCd \- the "next generation" IRC daemon
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.B ngircd [
|
.B ngircd
|
||||||
|
[
|
||||||
.I Options
|
.I Options
|
||||||
.B ]
|
]
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
.BR ngIRCd
|
.BR ngIRCd
|
||||||
is a free open source daemon for the Internet Relay Chat (IRC),
|
is a free, portable and lightweight Internet Relay Chat server for small
|
||||||
developed under the GNU General Public License (GPL).
|
or private networks, developed under the GNU General Public License (GPL).
|
||||||
|
It is easy to configure, can cope with dynamic IP addresses, and supports
|
||||||
|
IPv6, SSL-protected connections as well as PAM for authentication.
|
||||||
|
It is written from scratch and not based on the original IRCd.
|
||||||
.PP
|
.PP
|
||||||
It's written from scratch and is not based upon the original IRCd like
|
The name ngIRCd means
|
||||||
many others. It is easy to configure, supports server links (even with
|
.IR "next generation IRC daemon",
|
||||||
original ircd's) and runs on hosts with changing IP addresses (such as
|
which is a little bit exaggerated:
|
||||||
dial-in networks).
|
.IR "lightweight Internet Relay Chat server"
|
||||||
|
most probably would have been a better name :-)
|
||||||
.PP
|
.PP
|
||||||
Currently supported platforms include AIX, A/UX, FreeBSD, HP-UX, IRIX,
|
Currently supported platforms include AIX, A/UX, FreeBSD, HP-UX, IRIX,
|
||||||
Linux, Mac OS X, NetBSD, OpenBSD, Solaris, and Windows with Cygwin.
|
Linux, Mac OS X, NetBSD, OpenBSD, Solaris, and Windows with Cygwin.
|
||||||
.PP
|
.PP
|
||||||
As ngIRCd relies on UNIX standards and uses GNU automake and GNU autoconf
|
As ngIRCd relies on UNIX standards and uses GNU automake and GNU autoconf
|
||||||
there are good chances that it also supports other UNIX-based operating
|
there are good chances that it also supports other UNIX-based operating
|
||||||
systems as well. By default, ngIRCd writes diagnostic and informational messages using
|
systems as well. By default, ngIRCd writes diagnostic and informational
|
||||||
the syslog mechanism.
|
messages using the syslog mechanism.
|
||||||
.SH OPTIONS
|
.SH OPTIONS
|
||||||
The default behavior of
|
The default behavior of
|
||||||
.BR ngircd
|
.BR ngircd
|
||||||
@@ -78,7 +83,7 @@ It's wise to use "ngircd \-\-configtest" to validate the configuration file
|
|||||||
after changing it.
|
after changing it.
|
||||||
.SH DEBUGGING
|
.SH DEBUGGING
|
||||||
When ngIRCd is compiled with debug code, that is, its source code has
|
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
|
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
|
line options and two more signals to debug problems with the daemon itself
|
||||||
or IRC clients:
|
or IRC clients:
|
||||||
@@ -91,7 +96,7 @@ Enable debug mode and log extra messages.
|
|||||||
\fB\-s\fR, \fB\-\-sniffer\fR
|
\fB\-s\fR, \fB\-\-sniffer\fR
|
||||||
Enable IRC protocol sniffer, which logs all sent and received IRC commands to
|
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
|
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
|
.PP
|
||||||
\fBSignals:\fR
|
\fBSignals:\fR
|
||||||
.TP
|
.TP
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
.\"
|
.\"
|
||||||
.\" ngircd.conf(5) manual page template
|
.\" ngircd.conf(5) manual page template
|
||||||
.\"
|
.\"
|
||||||
.TH ngircd.conf 5 "Jun 2011" ngircd "ngIRCd Manual"
|
.TH ngircd.conf 5 "Nov 2012" ngIRCd "ngIRCd Manual"
|
||||||
.SH NAME
|
.SH NAME
|
||||||
ngircd.conf \- configuration file of ngIRCd
|
ngircd.conf \- configuration file of ngIRCd
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
@@ -132,9 +132,8 @@ the pidfile resides in must be writable by the ngIRCd user and exist in the
|
|||||||
chroot directory (if configured, see above).
|
chroot directory (if configured, see above).
|
||||||
.TP
|
.TP
|
||||||
\fBPorts\fR (list of numbers)
|
\fBPorts\fR (list of numbers)
|
||||||
Ports on which the server should listen. There may be more than one port,
|
Ports on which the server should listen for unencrypted connections. There
|
||||||
separated with commas (","). Default: 6667, unless \fBSSL_Ports\fR are also
|
may be more than one port, separated with commas (","). Default: 6667.
|
||||||
specified.
|
|
||||||
.TP
|
.TP
|
||||||
\fBServerGID\fR (string or number)
|
\fBServerGID\fR (string or number)
|
||||||
Group ID under which the ngIRCd should run; you can use the name of the
|
Group ID under which the ngIRCd should run; you can use the name of the
|
||||||
@@ -179,10 +178,13 @@ Maximum number of channels a user can be member of (0: no limit).
|
|||||||
Default: 10.
|
Default: 10.
|
||||||
.TP
|
.TP
|
||||||
\fBMaxNickLength\fR (number)
|
\fBMaxNickLength\fR (number)
|
||||||
Maximum length of an user nick name (Default: 9, as in RFC 2812). Please
|
Maximum length of an user nickname (Default: 9, as in RFC 2812). Please
|
||||||
note that all servers in an IRC network MUST use the same maximum nick name
|
note that all servers in an IRC network MUST use the same maximum nickname
|
||||||
length!
|
length!
|
||||||
.TP
|
.TP
|
||||||
|
\fBMaxListSize\fR (number)
|
||||||
|
Maximum number of channels returned in response to a LIST command. Default: 100.
|
||||||
|
.TP
|
||||||
\fBPingTimeout\fR (number)
|
\fBPingTimeout\fR (number)
|
||||||
After <PingTimeout> seconds of inactivity the server will send a PING to
|
After <PingTimeout> seconds of inactivity the server will send a PING to
|
||||||
the peer to test whether it is alive or not. Default: 120.
|
the peer to test whether it is alive or not. Default: 120.
|
||||||
@@ -213,16 +215,19 @@ For this to work the server must have been started with root privileges!
|
|||||||
.TP
|
.TP
|
||||||
\fBCloakHost\fR (string)
|
\fBCloakHost\fR (string)
|
||||||
Set this hostname for every client instead of the real one. Default: empty,
|
Set this hostname for every client instead of the real one. Default: empty,
|
||||||
don't change.
|
don't change. Use %x to add the hashed value of the original hostname.
|
||||||
.PP
|
.TP
|
||||||
.RS
|
\fBCloakHostModeX\fR (string)
|
||||||
.B Please note:
|
Use this hostname for hostname cloaking on clients that have the user mode
|
||||||
.br
|
"+x" set, instead of the name of the server. Default: empty, use the name
|
||||||
Don't use the percentage sign ("%"), it is reserved for future extensions!
|
of the server. Use %x to add the hashed value of the original hostname
|
||||||
.RE
|
.TP
|
||||||
|
\fBCloakHostSalt\fR (string)
|
||||||
|
The Salt for cloaked hostname hashing. When undefined a random hash is
|
||||||
|
generated after each server start.
|
||||||
.TP
|
.TP
|
||||||
\fBCloakUserToNick\fR (boolean)
|
\fBCloakUserToNick\fR (boolean)
|
||||||
Set every clients' user name to their nick name and hide the one supplied
|
Set every clients' user name to their nickname and hide the one supplied
|
||||||
by the IRC client. Default: no.
|
by the IRC client. Default: no.
|
||||||
.TP
|
.TP
|
||||||
\fBConnectIPv4\fR (boolean)
|
\fBConnectIPv4\fR (boolean)
|
||||||
@@ -244,6 +249,8 @@ Default: yes.
|
|||||||
\fBIdent\fR (boolean)
|
\fBIdent\fR (boolean)
|
||||||
If ngIRCd is compiled with IDENT support this can be used to disable IDENT
|
If ngIRCd is compiled with IDENT support this can be used to disable IDENT
|
||||||
lookups at run time.
|
lookups at run time.
|
||||||
|
Users identified using IDENT are registered without the "~" character
|
||||||
|
prepended to their user name.
|
||||||
Default: yes.
|
Default: yes.
|
||||||
.TP
|
.TP
|
||||||
\fBMorePrivacy\fR (boolean)
|
\fBMorePrivacy\fR (boolean)
|
||||||
@@ -264,6 +271,10 @@ while connecting. Default: no.
|
|||||||
Should IRC Operators be allowed to use the MODE command even if they are
|
Should IRC Operators be allowed to use the MODE command even if they are
|
||||||
not(!) channel-operators? Default: no.
|
not(!) channel-operators? Default: no.
|
||||||
.TP
|
.TP
|
||||||
|
\fBOperChanPAutoOp\fR (boolean)
|
||||||
|
Should IRC Operators get AutoOp (+o) in persistent (+P) channels?
|
||||||
|
Default: yes.
|
||||||
|
.TP
|
||||||
\fBOperServerMode\fR (boolean)
|
\fBOperServerMode\fR (boolean)
|
||||||
If \fBOperCanUseMode\fR is enabled, this may lead the compatibility problems
|
If \fBOperCanUseMode\fR is enabled, this may lead the compatibility problems
|
||||||
with Servers that run the ircd-irc2 Software. This Option "masks" mode
|
with Servers that run the ircd-irc2 Software. This Option "masks" mode
|
||||||
@@ -274,8 +285,23 @@ only enable it if you have ircd-irc2 servers in your IRC network.
|
|||||||
If ngIRCd is compiled with PAM support this can be used to disable all calls
|
If ngIRCd is compiled with PAM support this can be used to disable all calls
|
||||||
to the PAM library at runtime; all users connecting without password are
|
to the PAM library at runtime; all users connecting without password are
|
||||||
allowed to connect, all passwords given will fail.
|
allowed to connect, all passwords given will fail.
|
||||||
|
Users identified using PAM are registered without the "~" character
|
||||||
|
prepended to their user name.
|
||||||
Default: yes.
|
Default: yes.
|
||||||
.TP
|
.TP
|
||||||
|
\fBPAMIsOptional\fR (boolean)
|
||||||
|
When PAM is enabled, all clients are required to be authenticated using PAM;
|
||||||
|
connecting to the server without successful PAM authentication isn't possible.
|
||||||
|
If this option is set, clients not sending a password are still allowed to
|
||||||
|
connect: they won't become "identified" and keep the "~" character prepended
|
||||||
|
to their supplied user name.
|
||||||
|
Please note:
|
||||||
|
To make some use of this behavior, it most probably isn't useful to enable
|
||||||
|
"Ident", "PAM" and "PAMIsOptional" at the same time, because you wouldn't be
|
||||||
|
able to distinguish between Ident'ified and PAM-authenticated users: both
|
||||||
|
don't have a "~" character prepended to their respective user names!
|
||||||
|
Default: no.
|
||||||
|
.TP
|
||||||
\fBPredefChannelsOnly\fR (boolean)
|
\fBPredefChannelsOnly\fR (boolean)
|
||||||
If enabled, no new channels can be created. Useful if you do not want to have
|
If enabled, no new channels can be created. Useful if you do not want to have
|
||||||
other channels than those defined in [Channel] sections in the configuration
|
other channels than those defined in [Channel] sections in the configuration
|
||||||
@@ -343,7 +369,7 @@ sections are used to define IRC Operators. There may be more than one
|
|||||||
block, one for each local operator.
|
block, one for each local operator.
|
||||||
.TP
|
.TP
|
||||||
\fBName\fR (string)
|
\fBName\fR (string)
|
||||||
ID of the operator (may be different of the nick name).
|
ID of the operator (may be different of the nickname).
|
||||||
.TP
|
.TP
|
||||||
\fBPassword\fR (string)
|
\fBPassword\fR (string)
|
||||||
Password of the IRC operator.
|
Password of the IRC operator.
|
||||||
@@ -403,14 +429,16 @@ You can use the IRC Operator command CONNECT later on to create the link.
|
|||||||
Connect to the remote server using TLS/SSL. Default: false.
|
Connect to the remote server using TLS/SSL. Default: false.
|
||||||
.TP
|
.TP
|
||||||
\fBServiceMask\fR (string)
|
\fBServiceMask\fR (string)
|
||||||
Define a (case insensitive) mask matching nick names that should be treated as
|
Define a (case insensitive) list of masks matching nicknames that should be
|
||||||
IRC services when introduced via this remote server. REGULAR SERVERS DON'T NEED
|
treated as IRC services when introduced via this remote server, separated
|
||||||
this parameter, so leave it empty (which is the default).
|
by commas (","). REGULAR SERVERS DON'T NEED this parameter, so leave it empty
|
||||||
|
(which is the default).
|
||||||
.PP
|
.PP
|
||||||
.RS
|
.RS
|
||||||
When you are connecting IRC services which mask as a IRC server and which use
|
When you are connecting IRC services which mask as a IRC server and which use
|
||||||
"virtual users" to communicate with, for example "NickServ" and "ChanServ",
|
"virtual users" to communicate with, for example "NickServ" and "ChanServ",
|
||||||
you should set this parameter to something like "*Serv".
|
you should set this parameter to something like "*Serv", "*Serv,OtherNick",
|
||||||
|
or "NickServ,ChanServ,XyzServ".
|
||||||
.SH [CHANNEL]
|
.SH [CHANNEL]
|
||||||
Pre-defined channels can be configured in
|
Pre-defined channels can be configured in
|
||||||
.I [Channel]
|
.I [Channel]
|
||||||
|
|||||||
1
src/ipaddr/.gitignore
vendored
Normal file
1
src/ipaddr/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
Makefile.am
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
AUTOMAKE_OPTIONS = ansi2knr
|
|
||||||
|
|
||||||
INCLUDES = -I$(srcdir)/../portab
|
|
||||||
|
|
||||||
noinst_LIBRARIES = libngipaddr.a
|
|
||||||
|
|
||||||
libngipaddr_a_SOURCES = ng_ipaddr.c
|
|
||||||
|
|
||||||
noinst_HEADERS = ng_ipaddr.h
|
|
||||||
|
|
||||||
maintainer-clean-local:
|
|
||||||
rm -f Makefile Makefile.in
|
|
||||||
|
|
||||||
# -eof-
|
|
||||||
21
src/ipaddr/Makefile.ng
Normal file
21
src/ipaddr/Makefile.ng
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
#
|
||||||
|
# ipaddr/Makefile.am
|
||||||
|
# (c) 2008 Florian Westphal <fw@strlen.de>, public domain.
|
||||||
|
#
|
||||||
|
|
||||||
|
__ng_Makefile_am_template__
|
||||||
|
|
||||||
|
EXTRA_DIST = Makefile.ng
|
||||||
|
|
||||||
|
AM_CPPFLAGS = -I$(srcdir)/../portab
|
||||||
|
|
||||||
|
noinst_LIBRARIES = libngipaddr.a
|
||||||
|
|
||||||
|
libngipaddr_a_SOURCES = ng_ipaddr.c
|
||||||
|
|
||||||
|
noinst_HEADERS = ng_ipaddr.h
|
||||||
|
|
||||||
|
maintainer-clean-local:
|
||||||
|
rm -f Makefile Makefile.in Makefile.am
|
||||||
|
|
||||||
|
# -eof-
|
||||||
@@ -32,7 +32,9 @@ ng_ipaddr_init(ng_ipaddr_t *addr, const char *ip_str, UINT16 port)
|
|||||||
assert(ip_str);
|
assert(ip_str);
|
||||||
|
|
||||||
memset(&hints, 0, sizeof(hints));
|
memset(&hints, 0, sizeof(hints));
|
||||||
|
#ifdef AI_NUMERICHOST
|
||||||
hints.ai_flags = AI_NUMERICHOST;
|
hints.ai_flags = AI_NUMERICHOST;
|
||||||
|
#endif
|
||||||
#ifndef WANT_IPV6 /* do not convert ipv6 addresses */
|
#ifndef WANT_IPV6 /* do not convert ipv6 addresses */
|
||||||
hints.ai_family = AF_INET;
|
hints.ai_family = AF_INET;
|
||||||
#endif
|
#endif
|
||||||
@@ -47,8 +49,8 @@ ng_ipaddr_init(ng_ipaddr_t *addr, const char *ip_str, UINT16 port)
|
|||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
assert(sizeof(*addr) >= res0->ai_addrlen);
|
assert(sizeof(*addr) >= (size_t)res0->ai_addrlen);
|
||||||
if (sizeof(*addr) >= res0->ai_addrlen)
|
if (sizeof(*addr) >= (size_t)res0->ai_addrlen)
|
||||||
memcpy(addr, res0->ai_addr, res0->ai_addrlen);
|
memcpy(addr, res0->ai_addr, res0->ai_addrlen);
|
||||||
else
|
else
|
||||||
ret = -1;
|
ret = -1;
|
||||||
|
|||||||
2
src/ngircd/.gitignore
vendored
2
src/ngircd/.gitignore
vendored
@@ -1,3 +1,5 @@
|
|||||||
|
Makefile.am
|
||||||
check-help
|
check-help
|
||||||
check-version
|
check-version
|
||||||
ngircd
|
ngircd
|
||||||
|
ngircd.exe
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
#
|
#
|
||||||
# ngIRCd -- The Next Generation IRC Daemon
|
# ngIRCd -- The Next Generation IRC Daemon
|
||||||
# Copyright (c)2001-2010 Alexander Barton (alex@barton.de)
|
# Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors
|
||||||
#
|
#
|
||||||
# This program is free software; you can redistribute it and/or modify
|
# 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
|
# it under the terms of the GNU General Public License as published by
|
||||||
@@ -9,35 +9,107 @@
|
|||||||
# Please read the file COPYING, README and AUTHORS for more information.
|
# Please read the file COPYING, README and AUTHORS for more information.
|
||||||
#
|
#
|
||||||
|
|
||||||
AUTOMAKE_OPTIONS = ../portab/ansi2knr
|
__ng_Makefile_am_template__
|
||||||
|
|
||||||
INCLUDES = -I$(srcdir)/../portab -I$(srcdir)/../tool -I$(srcdir)/../ipaddr
|
EXTRA_DIST = Makefile.ng
|
||||||
|
|
||||||
|
AM_CPPFLAGS = -I$(srcdir)/../portab -I$(srcdir)/../tool -I$(srcdir)/../ipaddr
|
||||||
|
|
||||||
LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN \
|
LINTARGS = -weak -warnunixlib +unixlib -booltype BOOLEAN \
|
||||||
-varuse -retvalother -emptyret -unrecog
|
-varuse -retvalother -emptyret -unrecog
|
||||||
|
|
||||||
sbin_PROGRAMS = ngircd
|
sbin_PROGRAMS = ngircd
|
||||||
|
|
||||||
ngircd_SOURCES = ngircd.c array.c channel.c client.c conf.c conn.c conn-func.c \
|
ngircd_SOURCES = \
|
||||||
conn-ssl.c conn-zip.c hash.c io.c irc.c irc-channel.c irc-info.c irc-login.c \
|
ngircd.c \
|
||||||
irc-mode.c irc-op.c irc-oper.c irc-server.c irc-write.c lists.c log.c \
|
array.c \
|
||||||
match.c op.c numeric.c pam.c parse.c proc.c resolve.c sighandlers.c
|
channel.c \
|
||||||
|
class.c \
|
||||||
|
client.c \
|
||||||
|
client-cap.c \
|
||||||
|
conf.c \
|
||||||
|
conn.c \
|
||||||
|
conn-encoding.c \
|
||||||
|
conn-func.c \
|
||||||
|
conn-ssl.c \
|
||||||
|
conn-zip.c \
|
||||||
|
hash.c \
|
||||||
|
io.c \
|
||||||
|
irc.c \
|
||||||
|
irc-cap.c \
|
||||||
|
irc-channel.c \
|
||||||
|
irc-encoding.c \
|
||||||
|
irc-info.c \
|
||||||
|
irc-login.c \
|
||||||
|
irc-metadata.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_LDFLAGS = -L../portab -L../tool -L../ipaddr
|
||||||
|
|
||||||
ngircd_LDADD = -lngportab -lngtool -lngipaddr
|
ngircd_LDADD = -lngportab -lngtool -lngipaddr
|
||||||
|
|
||||||
noinst_HEADERS = ngircd.h array.h channel.h client.h conf.h conf-ssl.h conn.h \
|
noinst_HEADERS = \
|
||||||
conn-func.h conn-ssl.h conn-zip.h hash.h io.h irc.h irc-channel.h \
|
ngircd.h \
|
||||||
irc-info.h irc-login.h irc-mode.h irc-op.h irc-oper.h irc-server.h \
|
array.h \
|
||||||
irc-write.h lists.h log.h match.h numeric.h op.h pam.h parse.h proc.h \
|
channel.h \
|
||||||
resolve.h sighandlers.h defines.h messages.h
|
class.h \
|
||||||
|
client.h \
|
||||||
|
client-cap.h \
|
||||||
|
conf.h \
|
||||||
|
conf-ssl.h \
|
||||||
|
conn.h \
|
||||||
|
conn-encoding.h \
|
||||||
|
conn-func.h \
|
||||||
|
conn-ssl.h \
|
||||||
|
conn-zip.h \
|
||||||
|
defines.h \
|
||||||
|
hash.h \
|
||||||
|
io.h \
|
||||||
|
irc.h \
|
||||||
|
irc-cap.h \
|
||||||
|
irc-channel.h \
|
||||||
|
irc-encoding.h \
|
||||||
|
irc-info.h \
|
||||||
|
irc-login.h \
|
||||||
|
irc-metadata.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:
|
clean-local:
|
||||||
rm -f check-version check-help lint.out
|
rm -f check-version check-help lint.out
|
||||||
|
|
||||||
maintainer-clean-local:
|
maintainer-clean-local:
|
||||||
rm -f Makefile Makefile.in
|
rm -f Makefile Makefile.in Makefile.am
|
||||||
|
|
||||||
check-version: Makefile
|
check-version: Makefile
|
||||||
echo "#!/bin/sh" > check-version
|
echo "#!/bin/sh" > check-version
|
||||||
@@ -56,7 +128,7 @@ lint:
|
|||||||
for f in *.c; do \
|
for f in *.c; do \
|
||||||
echo "checking $$f ..."; \
|
echo "checking $$f ..."; \
|
||||||
splint $$f $(LINTARGS) -I$(srcdir) -I$(srcdir)/.. \
|
splint $$f $(LINTARGS) -I$(srcdir) -I$(srcdir)/.. \
|
||||||
$(INCLUDES) $(AM_CFLAGS) >lint.out 2>&1; \
|
$(AM_CPPFLAGS) $(AM_CFLAGS) >lint.out 2>&1; \
|
||||||
grep "no warnings" lint.out > /dev/null 2>&1; \
|
grep "no warnings" lint.out > /dev/null 2>&1; \
|
||||||
if [ $$? -ne 0 ]; then \
|
if [ $$? -ne 0 ]; then \
|
||||||
waswarning=1; \
|
waswarning=1; \
|
||||||
@@ -84,7 +84,7 @@ extern void* array_get PARAMS((array* a, size_t membersize, size_t pos));
|
|||||||
/* free the contents of this array. */
|
/* free the contents of this array. */
|
||||||
extern void array_free PARAMS((array* a));
|
extern void array_free PARAMS((array* a));
|
||||||
|
|
||||||
/* overwrite array with zeroes before free */
|
/* overwrite array with zeros before free */
|
||||||
extern void array_free_wipe PARAMS((array* a));
|
extern void array_free_wipe PARAMS((array* a));
|
||||||
|
|
||||||
/* return pointer to first element in this array */
|
/* return pointer to first element in this array */
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* 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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -66,16 +66,8 @@ static void Set_KeyFile PARAMS((CHANNEL *Chan, const char *KeyFile));
|
|||||||
GLOBAL void
|
GLOBAL void
|
||||||
Channel_Init( void )
|
Channel_Init( void )
|
||||||
{
|
{
|
||||||
CHANNEL *sc;
|
|
||||||
|
|
||||||
My_Channels = NULL;
|
My_Channels = NULL;
|
||||||
My_Cl2Chan = NULL;
|
My_Cl2Chan = NULL;
|
||||||
|
|
||||||
sc = Channel_Create("&SERVER");
|
|
||||||
if (sc) {
|
|
||||||
Channel_SetModes(sc, "mnPt");
|
|
||||||
Channel_SetTopic(sc, Client_ThisServer(), "Server Messages");
|
|
||||||
}
|
|
||||||
} /* Channel_Init */
|
} /* Channel_Init */
|
||||||
|
|
||||||
|
|
||||||
@@ -87,6 +79,14 @@ Channel_GetListBans(CHANNEL *c)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GLOBAL struct list_head *
|
||||||
|
Channel_GetListExcepts(CHANNEL *c)
|
||||||
|
{
|
||||||
|
assert(c != NULL);
|
||||||
|
return &c->list_excepts;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
GLOBAL struct list_head *
|
GLOBAL struct list_head *
|
||||||
Channel_GetListInvites(CHANNEL *c)
|
Channel_GetListInvites(CHANNEL *c)
|
||||||
{
|
{
|
||||||
@@ -95,11 +95,12 @@ Channel_GetListInvites(CHANNEL *c)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate predefined persistent channels and &SERVER
|
||||||
|
*/
|
||||||
GLOBAL void
|
GLOBAL void
|
||||||
Channel_InitPredefined( void )
|
Channel_InitPredefined( void )
|
||||||
{
|
{
|
||||||
/* Generate predefined persistent channels */
|
|
||||||
|
|
||||||
CHANNEL *new_chan;
|
CHANNEL *new_chan;
|
||||||
const struct Conf_Channel *conf_chan;
|
const struct Conf_Channel *conf_chan;
|
||||||
const char *c;
|
const char *c;
|
||||||
@@ -110,9 +111,12 @@ Channel_InitPredefined( void )
|
|||||||
assert(channel_count == 0 || conf_chan != NULL);
|
assert(channel_count == 0 || conf_chan != NULL);
|
||||||
|
|
||||||
for (i = 0; i < channel_count; i++, conf_chan++) {
|
for (i = 0; i < channel_count; i++, conf_chan++) {
|
||||||
if (!conf_chan->name[0] || !Channel_IsValidName(conf_chan->name)) {
|
if (!conf_chan->name[0])
|
||||||
Log(LOG_ERR, "Can't create pre-defined channel: invalid name: \"%s\"",
|
continue;
|
||||||
conf_chan->name);
|
if (!Channel_IsValidName(conf_chan->name)) {
|
||||||
|
Log(LOG_ERR,
|
||||||
|
"Can't create pre-defined channel: invalid name: \"%s\"",
|
||||||
|
conf_chan->name);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -149,6 +153,18 @@ Channel_InitPredefined( void )
|
|||||||
}
|
}
|
||||||
if (channel_count)
|
if (channel_count)
|
||||||
array_free(&Conf_Channels);
|
array_free(&Conf_Channels);
|
||||||
|
|
||||||
|
/* Make sure the local &SERVER channel exists */
|
||||||
|
if (!Channel_Search("&SERVER")) {
|
||||||
|
new_chan = Channel_Create("&SERVER");
|
||||||
|
if (new_chan) {
|
||||||
|
Channel_SetModes(new_chan, "mnPt");
|
||||||
|
Channel_SetTopic(new_chan, Client_ThisServer(),
|
||||||
|
"Server Messages");
|
||||||
|
} else
|
||||||
|
Log(LOG_ERR, "Failed to create \"&SERVER\" channel!");
|
||||||
|
} else
|
||||||
|
LogDebug("Required channel \"&SERVER\" already exists, ok.");
|
||||||
} /* Channel_InitPredefined */
|
} /* Channel_InitPredefined */
|
||||||
|
|
||||||
|
|
||||||
@@ -158,6 +174,7 @@ Free_Channel(CHANNEL *chan)
|
|||||||
array_free(&chan->topic);
|
array_free(&chan->topic);
|
||||||
array_free(&chan->keyfile);
|
array_free(&chan->keyfile);
|
||||||
Lists_Free(&chan->list_bans);
|
Lists_Free(&chan->list_bans);
|
||||||
|
Lists_Free(&chan->list_excepts);
|
||||||
Lists_Free(&chan->list_invites);
|
Lists_Free(&chan->list_invites);
|
||||||
|
|
||||||
free(chan);
|
free(chan);
|
||||||
@@ -282,6 +299,8 @@ Channel_Kick(CLIENT *Peer, CLIENT *Target, CLIENT *Origin, const char *Name,
|
|||||||
const char *Reason )
|
const char *Reason )
|
||||||
{
|
{
|
||||||
CHANNEL *chan;
|
CHANNEL *chan;
|
||||||
|
char *ptr, *target_modes;
|
||||||
|
bool can_kick = false;
|
||||||
|
|
||||||
assert(Peer != NULL);
|
assert(Peer != NULL);
|
||||||
assert(Target != NULL);
|
assert(Target != NULL);
|
||||||
@@ -302,14 +321,7 @@ Channel_Kick(CLIENT *Peer, CLIENT *Target, CLIENT *Origin, const char *Name,
|
|||||||
/* Check that user is on the specified channel */
|
/* Check that user is on the specified channel */
|
||||||
if (!Channel_IsMemberOf(chan, Origin)) {
|
if (!Channel_IsMemberOf(chan, Origin)) {
|
||||||
IRC_WriteStrClient( Origin, ERR_NOTONCHANNEL_MSG,
|
IRC_WriteStrClient( Origin, ERR_NOTONCHANNEL_MSG,
|
||||||
Client_ID(Origin), Name);
|
Client_ID(Origin), Name);
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Check if user has operator status */
|
|
||||||
if (!strchr(Channel_UserModes(chan, Origin), 'o')) {
|
|
||||||
IRC_WriteStrClient(Origin, ERR_CHANOPRIVSNEEDED_MSG,
|
|
||||||
Client_ID(Origin), Name);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -321,6 +333,62 @@ Channel_Kick(CLIENT *Peer, CLIENT *Target, CLIENT *Origin, const char *Name,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(Client_Type(Peer) == CLIENT_USER) {
|
||||||
|
/* Channel mode 'Q' and user mode 'q' on target: nobody but
|
||||||
|
* IRC Operators and servers can kick the target user */
|
||||||
|
if ((strchr(Channel_Modes(chan), 'Q')
|
||||||
|
|| Client_HasMode(Target, 'q')
|
||||||
|
|| Client_Type(Target) == CLIENT_SERVICE)
|
||||||
|
&& !Client_HasMode(Origin, 'o')) {
|
||||||
|
IRC_WriteStrClient(Origin, ERR_KICKDENY_MSG,
|
||||||
|
Client_ID(Origin), Name,
|
||||||
|
Client_ID(Target));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Check if client has the rights to kick target */
|
||||||
|
ptr = Channel_UserModes(chan, Peer);
|
||||||
|
target_modes = Channel_UserModes(chan, Target);
|
||||||
|
while(*ptr) {
|
||||||
|
/* Owner can kick everyone */
|
||||||
|
if ( *ptr == 'q') {
|
||||||
|
can_kick = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* Admin can't kick owner */
|
||||||
|
if ( *ptr == 'a' ) {
|
||||||
|
if (!strchr(target_modes, 'q')) {
|
||||||
|
can_kick = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Op can't kick owner | admin */
|
||||||
|
if ( *ptr == 'o' ) {
|
||||||
|
if (!strchr(target_modes, 'q') &&
|
||||||
|
!strchr(target_modes, 'a')) {
|
||||||
|
can_kick = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* Half Op can't kick owner | admin | op */
|
||||||
|
if ( *ptr == 'h' ) {
|
||||||
|
if (!strchr(target_modes, 'q') &&
|
||||||
|
!strchr(target_modes, 'a') &&
|
||||||
|
!strchr(target_modes, 'o')) {
|
||||||
|
can_kick = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ptr++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(!can_kick) {
|
||||||
|
IRC_WriteStrClient(Origin, ERR_CHANOPPRIVTOOLOW_MSG,
|
||||||
|
Client_ID(Origin), Name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Kick Client from channel */
|
/* Kick Client from channel */
|
||||||
Remove_Client( REMOVE_KICK, chan, Target, Origin, Reason, true);
|
Remove_Client( REMOVE_KICK, chan, Target, Origin, Reason, true);
|
||||||
} /* Channel_Kick */
|
} /* Channel_Kick */
|
||||||
@@ -349,20 +417,31 @@ Channel_Quit( CLIENT *Client, const char *Reason )
|
|||||||
} /* Channel_Quit */
|
} /* Channel_Quit */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get number of channels this server knows and that are "visible" to
|
||||||
|
* the given client. If no client is given, all channels will be counted.
|
||||||
|
*
|
||||||
|
* @param Client The client to check or NULL.
|
||||||
|
* @return Number of channels visible to the client.
|
||||||
|
*/
|
||||||
GLOBAL unsigned long
|
GLOBAL unsigned long
|
||||||
Channel_Count( void )
|
Channel_CountVisible (CLIENT *Client)
|
||||||
{
|
{
|
||||||
CHANNEL *c;
|
CHANNEL *c;
|
||||||
unsigned long count = 0;
|
unsigned long count = 0;
|
||||||
|
|
||||||
c = My_Channels;
|
c = My_Channels;
|
||||||
while( c )
|
while(c) {
|
||||||
{
|
if (Client) {
|
||||||
count++;
|
if (!strchr(Channel_Modes(c), 's')
|
||||||
|
|| Channel_IsMemberOf(c, Client))
|
||||||
|
count++;
|
||||||
|
} else
|
||||||
|
count++;
|
||||||
c = c->next;
|
c = c->next;
|
||||||
}
|
}
|
||||||
return count;
|
return count;
|
||||||
} /* Channel_Count */
|
}
|
||||||
|
|
||||||
|
|
||||||
GLOBAL unsigned long
|
GLOBAL unsigned long
|
||||||
@@ -774,12 +853,19 @@ Channel_SetMaxUsers(CHANNEL *Chan, unsigned long Count)
|
|||||||
} /* Channel_SetMaxUsers */
|
} /* Channel_SetMaxUsers */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a client is allowed to send to a specific channel.
|
||||||
|
*
|
||||||
|
* @param Chan The channel to check.
|
||||||
|
* @param From The client that wants to send.
|
||||||
|
* @return true if the client is allowed to send, false otherwise.
|
||||||
|
*/
|
||||||
static bool
|
static bool
|
||||||
Can_Send_To_Channel(CHANNEL *Chan, CLIENT *From)
|
Can_Send_To_Channel(CHANNEL *Chan, CLIENT *From)
|
||||||
{
|
{
|
||||||
bool is_member, has_voice, is_op;
|
bool is_member, has_voice, is_halfop, is_op, is_chanadmin, is_owner;
|
||||||
|
|
||||||
is_member = has_voice = is_op = false;
|
is_member = has_voice = is_halfop = is_op = is_chanadmin = is_owner = false;
|
||||||
|
|
||||||
/* The server itself always can send messages :-) */
|
/* The server itself always can send messages :-) */
|
||||||
if (Client_ThisServer() == From)
|
if (Client_ThisServer() == From)
|
||||||
@@ -789,8 +875,14 @@ Can_Send_To_Channel(CHANNEL *Chan, CLIENT *From)
|
|||||||
is_member = true;
|
is_member = true;
|
||||||
if (strchr(Channel_UserModes(Chan, From), 'v'))
|
if (strchr(Channel_UserModes(Chan, From), 'v'))
|
||||||
has_voice = true;
|
has_voice = true;
|
||||||
|
if (strchr(Channel_UserModes(Chan, From), 'h'))
|
||||||
|
is_halfop = true;
|
||||||
if (strchr(Channel_UserModes(Chan, From), 'o'))
|
if (strchr(Channel_UserModes(Chan, From), 'o'))
|
||||||
is_op = true;
|
is_op = true;
|
||||||
|
if (strchr(Channel_UserModes(Chan, From), 'a'))
|
||||||
|
is_chanadmin = true;
|
||||||
|
if (strchr(Channel_UserModes(Chan, From), 'q'))
|
||||||
|
is_owner = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -802,12 +894,19 @@ Can_Send_To_Channel(CHANNEL *Chan, CLIENT *From)
|
|||||||
if (strchr(Channel_Modes(Chan), 'n') && !is_member)
|
if (strchr(Channel_Modes(Chan), 'n') && !is_member)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (is_op || has_voice)
|
if (strchr(Channel_Modes(Chan), 'M') && !Client_HasMode(From, 'R')
|
||||||
|
&& !Client_HasMode(From, 'o'))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (has_voice || is_halfop || is_op || is_chanadmin || is_owner)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (strchr(Channel_Modes(Chan), 'm'))
|
if (strchr(Channel_Modes(Chan), 'm'))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (Lists_Check(&Chan->list_excepts, From))
|
||||||
|
return true;
|
||||||
|
|
||||||
return !Lists_Check(&Chan->list_bans, From);
|
return !Lists_Check(&Chan->list_bans, From);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -819,7 +918,11 @@ Channel_Write(CHANNEL *Chan, CLIENT *From, CLIENT *Client, const char *Command,
|
|||||||
if (!Can_Send_To_Channel(Chan, From)) {
|
if (!Can_Send_To_Channel(Chan, From)) {
|
||||||
if (! SendErrors)
|
if (! SendErrors)
|
||||||
return CONNECTED; /* no error, see RFC 2812 */
|
return CONNECTED; /* no error, see RFC 2812 */
|
||||||
return IRC_WriteStrClient(From, ERR_CANNOTSENDTOCHAN_MSG,
|
if (strchr(Channel_Modes(Chan), 'M'))
|
||||||
|
return IRC_WriteStrClient(From, ERR_NEEDREGGEDNICK_MSG,
|
||||||
|
Client_ID(From), Channel_Name(Chan));
|
||||||
|
else
|
||||||
|
return IRC_WriteStrClient(From, ERR_CANNOTSENDTOCHAN_MSG,
|
||||||
Client_ID(From), Channel_Name(Chan));
|
Client_ID(From), Channel_Name(Chan));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -999,8 +1102,17 @@ GLOBAL bool
|
|||||||
Channel_AddBan(CHANNEL *c, const char *mask )
|
Channel_AddBan(CHANNEL *c, const char *mask )
|
||||||
{
|
{
|
||||||
struct list_head *h = Channel_GetListBans(c);
|
struct list_head *h = Channel_GetListBans(c);
|
||||||
LogDebug("Adding \"%s\" to \"%s\" %s list", mask, Channel_Name(c), "ban");
|
LogDebug("Adding \"%s\" to \"%s\" ban list", mask, Channel_Name(c));
|
||||||
return Lists_Add(h, mask, false);
|
return Lists_Add(h, mask, false, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GLOBAL bool
|
||||||
|
Channel_AddExcept(CHANNEL *c, const char *mask )
|
||||||
|
{
|
||||||
|
struct list_head *h = Channel_GetListExcepts(c);
|
||||||
|
LogDebug("Adding \"%s\" to \"%s\" exception list", mask, Channel_Name(c));
|
||||||
|
return Lists_Add(h, mask, false, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1008,30 +1120,31 @@ GLOBAL bool
|
|||||||
Channel_AddInvite(CHANNEL *c, const char *mask, bool onlyonce)
|
Channel_AddInvite(CHANNEL *c, const char *mask, bool onlyonce)
|
||||||
{
|
{
|
||||||
struct list_head *h = Channel_GetListInvites(c);
|
struct list_head *h = Channel_GetListInvites(c);
|
||||||
LogDebug("Adding \"%s\" to \"%s\" %s list", mask, Channel_Name(c), "invite");
|
LogDebug("Adding \"%s\" to \"%s\" invite list", mask, Channel_Name(c));
|
||||||
return Lists_Add(h, mask, onlyonce);
|
return Lists_Add(h, mask, onlyonce, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
ShowInvitesBans(struct list_head *head, CLIENT *Client, CHANNEL *Channel, bool invite)
|
ShowChannelList(struct list_head *head, CLIENT *Client, CHANNEL *Channel,
|
||||||
|
char *msg, char *msg_end)
|
||||||
{
|
{
|
||||||
struct list_elem *e;
|
struct list_elem *e;
|
||||||
char *msg = invite ? RPL_INVITELIST_MSG : RPL_BANLIST_MSG;
|
|
||||||
char *msg_end;
|
|
||||||
|
|
||||||
assert( Client != NULL );
|
assert (Client != NULL);
|
||||||
assert( Channel != NULL );
|
assert (Channel != NULL);
|
||||||
|
|
||||||
e = Lists_GetFirst(head);
|
e = Lists_GetFirst(head);
|
||||||
while (e) {
|
while (e) {
|
||||||
if( ! IRC_WriteStrClient( Client, msg, Client_ID( Client ),
|
if (!IRC_WriteStrClient(Client, msg, Client_ID(Client),
|
||||||
Channel_Name( Channel ), Lists_GetMask(e) )) return DISCONNECTED;
|
Channel_Name(Channel),
|
||||||
|
Lists_GetMask(e)))
|
||||||
|
return DISCONNECTED;
|
||||||
e = Lists_GetNext(e);
|
e = Lists_GetNext(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
msg_end = invite ? RPL_ENDOFINVITELIST_MSG : RPL_ENDOFBANLIST_MSG;
|
return IRC_WriteStrClient(Client, msg_end, Client_ID(Client),
|
||||||
return IRC_WriteStrClient( Client, msg_end, Client_ID( Client ), Channel_Name( Channel ));
|
Channel_Name(Channel));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1043,7 +1156,21 @@ Channel_ShowBans( CLIENT *Client, CHANNEL *Channel )
|
|||||||
assert( Channel != NULL );
|
assert( Channel != NULL );
|
||||||
|
|
||||||
h = Channel_GetListBans(Channel);
|
h = Channel_GetListBans(Channel);
|
||||||
return ShowInvitesBans(h, Client, Channel, false);
|
return ShowChannelList(h, Client, Channel, RPL_BANLIST_MSG,
|
||||||
|
RPL_ENDOFBANLIST_MSG);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GLOBAL bool
|
||||||
|
Channel_ShowExcepts( CLIENT *Client, CHANNEL *Channel )
|
||||||
|
{
|
||||||
|
struct list_head *h;
|
||||||
|
|
||||||
|
assert( Channel != NULL );
|
||||||
|
|
||||||
|
h = Channel_GetListExcepts(Channel);
|
||||||
|
return ShowChannelList(h, Client, Channel, RPL_EXCEPTLIST_MSG,
|
||||||
|
RPL_ENDOFEXCEPTLIST_MSG);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1055,7 +1182,8 @@ Channel_ShowInvites( CLIENT *Client, CHANNEL *Channel )
|
|||||||
assert( Channel != NULL );
|
assert( Channel != NULL );
|
||||||
|
|
||||||
h = Channel_GetListInvites(Channel);
|
h = Channel_GetListInvites(Channel);
|
||||||
return ShowInvitesBans(h, Client, Channel, true);
|
return ShowChannelList(h, Client, Channel, RPL_INVITELIST_MSG,
|
||||||
|
RPL_ENDOFINVITELIST_MSG);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1129,64 +1257,6 @@ Channel_CheckKey(CHANNEL *Chan, CLIENT *Client, const char *Key)
|
|||||||
} /* Channel_CheckKey */
|
} /* Channel_CheckKey */
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check wether a client is allowed to administer a channel or not.
|
|
||||||
*
|
|
||||||
* @param Chan The channel to test.
|
|
||||||
* @param Client The client from which the command has been received.
|
|
||||||
* @param Origin The originator of the command (or NULL).
|
|
||||||
* @param OnChannel Set to true if the originator is member of the channel.
|
|
||||||
* @param AdminOk Set to true if the client is allowed to do
|
|
||||||
* administrative tasks on this channel.
|
|
||||||
* @param UseServerMode Set to true if ngIRCd should emulate "server mode",
|
|
||||||
* that is send commands as if originating from a server
|
|
||||||
* and not the originator of the command.
|
|
||||||
*/
|
|
||||||
GLOBAL void
|
|
||||||
Channel_CheckAdminRights(CHANNEL *Chan, CLIENT *Client, CLIENT *Origin,
|
|
||||||
bool *OnChannel, bool *AdminOk, bool *UseServerMode)
|
|
||||||
{
|
|
||||||
assert (Chan != NULL);
|
|
||||||
assert (Client != NULL);
|
|
||||||
assert (OnChannel != NULL);
|
|
||||||
assert (AdminOk != NULL);
|
|
||||||
assert (UseServerMode != NULL);
|
|
||||||
|
|
||||||
/* Use the client as origin, if no origin has been given (no prefix?) */
|
|
||||||
if (!Origin)
|
|
||||||
Origin = Client;
|
|
||||||
|
|
||||||
*OnChannel = false;
|
|
||||||
*AdminOk = false;
|
|
||||||
*UseServerMode = false;
|
|
||||||
|
|
||||||
if (Client_Type(Client) != CLIENT_USER
|
|
||||||
&& Client_Type(Client) != CLIENT_SERVER
|
|
||||||
&& Client_Type(Client) != CLIENT_SERVICE)
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* Allow channel administration if the client is a server or service */
|
|
||||||
if (Client_Type(Client) != CLIENT_USER) {
|
|
||||||
*AdminOk = true;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
*OnChannel = Channel_IsMemberOf(Chan, Origin);
|
|
||||||
|
|
||||||
if (*OnChannel && strchr(Channel_UserModes(Chan, Origin), 'o')) {
|
|
||||||
/* User is a channel operator */
|
|
||||||
*AdminOk = true;
|
|
||||||
} else if (Conf_OperCanMode) {
|
|
||||||
/* IRC operators are allowed to administer channels as well */
|
|
||||||
if (Client_OperByMe(Origin)) {
|
|
||||||
*AdminOk = true;
|
|
||||||
if (Conf_OperServerMode)
|
|
||||||
*UseServerMode = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} /* Channel_CheckAdminRights */
|
|
||||||
|
|
||||||
|
|
||||||
static CL2CHAN *
|
static CL2CHAN *
|
||||||
Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan )
|
Get_First_Cl2Chan( CLIENT *Client, CHANNEL *Chan )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* 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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -38,6 +38,7 @@ typedef struct _CHANNEL
|
|||||||
char key[CLIENT_PASS_LEN]; /* Channel key ("password", mode "k" ) */
|
char key[CLIENT_PASS_LEN]; /* Channel key ("password", mode "k" ) */
|
||||||
unsigned long maxusers; /* Maximum number of members (mode "l") */
|
unsigned long maxusers; /* Maximum number of members (mode "l") */
|
||||||
struct list_head list_bans; /* list head of banned users */
|
struct list_head list_bans; /* list head of banned users */
|
||||||
|
struct list_head list_excepts; /* list head of (ban) exception list */
|
||||||
struct list_head list_invites; /* list head of invited users */
|
struct list_head list_invites; /* list head of invited users */
|
||||||
array keyfile; /* Name of the channel key file */
|
array keyfile; /* Name of the channel key file */
|
||||||
} CHANNEL;
|
} CHANNEL;
|
||||||
@@ -58,6 +59,7 @@ typedef POINTER CL2CHAN;
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
GLOBAL struct list_head *Channel_GetListBans PARAMS((CHANNEL *c));
|
GLOBAL struct list_head *Channel_GetListBans PARAMS((CHANNEL *c));
|
||||||
|
GLOBAL struct list_head *Channel_GetListExcepts PARAMS((CHANNEL *c));
|
||||||
GLOBAL struct list_head *Channel_GetListInvites PARAMS((CHANNEL *c));
|
GLOBAL struct list_head *Channel_GetListInvites PARAMS((CHANNEL *c));
|
||||||
|
|
||||||
GLOBAL void Channel_Init PARAMS(( void ));
|
GLOBAL void Channel_Init PARAMS(( void ));
|
||||||
@@ -72,7 +74,7 @@ GLOBAL void Channel_Quit PARAMS(( CLIENT *Client, const char *Reason ));
|
|||||||
GLOBAL void Channel_Kick PARAMS((CLIENT *Peer, CLIENT *Target, CLIENT *Origin,
|
GLOBAL void Channel_Kick PARAMS((CLIENT *Peer, CLIENT *Target, CLIENT *Origin,
|
||||||
const char *Name, const char *Reason));
|
const char *Name, const char *Reason));
|
||||||
|
|
||||||
GLOBAL unsigned long Channel_Count PARAMS(( void ));
|
GLOBAL unsigned long Channel_CountVisible PARAMS((CLIENT *Client));
|
||||||
GLOBAL unsigned long Channel_MemberCount PARAMS(( CHANNEL *Chan ));
|
GLOBAL unsigned long Channel_MemberCount PARAMS(( CHANNEL *Chan ));
|
||||||
GLOBAL int Channel_CountForUser PARAMS(( CLIENT *Client ));
|
GLOBAL int Channel_CountForUser PARAMS(( CLIENT *Client ));
|
||||||
|
|
||||||
@@ -123,10 +125,13 @@ GLOBAL char *Channel_TopicWho PARAMS(( CHANNEL *Chan ));
|
|||||||
GLOBAL unsigned int Channel_CreationTime PARAMS(( CHANNEL *Chan ));
|
GLOBAL unsigned int Channel_CreationTime PARAMS(( CHANNEL *Chan ));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
GLOBAL bool Channel_AddInvite PARAMS((CHANNEL *c, const char *Mask, bool OnlyOnce ));
|
GLOBAL bool Channel_AddBan PARAMS((CHANNEL *c, const char *Mask));
|
||||||
GLOBAL bool Channel_AddBan PARAMS((CHANNEL *c, const char *Mask ));
|
GLOBAL bool Channel_AddExcept PARAMS((CHANNEL *c, const char *Mask));
|
||||||
|
GLOBAL bool Channel_AddInvite PARAMS((CHANNEL *c, const char *Mask,
|
||||||
|
bool OnlyOnce));
|
||||||
|
|
||||||
GLOBAL bool Channel_ShowBans PARAMS((CLIENT *client, CHANNEL *c));
|
GLOBAL bool Channel_ShowBans PARAMS((CLIENT *client, CHANNEL *c));
|
||||||
|
GLOBAL bool Channel_ShowExcepts PARAMS((CLIENT *client, CHANNEL *c));
|
||||||
GLOBAL bool Channel_ShowInvites PARAMS((CLIENT *client, CHANNEL *c));
|
GLOBAL bool Channel_ShowInvites PARAMS((CLIENT *client, CHANNEL *c));
|
||||||
|
|
||||||
GLOBAL void Channel_LogServer PARAMS((const char *msg));
|
GLOBAL void Channel_LogServer PARAMS((const char *msg));
|
||||||
|
|||||||
143
src/ngircd/class.c
Normal file
143
src/ngircd/class.c
Normal file
@@ -0,0 +1,143 @@
|
|||||||
|
/*
|
||||||
|
* 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
|
||||||
|
* User class management.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "imp.h"
|
||||||
|
#include <assert.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "defines.h"
|
||||||
|
#include "array.h"
|
||||||
|
#include "conn.h"
|
||||||
|
#include "client.h"
|
||||||
|
#include "lists.h"
|
||||||
|
#include "match.h"
|
||||||
|
#include "stdio.h"
|
||||||
|
|
||||||
|
#include "exp.h"
|
||||||
|
#include "class.h"
|
||||||
|
|
||||||
|
struct list_head My_Classes[CLASS_COUNT];
|
||||||
|
|
||||||
|
char Reject_Reason[COMMAND_LEN];
|
||||||
|
|
||||||
|
GLOBAL void
|
||||||
|
Class_Init(void)
|
||||||
|
{
|
||||||
|
memset(My_Classes, 0, sizeof(My_Classes));
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL void
|
||||||
|
Class_Exit(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < CLASS_COUNT; Lists_Free(&My_Classes[i++]));
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL char *
|
||||||
|
Class_GetMemberReason(const int Class, CLIENT *Client)
|
||||||
|
{
|
||||||
|
char *reason;
|
||||||
|
|
||||||
|
assert(Class < CLASS_COUNT);
|
||||||
|
assert(Client != NULL);
|
||||||
|
|
||||||
|
reason = Lists_CheckReason(&My_Classes[Class], Client);
|
||||||
|
if (!reason)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (!*reason)
|
||||||
|
reason = "listed";
|
||||||
|
|
||||||
|
switch(Class) {
|
||||||
|
case CLASS_GLINE:
|
||||||
|
snprintf(Reject_Reason, sizeof(Reject_Reason),
|
||||||
|
"\"%s\" (G-Line)", reason);
|
||||||
|
return Reject_Reason;
|
||||||
|
case CLASS_KLINE:
|
||||||
|
snprintf(Reject_Reason, sizeof(Reject_Reason),
|
||||||
|
"\"%s\" (K-Line)", reason);
|
||||||
|
return Reject_Reason;
|
||||||
|
}
|
||||||
|
return reason;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a client is banned from this server: GLINE, KLINE.
|
||||||
|
*
|
||||||
|
* If a client isn't allowed to connect, it will be disconnected again.
|
||||||
|
*
|
||||||
|
* @param Client The client to check.
|
||||||
|
* @return CONNECTED if client is allowed to join, DISCONNECTED if not.
|
||||||
|
*/
|
||||||
|
GLOBAL bool
|
||||||
|
Class_HandleServerBans(CLIENT *Client)
|
||||||
|
{
|
||||||
|
char *rejectptr;
|
||||||
|
|
||||||
|
assert(Client != NULL);
|
||||||
|
|
||||||
|
rejectptr = Class_GetMemberReason(CLASS_GLINE, Client);
|
||||||
|
if (!rejectptr)
|
||||||
|
rejectptr = Class_GetMemberReason(CLASS_KLINE, Client);
|
||||||
|
if (rejectptr) {
|
||||||
|
Client_Reject(Client, rejectptr, true);
|
||||||
|
return DISCONNECTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
return CONNECTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
GLOBAL bool
|
||||||
|
Class_AddMask(const int Class, const char *Mask, time_t ValidUntil,
|
||||||
|
const char *Reason)
|
||||||
|
{
|
||||||
|
assert(Class < CLASS_COUNT);
|
||||||
|
assert(Mask != NULL);
|
||||||
|
assert(Reason != NULL);
|
||||||
|
|
||||||
|
return Lists_Add(&My_Classes[Class], Lists_MakeMask(Mask),
|
||||||
|
ValidUntil, Reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL void
|
||||||
|
Class_DeleteMask(const int Class, const char *Mask)
|
||||||
|
{
|
||||||
|
assert(Class < CLASS_COUNT);
|
||||||
|
assert(Mask != NULL);
|
||||||
|
|
||||||
|
Lists_Del(&My_Classes[Class], Lists_MakeMask(Mask));
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL struct list_head *
|
||||||
|
Class_GetList(const int Class)
|
||||||
|
{
|
||||||
|
assert(Class < CLASS_COUNT);
|
||||||
|
|
||||||
|
return &My_Classes[Class];
|
||||||
|
}
|
||||||
|
|
||||||
|
GLOBAL void
|
||||||
|
Class_Expire(void)
|
||||||
|
{
|
||||||
|
Lists_Expire(&My_Classes[CLASS_GLINE], "G-Line");
|
||||||
|
Lists_Expire(&My_Classes[CLASS_KLINE], "K-Line");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -eof- */
|
||||||
41
src/ngircd/class.h
Normal file
41
src/ngircd/class.h
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
/*
|
||||||
|
* 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 __class_h__
|
||||||
|
#define __class_h__
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* User class management.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define CLASS_KLINE 0
|
||||||
|
#define CLASS_GLINE 1
|
||||||
|
|
||||||
|
#define CLASS_COUNT 2
|
||||||
|
|
||||||
|
GLOBAL void Class_Init PARAMS((void));
|
||||||
|
GLOBAL void Class_Exit PARAMS((void));
|
||||||
|
|
||||||
|
GLOBAL bool Class_AddMask PARAMS((const int Class, const char *Mask,
|
||||||
|
const time_t ValidUntil, const char *Reason));
|
||||||
|
GLOBAL void Class_DeleteMask PARAMS((const int Class, const char *Mask));
|
||||||
|
|
||||||
|
GLOBAL char *Class_GetMemberReason PARAMS((const int Class, CLIENT *Client));
|
||||||
|
GLOBAL bool Class_HandleServerBans PARAMS((CLIENT *Client));
|
||||||
|
|
||||||
|
GLOBAL struct list_head *Class_GetList PARAMS((const int Class));
|
||||||
|
|
||||||
|
GLOBAL void Class_Expire PARAMS((void));
|
||||||
|
|
||||||
|
#endif /* __class_h__ */
|
||||||
|
|
||||||
|
/* -eof- */
|
||||||
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
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* 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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -37,6 +37,7 @@
|
|||||||
#include "ngircd.h"
|
#include "ngircd.h"
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
|
#include "conn-func.h"
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
#include "irc-write.h"
|
#include "irc-write.h"
|
||||||
#include "log.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,
|
static void Destroy_UserOrService PARAMS((CLIENT *Client,const char *Txt, const char *FwdMsg,
|
||||||
bool SendQuit));
|
bool SendQuit));
|
||||||
|
|
||||||
|
static void cb_introduceClient PARAMS((CLIENT *Client, CLIENT *Prefix,
|
||||||
|
void *i));
|
||||||
|
|
||||||
GLOBAL void
|
GLOBAL void
|
||||||
Client_Init( void )
|
Client_Init( void )
|
||||||
@@ -186,7 +189,6 @@ Init_New_Client(CONN_ID Idx, CLIENT *Introducer, CLIENT *TopServer,
|
|||||||
|
|
||||||
assert(Idx >= NONE);
|
assert(Idx >= NONE);
|
||||||
assert(Introducer != NULL);
|
assert(Introducer != NULL);
|
||||||
assert(Hostname != NULL);
|
|
||||||
|
|
||||||
client = New_Client_Struct();
|
client = New_Client_Struct();
|
||||||
if (!client)
|
if (!client)
|
||||||
@@ -313,16 +315,35 @@ Client_Destroy( CLIENT *Client, const char *LogMsg, const char *FwdMsg, bool Sen
|
|||||||
} /* Client_Destroy */
|
} /* Client_Destroy */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set client hostname.
|
||||||
|
*
|
||||||
|
* If global hostname cloaking is in effect, don't set the real hostname
|
||||||
|
* but the configured one.
|
||||||
|
*
|
||||||
|
* @param Client The client of which the hostname should be set.
|
||||||
|
* @param Hostname The new hostname.
|
||||||
|
*/
|
||||||
GLOBAL void
|
GLOBAL void
|
||||||
Client_SetHostname( CLIENT *Client, const char *Hostname )
|
Client_SetHostname( CLIENT *Client, const char *Hostname )
|
||||||
{
|
{
|
||||||
assert( Client != NULL );
|
assert(Client != NULL);
|
||||||
assert( Hostname != NULL );
|
assert(Hostname != NULL);
|
||||||
|
|
||||||
if (strlen(Conf_CloakHost)) {
|
if (strlen(Conf_CloakHost)) {
|
||||||
strlcpy( Client->host, Conf_CloakHost, sizeof( Client->host ));
|
char cloak[GETID_LEN];
|
||||||
|
|
||||||
|
strlcpy(cloak, Hostname, GETID_LEN);
|
||||||
|
strlcat(cloak, Conf_CloakHostSalt, GETID_LEN);
|
||||||
|
snprintf(cloak, GETID_LEN, Conf_CloakHost, Hash(cloak));
|
||||||
|
|
||||||
|
LogDebug("Updating hostname of \"%s\": \"%s\" -> \"%s\"",
|
||||||
|
Client_ID(Client), Client->host, cloak);
|
||||||
|
strlcpy(Client->host, cloak, sizeof(Client->host));
|
||||||
} else {
|
} else {
|
||||||
strlcpy( Client->host, Hostname, sizeof( Client->host ));
|
LogDebug("Updating hostname of \"%s\": \"%s\" -> \"%s\"",
|
||||||
|
Client_ID(Client), Client->host, Hostname);
|
||||||
|
strlcpy(Client->host, Hostname, sizeof(Client->host));
|
||||||
}
|
}
|
||||||
} /* Client_SetHostname */
|
} /* Client_SetHostname */
|
||||||
|
|
||||||
@@ -419,18 +440,6 @@ Client_SetFlags( CLIENT *Client, const char *Flags )
|
|||||||
} /* Client_SetFlags */
|
} /* Client_SetFlags */
|
||||||
|
|
||||||
|
|
||||||
GLOBAL void
|
|
||||||
Client_SetPassword( CLIENT *Client, const char *Pwd )
|
|
||||||
{
|
|
||||||
/* set password sent by client */
|
|
||||||
|
|
||||||
assert( Client != NULL );
|
|
||||||
assert( Pwd != NULL );
|
|
||||||
|
|
||||||
strlcpy(Client->pwd, Pwd, sizeof(Client->pwd));
|
|
||||||
} /* Client_SetPassword */
|
|
||||||
|
|
||||||
|
|
||||||
GLOBAL void
|
GLOBAL void
|
||||||
Client_SetAway( CLIENT *Client, const char *Txt )
|
Client_SetAway( CLIENT *Client, const char *Txt )
|
||||||
{
|
{
|
||||||
@@ -662,7 +671,6 @@ Client_OrigUser(CLIENT *Client) {
|
|||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the hostname of a client.
|
* Return the hostname of a client.
|
||||||
* @param Client Pointer to client structure
|
* @param Client Pointer to client structure
|
||||||
@@ -673,33 +681,88 @@ Client_Hostname(CLIENT *Client)
|
|||||||
{
|
{
|
||||||
assert (Client != NULL);
|
assert (Client != NULL);
|
||||||
return Client->host;
|
return Client->host;
|
||||||
} /* Client_Hostname */
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get potentially cloaked hostname of a client.
|
* Return the cloaked hostname of a client, if set.
|
||||||
* If the client has not enabled cloaking, the real hostname is used.
|
* @param Client Pointer to the client structure.
|
||||||
* @param Client Pointer to client structure
|
* @return Pointer to the cloaked hostname or NULL if not set.
|
||||||
* @return Pointer to client hostname
|
|
||||||
*/
|
*/
|
||||||
GLOBAL char *
|
GLOBAL char *
|
||||||
Client_HostnameCloaked(CLIENT *Client)
|
Client_HostnameCloaked(CLIENT *Client)
|
||||||
{
|
{
|
||||||
assert(Client != NULL);
|
assert(Client != NULL);
|
||||||
if (Client_HasMode(Client, 'x'))
|
return Client->cloaked;
|
||||||
return Client_ID(Client->introducer);
|
}
|
||||||
else
|
|
||||||
return Client_Hostname(Client);
|
|
||||||
} /* Client_HostnameCloaked */
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get (potentially cloaked) hostname of a client to display it to other users.
|
||||||
|
*
|
||||||
|
* If the client has not enabled cloaking, the real hostname is used.
|
||||||
|
* Please note that this function uses a global static buffer, so you can't
|
||||||
|
* nest invocations without overwriting earlier results!
|
||||||
|
*
|
||||||
|
* @param Client Pointer to client structure
|
||||||
|
* @return Pointer to client hostname
|
||||||
|
*/
|
||||||
GLOBAL char *
|
GLOBAL char *
|
||||||
Client_Password( CLIENT *Client )
|
Client_HostnameDisplayed(CLIENT *Client)
|
||||||
{
|
{
|
||||||
assert( Client != NULL );
|
assert(Client != NULL);
|
||||||
return Client->pwd;
|
|
||||||
} /* Client_Password */
|
|
||||||
|
|
||||||
|
/* Client isn't cloaked at all, return real hostname: */
|
||||||
|
if (!Client_HasMode(Client, 'x'))
|
||||||
|
return Client_Hostname(Client);
|
||||||
|
|
||||||
|
/* Use an already saved cloaked hostname, if there is one */
|
||||||
|
if (Client->cloaked[0])
|
||||||
|
return Client->cloaked;
|
||||||
|
|
||||||
|
Client_UpdateCloakedHostname(Client, NULL, NULL);
|
||||||
|
return Client->cloaked;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update (and generate, if necessary) the cloaked hostname of a client.
|
||||||
|
*
|
||||||
|
* The newly set cloaked hostname is announced in the network using METADATA
|
||||||
|
* commands to peers that support this feature.
|
||||||
|
*
|
||||||
|
* @param Client The client of which the cloaked hostname should be updated.
|
||||||
|
* @param Origin The originator of the hostname change, or NULL if this server.
|
||||||
|
* @param Hostname The new cloaked hostname, or NULL if it should be generated.
|
||||||
|
*/
|
||||||
|
GLOBAL void
|
||||||
|
Client_UpdateCloakedHostname(CLIENT *Client, CLIENT *Origin,
|
||||||
|
const char *Hostname)
|
||||||
|
{
|
||||||
|
static char Cloak_Buffer[CLIENT_HOST_LEN];
|
||||||
|
|
||||||
|
assert(Client != NULL);
|
||||||
|
if (!Origin)
|
||||||
|
Origin = Client_ThisServer();
|
||||||
|
|
||||||
|
if (!Hostname) {
|
||||||
|
/* Generate new cloaked hostname */
|
||||||
|
if (*Conf_CloakHostModeX) {
|
||||||
|
strlcpy(Cloak_Buffer, Client->host, CLIENT_HOST_LEN);
|
||||||
|
strlcat(Cloak_Buffer, Conf_CloakHostSalt,
|
||||||
|
CLIENT_HOST_LEN);
|
||||||
|
snprintf(Client->cloaked, sizeof(Client->cloaked),
|
||||||
|
Conf_CloakHostModeX, Hash(Cloak_Buffer));
|
||||||
|
} else
|
||||||
|
strlcpy(Client->cloaked, Client_ID(Client->introducer),
|
||||||
|
sizeof(Client->cloaked));
|
||||||
|
} else
|
||||||
|
strlcpy(Client->cloaked, Hostname, sizeof(Client->cloaked));
|
||||||
|
LogDebug("Cloaked hostname of \"%s\" updated to \"%s\"",
|
||||||
|
Client_ID(Client), Client->cloaked);
|
||||||
|
|
||||||
|
/* Inform other servers in the network */
|
||||||
|
IRC_WriteStrServersPrefixFlag(Client_NextHop(Origin), Origin, 'M',
|
||||||
|
"METADATA %s cloakhost :%s",
|
||||||
|
Client_ID(Client), Client->cloaked);
|
||||||
|
}
|
||||||
|
|
||||||
GLOBAL char *
|
GLOBAL char *
|
||||||
Client_Modes( CLIENT *Client )
|
Client_Modes( CLIENT *Client )
|
||||||
@@ -768,7 +831,7 @@ Client_NextHop( CLIENT *Client )
|
|||||||
* Return ID of a client: "client!user@host"
|
* Return ID of a client: "client!user@host"
|
||||||
* This client ID is used for IRC prefixes, for example.
|
* This client ID is used for IRC prefixes, for example.
|
||||||
* Please note that this function uses a global static buffer, so you can't
|
* Please note that this function uses a global static buffer, so you can't
|
||||||
* nest invocations without overwriting erlier results!
|
* nest invocations without overwriting earlier results!
|
||||||
* @param Client Pointer to client structure
|
* @param Client Pointer to client structure
|
||||||
* @return Pointer to global buffer containing the client ID
|
* @return Pointer to global buffer containing the client ID
|
||||||
*/
|
*/
|
||||||
@@ -791,10 +854,12 @@ Client_Mask( CLIENT *Client )
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Return ID of a client with cloaked hostname: "client!user@server-name"
|
* Return ID of a client with cloaked hostname: "client!user@server-name"
|
||||||
|
*
|
||||||
* This client ID is used for IRC prefixes, for example.
|
* This client ID is used for IRC prefixes, for example.
|
||||||
* Please note that this function uses a global static buffer, so you can't
|
* Please note that this function uses a global static buffer, so you can't
|
||||||
* nest invocations without overwriting erlier results!
|
* nest invocations without overwriting earlier results!
|
||||||
* If the client has not enabled cloaking, the real hostname is used.
|
* If the client has not enabled cloaking, the real hostname is used.
|
||||||
|
*
|
||||||
* @param Client Pointer to client structure
|
* @param Client Pointer to client structure
|
||||||
* @return Pointer to global buffer containing the client ID
|
* @return Pointer to global buffer containing the client ID
|
||||||
*/
|
*/
|
||||||
@@ -807,10 +872,11 @@ Client_MaskCloaked(CLIENT *Client)
|
|||||||
|
|
||||||
/* Is the client using cloaking at all? */
|
/* Is the client using cloaking at all? */
|
||||||
if (!Client_HasMode(Client, 'x'))
|
if (!Client_HasMode(Client, 'x'))
|
||||||
return Client_Mask(Client);
|
return Client_Mask(Client);
|
||||||
|
|
||||||
|
snprintf(Mask_Buffer, GETID_LEN, "%s!%s@%s", Client->id, Client->user,
|
||||||
|
Client_HostnameDisplayed(Client));
|
||||||
|
|
||||||
snprintf(Mask_Buffer, GETID_LEN, "%s!%s@%s",
|
|
||||||
Client->id, Client->user, Client_ID(Client->introducer));
|
|
||||||
return Mask_Buffer;
|
return Mask_Buffer;
|
||||||
} /* Client_MaskCloaked */
|
} /* Client_MaskCloaked */
|
||||||
|
|
||||||
@@ -847,23 +913,47 @@ Client_Away( CLIENT *Client )
|
|||||||
} /* Client_Away */
|
} /* Client_Away */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make sure that a given nickname is valid.
|
||||||
|
*
|
||||||
|
* If the nickname is not valid for the given client, this function sends back
|
||||||
|
* the appropriate error messages.
|
||||||
|
*
|
||||||
|
* @param Client Client that wants to change the nickname.
|
||||||
|
* @param Nick New nickname.
|
||||||
|
* @returns true if nickname is valid, false otherwise.
|
||||||
|
*/
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
Client_CheckNick( CLIENT *Client, char *Nick )
|
Client_CheckNick(CLIENT *Client, char *Nick)
|
||||||
{
|
{
|
||||||
assert( Client != NULL );
|
assert(Client != NULL);
|
||||||
assert( Nick != NULL );
|
assert(Nick != NULL);
|
||||||
|
|
||||||
if (! Client_IsValidNick( Nick ))
|
if (!Client_IsValidNick(Nick)) {
|
||||||
{
|
if (strlen(Nick ) >= Conf_MaxNickLength)
|
||||||
IRC_WriteStrClient( Client, ERR_ERRONEUSNICKNAME_MSG, Client_ID( Client ), Nick );
|
IRC_WriteStrClient(Client, ERR_NICKNAMETOOLONG_MSG,
|
||||||
|
Client_ID(Client), Nick,
|
||||||
|
Conf_MaxNickLength - 1);
|
||||||
|
else
|
||||||
|
IRC_WriteStrClient(Client, ERR_ERRONEUSNICKNAME_MSG,
|
||||||
|
Client_ID(Client), Nick);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Nick bereits vergeben? */
|
if (Client_Type(Client) != CLIENT_SERVER
|
||||||
if( Client_Search( Nick ))
|
&& Client_Type(Client) != CLIENT_SERVICE) {
|
||||||
{
|
/* Make sure that this isn't a restricted/forbidden nickname */
|
||||||
/* den Nick gibt es bereits */
|
if (Conf_NickIsBlocked(Nick)) {
|
||||||
IRC_WriteStrClient( Client, ERR_NICKNAMEINUSE_MSG, Client_ID( Client ), Nick );
|
IRC_WriteStrClient(Client, ERR_FORBIDDENNICKNAME_MSG,
|
||||||
|
Client_ID(Client), Nick);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Nickname already registered? */
|
||||||
|
if (Client_Search(Nick)) {
|
||||||
|
IRC_WriteStrClient(Client, ERR_NICKNAMEINUSE_MSG,
|
||||||
|
Client_ID(Client), Nick);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1019,23 +1109,31 @@ Client_MyMaxUserCount( void )
|
|||||||
} /* Client_MyMaxUserCount */
|
} /* Client_MyMaxUserCount */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check that a given nickname is valid.
|
||||||
|
*
|
||||||
|
* @param Nick the nickname to check.
|
||||||
|
* @returns true if nickname is valid, false otherwise.
|
||||||
|
*/
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
Client_IsValidNick( const char *Nick )
|
Client_IsValidNick(const char *Nick)
|
||||||
{
|
{
|
||||||
const char *ptr;
|
const char *ptr;
|
||||||
static const char goodchars[] = ";0123456789-";
|
static const char goodchars[] = ";0123456789-";
|
||||||
|
|
||||||
assert( Nick != NULL );
|
assert (Nick != NULL);
|
||||||
|
|
||||||
if( Nick[0] == '#' ) return false;
|
if (strchr(goodchars, Nick[0]))
|
||||||
if( strchr( goodchars, Nick[0] )) return false;
|
return false;
|
||||||
if( strlen( Nick ) >= Conf_MaxNickLength) return false;
|
if (strlen(Nick ) >= Conf_MaxNickLength)
|
||||||
|
return false;
|
||||||
|
|
||||||
ptr = Nick;
|
ptr = Nick;
|
||||||
while( *ptr )
|
while (*ptr) {
|
||||||
{
|
if (*ptr < 'A' && !strchr(goodchars, *ptr ))
|
||||||
if (( *ptr < 'A' ) && ( ! strchr( goodchars, *ptr ))) return false;
|
return false;
|
||||||
if ( *ptr > '}' ) return false;
|
if (*ptr > '}')
|
||||||
|
return false;
|
||||||
ptr++;
|
ptr++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1075,6 +1173,79 @@ Client_StartTime(CLIENT *Client)
|
|||||||
} /* Client_Uptime */
|
} /* Client_Uptime */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reject a client when logging in.
|
||||||
|
*
|
||||||
|
* This function is called when a client isn't allowed to connect to this
|
||||||
|
* server. Possible reasons are bad server password, bad PAM password,
|
||||||
|
* or that the client is G/K-Line'd.
|
||||||
|
*
|
||||||
|
* After calling this function, the client isn't connected any more.
|
||||||
|
*
|
||||||
|
* @param Client The client to reject.
|
||||||
|
* @param Reason The reason why the client has been rejected.
|
||||||
|
* @param InformClient If true, send the exact reason to the client.
|
||||||
|
*/
|
||||||
|
GLOBAL void
|
||||||
|
Client_Reject(CLIENT *Client, const char *Reason, bool InformClient)
|
||||||
|
{
|
||||||
|
char info[COMMAND_LEN];
|
||||||
|
|
||||||
|
assert(Client != NULL);
|
||||||
|
assert(Reason != NULL);
|
||||||
|
|
||||||
|
if (InformClient)
|
||||||
|
snprintf(info, sizeof(info), "Access denied: %s", Reason);
|
||||||
|
else
|
||||||
|
strcpy(info, "Access denied: Bad password?");
|
||||||
|
|
||||||
|
Log(LOG_ERR,
|
||||||
|
"User \"%s\" rejected (connection %d): %s!",
|
||||||
|
Client_Mask(Client), Client_Conn(Client), Reason);
|
||||||
|
Conn_Close(Client_Conn(Client), Reason, info, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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_NickIsService(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
|
static unsigned long
|
||||||
Count( CLIENT_TYPE Type )
|
Count( CLIENT_TYPE Type )
|
||||||
{
|
{
|
||||||
@@ -1192,6 +1363,10 @@ Client_RegisterWhowas( CLIENT *Client )
|
|||||||
|
|
||||||
assert( Client != NULL );
|
assert( Client != NULL );
|
||||||
|
|
||||||
|
/* Don't register WHOWAS information when "MorePrivacy" is enabled. */
|
||||||
|
if (Conf_MorePrivacy)
|
||||||
|
return;
|
||||||
|
|
||||||
now = time(NULL);
|
now = time(NULL);
|
||||||
/* Don't register clients that were connected less than 30 seconds. */
|
/* Don't register clients that were connected less than 30 seconds. */
|
||||||
if( now - Client->starttime < 30 )
|
if( now - Client->starttime < 30 )
|
||||||
@@ -1209,7 +1384,7 @@ Client_RegisterWhowas( CLIENT *Client )
|
|||||||
sizeof( My_Whowas[slot].id ));
|
sizeof( My_Whowas[slot].id ));
|
||||||
strlcpy( My_Whowas[slot].user, Client_User( Client ),
|
strlcpy( My_Whowas[slot].user, Client_User( Client ),
|
||||||
sizeof( My_Whowas[slot].user ));
|
sizeof( My_Whowas[slot].user ));
|
||||||
strlcpy( My_Whowas[slot].host, Client_HostnameCloaked( Client ),
|
strlcpy( My_Whowas[slot].host, Client_HostnameDisplayed( Client ),
|
||||||
sizeof( My_Whowas[slot].host ));
|
sizeof( My_Whowas[slot].host ));
|
||||||
strlcpy( My_Whowas[slot].info, Client_Info( Client ),
|
strlcpy( My_Whowas[slot].info, Client_Info( Client ),
|
||||||
sizeof( My_Whowas[slot].info ));
|
sizeof( My_Whowas[slot].info ));
|
||||||
@@ -1290,6 +1465,59 @@ Destroy_UserOrService(CLIENT *Client, const char *Txt, const char *FwdMsg, bool
|
|||||||
} /* Destroy_UserOrService */
|
} /* 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
|
#ifdef DEBUG
|
||||||
|
|
||||||
GLOBAL void
|
GLOBAL void
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* 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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -29,12 +29,13 @@
|
|||||||
#ifndef STRICT_RFC
|
#ifndef STRICT_RFC
|
||||||
# define CLIENT_WAITAUTHPING 512 /* waiting for AUTH PONG from client */
|
# define CLIENT_WAITAUTHPING 512 /* waiting for AUTH PONG from client */
|
||||||
#endif
|
#endif
|
||||||
|
#define CLIENT_WAITCAPEND 1024 /* waiting for "CAP END" command */
|
||||||
|
|
||||||
#define CLIENT_TYPE int
|
#define CLIENT_TYPE int
|
||||||
|
|
||||||
#include "defines.h"
|
#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
|
typedef struct _CLIENT
|
||||||
{
|
{
|
||||||
@@ -46,8 +47,8 @@ typedef struct _CLIENT
|
|||||||
CONN_ID conn_id; /* ID of the connection (if local) or NONE (remote) */
|
CONN_ID conn_id; /* ID of the connection (if local) or NONE (remote) */
|
||||||
struct _CLIENT *introducer; /* ID of the servers which the client is connected to */
|
struct _CLIENT *introducer; /* ID of the servers which the client is connected to */
|
||||||
struct _CLIENT *topserver; /* toplevel servers (only valid if client is a server) */
|
struct _CLIENT *topserver; /* toplevel servers (only valid if client is a server) */
|
||||||
char pwd[CLIENT_PASS_LEN]; /* password received of the client */
|
|
||||||
char host[CLIENT_HOST_LEN]; /* hostname of the client */
|
char host[CLIENT_HOST_LEN]; /* hostname of the client */
|
||||||
|
char cloaked[CLIENT_HOST_LEN]; /* cloaked hostname of the client */
|
||||||
char user[CLIENT_USER_LEN]; /* user name ("login") */
|
char user[CLIENT_USER_LEN]; /* user name ("login") */
|
||||||
#if defined(PAM) && defined(IDENTAUTH)
|
#if defined(PAM) && defined(IDENTAUTH)
|
||||||
char orig_user[CLIENT_USER_LEN];/* user name supplied by USER command */
|
char orig_user[CLIENT_USER_LEN];/* user name supplied by USER command */
|
||||||
@@ -58,6 +59,7 @@ typedef struct _CLIENT
|
|||||||
bool oper_by_me; /* client is local IRC operator on this server? */
|
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 away[CLIENT_AWAY_LEN]; /* AWAY text (valid if mode 'a' is set) */
|
||||||
char flags[CLIENT_FLAGS_LEN]; /* flags of the client */
|
char flags[CLIENT_FLAGS_LEN]; /* flags of the client */
|
||||||
|
int capabilities; /* enabled IRC capabilities */
|
||||||
} CLIENT;
|
} CLIENT;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
@@ -70,7 +72,7 @@ typedef POINTER CLIENT;
|
|||||||
typedef struct _WHOWAS
|
typedef struct _WHOWAS
|
||||||
{
|
{
|
||||||
time_t time; /* time stamp of entry or 0 if unused */
|
time_t time; /* time stamp of entry or 0 if unused */
|
||||||
char id[CLIENT_NICK_LEN]; /* client nick name */
|
char id[CLIENT_NICK_LEN]; /* client nickname */
|
||||||
char host[CLIENT_HOST_LEN]; /* hostname of the client */
|
char host[CLIENT_HOST_LEN]; /* hostname of the client */
|
||||||
char user[CLIENT_USER_LEN]; /* user name ("login") */
|
char user[CLIENT_USER_LEN]; /* user name ("login") */
|
||||||
char info[CLIENT_INFO_LEN]; /* long user name */
|
char info[CLIENT_INFO_LEN]; /* long user name */
|
||||||
@@ -106,8 +108,8 @@ GLOBAL char *Client_User PARAMS(( CLIENT *Client ));
|
|||||||
GLOBAL char *Client_OrigUser PARAMS(( CLIENT *Client ));
|
GLOBAL char *Client_OrigUser PARAMS(( CLIENT *Client ));
|
||||||
#endif
|
#endif
|
||||||
GLOBAL char *Client_Hostname PARAMS(( CLIENT *Client ));
|
GLOBAL char *Client_Hostname PARAMS(( CLIENT *Client ));
|
||||||
GLOBAL char *Client_HostnameCloaked PARAMS(( CLIENT *Client ));
|
GLOBAL char *Client_HostnameCloaked PARAMS((CLIENT *Client));
|
||||||
GLOBAL char *Client_Password PARAMS(( CLIENT *Client ));
|
GLOBAL char *Client_HostnameDisplayed PARAMS(( CLIENT *Client ));
|
||||||
GLOBAL char *Client_Modes PARAMS(( CLIENT *Client ));
|
GLOBAL char *Client_Modes PARAMS(( CLIENT *Client ));
|
||||||
GLOBAL char *Client_Flags PARAMS(( CLIENT *Client ));
|
GLOBAL char *Client_Flags PARAMS(( CLIENT *Client ));
|
||||||
GLOBAL CLIENT *Client_Introducer PARAMS(( CLIENT *Client ));
|
GLOBAL CLIENT *Client_Introducer PARAMS(( CLIENT *Client ));
|
||||||
@@ -127,7 +129,6 @@ GLOBAL void Client_SetID PARAMS(( CLIENT *Client, const char *Nick ));
|
|||||||
GLOBAL void Client_SetUser PARAMS(( CLIENT *Client, const char *User, bool Idented ));
|
GLOBAL void Client_SetUser PARAMS(( CLIENT *Client, const char *User, bool Idented ));
|
||||||
GLOBAL void Client_SetOrigUser PARAMS(( CLIENT *Client, const char *User ));
|
GLOBAL void Client_SetOrigUser PARAMS(( CLIENT *Client, const char *User ));
|
||||||
GLOBAL void Client_SetInfo PARAMS(( CLIENT *Client, const char *Info ));
|
GLOBAL void Client_SetInfo PARAMS(( CLIENT *Client, const char *Info ));
|
||||||
GLOBAL void Client_SetPassword PARAMS(( CLIENT *Client, const char *Pwd ));
|
|
||||||
GLOBAL void Client_SetType PARAMS(( CLIENT *Client, int Type ));
|
GLOBAL void Client_SetType PARAMS(( CLIENT *Client, int Type ));
|
||||||
GLOBAL void Client_SetHops PARAMS(( CLIENT *Client, int Hops ));
|
GLOBAL void Client_SetHops PARAMS(( CLIENT *Client, int Hops ));
|
||||||
GLOBAL void Client_SetToken PARAMS(( CLIENT *Client, int Token ));
|
GLOBAL void Client_SetToken PARAMS(( CLIENT *Client, int Token ));
|
||||||
@@ -163,6 +164,15 @@ GLOBAL void Client_RegisterWhowas PARAMS(( CLIENT *Client ));
|
|||||||
|
|
||||||
GLOBAL const char *Client_TypeText PARAMS((CLIENT *Client));
|
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));
|
||||||
|
|
||||||
|
GLOBAL void Client_UpdateCloakedHostname PARAMS((CLIENT *Client,
|
||||||
|
CLIENT *Originator,
|
||||||
|
const char *hostname));
|
||||||
|
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
GLOBAL void Client_DebugDump PARAMS((void));
|
GLOBAL void Client_DebugDump PARAMS((void));
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -33,19 +33,15 @@ struct ConnSSL_State {
|
|||||||
SSL *ssl;
|
SSL *ssl;
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_LIBGNUTLS
|
#ifdef HAVE_LIBGNUTLS
|
||||||
gnutls_session gnutls_session;
|
gnutls_session_t gnutls_session;
|
||||||
void *cookie; /* pointer to server configuration structure
|
void *cookie; /* pointer to server configuration structure
|
||||||
(for outgoing connections), or NULL. */
|
(for outgoing connections), or NULL. */
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
bool
|
#endif
|
||||||
ConnSSL_InitLibrary(void);
|
|
||||||
#else
|
bool ConnSSL_InitLibrary(void);
|
||||||
static inline bool
|
|
||||||
ConnSSL_InitLibrary(void)
|
|
||||||
{ return true; }
|
|
||||||
#endif /* SSL_SUPPORT */
|
|
||||||
|
|
||||||
#endif /* conf_ssl_h */
|
#endif /* conf_ssl_h */
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* 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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -18,6 +18,7 @@
|
|||||||
|
|
||||||
#include "imp.h"
|
#include "imp.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <ctype.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#ifdef PROTOTYPES
|
#ifdef PROTOTYPES
|
||||||
# include <stdarg.h>
|
# include <stdarg.h>
|
||||||
@@ -34,9 +35,6 @@
|
|||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#ifdef HAVE_CTYPE_H
|
|
||||||
# include <ctype.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "array.h"
|
#include "array.h"
|
||||||
#include "ngircd.h"
|
#include "ngircd.h"
|
||||||
@@ -55,12 +53,10 @@ static bool Use_Log = true, Using_MotdFile = true;
|
|||||||
static CONF_SERVER New_Server;
|
static CONF_SERVER New_Server;
|
||||||
static int New_Server_Idx;
|
static int New_Server_Idx;
|
||||||
|
|
||||||
static size_t Conf_Oper_Count;
|
|
||||||
static size_t Conf_Channel_Count;
|
|
||||||
static char Conf_MotdFile[FNAME_LEN];
|
static char Conf_MotdFile[FNAME_LEN];
|
||||||
|
|
||||||
static void Set_Defaults PARAMS(( bool InitServers ));
|
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 bool Validate_Config PARAMS(( bool TestOnly, bool Rehash ));
|
||||||
|
|
||||||
static void Handle_GLOBAL PARAMS(( int Line, char *Var, char *Arg ));
|
static void Handle_GLOBAL PARAMS(( int Line, char *Var, char *Arg ));
|
||||||
@@ -108,6 +104,30 @@ ConfSSL_Init(void)
|
|||||||
free(Conf_SSLOptions.DHFile);
|
free(Conf_SSLOptions.DHFile);
|
||||||
Conf_SSLOptions.DHFile = NULL;
|
Conf_SSLOptions.DHFile = NULL;
|
||||||
array_free_wipe(&Conf_SSLOptions.KeyFilePassword);
|
array_free_wipe(&Conf_SSLOptions.KeyFilePassword);
|
||||||
|
|
||||||
|
array_free(&Conf_SSLOptions.ListenPorts);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the current configuration uses/requires SSL.
|
||||||
|
*
|
||||||
|
* @returns true if SSL is used and should be initialized.
|
||||||
|
*/
|
||||||
|
GLOBAL bool
|
||||||
|
Conf_SSLInUse(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/* SSL listen ports configured? */
|
||||||
|
if (array_bytes(&Conf_SSLOptions.ListenPorts))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
for (i = 0; i < MAX_SERVERS; i++) {
|
||||||
|
if (Conf_Server[i].port > 0
|
||||||
|
&& Conf_Server[i].SSLConnect)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -208,7 +228,7 @@ ports_parse(array *a, int Line, char *Arg)
|
|||||||
GLOBAL void
|
GLOBAL void
|
||||||
Conf_Init( void )
|
Conf_Init( void )
|
||||||
{
|
{
|
||||||
Read_Config( true );
|
Read_Config(false, true);
|
||||||
Validate_Config(false, false);
|
Validate_Config(false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -220,7 +240,7 @@ Conf_Init( void )
|
|||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
Conf_Rehash( void )
|
Conf_Rehash( void )
|
||||||
{
|
{
|
||||||
if (!Read_Config(false))
|
if (!Read_Config(false, false))
|
||||||
return false;
|
return false;
|
||||||
Validate_Config(false, true);
|
Validate_Config(false, true);
|
||||||
|
|
||||||
@@ -265,18 +285,18 @@ static void
|
|||||||
opers_puts(void)
|
opers_puts(void)
|
||||||
{
|
{
|
||||||
struct Conf_Oper *op;
|
struct Conf_Oper *op;
|
||||||
size_t len;
|
size_t count, i;
|
||||||
|
|
||||||
len = array_length(&Conf_Opers, sizeof(*op));
|
count = array_length(&Conf_Opers, sizeof(*op));
|
||||||
op = array_start(&Conf_Opers);
|
op = array_start(&Conf_Opers);
|
||||||
while (len--) {
|
for (i = 0; i < count; i++, op++) {
|
||||||
assert(op->name[0]);
|
if (!op->name[0])
|
||||||
|
continue;
|
||||||
|
|
||||||
puts("[OPERATOR]");
|
puts("[OPERATOR]");
|
||||||
printf(" Name = %s\n", op->name);
|
printf(" Name = %s\n", op->name);
|
||||||
printf(" Password = %s\n", op->pwd);
|
printf(" Password = %s\n", op->pwd);
|
||||||
printf(" Mask = %s\n\n", op->mask ? op->mask : "");
|
printf(" Mask = %s\n\n", op->mask ? op->mask : "");
|
||||||
op++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -301,7 +321,7 @@ Conf_Test( void )
|
|||||||
|
|
||||||
Use_Log = false;
|
Use_Log = false;
|
||||||
|
|
||||||
if (! Read_Config(true))
|
if (!Read_Config(true, true))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
config_valid = Validate_Config(true, false);
|
config_valid = Validate_Config(true, false);
|
||||||
@@ -348,10 +368,11 @@ Conf_Test( void )
|
|||||||
|
|
||||||
puts("[LIMITS]");
|
puts("[LIMITS]");
|
||||||
printf(" ConnectRetry = %d\n", Conf_ConnectRetry);
|
printf(" ConnectRetry = %d\n", Conf_ConnectRetry);
|
||||||
printf(" MaxConnections = %ld\n", Conf_MaxConnections);
|
printf(" MaxConnections = %d\n", Conf_MaxConnections);
|
||||||
printf(" MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP);
|
printf(" MaxConnectionsIP = %d\n", Conf_MaxConnectionsIP);
|
||||||
printf(" MaxJoins = %d\n", Conf_MaxJoins > 0 ? Conf_MaxJoins : -1);
|
printf(" MaxJoins = %d\n", Conf_MaxJoins > 0 ? Conf_MaxJoins : -1);
|
||||||
printf(" MaxNickLength = %u\n", Conf_MaxNickLength - 1);
|
printf(" MaxNickLength = %u\n", Conf_MaxNickLength - 1);
|
||||||
|
printf(" MaxListSize = %d\n", Conf_MaxListSize);
|
||||||
printf(" PingTimeout = %d\n", Conf_PingTimeout);
|
printf(" PingTimeout = %d\n", Conf_PingTimeout);
|
||||||
printf(" PongTimeout = %d\n", Conf_PongTimeout);
|
printf(" PongTimeout = %d\n", Conf_PongTimeout);
|
||||||
puts("");
|
puts("");
|
||||||
@@ -360,6 +381,8 @@ Conf_Test( void )
|
|||||||
printf(" AllowRemoteOper = %s\n", yesno_to_str(Conf_AllowRemoteOper));
|
printf(" AllowRemoteOper = %s\n", yesno_to_str(Conf_AllowRemoteOper));
|
||||||
printf(" ChrootDir = %s\n", Conf_Chroot);
|
printf(" ChrootDir = %s\n", Conf_Chroot);
|
||||||
printf(" CloakHost = %s\n", Conf_CloakHost);
|
printf(" CloakHost = %s\n", Conf_CloakHost);
|
||||||
|
printf(" CloakHostModeX = %s\n", Conf_CloakHostModeX);
|
||||||
|
printf(" CloakHostSalt = %s\n", Conf_CloakHostSalt);
|
||||||
printf(" CloakUserToNick = %s\n", yesno_to_str(Conf_CloakUserToNick));
|
printf(" CloakUserToNick = %s\n", yesno_to_str(Conf_CloakUserToNick));
|
||||||
#ifdef WANT_IPV6
|
#ifdef WANT_IPV6
|
||||||
printf(" ConnectIPv4 = %s\n", yesno_to_str(Conf_ConnectIPv6));
|
printf(" ConnectIPv4 = %s\n", yesno_to_str(Conf_ConnectIPv6));
|
||||||
@@ -372,9 +395,11 @@ Conf_Test( void )
|
|||||||
printf(" MorePrivacy = %s\n", yesno_to_str(Conf_MorePrivacy));
|
printf(" MorePrivacy = %s\n", yesno_to_str(Conf_MorePrivacy));
|
||||||
printf(" NoticeAuth = %s\n", yesno_to_str(Conf_NoticeAuth));
|
printf(" NoticeAuth = %s\n", yesno_to_str(Conf_NoticeAuth));
|
||||||
printf(" OperCanUseMode = %s\n", yesno_to_str(Conf_OperCanMode));
|
printf(" OperCanUseMode = %s\n", yesno_to_str(Conf_OperCanMode));
|
||||||
|
printf(" OperChanPAutoOp = %s\n", yesno_to_str(Conf_OperChanPAutoOp));
|
||||||
printf(" OperServerMode = %s\n", yesno_to_str(Conf_OperServerMode));
|
printf(" OperServerMode = %s\n", yesno_to_str(Conf_OperServerMode));
|
||||||
#ifdef PAM
|
#ifdef PAM
|
||||||
printf(" PAM = %s\n", yesno_to_str(Conf_PAM));
|
printf(" PAM = %s\n", yesno_to_str(Conf_PAM));
|
||||||
|
printf(" PAMIsOptional = %s\n", yesno_to_str(Conf_PAMIsOptional));
|
||||||
#endif
|
#endif
|
||||||
printf(" PredefChannelsOnly = %s\n", yesno_to_str(Conf_PredefChannelsOnly));
|
printf(" PredefChannelsOnly = %s\n", yesno_to_str(Conf_PredefChannelsOnly));
|
||||||
#ifndef STRICT_RFC
|
#ifndef STRICT_RFC
|
||||||
@@ -478,8 +503,12 @@ Conf_UnsetServer( CONN_ID Idx )
|
|||||||
* require the next attempt to be delayed. */
|
* require the next attempt to be delayed. */
|
||||||
Conf_Server[i].lasttry =
|
Conf_Server[i].lasttry =
|
||||||
t - Conf_ConnectRetry + RECONNECT_DELAY;
|
t - Conf_ConnectRetry + RECONNECT_DELAY;
|
||||||
} else
|
} else {
|
||||||
Conf_Server[i].lasttry = t;
|
/* "Short" connection, enforce "ConnectRetry"
|
||||||
|
* but randomize it a little bit: 15 seconds. */
|
||||||
|
Conf_Server[i].lasttry =
|
||||||
|
t + rand() / (RAND_MAX / 15);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -487,13 +516,23 @@ Conf_UnsetServer( CONN_ID Idx )
|
|||||||
/**
|
/**
|
||||||
* Set connection information for specified configured server.
|
* Set connection information for specified configured server.
|
||||||
*/
|
*/
|
||||||
GLOBAL void
|
GLOBAL bool
|
||||||
Conf_SetServer( int ConfServer, CONN_ID Idx )
|
Conf_SetServer( int ConfServer, CONN_ID Idx )
|
||||||
{
|
{
|
||||||
assert( ConfServer > NONE );
|
assert( ConfServer > NONE );
|
||||||
assert( Idx > NONE );
|
assert( Idx > NONE );
|
||||||
|
|
||||||
|
if (Conf_Server[ConfServer].conn_id > NONE &&
|
||||||
|
Conf_Server[ConfServer].conn_id != Idx) {
|
||||||
|
Log(LOG_ERR,
|
||||||
|
"Connection %d: Server configuration of \"%s\" already in use by connection %d!",
|
||||||
|
Idx, Conf_Server[ConfServer].name,
|
||||||
|
Conf_Server[ConfServer].conn_id);
|
||||||
|
Conn_Close(Idx, NULL, "Server configuration already in use", true);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
Conf_Server[ConfServer].conn_id = Idx;
|
Conf_Server[ConfServer].conn_id = Idx;
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -627,14 +666,41 @@ Conf_AddServer(const char *Name, UINT16 Port, const char *Host,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check if the given nick name is an service.
|
* Check if the given nickname is reserved for services on a particular server.
|
||||||
*
|
*
|
||||||
* @returns true if the given nick name belongs to an "IRC service".
|
* @param ConfServer The server index to check.
|
||||||
|
* @param Nick The nickname to check.
|
||||||
|
* @returns true if the given nickname belongs to an "IRC service".
|
||||||
*/
|
*/
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
Conf_IsService(int ConfServer, const char *Nick)
|
Conf_NickIsService(int ConfServer, const char *Nick)
|
||||||
{
|
{
|
||||||
return MatchCaseInsensitive(Conf_Server[ConfServer].svs_mask, Nick);
|
assert (ConfServer >= 0);
|
||||||
|
assert (ConfServer < MAX_SERVERS);
|
||||||
|
|
||||||
|
return MatchCaseInsensitiveList(Conf_Server[ConfServer].svs_mask,
|
||||||
|
Nick, ",");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the given nickname is blocked for "normal client" use.
|
||||||
|
*
|
||||||
|
* @param ConfServer The server index or NONE to check all configured servers.
|
||||||
|
* @param Nick The nickname to check.
|
||||||
|
* @returns true if the given nickname belongs to an "IRC service".
|
||||||
|
*/
|
||||||
|
GLOBAL bool
|
||||||
|
Conf_NickIsBlocked(const char *Nick)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for(i = 0; i < MAX_SERVERS; i++) {
|
||||||
|
if (!Conf_Server[i].name[0])
|
||||||
|
continue;
|
||||||
|
if (Conf_NickIsService(i, Nick))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -644,6 +710,7 @@ static void
|
|||||||
Set_Defaults(bool InitServers)
|
Set_Defaults(bool InitServers)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
char random[RANDOM_SALT_LEN + 1];
|
||||||
|
|
||||||
/* Global */
|
/* Global */
|
||||||
strcpy(Conf_ServerName, "");
|
strcpy(Conf_ServerName, "");
|
||||||
@@ -654,6 +721,7 @@ Set_Defaults(bool InitServers)
|
|||||||
PACKAGE_NAME, PACKAGE_VERSION);
|
PACKAGE_NAME, PACKAGE_VERSION);
|
||||||
free(Conf_ListenAddress);
|
free(Conf_ListenAddress);
|
||||||
Conf_ListenAddress = NULL;
|
Conf_ListenAddress = NULL;
|
||||||
|
array_free(&Conf_ListenPorts);
|
||||||
array_free(&Conf_Motd);
|
array_free(&Conf_Motd);
|
||||||
strlcpy(Conf_MotdFile, SYSCONFDIR, sizeof(Conf_MotdFile));
|
strlcpy(Conf_MotdFile, SYSCONFDIR, sizeof(Conf_MotdFile));
|
||||||
strlcat(Conf_MotdFile, MOTD_FILE, sizeof(Conf_MotdFile));
|
strlcat(Conf_MotdFile, MOTD_FILE, sizeof(Conf_MotdFile));
|
||||||
@@ -667,6 +735,7 @@ Set_Defaults(bool InitServers)
|
|||||||
Conf_MaxConnectionsIP = 5;
|
Conf_MaxConnectionsIP = 5;
|
||||||
Conf_MaxJoins = 10;
|
Conf_MaxJoins = 10;
|
||||||
Conf_MaxNickLength = CLIENT_NICK_LEN_DEFAULT;
|
Conf_MaxNickLength = CLIENT_NICK_LEN_DEFAULT;
|
||||||
|
Conf_MaxListSize = 100;
|
||||||
Conf_PingTimeout = 120;
|
Conf_PingTimeout = 120;
|
||||||
Conf_PongTimeout = 20;
|
Conf_PongTimeout = 20;
|
||||||
|
|
||||||
@@ -677,6 +746,9 @@ Set_Defaults(bool InitServers)
|
|||||||
#endif
|
#endif
|
||||||
strlcpy(Conf_Chroot, CHROOT_DIR, sizeof(Conf_Chroot));
|
strlcpy(Conf_Chroot, CHROOT_DIR, sizeof(Conf_Chroot));
|
||||||
strcpy(Conf_CloakHost, "");
|
strcpy(Conf_CloakHost, "");
|
||||||
|
strcpy(Conf_CloakHostModeX, "");
|
||||||
|
strlcpy(Conf_CloakHostSalt, ngt_RandomStr(random, RANDOM_SALT_LEN),
|
||||||
|
sizeof(Conf_CloakHostSalt));
|
||||||
Conf_CloakUserToNick = false;
|
Conf_CloakUserToNick = false;
|
||||||
Conf_ConnectIPv4 = true;
|
Conf_ConnectIPv4 = true;
|
||||||
#ifdef WANT_IPV6
|
#ifdef WANT_IPV6
|
||||||
@@ -693,12 +765,14 @@ Set_Defaults(bool InitServers)
|
|||||||
Conf_MorePrivacy = false;
|
Conf_MorePrivacy = false;
|
||||||
Conf_NoticeAuth = false;
|
Conf_NoticeAuth = false;
|
||||||
Conf_OperCanMode = false;
|
Conf_OperCanMode = false;
|
||||||
|
Conf_OperChanPAutoOp = true;
|
||||||
Conf_OperServerMode = false;
|
Conf_OperServerMode = false;
|
||||||
#ifdef PAM
|
#ifdef PAM
|
||||||
Conf_PAM = true;
|
Conf_PAM = true;
|
||||||
#else
|
#else
|
||||||
Conf_PAM = false;
|
Conf_PAM = false;
|
||||||
#endif
|
#endif
|
||||||
|
Conf_PAMIsOptional = false;
|
||||||
Conf_PredefChannelsOnly = false;
|
Conf_PredefChannelsOnly = false;
|
||||||
#ifdef SYSLOG
|
#ifdef SYSLOG
|
||||||
Conf_ScrubCTCP = false;
|
Conf_ScrubCTCP = false;
|
||||||
@@ -709,10 +783,6 @@ Set_Defaults(bool InitServers)
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Initialize IRC operators and channels */
|
|
||||||
Conf_Oper_Count = 0;
|
|
||||||
Conf_Channel_Count = 0;
|
|
||||||
|
|
||||||
/* Initialize server configuration structures */
|
/* Initialize server configuration structures */
|
||||||
if (InitServers) {
|
if (InitServers) {
|
||||||
for (i = 0; i < MAX_SERVERS;
|
for (i = 0; i < MAX_SERVERS;
|
||||||
@@ -782,11 +852,12 @@ Read_Motd(const char *filename)
|
|||||||
* successfully; false otherwise.
|
* successfully; false otherwise.
|
||||||
*/
|
*/
|
||||||
static bool
|
static bool
|
||||||
Read_Config( bool ngircd_starting )
|
Read_Config(bool TestOnly, bool IsStarting)
|
||||||
{
|
{
|
||||||
char section[LINE_LEN], str[LINE_LEN], *var, *arg, *ptr;
|
char section[LINE_LEN], str[LINE_LEN], *var, *arg, *ptr;
|
||||||
const UINT16 defaultport = 6667;
|
const UINT16 defaultport = 6667;
|
||||||
int line, i, n;
|
int line, i, n;
|
||||||
|
size_t count;
|
||||||
FILE *fd;
|
FILE *fd;
|
||||||
|
|
||||||
/* Open configuration file */
|
/* Open configuration file */
|
||||||
@@ -795,16 +866,19 @@ Read_Config( bool ngircd_starting )
|
|||||||
/* No configuration file found! */
|
/* No configuration file found! */
|
||||||
Config_Error( LOG_ALERT, "Can't read configuration \"%s\": %s",
|
Config_Error( LOG_ALERT, "Can't read configuration \"%s\": %s",
|
||||||
NGIRCd_ConfFile, strerror( errno ));
|
NGIRCd_ConfFile, strerror( errno ));
|
||||||
if (!ngircd_starting)
|
if (!IsStarting)
|
||||||
return false;
|
return false;
|
||||||
Config_Error( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME );
|
Config_Error( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME );
|
||||||
exit( 1 );
|
exit( 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
opers_free();
|
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
|
/* Clean up server configuration structure: mark all already
|
||||||
* configured servers as "once" so that they are deleted
|
* configured servers as "once" so that they are deleted
|
||||||
@@ -857,10 +931,13 @@ Read_Config( bool ngircd_starting )
|
|||||||
/* Is this the beginning of a new section? */
|
/* Is this the beginning of a new section? */
|
||||||
if(( str[0] == '[' ) && ( str[strlen( str ) - 1] == ']' )) {
|
if(( str[0] == '[' ) && ( str[strlen( str ) - 1] == ']' )) {
|
||||||
strlcpy( section, str, sizeof( section ));
|
strlcpy( section, str, sizeof( section ));
|
||||||
if (strcasecmp(section, "[GLOBAL]") == 0 ||
|
if (strcasecmp(section, "[GLOBAL]") == 0
|
||||||
strcasecmp(section, "[LIMITS]") == 0 ||
|
|| strcasecmp(section, "[LIMITS]") == 0
|
||||||
strcasecmp(section, "[OPTIONS]") == 0 ||
|
|| strcasecmp(section, "[OPTIONS]") == 0
|
||||||
strcasecmp(section, "[SSL]") == 0)
|
#ifdef SSL_SUPPORT
|
||||||
|
|| strcasecmp(section, "[SSL]") == 0
|
||||||
|
#endif
|
||||||
|
)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if( strcasecmp( section, "[SERVER]" ) == 0 ) {
|
if( strcasecmp( section, "[SERVER]" ) == 0 ) {
|
||||||
@@ -887,12 +964,30 @@ Read_Config( bool ngircd_starting )
|
|||||||
else New_Server_Idx = i;
|
else New_Server_Idx = i;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcasecmp(section, "[CHANNEL]") == 0) {
|
if (strcasecmp(section, "[CHANNEL]") == 0) {
|
||||||
Conf_Channel_Count++;
|
count = array_length(&Conf_Channels,
|
||||||
|
sizeof(struct Conf_Channel));
|
||||||
|
if (!array_alloc(&Conf_Channels,
|
||||||
|
sizeof(struct Conf_Channel),
|
||||||
|
count)) {
|
||||||
|
Config_Error(LOG_ERR,
|
||||||
|
"Could not allocate memory for new operator (line %d)",
|
||||||
|
line);
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strcasecmp(section, "[OPERATOR]") == 0) {
|
if (strcasecmp(section, "[OPERATOR]") == 0) {
|
||||||
Conf_Oper_Count++;
|
count = array_length(&Conf_Opers,
|
||||||
|
sizeof(struct Conf_Oper));
|
||||||
|
if (!array_alloc(&Conf_Opers,
|
||||||
|
sizeof(struct Conf_Oper),
|
||||||
|
count)) {
|
||||||
|
Config_Error(LOG_ERR,
|
||||||
|
"Could not allocate memory for new channel (line &d)",
|
||||||
|
line);
|
||||||
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -978,17 +1073,21 @@ Read_Config( bool ngircd_starting )
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check whether an string argument is true or false.
|
* Check whether a string argument is "true" or "false".
|
||||||
*
|
*
|
||||||
* @param Arg Input string.
|
* @param Arg Input string.
|
||||||
* @returns true if string has been parsed as "yes"/"true"/"on".
|
* @returns true if the input string has been parsed as "yes", "true"
|
||||||
|
* (case insensitive) or a non-zero integer value.
|
||||||
*/
|
*/
|
||||||
static bool
|
static bool
|
||||||
Check_ArgIsTrue( const char *Arg )
|
Check_ArgIsTrue(const char *Arg)
|
||||||
{
|
{
|
||||||
if( strcasecmp( Arg, "yes" ) == 0 ) return true;
|
if (strcasecmp(Arg, "yes") == 0)
|
||||||
if( strcasecmp( Arg, "true" ) == 0 ) return true;
|
return true;
|
||||||
if( atoi( Arg ) != 0 ) return true;
|
if (strcasecmp(Arg, "true") == 0)
|
||||||
|
return true;
|
||||||
|
if (atoi(Arg) != 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -998,7 +1097,7 @@ Check_ArgIsTrue( const char *Arg )
|
|||||||
*
|
*
|
||||||
* @param Line Line number in configuration file.
|
* @param Line Line number in configuration file.
|
||||||
* @raram Arg Input string.
|
* @raram Arg Input string.
|
||||||
* @returns New configured maximum nick name length.
|
* @returns New configured maximum nickname length.
|
||||||
*/
|
*/
|
||||||
static unsigned int
|
static unsigned int
|
||||||
Handle_MaxNickLength(int Line, const char *Arg)
|
Handle_MaxNickLength(int Line, const char *Arg)
|
||||||
@@ -1115,6 +1214,7 @@ CheckLegacyGlobalOption(int Line, char *Var, char *Arg)
|
|||||||
|| strcasecmp(Var, "ConnectIPv4") == 0
|
|| strcasecmp(Var, "ConnectIPv4") == 0
|
||||||
|| strcasecmp(Var, "ConnectIPv6") == 0
|
|| strcasecmp(Var, "ConnectIPv6") == 0
|
||||||
|| strcasecmp(Var, "OperCanUseMode") == 0
|
|| strcasecmp(Var, "OperCanUseMode") == 0
|
||||||
|
|| strcasecmp(Var, "OperChanPAutoOp") == 0
|
||||||
|| strcasecmp(Var, "OperServerMode") == 0
|
|| strcasecmp(Var, "OperServerMode") == 0
|
||||||
|| strcasecmp(Var, "PredefChannelsOnly") == 0
|
|| strcasecmp(Var, "PredefChannelsOnly") == 0
|
||||||
|| strcasecmp(Var, "SyslogFacility") == 0
|
|| strcasecmp(Var, "SyslogFacility") == 0
|
||||||
@@ -1289,7 +1389,9 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
|
|||||||
else {
|
else {
|
||||||
Conf_GID = (unsigned int)atoi(Arg);
|
Conf_GID = (unsigned int)atoi(Arg);
|
||||||
if (!Conf_GID && strcmp(Arg, "0"))
|
if (!Conf_GID && strcmp(Arg, "0"))
|
||||||
Config_Error_NaN(Line, Var);
|
Config_Error(LOG_WARNING,
|
||||||
|
"%s, line %d: Value of \"%s\" is not a valid group name or ID!",
|
||||||
|
NGIRCd_ConfFile, Line, Var);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1300,7 +1402,9 @@ Handle_GLOBAL( int Line, char *Var, char *Arg )
|
|||||||
else {
|
else {
|
||||||
Conf_UID = (unsigned int)atoi(Arg);
|
Conf_UID = (unsigned int)atoi(Arg);
|
||||||
if (!Conf_UID && strcmp(Arg, "0"))
|
if (!Conf_UID && strcmp(Arg, "0"))
|
||||||
Config_Error_NaN(Line, Var);
|
Config_Error(LOG_WARNING,
|
||||||
|
"%s, line %d: Value of \"%s\" is not a valid user name or ID!",
|
||||||
|
NGIRCd_ConfFile, Line, Var);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1363,7 +1467,7 @@ Handle_LIMITS(int Line, char *Var, char *Arg)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (strcasecmp(Var, "MaxConnections") == 0) {
|
if (strcasecmp(Var, "MaxConnections") == 0) {
|
||||||
Conf_MaxConnections = atol(Arg);
|
Conf_MaxConnections = atoi(Arg);
|
||||||
if (!Conf_MaxConnections && strcmp(Arg, "0"))
|
if (!Conf_MaxConnections && strcmp(Arg, "0"))
|
||||||
Config_Error_NaN(Line, Var);
|
Config_Error_NaN(Line, Var);
|
||||||
return;
|
return;
|
||||||
@@ -1384,6 +1488,12 @@ Handle_LIMITS(int Line, char *Var, char *Arg)
|
|||||||
Conf_MaxNickLength = Handle_MaxNickLength(Line, Arg);
|
Conf_MaxNickLength = Handle_MaxNickLength(Line, Arg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (strcasecmp(Var, "MaxListSize") == 0) {
|
||||||
|
Conf_MaxListSize = atoi(Arg);
|
||||||
|
if (!Conf_MaxListSize && strcmp(Arg, "0"))
|
||||||
|
Config_Error_NaN(Line, Var);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (strcasecmp(Var, "PingTimeout") == 0) {
|
if (strcasecmp(Var, "PingTimeout") == 0) {
|
||||||
Conf_PingTimeout = atoi(Arg);
|
Conf_PingTimeout = atoi(Arg);
|
||||||
if (Conf_PingTimeout < 5) {
|
if (Conf_PingTimeout < 5) {
|
||||||
@@ -1440,6 +1550,18 @@ Handle_OPTIONS(int Line, char *Var, char *Arg)
|
|||||||
Config_Error_TooLong(Line, Var);
|
Config_Error_TooLong(Line, Var);
|
||||||
return;
|
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, "CloakHostSalt") == 0) {
|
||||||
|
len = strlcpy(Conf_CloakHostSalt, Arg, sizeof(Conf_CloakHostSalt));
|
||||||
|
if (len >= sizeof(Conf_CloakHostSalt))
|
||||||
|
Config_Error_TooLong(Line, Var);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (strcasecmp(Var, "CloakUserToNick") == 0) {
|
if (strcasecmp(Var, "CloakUserToNick") == 0) {
|
||||||
Conf_CloakUserToNick = Check_ArgIsTrue(Arg);
|
Conf_CloakUserToNick = Check_ArgIsTrue(Arg);
|
||||||
return;
|
return;
|
||||||
@@ -1474,6 +1596,10 @@ Handle_OPTIONS(int Line, char *Var, char *Arg)
|
|||||||
Conf_OperCanMode = Check_ArgIsTrue(Arg);
|
Conf_OperCanMode = Check_ArgIsTrue(Arg);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (strcasecmp(Var, "OperChanPAutoOp") == 0) {
|
||||||
|
Conf_OperChanPAutoOp = Check_ArgIsTrue(Arg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (strcasecmp(Var, "OperServerMode") == 0) {
|
if (strcasecmp(Var, "OperServerMode") == 0) {
|
||||||
Conf_OperServerMode = Check_ArgIsTrue(Arg);
|
Conf_OperServerMode = Check_ArgIsTrue(Arg);
|
||||||
return;
|
return;
|
||||||
@@ -1483,6 +1609,10 @@ Handle_OPTIONS(int Line, char *Var, char *Arg)
|
|||||||
WarnPAM(Line);
|
WarnPAM(Line);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
if (strcasecmp(Var, "PAMIsOptional") == 0 ) {
|
||||||
|
Conf_PAMIsOptional = Check_ArgIsTrue(Arg);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (strcasecmp(Var, "PredefChannelsOnly") == 0) {
|
if (strcasecmp(Var, "PredefChannelsOnly") == 0) {
|
||||||
Conf_PredefChannelsOnly = Check_ArgIsTrue(Arg);
|
Conf_PredefChannelsOnly = Check_ArgIsTrue(Arg);
|
||||||
return;
|
return;
|
||||||
@@ -1580,13 +1710,11 @@ Handle_OPERATOR( int Line, char *Var, char *Arg )
|
|||||||
assert( Line > 0 );
|
assert( Line > 0 );
|
||||||
assert( Var != NULL );
|
assert( Var != NULL );
|
||||||
assert( Arg != NULL );
|
assert( Arg != NULL );
|
||||||
assert( Conf_Oper_Count > 0 );
|
|
||||||
|
|
||||||
op = array_alloc(&Conf_Opers, sizeof(*op), Conf_Oper_Count - 1);
|
op = array_get(&Conf_Opers, sizeof(*op),
|
||||||
if (!op) {
|
array_length(&Conf_Opers, sizeof(*op)) - 1);
|
||||||
Config_Error(LOG_ERR, "Could not allocate memory for operator (%d:%s = %s)", Line, Var, Arg);
|
if (!op)
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
|
|
||||||
if (strcasecmp(Var, "Name") == 0) {
|
if (strcasecmp(Var, "Name") == 0) {
|
||||||
/* Name of IRC operator */
|
/* Name of IRC operator */
|
||||||
@@ -1752,21 +1880,17 @@ static void
|
|||||||
Handle_CHANNEL(int Line, char *Var, char *Arg)
|
Handle_CHANNEL(int Line, char *Var, char *Arg)
|
||||||
{
|
{
|
||||||
size_t len;
|
size_t len;
|
||||||
size_t chancount;
|
|
||||||
struct Conf_Channel *chan;
|
struct Conf_Channel *chan;
|
||||||
|
|
||||||
assert( Line > 0 );
|
assert( Line > 0 );
|
||||||
assert( Var != NULL );
|
assert( Var != NULL );
|
||||||
assert( Arg != NULL );
|
assert( Arg != NULL );
|
||||||
assert(Conf_Channel_Count > 0);
|
|
||||||
|
|
||||||
chancount = Conf_Channel_Count - 1;
|
chan = array_get(&Conf_Channels, sizeof(*chan),
|
||||||
|
array_length(&Conf_Channels, sizeof(*chan)) - 1);
|
||||||
chan = array_alloc(&Conf_Channels, sizeof(*chan), chancount);
|
if (!chan)
|
||||||
if (!chan) {
|
|
||||||
Config_Error(LOG_ERR, "Could not allocate memory for predefined channel (%d:%s = %s)", Line, Var, Arg);
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
if (strcasecmp(Var, "Name") == 0) {
|
if (strcasecmp(Var, "Name") == 0) {
|
||||||
if (!Handle_Channelname(chan, Arg))
|
if (!Handle_Channelname(chan, Arg))
|
||||||
Config_Error_TooLong(Line, Var);
|
Config_Error_TooLong(Line, Var);
|
||||||
@@ -1832,6 +1956,13 @@ Validate_Config(bool Configtest, bool Rehash)
|
|||||||
bool config_valid = true;
|
bool config_valid = true;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
|
|
||||||
|
/* Emit a warning when the config file is not a full path name */
|
||||||
|
if (NGIRCd_ConfFile[0] && NGIRCd_ConfFile[0] != '/') {
|
||||||
|
Config_Error(LOG_WARNING,
|
||||||
|
"Not specifying a full path name to \"%s\" can cause problems when rehashing the server!",
|
||||||
|
NGIRCd_ConfFile);
|
||||||
|
}
|
||||||
|
|
||||||
/* Validate configured server name, see RFC 2812 section 2.3.1 */
|
/* Validate configured server name, see RFC 2812 section 2.3.1 */
|
||||||
ptr = Conf_ServerName;
|
ptr = Conf_ServerName;
|
||||||
do {
|
do {
|
||||||
@@ -1913,8 +2044,10 @@ Validate_Config(bool Configtest, bool Rehash)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
Log(LOG_DEBUG,
|
Log(LOG_DEBUG,
|
||||||
"Configuration: Operators=%d, Servers=%d[%d], Channels=%d",
|
"Configuration: Operators=%ld, Servers=%d[%d], Channels=%ld",
|
||||||
Conf_Oper_Count, servers, servers_once, Conf_Channel_Count);
|
array_length(&Conf_Opers, sizeof(struct Conf_Oper)),
|
||||||
|
servers, servers_once,
|
||||||
|
array_length(&Conf_Channels, sizeof(struct Conf_Channel)));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return config_valid;
|
return config_valid;
|
||||||
@@ -2044,7 +2177,7 @@ Init_Server_Struct( CONF_SERVER *Server )
|
|||||||
|
|
||||||
Proc_InitStruct(&Server->res_stat);
|
Proc_InitStruct(&Server->res_stat);
|
||||||
Server->conn_id = NONE;
|
Server->conn_id = NONE;
|
||||||
memset(&Server->bind_addr, 0, sizeof(&Server->bind_addr));
|
memset(&Server->bind_addr, 0, sizeof(Server->bind_addr));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -eof- */
|
/* -eof- */
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* 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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -62,7 +62,7 @@ typedef struct _Conf_Server
|
|||||||
#ifdef SSL_SUPPORT
|
#ifdef SSL_SUPPORT
|
||||||
bool SSLConnect; /**< Establish connection using SSL? */
|
bool SSLConnect; /**< Establish connection using SSL? */
|
||||||
#endif
|
#endif
|
||||||
char svs_mask[CLIENT_ID_LEN]; /**< Mask of nick names that should be
|
char svs_mask[CLIENT_ID_LEN]; /**< Mask of nicknames that should be
|
||||||
treated and counted as services */
|
treated and counted as services */
|
||||||
} CONF_SERVER;
|
} CONF_SERVER;
|
||||||
|
|
||||||
@@ -151,10 +151,13 @@ GLOBAL bool Conf_PredefChannelsOnly;
|
|||||||
/** Flag indicating if IRC operators are allowed to always use MODE (true) */
|
/** Flag indicating if IRC operators are allowed to always use MODE (true) */
|
||||||
GLOBAL bool Conf_OperCanMode;
|
GLOBAL bool Conf_OperCanMode;
|
||||||
|
|
||||||
|
/** Flag indicating if IRC operators get AutoOp in persistent (+P) channels */
|
||||||
|
GLOBAL bool Conf_OperChanPAutoOp;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If true, mask channel MODE commands of IRC operators to the server.
|
* If true, mask channel MODE commands of IRC operators to the server.
|
||||||
* Background: ircd2 will ignore channel MODE commands if an IRC operator
|
* Background: ircd2 will ignore channel MODE commands if an IRC operator
|
||||||
* gives chanel operator privileges to someone without being a channel operator
|
* gives channel operator privileges to someone without being a channel operator
|
||||||
* himself. This enables a workaround: it masks the MODE command as coming
|
* himself. This enables a workaround: it masks the MODE command as coming
|
||||||
* from the IRC server and not the IRC operator.
|
* from the IRC server and not the IRC operator.
|
||||||
*/
|
*/
|
||||||
@@ -166,7 +169,13 @@ GLOBAL bool Conf_AllowRemoteOper;
|
|||||||
/** Cloaked hostname of the clients */
|
/** Cloaked hostname of the clients */
|
||||||
GLOBAL char Conf_CloakHost[CLIENT_ID_LEN];
|
GLOBAL char Conf_CloakHost[CLIENT_ID_LEN];
|
||||||
|
|
||||||
/** Use nick name as user name? */
|
/** Cloaked hostname for clients that did +x */
|
||||||
|
GLOBAL char Conf_CloakHostModeX[CLIENT_ID_LEN];
|
||||||
|
|
||||||
|
/** Salt for hostname hash for cloaked hostnames */
|
||||||
|
GLOBAL char Conf_CloakHostSalt[CLIENT_ID_LEN];
|
||||||
|
|
||||||
|
/** Use nickname as user name? */
|
||||||
GLOBAL bool Conf_CloakUserToNick;
|
GLOBAL bool Conf_CloakUserToNick;
|
||||||
|
|
||||||
/** Enable all DNS functions? */
|
/** Enable all DNS functions? */
|
||||||
@@ -184,6 +193,9 @@ GLOBAL bool Conf_NoticeAuth;
|
|||||||
/** Enable all usage of PAM, even when compiled with support for it */
|
/** Enable all usage of PAM, even when compiled with support for it */
|
||||||
GLOBAL bool Conf_PAM;
|
GLOBAL bool Conf_PAM;
|
||||||
|
|
||||||
|
/** Don't require all clients to send a password an to be PAM authenticated */
|
||||||
|
GLOBAL bool Conf_PAMIsOptional;
|
||||||
|
|
||||||
/** Disable all CTCP commands except for /me ? */
|
/** Disable all CTCP commands except for /me ? */
|
||||||
GLOBAL bool Conf_ScrubCTCP;
|
GLOBAL bool Conf_ScrubCTCP;
|
||||||
|
|
||||||
@@ -197,7 +209,7 @@ GLOBAL bool Conf_ConnectIPv6;
|
|||||||
GLOBAL bool Conf_ConnectIPv4;
|
GLOBAL bool Conf_ConnectIPv4;
|
||||||
|
|
||||||
/** Maximum number of simultaneous connections to this server */
|
/** Maximum number of simultaneous connections to this server */
|
||||||
GLOBAL long Conf_MaxConnections;
|
GLOBAL int Conf_MaxConnections;
|
||||||
|
|
||||||
/** Maximum number of channels a user can join */
|
/** Maximum number of channels a user can join */
|
||||||
GLOBAL int Conf_MaxJoins;
|
GLOBAL int Conf_MaxJoins;
|
||||||
@@ -205,9 +217,12 @@ GLOBAL int Conf_MaxJoins;
|
|||||||
/** Maximum number of connections per IP address */
|
/** Maximum number of connections per IP address */
|
||||||
GLOBAL int Conf_MaxConnectionsIP;
|
GLOBAL int Conf_MaxConnectionsIP;
|
||||||
|
|
||||||
/** Maximum length of a nick name */
|
/** Maximum length of a nickname */
|
||||||
GLOBAL unsigned int Conf_MaxNickLength;
|
GLOBAL unsigned int Conf_MaxNickLength;
|
||||||
|
|
||||||
|
/** Maximum number of channels returned to /list */
|
||||||
|
GLOBAL int Conf_MaxListSize;
|
||||||
|
|
||||||
#ifndef STRICT_RFC
|
#ifndef STRICT_RFC
|
||||||
|
|
||||||
/** Require "AUTH PING-PONG" on login */
|
/** Require "AUTH PING-PONG" on login */
|
||||||
@@ -227,7 +242,7 @@ GLOBAL bool Conf_Rehash PARAMS((void));
|
|||||||
GLOBAL int Conf_Test PARAMS((void));
|
GLOBAL int Conf_Test PARAMS((void));
|
||||||
|
|
||||||
GLOBAL void Conf_UnsetServer PARAMS(( CONN_ID Idx ));
|
GLOBAL void Conf_UnsetServer PARAMS(( CONN_ID Idx ));
|
||||||
GLOBAL void Conf_SetServer PARAMS(( int ConfServer, CONN_ID Idx ));
|
GLOBAL bool Conf_SetServer PARAMS(( int ConfServer, CONN_ID Idx ));
|
||||||
GLOBAL int Conf_GetServer PARAMS(( CONN_ID Idx ));
|
GLOBAL int Conf_GetServer PARAMS(( CONN_ID Idx ));
|
||||||
|
|
||||||
GLOBAL bool Conf_EnableServer PARAMS(( const char *Name, UINT16 Port ));
|
GLOBAL bool Conf_EnableServer PARAMS(( const char *Name, UINT16 Port ));
|
||||||
@@ -235,7 +250,12 @@ GLOBAL bool Conf_EnablePassiveServer PARAMS((const char *Name));
|
|||||||
GLOBAL bool Conf_DisableServer PARAMS(( const char *Name ));
|
GLOBAL bool Conf_DisableServer PARAMS(( const char *Name ));
|
||||||
GLOBAL bool Conf_AddServer PARAMS(( const char *Name, UINT16 Port, const char *Host, const char *MyPwd, const char *PeerPwd ));
|
GLOBAL bool Conf_AddServer PARAMS(( const char *Name, UINT16 Port, const char *Host, const char *MyPwd, const char *PeerPwd ));
|
||||||
|
|
||||||
GLOBAL bool Conf_IsService PARAMS((int ConfServer, const char *Nick));
|
GLOBAL bool Conf_NickIsService PARAMS((int ConfServer, const char *Nick));
|
||||||
|
GLOBAL bool Conf_NickIsBlocked PARAMS((const char *Nick));
|
||||||
|
|
||||||
|
#ifdef SSL_SUPPORT
|
||||||
|
GLOBAL bool Conf_SSLInUse PARAMS((void));
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Password required by WEBIRC command */
|
/* Password required by WEBIRC command */
|
||||||
GLOBAL char Conf_WebircPwd[CLIENT_PASS_LEN];
|
GLOBAL char Conf_WebircPwd[CLIENT_PASS_LEN];
|
||||||
|
|||||||
192
src/ngircd/conn-encoding.c
Normal file
192
src/ngircd/conn-encoding.c
Normal file
@@ -0,0 +1,192 @@
|
|||||||
|
/*
|
||||||
|
* 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 __conn_encoding_c__
|
||||||
|
|
||||||
|
#define CONN_MODULE
|
||||||
|
|
||||||
|
#include "portab.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Functions to deal with character encodings and conversions
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "imp.h"
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "defines.h"
|
||||||
|
#include "conn.h"
|
||||||
|
#include "log.h"
|
||||||
|
|
||||||
|
#include "exp.h"
|
||||||
|
#include "conn-encoding.h"
|
||||||
|
|
||||||
|
#ifdef ICONV
|
||||||
|
|
||||||
|
char Encoding_Buffer[COMMAND_LEN];
|
||||||
|
|
||||||
|
char *Convert_Message PARAMS((iconv_t Handle, char *Message));
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set client character encoding on a connection.
|
||||||
|
*
|
||||||
|
* @param Conn Connection identifier.
|
||||||
|
* @param ClientEnc Client encoding (for example "ASCII", "MacRoman", ...).
|
||||||
|
* @return true on success, false otherwise.
|
||||||
|
*/
|
||||||
|
GLOBAL bool
|
||||||
|
Conn_SetEncoding(CONN_ID Conn, const char *ClientEnc)
|
||||||
|
{
|
||||||
|
char client_enc[25], server_enc[25];
|
||||||
|
|
||||||
|
assert(Conn > NONE);
|
||||||
|
assert(ClientEnc != NULL);
|
||||||
|
|
||||||
|
Conn_UnsetEncoding(Conn);
|
||||||
|
|
||||||
|
/* Is the client character set identical to server character set? */
|
||||||
|
if (strcasecmp(ClientEnc, "UTF-8") == 0)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
snprintf(client_enc, sizeof(client_enc), "%s//TRANSLIT", ClientEnc);
|
||||||
|
snprintf(server_enc, sizeof(server_enc), "%s//TRANSLIT", "UTF-8");
|
||||||
|
|
||||||
|
My_Connections[Conn].iconv_from = iconv_open(server_enc, client_enc);
|
||||||
|
if (My_Connections[Conn].iconv_from == (iconv_t)(-1)) {
|
||||||
|
Conn_UnsetEncoding(Conn);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
My_Connections[Conn].iconv_to = iconv_open(client_enc, server_enc);
|
||||||
|
if (My_Connections[Conn].iconv_to == (iconv_t)(-1)) {
|
||||||
|
Conn_UnsetEncoding(Conn);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
LogDebug("Set client character set of connection \"%d\" to \"%s\".",
|
||||||
|
Conn, client_enc);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Remove client character encoding conversion on a connection.
|
||||||
|
*
|
||||||
|
* @param Conn Connection identifier.
|
||||||
|
*/
|
||||||
|
GLOBAL void
|
||||||
|
Conn_UnsetEncoding(CONN_ID Conn)
|
||||||
|
{
|
||||||
|
assert(Conn > NONE);
|
||||||
|
|
||||||
|
if (My_Connections[Conn].iconv_from != (iconv_t)(-1))
|
||||||
|
iconv_close(My_Connections[Conn].iconv_from);
|
||||||
|
if (My_Connections[Conn].iconv_to != (iconv_t)(-1))
|
||||||
|
iconv_close(My_Connections[Conn].iconv_to);
|
||||||
|
|
||||||
|
My_Connections[Conn].iconv_from = (iconv_t)(-1);
|
||||||
|
My_Connections[Conn].iconv_to = (iconv_t)(-1);
|
||||||
|
|
||||||
|
LogDebug("Unset character conversion of connection %d.", Conn);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert the encoding of a given message.
|
||||||
|
*
|
||||||
|
* This function uses a static buffer for the result of the encoding
|
||||||
|
* conversion which is overwritten by subsequent calls to this function!
|
||||||
|
*
|
||||||
|
* @param Handle libiconv handle.
|
||||||
|
* @param Message The message to convert.
|
||||||
|
* @return Pointer to the result.
|
||||||
|
*/
|
||||||
|
char *
|
||||||
|
Convert_Message(iconv_t Handle, char *Message)
|
||||||
|
{
|
||||||
|
size_t in_left, out_left;
|
||||||
|
char *out = Encoding_Buffer;
|
||||||
|
|
||||||
|
assert (Handle != (iconv_t)(-1));
|
||||||
|
assert (Message != NULL);
|
||||||
|
|
||||||
|
in_left = strlen(Message);
|
||||||
|
out_left = sizeof(Encoding_Buffer) - 1;
|
||||||
|
|
||||||
|
if (iconv(Handle, &Message, &in_left, &out, &out_left) == (size_t)(-1)) {
|
||||||
|
/* An error occured! */
|
||||||
|
LogDebug("Error converting message encoding!");
|
||||||
|
strlcpy(Encoding_Buffer, Message, sizeof(Encoding_Buffer));
|
||||||
|
iconv(Handle, NULL, NULL, NULL, NULL);
|
||||||
|
} else
|
||||||
|
*out = '\0';
|
||||||
|
|
||||||
|
return Encoding_Buffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert encoding of a message received from a connection.
|
||||||
|
*
|
||||||
|
* Note 1: If no conversion is required, this function returns the original
|
||||||
|
* pointer to the message.
|
||||||
|
*
|
||||||
|
* Note 2: This function uses Convert_Message(), so subsequent calls to this
|
||||||
|
* function will overwrite the earlier results.
|
||||||
|
*
|
||||||
|
* @param Conn Connection identifier.
|
||||||
|
* @param Message The message to convert.
|
||||||
|
* @return Pointer to the result.
|
||||||
|
* @see Convert_Message
|
||||||
|
*/
|
||||||
|
GLOBAL char *
|
||||||
|
Conn_EncodingFrom(UNUSED CONN_ID Conn, char *Message)
|
||||||
|
{
|
||||||
|
assert(Conn > NONE);
|
||||||
|
assert (Message != NULL);
|
||||||
|
|
||||||
|
#ifdef ICONV
|
||||||
|
if (My_Connections[Conn].iconv_from != (iconv_t)(-1))
|
||||||
|
return Convert_Message(My_Connections[Conn].iconv_from, Message);
|
||||||
|
#endif
|
||||||
|
return Message;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert encoding of a message for sending on a connection.
|
||||||
|
*
|
||||||
|
* Note 1: If no conversion is required, this function returns the original
|
||||||
|
* pointer to the message.
|
||||||
|
*
|
||||||
|
* Note 2: This function uses Convert_Message(), so subsequent calls to this
|
||||||
|
* function will overwrite the earlier results.
|
||||||
|
*
|
||||||
|
* @param Conn Connection identifier.
|
||||||
|
* @param Message The message to convert.
|
||||||
|
* @return Pointer to the result.
|
||||||
|
* @see Convert_Message
|
||||||
|
*/
|
||||||
|
GLOBAL char *
|
||||||
|
Conn_EncodingTo(UNUSED CONN_ID Conn, char *Message)
|
||||||
|
{
|
||||||
|
assert(Conn > NONE);
|
||||||
|
assert (Message != NULL);
|
||||||
|
|
||||||
|
#ifdef ICONV
|
||||||
|
if (My_Connections[Conn].iconv_to != (iconv_t)(-1))
|
||||||
|
return Convert_Message(My_Connections[Conn].iconv_to, Message);
|
||||||
|
#endif
|
||||||
|
return Message;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -eof- */
|
||||||
30
src/ngircd/conn-encoding.h
Normal file
30
src/ngircd/conn-encoding.h
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
* 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 __conn_encoding_h__
|
||||||
|
#define __conn_encoding_h__
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* Functions to deal with character encodings and conversions (header)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef ICONV
|
||||||
|
|
||||||
|
GLOBAL bool Conn_SetEncoding PARAMS((CONN_ID Idx, const char *ClientEnc));
|
||||||
|
GLOBAL void Conn_UnsetEncoding PARAMS((CONN_ID Idx));
|
||||||
|
|
||||||
|
#endif /* ICONV */
|
||||||
|
|
||||||
|
GLOBAL char* Conn_EncodingFrom PARAMS((CONN_ID Idx, char *Message));
|
||||||
|
GLOBAL char* Conn_EncodingTo PARAMS((CONN_ID Idx, char *Message));
|
||||||
|
|
||||||
|
#endif
|
||||||
@@ -30,13 +30,30 @@
|
|||||||
#include "conn-func.h"
|
#include "conn-func.h"
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update "idle timestamp", the time of the last visible user action
|
||||||
|
* (e. g. like sending messages, joining or leaving channels).
|
||||||
|
*
|
||||||
|
* @param Idx Connection index.
|
||||||
|
*/
|
||||||
GLOBAL void
|
GLOBAL void
|
||||||
Conn_UpdateIdle( CONN_ID Idx )
|
Conn_UpdateIdle(CONN_ID Idx)
|
||||||
{
|
{
|
||||||
assert( Idx > NONE );
|
assert(Idx > NONE);
|
||||||
My_Connections[Idx].lastprivmsg = time( NULL );
|
My_Connections[Idx].lastprivmsg = time(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update "ping timestamp", the time of the last outgoing PING request.
|
||||||
|
*
|
||||||
|
* @param Idx Connection index.
|
||||||
|
*/
|
||||||
|
GLOBAL void
|
||||||
|
Conn_UpdatePing(CONN_ID Idx)
|
||||||
|
{
|
||||||
|
assert(Idx > NONE);
|
||||||
|
My_Connections[Idx].lastping = time(NULL);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get signon time of a connection.
|
* Get signon time of a connection.
|
||||||
@@ -65,38 +82,41 @@ Conn_LastPing( CONN_ID Idx )
|
|||||||
} /* Conn_LastPing */
|
} /* Conn_LastPing */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add "penalty time" for a connection.
|
||||||
|
*
|
||||||
|
* During the "penalty time" the socket is ignored completely, no new data
|
||||||
|
* is read. This function only increases the penalty, it is not possible to
|
||||||
|
* decrease the penalty time.
|
||||||
|
*
|
||||||
|
* @param Idex Connection index.
|
||||||
|
* @param Seconds Seconds to add.
|
||||||
|
* @see Conn_ResetPenalty
|
||||||
|
*/
|
||||||
GLOBAL void
|
GLOBAL void
|
||||||
Conn_SetPenalty( CONN_ID Idx, time_t Seconds )
|
Conn_SetPenalty(CONN_ID Idx, time_t Seconds)
|
||||||
{
|
{
|
||||||
/* set Penalty-Delay for a socket.
|
|
||||||
* during the penalty, the socket is ignored completely, no new
|
|
||||||
* data is read. This function only increases the penalty, it is
|
|
||||||
* not possible to decrease the penalty time.
|
|
||||||
*/
|
|
||||||
time_t t;
|
time_t t;
|
||||||
|
|
||||||
assert( Idx > NONE );
|
|
||||||
assert( Seconds >= 0 );
|
|
||||||
|
|
||||||
t = time( NULL ) + Seconds;
|
assert(Idx > NONE);
|
||||||
if (t > My_Connections[Idx].delaytime)
|
assert(Seconds >= 0);
|
||||||
|
|
||||||
|
t = time(NULL);
|
||||||
|
if (My_Connections[Idx].delaytime < t)
|
||||||
My_Connections[Idx].delaytime = t;
|
My_Connections[Idx].delaytime = t;
|
||||||
|
|
||||||
|
My_Connections[Idx].delaytime += Seconds;
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Log(LOG_DEBUG, "Add penalty time on connection %d: %ld second(s).",
|
Log(LOG_DEBUG,
|
||||||
Idx, (long)Seconds);
|
"Add penalty time on connection %d: %ld second%s, total %ld second%s.",
|
||||||
|
Idx, (long)Seconds, Seconds != 1 ? "s" : "",
|
||||||
|
My_Connections[Idx].delaytime - t,
|
||||||
|
My_Connections[Idx].delaytime - t != 1 ? "s" : "");
|
||||||
#endif
|
#endif
|
||||||
} /* Conn_SetPenalty */
|
} /* Conn_SetPenalty */
|
||||||
|
|
||||||
|
|
||||||
GLOBAL void
|
|
||||||
Conn_ResetPenalty( CONN_ID Idx )
|
|
||||||
{
|
|
||||||
assert( Idx > NONE );
|
|
||||||
My_Connections[Idx].delaytime = 0;
|
|
||||||
} /* Conn_ResetPenalty */
|
|
||||||
|
|
||||||
|
|
||||||
GLOBAL void
|
GLOBAL void
|
||||||
Conn_ClearFlags( void )
|
Conn_ClearFlags( void )
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -29,7 +29,9 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
GLOBAL void Conn_UpdateIdle PARAMS(( CONN_ID Idx ));
|
GLOBAL void Conn_UpdateIdle PARAMS((CONN_ID Idx));
|
||||||
|
GLOBAL void Conn_UpdatePing PARAMS((CONN_ID Idx));
|
||||||
|
|
||||||
GLOBAL time_t Conn_GetSignon PARAMS((CONN_ID Idx));
|
GLOBAL time_t Conn_GetSignon PARAMS((CONN_ID Idx));
|
||||||
GLOBAL time_t Conn_GetIdle PARAMS(( CONN_ID Idx ));
|
GLOBAL time_t Conn_GetIdle PARAMS(( CONN_ID Idx ));
|
||||||
GLOBAL time_t Conn_LastPing PARAMS(( CONN_ID Idx ));
|
GLOBAL time_t Conn_LastPing PARAMS(( CONN_ID Idx ));
|
||||||
@@ -43,7 +45,6 @@ GLOBAL long Conn_RecvBytes PARAMS(( CONN_ID Idx ));
|
|||||||
GLOBAL const char *Conn_IPA PARAMS(( CONN_ID Idx ));
|
GLOBAL const char *Conn_IPA PARAMS(( CONN_ID Idx ));
|
||||||
|
|
||||||
GLOBAL void Conn_SetPenalty PARAMS(( CONN_ID Idx, time_t Seconds ));
|
GLOBAL void Conn_SetPenalty PARAMS(( CONN_ID Idx, time_t Seconds ));
|
||||||
GLOBAL void Conn_ResetPenalty PARAMS(( CONN_ID Idx ));
|
|
||||||
|
|
||||||
GLOBAL void Conn_ClearFlags PARAMS(( void ));
|
GLOBAL void Conn_ClearFlags PARAMS(( void ));
|
||||||
GLOBAL int Conn_Flag PARAMS(( CONN_ID Idx ));
|
GLOBAL int Conn_Flag PARAMS(( CONN_ID Idx ));
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ Load_DH_params(void)
|
|||||||
bool ret = true;
|
bool ret = true;
|
||||||
|
|
||||||
if (!Conf_SSLOptions.DHFile) {
|
if (!Conf_SSLOptions.DHFile) {
|
||||||
Log(LOG_NOTICE, "Configuration option \"SSLDHFile\" not set!");
|
Log(LOG_NOTICE, "Configuration option \"DHFile\" not set!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
fp = fopen(Conf_SSLOptions.DHFile, "r");
|
fp = fopen(Conf_SSLOptions.DHFile, "r");
|
||||||
@@ -201,7 +201,7 @@ Load_DH_params(void)
|
|||||||
}
|
}
|
||||||
if (need_dhgenerate) {
|
if (need_dhgenerate) {
|
||||||
Log(LOG_WARNING,
|
Log(LOG_WARNING,
|
||||||
"SSLDHFile not set, generating %u bit DH parameters. This may take a while ...",
|
"DHFile not set, generating %u bit DH parameters. This may take a while ...",
|
||||||
DH_BITS);
|
DH_BITS);
|
||||||
err = gnutls_dh_params_generate2(tmp_dh_params, DH_BITS);
|
err = gnutls_dh_params_generate2(tmp_dh_params, DH_BITS);
|
||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
@@ -241,6 +241,11 @@ void ConnSSL_Free(CONNECTION *c)
|
|||||||
bool
|
bool
|
||||||
ConnSSL_InitLibrary( void )
|
ConnSSL_InitLibrary( void )
|
||||||
{
|
{
|
||||||
|
if (!Conf_SSLInUse()) {
|
||||||
|
LogDebug("SSL not in use, skipping initialization.");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef HAVE_LIBSSL
|
#ifdef HAVE_LIBSSL
|
||||||
SSL_CTX *newctx;
|
SSL_CTX *newctx;
|
||||||
|
|
||||||
@@ -256,12 +261,14 @@ ConnSSL_InitLibrary( void )
|
|||||||
* According to OpenSSL RAND_egd(3): "The automatic query of /var/run/egd-pool et al was added in OpenSSL 0.9.7";
|
* According to OpenSSL RAND_egd(3): "The automatic query of /var/run/egd-pool et al was added in OpenSSL 0.9.7";
|
||||||
* so it makes little sense to deal with PRNGD seeding ourselves.
|
* so it makes little sense to deal with PRNGD seeding ourselves.
|
||||||
*/
|
*/
|
||||||
|
array_free(&Conf_SSLOptions.ListenPorts);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
newctx = SSL_CTX_new(SSLv23_method());
|
newctx = SSL_CTX_new(SSLv23_method());
|
||||||
if (!newctx) {
|
if (!newctx) {
|
||||||
LogOpenSSLError("SSL_CTX_new()", NULL);
|
LogOpenSSLError("SSL_CTX_new()", NULL);
|
||||||
|
array_free(&Conf_SSLOptions.ListenPorts);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -276,6 +283,7 @@ ConnSSL_InitLibrary( void )
|
|||||||
return true;
|
return true;
|
||||||
out:
|
out:
|
||||||
SSL_CTX_free(newctx);
|
SSL_CTX_free(newctx);
|
||||||
|
array_free(&Conf_SSLOptions.ListenPorts);
|
||||||
return false;
|
return false;
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_LIBGNUTLS
|
#ifdef HAVE_LIBGNUTLS
|
||||||
@@ -287,10 +295,13 @@ out:
|
|||||||
err = gnutls_global_init();
|
err = gnutls_global_init();
|
||||||
if (err) {
|
if (err) {
|
||||||
Log(LOG_ERR, "gnutls_global_init(): %s", gnutls_strerror(err));
|
Log(LOG_ERR, "gnutls_global_init(): %s", gnutls_strerror(err));
|
||||||
|
array_free(&Conf_SSLOptions.ListenPorts);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!ConnSSL_LoadServerKey_gnutls())
|
if (!ConnSSL_LoadServerKey_gnutls()) {
|
||||||
|
array_free(&Conf_SSLOptions.ListenPorts);
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
Log(LOG_INFO, "gnutls %s initialized.", gnutls_check_version(NULL));
|
Log(LOG_INFO, "gnutls %s initialized.", gnutls_check_version(NULL));
|
||||||
initialized = true;
|
initialized = true;
|
||||||
return true;
|
return true;
|
||||||
@@ -313,7 +324,7 @@ ConnSSL_LoadServerKey_gnutls(void)
|
|||||||
|
|
||||||
cert_file = Conf_SSLOptions.CertFile ? Conf_SSLOptions.CertFile:Conf_SSLOptions.KeyFile;
|
cert_file = Conf_SSLOptions.CertFile ? Conf_SSLOptions.CertFile:Conf_SSLOptions.KeyFile;
|
||||||
if (!cert_file) {
|
if (!cert_file) {
|
||||||
Log(LOG_NOTICE, "No SSL server key configured, SSL disabled.");
|
Log(LOG_ERR, "No SSL server key configured!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -344,7 +355,7 @@ ConnSSL_LoadServerKey_openssl(SSL_CTX *ctx)
|
|||||||
|
|
||||||
assert(ctx);
|
assert(ctx);
|
||||||
if (!Conf_SSLOptions.KeyFile) {
|
if (!Conf_SSLOptions.KeyFile) {
|
||||||
Log(LOG_NOTICE, "No SSL server key configured, SSL disabled.");
|
Log(LOG_ERR, "No SSL server key configured!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -549,17 +560,18 @@ ConnSSL_LogCertInfo( CONNECTION *c )
|
|||||||
|
|
||||||
assert(ssl);
|
assert(ssl);
|
||||||
|
|
||||||
Log(LOG_INFO, "New %s connection using cipher %s on socket %d.",
|
Log(LOG_INFO, "Connection %d: initialized %s using cipher %s.",
|
||||||
SSL_get_version(ssl), SSL_get_cipher(ssl), c->sock);
|
c->sock, SSL_get_version(ssl), SSL_get_cipher(ssl));
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_LIBGNUTLS
|
#ifdef HAVE_LIBGNUTLS
|
||||||
gnutls_session_t sess = c->ssl_state.gnutls_session;
|
gnutls_session_t sess = c->ssl_state.gnutls_session;
|
||||||
gnutls_cipher_algorithm_t cipher = gnutls_cipher_get(sess);
|
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_protocol_get_name(gnutls_protocol_get_version(sess)),
|
||||||
gnutls_cipher_get_name(cipher),
|
gnutls_cipher_get_name(cipher),
|
||||||
gnutls_mac_get_name(gnutls_mac_get(sess)), c->sock);
|
gnutls_mac_get_name(gnutls_mac_get(sess)));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -624,6 +636,8 @@ ConnectAccept( CONNECTION *c, bool connect)
|
|||||||
#endif /* _GNUTLS */
|
#endif /* _GNUTLS */
|
||||||
Conn_OPTION_DEL(c, (CONN_SSL_WANT_WRITE|CONN_SSL_WANT_READ|CONN_SSL_CONNECT));
|
Conn_OPTION_DEL(c, (CONN_SSL_WANT_WRITE|CONN_SSL_WANT_READ|CONN_SSL_CONNECT));
|
||||||
ConnSSL_LogCertInfo(c);
|
ConnSSL_LogCertInfo(c);
|
||||||
|
|
||||||
|
Conn_StartLogin(CONNECTION2ID(c));
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -711,6 +725,13 @@ ConnSSL_GetCipherInfo(CONNECTION *c, char *buf, size_t len)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
bool
|
||||||
|
ConnSSL_InitLibrary(void)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* SSL_SUPPORT */
|
#endif /* SSL_SUPPORT */
|
||||||
/* -eof- */
|
/* -eof- */
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2010 Alexander Barton <alex@barton.de>
|
* Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -9,6 +9,8 @@
|
|||||||
* Please read the file COPYING, README and AUTHORS for more information.
|
* Please read the file COPYING, README and AUTHORS for more information.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#undef DEBUG_BUFFER
|
||||||
|
|
||||||
#define CONN_MODULE
|
#define CONN_MODULE
|
||||||
|
|
||||||
#include "portab.h"
|
#include "portab.h"
|
||||||
@@ -45,10 +47,6 @@
|
|||||||
# include <netinet/ip.h>
|
# include <netinet/ip.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_STDINT_H
|
|
||||||
# include <stdint.h> /* e.g. for Mac OS X */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef TCPWRAP
|
#ifdef TCPWRAP
|
||||||
# include <tcpd.h> /* for TCP Wrappers */
|
# include <tcpd.h> /* for TCP Wrappers */
|
||||||
#endif
|
#endif
|
||||||
@@ -63,7 +61,9 @@
|
|||||||
#include "ngircd.h"
|
#include "ngircd.h"
|
||||||
#include "array.h"
|
#include "array.h"
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
|
#include "class.h"
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
|
#include "conn-encoding.h"
|
||||||
#include "conn-ssl.h"
|
#include "conn-ssl.h"
|
||||||
#include "conn-zip.h"
|
#include "conn-zip.h"
|
||||||
#include "conn-func.h"
|
#include "conn-func.h"
|
||||||
@@ -79,13 +79,13 @@
|
|||||||
#define SERVER_WAIT (NONE - 1)
|
#define SERVER_WAIT (NONE - 1)
|
||||||
|
|
||||||
#define MAX_COMMANDS 3
|
#define MAX_COMMANDS 3
|
||||||
#define MAX_COMMANDS_SERVER 10
|
#define MAX_COMMANDS_SERVER_MIN 10
|
||||||
#define MAX_COMMANDS_SERVICE MAX_COMMANDS_SERVER
|
#define MAX_COMMANDS_SERVICE 10
|
||||||
|
|
||||||
|
|
||||||
static bool Handle_Write PARAMS(( CONN_ID Idx ));
|
static bool Handle_Write PARAMS(( CONN_ID Idx ));
|
||||||
static bool Conn_Write PARAMS(( CONN_ID Idx, char *Data, size_t Len ));
|
static bool Conn_Write PARAMS(( CONN_ID Idx, char *Data, size_t Len ));
|
||||||
static int New_Connection PARAMS(( int Sock ));
|
static int New_Connection PARAMS(( int Sock, bool IsSSL ));
|
||||||
static CONN_ID Socket2Index PARAMS(( int Sock ));
|
static CONN_ID Socket2Index PARAMS(( int Sock ));
|
||||||
static void Read_Request PARAMS(( CONN_ID Idx ));
|
static void Read_Request PARAMS(( CONN_ID Idx ));
|
||||||
static unsigned int Handle_Buffer PARAMS(( CONN_ID Idx ));
|
static unsigned int Handle_Buffer PARAMS(( CONN_ID Idx ));
|
||||||
@@ -131,7 +131,7 @@ static void
|
|||||||
cb_listen(int sock, short irrelevant)
|
cb_listen(int sock, short irrelevant)
|
||||||
{
|
{
|
||||||
(void) irrelevant;
|
(void) irrelevant;
|
||||||
(void) New_Connection(sock);
|
(void) New_Connection(sock, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -149,7 +149,7 @@ cb_listen_ssl(int sock, short irrelevant)
|
|||||||
int fd;
|
int fd;
|
||||||
|
|
||||||
(void) irrelevant;
|
(void) irrelevant;
|
||||||
fd = New_Connection(sock);
|
fd = New_Connection(sock, true);
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
return;
|
return;
|
||||||
io_event_setcb(My_Connections[fd].sock, cb_clientserver_ssl);
|
io_event_setcb(My_Connections[fd].sock, cb_clientserver_ssl);
|
||||||
@@ -367,7 +367,7 @@ cb_clientserver_ssl(int sock, short what)
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialite connecion module.
|
* Initialize connecion module.
|
||||||
*/
|
*/
|
||||||
GLOBAL void
|
GLOBAL void
|
||||||
Conn_Init( void )
|
Conn_Init( void )
|
||||||
@@ -433,12 +433,13 @@ Conn_Exit( void )
|
|||||||
* they don't hold connections open that the main process wants to close.
|
* they don't hold connections open that the main process wants to close.
|
||||||
*/
|
*/
|
||||||
GLOBAL void
|
GLOBAL void
|
||||||
Conn_CloseAllSockets(void)
|
Conn_CloseAllSockets(int ExceptOf)
|
||||||
{
|
{
|
||||||
CONN_ID idx;
|
CONN_ID idx;
|
||||||
|
|
||||||
for(idx = 0; idx < Pool_Size; idx++) {
|
for(idx = 0; idx < Pool_Size; idx++) {
|
||||||
if(My_Connections[idx].sock > NONE)
|
if(My_Connections[idx].sock > NONE &&
|
||||||
|
My_Connections[idx].sock != ExceptOf)
|
||||||
close(My_Connections[idx].sock);
|
close(My_Connections[idx].sock);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -739,6 +740,9 @@ Conn_Handler(void)
|
|||||||
Check_Servers();
|
Check_Servers();
|
||||||
Check_Connections();
|
Check_Connections();
|
||||||
|
|
||||||
|
/* Expire outdated class/list items */
|
||||||
|
Class_Expire();
|
||||||
|
|
||||||
/* Look for non-empty read buffers ... */
|
/* Look for non-empty read buffers ... */
|
||||||
for (i = 0; i < Pool_Size; i++) {
|
for (i = 0; i < Pool_Size; i++) {
|
||||||
if ((My_Connections[i].sock > NONE)
|
if ((My_Connections[i].sock > NONE)
|
||||||
@@ -858,6 +862,9 @@ va_dcl
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
char buffer[COMMAND_LEN];
|
char buffer[COMMAND_LEN];
|
||||||
|
#ifdef ICONV
|
||||||
|
char *ptr, *message;
|
||||||
|
#endif
|
||||||
size_t len;
|
size_t len;
|
||||||
bool ok;
|
bool ok;
|
||||||
va_list ap;
|
va_list ap;
|
||||||
@@ -898,6 +905,16 @@ va_dcl
|
|||||||
CUT_TXTSUFFIX);
|
CUT_TXTSUFFIX);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef ICONV
|
||||||
|
ptr = strchr(buffer + 1, ':');
|
||||||
|
if (ptr) {
|
||||||
|
ptr++;
|
||||||
|
message = Conn_EncodingTo(Idx, ptr);
|
||||||
|
if (message != ptr)
|
||||||
|
strlcpy(ptr, message, sizeof(buffer) - (ptr - buffer));
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef SNIFFER
|
#ifdef SNIFFER
|
||||||
if (NGIRCd_Sniffer)
|
if (NGIRCd_Sniffer)
|
||||||
Log(LOG_DEBUG, " -> connection %d: '%s'.", Idx, buffer);
|
Log(LOG_DEBUG, " -> connection %d: '%s'.", Idx, buffer);
|
||||||
@@ -911,6 +928,30 @@ va_dcl
|
|||||||
return ok;
|
return ok;
|
||||||
} /* Conn_WriteStr */
|
} /* Conn_WriteStr */
|
||||||
|
|
||||||
|
GLOBAL char*
|
||||||
|
Conn_Password( CONN_ID Idx )
|
||||||
|
{
|
||||||
|
assert( Idx > NONE );
|
||||||
|
if (My_Connections[Idx].pwd == NULL)
|
||||||
|
return (char*)"\0";
|
||||||
|
else
|
||||||
|
return My_Connections[Idx].pwd;
|
||||||
|
} /* Conn_Password */
|
||||||
|
|
||||||
|
GLOBAL void
|
||||||
|
Conn_SetPassword( CONN_ID Idx, const char *Pwd )
|
||||||
|
{
|
||||||
|
assert( Idx > NONE );
|
||||||
|
|
||||||
|
if (My_Connections[Idx].pwd)
|
||||||
|
free(My_Connections[Idx].pwd);
|
||||||
|
|
||||||
|
My_Connections[Idx].pwd = strdup(Pwd);
|
||||||
|
if (My_Connections[Idx].pwd == NULL) {
|
||||||
|
Log(LOG_EMERG, "Can't allocate memory! [Conn_SetPassword]");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
} /* Conn_SetPassword */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Append Data to the outbound write buffer of a connection.
|
* Append Data to the outbound write buffer of a connection.
|
||||||
@@ -929,22 +970,25 @@ Conn_Write( CONN_ID Idx, char *Data, size_t Len )
|
|||||||
assert( Data != NULL );
|
assert( Data != NULL );
|
||||||
assert( Len > 0 );
|
assert( Len > 0 );
|
||||||
|
|
||||||
c = Conn_GetClient(Idx);
|
|
||||||
assert( c != NULL);
|
|
||||||
|
|
||||||
/* Servers do get special write buffer limits, so they can generate
|
|
||||||
* all the messages that are required while peering. */
|
|
||||||
if (Client_Type(c) == CLIENT_SERVER)
|
|
||||||
writebuf_limit = WRITEBUFFER_SLINK_LEN;
|
|
||||||
|
|
||||||
/* Is the socket still open? A previous call to Conn_Write()
|
/* Is the socket still open? A previous call to Conn_Write()
|
||||||
* may have closed the connection due to a fatal error.
|
* may have closed the connection due to a fatal error.
|
||||||
* In this case it is sufficient to return an error, as well. */
|
* In this case it is sufficient to return an error, as well. */
|
||||||
if( My_Connections[Idx].sock <= NONE ) {
|
if (My_Connections[Idx].sock <= NONE) {
|
||||||
LogDebug("Skipped write on closed socket (connection %d).", Idx);
|
LogDebug("Skipped write on closed socket (connection %d).", Idx);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Make sure that there still exists a CLIENT structure associated
|
||||||
|
* with this connection and check if this is a server or not: */
|
||||||
|
c = Conn_GetClient(Idx);
|
||||||
|
if (c) {
|
||||||
|
/* Servers do get special write buffer limits, so they can
|
||||||
|
* generate all the messages that are required while peering. */
|
||||||
|
if (Client_Type(c) == CLIENT_SERVER)
|
||||||
|
writebuf_limit = WRITEBUFFER_SLINK_LEN;
|
||||||
|
} else
|
||||||
|
LogDebug("Write on socket without client (connection %d)!?", Idx);
|
||||||
|
|
||||||
#ifdef ZLIB
|
#ifdef ZLIB
|
||||||
if ( Conn_OPTION_ISSET( &My_Connections[Idx], CONN_ZIP )) {
|
if ( Conn_OPTION_ISSET( &My_Connections[Idx], CONN_ZIP )) {
|
||||||
/* Compressed link:
|
/* Compressed link:
|
||||||
@@ -1007,7 +1051,7 @@ Conn_Write( CONN_ID Idx, char *Data, size_t Len )
|
|||||||
GLOBAL void
|
GLOBAL void
|
||||||
Conn_Close( CONN_ID Idx, const char *LogMsg, const char *FwdMsg, bool InformClient )
|
Conn_Close( CONN_ID Idx, const char *LogMsg, const char *FwdMsg, bool InformClient )
|
||||||
{
|
{
|
||||||
/* Close connection. Open pipes of asyncronous resolver
|
/* Close connection. Open pipes of asynchronous resolver
|
||||||
* sub-processes are closed down. */
|
* sub-processes are closed down. */
|
||||||
|
|
||||||
CLIENT *c;
|
CLIENT *c;
|
||||||
@@ -1136,6 +1180,8 @@ Conn_Close( CONN_ID Idx, const char *LogMsg, const char *FwdMsg, bool InformClie
|
|||||||
|
|
||||||
array_free(&My_Connections[Idx].rbuf);
|
array_free(&My_Connections[Idx].rbuf);
|
||||||
array_free(&My_Connections[Idx].wbuf);
|
array_free(&My_Connections[Idx].wbuf);
|
||||||
|
if (My_Connections[Idx].pwd != NULL)
|
||||||
|
free(My_Connections[Idx].pwd);
|
||||||
|
|
||||||
/* Clean up connection structure (=free it) */
|
/* Clean up connection structure (=free it) */
|
||||||
Init_Conn_Struct( Idx );
|
Init_Conn_Struct( Idx );
|
||||||
@@ -1216,6 +1262,20 @@ Conn_SyncServerStruct(void)
|
|||||||
} /* SyncServerStruct */
|
} /* SyncServerStruct */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get IP address string of a connection.
|
||||||
|
*
|
||||||
|
* @param Idx Connection index.
|
||||||
|
* @return Pointer to a global buffer containing the IP address as string.
|
||||||
|
*/
|
||||||
|
GLOBAL const char *
|
||||||
|
Conn_GetIPAInfo(CONN_ID Idx)
|
||||||
|
{
|
||||||
|
assert(Idx > NONE);
|
||||||
|
return ng_ipaddr_tostr(&My_Connections[Idx].addr);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Send out data of write buffer; connect new sockets.
|
* Send out data of write buffer; connect new sockets.
|
||||||
*
|
*
|
||||||
@@ -1255,9 +1315,11 @@ Handle_Write( CONN_ID Idx )
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef DEBUG_BUFFER
|
||||||
LogDebug
|
LogDebug
|
||||||
("Handle_Write() called for connection %d, %ld bytes pending ...",
|
("Handle_Write() called for connection %d, %ld bytes pending ...",
|
||||||
Idx, wdatalen);
|
Idx, wdatalen);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef SSL_SUPPORT
|
#ifdef SSL_SUPPORT
|
||||||
if ( Conn_OPTION_ISSET( &My_Connections[Idx], CONN_SSL )) {
|
if ( Conn_OPTION_ISSET( &My_Connections[Idx], CONN_SSL )) {
|
||||||
@@ -1310,22 +1372,25 @@ Count_Connections(ng_ipaddr_t *a)
|
|||||||
* Initialize new client connection on a listening socket.
|
* Initialize new client connection on a listening socket.
|
||||||
*
|
*
|
||||||
* @param Sock Listening socket descriptor.
|
* @param Sock Listening socket descriptor.
|
||||||
|
* @param IsSSL true if this socket expects SSL-encrypted data.
|
||||||
* @returns Accepted socket descriptor or -1 on error.
|
* @returns Accepted socket descriptor or -1 on error.
|
||||||
*/
|
*/
|
||||||
static int
|
static int
|
||||||
New_Connection(int Sock)
|
New_Connection(int Sock, UNUSED bool IsSSL)
|
||||||
{
|
{
|
||||||
#ifdef TCPWRAP
|
#ifdef TCPWRAP
|
||||||
struct request_info req;
|
struct request_info req;
|
||||||
#endif
|
#endif
|
||||||
ng_ipaddr_t new_addr;
|
ng_ipaddr_t new_addr;
|
||||||
char ip_str[NG_INET_ADDRSTRLEN];
|
char ip_str[NG_INET_ADDRSTRLEN];
|
||||||
int new_sock, new_sock_len, identsock;
|
int new_sock, new_sock_len;
|
||||||
CLIENT *c;
|
CLIENT *c;
|
||||||
long cnt;
|
long cnt;
|
||||||
|
|
||||||
assert(Sock > NONE);
|
assert(Sock > NONE);
|
||||||
|
|
||||||
|
LogDebug("Accepting new connection on socket %d ...", Sock);
|
||||||
|
|
||||||
new_sock_len = (int)sizeof(new_addr);
|
new_sock_len = (int)sizeof(new_addr);
|
||||||
new_sock = accept(Sock, (struct sockaddr *)&new_addr,
|
new_sock = accept(Sock, (struct sockaddr *)&new_addr,
|
||||||
(socklen_t *)&new_sock_len);
|
(socklen_t *)&new_sock_len);
|
||||||
@@ -1410,7 +1475,7 @@ New_Connection(int Sock)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
c = Client_NewLocal(new_sock, ip_str, CLIENT_UNKNOWN, false);
|
c = Client_NewLocal(new_sock, NULL, CLIENT_UNKNOWN, false);
|
||||||
if (!c) {
|
if (!c) {
|
||||||
Log(LOG_ALERT,
|
Log(LOG_ALERT,
|
||||||
"Can't accept connection: can't create client structure!");
|
"Can't accept connection: can't create client structure!");
|
||||||
@@ -1438,32 +1503,62 @@ New_Connection(int Sock)
|
|||||||
Log(LOG_INFO, "Accepted connection %d from %s:%d on socket %d.",
|
Log(LOG_INFO, "Accepted connection %d from %s:%d on socket %d.",
|
||||||
new_sock, My_Connections[new_sock].host,
|
new_sock, My_Connections[new_sock].host,
|
||||||
ng_ipaddr_getport(&new_addr), Sock);
|
ng_ipaddr_getport(&new_addr), Sock);
|
||||||
|
|
||||||
identsock = new_sock;
|
|
||||||
#ifdef IDENTAUTH
|
|
||||||
if (!Conf_Ident)
|
|
||||||
identsock = -1;
|
|
||||||
#endif
|
|
||||||
if (Conf_DNS) {
|
|
||||||
if (Conf_NoticeAuth) {
|
|
||||||
#ifdef IDENTAUTH
|
|
||||||
if (Conf_Ident)
|
|
||||||
(void)Conn_WriteStr(new_sock,
|
|
||||||
"NOTICE AUTH :*** Looking up your hostname and checking ident");
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
(void)Conn_WriteStr(new_sock,
|
|
||||||
"NOTICE AUTH :*** Looking up your hostname");
|
|
||||||
}
|
|
||||||
Resolve_Addr(&My_Connections[new_sock].proc_stat, &new_addr,
|
|
||||||
identsock, cb_Read_Resolver_Result);
|
|
||||||
}
|
|
||||||
|
|
||||||
Account_Connection();
|
Account_Connection();
|
||||||
|
|
||||||
|
#ifdef SSL_SUPPORT
|
||||||
|
/* Delay connection initalization until SSL handshake is finished */
|
||||||
|
if (!IsSSL)
|
||||||
|
#endif
|
||||||
|
Conn_StartLogin(new_sock);
|
||||||
|
|
||||||
return new_sock;
|
return new_sock;
|
||||||
} /* New_Connection */
|
} /* New_Connection */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Finish connection initialization, start resolver subprocess.
|
||||||
|
*
|
||||||
|
* @param Idx Connection index.
|
||||||
|
*/
|
||||||
|
GLOBAL void
|
||||||
|
Conn_StartLogin(CONN_ID Idx)
|
||||||
|
{
|
||||||
|
int ident_sock = -1;
|
||||||
|
|
||||||
|
assert(Idx >= 0);
|
||||||
|
|
||||||
|
/* Nothing to do if DNS (and resolver subprocess) is disabled */
|
||||||
|
if (!Conf_DNS)
|
||||||
|
return;
|
||||||
|
|
||||||
|
#ifdef IDENTAUTH
|
||||||
|
/* Should we make an IDENT request? */
|
||||||
|
if (Conf_Ident)
|
||||||
|
ident_sock = My_Connections[Idx].sock;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if (Conf_NoticeAuth) {
|
||||||
|
/* Send "NOTICE AUTH" messages to the client */
|
||||||
|
#ifdef IDENTAUTH
|
||||||
|
if (Conf_Ident)
|
||||||
|
(void)Conn_WriteStr(Idx,
|
||||||
|
"NOTICE AUTH :*** Looking up your hostname and checking ident");
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
(void)Conn_WriteStr(Idx,
|
||||||
|
"NOTICE AUTH :*** Looking up your hostname");
|
||||||
|
/* Send buffered data to the client, but break on errors
|
||||||
|
* because Handle_Write() would have closed the connection
|
||||||
|
* again in this case! */
|
||||||
|
if (!Handle_Write(Idx))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Resolve_Addr(&My_Connections[Idx].proc_stat, &My_Connections[Idx].addr,
|
||||||
|
ident_sock, cb_Read_Resolver_Result);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Update global connection counters.
|
* Update global connection counters.
|
||||||
*/
|
*/
|
||||||
@@ -1561,7 +1656,7 @@ Read_Request( CONN_ID Idx )
|
|||||||
if (!array_catb(&My_Connections[Idx].zip.rbuf, readbuf,
|
if (!array_catb(&My_Connections[Idx].zip.rbuf, readbuf,
|
||||||
(size_t) len)) {
|
(size_t) len)) {
|
||||||
Log(LOG_ERR,
|
Log(LOG_ERR,
|
||||||
"Could not append recieved data to zip input buffer (connn %d): %d bytes!",
|
"Could not append received data to zip input buffer (connection %d): %d bytes!",
|
||||||
Idx, len);
|
Idx, len);
|
||||||
Conn_Close(Idx, "Receive buffer space exhausted", NULL,
|
Conn_Close(Idx, "Receive buffer space exhausted", NULL,
|
||||||
false);
|
false);
|
||||||
@@ -1571,7 +1666,9 @@ Read_Request( CONN_ID Idx )
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
if (!array_catb( &My_Connections[Idx].rbuf, readbuf, len)) {
|
if (!array_catb( &My_Connections[Idx].rbuf, readbuf, len)) {
|
||||||
Log( LOG_ERR, "Could not append recieved data to input buffer (connn %d): %d bytes!", Idx, len );
|
Log(LOG_ERR,
|
||||||
|
"Could not append received data to input buffer (connection %d): %d bytes!",
|
||||||
|
Idx, len);
|
||||||
Conn_Close(Idx, "Receive buffer space exhausted", NULL, false );
|
Conn_Close(Idx, "Receive buffer space exhausted", NULL, false );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1644,16 +1741,15 @@ Handle_Buffer(CONN_ID Idx)
|
|||||||
|
|
||||||
assert(c != NULL);
|
assert(c != NULL);
|
||||||
|
|
||||||
/* Servers do get special command limits, so they can process
|
/* Servers get special command limits that depend on the user count */
|
||||||
* all the messages that are required while peering. */
|
|
||||||
switch (Client_Type(c)) {
|
switch (Client_Type(c)) {
|
||||||
case CLIENT_SERVER:
|
case CLIENT_SERVER:
|
||||||
/* Allow servers to send more commands in the first 10 secods
|
maxcmd = (int)(Client_UserCount() / 5)
|
||||||
|
+ MAX_COMMANDS_SERVER_MIN;
|
||||||
|
/* Allow servers to handle even more commands while peering
|
||||||
* to speed up server login and network synchronisation. */
|
* to speed up server login and network synchronisation. */
|
||||||
if (starttime - Client_StartTime(c) < 10)
|
if (Conn_LastPing(Idx) == 0)
|
||||||
maxcmd = MAX_COMMANDS_SERVER * 5;
|
maxcmd *= 5;
|
||||||
else
|
|
||||||
maxcmd = MAX_COMMANDS_SERVER;
|
|
||||||
break;
|
break;
|
||||||
case CLIENT_SERVICE:
|
case CLIENT_SERVICE:
|
||||||
maxcmd = MAX_COMMANDS_SERVICE; break;
|
maxcmd = MAX_COMMANDS_SERVICE; break;
|
||||||
@@ -1753,8 +1849,10 @@ Handle_Buffer(CONN_ID Idx)
|
|||||||
return 0; /* error -> connection has been closed */
|
return 0; /* error -> connection has been closed */
|
||||||
|
|
||||||
array_moveleft(&My_Connections[Idx].rbuf, 1, len);
|
array_moveleft(&My_Connections[Idx].rbuf, 1, len);
|
||||||
|
#ifdef DEBUG_BUFFER
|
||||||
LogDebug("Connection %d: %d bytes left in read buffer.",
|
LogDebug("Connection %d: %d bytes left in read buffer.",
|
||||||
Idx, array_bytes(&My_Connections[Idx].rbuf));
|
Idx, array_bytes(&My_Connections[Idx].rbuf));
|
||||||
|
#endif
|
||||||
#ifdef ZLIB
|
#ifdef ZLIB
|
||||||
if ((!old_z) && (My_Connections[Idx].options & CONN_ZIP) &&
|
if ((!old_z) && (My_Connections[Idx].options & CONN_ZIP) &&
|
||||||
(array_bytes(&My_Connections[Idx].rbuf) > 0)) {
|
(array_bytes(&My_Connections[Idx].rbuf) > 0)) {
|
||||||
@@ -1808,17 +1906,17 @@ Check_Connections(void)
|
|||||||
if (My_Connections[i].lastping <
|
if (My_Connections[i].lastping <
|
||||||
time(NULL) - Conf_PongTimeout) {
|
time(NULL) - Conf_PongTimeout) {
|
||||||
/* Timeout */
|
/* Timeout */
|
||||||
LogDebug
|
snprintf(msg, sizeof(msg),
|
||||||
("Connection %d: Ping timeout: %d seconds.",
|
"Ping timeout: %d seconds",
|
||||||
i, Conf_PongTimeout);
|
Conf_PongTimeout);
|
||||||
snprintf(msg, sizeof(msg), "Ping timeout: %d seconds", Conf_PongTimeout);
|
LogDebug("Connection %d: %s.", i, msg);
|
||||||
Conn_Close(i, NULL, msg, true);
|
Conn_Close(i, NULL, msg, true);
|
||||||
}
|
}
|
||||||
} else if (My_Connections[i].lastdata <
|
} else if (My_Connections[i].lastdata <
|
||||||
time(NULL) - Conf_PingTimeout) {
|
time(NULL) - Conf_PingTimeout) {
|
||||||
/* We need to send a PING ... */
|
/* We need to send a PING ... */
|
||||||
LogDebug("Connection %d: sending PING ...", i);
|
LogDebug("Connection %d: sending PING ...", i);
|
||||||
My_Connections[i].lastping = time(NULL);
|
Conn_UpdatePing(i);
|
||||||
Conn_WriteStr(i, "PING :%s",
|
Conn_WriteStr(i, "PING :%s",
|
||||||
Client_ID(Client_ThisServer()));
|
Client_ID(Client_ThisServer()));
|
||||||
}
|
}
|
||||||
@@ -1904,6 +2002,14 @@ New_Server( int Server , ng_ipaddr_t *dest)
|
|||||||
|
|
||||||
assert( Server > NONE );
|
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)) {
|
if (!ng_ipaddr_tostr_r(dest, ip_str)) {
|
||||||
Log(LOG_WARNING, "New_Server: Could not convert IP to string");
|
Log(LOG_WARNING, "New_Server: Could not convert IP to string");
|
||||||
return;
|
return;
|
||||||
@@ -1977,7 +2083,8 @@ New_Server( int Server , ng_ipaddr_t *dest)
|
|||||||
Client_SetToken( c, TOKEN_OUTBOUND );
|
Client_SetToken( c, TOKEN_OUTBOUND );
|
||||||
|
|
||||||
/* Register connection */
|
/* Register connection */
|
||||||
Conf_Server[Server].conn_id = new_sock;
|
if (!Conf_SetServer(Server, new_sock))
|
||||||
|
return;
|
||||||
My_Connections[new_sock].sock = new_sock;
|
My_Connections[new_sock].sock = new_sock;
|
||||||
My_Connections[new_sock].addr = *dest;
|
My_Connections[new_sock].addr = *dest;
|
||||||
My_Connections[new_sock].client = c;
|
My_Connections[new_sock].client = c;
|
||||||
@@ -2017,6 +2124,11 @@ Init_Conn_Struct(CONN_ID Idx)
|
|||||||
My_Connections[Idx].lastdata = now;
|
My_Connections[Idx].lastdata = now;
|
||||||
My_Connections[Idx].lastprivmsg = now;
|
My_Connections[Idx].lastprivmsg = now;
|
||||||
Proc_InitStruct(&My_Connections[Idx].proc_stat);
|
Proc_InitStruct(&My_Connections[Idx].proc_stat);
|
||||||
|
|
||||||
|
#ifdef ICONV
|
||||||
|
My_Connections[Idx].iconv_from = (iconv_t)(-1);
|
||||||
|
My_Connections[Idx].iconv_to = (iconv_t)(-1);
|
||||||
|
#endif
|
||||||
} /* Init_Conn_Struct */
|
} /* Init_Conn_Struct */
|
||||||
|
|
||||||
|
|
||||||
@@ -2051,13 +2163,14 @@ Init_Socket( int Sock )
|
|||||||
/* Set type of service (TOS) */
|
/* Set type of service (TOS) */
|
||||||
#if defined(IPPROTO_IP) && defined(IPTOS_LOWDELAY)
|
#if defined(IPPROTO_IP) && defined(IPTOS_LOWDELAY)
|
||||||
value = IPTOS_LOWDELAY;
|
value = IPTOS_LOWDELAY;
|
||||||
LogDebug("Setting IP_TOS on socket %d to IPTOS_LOWDELAY.", Sock);
|
|
||||||
if (setsockopt(Sock, IPPROTO_IP, IP_TOS, &value,
|
if (setsockopt(Sock, IPPROTO_IP, IP_TOS, &value,
|
||||||
(socklen_t) sizeof(value))) {
|
(socklen_t) sizeof(value))) {
|
||||||
LogDebug("Can't set socket option IP_TOS: %s!",
|
LogDebug("Can't set socket option IP_TOS: %s!",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
/* ignore this error */
|
/* ignore this error */
|
||||||
}
|
} else
|
||||||
|
LogDebug("IP_TOS on socket %d has been set to IPTOS_LOWDELAY.",
|
||||||
|
Sock);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -2098,6 +2211,7 @@ cb_Connect_to_Server(int fd, UNUSED short events)
|
|||||||
|
|
||||||
/* Read result from pipe */
|
/* Read result from pipe */
|
||||||
len = Proc_Read(&Conf_Server[i].res_stat, dest_addrs, sizeof(dest_addrs));
|
len = Proc_Read(&Conf_Server[i].res_stat, dest_addrs, sizeof(dest_addrs));
|
||||||
|
Proc_Close(&Conf_Server[i].res_stat);
|
||||||
if (len == 0) {
|
if (len == 0) {
|
||||||
/* Error resolving hostname: reset server structure */
|
/* Error resolving hostname: reset server structure */
|
||||||
Conf_Server[i].conn_id = NONE;
|
Conf_Server[i].conn_id = NONE;
|
||||||
@@ -2141,6 +2255,7 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events )
|
|||||||
char *identptr;
|
char *identptr;
|
||||||
#ifdef IDENTAUTH
|
#ifdef IDENTAUTH
|
||||||
char readbuf[HOST_LEN + 2 + CLIENT_USER_LEN];
|
char readbuf[HOST_LEN + 2 + CLIENT_USER_LEN];
|
||||||
|
char *ptr;
|
||||||
#else
|
#else
|
||||||
char readbuf[HOST_LEN + 1];
|
char readbuf[HOST_LEN + 1];
|
||||||
#endif
|
#endif
|
||||||
@@ -2157,6 +2272,7 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events )
|
|||||||
|
|
||||||
/* Read result from pipe */
|
/* Read result from pipe */
|
||||||
len = Proc_Read(&My_Connections[i].proc_stat, readbuf, sizeof readbuf -1);
|
len = Proc_Read(&My_Connections[i].proc_stat, readbuf, sizeof readbuf -1);
|
||||||
|
Proc_Close(&My_Connections[i].proc_stat);
|
||||||
if (len == 0)
|
if (len == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -2188,15 +2304,37 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events )
|
|||||||
Client_SetHostname(c, readbuf);
|
Client_SetHostname(c, readbuf);
|
||||||
if (Conf_NoticeAuth)
|
if (Conf_NoticeAuth)
|
||||||
(void)Conn_WriteStr(i,
|
(void)Conn_WriteStr(i,
|
||||||
"NOTICE AUTH :*** Found your hostname");
|
"NOTICE AUTH :*** Found your hostname: %s",
|
||||||
|
My_Connections[i].host);
|
||||||
#ifdef IDENTAUTH
|
#ifdef IDENTAUTH
|
||||||
++identptr;
|
++identptr;
|
||||||
if (*identptr) {
|
if (*identptr) {
|
||||||
Log(LOG_INFO, "IDENT lookup for connection %d: \"%s\".", i, identptr);
|
ptr = identptr;
|
||||||
Client_SetUser(c, identptr, true);
|
while (*ptr) {
|
||||||
if (Conf_NoticeAuth)
|
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,
|
(void)Conn_WriteStr(i,
|
||||||
"NOTICE AUTH :*** Got ident response");
|
"NOTICE AUTH :*** Got %sident response%s%s",
|
||||||
|
*ptr ? "invalid " : "",
|
||||||
|
*ptr ? "" : ": ",
|
||||||
|
*ptr ? "" : identptr);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
Log(LOG_INFO, "IDENT lookup for connection %d: no result.", i);
|
Log(LOG_INFO, "IDENT lookup for connection %d: no result.", i);
|
||||||
if (Conf_NoticeAuth && Conf_Ident)
|
if (Conf_NoticeAuth && Conf_Ident)
|
||||||
@@ -2204,6 +2342,16 @@ cb_Read_Resolver_Result( int r_fd, UNUSED short events )
|
|||||||
"NOTICE AUTH :*** No ident response");
|
"NOTICE AUTH :*** No ident response");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (Conf_NoticeAuth) {
|
||||||
|
/* Send buffered data to the client, but break on
|
||||||
|
* errors because Handle_Write() would have closed
|
||||||
|
* the connection again in this case! */
|
||||||
|
if (!Handle_Write(i))
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
Class_HandleServerBans(c);
|
||||||
}
|
}
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
else Log( LOG_DEBUG, "Resolver: discarding result for already registered connection %d.", i );
|
else Log( LOG_DEBUG, "Resolver: discarding result for already registered connection %d.", i );
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* 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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -42,7 +42,7 @@
|
|||||||
#define CONN_SSL_WANT_READ 128 /* SSL/TLS library needs to read protocol data */
|
#define CONN_SSL_WANT_READ 128 /* SSL/TLS library needs to read protocol data */
|
||||||
#define CONN_SSL_FLAGS_ALL (CONN_SSL_CONNECT|CONN_SSL|CONN_SSL_WANT_WRITE|CONN_SSL_WANT_READ)
|
#define CONN_SSL_FLAGS_ALL (CONN_SSL_CONNECT|CONN_SSL|CONN_SSL_WANT_WRITE|CONN_SSL_WANT_READ)
|
||||||
#endif
|
#endif
|
||||||
typedef long CONN_ID;
|
typedef int CONN_ID;
|
||||||
|
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
#include "proc.h"
|
#include "proc.h"
|
||||||
@@ -54,6 +54,10 @@ typedef long CONN_ID;
|
|||||||
#include "tool.h"
|
#include "tool.h"
|
||||||
#include "ng_ipaddr.h"
|
#include "ng_ipaddr.h"
|
||||||
|
|
||||||
|
#ifdef ICONV
|
||||||
|
# include <iconv.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef ZLIB
|
#ifdef ZLIB
|
||||||
#include <zlib.h>
|
#include <zlib.h>
|
||||||
typedef struct _ZipData
|
typedef struct _ZipData
|
||||||
@@ -72,6 +76,7 @@ typedef struct _Connection
|
|||||||
ng_ipaddr_t addr; /* Client address */
|
ng_ipaddr_t addr; /* Client address */
|
||||||
PROC_STAT proc_stat; /* Status of resolver process */
|
PROC_STAT proc_stat; /* Status of resolver process */
|
||||||
char host[HOST_LEN]; /* Hostname */
|
char host[HOST_LEN]; /* Hostname */
|
||||||
|
char *pwd; /* password received of the client */
|
||||||
array rbuf; /* Read buffer */
|
array rbuf; /* Read buffer */
|
||||||
array wbuf; /* Write buffer */
|
array wbuf; /* Write buffer */
|
||||||
time_t signon; /* Signon ("connect") time */
|
time_t signon; /* Signon ("connect") time */
|
||||||
@@ -94,27 +99,38 @@ typedef struct _Connection
|
|||||||
#ifndef STRICT_RFC
|
#ifndef STRICT_RFC
|
||||||
long auth_ping; /** PING response expected on login */
|
long auth_ping; /** PING response expected on login */
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef ICONV
|
||||||
|
iconv_t iconv_from; /** iconv: convert from client to server */
|
||||||
|
iconv_t iconv_to; /** iconv: convert from server to client */
|
||||||
|
#endif
|
||||||
} CONNECTION;
|
} CONNECTION;
|
||||||
|
|
||||||
GLOBAL CONNECTION *My_Connections;
|
GLOBAL CONNECTION *My_Connections;
|
||||||
GLOBAL CONN_ID Pool_Size;
|
GLOBAL CONN_ID Pool_Size;
|
||||||
GLOBAL long WCounter;
|
GLOBAL long WCounter;
|
||||||
|
|
||||||
|
#define CONNECTION2ID(x) (long)(x - My_Connections)
|
||||||
|
|
||||||
#endif /* CONN_MODULE */
|
#endif /* CONN_MODULE */
|
||||||
|
|
||||||
|
|
||||||
GLOBAL void Conn_Init PARAMS((void ));
|
GLOBAL void Conn_Init PARAMS((void ));
|
||||||
GLOBAL void Conn_Exit PARAMS(( void ));
|
GLOBAL void Conn_Exit PARAMS(( void ));
|
||||||
|
|
||||||
GLOBAL void Conn_CloseAllSockets PARAMS((void));
|
GLOBAL void Conn_CloseAllSockets PARAMS((int ExceptOf));
|
||||||
|
|
||||||
GLOBAL unsigned int Conn_InitListeners PARAMS(( void ));
|
GLOBAL unsigned int Conn_InitListeners PARAMS(( void ));
|
||||||
GLOBAL void Conn_ExitListeners PARAMS(( void ));
|
GLOBAL void Conn_ExitListeners PARAMS(( void ));
|
||||||
|
|
||||||
|
GLOBAL void Conn_StartLogin PARAMS((CONN_ID Idx));
|
||||||
|
|
||||||
GLOBAL void Conn_Handler PARAMS(( void ));
|
GLOBAL void Conn_Handler PARAMS(( void ));
|
||||||
|
|
||||||
GLOBAL bool Conn_WriteStr PARAMS(( CONN_ID Idx, const char *Format, ... ));
|
GLOBAL bool Conn_WriteStr PARAMS(( CONN_ID Idx, const char *Format, ... ));
|
||||||
|
|
||||||
|
GLOBAL char* Conn_Password PARAMS(( CONN_ID Idx ));
|
||||||
|
GLOBAL void Conn_SetPassword PARAMS(( CONN_ID Idx, const char *Pwd ));
|
||||||
|
|
||||||
GLOBAL void Conn_Close PARAMS(( CONN_ID Idx, const char *LogMsg, const char *FwdMsg, bool InformClient ));
|
GLOBAL void Conn_Close PARAMS(( CONN_ID Idx, const char *LogMsg, const char *FwdMsg, bool InformClient ));
|
||||||
|
|
||||||
GLOBAL void Conn_SyncServerStruct PARAMS(( void ));
|
GLOBAL void Conn_SyncServerStruct PARAMS(( void ));
|
||||||
@@ -122,6 +138,7 @@ GLOBAL void Conn_SyncServerStruct PARAMS(( void ));
|
|||||||
GLOBAL CONN_ID Conn_GetFromProc PARAMS((int fd));
|
GLOBAL CONN_ID Conn_GetFromProc PARAMS((int fd));
|
||||||
GLOBAL CLIENT* Conn_GetClient PARAMS((CONN_ID i));
|
GLOBAL CLIENT* Conn_GetClient PARAMS((CONN_ID i));
|
||||||
GLOBAL PROC_STAT* Conn_GetProcStat PARAMS((CONN_ID i));
|
GLOBAL PROC_STAT* Conn_GetProcStat PARAMS((CONN_ID i));
|
||||||
|
|
||||||
#ifdef SSL_SUPPORT
|
#ifdef SSL_SUPPORT
|
||||||
GLOBAL bool Conn_GetCipherInfo PARAMS((CONN_ID Idx, char *buf, size_t len));
|
GLOBAL bool Conn_GetCipherInfo PARAMS((CONN_ID Idx, char *buf, size_t len));
|
||||||
GLOBAL bool Conn_UsesSSL PARAMS((CONN_ID Idx));
|
GLOBAL bool Conn_UsesSSL PARAMS((CONN_ID Idx));
|
||||||
@@ -131,6 +148,8 @@ Conn_UsesSSL(UNUSED CONN_ID Idx)
|
|||||||
{ return false; }
|
{ return false; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
GLOBAL const char *Conn_GetIPAInfo PARAMS((CONN_ID Idx));
|
||||||
|
|
||||||
GLOBAL long Conn_Count PARAMS((void));
|
GLOBAL long Conn_Count PARAMS((void));
|
||||||
GLOBAL long Conn_CountMax PARAMS((void));
|
GLOBAL long Conn_CountMax PARAMS((void));
|
||||||
GLOBAL long Conn_CountAccepted PARAMS((void));
|
GLOBAL long Conn_CountAccepted PARAMS((void));
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2010 Alexander Barton (alex@barton.de)
|
* Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -17,98 +17,192 @@
|
|||||||
* Global constants ("#defines") used by the ngIRCd.
|
* Global constants ("#defines") used by the ngIRCd.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
/* Internal flags */
|
||||||
|
|
||||||
|
/** Flag: there is no connection. */
|
||||||
#define NONE -1
|
#define NONE -1
|
||||||
|
|
||||||
#define FNAME_LEN 256 /* Max. length of file name */
|
/** Flag: connection is (still) established. */
|
||||||
|
#define CONNECTED true
|
||||||
|
|
||||||
#define LINE_LEN 256 /* Max. length of a line in the
|
/** Flag: connection isn't established (any more). */
|
||||||
configuration file */
|
|
||||||
|
|
||||||
#define HOST_LEN 256 /* Max. lenght of fully qualified host
|
|
||||||
names (e. g. "abc.domain.tld") */
|
|
||||||
|
|
||||||
#define MAX_SERVERS 16 /* Max. count of configurable servers */
|
|
||||||
|
|
||||||
#define MAX_WHOWAS 64 /* Max. number of WHOWAS items */
|
|
||||||
#define DEFAULT_WHOWAS 5 /* default count for WHOWAS command */
|
|
||||||
|
|
||||||
#define CONNECTION_POOL 100 /* Size of default connection pool */
|
|
||||||
|
|
||||||
#define CLIENT_ID_LEN 64 /* Max. length of an IRC ID; see RFC
|
|
||||||
RFC 2812 section 1.1 and 1.2.1 */
|
|
||||||
#define CLIENT_NICK_LEN_DEFAULT 10 /* Default nick length, see. RFC 2812
|
|
||||||
* section 1.2.1 */
|
|
||||||
#define CLIENT_NICK_LEN 32 /* Maximum nick name length */
|
|
||||||
#define CLIENT_PASS_LEN 21 /* Max. password length */
|
|
||||||
#define CLIENT_USER_LEN 10 /* Max. length of user name ("login")
|
|
||||||
see RFC 2812, section 1.2.1 */
|
|
||||||
#define CLIENT_NAME_LEN 32 /* Max. length of "real names" */
|
|
||||||
#define CLIENT_HOST_LEN 64 /* Max. host name length */
|
|
||||||
#define CLIENT_MODE_LEN 9 /* Max. lenth of all client modes */
|
|
||||||
#define CLIENT_INFO_LEN 64 /* Max. length of server info texts */
|
|
||||||
#define CLIENT_AWAY_LEN 128 /* Max. length of away messages */
|
|
||||||
#define CLIENT_FLAGS_LEN 100 /* Max. length of client flags */
|
|
||||||
|
|
||||||
#define CHANNEL_NAME_LEN 51 /* Max. length of a channel name, see
|
|
||||||
RFC 2812 section 1.3 */
|
|
||||||
#define CHANNEL_MODE_LEN 9 /* Max. length of channel modes */
|
|
||||||
|
|
||||||
#define COMMAND_LEN 513 /* Max. IRC command length, see. RFC
|
|
||||||
2812 section 3.2 */
|
|
||||||
|
|
||||||
#define READBUFFER_LEN 2048 /* Size of the read buffer of a
|
|
||||||
connection in bytes. */
|
|
||||||
#define WRITEBUFFER_FLUSH_LEN 4096 /* Size of a write buffer that triggers
|
|
||||||
buffer flushing if more space is
|
|
||||||
needed for storing data. */
|
|
||||||
#define WRITEBUFFER_MAX_LEN 32768 /* Maximum size of the write buffer of a
|
|
||||||
connection in bytes. */
|
|
||||||
#define WRITEBUFFER_SLINK_LEN 65536 /* Maximum size of the write buffer of a
|
|
||||||
server link connection in bytes. */
|
|
||||||
|
|
||||||
#define PROTOVER "0210" /* Implemented IRC protocol version,
|
|
||||||
see RFC 2813 section 4.1.1. */
|
|
||||||
#define PROTOIRC "-IRC" /* Protocol suffix, see RFC 2813
|
|
||||||
section 4.1.1 */
|
|
||||||
#define PROTOIRCPLUS "-IRC+" /* Protocol suffix used by the IRC+
|
|
||||||
protocol, see doc/Protocol.txt */
|
|
||||||
|
|
||||||
#ifdef IRCPLUS
|
|
||||||
# define IRCPLUSFLAGS "CHLS" /* Standard IRC+ flags */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define STARTUP_DELAY 1 /* Delay outgoing connections n seconds
|
|
||||||
after startup. */
|
|
||||||
#define RECONNECT_DELAY 3 /* Time to delay re-connect attempts
|
|
||||||
in seconds. */
|
|
||||||
|
|
||||||
#define USERMODES "aciorswx" /* Supported user modes. */
|
|
||||||
#define CHANMODES "biIklmnoOPstvz" /* Supported channel modes. */
|
|
||||||
|
|
||||||
#define CONNECTED true /* Internal status codes. */
|
|
||||||
#define DISCONNECTED false
|
#define DISCONNECTED false
|
||||||
|
|
||||||
#define DEFAULT_AWAY_MSG "Away" /* Away message for users connected to
|
/** Tag for outbound server links. */
|
||||||
linked servers. */
|
#define TOKEN_OUTBOUND -2
|
||||||
|
|
||||||
#define DEFAULT_TOPIC_ID "-Server-" /* Default ID for "topic owner". */
|
|
||||||
|
|
||||||
#define CONFIG_FILE "/ngircd.conf" /* Configuration file name. */
|
/* Generic buffer sizes */
|
||||||
#define MOTD_FILE "/ngircd.motd" /* Name of the MOTD file. */
|
|
||||||
#define CHROOT_DIR "" /* Default chroot() directory. */
|
|
||||||
#define PID_FILE "" /* Default file for the process ID. */
|
|
||||||
|
|
||||||
#define ERROR_DIR "/tmp" /* Error directory used in debug mode */
|
/** Max. length of a line in the configuration file. */
|
||||||
|
#define LINE_LEN 256
|
||||||
|
|
||||||
#define MAX_LOG_MSG_LEN 256 /* Max. length of a log message. */
|
/** Max. length of a log message. */
|
||||||
|
#define MAX_LOG_MSG_LEN 256
|
||||||
|
|
||||||
#define TOKEN_OUTBOUND -2 /* Tag for outbound server links. */
|
/** Max. length of file name. */
|
||||||
|
#define FNAME_LEN 256
|
||||||
|
|
||||||
#define NOTICE_TXTPREFIX "" /* Prefix for NOTICEs from the server
|
/** Max. length of fully qualified host names (e. g. "abc.domain.tld"). */
|
||||||
to users. Some servers use '*'. */
|
#define HOST_LEN 256
|
||||||
|
|
||||||
|
/** Max. length of random salt */
|
||||||
|
#define RANDOM_SALT_LEN 32
|
||||||
|
|
||||||
|
|
||||||
|
/* Size of structures */
|
||||||
|
|
||||||
|
/** Max. count of configurable servers. */
|
||||||
|
#define MAX_SERVERS 16
|
||||||
|
|
||||||
|
/** Max. number of WHOWAS list items that can be stored. */
|
||||||
|
#define MAX_WHOWAS 64
|
||||||
|
|
||||||
|
/** Size of default connection pool. */
|
||||||
|
#define CONNECTION_POOL 100
|
||||||
|
|
||||||
|
|
||||||
|
/* Hard-coded (default) options */
|
||||||
|
|
||||||
|
/** Delay after startup before outgoing connections are initiated in seconds. */
|
||||||
|
#define STARTUP_DELAY 1
|
||||||
|
|
||||||
|
/** Time to delay re-connect attempts in seconds. */
|
||||||
|
#define RECONNECT_DELAY 3
|
||||||
|
|
||||||
|
/** Configuration file name. */
|
||||||
|
#define CONFIG_FILE "/ngircd.conf"
|
||||||
|
|
||||||
|
/** Name of the MOTD file. */
|
||||||
|
#define MOTD_FILE "/ngircd.motd"
|
||||||
|
|
||||||
|
/** Default chroot() directory. */
|
||||||
|
#define CHROOT_DIR ""
|
||||||
|
|
||||||
|
/** Default file for the process ID. */
|
||||||
|
#define PID_FILE ""
|
||||||
|
|
||||||
|
|
||||||
|
/* Sizes of "IRC elements": nicks, users, ... */
|
||||||
|
|
||||||
|
/** Max. length of an IRC ID (incl. NULL); see RFC 2812 section 1.1 and 1.2.1. */
|
||||||
|
#define CLIENT_ID_LEN 64
|
||||||
|
|
||||||
|
/** Default nick length (including NULL), see. RFC 2812 section 1.2.1. */
|
||||||
|
#define CLIENT_NICK_LEN_DEFAULT 10
|
||||||
|
|
||||||
|
/** Maximum nickname length (including NULL). */
|
||||||
|
#define CLIENT_NICK_LEN 32
|
||||||
|
|
||||||
|
/** Max. password length (including NULL). */
|
||||||
|
#define CLIENT_PASS_LEN 21
|
||||||
|
|
||||||
|
/** Max. length of user name ("login"; incl. NULL), RFC 2812, section 1.2.1. */
|
||||||
|
#ifndef STRICT_RFC
|
||||||
|
# define CLIENT_USER_LEN 20
|
||||||
|
#else
|
||||||
|
# define CLIENT_USER_LEN 10
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Max. length of "real names" (including NULL). */
|
||||||
|
#define CLIENT_NAME_LEN 32
|
||||||
|
|
||||||
|
/** Max. host name length (including NULL). */
|
||||||
|
#define CLIENT_HOST_LEN 64
|
||||||
|
|
||||||
|
/** Max. length of all client modes (including NULL). */
|
||||||
|
#define CLIENT_MODE_LEN 21
|
||||||
|
|
||||||
|
/** Max. length of server info texts (including NULL). */
|
||||||
|
#define CLIENT_INFO_LEN 64
|
||||||
|
|
||||||
|
/** Max. length of away messages (including NULL). */
|
||||||
|
#define CLIENT_AWAY_LEN 128
|
||||||
|
|
||||||
|
/** Max. length of client flags (including NULL). */
|
||||||
|
#define CLIENT_FLAGS_LEN 16
|
||||||
|
|
||||||
|
/** Max. length of a channel name (including NULL), see RFC 2812 section 1.3. */
|
||||||
|
#define CHANNEL_NAME_LEN 51
|
||||||
|
|
||||||
|
/** Max. length of channel modes (including NULL). */
|
||||||
|
#define CHANNEL_MODE_LEN 21
|
||||||
|
|
||||||
|
/** Max. IRC command length (including NULL), see. RFC 2812 section 3.2. */
|
||||||
|
#define COMMAND_LEN 513
|
||||||
|
|
||||||
|
|
||||||
|
/* Read and write buffer sizes */
|
||||||
|
|
||||||
|
/** Size of the read buffer of a connection in bytes. */
|
||||||
|
#define READBUFFER_LEN 2048
|
||||||
|
|
||||||
|
/** Size that triggers write buffer flushing if more space is needed. */
|
||||||
|
#define WRITEBUFFER_FLUSH_LEN 4096
|
||||||
|
|
||||||
|
/** Maximum size of the write buffer of a connection in bytes. */
|
||||||
|
#define WRITEBUFFER_MAX_LEN 32768
|
||||||
|
|
||||||
|
/** Maximum size of the write buffer of a server link connection in bytes. */
|
||||||
|
#define WRITEBUFFER_SLINK_LEN 65536
|
||||||
|
|
||||||
|
|
||||||
|
/* IRC/IRC+ protocol */
|
||||||
|
|
||||||
|
/** Implemented IRC protocol version, see RFC 2813 section 4.1.1. */
|
||||||
|
#define PROTOVER "0210"
|
||||||
|
|
||||||
|
/** Protocol suffix, see RFC 2813 section 4.1.1. */
|
||||||
|
#define PROTOIRC "-IRC"
|
||||||
|
|
||||||
|
/** Protocol suffix used by the IRC+ protocol, see <doc/Protocol.txt>. */
|
||||||
|
#define PROTOIRCPLUS "-IRC+"
|
||||||
|
|
||||||
|
#ifdef IRCPLUS
|
||||||
|
/** Standard IRC+ flags. */
|
||||||
|
# define IRCPLUSFLAGS "CHLMSX"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/** Supported user modes. */
|
||||||
|
#define USERMODES "abBcCioqrRswx"
|
||||||
|
|
||||||
|
/** Supported channel modes. */
|
||||||
|
#define CHANMODES "abehiIklmMnoOPqQrRstvVz"
|
||||||
|
|
||||||
|
/** Away message for users connected to linked servers. */
|
||||||
|
#define DEFAULT_AWAY_MSG "Away"
|
||||||
|
|
||||||
|
/** Default ID for "topic owner". */
|
||||||
|
#define DEFAULT_TOPIC_ID "-Server-"
|
||||||
|
|
||||||
|
/** Prefix for NOTICEs from the server to users. Some servers use '*'. */
|
||||||
|
#define NOTICE_TXTPREFIX ""
|
||||||
|
|
||||||
|
/** Suffix for oversized messages that have been shortened and cut off. */
|
||||||
|
#define CUT_TXTSUFFIX "[CUT]"
|
||||||
|
|
||||||
|
|
||||||
|
/* Defaults and limits for IRC commands */
|
||||||
|
|
||||||
|
/** Max. number of elemets allowed in channel invite and ban lists. */
|
||||||
|
#define MAX_HNDL_CHANNEL_LISTS 50
|
||||||
|
|
||||||
|
/** Max. number of channel modes with arguments per MODE command. */
|
||||||
|
#define MAX_HNDL_MODES_ARG 5
|
||||||
|
|
||||||
|
/** Max. number of WHO replies. */
|
||||||
|
#define MAX_RPL_WHO 25
|
||||||
|
|
||||||
|
/** Max. number of WHOIS replies. */
|
||||||
|
#define MAX_RPL_WHOIS 10
|
||||||
|
|
||||||
|
/** Default count of WHOWAS command replies. */
|
||||||
|
#define DEF_RPL_WHOWAS 5
|
||||||
|
|
||||||
|
/** Max count of WHOWAS command replies. */
|
||||||
|
#define MAX_RPL_WHOWAS 25
|
||||||
|
|
||||||
#define CUT_TXTSUFFIX "[CUT]" /* Suffix for oversized messages that
|
|
||||||
have been shortened and cut off. */
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
171
src/ngircd/io.c
171
src/ngircd/io.c
@@ -41,6 +41,7 @@ typedef struct {
|
|||||||
|
|
||||||
#define INIT_IOEVENT { NULL, -1, 0, NULL }
|
#define INIT_IOEVENT { NULL, -1, 0, NULL }
|
||||||
#define IO_ERROR 4
|
#define IO_ERROR 4
|
||||||
|
#define MAX_EVENTS 100
|
||||||
|
|
||||||
#ifdef HAVE_EPOLL_CREATE
|
#ifdef HAVE_EPOLL_CREATE
|
||||||
# define IO_USE_EPOLL 1
|
# define IO_USE_EPOLL 1
|
||||||
@@ -54,7 +55,7 @@ typedef struct {
|
|||||||
# ifdef HAVE_SYS_DEVPOLL_H
|
# ifdef HAVE_SYS_DEVPOLL_H
|
||||||
# define IO_USE_DEVPOLL 1
|
# define IO_USE_DEVPOLL 1
|
||||||
# else
|
# else
|
||||||
# ifdef HAVE_POLL
|
# if defined(HAVE_POLL) && defined(HAVE_POLL_H)
|
||||||
# define IO_USE_POLL 1
|
# define IO_USE_POLL 1
|
||||||
# else
|
# else
|
||||||
# ifdef HAVE_SELECT
|
# ifdef HAVE_SELECT
|
||||||
@@ -85,6 +86,20 @@ static int io_masterfd;
|
|||||||
|
|
||||||
static int io_dispatch_kqueue(struct timeval *tv);
|
static int io_dispatch_kqueue(struct timeval *tv);
|
||||||
static bool io_event_change_kqueue(int, short, const int action);
|
static bool io_event_change_kqueue(int, short, const int action);
|
||||||
|
|
||||||
|
#ifndef EV_SET
|
||||||
|
/* Taken from /usr/include/sys/event.h of FreeBSD 8.1 and required by all
|
||||||
|
* platforms that have kqueue but lack EV_SET() -- for example FreeBSD 4. */
|
||||||
|
#define EV_SET(kevp, a, b, c, d, e, f) do { \
|
||||||
|
struct kevent *__kevp__ = (kevp); \
|
||||||
|
__kevp__->ident = (a); \
|
||||||
|
__kevp__->filter = (b); \
|
||||||
|
__kevp__->flags = (c); \
|
||||||
|
__kevp__->fflags = (d); \
|
||||||
|
__kevp__->data = (e); \
|
||||||
|
__kevp__->udata = (f); \
|
||||||
|
} while(0)
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef IO_USE_POLL
|
#ifdef IO_USE_POLL
|
||||||
@@ -160,39 +175,34 @@ io_dispatch_devpoll(struct timeval *tv)
|
|||||||
{
|
{
|
||||||
struct dvpoll dvp;
|
struct dvpoll dvp;
|
||||||
time_t sec = tv->tv_sec * 1000;
|
time_t sec = tv->tv_sec * 1000;
|
||||||
int i, total, ret, timeout = tv->tv_usec + sec;
|
int i, ret, timeout = tv->tv_usec + sec;
|
||||||
short what;
|
short what;
|
||||||
struct pollfd p[100];
|
struct pollfd p[MAX_EVENTS];
|
||||||
|
|
||||||
if (timeout < 0)
|
if (timeout < 0)
|
||||||
timeout = 1000;
|
timeout = 1000;
|
||||||
|
|
||||||
total = 0;
|
dvp.dp_timeout = timeout;
|
||||||
do {
|
dvp.dp_nfds = MAX_EVENTS;
|
||||||
dvp.dp_timeout = timeout;
|
dvp.dp_fds = p;
|
||||||
dvp.dp_nfds = 100;
|
ret = ioctl(io_masterfd, DP_POLL, &dvp);
|
||||||
dvp.dp_fds = p;
|
|
||||||
ret = ioctl(io_masterfd, DP_POLL, &dvp);
|
|
||||||
total += ret;
|
|
||||||
if (ret <= 0)
|
|
||||||
return total;
|
|
||||||
for (i=0; i < ret ; i++) {
|
|
||||||
what = 0;
|
|
||||||
if (p[i].revents & (POLLIN|POLLPRI))
|
|
||||||
what = IO_WANTREAD;
|
|
||||||
|
|
||||||
if (p[i].revents & POLLOUT)
|
for (i=0; i < ret ; i++) {
|
||||||
what |= IO_WANTWRITE;
|
what = 0;
|
||||||
|
if (p[i].revents & (POLLIN|POLLPRI))
|
||||||
|
what = IO_WANTREAD;
|
||||||
|
|
||||||
if (p[i].revents && !what) {
|
if (p[i].revents & POLLOUT)
|
||||||
/* other flag is set, probably POLLERR */
|
what |= IO_WANTWRITE;
|
||||||
what = IO_ERROR;
|
|
||||||
}
|
if (p[i].revents && !what) {
|
||||||
io_docallback(p[i].fd, what);
|
/* other flag is set, probably POLLERR */
|
||||||
|
what = IO_ERROR;
|
||||||
}
|
}
|
||||||
} while (ret == 100);
|
io_docallback(p[i].fd, what);
|
||||||
|
}
|
||||||
|
|
||||||
return total;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -462,37 +472,30 @@ static int
|
|||||||
io_dispatch_epoll(struct timeval *tv)
|
io_dispatch_epoll(struct timeval *tv)
|
||||||
{
|
{
|
||||||
time_t sec = tv->tv_sec * 1000;
|
time_t sec = tv->tv_sec * 1000;
|
||||||
int i, total = 0, ret, timeout = tv->tv_usec + sec;
|
int i, ret, timeout = tv->tv_usec + sec;
|
||||||
struct epoll_event epoll_ev[100];
|
struct epoll_event epoll_ev[MAX_EVENTS];
|
||||||
short type;
|
short type;
|
||||||
|
|
||||||
if (timeout < 0)
|
if (timeout < 0)
|
||||||
timeout = 1000;
|
timeout = 1000;
|
||||||
|
|
||||||
do {
|
ret = epoll_wait(io_masterfd, epoll_ev, MAX_EVENTS, timeout);
|
||||||
ret = epoll_wait(io_masterfd, epoll_ev, 100, timeout);
|
|
||||||
total += ret;
|
|
||||||
if (ret <= 0)
|
|
||||||
return total;
|
|
||||||
|
|
||||||
for (i = 0; i < ret; i++) {
|
for (i = 0; i < ret; i++) {
|
||||||
type = 0;
|
type = 0;
|
||||||
if (epoll_ev[i].events & (EPOLLERR | EPOLLHUP))
|
if (epoll_ev[i].events & (EPOLLERR | EPOLLHUP))
|
||||||
type = IO_ERROR;
|
type = IO_ERROR;
|
||||||
|
|
||||||
if (epoll_ev[i].events & (EPOLLIN | EPOLLPRI))
|
if (epoll_ev[i].events & (EPOLLIN | EPOLLPRI))
|
||||||
type |= IO_WANTREAD;
|
type |= IO_WANTREAD;
|
||||||
|
|
||||||
if (epoll_ev[i].events & EPOLLOUT)
|
if (epoll_ev[i].events & EPOLLOUT)
|
||||||
type |= IO_WANTWRITE;
|
type |= IO_WANTWRITE;
|
||||||
|
|
||||||
io_docallback(epoll_ev[i].data.fd, type);
|
io_docallback(epoll_ev[i].data.fd, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
timeout = 0;
|
return ret;
|
||||||
} while (ret == 100);
|
|
||||||
|
|
||||||
return total;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -576,58 +579,50 @@ io_event_change_kqueue(int fd, short what, const int action)
|
|||||||
static int
|
static int
|
||||||
io_dispatch_kqueue(struct timeval *tv)
|
io_dispatch_kqueue(struct timeval *tv)
|
||||||
{
|
{
|
||||||
int i, total = 0, ret;
|
int i, ret;
|
||||||
struct kevent kev[100];
|
struct kevent kev[MAX_EVENTS];
|
||||||
struct kevent *newevents;
|
struct kevent *newevents;
|
||||||
struct timespec ts;
|
struct timespec ts;
|
||||||
int newevents_len;
|
int newevents_len;
|
||||||
ts.tv_sec = tv->tv_sec;
|
ts.tv_sec = tv->tv_sec;
|
||||||
ts.tv_nsec = tv->tv_usec * 1000;
|
ts.tv_nsec = tv->tv_usec * 1000;
|
||||||
|
|
||||||
do {
|
newevents_len = (int) array_length(&io_evcache, sizeof (struct kevent));
|
||||||
newevents_len = (int) array_length(&io_evcache, sizeof (struct kevent));
|
newevents = (newevents_len > 0) ? array_start(&io_evcache) : NULL;
|
||||||
newevents = (newevents_len > 0) ? array_start(&io_evcache) : NULL;
|
assert(newevents_len >= 0);
|
||||||
assert(newevents_len >= 0);
|
|
||||||
|
|
||||||
ret = kevent(io_masterfd, newevents, newevents_len, kev, 100, &ts);
|
ret = kevent(io_masterfd, newevents, newevents_len, kev, MAX_EVENTS, &ts);
|
||||||
if (newevents && ret != -1)
|
if (newevents && ret != -1)
|
||||||
array_trunc(&io_evcache);
|
array_trunc(&io_evcache);
|
||||||
|
|
||||||
total += ret;
|
for (i = 0; i < ret; i++) {
|
||||||
if (ret <= 0)
|
io_debug("dispatch_kqueue: fd, kev.flags", (int)kev[i].ident, kev[i].flags);
|
||||||
return total;
|
if (kev[i].flags & (EV_EOF|EV_ERROR)) {
|
||||||
|
if (kev[i].flags & EV_ERROR)
|
||||||
for (i = 0; i < ret; i++) {
|
Log(LOG_ERR, "kevent fd %d: EV_ERROR (%s)",
|
||||||
io_debug("dispatch_kqueue: fd, kev.flags", (int)kev[i].ident, kev[i].flags);
|
(int)kev[i].ident, strerror((int)kev[i].data));
|
||||||
if (kev[i].flags & (EV_EOF|EV_ERROR)) {
|
io_docallback((int)kev[i].ident, IO_ERROR);
|
||||||
if (kev[i].flags & EV_ERROR)
|
continue;
|
||||||
Log(LOG_ERR, "kevent fd %d: EV_ERROR (%s)",
|
|
||||||
(int)kev[i].ident, strerror((int)kev[i].data));
|
|
||||||
io_docallback((int)kev[i].ident, IO_ERROR);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (kev[i].filter) {
|
|
||||||
case EVFILT_READ:
|
|
||||||
io_docallback((int)kev[i].ident, IO_WANTREAD);
|
|
||||||
break;
|
|
||||||
case EVFILT_WRITE:
|
|
||||||
io_docallback((int)kev[i].ident, IO_WANTWRITE);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
LogDebug("Unknown kev.filter number %d for fd %d",
|
|
||||||
kev[i].filter, kev[i].ident);
|
|
||||||
/* Fall through */
|
|
||||||
case EV_ERROR:
|
|
||||||
io_docallback((int)kev[i].ident, IO_ERROR);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
ts.tv_sec = 0;
|
|
||||||
ts.tv_nsec = 0;
|
|
||||||
} while (ret == 100);
|
|
||||||
|
|
||||||
return total;
|
switch (kev[i].filter) {
|
||||||
|
case EVFILT_READ:
|
||||||
|
io_docallback((int)kev[i].ident, IO_WANTREAD);
|
||||||
|
break;
|
||||||
|
case EVFILT_WRITE:
|
||||||
|
io_docallback((int)kev[i].ident, IO_WANTWRITE);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
LogDebug("Unknown kev.filter number %d for fd %d",
|
||||||
|
kev[i].filter, kev[i].ident);
|
||||||
|
/* Fall through */
|
||||||
|
case EV_ERROR:
|
||||||
|
io_docallback((int)kev[i].ident, IO_ERROR);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|||||||
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- */
|
||||||
@@ -31,6 +31,7 @@
|
|||||||
#include "match.h"
|
#include "match.h"
|
||||||
#include "messages.h"
|
#include "messages.h"
|
||||||
#include "parse.h"
|
#include "parse.h"
|
||||||
|
#include "irc.h"
|
||||||
#include "irc-info.h"
|
#include "irc-info.h"
|
||||||
#include "irc-write.h"
|
#include "irc-write.h"
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
@@ -81,7 +82,7 @@ static bool
|
|||||||
join_allowed(CLIENT *Client, CHANNEL *chan, const char *channame,
|
join_allowed(CLIENT *Client, CHANNEL *chan, const char *channame,
|
||||||
const char *key)
|
const char *key)
|
||||||
{
|
{
|
||||||
bool is_invited, is_banned;
|
bool is_invited, is_banned, is_exception;
|
||||||
const char *channel_modes;
|
const char *channel_modes;
|
||||||
|
|
||||||
/* Allow IRC operators to overwrite channel limits */
|
/* Allow IRC operators to overwrite channel limits */
|
||||||
@@ -89,9 +90,10 @@ join_allowed(CLIENT *Client, CHANNEL *chan, const char *channame,
|
|||||||
return true;
|
return true;
|
||||||
|
|
||||||
is_banned = Lists_Check(Channel_GetListBans(chan), Client);
|
is_banned = Lists_Check(Channel_GetListBans(chan), Client);
|
||||||
|
is_exception = Lists_Check(Channel_GetListExcepts(chan), Client);
|
||||||
is_invited = Lists_Check(Channel_GetListInvites(chan), Client);
|
is_invited = Lists_Check(Channel_GetListInvites(chan), Client);
|
||||||
|
|
||||||
if (is_banned && !is_invited) {
|
if (is_banned && !is_invited && !is_exception) {
|
||||||
/* Client is banned from channel (and not on invite list) */
|
/* Client is banned from channel (and not on invite list) */
|
||||||
IRC_WriteStrClient(Client, ERR_BANNEDFROMCHAN_MSG,
|
IRC_WriteStrClient(Client, ERR_BANNEDFROMCHAN_MSG,
|
||||||
Client_ID(Client), channame);
|
Client_ID(Client), channame);
|
||||||
@@ -137,6 +139,13 @@ join_allowed(CLIENT *Client, CHANNEL *chan, const char *channame,
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (strchr(channel_modes, 'R') && !strchr(Client_Modes(Client), 'R')) {
|
||||||
|
/* Only registered users are allowed! */
|
||||||
|
IRC_WriteStrClient(Client, ERR_REGONLYCHANNEL_MSG,
|
||||||
|
Client_ID(Client), channame);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
} /* join_allowed */
|
} /* join_allowed */
|
||||||
|
|
||||||
@@ -158,8 +167,10 @@ join_set_channelmodes(CHANNEL *chan, CLIENT *target, const char *flags)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If channel persistent and client is ircop: make client chanop */
|
/* If the channel is persistent (+P) and client is an IRC op:
|
||||||
if (strchr(Channel_Modes(chan), 'P') && strchr(Client_Modes(target), 'o'))
|
* make client chanop, if not disabled in configuration. */
|
||||||
|
if (strchr(Channel_Modes(chan), 'P') && Conf_OperChanPAutoOp
|
||||||
|
&& strchr(Client_Modes(target), 'o'))
|
||||||
Channel_UserModeAdd(chan, target, 'o');
|
Channel_UserModeAdd(chan, target, 'o');
|
||||||
} /* join_set_channelmodes */
|
} /* join_set_channelmodes */
|
||||||
|
|
||||||
@@ -237,7 +248,7 @@ join_forward(CLIENT *Client, CLIENT *target, CHANNEL *chan,
|
|||||||
IRC_WriteStrChannelPrefix(Client, chan, target, false,
|
IRC_WriteStrChannelPrefix(Client, chan, target, false,
|
||||||
"JOIN :%s", channame);
|
"JOIN :%s", channame);
|
||||||
|
|
||||||
/* syncronize channel modes */
|
/* synchronize channel modes */
|
||||||
if (modes[1]) {
|
if (modes[1]) {
|
||||||
IRC_WriteStrChannelPrefix(Client, chan, target, false,
|
IRC_WriteStrChannelPrefix(Client, chan, target, false,
|
||||||
"MODE %s +%s %s", channame,
|
"MODE %s +%s %s", channame,
|
||||||
@@ -294,9 +305,9 @@ join_send_topic(CLIENT *Client, CLIENT *target, CHANNEL *chan,
|
|||||||
*
|
*
|
||||||
* See RFC 2812, 3.2.1 "Join message"; RFC 2813, 4.2.1 "Join message".
|
* See RFC 2812, 3.2.1 "Join message"; RFC 2813, 4.2.1 "Join message".
|
||||||
*
|
*
|
||||||
* @param Client The client from which this command has been received
|
* @param Client The client from which this command has been received
|
||||||
* @param Req Request structure with prefix and all parameters
|
* @param Req Request structure with prefix and all parameters
|
||||||
* @returns CONNECTED or DISCONNECTED
|
* @returns CONNECTED or DISCONNECTED
|
||||||
*/
|
*/
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
||||||
@@ -305,8 +316,8 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
|||||||
CLIENT *target;
|
CLIENT *target;
|
||||||
CHANNEL *chan;
|
CHANNEL *chan;
|
||||||
|
|
||||||
assert( Client != NULL );
|
assert (Client != NULL);
|
||||||
assert( Req != NULL );
|
assert (Req != NULL);
|
||||||
|
|
||||||
/* Bad number of arguments? */
|
/* Bad number of arguments? */
|
||||||
if (Req->argc < 1 || Req->argc > 2)
|
if (Req->argc < 1 || Req->argc > 2)
|
||||||
@@ -320,7 +331,8 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
|||||||
target = Client;
|
target = Client;
|
||||||
|
|
||||||
if (!target)
|
if (!target)
|
||||||
return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, Client_ID(Client), Req->prefix);
|
return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG,
|
||||||
|
Client_ID(Client), Req->prefix);
|
||||||
|
|
||||||
/* Is argument "0"? */
|
/* Is argument "0"? */
|
||||||
if (Req->argc == 1 && !strncmp("0", Req->argv[0], 2))
|
if (Req->argc == 1 && !strncmp("0", Req->argv[0], 2))
|
||||||
@@ -352,24 +364,35 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
|||||||
|
|
||||||
chan = Channel_Search(channame);
|
chan = Channel_Search(channame);
|
||||||
if (!chan && Conf_PredefChannelsOnly) {
|
if (!chan && Conf_PredefChannelsOnly) {
|
||||||
/* channel must be created, but server does not allow this */
|
/* channel must be created, but forbidden by config */
|
||||||
IRC_WriteStrClient(Client, ERR_BANNEDFROMCHAN_MSG, Client_ID(Client), channame);
|
IRC_WriteStrClient(Client, ERR_NOSUCHCHANNEL_MSG,
|
||||||
break;
|
Client_ID(Client), channame);
|
||||||
|
goto join_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Local client? */
|
/* Local client? */
|
||||||
if (Client_Type(Client) == CLIENT_USER) {
|
if (Client_Type(Client) == CLIENT_USER) {
|
||||||
|
if (chan) {
|
||||||
|
/* Already existing channel: already member? */
|
||||||
|
if (Channel_IsMemberOf(chan, Client))
|
||||||
|
goto join_next;
|
||||||
|
}
|
||||||
|
|
||||||
/* Test if the user has reached the channel limit */
|
/* Test if the user has reached the channel limit */
|
||||||
if ((Conf_MaxJoins > 0) &&
|
if ((Conf_MaxJoins > 0) &&
|
||||||
(Channel_CountForUser(Client) >= Conf_MaxJoins))
|
(Channel_CountForUser(Client) >= Conf_MaxJoins)) {
|
||||||
return IRC_WriteStrClient(Client,
|
if (!IRC_WriteStrClient(Client,
|
||||||
ERR_TOOMANYCHANNELS_MSG,
|
ERR_TOOMANYCHANNELS_MSG,
|
||||||
Client_ID(Client), channame);
|
Client_ID(Client), channame))
|
||||||
|
return DISCONNECTED;
|
||||||
|
goto join_next;
|
||||||
|
}
|
||||||
|
|
||||||
if (chan) {
|
if (chan) {
|
||||||
/* Already existing channel: check if the
|
/* Already existing channel: check if the
|
||||||
* client is allowed to join */
|
* client is allowed to join */
|
||||||
if (!join_allowed(Client, chan, channame, key))
|
if (!join_allowed(Client, chan, channame, key))
|
||||||
break;
|
goto join_next;
|
||||||
} else {
|
} else {
|
||||||
/* New channel: first user will become channel
|
/* New channel: first user will become channel
|
||||||
* operator unless this is a modeless channel */
|
* operator unless this is a modeless channel */
|
||||||
@@ -392,7 +415,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
|||||||
|
|
||||||
/* Join channel (and create channel if it doesn't exist) */
|
/* Join channel (and create channel if it doesn't exist) */
|
||||||
if (!Channel_Join(target, channame))
|
if (!Channel_Join(target, channame))
|
||||||
break;
|
goto join_next;
|
||||||
|
|
||||||
if (!chan) { /* channel is new; it has been created above */
|
if (!chan) { /* channel is new; it has been created above */
|
||||||
chan = Channel_Search(channame);
|
chan = Channel_Search(channame);
|
||||||
@@ -411,6 +434,7 @@ IRC_JOIN( CLIENT *Client, REQUEST *Req )
|
|||||||
if (!join_send_topic(Client, target, chan, channame))
|
if (!join_send_topic(Client, target, chan, channame))
|
||||||
break; /* write error */
|
break; /* write error */
|
||||||
|
|
||||||
|
join_next:
|
||||||
/* next channel? */
|
/* next channel? */
|
||||||
channame = strtok_r(NULL, ",", &lastchan);
|
channame = strtok_r(NULL, ",", &lastchan);
|
||||||
if (channame && key)
|
if (channame && key)
|
||||||
@@ -488,7 +512,7 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
|
|||||||
CHANNEL *chan;
|
CHANNEL *chan;
|
||||||
CLIENT *from;
|
CLIENT *from;
|
||||||
char *topic;
|
char *topic;
|
||||||
bool onchannel, topicok, use_servermode, r;
|
bool r, topic_power;
|
||||||
|
|
||||||
assert( Client != NULL );
|
assert( Client != NULL );
|
||||||
assert( Req != NULL );
|
assert( Req != NULL );
|
||||||
@@ -511,12 +535,17 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
|
|||||||
return IRC_WriteStrClient(from, ERR_NOSUCHCHANNEL_MSG,
|
return IRC_WriteStrClient(from, ERR_NOSUCHCHANNEL_MSG,
|
||||||
Client_ID(from), Req->argv[0]);
|
Client_ID(from), Req->argv[0]);
|
||||||
|
|
||||||
Channel_CheckAdminRights(chan, Client, from,
|
/* Only remote servers and channel members are allowed to change the
|
||||||
&onchannel, &topicok, &use_servermode);
|
* channel topic, and IRC opreators when the Conf_OperCanMode option
|
||||||
|
* is set in the server configuration. */
|
||||||
if (!onchannel && !topicok)
|
if (Client_Type(Client) != CLIENT_SERVER) {
|
||||||
return IRC_WriteStrClient(from, ERR_NOTONCHANNEL_MSG,
|
topic_power = Client_HasMode(from, 'o');
|
||||||
Client_ID(from), Req->argv[0]);
|
if (!Channel_IsMemberOf(chan, from)
|
||||||
|
&& !(Conf_OperCanMode && topic_power))
|
||||||
|
return IRC_WriteStrClient(from, ERR_NOTONCHANNEL_MSG,
|
||||||
|
Client_ID(from), Req->argv[0]);
|
||||||
|
} else
|
||||||
|
topic_power = true;
|
||||||
|
|
||||||
if (Req->argc == 1) {
|
if (Req->argc == 1) {
|
||||||
/* Request actual topic */
|
/* Request actual topic */
|
||||||
@@ -543,8 +572,12 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (strchr(Channel_Modes(chan), 't')) {
|
if (strchr(Channel_Modes(chan), 't')) {
|
||||||
/* Topic Lock. Is the user a channel or IRC operator? */
|
/* Topic Lock. Is the user a channel op or IRC operator? */
|
||||||
if (!topicok)
|
if(!topic_power &&
|
||||||
|
!strchr(Channel_UserModes(chan, from), 'h') &&
|
||||||
|
!strchr(Channel_UserModes(chan, from), 'o') &&
|
||||||
|
!strchr(Channel_UserModes(chan, from), 'a') &&
|
||||||
|
!strchr(Channel_UserModes(chan, from), 'q'))
|
||||||
return IRC_WriteStrClient(from, ERR_CHANOPRIVSNEEDED_MSG,
|
return IRC_WriteStrClient(from, ERR_CHANOPRIVSNEEDED_MSG,
|
||||||
Client_ID(from),
|
Client_ID(from),
|
||||||
Channel_Name(chan));
|
Channel_Name(chan));
|
||||||
@@ -556,7 +589,7 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
|
|||||||
Client_TypeText(from), Client_Mask(from), Channel_Name(chan),
|
Client_TypeText(from), Client_Mask(from), Channel_Name(chan),
|
||||||
Req->argv[1][0] ? Req->argv[1] : "<none>");
|
Req->argv[1][0] ? Req->argv[1] : "<none>");
|
||||||
|
|
||||||
if (use_servermode)
|
if (Conf_OperServerMode)
|
||||||
from = Client_ThisServer();
|
from = Client_ThisServer();
|
||||||
|
|
||||||
/* Update channel and forward new topic to other servers */
|
/* Update channel and forward new topic to other servers */
|
||||||
@@ -582,9 +615,9 @@ IRC_TOPIC( CLIENT *Client, REQUEST *Req )
|
|||||||
* This implementation handles the local case as well as the forwarding of the
|
* This implementation handles the local case as well as the forwarding of the
|
||||||
* LIST command to other servers in the IRC network.
|
* LIST command to other servers in the IRC network.
|
||||||
*
|
*
|
||||||
* @param Client The client from which this command has been received
|
* @param Client The client from which this command has been received.
|
||||||
* @param Req Request structure with prefix and all parameters
|
* @param Req Request structure with prefix and all parameters.
|
||||||
* @returns CONNECTED or DISCONNECTED
|
* @return CONNECTED or DISCONNECTED.
|
||||||
*/
|
*/
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_LIST( CLIENT *Client, REQUEST *Req )
|
IRC_LIST( CLIENT *Client, REQUEST *Req )
|
||||||
@@ -592,79 +625,86 @@ IRC_LIST( CLIENT *Client, REQUEST *Req )
|
|||||||
char *pattern;
|
char *pattern;
|
||||||
CHANNEL *chan;
|
CHANNEL *chan;
|
||||||
CLIENT *from, *target;
|
CLIENT *from, *target;
|
||||||
|
int count = 0;
|
||||||
|
|
||||||
assert( Client != NULL );
|
assert(Client != NULL);
|
||||||
assert( Req != NULL );
|
assert(Req != NULL);
|
||||||
|
|
||||||
/* Bad number of prameters? */
|
/* Bad number of prameters? */
|
||||||
if( Req->argc > 2 )
|
if (Req->argc > 2)
|
||||||
return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG,
|
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||||
Client_ID( Client ), Req->command );
|
Client_ID(Client), Req->command);
|
||||||
|
|
||||||
if( Req->argc > 0 )
|
if (Req->argc > 0)
|
||||||
pattern = strtok( Req->argv[0], "," );
|
pattern = strtok(Req->argv[0], ",");
|
||||||
else
|
else
|
||||||
pattern = "*";
|
pattern = "*";
|
||||||
|
|
||||||
/* Get sender from prefix, if any */
|
/* Get sender from prefix, if any */
|
||||||
if( Client_Type( Client ) == CLIENT_SERVER )
|
if (Client_Type(Client) == CLIENT_SERVER)
|
||||||
from = Client_Search( Req->prefix );
|
from = Client_Search(Req->prefix);
|
||||||
else
|
else
|
||||||
from = Client;
|
from = Client;
|
||||||
|
|
||||||
if( ! from )
|
if (!from)
|
||||||
return IRC_WriteStrClient( Client, ERR_NOSUCHSERVER_MSG,
|
return IRC_WriteStrClient(Client, ERR_NOSUCHSERVER_MSG,
|
||||||
Client_ID( Client ), Req->prefix );
|
Client_ID(Client), Req->prefix);
|
||||||
|
|
||||||
if( Req->argc == 2 )
|
if (Req->argc == 2) {
|
||||||
{
|
|
||||||
/* Forward to other server? */
|
/* Forward to other server? */
|
||||||
target = Client_Search( Req->argv[1] );
|
target = Client_Search(Req->argv[1]);
|
||||||
if(( ! target ) || ( Client_Type( target ) != CLIENT_SERVER ))
|
if (! target || Client_Type(target) != CLIENT_SERVER)
|
||||||
return IRC_WriteStrClient( from, ERR_NOSUCHSERVER_MSG,
|
return IRC_WriteStrClient(from, ERR_NOSUCHSERVER_MSG,
|
||||||
Client_ID( Client ), Req->argv[1] );
|
Client_ID(Client),
|
||||||
|
Req->argv[1]);
|
||||||
|
|
||||||
if( target != Client_ThisServer( ))
|
if (target != Client_ThisServer()) {
|
||||||
{
|
|
||||||
/* Target is indeed an other server, forward it! */
|
/* Target is indeed an other server, forward it! */
|
||||||
return IRC_WriteStrClientPrefix( target, from,
|
return IRC_WriteStrClientPrefix(target, from,
|
||||||
"LIST %s :%s", Client_ID( from ),
|
"LIST %s :%s",
|
||||||
Req->argv[1] );
|
Req->argv[0],
|
||||||
|
Req->argv[1]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
while( pattern )
|
while (pattern) {
|
||||||
{
|
|
||||||
/* Loop through all the channels */
|
/* Loop through all the channels */
|
||||||
chan = Channel_First( );
|
if (Req->argc > 0)
|
||||||
while( chan )
|
ngt_LowerStr(pattern);
|
||||||
{
|
chan = Channel_First();
|
||||||
|
while (chan) {
|
||||||
/* Check search pattern */
|
/* Check search pattern */
|
||||||
if( Match( pattern, Channel_Name( chan )))
|
if (MatchCaseInsensitive(pattern, Channel_Name(chan))) {
|
||||||
{
|
|
||||||
/* Gotcha! */
|
/* Gotcha! */
|
||||||
if( ! strchr( Channel_Modes( chan ), 's' ) ||
|
if (!strchr(Channel_Modes(chan), 's')
|
||||||
Channel_IsMemberOf( chan, from ))
|
|| Channel_IsMemberOf(chan, from)
|
||||||
{
|
|| (!Conf_MorePrivacy && Client_OperByMe(Client))) {
|
||||||
if( ! IRC_WriteStrClient( from,
|
if ((Conf_MaxListSize > 0)
|
||||||
RPL_LIST_MSG, Client_ID( from ),
|
&& IRC_CheckListTooBig(from, count,
|
||||||
Channel_Name( chan ),
|
Conf_MaxListSize,
|
||||||
Channel_MemberCount( chan ),
|
"LIST"))
|
||||||
Channel_Topic( chan )))
|
break;
|
||||||
|
if (!IRC_WriteStrClient(from,
|
||||||
|
RPL_LIST_MSG, Client_ID(from),
|
||||||
|
Channel_Name(chan),
|
||||||
|
Channel_MemberCount(chan),
|
||||||
|
Channel_Topic( chan )))
|
||||||
return DISCONNECTED;
|
return DISCONNECTED;
|
||||||
|
count++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
chan = Channel_Next( chan );
|
chan = Channel_Next(chan);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get next name ... */
|
/* Get next name ... */
|
||||||
if( Req->argc > 0 )
|
if(Req->argc > 0)
|
||||||
pattern = strtok( NULL, "," );
|
pattern = strtok(NULL, ",");
|
||||||
else
|
else
|
||||||
pattern = NULL;
|
pattern = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return IRC_WriteStrClient( from, RPL_LISTEND_MSG, Client_ID( from ));
|
IRC_SetPenalty(from, 2);
|
||||||
|
return IRC_WriteStrClient(from, RPL_LISTEND_MSG, Client_ID(from));
|
||||||
} /* IRC_LIST */
|
} /* IRC_LIST */
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
68
src/ngircd/irc-encoding.c
Normal file
68
src/ngircd/irc-encoding.c
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
* 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
|
||||||
|
* IRC encoding commands
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "imp.h"
|
||||||
|
#include <assert.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "conn-func.h"
|
||||||
|
#include "channel.h"
|
||||||
|
#include "conn-encoding.h"
|
||||||
|
#include "irc-write.h"
|
||||||
|
#include "messages.h"
|
||||||
|
#include "parse.h"
|
||||||
|
#include "tool.h"
|
||||||
|
|
||||||
|
#include "exp.h"
|
||||||
|
#include "irc-encoding.h"
|
||||||
|
|
||||||
|
#ifdef ICONV
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for the IRC+ "CHARCONV" 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_CHARCONV(CLIENT *Client, REQUEST *Req)
|
||||||
|
{
|
||||||
|
char encoding[20];
|
||||||
|
|
||||||
|
assert (Client != NULL);
|
||||||
|
assert (Req != NULL);
|
||||||
|
|
||||||
|
if (Req->argc != 1)
|
||||||
|
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||||
|
Client_ID(Client), Req->command);
|
||||||
|
|
||||||
|
strlcpy(encoding, Req->argv[0], sizeof(encoding));
|
||||||
|
ngt_UpperStr(encoding);
|
||||||
|
|
||||||
|
if (!Conn_SetEncoding(Client_Conn(Client), encoding))
|
||||||
|
return IRC_WriteStrClient(Client, ERR_IP_CHARCONV_MSG,
|
||||||
|
Client_ID(Client), encoding);
|
||||||
|
|
||||||
|
return IRC_WriteStrClient(Client, RPL_IP_CHARCONV_MSG,
|
||||||
|
Client_ID(Client), encoding);
|
||||||
|
} /* IRC_CHARCONV */
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* -eof- */
|
||||||
24
src/ngircd/irc-encoding.h
Normal file
24
src/ngircd/irc-encoding.h
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* 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 __irc_encoding_h__
|
||||||
|
#define __irc_encoding_h__
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* IRC encoding commands (header)
|
||||||
|
*/
|
||||||
|
|
||||||
|
GLOBAL bool IRC_CHARCONV PARAMS((CLIENT *Client, REQUEST *Req));
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* -eof- */
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2010 Alexander Barton (alex@barton.de)
|
* Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -18,21 +18,18 @@
|
|||||||
|
|
||||||
#include "imp.h"
|
#include "imp.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdio.h>
|
#include <ctype.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <strings.h>
|
#include <strings.h>
|
||||||
#include <signal.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include "ngircd.h"
|
|
||||||
#include "conn-func.h"
|
#include "conn-func.h"
|
||||||
|
#include "class.h"
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
#include "io.h"
|
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
#include "login.h"
|
||||||
#include "messages.h"
|
#include "messages.h"
|
||||||
#include "pam.h"
|
|
||||||
#include "parse.h"
|
#include "parse.h"
|
||||||
#include "irc.h"
|
#include "irc.h"
|
||||||
#include "irc-info.h"
|
#include "irc-info.h"
|
||||||
@@ -41,19 +38,10 @@
|
|||||||
#include "exp.h"
|
#include "exp.h"
|
||||||
#include "irc-login.h"
|
#include "irc-login.h"
|
||||||
|
|
||||||
|
static void Kill_Nick PARAMS((char *Nick, char *Reason));
|
||||||
|
static void Change_Nick PARAMS((CLIENT * Origin, CLIENT * Target, char *NewNick,
|
||||||
|
bool InformClient));
|
||||||
|
|
||||||
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 Reject_Client PARAMS((CLIENT *Client));
|
|
||||||
|
|
||||||
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.
|
* Handler for the IRC "PASS" command.
|
||||||
@@ -103,7 +91,7 @@ IRC_PASS( CLIENT *Client, REQUEST *Req )
|
|||||||
Client_ID(Client));
|
Client_ID(Client));
|
||||||
}
|
}
|
||||||
|
|
||||||
Client_SetPassword(Client, Req->argv[0]);
|
Conn_SetPassword(Client_Conn(Client), Req->argv[0]);
|
||||||
|
|
||||||
/* Protocol version */
|
/* Protocol version */
|
||||||
if (Req->argc >= 2 && strlen(Req->argv[1]) >= 4) {
|
if (Req->argc >= 2 && strlen(Req->argv[1]) >= 4) {
|
||||||
@@ -285,45 +273,14 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
|
|||||||
/* If we received a valid USER command already then
|
/* If we received a valid USER command already then
|
||||||
* register the new client! */
|
* register the new client! */
|
||||||
if( Client_Type( Client ) == CLIENT_GOTUSER )
|
if( Client_Type( Client ) == CLIENT_GOTUSER )
|
||||||
return Hello_User( Client );
|
return Login_User( Client );
|
||||||
else
|
else
|
||||||
Client_SetType( Client, CLIENT_GOTNICK );
|
Client_SetType( Client, CLIENT_GOTNICK );
|
||||||
} else {
|
} else {
|
||||||
/* Nickname change */
|
/* Nickname change */
|
||||||
if (Client_Conn(target) > NONE) {
|
Change_Nick(Client, target, Req->argv[0],
|
||||||
/* Local client */
|
Client_Type(Client) == CLIENT_USER ? true : false);
|
||||||
Log(LOG_INFO,
|
IRC_SetPenalty(target, 2);
|
||||||
"%s \"%s\" changed nick (connection %d): \"%s\" -> \"%s\".",
|
|
||||||
Client_TypeText(target), Client_Mask(target),
|
|
||||||
Client_Conn(target), Client_ID(target),
|
|
||||||
Req->argv[0]);
|
|
||||||
Conn_UpdateIdle(Client_Conn(target));
|
|
||||||
} else {
|
|
||||||
/* Remote client */
|
|
||||||
LogDebug("%s \"%s\" changed nick: \"%s\" -> \"%s\".",
|
|
||||||
Client_TypeText(target),
|
|
||||||
Client_Mask(target), Client_ID(target),
|
|
||||||
Req->argv[0]);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Inform all users and servers (which have to know)
|
|
||||||
* of this nickname change */
|
|
||||||
if( Client_Type( Client ) == CLIENT_USER )
|
|
||||||
IRC_WriteStrClientPrefix( Client, Client,
|
|
||||||
"NICK :%s",
|
|
||||||
Req->argv[0] );
|
|
||||||
IRC_WriteStrServersPrefix( Client, target,
|
|
||||||
"NICK :%s", Req->argv[0] );
|
|
||||||
IRC_WriteStrRelatedPrefix( target, target, false,
|
|
||||||
"NICK :%s", Req->argv[0] );
|
|
||||||
|
|
||||||
/* Register old nickname for WHOWAS queries */
|
|
||||||
Client_RegisterWhowas( target );
|
|
||||||
|
|
||||||
/* Save new nickname */
|
|
||||||
Client_SetID( target, Req->argv[0] );
|
|
||||||
|
|
||||||
IRC_SetPenalty( target, 2 );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return CONNECTED;
|
return CONNECTED;
|
||||||
@@ -395,7 +352,7 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
|
|||||||
Client_Mask(c));
|
Client_Mask(c));
|
||||||
Client_SetType(c, CLIENT_GOTNICK);
|
Client_SetType(c, CLIENT_GOTNICK);
|
||||||
} else
|
} else
|
||||||
Introduce_Client(Client, c, CLIENT_USER);
|
Client_Introduce(Client, c, CLIENT_USER);
|
||||||
|
|
||||||
return CONNECTED;
|
return CONNECTED;
|
||||||
}
|
}
|
||||||
@@ -403,6 +360,54 @@ IRC_NICK( CLIENT *Client, REQUEST *Req )
|
|||||||
} /* IRC_NICK */
|
} /* IRC_NICK */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for the IRC "SVSNICK" command.
|
||||||
|
*
|
||||||
|
* @param Client The client from which this command has been received.
|
||||||
|
* @param Req Request structure with prefix and all parameters.
|
||||||
|
* @return CONNECTED or DISCONNECTED.
|
||||||
|
*/
|
||||||
|
GLOBAL bool
|
||||||
|
IRC_SVSNICK(CLIENT *Client, REQUEST *Req)
|
||||||
|
{
|
||||||
|
CLIENT *from, *target;
|
||||||
|
|
||||||
|
assert(Client != NULL);
|
||||||
|
assert(Req != NULL);
|
||||||
|
|
||||||
|
if (Req->argc != 2)
|
||||||
|
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||||
|
Client_ID(Client), Req->command);
|
||||||
|
|
||||||
|
/* Search the originator */
|
||||||
|
from = Client_Search(Req->prefix);
|
||||||
|
if (!from)
|
||||||
|
from = Client;
|
||||||
|
|
||||||
|
/* Search the target */
|
||||||
|
target = Client_Search(Req->argv[0]);
|
||||||
|
if (!target || Client_Type(target) != CLIENT_USER) {
|
||||||
|
return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG,
|
||||||
|
Client_ID(Client), Req->argv[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Client_Conn(target) <= NONE) {
|
||||||
|
/* We have to forward the message to the server handling
|
||||||
|
* this user; this is required to make sure all servers
|
||||||
|
* in the network do follow the nick name change! */
|
||||||
|
return IRC_WriteStrClientPrefix(Client_NextHop(target), from,
|
||||||
|
"SVSNICK %s %s",
|
||||||
|
Req->argv[0], Req->argv[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Make sure that the new nickname is valid */
|
||||||
|
if (!Client_CheckNick(from, Req->argv[1]))
|
||||||
|
return CONNECTED;
|
||||||
|
|
||||||
|
Change_Nick(from, target, Req->argv[1], true);
|
||||||
|
return CONNECTED;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handler for the IRC "USER" command.
|
* Handler for the IRC "USER" command.
|
||||||
*
|
*
|
||||||
@@ -416,9 +421,7 @@ GLOBAL bool
|
|||||||
IRC_USER(CLIENT * Client, REQUEST * Req)
|
IRC_USER(CLIENT * Client, REQUEST * Req)
|
||||||
{
|
{
|
||||||
CLIENT *c;
|
CLIENT *c;
|
||||||
#ifdef IDENTAUTH
|
|
||||||
char *ptr;
|
char *ptr;
|
||||||
#endif
|
|
||||||
|
|
||||||
assert(Client != NULL);
|
assert(Client != NULL);
|
||||||
assert(Req != NULL);
|
assert(Req != NULL);
|
||||||
@@ -436,7 +439,20 @@ IRC_USER(CLIENT * Client, REQUEST * Req)
|
|||||||
Client_ID(Client),
|
Client_ID(Client),
|
||||||
Req->command);
|
Req->command);
|
||||||
|
|
||||||
/* User name */
|
/* User name: only alphanumeric characters and limited
|
||||||
|
punctuation is allowed.*/
|
||||||
|
ptr = Req->argv[0];
|
||||||
|
while (*ptr) {
|
||||||
|
if (!isalnum((int)*ptr) &&
|
||||||
|
*ptr != '+' && *ptr != '-' &&
|
||||||
|
*ptr != '.' && *ptr != '_') {
|
||||||
|
Conn_Close(Client_Conn(Client), NULL,
|
||||||
|
"Invalid user name", true);
|
||||||
|
return DISCONNECTED;
|
||||||
|
}
|
||||||
|
ptr++;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef IDENTAUTH
|
#ifdef IDENTAUTH
|
||||||
ptr = Client_User(Client);
|
ptr = Client_User(Client);
|
||||||
if (!ptr || !*ptr || *ptr == '~')
|
if (!ptr || !*ptr || *ptr == '~')
|
||||||
@@ -457,7 +473,7 @@ IRC_USER(CLIENT * Client, REQUEST * Req)
|
|||||||
LogDebug("Connection %d: got valid USER command ...",
|
LogDebug("Connection %d: got valid USER command ...",
|
||||||
Client_Conn(Client));
|
Client_Conn(Client));
|
||||||
if (Client_Type(Client) == CLIENT_GOTNICK)
|
if (Client_Type(Client) == CLIENT_GOTNICK)
|
||||||
return Hello_User(Client);
|
return Login_User(Client);
|
||||||
else
|
else
|
||||||
Client_SetType(Client, CLIENT_GOTUSER);
|
Client_SetType(Client, CLIENT_GOTUSER);
|
||||||
return CONNECTED;
|
return CONNECTED;
|
||||||
@@ -487,7 +503,7 @@ IRC_USER(CLIENT * Client, REQUEST * Req)
|
|||||||
/* RFC 1459 style user registration?
|
/* RFC 1459 style user registration?
|
||||||
* Introduce client to network: */
|
* Introduce client to network: */
|
||||||
if (Client_Type(c) == CLIENT_GOTNICK)
|
if (Client_Type(c) == CLIENT_GOTNICK)
|
||||||
Introduce_Client(Client, c, CLIENT_USER);
|
Client_Introduce(Client, c, CLIENT_USER);
|
||||||
|
|
||||||
return CONNECTED;
|
return CONNECTED;
|
||||||
} else if (Client_Type(Client) == CLIENT_USER) {
|
} else if (Client_Type(Client) == CLIENT_USER) {
|
||||||
@@ -550,10 +566,10 @@ IRC_SERVICE(CLIENT *Client, REQUEST *Req)
|
|||||||
hops = atoi(Req->argv[4]);
|
hops = atoi(Req->argv[4]);
|
||||||
info = Req->argv[5];
|
info = Req->argv[5];
|
||||||
|
|
||||||
/* Validate service name ("nick name") */
|
/* Validate service name ("nickname") */
|
||||||
c = Client_Search(nick);
|
c = Client_Search(nick);
|
||||||
if(c) {
|
if(c) {
|
||||||
/* Nick name collission: disconnect (KILL) both clients! */
|
/* Nickname collission: disconnect (KILL) both clients! */
|
||||||
Log(LOG_ERR, "Server %s introduces already registered service \"%s\"!",
|
Log(LOG_ERR, "Server %s introduces already registered service \"%s\"!",
|
||||||
Client_ID(Client), nick);
|
Client_ID(Client), nick);
|
||||||
Kill_Nick(nick, "Nick collision");
|
Kill_Nick(nick, "Nick collision");
|
||||||
@@ -601,7 +617,7 @@ IRC_SERVICE(CLIENT *Client, REQUEST *Req)
|
|||||||
return CONNECTED;
|
return CONNECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
Introduce_Client(Client, c, CLIENT_SERVICE);
|
Client_Introduce(Client, c, CLIENT_SERVICE);
|
||||||
return CONNECTED;
|
return CONNECTED;
|
||||||
} /* IRC_SERVICE */
|
} /* IRC_SERVICE */
|
||||||
|
|
||||||
@@ -653,32 +669,37 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req )
|
|||||||
CLIENT *target;
|
CLIENT *target;
|
||||||
char quitmsg[LINE_LEN];
|
char quitmsg[LINE_LEN];
|
||||||
|
|
||||||
assert( Client != NULL );
|
assert(Client != NULL);
|
||||||
assert( Req != NULL );
|
assert(Req != NULL);
|
||||||
|
|
||||||
/* Wrong number of arguments? */
|
/* Wrong number of arguments? */
|
||||||
if( Req->argc > 1 )
|
if (Req->argc > 1)
|
||||||
return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||||
|
Client_ID(Client), Req->command);
|
||||||
|
|
||||||
if (Req->argc == 1)
|
if (Req->argc == 1)
|
||||||
strlcpy(quitmsg, Req->argv[0], sizeof quitmsg);
|
strlcpy(quitmsg, Req->argv[0], sizeof quitmsg);
|
||||||
|
|
||||||
if ( Client_Type( Client ) == CLIENT_SERVER )
|
if (Client_Type(Client) == CLIENT_SERVER) {
|
||||||
{
|
|
||||||
/* Server */
|
/* Server */
|
||||||
target = Client_Search( Req->prefix );
|
target = Client_Search(Req->prefix);
|
||||||
if( ! target )
|
if (!target) {
|
||||||
{
|
Log(LOG_WARNING,
|
||||||
Log( LOG_WARNING, "Got QUIT from %s for unknown client!?", Client_ID( Client ));
|
"Got QUIT from %s for unknown client!?",
|
||||||
|
Client_ID(Client));
|
||||||
return CONNECTED;
|
return CONNECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
Client_Destroy( target, "Got QUIT command.", Req->argc == 1 ? quitmsg : NULL, true);
|
if (target != Client) {
|
||||||
|
Client_Destroy(target, "Got QUIT command.",
|
||||||
return CONNECTED;
|
Req->argc == 1 ? quitmsg : NULL, true);
|
||||||
}
|
return CONNECTED;
|
||||||
else
|
} else {
|
||||||
{
|
Conn_Close(Client_Conn(Client), "Got QUIT command.",
|
||||||
|
Req->argc == 1 ? quitmsg : NULL, true);
|
||||||
|
return DISCONNECTED;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
if (Req->argc == 1 && quitmsg[0] != '\"') {
|
if (Req->argc == 1 && quitmsg[0] != '\"') {
|
||||||
/* " " to avoid confusion */
|
/* " " to avoid confusion */
|
||||||
strlcpy(quitmsg, "\"", sizeof quitmsg);
|
strlcpy(quitmsg, "\"", sizeof quitmsg);
|
||||||
@@ -687,7 +708,8 @@ IRC_QUIT( CLIENT *Client, REQUEST *Req )
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* User, Service, or not yet registered */
|
/* User, Service, or not yet registered */
|
||||||
Conn_Close( Client_Conn( Client ), "Got QUIT command.", Req->argc == 1 ? quitmsg : NULL, true);
|
Conn_Close(Client_Conn(Client), "Got QUIT command.",
|
||||||
|
Req->argc == 1 ? quitmsg : NULL, true);
|
||||||
|
|
||||||
return DISCONNECTED;
|
return DISCONNECTED;
|
||||||
}
|
}
|
||||||
@@ -874,7 +896,7 @@ IRC_PONG(CLIENT *Client, REQUEST *Req)
|
|||||||
if (auth_ping == atoi(Req->argv[0])) {
|
if (auth_ping == atoi(Req->argv[0])) {
|
||||||
Conn_SetAuthPing(conn, 0);
|
Conn_SetAuthPing(conn, 0);
|
||||||
if (Client_Type(Client) == CLIENT_WAITAUTHPING)
|
if (Client_Type(Client) == CLIENT_WAITAUTHPING)
|
||||||
Hello_User(Client);
|
Login_User(Client);
|
||||||
} else
|
} else
|
||||||
if (!IRC_WriteStrClient(Client,
|
if (!IRC_WriteStrClient(Client,
|
||||||
"To connect, type /QUOTE PONG %ld",
|
"To connect, type /QUOTE PONG %ld",
|
||||||
@@ -883,327 +905,84 @@ IRC_PONG(CLIENT *Client, REQUEST *Req)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DEBUG
|
if (Client_Type(Client) == CLIENT_SERVER && Conn_LastPing(conn) == 0) {
|
||||||
if (conn > NONE)
|
Log(LOG_INFO,
|
||||||
Log(LOG_DEBUG,
|
"Synchronization with \"%s\" done (connection %d): %ld seconds [%ld users, %ld channels]",
|
||||||
"Connection %d: received PONG. Lag: %ld seconds.", conn,
|
Client_ID(Client), conn, time(NULL) - Conn_GetSignon(conn),
|
||||||
time(NULL) - Conn_LastPing(Client_Conn(Client)));
|
Client_UserCount(), Channel_CountVisible(NULL));
|
||||||
else
|
Conn_UpdatePing(conn);
|
||||||
Log(LOG_DEBUG,
|
} else
|
||||||
"Connection %d: received PONG.", conn);
|
LogDebug("Connection %d: received PONG. Lag: %ld seconds.",
|
||||||
#endif
|
conn, time(NULL) - Conn_LastPing(conn));
|
||||||
|
|
||||||
return CONNECTED;
|
return CONNECTED;
|
||||||
} /* IRC_PONG */
|
} /* IRC_PONG */
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initiate client registration.
|
* Kill all users with a specific nickname in the network.
|
||||||
*
|
*
|
||||||
* This function is called after the daemon received the required NICK and
|
* @param Nick Nickname.
|
||||||
* 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);
|
|
||||||
Reject_Client(Client);
|
|
||||||
return DISCONNECTED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 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");
|
|
||||||
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! */
|
|
||||||
Reject_Client(Client);
|
|
||||||
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));
|
|
||||||
if (len == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (len != sizeof(result)) {
|
|
||||||
Log(LOG_CRIT, "Auth: Got malformed result!");
|
|
||||||
Reject_Client(client);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result == true) {
|
|
||||||
Client_SetUser(client, Client_OrigUser(client), true);
|
|
||||||
(void)Hello_User_PostAuth(client);
|
|
||||||
} else
|
|
||||||
Reject_Client(client);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reject a client because of wrong password.
|
|
||||||
*
|
|
||||||
* This function is called either when the global server password or a password
|
|
||||||
* checked using PAM has been wrong.
|
|
||||||
*
|
|
||||||
* @param Client The client to reject.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
Reject_Client(CLIENT *Client)
|
|
||||||
{
|
|
||||||
Log(LOG_ERR,
|
|
||||||
"User \"%s\" rejected (connection %d): Access denied!",
|
|
||||||
Client_Mask(Client), Client_Conn(Client));
|
|
||||||
Conn_Close(Client_Conn(Client), NULL,
|
|
||||||
"Access denied! Bad password?", true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 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)
|
|
||||||
{
|
|
||||||
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.
|
|
||||||
*
|
|
||||||
* @param Nick Nick name.
|
|
||||||
* @param Reason Reason for the KILL.
|
* @param Reason Reason for the KILL.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
Kill_Nick( char *Nick, char *Reason )
|
Kill_Nick(char *Nick, char *Reason)
|
||||||
{
|
{
|
||||||
REQUEST r;
|
REQUEST r;
|
||||||
|
|
||||||
assert( Nick != NULL );
|
assert (Nick != NULL);
|
||||||
assert( Reason != NULL );
|
assert (Reason != NULL);
|
||||||
|
|
||||||
r.prefix = (char *)Client_ThisServer( );
|
r.prefix = NULL;
|
||||||
r.argv[0] = Nick;
|
r.argv[0] = Nick;
|
||||||
r.argv[1] = Reason;
|
r.argv[1] = Reason;
|
||||||
r.argc = 2;
|
r.argc = 2;
|
||||||
|
|
||||||
Log( LOG_ERR, "User(s) with nick \"%s\" will be disconnected: %s", Nick, Reason );
|
Log(LOG_ERR, "User(s) with nick \"%s\" will be disconnected: %s",
|
||||||
IRC_KILL( Client_ThisServer( ), &r );
|
Nick, Reason);
|
||||||
|
|
||||||
|
IRC_KILL(Client_ThisServer(), &r);
|
||||||
} /* Kill_Nick */
|
} /* Kill_Nick */
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Introduce a new user or service client in the network.
|
* Change the nickname of a client.
|
||||||
*
|
*
|
||||||
* @param From Remote server introducing the client or NULL (local).
|
* @param Origin The client which caused the nickname change.
|
||||||
* @param Client New client.
|
* @param Target The client of which the nickname should be changed.
|
||||||
* @param Type Type of the client (CLIENT_USER or CLIENT_SERVICE).
|
* @param NewNick The new nickname.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
Introduce_Client(CLIENT *From, CLIENT *Client, int Type)
|
Change_Nick(CLIENT *Origin, CLIENT *Target, char *NewNick, bool InformClient)
|
||||||
{
|
{
|
||||||
/* Set client type (user or service) */
|
if (Client_Conn(Target) > NONE) {
|
||||||
Client_SetType(Client, Type);
|
/* Local client */
|
||||||
|
Log(LOG_INFO,
|
||||||
if (From) {
|
"%s \"%s\" changed nick (connection %d): \"%s\" -> \"%s\".",
|
||||||
if (Conf_IsService(Conf_GetServer(Client_Conn(From)),
|
Client_TypeText(Target), Client_Mask(Target),
|
||||||
Client_ID(Client)))
|
Client_Conn(Target), Client_ID(Target), NewNick);
|
||||||
Client_SetType(Client, CLIENT_SERVICE);
|
Conn_UpdateIdle(Client_Conn(Target));
|
||||||
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 {
|
} else {
|
||||||
Log(LOG_NOTICE, "%s \"%s\" registered (connection %d).",
|
/* Remote client */
|
||||||
Client_TypeText(Client), Client_Mask(Client),
|
LogDebug("%s \"%s\" changed nick: \"%s\" -> \"%s\".",
|
||||||
Client_Conn(Client));
|
Client_TypeText(Target),
|
||||||
Log_ServerNotice('c', "Client connecting: %s (%s@%s) [%s] - %s",
|
Client_Mask(Target), Client_ID(Target), NewNick);
|
||||||
Client_ID(Client), Client_User(Client),
|
|
||||||
Client_Hostname(Client),
|
|
||||||
Conn_IPA(Client_Conn(Client)),
|
|
||||||
Client_TypeText(Client));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Inform other servers */
|
/* Inform all servers and users (which have to know) of the new name */
|
||||||
IRC_WriteStrServersPrefixFlag_CB(From,
|
if (InformClient) {
|
||||||
From != NULL ? From : Client_ThisServer(),
|
IRC_WriteStrClientPrefix(Target, Target, "NICK :%s", NewNick);
|
||||||
'\0', cb_introduceClient, (void *)Client);
|
IRC_WriteStrServersPrefix(NULL, Target, "NICK :%s", NewNick);
|
||||||
} /* Introduce_Client */
|
} else
|
||||||
|
IRC_WriteStrServersPrefix(Origin, Target, "NICK :%s", NewNick);
|
||||||
|
IRC_WriteStrRelatedPrefix(Target, Target, false, "NICK :%s", NewNick);
|
||||||
|
|
||||||
|
/* Register old nickname for WHOWAS queries */
|
||||||
|
Client_RegisterWhowas(Target);
|
||||||
|
|
||||||
/**
|
/* Save new nickname */
|
||||||
* Introduce a new user or service client to a remote server.
|
Client_SetID(Target, NewNick);
|
||||||
*
|
}
|
||||||
* 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- */
|
/* -eof- */
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2010 Alexander Barton (alex@barton.de)
|
* Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -26,6 +26,7 @@ GLOBAL bool IRC_PING PARAMS((CLIENT *Client, REQUEST *Req));
|
|||||||
GLOBAL bool IRC_PONG PARAMS((CLIENT *Client, REQUEST *Req));
|
GLOBAL bool IRC_PONG PARAMS((CLIENT *Client, REQUEST *Req));
|
||||||
GLOBAL bool IRC_QUIT PARAMS((CLIENT *Client, REQUEST *Req));
|
GLOBAL bool IRC_QUIT PARAMS((CLIENT *Client, REQUEST *Req));
|
||||||
GLOBAL bool IRC_QUIT_HTTP PARAMS((CLIENT *Client, REQUEST *Req));
|
GLOBAL bool IRC_QUIT_HTTP PARAMS((CLIENT *Client, REQUEST *Req));
|
||||||
|
GLOBAL bool IRC_SVSNICK PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
109
src/ngircd/irc-metadata.c
Normal file
109
src/ngircd/irc-metadata.c
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
/*
|
||||||
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
|
* Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
* Please read the file COPYING, README and AUTHORS for more information.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define __irc_metadata_c__
|
||||||
|
|
||||||
|
#include "portab.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* IRC metadata commands
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "imp.h"
|
||||||
|
#include <assert.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "conn-func.h"
|
||||||
|
#include "channel.h"
|
||||||
|
#include "conn-encoding.h"
|
||||||
|
#include "irc-write.h"
|
||||||
|
#include "log.h"
|
||||||
|
#include "messages.h"
|
||||||
|
#include "parse.h"
|
||||||
|
#include "tool.h"
|
||||||
|
|
||||||
|
#include "exp.h"
|
||||||
|
#include "irc-metadata.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for the IRC+ "METADATA" 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_METADATA(CLIENT *Client, REQUEST *Req)
|
||||||
|
{
|
||||||
|
CLIENT *prefix, *target;
|
||||||
|
char new_flags[COMMAND_LEN];
|
||||||
|
|
||||||
|
assert(Client != NULL);
|
||||||
|
assert(Req != NULL);
|
||||||
|
|
||||||
|
if (Req->argc != 3)
|
||||||
|
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||||
|
Client_ID(Client), Req->command);
|
||||||
|
|
||||||
|
prefix = Client_Search(Req->prefix);
|
||||||
|
if (!prefix)
|
||||||
|
return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG,
|
||||||
|
Client_ID(Client), Req->prefix);
|
||||||
|
|
||||||
|
target = Client_Search(Req->argv[0]);
|
||||||
|
if (!target)
|
||||||
|
return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG,
|
||||||
|
Client_ID(Client), Req->argv[0]);
|
||||||
|
|
||||||
|
LogDebug("Got \"METADATA\" command from \"%s\" for client \"%s\": \"%s=%s\".",
|
||||||
|
Client_ID(prefix), Client_ID(target),
|
||||||
|
Req->argv[1], Req->argv[2]);
|
||||||
|
|
||||||
|
/* Mark client: it has receiveda a METADATA command */
|
||||||
|
if (!strchr(Client_Flags(target), 'M')) {
|
||||||
|
snprintf(new_flags, sizeof new_flags, "%sM",
|
||||||
|
Client_Flags(target));
|
||||||
|
Client_SetFlags(target, new_flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strcasecmp(Req->argv[1], "cloakhost") == 0) {
|
||||||
|
Client_UpdateCloakedHostname(target, prefix, Req->argv[2]);
|
||||||
|
if (Client_Conn(target) > NONE && Client_HasMode(target, 'x'))
|
||||||
|
IRC_WriteStrClientPrefix(target, prefix,
|
||||||
|
RPL_HOSTHIDDEN_MSG, Client_ID(target),
|
||||||
|
Client_HostnameDisplayed(target));
|
||||||
|
/* The Client_UpdateCloakedHostname() function already
|
||||||
|
* forwarded the METADATA command, don't do it twice: */
|
||||||
|
return CONNECTED;
|
||||||
|
}
|
||||||
|
else if (*Req->argv[2] && strcasecmp(Req->argv[1], "host") == 0) {
|
||||||
|
Client_SetHostname(target, Req->argv[2]);
|
||||||
|
if (Client_Conn(target) > NONE && !Client_HasMode(target, 'x'))
|
||||||
|
IRC_WriteStrClientPrefix(target, prefix,
|
||||||
|
RPL_HOSTHIDDEN_MSG, Client_ID(target),
|
||||||
|
Client_HostnameDisplayed(target));
|
||||||
|
} else if (strcasecmp(Req->argv[1], "info") == 0)
|
||||||
|
Client_SetInfo(target, Req->argv[2]);
|
||||||
|
else if (*Req->argv[2] && strcasecmp(Req->argv[1], "user") == 0)
|
||||||
|
Client_SetUser(target, Req->argv[2], true);
|
||||||
|
else
|
||||||
|
Log(LOG_WARNING,
|
||||||
|
"Ignored metadata update from \"%s\" for client \"%s\": \"%s=%s\" - unknown key!",
|
||||||
|
Client_ID(Client), Client_ID(target),
|
||||||
|
Req->argv[1], Req->argv[2]);
|
||||||
|
|
||||||
|
/* Forward the METADATA command to peers that support it: */
|
||||||
|
IRC_WriteStrServersPrefixFlag(Client, prefix, 'M', "METADATA %s %s :%s",
|
||||||
|
Client_ID(target), Req->argv[1], Req->argv[2]);
|
||||||
|
return CONNECTED;
|
||||||
|
}
|
||||||
24
src/ngircd/irc-metadata.h
Normal file
24
src/ngircd/irc-metadata.h
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
/*
|
||||||
|
* 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 __irc_metadata_h__
|
||||||
|
#define __irc_metadata_h__
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @file
|
||||||
|
* IRC metadata commands (header)
|
||||||
|
*/
|
||||||
|
|
||||||
|
GLOBAL bool IRC_METADATA PARAMS((CLIENT *Client, REQUEST *Req));
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* -eof- */
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -164,10 +164,18 @@ IRC_INVITE(CLIENT *Client, REQUEST *Req)
|
|||||||
if (!Channel_IsMemberOf(chan, from))
|
if (!Channel_IsMemberOf(chan, from))
|
||||||
return IRC_WriteStrClient(from, ERR_NOTONCHANNEL_MSG, Client_ID(Client), Req->argv[1]);
|
return IRC_WriteStrClient(from, ERR_NOTONCHANNEL_MSG, Client_ID(Client), Req->argv[1]);
|
||||||
|
|
||||||
|
/* Is the channel "invite-disallow"? */
|
||||||
|
if (strchr(Channel_Modes(chan), 'V'))
|
||||||
|
return IRC_WriteStrClient(from, ERR_NOINVITE_MSG,
|
||||||
|
Client_ID(from), Channel_Name(chan));
|
||||||
|
|
||||||
/* Is the channel "invite-only"? */
|
/* Is the channel "invite-only"? */
|
||||||
if (strchr(Channel_Modes(chan), 'i')) {
|
if (strchr(Channel_Modes(chan), 'i')) {
|
||||||
/* Yes. The user must be channel operator! */
|
/* Yes. The user must be channel owner/admin/operator/halfop! */
|
||||||
if (!strchr(Channel_UserModes(chan, from), 'o'))
|
if (!strchr(Channel_UserModes(chan, from), 'q') &&
|
||||||
|
!strchr(Channel_UserModes(chan, from), 'a') &&
|
||||||
|
!strchr(Channel_UserModes(chan, from), 'o') &&
|
||||||
|
!strchr(Channel_UserModes(chan, from), 'h'))
|
||||||
return IRC_WriteStrClient(from, ERR_CHANOPRIVSNEEDED_MSG,
|
return IRC_WriteStrClient(from, ERR_CHANOPRIVSNEEDED_MSG,
|
||||||
Client_ID(from), Channel_Name(chan));
|
Client_ID(from), Channel_Name(chan));
|
||||||
remember = true;
|
remember = true;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2008 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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -27,6 +27,7 @@
|
|||||||
#include "conn-func.h"
|
#include "conn-func.h"
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
|
#include "class.h"
|
||||||
#include "irc-write.h"
|
#include "irc-write.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "match.h"
|
#include "match.h"
|
||||||
@@ -37,7 +38,6 @@
|
|||||||
#include <exp.h>
|
#include <exp.h>
|
||||||
#include "irc-oper.h"
|
#include "irc-oper.h"
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle invalid received OPER command.
|
* Handle invalid received OPER command.
|
||||||
* Log OPER attempt and send error message to client.
|
* Log OPER attempt and send error message to client.
|
||||||
@@ -52,7 +52,15 @@ Bad_OperPass(CLIENT *Client, char *errtoken, char *errmsg)
|
|||||||
Client_ID(Client));
|
Client_ID(Client));
|
||||||
} /* Bad_OperPass */
|
} /* Bad_OperPass */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for the IRC "OPER" command.
|
||||||
|
*
|
||||||
|
* See RFC 2812, 3.1.4 "Oper message".
|
||||||
|
*
|
||||||
|
* @param Client The client from which this command has been received.
|
||||||
|
* @param Req Request structure with prefix and all parameters.
|
||||||
|
* @return CONNECTED or DISCONNECTED.
|
||||||
|
*/
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_OPER( CLIENT *Client, REQUEST *Req )
|
IRC_OPER( CLIENT *Client, REQUEST *Req )
|
||||||
{
|
{
|
||||||
@@ -62,7 +70,9 @@ IRC_OPER( CLIENT *Client, REQUEST *Req )
|
|||||||
assert( Client != NULL );
|
assert( Client != NULL );
|
||||||
assert( Req != NULL );
|
assert( Req != NULL );
|
||||||
|
|
||||||
if( Req->argc != 2 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
if (Req->argc != 2)
|
||||||
|
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||||
|
Client_ID(Client), Req->command);
|
||||||
|
|
||||||
len = array_length(&Conf_Opers, sizeof(*op));
|
len = array_length(&Conf_Opers, sizeof(*op));
|
||||||
op = array_start(&Conf_Opers);
|
op = array_start(&Conf_Opers);
|
||||||
@@ -77,20 +87,33 @@ IRC_OPER( CLIENT *Client, REQUEST *Req )
|
|||||||
if (op[i].mask && (!Match(op[i].mask, Client_Mask(Client))))
|
if (op[i].mask && (!Match(op[i].mask, Client_Mask(Client))))
|
||||||
return Bad_OperPass(Client, op[i].mask, "hostmask check failed");
|
return Bad_OperPass(Client, op[i].mask, "hostmask check failed");
|
||||||
|
|
||||||
if( ! Client_HasMode( Client, 'o' ))
|
if (!Client_HasMode(Client, 'o')) {
|
||||||
{
|
Client_ModeAdd(Client, 'o');
|
||||||
Client_ModeAdd( Client, 'o' );
|
if (!IRC_WriteStrClient(Client, "MODE %s :+o",
|
||||||
if( ! IRC_WriteStrClient( Client, "MODE %s :+o", Client_ID( Client ))) return DISCONNECTED;
|
Client_ID(Client)))
|
||||||
IRC_WriteStrServersPrefix( NULL, Client, "MODE %s :+o", Client_ID( Client ));
|
return DISCONNECTED;
|
||||||
|
IRC_WriteStrServersPrefix(NULL, Client, "MODE %s :+o",
|
||||||
|
Client_ID(Client));
|
||||||
}
|
}
|
||||||
|
|
||||||
if( ! Client_OperByMe( Client )) Log( LOG_NOTICE|LOG_snotice, "Got valid OPER from \"%s\", user is an IRC operator now.", Client_Mask( Client ));
|
if (!Client_OperByMe(Client))
|
||||||
|
Log(LOG_NOTICE|LOG_snotice,
|
||||||
|
"Got valid OPER from \"%s\", user is an IRC operator now.",
|
||||||
|
Client_Mask(Client));
|
||||||
|
|
||||||
Client_SetOperByMe( Client, true);
|
Client_SetOperByMe(Client, true);
|
||||||
return IRC_WriteStrClient( Client, RPL_YOUREOPER_MSG, Client_ID( Client ));
|
return IRC_WriteStrClient(Client, RPL_YOUREOPER_MSG, Client_ID(Client));
|
||||||
} /* IRC_OPER */
|
} /* IRC_OPER */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for the IRC "DIE" command.
|
||||||
|
*
|
||||||
|
* See RFC 2812, 4.3 "Die message".
|
||||||
|
*
|
||||||
|
* @param Client The client from which this command has been received.
|
||||||
|
* @param Req Request structure with prefix and all parameters.
|
||||||
|
* @return CONNECTED or DISCONNECTED.
|
||||||
|
*/
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_DIE(CLIENT * Client, REQUEST * Req)
|
IRC_DIE(CLIENT * Client, REQUEST * Req)
|
||||||
{
|
{
|
||||||
@@ -133,7 +156,15 @@ IRC_DIE(CLIENT * Client, REQUEST * Req)
|
|||||||
return CONNECTED;
|
return CONNECTED;
|
||||||
} /* IRC_DIE */
|
} /* IRC_DIE */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for the IRC "REHASH" command.
|
||||||
|
*
|
||||||
|
* See RFC 2812, 4.2 "Rehash message".
|
||||||
|
*
|
||||||
|
* @param Client The client from which this command has been received.
|
||||||
|
* @param Req Request structure with prefix and all parameters.
|
||||||
|
* @return CONNECTED or DISCONNECTED.
|
||||||
|
*/
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_REHASH( CLIENT *Client, REQUEST *Req )
|
IRC_REHASH( CLIENT *Client, REQUEST *Req )
|
||||||
{
|
{
|
||||||
@@ -146,15 +177,28 @@ IRC_REHASH( CLIENT *Client, REQUEST *Req )
|
|||||||
return Op_NoPrivileges(Client, Req);
|
return Op_NoPrivileges(Client, Req);
|
||||||
|
|
||||||
/* Bad number of parameters? */
|
/* Bad number of parameters? */
|
||||||
if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
if (Req->argc != 0)
|
||||||
|
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||||
|
Client_ID(Client), Req->command );
|
||||||
|
|
||||||
|
Log(LOG_NOTICE|LOG_snotice, "Got REHASH command from \"%s\" ...",
|
||||||
|
Client_Mask(Client));
|
||||||
|
IRC_WriteStrClient(Client, RPL_REHASHING_MSG, Client_ID(Client));
|
||||||
|
|
||||||
Log( LOG_NOTICE|LOG_snotice, "Got REHASH command from \"%s\" ...", Client_Mask( Client ));
|
|
||||||
raise(SIGHUP);
|
raise(SIGHUP);
|
||||||
|
|
||||||
return CONNECTED;
|
return CONNECTED;
|
||||||
} /* IRC_REHASH */
|
} /* IRC_REHASH */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for the IRC "RESTART" command.
|
||||||
|
*
|
||||||
|
* See RFC 2812, 4.4 "Restart message".
|
||||||
|
*
|
||||||
|
* @param Client The client from which this command has been received.
|
||||||
|
* @param Req Request structure with prefix and all parameters.
|
||||||
|
* @return CONNECTED or DISCONNECTED.
|
||||||
|
*/
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_RESTART( CLIENT *Client, REQUEST *Req )
|
IRC_RESTART( CLIENT *Client, REQUEST *Req )
|
||||||
{
|
{
|
||||||
@@ -167,16 +211,25 @@ IRC_RESTART( CLIENT *Client, REQUEST *Req )
|
|||||||
return Op_NoPrivileges(Client, Req);
|
return Op_NoPrivileges(Client, Req);
|
||||||
|
|
||||||
/* Bad number of parameters? */
|
/* Bad number of parameters? */
|
||||||
if( Req->argc != 0 ) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
if (Req->argc != 0)
|
||||||
|
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||||
|
Client_ID(Client), Req->command);
|
||||||
|
|
||||||
Log( LOG_NOTICE|LOG_snotice, "Got RESTART command from \"%s\" ...", Client_Mask( Client ));
|
Log(LOG_NOTICE|LOG_snotice, "Got RESTART command from \"%s\" ...",
|
||||||
|
Client_Mask(Client));
|
||||||
NGIRCd_SignalRestart = true;
|
NGIRCd_SignalRestart = true;
|
||||||
|
|
||||||
return CONNECTED;
|
return CONNECTED;
|
||||||
} /* IRC_RESTART */
|
} /* IRC_RESTART */
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Connect configured or new server.
|
* Handler for the IRC "CONNECT" command.
|
||||||
|
*
|
||||||
|
* See RFC 2812, 3.4.7 "Connect message".
|
||||||
|
*
|
||||||
|
* @param Client The client from which this command has been received.
|
||||||
|
* @param Req Request structure with prefix and all parameters.
|
||||||
|
* @return CONNECTED or DISCONNECTED.
|
||||||
*/
|
*/
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_CONNECT(CLIENT * Client, REQUEST * Req)
|
IRC_CONNECT(CLIENT * Client, REQUEST * Req)
|
||||||
@@ -272,9 +325,15 @@ IRC_CONNECT(CLIENT * Client, REQUEST * Req)
|
|||||||
return CONNECTED;
|
return CONNECTED;
|
||||||
} /* IRC_CONNECT */
|
} /* IRC_CONNECT */
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disconnect (and disable) configured server.
|
* Handler for the IRC "DISCONNECT" command.
|
||||||
|
*
|
||||||
|
* This command is not specified in the IRC RFCs, it is an extension
|
||||||
|
* of ngIRCd: it shuts down and disables a configured server connection.
|
||||||
|
*
|
||||||
|
* @param Client The client from which this command has been received.
|
||||||
|
* @param Req Request structure with prefix and all parameters.
|
||||||
|
* @return CONNECTED or DISCONNECTED.
|
||||||
*/
|
*/
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_DISCONNECT(CLIENT * Client, REQUEST * Req)
|
IRC_DISCONNECT(CLIENT * Client, REQUEST * Req)
|
||||||
@@ -315,7 +374,15 @@ IRC_DISCONNECT(CLIENT * Client, REQUEST * Req)
|
|||||||
return DISCONNECTED;
|
return DISCONNECTED;
|
||||||
} /* IRC_DISCONNECT */
|
} /* IRC_DISCONNECT */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for the IRC "WALLOPS" command.
|
||||||
|
*
|
||||||
|
* See RFC 2812, 4.7 "Operwall message".
|
||||||
|
*
|
||||||
|
* @param Client The client from which this command has been received.
|
||||||
|
* @param Req Request structure with prefix and all parameters.
|
||||||
|
* @return CONNECTED or DISCONNECTED.
|
||||||
|
*/
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_WALLOPS( CLIENT *Client, REQUEST *Req )
|
IRC_WALLOPS( CLIENT *Client, REQUEST *Req )
|
||||||
{
|
{
|
||||||
@@ -325,12 +392,14 @@ IRC_WALLOPS( CLIENT *Client, REQUEST *Req )
|
|||||||
assert( Req != NULL );
|
assert( Req != NULL );
|
||||||
|
|
||||||
if (Req->argc != 1)
|
if (Req->argc != 1)
|
||||||
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG, Client_ID(Client), Req->command);
|
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||||
|
Client_ID(Client), Req->command);
|
||||||
|
|
||||||
switch (Client_Type(Client)) {
|
switch (Client_Type(Client)) {
|
||||||
case CLIENT_USER:
|
case CLIENT_USER:
|
||||||
if (!Client_OperByMe(Client))
|
if (!Client_OperByMe(Client))
|
||||||
return IRC_WriteStrClient(Client, ERR_NOPRIVILEGES_MSG, Client_ID(Client));
|
return IRC_WriteStrClient(Client, ERR_NOPRIVILEGES_MSG,
|
||||||
|
Client_ID(Client));
|
||||||
from = Client;
|
from = Client;
|
||||||
break;
|
break;
|
||||||
case CLIENT_SERVER:
|
case CLIENT_SERVER:
|
||||||
@@ -341,11 +410,87 @@ IRC_WALLOPS( CLIENT *Client, REQUEST *Req )
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!from)
|
if (!from)
|
||||||
return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG, Client_ID(Client), Req->prefix);
|
return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG,
|
||||||
|
Client_ID(Client), Req->prefix);
|
||||||
|
|
||||||
IRC_SendWallops(Client, from, "%s", Req->argv[0]);
|
IRC_SendWallops(Client, from, "%s", Req->argv[0]);
|
||||||
return CONNECTED;
|
return CONNECTED;
|
||||||
} /* IRC_WALLOPS */
|
} /* IRC_WALLOPS */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handle <?>LINE commands (GLINE, KLINE).
|
||||||
|
*
|
||||||
|
* @param Client The client from which this command has been received.
|
||||||
|
* @param Req Request structure with prefix and all parameters.
|
||||||
|
* @return CONNECTED or DISCONNECTED.
|
||||||
|
*/
|
||||||
|
GLOBAL bool
|
||||||
|
IRC_xLINE(CLIENT *Client, REQUEST *Req)
|
||||||
|
{
|
||||||
|
CLIENT *from;
|
||||||
|
int class;
|
||||||
|
char class_c;
|
||||||
|
|
||||||
|
assert(Client != NULL);
|
||||||
|
assert(Req != NULL);
|
||||||
|
|
||||||
|
from = Op_Check(Client, Req);
|
||||||
|
if (!from)
|
||||||
|
return Op_NoPrivileges(Client, Req);
|
||||||
|
|
||||||
|
/* Bad number of parameters? */
|
||||||
|
if (Req->argc != 1 && Req->argc != 3)
|
||||||
|
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||||
|
Client_ID(Client), Req->command);
|
||||||
|
|
||||||
|
switch(Req->command[0]) {
|
||||||
|
case 'g':
|
||||||
|
case 'G':
|
||||||
|
class = CLASS_GLINE; class_c = 'G';
|
||||||
|
break;
|
||||||
|
case 'k':
|
||||||
|
case 'K':
|
||||||
|
class = CLASS_KLINE; class_c = 'K';
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Log(LOG_CRIT,
|
||||||
|
"IRC_xLINE() called for unknown line: %c!? Ignored.",
|
||||||
|
Req->command[0]);
|
||||||
|
return CONNECTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Req->argc == 1) {
|
||||||
|
/* Delete mask from list */
|
||||||
|
Class_DeleteMask(class, Req->argv[0]);
|
||||||
|
Log(LOG_NOTICE|LOG_snotice,
|
||||||
|
"\"%s\" deleted \"%s\" from %c-Line list.",
|
||||||
|
Client_Mask(from), Req->argv[0], class_c);
|
||||||
|
if (class == CLASS_GLINE) {
|
||||||
|
/* Inform other servers */
|
||||||
|
IRC_WriteStrServersPrefix(Client, from, "%s %s",
|
||||||
|
Req->command, Req->argv[0]);
|
||||||
|
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
/* Add new mask to list */
|
||||||
|
if (Class_AddMask(class, Req->argv[0],
|
||||||
|
time(NULL) + atol(Req->argv[1]),
|
||||||
|
Req->argv[2])) {
|
||||||
|
Log(LOG_NOTICE|LOG_snotice,
|
||||||
|
"\"%s\" added \"%s\" to %c-Line list: \"%s\" (%ld seconds).",
|
||||||
|
Client_Mask(from), Req->argv[0], class_c,
|
||||||
|
Req->argv[2], atol(Req->argv[1]));
|
||||||
|
if (class == CLASS_GLINE) {
|
||||||
|
/* Inform other servers */
|
||||||
|
IRC_WriteStrServersPrefix(Client, from,
|
||||||
|
"%s %s %s :%s", Req->command,
|
||||||
|
Req->argv[0], Req->argv[1],
|
||||||
|
Req->argv[2]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return CONNECTED;
|
||||||
|
}
|
||||||
|
|
||||||
/* -eof- */
|
/* -eof- */
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001,2002 by 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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -25,6 +25,8 @@ GLOBAL bool IRC_CONNECT PARAMS((CLIENT *Client, REQUEST *Req ));
|
|||||||
GLOBAL bool IRC_DISCONNECT PARAMS((CLIENT *Client, REQUEST *Req ));
|
GLOBAL bool IRC_DISCONNECT PARAMS((CLIENT *Client, REQUEST *Req ));
|
||||||
GLOBAL bool IRC_WALLOPS PARAMS(( CLIENT *Client, REQUEST *Req ));
|
GLOBAL bool IRC_WALLOPS PARAMS(( CLIENT *Client, REQUEST *Req ));
|
||||||
|
|
||||||
|
GLOBAL bool IRC_xLINE PARAMS((CLIENT *Client, REQUEST *Req));
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* -eof- */
|
/* -eof- */
|
||||||
|
|||||||
@@ -53,8 +53,7 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
|||||||
char str[LINE_LEN];
|
char str[LINE_LEN];
|
||||||
CLIENT *from, *c;
|
CLIENT *from, *c;
|
||||||
int i;
|
int i;
|
||||||
CONN_ID con;
|
|
||||||
|
|
||||||
assert( Client != NULL );
|
assert( Client != NULL );
|
||||||
assert( Req != NULL );
|
assert( Req != NULL );
|
||||||
|
|
||||||
@@ -70,26 +69,44 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
|||||||
LogDebug("Connection %d: got SERVER command (new server link) ...",
|
LogDebug("Connection %d: got SERVER command (new server link) ...",
|
||||||
Client_Conn(Client));
|
Client_Conn(Client));
|
||||||
|
|
||||||
if(( Req->argc != 2 ) && ( Req->argc != 3 )) return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG, Client_ID( Client ), Req->command );
|
if (Req->argc != 2 && Req->argc != 3)
|
||||||
|
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||||
|
Client_ID(Client),
|
||||||
|
Req->command);
|
||||||
|
|
||||||
/* Ist this server configured on out side? */
|
/* Get configuration index of new remote server ... */
|
||||||
for( i = 0; i < MAX_SERVERS; i++ ) if( strcasecmp( Req->argv[0], Conf_Server[i].name ) == 0 ) break;
|
for (i = 0; i < MAX_SERVERS; i++)
|
||||||
if( i >= MAX_SERVERS )
|
if (strcasecmp(Req->argv[0], Conf_Server[i].name) == 0)
|
||||||
{
|
break;
|
||||||
Log( LOG_ERR, "Connection %d: Server \"%s\" not configured here!", Client_Conn( Client ), Req->argv[0] );
|
|
||||||
Conn_Close( Client_Conn( Client ), NULL, "Server not configured here", true);
|
/* Makre sure the remote server is configured here */
|
||||||
|
if (i >= MAX_SERVERS) {
|
||||||
|
Log(LOG_ERR,
|
||||||
|
"Connection %d: Server \"%s\" not configured here!",
|
||||||
|
Client_Conn(Client), Req->argv[0]);
|
||||||
|
Conn_Close(Client_Conn(Client), NULL,
|
||||||
|
"Server not configured here", true);
|
||||||
return DISCONNECTED;
|
return DISCONNECTED;
|
||||||
}
|
}
|
||||||
if( strcmp( Client_Password( Client ), Conf_Server[i].pwd_in ) != 0 )
|
|
||||||
{
|
/* Check server password */
|
||||||
/* wrong password */
|
if (strcmp(Conn_Password(Client_Conn(Client)),
|
||||||
Log( LOG_ERR, "Connection %d: Got bad password from server \"%s\"!", Client_Conn( Client ), Req->argv[0] );
|
Conf_Server[i].pwd_in) != 0) {
|
||||||
Conn_Close( Client_Conn( Client ), NULL, "Bad password", true);
|
Log(LOG_ERR,
|
||||||
|
"Connection %d: Got bad password from server \"%s\"!",
|
||||||
|
Client_Conn(Client), Req->argv[0]);
|
||||||
|
Conn_Close(Client_Conn(Client), NULL,
|
||||||
|
"Bad password", true);
|
||||||
return DISCONNECTED;
|
return DISCONNECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Is there a registered server with this ID? */
|
/* Is there a registered server with this ID? */
|
||||||
if( ! Client_CheckID( Client, Req->argv[0] )) return DISCONNECTED;
|
if (!Client_CheckID(Client, Req->argv[0]))
|
||||||
|
return DISCONNECTED;
|
||||||
|
|
||||||
|
/* Mark this connection as belonging to an configured server */
|
||||||
|
if (!Conf_SetServer(i, Client_Conn(Client)))
|
||||||
|
return DISCONNECTED;
|
||||||
|
|
||||||
Client_SetID( Client, Req->argv[0] );
|
Client_SetID( Client, Req->argv[0] );
|
||||||
Client_SetHops( Client, 1 );
|
Client_SetHops( Client, 1 );
|
||||||
@@ -97,7 +114,6 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
|||||||
|
|
||||||
/* Is this server registering on our side, or are we connecting to
|
/* Is this server registering on our side, or are we connecting to
|
||||||
* a remote server? */
|
* a remote server? */
|
||||||
con = Client_Conn(Client);
|
|
||||||
if (Client_Token(Client) != TOKEN_OUTBOUND) {
|
if (Client_Token(Client) != TOKEN_OUTBOUND) {
|
||||||
/* Incoming connection, send user/pass */
|
/* Incoming connection, send user/pass */
|
||||||
if (!IRC_WriteStrClient(Client, "PASS %s %s",
|
if (!IRC_WriteStrClient(Client, "PASS %s %s",
|
||||||
@@ -106,7 +122,8 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
|||||||
|| !IRC_WriteStrClient(Client, "SERVER %s 1 :%s",
|
|| !IRC_WriteStrClient(Client, "SERVER %s 1 :%s",
|
||||||
Conf_ServerName,
|
Conf_ServerName,
|
||||||
Conf_ServerInfo)) {
|
Conf_ServerInfo)) {
|
||||||
Conn_Close(con, "Unexpected server behavior!",
|
Conn_Close(Client_Conn(Client),
|
||||||
|
"Unexpected server behavior!",
|
||||||
NULL, false);
|
NULL, false);
|
||||||
return DISCONNECTED;
|
return DISCONNECTED;
|
||||||
}
|
}
|
||||||
@@ -118,25 +135,25 @@ IRC_SERVER( CLIENT *Client, REQUEST *Req )
|
|||||||
Client_SetToken(Client, atoi(Req->argv[1]));
|
Client_SetToken(Client, atoi(Req->argv[1]));
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Mark this connection as belonging to an configured server */
|
|
||||||
Conf_SetServer(i, con);
|
|
||||||
|
|
||||||
/* Check protocol level */
|
/* Check protocol level */
|
||||||
if (Client_Type(Client) == CLIENT_GOTPASS) {
|
if (Client_Type(Client) == CLIENT_GOTPASS) {
|
||||||
/* We got a "simple" PASS command, so the peer is
|
/* We got a "simple" PASS command, so the peer is
|
||||||
* using the protocol as defined in RFC 1459. */
|
* using the protocol as defined in RFC 1459. */
|
||||||
if (! (Conn_Options(con) & CONN_RFC1459))
|
if (! (Conn_Options(Client_Conn(Client)) & CONN_RFC1459))
|
||||||
Log(LOG_INFO,
|
Log(LOG_INFO,
|
||||||
"Switching connection %d (\"%s\") to RFC 1459 compatibility mode.",
|
"Switching connection %d (\"%s\") to RFC 1459 compatibility mode.",
|
||||||
con, Client_ID(Client));
|
Client_Conn(Client), Client_ID(Client));
|
||||||
Conn_SetOption(con, CONN_RFC1459);
|
Conn_SetOption(Client_Conn(Client), CONN_RFC1459);
|
||||||
}
|
}
|
||||||
|
|
||||||
Client_SetType(Client, CLIENT_UNKNOWNSERVER);
|
Client_SetType(Client, CLIENT_UNKNOWNSERVER);
|
||||||
|
|
||||||
#ifdef ZLIB
|
#ifdef ZLIB
|
||||||
if (strchr(Client_Flags(Client), 'Z') && !Zip_InitConn(con)) {
|
if (strchr(Client_Flags(Client), 'Z')
|
||||||
Conn_Close( con, "Can't inizialize compression (zlib)!", NULL, false );
|
&& !Zip_InitConn(Client_Conn(Client))) {
|
||||||
|
Conn_Close(Client_Conn(Client),
|
||||||
|
"Can't inizialize compression (zlib)!",
|
||||||
|
NULL, false );
|
||||||
return DISCONNECTED;
|
return DISCONNECTED;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -202,10 +219,10 @@ GLOBAL bool
|
|||||||
IRC_NJOIN( CLIENT *Client, REQUEST *Req )
|
IRC_NJOIN( CLIENT *Client, REQUEST *Req )
|
||||||
{
|
{
|
||||||
char nick_in[COMMAND_LEN], nick_out[COMMAND_LEN], *channame, *ptr, modes[8];
|
char nick_in[COMMAND_LEN], nick_out[COMMAND_LEN], *channame, *ptr, modes[8];
|
||||||
bool is_op, is_voiced;
|
bool is_owner, is_chanadmin, is_op, is_halfop, is_voiced;
|
||||||
CHANNEL *chan;
|
CHANNEL *chan;
|
||||||
CLIENT *c;
|
CLIENT *c;
|
||||||
|
|
||||||
assert( Client != NULL );
|
assert( Client != NULL );
|
||||||
assert( Req != NULL );
|
assert( Req != NULL );
|
||||||
|
|
||||||
@@ -218,12 +235,16 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req )
|
|||||||
ptr = strtok( nick_in, "," );
|
ptr = strtok( nick_in, "," );
|
||||||
while( ptr )
|
while( ptr )
|
||||||
{
|
{
|
||||||
is_op = is_voiced = false;
|
is_owner = is_chanadmin = is_op = is_halfop = is_voiced = false;
|
||||||
|
|
||||||
/* cut off prefixes */
|
/* cut off prefixes */
|
||||||
while(( *ptr == '@' ) || ( *ptr == '+' ))
|
while(( *ptr == '~') || ( *ptr == '&' ) || ( *ptr == '@' ) ||
|
||||||
|
( *ptr == '%') || ( *ptr == '+' ))
|
||||||
{
|
{
|
||||||
|
if( *ptr == '~' ) is_owner = true;
|
||||||
|
if( *ptr == '&' ) is_chanadmin = true;
|
||||||
if( *ptr == '@' ) is_op = true;
|
if( *ptr == '@' ) is_op = true;
|
||||||
|
if( *ptr == 'h' ) is_halfop = true;
|
||||||
if( *ptr == '+' ) is_voiced = true;
|
if( *ptr == '+' ) is_voiced = true;
|
||||||
ptr++;
|
ptr++;
|
||||||
}
|
}
|
||||||
@@ -234,8 +255,11 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req )
|
|||||||
Channel_Join( c, channame );
|
Channel_Join( c, channame );
|
||||||
chan = Channel_Search( channame );
|
chan = Channel_Search( channame );
|
||||||
assert( chan != NULL );
|
assert( chan != NULL );
|
||||||
|
|
||||||
|
if( is_owner ) Channel_UserModeAdd( chan, c, 'q' );
|
||||||
|
if( is_chanadmin ) Channel_UserModeAdd( chan, c, 'a' );
|
||||||
if( is_op ) Channel_UserModeAdd( chan, c, 'o' );
|
if( is_op ) Channel_UserModeAdd( chan, c, 'o' );
|
||||||
|
if( is_halfop ) Channel_UserModeAdd( chan, c, 'h' );
|
||||||
if( is_voiced ) Channel_UserModeAdd( chan, c, 'v' );
|
if( is_voiced ) Channel_UserModeAdd( chan, c, 'v' );
|
||||||
|
|
||||||
/* announce to channel... */
|
/* announce to channel... */
|
||||||
@@ -250,12 +274,15 @@ IRC_NJOIN( CLIENT *Client, REQUEST *Req )
|
|||||||
}
|
}
|
||||||
|
|
||||||
if( nick_out[0] != '\0' ) strlcat( nick_out, ",", sizeof( nick_out ));
|
if( nick_out[0] != '\0' ) strlcat( nick_out, ",", sizeof( nick_out ));
|
||||||
|
if( is_owner ) strlcat( nick_out, "~", sizeof( nick_out ));
|
||||||
|
if( is_chanadmin ) strlcat( nick_out, "&", sizeof( nick_out ));
|
||||||
if( is_op ) strlcat( nick_out, "@", sizeof( nick_out ));
|
if( is_op ) strlcat( nick_out, "@", sizeof( nick_out ));
|
||||||
|
if( is_halfop ) strlcat( nick_out, "%", sizeof( nick_out ));
|
||||||
if( is_voiced ) strlcat( nick_out, "+", sizeof( nick_out ));
|
if( is_voiced ) strlcat( nick_out, "+", sizeof( nick_out ));
|
||||||
strlcat( nick_out, ptr, sizeof( nick_out ));
|
strlcat( nick_out, ptr, sizeof( nick_out ));
|
||||||
}
|
}
|
||||||
else Log( LOG_ERR, "Got NJOIN for unknown nick \"%s\" for channel \"%s\"!", ptr, channame );
|
else Log( LOG_ERR, "Got NJOIN for unknown nick \"%s\" for channel \"%s\"!", ptr, channame );
|
||||||
|
|
||||||
/* search for next Nick */
|
/* search for next Nick */
|
||||||
ptr = strtok( NULL, "," );
|
ptr = strtok( NULL, "," );
|
||||||
}
|
}
|
||||||
|
|||||||
207
src/ngircd/irc.c
207
src/ngircd/irc.c
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2004 Alexander Barton <alex@barton.de>
|
* Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -25,6 +25,7 @@
|
|||||||
#include "conn-func.h"
|
#include "conn-func.h"
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
|
#include "conn-encoding.h"
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "irc-write.h"
|
#include "irc-write.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
@@ -45,12 +46,52 @@ static bool Send_Message_Mask PARAMS((CLIENT *from, char *command,
|
|||||||
bool SendErrors));
|
bool SendErrors));
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a list limit is reached and inform client accordingly.
|
||||||
|
*
|
||||||
|
* @param From The client.
|
||||||
|
* @param Count Reply item count.
|
||||||
|
* @param Limit Reply limit.
|
||||||
|
* @param Name Name of the list.
|
||||||
|
* @return true if list limit has been reached; false otherwise.
|
||||||
|
*/
|
||||||
|
GLOBAL bool
|
||||||
|
IRC_CheckListTooBig(CLIENT *From, const int Count, const int Limit,
|
||||||
|
const char *Name)
|
||||||
|
{
|
||||||
|
assert(From != NULL);
|
||||||
|
assert(Count >= 0);
|
||||||
|
assert(Limit > 0);
|
||||||
|
assert(Name != NULL);
|
||||||
|
|
||||||
|
if (Count < Limit)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
(void)IRC_WriteStrClient(From,
|
||||||
|
"NOTICE %s :%s list limit (%d) reached!",
|
||||||
|
Client_ID(From), Name, Limit);
|
||||||
|
IRC_SetPenalty(From, 2);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_ERROR( CLIENT *Client, REQUEST *Req )
|
IRC_ERROR( CLIENT *Client, REQUEST *Req )
|
||||||
{
|
{
|
||||||
assert( Client != NULL );
|
assert( Client != NULL );
|
||||||
assert( Req != NULL );
|
assert( Req != NULL );
|
||||||
|
|
||||||
|
if (Client_Type(Client) != CLIENT_GOTPASS
|
||||||
|
&& Client_Type(Client) != CLIENT_GOTPASS_2813
|
||||||
|
&& Client_Type(Client) != CLIENT_UNKNOWNSERVER
|
||||||
|
&& Client_Type(Client) != CLIENT_SERVER
|
||||||
|
&& Client_Type(Client) != CLIENT_SERVICE) {
|
||||||
|
LogDebug("Ignored ERROR command from \"%s\" ...",
|
||||||
|
Client_Mask(Client));
|
||||||
|
IRC_SetPenalty(Client, 2);
|
||||||
|
return CONNECTED;
|
||||||
|
}
|
||||||
|
|
||||||
if (Req->argc < 1)
|
if (Req->argc < 1)
|
||||||
Log(LOG_NOTICE, "Got ERROR from \"%s\"!",
|
Log(LOG_NOTICE, "Got ERROR from \"%s\"!",
|
||||||
Client_Mask(Client));
|
Client_Mask(Client));
|
||||||
@@ -63,13 +104,21 @@ IRC_ERROR( CLIENT *Client, REQUEST *Req )
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Kill client on request.
|
* Handler for the IRC "KILL" command.
|
||||||
|
*
|
||||||
* This function implements the IRC command "KILL" wich is used to selectively
|
* This function implements the IRC command "KILL" wich is used to selectively
|
||||||
* disconnect clients. It can be used by IRC operators and servers, for example
|
* disconnect clients. It can be used by IRC operators and servers, for example
|
||||||
* to "solve" nick collisions after netsplits.
|
* to "solve" nick collisions after netsplits. See RFC 2812 section 3.7.1.
|
||||||
|
*
|
||||||
* Please note that this function is also called internally, without a real
|
* Please note that this function is also called internally, without a real
|
||||||
* KILL command being received over the network! Client is Client_ThisServer()
|
* KILL command being received over the network! Client is Client_ThisServer()
|
||||||
* in this case. */
|
* in this case, and the prefix in Req is NULL.
|
||||||
|
*
|
||||||
|
* @param Client The client from which this command has been received
|
||||||
|
* or Client_ThisServer() when generated interanlly.
|
||||||
|
* @param Req Request structure with prefix and all parameters.
|
||||||
|
* @returns CONNECTED or DISCONNECTED.
|
||||||
|
*/
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
IRC_KILL( CLIENT *Client, REQUEST *Req )
|
IRC_KILL( CLIENT *Client, REQUEST *Req )
|
||||||
{
|
{
|
||||||
@@ -77,55 +126,47 @@ IRC_KILL( CLIENT *Client, REQUEST *Req )
|
|||||||
char reason[COMMAND_LEN], *msg;
|
char reason[COMMAND_LEN], *msg;
|
||||||
CONN_ID my_conn, conn;
|
CONN_ID my_conn, conn;
|
||||||
|
|
||||||
assert( Client != NULL );
|
assert (Client != NULL);
|
||||||
assert( Req != NULL );
|
assert (Req != NULL);
|
||||||
|
|
||||||
if(( Client_Type( Client ) != CLIENT_SERVER ) &&
|
if (Client_Type(Client) != CLIENT_SERVER && !Client_OperByMe(Client))
|
||||||
( ! Client_OperByMe( Client )))
|
return IRC_WriteStrClient(Client, ERR_NOPRIVILEGES_MSG,
|
||||||
{
|
Client_ID(Client));
|
||||||
/* The originator of the KILL is neither an IRC operator of
|
|
||||||
* this server nor a server. */
|
|
||||||
return IRC_WriteStrClient( Client, ERR_NOPRIVILEGES_MSG,
|
|
||||||
Client_ID( Client ));
|
|
||||||
}
|
|
||||||
|
|
||||||
if( Req->argc != 2 )
|
if (Req->argc != 2)
|
||||||
{
|
return IRC_WriteStrClient(Client, ERR_NEEDMOREPARAMS_MSG,
|
||||||
/* This command requires exactly 2 parameters! */
|
Client_ID(Client), Req->command);
|
||||||
return IRC_WriteStrClient( Client, ERR_NEEDMOREPARAMS_MSG,
|
|
||||||
Client_ID( Client ), Req->command );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( Req->prefix ) prefix = Client_Search( Req->prefix );
|
/* Get prefix (origin); use the client if no prefix is given. */
|
||||||
else prefix = Client;
|
if (Req->prefix)
|
||||||
if( ! prefix )
|
prefix = Client_Search(Req->prefix);
|
||||||
{
|
|
||||||
Log( LOG_WARNING, "Got KILL with invalid prefix: \"%s\"!",
|
|
||||||
Req->prefix );
|
|
||||||
prefix = Client_ThisServer( );
|
|
||||||
}
|
|
||||||
|
|
||||||
if( Client != Client_ThisServer( ))
|
|
||||||
{
|
|
||||||
/* This is a "real" KILL received from the network. */
|
|
||||||
Log( LOG_NOTICE|LOG_snotice, "Got KILL command from \"%s\" for \"%s\": %s",
|
|
||||||
Client_Mask( prefix ), Req->argv[0], Req->argv[1] );
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Build reason string */
|
|
||||||
if( Client_Type( Client ) == CLIENT_USER )
|
|
||||||
{
|
|
||||||
/* Prefix the "reason" if the originator is a regular user,
|
|
||||||
* so users can't spoof KILLs of servers. */
|
|
||||||
snprintf( reason, sizeof( reason ), "KILLed by %s: %s",
|
|
||||||
Client_ID( Client ), Req->argv[1] );
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
strlcpy( reason, Req->argv[1], sizeof( reason ));
|
prefix = Client;
|
||||||
|
|
||||||
|
/* Log a warning message and use this server as origin when the
|
||||||
|
* prefix (origin) is invalid. */
|
||||||
|
if (!prefix) {
|
||||||
|
Log(LOG_WARNING, "Got KILL with invalid prefix: \"%s\"!",
|
||||||
|
Req->prefix );
|
||||||
|
prefix = Client_ThisServer();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Client != Client_ThisServer())
|
||||||
|
Log(LOG_NOTICE|LOG_snotice,
|
||||||
|
"Got KILL command from \"%s\" for \"%s\": %s",
|
||||||
|
Client_Mask(prefix), Req->argv[0], Req->argv[1]);
|
||||||
|
|
||||||
|
/* Build reason string: Prefix the "reason" if the originator is a
|
||||||
|
* regular user, so users can't spoof KILLs of servers. */
|
||||||
|
if (Client_Type(Client) == CLIENT_USER)
|
||||||
|
snprintf(reason, sizeof(reason), "KILLed by %s: %s",
|
||||||
|
Client_ID(Client), Req->argv[1]);
|
||||||
|
else
|
||||||
|
strlcpy(reason, Req->argv[1], sizeof(reason));
|
||||||
|
|
||||||
/* Inform other servers */
|
/* Inform other servers */
|
||||||
IRC_WriteStrServersPrefix( Client, prefix, "KILL %s :%s",
|
IRC_WriteStrServersPrefix(Client, prefix, "KILL %s :%s",
|
||||||
Req->argv[0], reason );
|
Req->argv[0], reason);
|
||||||
|
|
||||||
/* Save ID of this connection */
|
/* Save ID of this connection */
|
||||||
my_conn = Client_Conn( Client );
|
my_conn = Client_Conn( Client );
|
||||||
@@ -298,12 +339,18 @@ IRC_HELP( CLIENT *Client, REQUEST *Req )
|
|||||||
|
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
Option_String( CONN_ID Idx )
|
#ifdef ZLIB
|
||||||
|
Option_String(CONN_ID Idx)
|
||||||
|
#else
|
||||||
|
Option_String(UNUSED CONN_ID Idx)
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
static char option_txt[8];
|
static char option_txt[8];
|
||||||
|
#ifdef ZLIB
|
||||||
UINT16 options;
|
UINT16 options;
|
||||||
|
|
||||||
options = Conn_Options(Idx);
|
options = Conn_Options(Idx);
|
||||||
|
#endif
|
||||||
|
|
||||||
strcpy(option_txt, "F"); /* No idea what this means, but the
|
strcpy(option_txt, "F"); /* No idea what this means, but the
|
||||||
* original ircd sends it ... */
|
* original ircd sends it ... */
|
||||||
@@ -320,9 +367,11 @@ static bool
|
|||||||
Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
|
Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
|
||||||
{
|
{
|
||||||
CLIENT *cl, *from;
|
CLIENT *cl, *from;
|
||||||
|
CL2CHAN *cl2chan;
|
||||||
CHANNEL *chan;
|
CHANNEL *chan;
|
||||||
char *currentTarget = Req->argv[0];
|
char *currentTarget = Req->argv[0];
|
||||||
char *lastCurrentTarget = NULL;
|
char *lastCurrentTarget = NULL;
|
||||||
|
char *message = NULL;
|
||||||
|
|
||||||
assert(Client != NULL);
|
assert(Client != NULL);
|
||||||
assert(Req != NULL);
|
assert(Req != NULL);
|
||||||
@@ -354,6 +403,13 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
|
|||||||
return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG,
|
return IRC_WriteStrClient(Client, ERR_NOSUCHNICK_MSG,
|
||||||
Client_ID(Client), Req->prefix);
|
Client_ID(Client), Req->prefix);
|
||||||
|
|
||||||
|
#ifdef ICONV
|
||||||
|
if (Client_Conn(Client) > NONE)
|
||||||
|
message = Conn_EncodingFrom(Client_Conn(Client), Req->argv[1]);
|
||||||
|
else
|
||||||
|
#endif
|
||||||
|
message = Req->argv[1];
|
||||||
|
|
||||||
/* handle msgtarget = msgto *("," msgto) */
|
/* handle msgtarget = msgto *("," msgto) */
|
||||||
currentTarget = strtok_r(currentTarget, ",", &lastCurrentTarget);
|
currentTarget = strtok_r(currentTarget, ",", &lastCurrentTarget);
|
||||||
ngt_UpperStr(Req->command);
|
ngt_UpperStr(Req->command);
|
||||||
@@ -410,9 +466,9 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
|
|||||||
Client_Type(cl) != CLIENT_SERVICE)
|
Client_Type(cl) != CLIENT_SERVICE)
|
||||||
continue;
|
continue;
|
||||||
if (nick != NULL && host != NULL) {
|
if (nick != NULL && host != NULL) {
|
||||||
if (strcmp(nick, Client_ID(cl)) == 0 &&
|
if (strcasecmp(nick, Client_ID(cl)) == 0 &&
|
||||||
strcmp(user, Client_User(cl)) == 0 &&
|
strcasecmp(user, Client_User(cl)) == 0 &&
|
||||||
strcasecmp(host, Client_HostnameCloaked(cl)) == 0)
|
strcasecmp(host, Client_HostnameDisplayed(cl)) == 0)
|
||||||
break;
|
break;
|
||||||
else
|
else
|
||||||
continue;
|
continue;
|
||||||
@@ -420,7 +476,7 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
|
|||||||
if (strcasecmp(user, Client_User(cl)) != 0)
|
if (strcasecmp(user, Client_User(cl)) != 0)
|
||||||
continue;
|
continue;
|
||||||
if (host != NULL && strcasecmp(host,
|
if (host != NULL && strcasecmp(host,
|
||||||
Client_HostnameCloaked(cl)) != 0)
|
Client_HostnameDisplayed(cl)) != 0)
|
||||||
continue;
|
continue;
|
||||||
if (server != NULL && strcasecmp(server,
|
if (server != NULL && strcasecmp(server,
|
||||||
Client_ID(Client_Introducer(cl))) != 0)
|
Client_ID(Client_Introducer(cl))) != 0)
|
||||||
@@ -439,11 +495,11 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
|
|||||||
#else
|
#else
|
||||||
if (Client_Type(cl) != ForceType) {
|
if (Client_Type(cl) != ForceType) {
|
||||||
#endif
|
#endif
|
||||||
if (!SendErrors)
|
if (SendErrors && !IRC_WriteStrClient(
|
||||||
return CONNECTED;
|
from, ERR_NOSUCHNICK_MSG,Client_ID(from),
|
||||||
return IRC_WriteStrClient(from, ERR_NOSUCHNICK_MSG,
|
currentTarget))
|
||||||
Client_ID(from),
|
return DISCONNECTED;
|
||||||
currentTarget);
|
goto send_next_target;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef STRICT_RFC
|
#ifndef STRICT_RFC
|
||||||
@@ -455,6 +511,34 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
|
|||||||
Req->command = "PRIVMSG";
|
Req->command = "PRIVMSG";
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
if (Client_HasMode(cl, 'b') &&
|
||||||
|
!Client_HasMode(from, 'R') &&
|
||||||
|
!Client_HasMode(from, 'o') &&
|
||||||
|
!(Client_Type(from) == CLIENT_SERVER) &&
|
||||||
|
!(Client_Type(from) == CLIENT_SERVICE)) {
|
||||||
|
if (SendErrors && !IRC_WriteStrClient(from,
|
||||||
|
ERR_NONONREG_MSG,
|
||||||
|
Client_ID(from), Client_ID(cl)))
|
||||||
|
return DISCONNECTED;
|
||||||
|
goto send_next_target;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Client_HasMode(cl, 'C')) {
|
||||||
|
cl2chan = Channel_FirstChannelOf(cl);
|
||||||
|
while (cl2chan) {
|
||||||
|
chan = Channel_GetChannel(cl2chan);
|
||||||
|
if (Channel_IsMemberOf(chan, from))
|
||||||
|
break;
|
||||||
|
cl2chan = Channel_NextChannelOf(cl, cl2chan);
|
||||||
|
}
|
||||||
|
if (!cl2chan) {
|
||||||
|
if (SendErrors && !IRC_WriteStrClient(
|
||||||
|
from, ERR_NOTONSAMECHANNEL_MSG,
|
||||||
|
Client_ID(from), Client_ID(cl)))
|
||||||
|
return DISCONNECTED;
|
||||||
|
goto send_next_target;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (SendErrors && (Client_Type(Client) != CLIENT_SERVER)
|
if (SendErrors && (Client_Type(Client) != CLIENT_SERVER)
|
||||||
&& strchr(Client_Modes(cl), 'a')) {
|
&& strchr(Client_Modes(cl), 'a')) {
|
||||||
@@ -470,12 +554,12 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
|
|||||||
}
|
}
|
||||||
if (!IRC_WriteStrClientPrefix(cl, from, "%s %s :%s",
|
if (!IRC_WriteStrClientPrefix(cl, from, "%s %s :%s",
|
||||||
Req->command, Client_ID(cl),
|
Req->command, Client_ID(cl),
|
||||||
Req->argv[1]))
|
message))
|
||||||
return DISCONNECTED;
|
return DISCONNECTED;
|
||||||
} else if (ForceType != CLIENT_SERVICE
|
} else if (ForceType != CLIENT_SERVICE
|
||||||
&& (chan = Channel_Search(currentTarget))) {
|
&& (chan = Channel_Search(currentTarget))) {
|
||||||
if (!Channel_Write(chan, from, Client, Req->command,
|
if (!Channel_Write(chan, from, Client, Req->command,
|
||||||
SendErrors, Req->argv[1]))
|
SendErrors, message))
|
||||||
return DISCONNECTED;
|
return DISCONNECTED;
|
||||||
} else if (ForceType != CLIENT_SERVICE
|
} else if (ForceType != CLIENT_SERVICE
|
||||||
/* $#: server/target mask, RFC 2812, sec. 3.3.1 */
|
/* $#: server/target mask, RFC 2812, sec. 3.3.1 */
|
||||||
@@ -483,7 +567,7 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
|
|||||||
&& strchr(currentTarget, '.')) {
|
&& strchr(currentTarget, '.')) {
|
||||||
/* targetmask */
|
/* targetmask */
|
||||||
if (!Send_Message_Mask(from, Req->command, currentTarget,
|
if (!Send_Message_Mask(from, Req->command, currentTarget,
|
||||||
Req->argv[1], SendErrors))
|
message, SendErrors))
|
||||||
return DISCONNECTED;
|
return DISCONNECTED;
|
||||||
} else {
|
} else {
|
||||||
if (!SendErrors)
|
if (!SendErrors)
|
||||||
@@ -493,7 +577,10 @@ Send_Message(CLIENT * Client, REQUEST * Req, int ForceType, bool SendErrors)
|
|||||||
return DISCONNECTED;
|
return DISCONNECTED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
send_next_target:
|
||||||
currentTarget = strtok_r(NULL, ",", &lastCurrentTarget);
|
currentTarget = strtok_r(NULL, ",", &lastCurrentTarget);
|
||||||
|
if (currentTarget)
|
||||||
|
Conn_SetPenalty(Client_Conn(Client), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return CONNECTED;
|
return CONNECTED;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2008 Alexander Barton (alex@barton.de)
|
* Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -17,6 +17,9 @@
|
|||||||
* IRC commands (header)
|
* IRC commands (header)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
GLOBAL bool IRC_CheckListTooBig PARAMS((CLIENT *From, const int Count,
|
||||||
|
const int Limit, const char *Name));
|
||||||
|
|
||||||
GLOBAL bool IRC_ERROR PARAMS((CLIENT *Client, REQUEST *Req));
|
GLOBAL bool IRC_ERROR PARAMS((CLIENT *Client, REQUEST *Req));
|
||||||
GLOBAL bool IRC_KILL PARAMS((CLIENT *Client, REQUEST *Req));
|
GLOBAL bool IRC_KILL PARAMS((CLIENT *Client, REQUEST *Req));
|
||||||
GLOBAL bool IRC_NOTICE PARAMS((CLIENT *Client, REQUEST *Req));
|
GLOBAL bool IRC_NOTICE PARAMS((CLIENT *Client, REQUEST *Req));
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2005 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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -37,89 +37,176 @@
|
|||||||
#define MASK_LEN (2*CLIENT_HOST_LEN)
|
#define MASK_LEN (2*CLIENT_HOST_LEN)
|
||||||
|
|
||||||
struct list_elem {
|
struct list_elem {
|
||||||
struct list_elem *next;
|
struct list_elem *next; /** pointer to next list element */
|
||||||
char mask[MASK_LEN];
|
char mask[MASK_LEN]; /** IRC mask */
|
||||||
bool onlyonce;
|
char *reason; /** Optional "reason" text */
|
||||||
|
time_t valid_until; /** 0: unlimited; 1: once; t(>1): until t */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get IRC mask stored in list element.
|
||||||
|
*
|
||||||
|
* @param list_elem List element.
|
||||||
|
* @return Pointer to IRC mask
|
||||||
|
*/
|
||||||
GLOBAL const char *
|
GLOBAL const char *
|
||||||
Lists_GetMask(const struct list_elem *e)
|
Lists_GetMask(const struct list_elem *e)
|
||||||
{
|
{
|
||||||
|
assert(e != NULL);
|
||||||
return e->mask;
|
return e->mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get optional "reason" text stored in list element.
|
||||||
|
*
|
||||||
|
* @param list_elem List element.
|
||||||
|
* @return Pointer to "reason" text or empty string ("").
|
||||||
|
*/
|
||||||
|
GLOBAL const char *
|
||||||
|
Lists_GetReason(const struct list_elem *e)
|
||||||
|
{
|
||||||
|
assert(e != NULL);
|
||||||
|
return e->reason ? e->reason : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get "validity" value stored in list element.
|
||||||
|
*
|
||||||
|
* @param list_elem List element.
|
||||||
|
* @return Validity: 0=unlimited, 1=once, >1 until this time stamp.
|
||||||
|
*/
|
||||||
|
GLOBAL time_t
|
||||||
|
Lists_GetValidity(const struct list_elem *e)
|
||||||
|
{
|
||||||
|
assert(e != NULL);
|
||||||
|
return e->valid_until;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get first list element of a list.
|
||||||
|
*
|
||||||
|
* @param h List head.
|
||||||
|
* @return Pointer to first list element.
|
||||||
|
*/
|
||||||
GLOBAL struct list_elem*
|
GLOBAL struct list_elem*
|
||||||
Lists_GetFirst(const struct list_head *h)
|
Lists_GetFirst(const struct list_head *h)
|
||||||
{
|
{
|
||||||
|
assert(h != NULL);
|
||||||
return h->first;
|
return h->first;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get next list element of a list.
|
||||||
|
*
|
||||||
|
* @param e Current list element.
|
||||||
|
* @return Pointer to next list element.
|
||||||
|
*/
|
||||||
GLOBAL struct list_elem*
|
GLOBAL struct list_elem*
|
||||||
Lists_GetNext(const struct list_elem *e)
|
Lists_GetNext(const struct list_elem *e)
|
||||||
{
|
{
|
||||||
|
assert(e != NULL);
|
||||||
return e->next;
|
return e->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a new mask to a list.
|
||||||
|
*
|
||||||
|
* @param h List head.
|
||||||
|
* @param Mask The IRC mask to add to the list.
|
||||||
|
* @param ValidUntil 0: unlimited, 1: only once, t>1: until given time_t.
|
||||||
|
* @param Reason Reason string or NULL, if no reason should be saved.
|
||||||
|
* @return true on success, false otherwise.
|
||||||
|
*/
|
||||||
bool
|
bool
|
||||||
Lists_Add(struct list_head *header, const char *Mask, bool OnlyOnce )
|
Lists_Add(struct list_head *h, const char *Mask, time_t ValidUntil,
|
||||||
|
const char *Reason)
|
||||||
{
|
{
|
||||||
struct list_elem *e, *newelem;
|
struct list_elem *e, *newelem;
|
||||||
|
|
||||||
assert( header != NULL );
|
assert(h != NULL);
|
||||||
assert( Mask != NULL );
|
assert(Mask != NULL);
|
||||||
|
|
||||||
if (Lists_CheckDupeMask(header, Mask )) return true;
|
e = Lists_CheckDupeMask(h, Mask);
|
||||||
|
if (e) {
|
||||||
|
e->valid_until = ValidUntil;
|
||||||
|
if (Reason) {
|
||||||
|
free(e->reason);
|
||||||
|
e->reason = strdup(Reason);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
e = Lists_GetFirst(header);
|
e = Lists_GetFirst(h);
|
||||||
|
|
||||||
newelem = malloc(sizeof(struct list_elem));
|
newelem = malloc(sizeof(struct list_elem));
|
||||||
if( ! newelem ) {
|
if (!newelem) {
|
||||||
Log( LOG_EMERG, "Can't allocate memory for new Ban/Invite entry!" );
|
Log(LOG_EMERG,
|
||||||
|
"Can't allocate memory for new list entry!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
strlcpy( newelem->mask, Mask, sizeof( newelem->mask ));
|
strlcpy(newelem->mask, Mask, sizeof(newelem->mask));
|
||||||
newelem->onlyonce = OnlyOnce;
|
if (Reason) {
|
||||||
|
newelem->reason = strdup(Reason);
|
||||||
|
if (!newelem->reason)
|
||||||
|
Log(LOG_EMERG,
|
||||||
|
"Can't allocate memory for new list reason text!");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
newelem->reason = NULL;
|
||||||
|
newelem->valid_until = ValidUntil;
|
||||||
newelem->next = e;
|
newelem->next = e;
|
||||||
header->first = newelem;
|
h->first = newelem;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete a list element from a list.
|
||||||
|
*
|
||||||
|
* @param h List head.
|
||||||
|
* @param p Pointer to previous list element or NULL, if there is none.
|
||||||
|
* @param victim List element to delete.
|
||||||
|
*/
|
||||||
static void
|
static void
|
||||||
Lists_Unlink(struct list_head *header, struct list_elem *p, struct list_elem *victim)
|
Lists_Unlink(struct list_head *h, struct list_elem *p, struct list_elem *victim)
|
||||||
{
|
{
|
||||||
assert(victim != NULL);
|
assert(victim != NULL);
|
||||||
assert(header != NULL);
|
assert(h != NULL);
|
||||||
|
|
||||||
if (p) p->next = victim->next;
|
if (p)
|
||||||
else header->first = victim->next;
|
p->next = victim->next;
|
||||||
|
else
|
||||||
|
h->first = victim->next;
|
||||||
|
|
||||||
|
if (victim->reason)
|
||||||
|
free(victim->reason);
|
||||||
|
|
||||||
free(victim);
|
free(victim);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete a given IRC mask from a list.
|
||||||
|
*
|
||||||
|
* @param h List head.
|
||||||
|
* @param Mask IRC mask to delete from the list.
|
||||||
|
*/
|
||||||
GLOBAL void
|
GLOBAL void
|
||||||
Lists_Del(struct list_head *header, const char *Mask)
|
Lists_Del(struct list_head *h, const char *Mask)
|
||||||
{
|
{
|
||||||
struct list_elem *e, *last, *victim;
|
struct list_elem *e, *last, *victim;
|
||||||
|
|
||||||
assert( header != NULL );
|
assert(h != NULL);
|
||||||
assert( Mask != NULL );
|
assert(Mask != NULL);
|
||||||
|
|
||||||
last = NULL;
|
last = NULL;
|
||||||
e = Lists_GetFirst(header);
|
e = Lists_GetFirst(h);
|
||||||
while( e ) {
|
while (e) {
|
||||||
if(strcasecmp( e->mask, Mask ) == 0 ) {
|
if (strcasecmp(e->mask, Mask) == 0) {
|
||||||
LogDebug("Deleted \"%s\" from list", e->mask);
|
LogDebug("Deleted \"%s\" from list", e->mask);
|
||||||
victim = e;
|
victim = e;
|
||||||
e = victim->next;
|
e = victim->next;
|
||||||
Lists_Unlink(header, last, victim);
|
Lists_Unlink(h, last, victim);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
last = e;
|
last = e;
|
||||||
@@ -127,7 +214,11 @@ Lists_Del(struct list_head *header, const char *Mask)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Free a complete list.
|
||||||
|
*
|
||||||
|
* @param head List head.
|
||||||
|
*/
|
||||||
GLOBAL void
|
GLOBAL void
|
||||||
Lists_Free(struct list_head *head)
|
Lists_Free(struct list_head *head)
|
||||||
{
|
{
|
||||||
@@ -138,101 +229,193 @@ Lists_Free(struct list_head *head)
|
|||||||
e = head->first;
|
e = head->first;
|
||||||
head->first = NULL;
|
head->first = NULL;
|
||||||
while (e) {
|
while (e) {
|
||||||
LogDebug("Deleted \"%s\" from invite list" , e->mask);
|
LogDebug("Deleted \"%s\" from list" , e->mask);
|
||||||
victim = e;
|
victim = e;
|
||||||
e = e->next;
|
e = e->next;
|
||||||
free( victim );
|
if (victim->reason)
|
||||||
|
free(victim->reason);
|
||||||
|
free(victim);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
GLOBAL bool
|
* Check if an IRC mask is already contained in a list.
|
||||||
|
*
|
||||||
|
* @param h List head.
|
||||||
|
* @param Mask IRC mask to test.
|
||||||
|
* @return true if mask is already stored in the list, false otherwise.
|
||||||
|
*/
|
||||||
|
GLOBAL struct list_elem *
|
||||||
Lists_CheckDupeMask(const struct list_head *h, const char *Mask )
|
Lists_CheckDupeMask(const struct list_head *h, const char *Mask )
|
||||||
{
|
{
|
||||||
struct list_elem *e;
|
struct list_elem *e;
|
||||||
e = h->first;
|
e = h->first;
|
||||||
while (e) {
|
while (e) {
|
||||||
if (strcasecmp( e->mask, Mask ) == 0 )
|
if (strcasecmp(e->mask, Mask) == 0)
|
||||||
return true;
|
return e;
|
||||||
e = e->next;
|
e = e->next;
|
||||||
}
|
}
|
||||||
return false;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate a valid IRC mask from "any" string given.
|
||||||
|
*
|
||||||
|
* Attention: This mask is only valid until the next call to Lists_MakeMask(),
|
||||||
|
* because a single global buffer ist used! You have to copy the generated
|
||||||
|
* mask to some sane location yourself!
|
||||||
|
*
|
||||||
|
* @param Pattern Source string to generate an IRC mask for.
|
||||||
|
* @return Pointer to global result buffer.
|
||||||
|
*/
|
||||||
GLOBAL const char *
|
GLOBAL const char *
|
||||||
Lists_MakeMask(const char *Pattern)
|
Lists_MakeMask(const char *Pattern)
|
||||||
{
|
{
|
||||||
/* This function generats a valid IRC mask of "any" string. This
|
|
||||||
* mask is only valid until the next call to Lists_MakeMask(),
|
|
||||||
* because a single global buffer is used. You have to copy the
|
|
||||||
* generated mask to some sane location yourself! */
|
|
||||||
|
|
||||||
static char TheMask[MASK_LEN];
|
static char TheMask[MASK_LEN];
|
||||||
char *excl, *at;
|
char *excl, *at;
|
||||||
|
|
||||||
assert( Pattern != NULL );
|
assert(Pattern != NULL);
|
||||||
|
|
||||||
excl = strchr( Pattern, '!' );
|
excl = strchr(Pattern, '!');
|
||||||
at = strchr( Pattern, '@' );
|
at = strchr(Pattern, '@');
|
||||||
|
|
||||||
if(( at ) && ( at < excl )) excl = NULL;
|
if (at && at < excl)
|
||||||
|
excl = NULL;
|
||||||
|
|
||||||
if(( ! at ) && ( ! excl ))
|
if (!at && !excl) {
|
||||||
{
|
/* Neither "!" nor "@" found: use string as nickname */
|
||||||
/* Neither "!" nor "@" found: use string as nick name */
|
strlcpy(TheMask, Pattern, sizeof(TheMask) - 5);
|
||||||
strlcpy( TheMask, Pattern, sizeof( TheMask ) - 5 );
|
strlcat(TheMask, "!*@*", sizeof(TheMask));
|
||||||
strlcat( TheMask, "!*@*", sizeof( TheMask ));
|
|
||||||
return TheMask;
|
return TheMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(( ! at ) && ( excl ))
|
if (!at && excl) {
|
||||||
{
|
|
||||||
/* Domain part is missing */
|
/* Domain part is missing */
|
||||||
strlcpy( TheMask, Pattern, sizeof( TheMask ) - 3 );
|
strlcpy(TheMask, Pattern, sizeof(TheMask) - 3);
|
||||||
strlcat( TheMask, "@*", sizeof( TheMask ));
|
strlcat(TheMask, "@*", sizeof(TheMask));
|
||||||
return TheMask;
|
return TheMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(( at ) && ( ! excl ))
|
if (at && !excl) {
|
||||||
{
|
|
||||||
/* User name is missing */
|
/* User name is missing */
|
||||||
*at = '\0'; at++;
|
*at = '\0'; at++;
|
||||||
strlcpy( TheMask, Pattern, sizeof( TheMask ) - 5 );
|
strlcpy(TheMask, Pattern, sizeof(TheMask) - 5);
|
||||||
strlcat( TheMask, "!*@", sizeof( TheMask ));
|
strlcat(TheMask, "!*@", sizeof(TheMask));
|
||||||
strlcat( TheMask, at, sizeof( TheMask ));
|
strlcat(TheMask, at, sizeof(TheMask));
|
||||||
return TheMask;
|
return TheMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* All parts (nick, user and domain name) are given */
|
/* All parts (nick, user and domain name) are given */
|
||||||
strlcpy( TheMask, Pattern, sizeof( TheMask ));
|
strlcpy(TheMask, Pattern, sizeof(TheMask));
|
||||||
return TheMask;
|
return TheMask;
|
||||||
} /* Lists_MakeMask */
|
} /* Lists_MakeMask */
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if a client is listed in a list.
|
||||||
|
*
|
||||||
|
* @param h List head.
|
||||||
|
* @param Client Client to check.
|
||||||
|
* @return true if client is listed, false if not.
|
||||||
|
*/
|
||||||
bool
|
bool
|
||||||
Lists_Check( struct list_head *header, CLIENT *Client)
|
Lists_Check(struct list_head *h, CLIENT *Client)
|
||||||
{
|
{
|
||||||
struct list_elem *e, *last;
|
return Lists_CheckReason(h, Client) != NULL;
|
||||||
|
}
|
||||||
|
|
||||||
assert( header != NULL );
|
/**
|
||||||
|
* Check if a client is listed in a list and return the "reason".
|
||||||
|
*
|
||||||
|
* @param h List head.
|
||||||
|
* @param Client Client to check.
|
||||||
|
* @return true if client is listed, false if not.
|
||||||
|
*/
|
||||||
|
char *
|
||||||
|
Lists_CheckReason(struct list_head *h, CLIENT *Client)
|
||||||
|
{
|
||||||
|
struct list_elem *e, *last, *next;
|
||||||
|
|
||||||
e = header->first;
|
assert(h != NULL);
|
||||||
|
|
||||||
|
e = h->first;
|
||||||
last = NULL;
|
last = NULL;
|
||||||
|
|
||||||
while( e ) {
|
while (e) {
|
||||||
if( Match( e->mask, Client_Mask( Client ))) {
|
next = e->next;
|
||||||
if( e->onlyonce ) { /* delete entry */
|
if (Match(e->mask, Client_Mask(Client))) {
|
||||||
LogDebug("Deleted \"%s\" from list", e->mask);
|
if (e->valid_until == 1) {
|
||||||
Lists_Unlink(header, last, e);
|
/* Entry is valid only once, delete it */
|
||||||
|
LogDebug("Deleted \"%s\" from list (used).",
|
||||||
|
e->mask);
|
||||||
|
Lists_Unlink(h, last, e);
|
||||||
}
|
}
|
||||||
return true;
|
return e->reason ? e->reason : "";
|
||||||
}
|
}
|
||||||
last = e;
|
last = e;
|
||||||
e = e->next;
|
e = next;
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check list and purge expired entries.
|
||||||
|
*
|
||||||
|
* @param h List head.
|
||||||
|
*/
|
||||||
|
GLOBAL void
|
||||||
|
Lists_Expire(struct list_head *h, const char *ListName)
|
||||||
|
{
|
||||||
|
struct list_elem *e, *last, *next;
|
||||||
|
time_t now;
|
||||||
|
|
||||||
|
assert(h != NULL);
|
||||||
|
|
||||||
|
e = h->first;
|
||||||
|
last = NULL;
|
||||||
|
now = time(NULL);
|
||||||
|
|
||||||
|
while (e) {
|
||||||
|
next = e->next;
|
||||||
|
if (e->valid_until > 1 && e->valid_until < now) {
|
||||||
|
/* Entry is expired, delete it */
|
||||||
|
if (e->reason)
|
||||||
|
Log(LOG_INFO,
|
||||||
|
"Deleted \"%s\" (\"%s\") from %s list (expired).",
|
||||||
|
e->mask, e->reason, ListName);
|
||||||
|
else
|
||||||
|
Log(LOG_INFO,
|
||||||
|
"Deleted \"%s\" from %s list (expired).",
|
||||||
|
e->mask, ListName);
|
||||||
|
Lists_Unlink(h, last, e);
|
||||||
|
e = next;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
last = e;
|
||||||
|
e = next;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return the number of entries of a list.
|
||||||
|
*
|
||||||
|
* @param h List head.
|
||||||
|
* @return Number of items.
|
||||||
|
*/
|
||||||
|
GLOBAL unsigned long
|
||||||
|
Lists_Count(struct list_head *h)
|
||||||
|
{
|
||||||
|
struct list_elem *e;
|
||||||
|
unsigned long count = 0;
|
||||||
|
|
||||||
|
assert(h != NULL);
|
||||||
|
|
||||||
|
e = h->first;
|
||||||
|
while (e) {
|
||||||
|
count++;
|
||||||
|
e = e->next;
|
||||||
|
}
|
||||||
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* -eof- */
|
/* -eof- */
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
* Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -29,18 +29,24 @@ struct list_head {
|
|||||||
GLOBAL struct list_elem *Lists_GetFirst PARAMS((const struct list_head *));
|
GLOBAL struct list_elem *Lists_GetFirst PARAMS((const struct list_head *));
|
||||||
GLOBAL struct list_elem *Lists_GetNext PARAMS((const struct list_elem *));
|
GLOBAL struct list_elem *Lists_GetNext PARAMS((const struct list_elem *));
|
||||||
|
|
||||||
GLOBAL bool Lists_Check PARAMS((struct list_head *head, CLIENT *client ));
|
GLOBAL bool Lists_Check PARAMS((struct list_head *head, CLIENT *client));
|
||||||
GLOBAL bool Lists_CheckDupeMask PARAMS((const struct list_head *head, const char *mask ));
|
GLOBAL char *Lists_CheckReason PARAMS((struct list_head *head, CLIENT *client));
|
||||||
|
GLOBAL struct list_elem *Lists_CheckDupeMask PARAMS((const struct list_head *head,
|
||||||
|
const char *mask));
|
||||||
|
|
||||||
GLOBAL bool Lists_Add PARAMS((struct list_head *header, const char *Mask, bool OnlyOnce ));
|
GLOBAL bool Lists_Add PARAMS((struct list_head *h, const char *Mask,
|
||||||
GLOBAL void Lists_Del PARAMS((struct list_head *head, const char *Mask ));
|
time_t ValidUntil, const char *Reason));
|
||||||
|
GLOBAL void Lists_Del PARAMS((struct list_head *head, const char *Mask));
|
||||||
|
GLOBAL unsigned long Lists_Count PARAMS((struct list_head *h));
|
||||||
|
|
||||||
GLOBAL bool Lists_AlreadyRegistered PARAMS(( const struct list_head *head, const char *Mask));
|
GLOBAL void Lists_Free PARAMS((struct list_head *head));
|
||||||
|
|
||||||
GLOBAL void Lists_Free PARAMS(( struct list_head *head ));
|
|
||||||
|
|
||||||
GLOBAL const char *Lists_MakeMask PARAMS((const char *Pattern));
|
GLOBAL const char *Lists_MakeMask PARAMS((const char *Pattern));
|
||||||
GLOBAL const char *Lists_GetMask PARAMS(( const struct list_elem *e ));
|
GLOBAL const char *Lists_GetMask PARAMS((const struct list_elem *e));
|
||||||
|
GLOBAL const char *Lists_GetReason PARAMS((const struct list_elem *e));
|
||||||
|
GLOBAL time_t Lists_GetValidity PARAMS((const struct list_elem *e));
|
||||||
|
|
||||||
|
GLOBAL void Lists_Expire PARAMS((struct list_head *h, const char *ListName));
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* 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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -44,7 +44,6 @@
|
|||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
|
|
||||||
static char Init_Txt[127];
|
|
||||||
static bool Is_Daemon;
|
static bool Is_Daemon;
|
||||||
|
|
||||||
|
|
||||||
@@ -65,49 +64,48 @@ 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
|
GLOBAL void
|
||||||
Log_Init( bool Daemon_Mode )
|
Log_Init(bool Daemon_Mode)
|
||||||
{
|
{
|
||||||
Is_Daemon = Daemon_Mode;
|
Is_Daemon = Daemon_Mode;
|
||||||
|
|
||||||
#ifdef SYSLOG
|
#ifdef SYSLOG
|
||||||
#ifndef LOG_CONS /* Kludge: mips-dec-ultrix4.5 has no LOG_CONS */
|
#ifndef LOG_CONS /* Kludge: mips-dec-ultrix4.5 has no LOG_CONS */
|
||||||
#define LOG_CONS 0
|
#define LOG_CONS 0
|
||||||
#endif
|
#endif
|
||||||
openlog(PACKAGE_NAME, LOG_CONS|LOG_PID, Conf_SyslogFacility);
|
#ifdef LOG_DAEMON
|
||||||
|
openlog(PACKAGE, LOG_CONS|LOG_PID, LOG_DAEMON);
|
||||||
|
#else
|
||||||
|
openlog(PACKAGE, LOG_CONS|LOG_PID, 0);
|
||||||
#endif
|
#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
|
#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_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, LOG_CONS|LOG_PID, Conf_SyslogFacility);
|
||||||
|
#endif
|
||||||
|
Log(LOG_NOTICE, "%s started.", NGIRCd_Version);
|
||||||
|
Log(LOG_INFO, "Using configuration file \"%s\" ...", NGIRCd_ConfFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
GLOBAL void
|
GLOBAL void
|
||||||
Log_Exit( void )
|
Log_Exit( void )
|
||||||
{
|
{
|
||||||
@@ -220,7 +218,7 @@ GLOBAL void
|
|||||||
Log_Init_Subprocess(char UNUSED *Name)
|
Log_Init_Subprocess(char UNUSED *Name)
|
||||||
{
|
{
|
||||||
#ifdef SYSLOG
|
#ifdef SYSLOG
|
||||||
openlog(PACKAGE_NAME, LOG_CONS|LOG_PID, Conf_SyslogFacility);
|
openlog(PACKAGE, LOG_CONS|LOG_PID, Conf_SyslogFacility);
|
||||||
#endif
|
#endif
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
Log_Subprocess(LOG_DEBUG, "%s sub-process starting, PID %ld.",
|
Log_Subprocess(LOG_DEBUG, "%s sub-process starting, PID %ld.",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* 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
|
* 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
|
* 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_Exit PARAMS(( void ));
|
||||||
|
|
||||||
GLOBAL void Log PARAMS(( int Level, const char *Format, ... ));
|
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, ...));
|
GLOBAL void Log_ServerNotice PARAMS((char UserMode, const char *Format, ...));
|
||||||
|
|
||||||
|
|||||||
244
src/ngircd/login.c
Normal file
244
src/ngircd/login.c
Normal file
@@ -0,0 +1,244 @@
|
|||||||
|
/*
|
||||||
|
* 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(Conn_Password(conn)[0] == '\0')
|
||||||
|
return Login_User_PostAuth(Client);
|
||||||
|
Client_Reject(Client, "Non-empty password", false);
|
||||||
|
return DISCONNECTED;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Conf_PAMIsOptional &&
|
||||||
|
strcmp(Conn_Password(conn), "") == 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(Conn_Password(conn), 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, HOST_CPU,
|
||||||
|
HOST_VENDOR, HOST_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- */
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
* Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -48,9 +48,9 @@ static int Matche_After_Star PARAMS(( const char *p, const char *t ));
|
|||||||
/**
|
/**
|
||||||
* Match string with pattern.
|
* Match string with pattern.
|
||||||
*
|
*
|
||||||
* @param Pattern Pattern to match with
|
* @param Pattern Pattern to match with
|
||||||
* @param String Input string
|
* @param String Input string
|
||||||
* @return true if pattern matches
|
* @return true if pattern matches
|
||||||
*/
|
*/
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
Match( const char *Pattern, const char *String )
|
Match( const char *Pattern, const char *String )
|
||||||
@@ -64,17 +64,46 @@ Match( const char *Pattern, const char *String )
|
|||||||
/**
|
/**
|
||||||
* Match string with pattern case-insensitive.
|
* Match string with pattern case-insensitive.
|
||||||
*
|
*
|
||||||
* @param pattern Pattern to match with
|
* @param Pattern Pattern to match with
|
||||||
* @param searchme Input string, at most COMMAND_LEN-1 characters long
|
* @param String Input string, at most COMMAND_LEN-1 characters long
|
||||||
* @return true if pattern matches
|
* @return true if pattern matches
|
||||||
*/
|
*/
|
||||||
GLOBAL bool
|
GLOBAL bool
|
||||||
MatchCaseInsensitive(const char *pattern, const char *searchme)
|
MatchCaseInsensitive(const char *Pattern, const char *String)
|
||||||
{
|
{
|
||||||
char haystack[COMMAND_LEN];
|
char haystack[COMMAND_LEN];
|
||||||
|
|
||||||
strlcpy(haystack, searchme, sizeof(haystack));
|
strlcpy(haystack, String, sizeof(haystack));
|
||||||
return Match(pattern, ngt_LowerStr(haystack));
|
return Match(Pattern, ngt_LowerStr(haystack));
|
||||||
|
} /* MatchCaseInsensitive */
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Match string with pattern case-insensitive.
|
||||||
|
*
|
||||||
|
* @param pattern Pattern to match with
|
||||||
|
* @param String Input string, at most COMMAND_LEN-1 characters long
|
||||||
|
* @param Separator Character separating the individual patterns in the list
|
||||||
|
* @return true if pattern matches
|
||||||
|
*/
|
||||||
|
GLOBAL bool
|
||||||
|
MatchCaseInsensitiveList(const char *Pattern, const char *String,
|
||||||
|
const char *Separator)
|
||||||
|
{
|
||||||
|
char tmp_pattern[COMMAND_LEN], haystack[COMMAND_LEN], *ptr;
|
||||||
|
|
||||||
|
strlcpy(tmp_pattern, Pattern, sizeof(tmp_pattern));
|
||||||
|
strlcpy(haystack, String, sizeof(haystack));
|
||||||
|
ngt_LowerStr(haystack);
|
||||||
|
|
||||||
|
ptr = strtok(tmp_pattern, Separator);
|
||||||
|
while (ptr) {
|
||||||
|
ngt_TrimStr(ptr);
|
||||||
|
if (Match(ptr, haystack))
|
||||||
|
return true;
|
||||||
|
ptr = strtok(NULL, Separator);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
} /* MatchCaseInsensitive */
|
} /* MatchCaseInsensitive */
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001,2002 by Alexander Barton (alex@barton.de)
|
* Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -17,8 +17,14 @@
|
|||||||
* Wildcard pattern matching (header)
|
* Wildcard pattern matching (header)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
GLOBAL bool Match PARAMS(( const char *Pattern, const char *String ));
|
GLOBAL bool Match PARAMS((const char *Pattern, const char *String));
|
||||||
GLOBAL bool MatchCaseInsensitive PARAMS(( const char *Pattern, const char *searchme ));
|
|
||||||
|
GLOBAL bool MatchCaseInsensitive PARAMS((const char *Pattern,
|
||||||
|
const char *String));
|
||||||
|
|
||||||
|
GLOBAL bool MatchCaseInsensitiveList PARAMS((const char *Pattern,
|
||||||
|
const char *String,
|
||||||
|
const char *Separator));
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2010 Alexander Barton <alex@barton.de>
|
* Copyright (c)2001-2012 Alexander Barton (alex@barton.de) and Contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -21,19 +21,19 @@
|
|||||||
#define RPL_YOURHOST_MSG "002 %s :Your host is %s, running version ngircd-%s (%s/%s/%s)"
|
#define RPL_YOURHOST_MSG "002 %s :Your host is %s, running version ngircd-%s (%s/%s/%s)"
|
||||||
#define RPL_CREATED_MSG "003 %s :This server has been started %s"
|
#define RPL_CREATED_MSG "003 %s :This server has been started %s"
|
||||||
#define RPL_MYINFO_MSG "004 %s %s ngircd-%s %s %s"
|
#define RPL_MYINFO_MSG "004 %s %s ngircd-%s %s %s"
|
||||||
#define RPL_ISUPPORT1_MSG "005 %s RFC2812 IRCD=ngIRCd CASEMAPPING=ascii PREFIX=(ov)@+ CHANTYPES=#&+ CHANMODES=bI,k,l,imnPst CHANLIMIT=#&+:%d :are supported on this server"
|
#define RPL_ISUPPORT1_MSG "005 %s RFC2812 IRCD=ngIRCd CHARSET=UTF-8 CASEMAPPING=ascii PREFIX=(qaohv)~&@%%+ CHANTYPES=#&+ CHANMODES=beI,k,l,imMnOPQRstVz CHANLIMIT=#&+:%d :are supported on this server"
|
||||||
#define RPL_ISUPPORT2_MSG "005 %s CHANNELLEN=%d NICKLEN=%d TOPICLEN=%d AWAYLEN=%d KICKLEN=%d PENALTY :are supported on this server"
|
#define RPL_ISUPPORT2_MSG "005 %s CHANNELLEN=%d NICKLEN=%d TOPICLEN=%d AWAYLEN=%d KICKLEN=%d MODES=%d MAXLIST=beI:%d EXCEPTS=e INVEX=I PENALTY :are supported on this server"
|
||||||
|
|
||||||
#define RPL_TRACELINK_MSG "200 %s Link %s-%s %s %s V%s %ld %d %d"
|
#define RPL_TRACELINK_MSG "200 %s Link %s-%s %s %s V%s %ld %d %d"
|
||||||
#define RPL_TRACEOPERATOR_MSG "204 %s Oper 2 :%s"
|
#define RPL_TRACEOPERATOR_MSG "204 %s Oper 2 :%s"
|
||||||
#define RPL_TRACESERVER_MSG "206 %s Serv 1 0S 0C %s[%s@%s] *!*@%s :V%s"
|
#define RPL_TRACESERVER_MSG "206 %s Serv 1 0S 0C %s[%s@%s] *!*@%s :V%s"
|
||||||
#define RPL_STATSLINKINFO_MSG "211 %s %s %d %ld %ld %ld %ld :%ld"
|
#define RPL_STATSLINKINFO_MSG "211 %s %s %d %ld %ld %ld %ld :%ld"
|
||||||
#define RPL_STATSCOMMANDS_MSG "212 %s %s %ld %ld %ld"
|
#define RPL_STATSCOMMANDS_MSG "212 %s %s %ld %ld %ld"
|
||||||
|
#define RPL_STATSXLINE_MSG "216 %s %c %s %ld :%s"
|
||||||
#define RPL_ENDOFSTATS_MSG "219 %s %c :End of STATS report"
|
#define RPL_ENDOFSTATS_MSG "219 %s %c :End of STATS report"
|
||||||
#define RPL_UMODEIS_MSG "221 %s +%s"
|
#define RPL_UMODEIS_MSG "221 %s +%s"
|
||||||
#define RPL_SERVLIST_MSG "234 %s %s %s %s %d %d :%s"
|
#define RPL_SERVLIST_MSG "234 %s %s %s %s %d %d :%s"
|
||||||
#define RPL_SERVLISTEND_MSG "235 %s %s %s :End of service listing"
|
#define RPL_SERVLISTEND_MSG "235 %s %s %s :End of service listing"
|
||||||
|
|
||||||
#define RPL_STATSUPTIME "242 %s :Server Up %u days %u:%02u:%02u"
|
#define RPL_STATSUPTIME "242 %s :Server Up %u days %u:%02u:%02u"
|
||||||
#define RPL_LUSERCLIENT_MSG "251 %s :There are %ld users and %ld services on %ld servers"
|
#define RPL_LUSERCLIENT_MSG "251 %s :There are %ld users and %ld services on %ld servers"
|
||||||
#define RPL_LUSEROP_MSG "252 %s %lu :operator(s) online"
|
#define RPL_LUSEROP_MSG "252 %s %lu :operator(s) online"
|
||||||
@@ -55,6 +55,7 @@
|
|||||||
#define RPL_ISON_MSG "303 %s :"
|
#define RPL_ISON_MSG "303 %s :"
|
||||||
#define RPL_UNAWAY_MSG "305 %s :You are no longer marked as being away"
|
#define RPL_UNAWAY_MSG "305 %s :You are no longer marked as being away"
|
||||||
#define RPL_NOWAWAY_MSG "306 %s :You have been marked as being away"
|
#define RPL_NOWAWAY_MSG "306 %s :You have been marked as being away"
|
||||||
|
#define RPL_WHOISREGNICK_MSG "307 %s %s :is a registered nick"
|
||||||
#define RPL_WHOISUSER_MSG "311 %s %s %s %s * :%s"
|
#define RPL_WHOISUSER_MSG "311 %s %s %s %s * :%s"
|
||||||
#define RPL_WHOISSERVER_MSG "312 %s %s %s :%s"
|
#define RPL_WHOISSERVER_MSG "312 %s %s %s :%s"
|
||||||
#define RPL_WHOISOPERATOR_MSG "313 %s %s :is an IRC operator"
|
#define RPL_WHOISOPERATOR_MSG "313 %s %s :is an IRC operator"
|
||||||
@@ -70,9 +71,12 @@
|
|||||||
#define RPL_NOTOPIC_MSG "331 %s %s :No topic is set"
|
#define RPL_NOTOPIC_MSG "331 %s %s :No topic is set"
|
||||||
#define RPL_TOPIC_MSG "332 %s %s :%s"
|
#define RPL_TOPIC_MSG "332 %s %s :%s"
|
||||||
#define RPL_TOPICSETBY_MSG "333 %s %s %s %u"
|
#define RPL_TOPICSETBY_MSG "333 %s %s %s %u"
|
||||||
|
#define RPL_WHOISBOT_MSG "335 %s %s :is a IRC Bot"
|
||||||
#define RPL_INVITING_MSG "341 %s %s %s%s"
|
#define RPL_INVITING_MSG "341 %s %s %s%s"
|
||||||
#define RPL_INVITELIST_MSG "346 %s %s %s"
|
#define RPL_INVITELIST_MSG "346 %s %s %s"
|
||||||
#define RPL_ENDOFINVITELIST_MSG "347 %s %s :End of channel invite list"
|
#define RPL_ENDOFINVITELIST_MSG "347 %s %s :End of channel invite list"
|
||||||
|
#define RPL_EXCEPTLIST_MSG "348 %s %s %s"
|
||||||
|
#define RPL_ENDOFEXCEPTLIST_MSG "349 %s %s :End of channel exception list"
|
||||||
#define RPL_VERSION_MSG "351 %s %s-%s.%s %s :%s"
|
#define RPL_VERSION_MSG "351 %s %s-%s.%s %s :%s"
|
||||||
#define RPL_WHOREPLY_MSG "352 %s %s %s %s %s %s %s :%d %s"
|
#define RPL_WHOREPLY_MSG "352 %s %s %s %s %s %s %s :%d %s"
|
||||||
#define RPL_NAMREPLY_MSG "353 %s %s %s :"
|
#define RPL_NAMREPLY_MSG "353 %s %s %s :"
|
||||||
@@ -87,9 +91,13 @@
|
|||||||
#define RPL_MOTD_MSG "372 %s :- %s"
|
#define RPL_MOTD_MSG "372 %s :- %s"
|
||||||
#define RPL_MOTDSTART_MSG "375 %s :- %s message of the day"
|
#define RPL_MOTDSTART_MSG "375 %s :- %s message of the day"
|
||||||
#define RPL_ENDOFMOTD_MSG "376 %s :End of MOTD command"
|
#define RPL_ENDOFMOTD_MSG "376 %s :End of MOTD command"
|
||||||
|
#define RPL_WHOISHOST_MSG "378 %s %s :is connecting from *@%s %s"
|
||||||
|
#define RPL_WHOISMODES_MSG "379 %s %s :is using modes +%s"
|
||||||
#define RPL_YOUREOPER_MSG "381 %s :You are now an IRC Operator"
|
#define RPL_YOUREOPER_MSG "381 %s :You are now an IRC Operator"
|
||||||
|
#define RPL_REHASHING_MSG "382 %s :Rehashing"
|
||||||
#define RPL_YOURESERVICE_MSG "383 %s :You are service %s"
|
#define RPL_YOURESERVICE_MSG "383 %s :You are service %s"
|
||||||
#define RPL_TIME_MSG "391 %s %s :%s"
|
#define RPL_TIME_MSG "391 %s %s :%s"
|
||||||
|
#define RPL_HOSTHIDDEN_MSG "396 %s %s :is your displayed hostname now"
|
||||||
|
|
||||||
#define ERR_NOSUCHNICK_MSG "401 %s %s :No such nick or channel name"
|
#define ERR_NOSUCHNICK_MSG "401 %s %s :No such nick or channel name"
|
||||||
#define ERR_NOSUCHSERVER_MSG "402 %s %s :No such server"
|
#define ERR_NOSUCHSERVER_MSG "402 %s %s :No such server"
|
||||||
@@ -98,6 +106,7 @@
|
|||||||
#define ERR_TOOMANYCHANNELS_MSG "405 %s %s :You have joined too many channels"
|
#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_WASNOSUCHNICK_MSG "406 %s %s :There was no such nickname"
|
||||||
#define ERR_NOORIGIN_MSG "409 %s :No origin specified"
|
#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_NORECIPIENT_MSG "411 %s :No recipient given (%s)"
|
||||||
#define ERR_NOTEXTTOSEND_MSG "412 %s :No text to send"
|
#define ERR_NOTEXTTOSEND_MSG "412 %s :No text to send"
|
||||||
#define ERR_WILDTOPLEVEL "414 %s :Wildcard in toplevel domain"
|
#define ERR_WILDTOPLEVEL "414 %s :Wildcard in toplevel domain"
|
||||||
@@ -105,39 +114,58 @@
|
|||||||
#define ERR_NOMOTD_MSG "422 %s :MOTD file is missing"
|
#define ERR_NOMOTD_MSG "422 %s :MOTD file is missing"
|
||||||
#define ERR_NONICKNAMEGIVEN_MSG "431 %s :No nickname given"
|
#define ERR_NONICKNAMEGIVEN_MSG "431 %s :No nickname given"
|
||||||
#define ERR_ERRONEUSNICKNAME_MSG "432 %s %s :Erroneous nickname"
|
#define ERR_ERRONEUSNICKNAME_MSG "432 %s %s :Erroneous nickname"
|
||||||
|
#define ERR_NICKNAMETOOLONG_MSG "432 %s %s :Nickname too long, max. %u characters"
|
||||||
|
#define ERR_FORBIDDENNICKNAME_MSG "432 %s %s :Nickname is forbidden/blocked"
|
||||||
#define ERR_NICKNAMEINUSE_MSG "433 %s %s :Nickname already in use"
|
#define ERR_NICKNAMEINUSE_MSG "433 %s %s :Nickname already in use"
|
||||||
#define ERR_USERNOTINCHANNEL_MSG "441 %s %s %s :They aren't on that channel"
|
#define ERR_USERNOTINCHANNEL_MSG "441 %s %s %s :They aren't on that channel"
|
||||||
#define ERR_NOTONCHANNEL_MSG "442 %s %s :You are not on that channel"
|
#define ERR_NOTONCHANNEL_MSG "442 %s %s :You are not on that channel"
|
||||||
#define ERR_USERONCHANNEL_MSG "443 %s %s %s :is already on channel"
|
#define ERR_USERONCHANNEL_MSG "443 %s %s %s :is already on channel"
|
||||||
#define ERR_SUMMONDISABLED_MSG "445 %s %s :SUMMON has been disabled"
|
#define ERR_SUMMONDISABLED_MSG "445 %s :SUMMON has been disabled"
|
||||||
#define ERR_USERSDISABLED_MSG "446 %s %s :USERS has been disabled"
|
#define ERR_USERSDISABLED_MSG "446 %s :USERS has been disabled"
|
||||||
#define ERR_NOTREGISTERED_MSG "451 %s :Connection not registered"
|
#define ERR_NOTREGISTERED_MSG "451 %s :Connection not registered"
|
||||||
#define ERR_NOTREGISTEREDSERVER_MSG "451 %s :Connection not registered as server link"
|
#define ERR_NOTREGISTEREDSERVER_MSG "451 %s :Connection not registered as server link"
|
||||||
#define ERR_NEEDMOREPARAMS_MSG "461 %s %s :Syntax error"
|
#define ERR_NEEDMOREPARAMS_MSG "461 %s %s :Syntax error"
|
||||||
#define ERR_ALREADYREGISTRED_MSG "462 %s :Connection already registered"
|
#define ERR_ALREADYREGISTRED_MSG "462 %s :Connection already registered"
|
||||||
#define ERR_PASSWDMISMATCH_MSG "464 %s :Invalid password"
|
#define ERR_PASSWDMISMATCH_MSG "464 %s :Invalid password"
|
||||||
#define ERR_CHANNELISFULL_MSG "471 %s %s :Cannot join channel (+l)"
|
#define ERR_CHANNELISFULL_MSG "471 %s %s :Cannot join channel (+l) -- Channel is full, try later"
|
||||||
#define ERR_SECURECHANNEL_MSG "471 %s %s :Cannot join channel (+z)"
|
#define ERR_SECURECHANNEL_MSG "471 %s %s :Cannot join channel (+z) -- SSL connections only"
|
||||||
#define ERR_OPONLYCHANNEL_MSG "471 %s %s :Cannot join channel (+O)"
|
#define ERR_OPONLYCHANNEL_MSG "471 %s %s :Cannot join channel (+O) -- IRC opers only"
|
||||||
#define ERR_UNKNOWNMODE_MSG "472 %s: %c :is unknown mode char for %s"
|
#define ERR_REGONLYCHANNEL_MSG "471 %s %s :Cannot join channel (+R) -- Registered users only"
|
||||||
#define ERR_INVITEONLYCHAN_MSG "473 %s %s :Cannot join channel (+i)"
|
#define ERR_UNKNOWNMODE_MSG "472 %s %c :is unknown mode char for %s"
|
||||||
#define ERR_BANNEDFROMCHAN_MSG "474 %s %s :Cannot join channel (+b)"
|
#define ERR_INVITEONLYCHAN_MSG "473 %s %s :Cannot join channel (+i) -- Invited users only"
|
||||||
#define ERR_BADCHANNELKEY_MSG "475 %s %s :Cannot join channel (+k)"
|
#define ERR_BANNEDFROMCHAN_MSG "474 %s %s :Cannot join channel (+b) -- You are banned"
|
||||||
|
#define ERR_BADCHANNELKEY_MSG "475 %s %s :Cannot join channel (+k) -- Wrong channel key"
|
||||||
#define ERR_NOCHANMODES_MSG "477 %s %s :Channel doesn't support modes"
|
#define ERR_NOCHANMODES_MSG "477 %s %s :Channel doesn't support modes"
|
||||||
|
#define ERR_NEEDREGGEDNICK_MSG "477 %s %s :Cannot send to channel (+M) -- You need to be identified to a registered account to message this channel"
|
||||||
|
#define ERR_LISTFULL_MSG "478 %s %s %s: Channel list is full (%d)"
|
||||||
#define ERR_NOPRIVILEGES_MSG "481 %s :Permission denied"
|
#define ERR_NOPRIVILEGES_MSG "481 %s :Permission denied"
|
||||||
#define ERR_CHANOPRIVSNEEDED_MSG "482 %s %s :You are not channel operator"
|
#define ERR_CHANOPRIVSNEEDED_MSG "482 %s %s :You are not channel operator"
|
||||||
|
#define ERR_CHANOPPRIVTOOLOW_MSG "482 %s %s :Your privileges are too low"
|
||||||
|
#define ERR_KICKDENY_MSG "482 %s %s :Cannot kick, %s is protected"
|
||||||
#define ERR_CANTKILLSERVER_MSG "483 %s :You can't kill a server!"
|
#define ERR_CANTKILLSERVER_MSG "483 %s :You can't kill a server!"
|
||||||
#define ERR_RESTRICTED_MSG "484 %s :Your connection is restricted"
|
#define ERR_RESTRICTED_MSG "484 %s :Your connection is restricted"
|
||||||
|
#define ERR_NICKREGISTER_MSG "484 %s :Cannot modify user mode (+R) -- Use IRC services"
|
||||||
|
#define ERR_NONONREG_MSG "486 %s :Cannot send to user (+b) -- You must identify to a registered nick to private message %s"
|
||||||
#define ERR_NOOPERHOST_MSG "491 %s :Not configured for your host"
|
#define ERR_NOOPERHOST_MSG "491 %s :Not configured for your host"
|
||||||
|
#define ERR_NOTONSAMECHANNEL_MSG "493 %s :You must share a common channel with %s"
|
||||||
|
|
||||||
#define ERR_UMODEUNKNOWNFLAG_MSG "501 %s :Unknown mode"
|
#define ERR_UMODEUNKNOWNFLAG_MSG "501 %s :Unknown mode"
|
||||||
#define ERR_UMODEUNKNOWNFLAG2_MSG "501 %s :Unknown mode \"%c%c\""
|
#define ERR_UMODEUNKNOWNFLAG2_MSG "501 %s :Unknown mode \"%c%c\""
|
||||||
#define ERR_USERSDONTMATCH_MSG "502 %s :Can't set/get mode for other users"
|
#define ERR_USERSDONTMATCH_MSG "502 %s :Can't set/get mode for other users"
|
||||||
|
#define ERR_NOINVITE_MSG "518 %s :Cannot invite to %s (+V)"
|
||||||
|
|
||||||
#ifdef ZLIB
|
#ifdef ZLIB
|
||||||
#define RPL_STATSLINKINFOZIP_MSG "211 %s %s %d %ld %ld/%ld %ld %ld/%ld :%ld"
|
# define RPL_STATSLINKINFOZIP_MSG "211 %s %s %d %ld %ld/%ld %ld %ld/%ld :%ld"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef IRCPLUS
|
||||||
|
|
||||||
|
# define RPL_IP_CHARCONV_MSG "801 %s %s :Client encoding set"
|
||||||
|
|
||||||
|
# define ERR_IP_CHARCONV_MSG "851 %s :Can't initialize client encoding"
|
||||||
|
|
||||||
|
#endif /* IRCPLUS */
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* -eof- */
|
/* -eof- */
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2011 Alexander Barton (alex@barton.de) and Contributors.
|
* Copyright (c)2001-2013 Alexander Barton (alex@barton.de) and Contributors.
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -38,6 +38,7 @@
|
|||||||
|
|
||||||
#include "defines.h"
|
#include "defines.h"
|
||||||
#include "conn.h"
|
#include "conn.h"
|
||||||
|
#include "class.h"
|
||||||
#include "conf-ssl.h"
|
#include "conf-ssl.h"
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
#include "conf.h"
|
#include "conf.h"
|
||||||
@@ -73,12 +74,12 @@ static bool NGIRCd_Init PARAMS(( bool ));
|
|||||||
* Here all starts: this function is called by the operating system loader,
|
* Here all starts: this function is called by the operating system loader,
|
||||||
* it is the first portion of code executed of ngIRCd.
|
* it is the first portion of code executed of ngIRCd.
|
||||||
*
|
*
|
||||||
* @param argc The number of arguments passed to ngIRCd on the command line.
|
* @param argc The number of arguments passed to ngIRCd on the command line.
|
||||||
* @param argv An array containing all the arguments passed to ngIRCd.
|
* @param argv An array containing all the arguments passed to ngIRCd.
|
||||||
* @return Global exit code of ngIRCd, zero on success.
|
* @return Global exit code of ngIRCd, zero on success.
|
||||||
*/
|
*/
|
||||||
GLOBAL int
|
GLOBAL int
|
||||||
main( int argc, const char *argv[] )
|
main(int argc, const char *argv[])
|
||||||
{
|
{
|
||||||
bool ok, configtest = false;
|
bool ok, configtest = false;
|
||||||
bool NGIRCd_NoDaemon = false;
|
bool NGIRCd_NoDaemon = false;
|
||||||
@@ -91,7 +92,7 @@ main( int argc, const char *argv[] )
|
|||||||
mtrace();
|
mtrace();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
umask( 0077 );
|
umask(0077);
|
||||||
|
|
||||||
NGIRCd_SignalQuit = NGIRCd_SignalRestart = false;
|
NGIRCd_SignalQuit = NGIRCd_SignalRestart = false;
|
||||||
NGIRCd_Passive = false;
|
NGIRCd_Passive = false;
|
||||||
@@ -101,75 +102,62 @@ main( int argc, const char *argv[] )
|
|||||||
#ifdef SNIFFER
|
#ifdef SNIFFER
|
||||||
NGIRCd_Sniffer = false;
|
NGIRCd_Sniffer = false;
|
||||||
#endif
|
#endif
|
||||||
strlcpy( NGIRCd_ConfFile, SYSCONFDIR, sizeof( NGIRCd_ConfFile ));
|
strlcpy(NGIRCd_ConfFile, SYSCONFDIR, sizeof(NGIRCd_ConfFile));
|
||||||
strlcat( NGIRCd_ConfFile, CONFIG_FILE, sizeof( NGIRCd_ConfFile ));
|
strlcat(NGIRCd_ConfFile, CONFIG_FILE, sizeof(NGIRCd_ConfFile));
|
||||||
|
|
||||||
Fill_Version( );
|
Fill_Version();
|
||||||
|
|
||||||
/* parse conmmand line */
|
/* parse conmmand line */
|
||||||
for( i = 1; i < argc; i++ )
|
for (i = 1; i < argc; i++) {
|
||||||
{
|
|
||||||
ok = false;
|
ok = false;
|
||||||
if(( argv[i][0] == '-' ) && ( argv[i][1] == '-' ))
|
if (argv[i][0] == '-' && argv[i][1] == '-') {
|
||||||
{
|
|
||||||
/* long option */
|
/* long option */
|
||||||
if( strcmp( argv[i], "--config" ) == 0 )
|
if (strcmp(argv[i], "--config") == 0) {
|
||||||
{
|
if (i + 1 < argc) {
|
||||||
if( i + 1 < argc )
|
|
||||||
{
|
|
||||||
/* Ok, there's an parameter left */
|
/* Ok, there's an parameter left */
|
||||||
strlcpy( NGIRCd_ConfFile, argv[i + 1], sizeof( NGIRCd_ConfFile ));
|
strlcpy(NGIRCd_ConfFile, argv[i+1],
|
||||||
|
sizeof(NGIRCd_ConfFile));
|
||||||
/* next parameter */
|
/* next parameter */
|
||||||
i++; ok = true;
|
i++; ok = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if( strcmp( argv[i], "--configtest" ) == 0 )
|
if (strcmp(argv[i], "--configtest") == 0) {
|
||||||
{
|
|
||||||
configtest = true;
|
configtest = true;
|
||||||
ok = true;
|
ok = true;
|
||||||
}
|
}
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if( strcmp( argv[i], "--debug" ) == 0 )
|
if (strcmp(argv[i], "--debug") == 0) {
|
||||||
{
|
|
||||||
NGIRCd_Debug = true;
|
NGIRCd_Debug = true;
|
||||||
ok = true;
|
ok = true;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if( strcmp( argv[i], "--help" ) == 0 )
|
if (strcmp(argv[i], "--help") == 0) {
|
||||||
{
|
Show_Version();
|
||||||
Show_Version( );
|
puts(""); Show_Help( ); puts( "" );
|
||||||
puts( "" ); Show_Help( ); puts( "" );
|
exit(1);
|
||||||
exit( 1 );
|
|
||||||
}
|
}
|
||||||
if( strcmp( argv[i], "--nodaemon" ) == 0 )
|
if (strcmp(argv[i], "--nodaemon") == 0) {
|
||||||
{
|
|
||||||
NGIRCd_NoDaemon = true;
|
NGIRCd_NoDaemon = true;
|
||||||
ok = true;
|
ok = true;
|
||||||
}
|
}
|
||||||
if( strcmp( argv[i], "--passive" ) == 0 )
|
if (strcmp(argv[i], "--passive") == 0) {
|
||||||
{
|
|
||||||
NGIRCd_Passive = true;
|
NGIRCd_Passive = true;
|
||||||
ok = true;
|
ok = true;
|
||||||
}
|
}
|
||||||
#ifdef SNIFFER
|
#ifdef SNIFFER
|
||||||
if( strcmp( argv[i], "--sniffer" ) == 0 )
|
if (strcmp(argv[i], "--sniffer") == 0) {
|
||||||
{
|
|
||||||
NGIRCd_Sniffer = true;
|
NGIRCd_Sniffer = true;
|
||||||
ok = true;
|
ok = true;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if( strcmp( argv[i], "--version" ) == 0 )
|
if (strcmp(argv[i], "--version") == 0) {
|
||||||
{
|
Show_Version();
|
||||||
Show_Version( );
|
exit(1);
|
||||||
exit( 1 );
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(( argv[i][0] == '-' ) && ( argv[i][1] != '-' ))
|
else if(argv[i][0] == '-' && argv[i][1] != '-') {
|
||||||
{
|
|
||||||
/* short option */
|
/* short option */
|
||||||
for( n = 1; n < strlen( argv[i] ); n++ )
|
for (n = 1; n < strlen(argv[i]); n++) {
|
||||||
{
|
|
||||||
ok = false;
|
ok = false;
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if (argv[i][n] == 'd') {
|
if (argv[i][n] == 'd') {
|
||||||
@@ -178,14 +166,14 @@ main( int argc, const char *argv[] )
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (argv[i][n] == 'f') {
|
if (argv[i][n] == 'f') {
|
||||||
if(( ! argv[i][n + 1] ) && ( i + 1 < argc ))
|
if (!argv[i][n+1] && i+1 < argc) {
|
||||||
{
|
|
||||||
/* Ok, next character is a blank */
|
/* Ok, next character is a blank */
|
||||||
strlcpy( NGIRCd_ConfFile, argv[i + 1], sizeof( NGIRCd_ConfFile ));
|
strlcpy(NGIRCd_ConfFile, argv[i+1],
|
||||||
|
sizeof(NGIRCd_ConfFile));
|
||||||
|
|
||||||
/* go to the following parameter */
|
/* go to the following parameter */
|
||||||
i++;
|
i++;
|
||||||
n = strlen( argv[i] );
|
n = strlen(argv[i]);
|
||||||
ok = true;
|
ok = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -220,55 +208,58 @@ main( int argc, const char *argv[] )
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (! ok) {
|
if (!ok) {
|
||||||
printf( "%s: invalid option \"-%c\"!\n", PACKAGE_NAME, argv[i][n] );
|
printf("%s: invalid option \"-%c\"!\n",
|
||||||
printf( "Try \"%s --help\" for more information.\n", PACKAGE_NAME );
|
PACKAGE_NAME, argv[i][n]);
|
||||||
exit( 1 );
|
printf("Try \"%s --help\" for more information.\n",
|
||||||
|
PACKAGE_NAME);
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
if( ! ok )
|
if (!ok) {
|
||||||
{
|
printf("%s: invalid option \"%s\"!\n",
|
||||||
printf( "%s: invalid option \"%s\"!\n", PACKAGE_NAME, argv[i] );
|
PACKAGE_NAME, argv[i]);
|
||||||
printf( "Try \"%s --help\" for more information.\n", PACKAGE_NAME );
|
printf("Try \"%s --help\" for more information.\n",
|
||||||
exit( 1 );
|
PACKAGE_NAME);
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Debug level for "VERSION" command */
|
/* Debug level for "VERSION" command */
|
||||||
NGIRCd_DebugLevel[0] = '\0';
|
NGIRCd_DebugLevel[0] = '\0';
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if( NGIRCd_Debug ) strcpy( NGIRCd_DebugLevel, "1" );
|
if (NGIRCd_Debug)
|
||||||
|
strcpy(NGIRCd_DebugLevel, "1");
|
||||||
#endif
|
#endif
|
||||||
#ifdef SNIFFER
|
#ifdef SNIFFER
|
||||||
if( NGIRCd_Sniffer )
|
if (NGIRCd_Sniffer) {
|
||||||
{
|
|
||||||
NGIRCd_Debug = true;
|
NGIRCd_Debug = true;
|
||||||
strcpy( NGIRCd_DebugLevel, "2" );
|
strcpy(NGIRCd_DebugLevel, "2");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if( configtest )
|
if (configtest) {
|
||||||
{
|
Show_Version(); puts("");
|
||||||
Show_Version( ); puts( "" );
|
exit(Conf_Test());
|
||||||
exit( Conf_Test( ));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
while( ! NGIRCd_SignalQuit )
|
while (!NGIRCd_SignalQuit) {
|
||||||
{
|
|
||||||
/* Initialize global variables */
|
/* Initialize global variables */
|
||||||
NGIRCd_Start = time( NULL );
|
NGIRCd_Start = time(NULL);
|
||||||
(void)strftime( NGIRCd_StartStr, 64, "%a %b %d %Y at %H:%M:%S (%Z)", localtime( &NGIRCd_Start ));
|
(void)strftime(NGIRCd_StartStr, 64,
|
||||||
|
"%a %b %d %Y at %H:%M:%S (%Z)",
|
||||||
|
localtime(&NGIRCd_Start));
|
||||||
|
|
||||||
NGIRCd_SignalRestart = false;
|
NGIRCd_SignalRestart = false;
|
||||||
NGIRCd_SignalQuit = false;
|
NGIRCd_SignalQuit = false;
|
||||||
|
|
||||||
Random_Init();
|
|
||||||
|
|
||||||
/* Initialize modules, part I */
|
/* Initialize modules, part I */
|
||||||
Log_Init( ! NGIRCd_NoDaemon );
|
Log_Init(!NGIRCd_NoDaemon);
|
||||||
Conf_Init( );
|
Random_Init();
|
||||||
|
Conf_Init();
|
||||||
|
Log_ReInit();
|
||||||
|
|
||||||
/* Initialize the "main program": chroot environment, user and
|
/* Initialize the "main program": chroot environment, user and
|
||||||
* group ID, ... */
|
* group ID, ... */
|
||||||
@@ -279,17 +270,22 @@ main( int argc, const char *argv[] )
|
|||||||
|
|
||||||
/* Initialize modules, part II: these functions are eventually
|
/* Initialize modules, part II: these functions are eventually
|
||||||
* called with already dropped privileges ... */
|
* called with already dropped privileges ... */
|
||||||
Channel_Init( );
|
Channel_Init();
|
||||||
Client_Init( );
|
Client_Init();
|
||||||
Conn_Init( );
|
Conn_Init();
|
||||||
|
Class_Init();
|
||||||
|
|
||||||
if (!io_library_init(CONNECTION_POOL)) {
|
if (!io_library_init(CONNECTION_POOL)) {
|
||||||
Log(LOG_ALERT, "Fatal: Cannot initialize IO routines: %s", strerror(errno));
|
Log(LOG_ALERT,
|
||||||
|
"Fatal: Could not initialize IO routines: %s",
|
||||||
|
strerror(errno));
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!Signals_Init()) {
|
if (!Signals_Init()) {
|
||||||
Log(LOG_ALERT, "Fatal: Could not set up signal handlers: %s", strerror(errno));
|
Log(LOG_ALERT,
|
||||||
|
"Fatal: Could not set up signal handlers: %s",
|
||||||
|
strerror(errno));
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -297,39 +293,46 @@ main( int argc, const char *argv[] )
|
|||||||
* used by ngIRCd in PASS commands and the known "extended
|
* used by ngIRCd in PASS commands and the known "extended
|
||||||
* flags" are described in doc/Protocol.txt. */
|
* flags" are described in doc/Protocol.txt. */
|
||||||
#ifdef IRCPLUS
|
#ifdef IRCPLUS
|
||||||
snprintf( NGIRCd_ProtoID, sizeof NGIRCd_ProtoID, "%s%s %s|%s:%s", PROTOVER, PROTOIRCPLUS, PACKAGE_NAME, PACKAGE_VERSION, IRCPLUSFLAGS );
|
snprintf(NGIRCd_ProtoID, sizeof NGIRCd_ProtoID, "%s%s %s|%s:%s",
|
||||||
|
PROTOVER, PROTOIRCPLUS, PACKAGE_NAME, PACKAGE_VERSION,
|
||||||
|
IRCPLUSFLAGS);
|
||||||
#ifdef ZLIB
|
#ifdef ZLIB
|
||||||
strcat( NGIRCd_ProtoID, "Z" );
|
strcat(NGIRCd_ProtoID, "Z");
|
||||||
#endif
|
#endif
|
||||||
if( Conf_OperCanMode ) strcat( NGIRCd_ProtoID, "o" );
|
if (Conf_OperCanMode)
|
||||||
#else
|
strcat(NGIRCd_ProtoID, "o");
|
||||||
snprintf( NGIRCd_ProtoID, sizeof NGIRCd_ProtoID, "%s%s %s|%s", PROTOVER, PROTOIRC, PACKAGE_NAME, PACKAGE_VERSION );
|
#else /* IRCPLUS */
|
||||||
#endif
|
snprintf(NGIRCd_ProtoID, sizeof NGIRCd_ProtoID, "%s%s %s|%s",
|
||||||
strlcat( NGIRCd_ProtoID, " P", sizeof NGIRCd_ProtoID );
|
PROTOVER, PROTOIRC, PACKAGE_NAME, PACKAGE_VERSION);
|
||||||
|
#endif /* IRCPLUS */
|
||||||
|
strlcat(NGIRCd_ProtoID, " P", sizeof NGIRCd_ProtoID);
|
||||||
#ifdef ZLIB
|
#ifdef ZLIB
|
||||||
strlcat( NGIRCd_ProtoID, "Z", sizeof NGIRCd_ProtoID );
|
strlcat(NGIRCd_ProtoID, "Z", sizeof NGIRCd_ProtoID);
|
||||||
#endif
|
#endif
|
||||||
LogDebug("Protocol and server ID is \"%s\".", NGIRCd_ProtoID);
|
LogDebug("Protocol and server ID is \"%s\".", NGIRCd_ProtoID);
|
||||||
|
|
||||||
Channel_InitPredefined( );
|
Channel_InitPredefined();
|
||||||
|
|
||||||
if( Conn_InitListeners( ) < 1 )
|
if (Conn_InitListeners() < 1) {
|
||||||
{
|
Log(LOG_ALERT,
|
||||||
Log( LOG_ALERT, "Server isn't listening on a single port!" );
|
"Server isn't listening on a single port!" );
|
||||||
Log( LOG_ALERT, "%s exiting due to fatal errors!", PACKAGE_NAME );
|
Log(LOG_ALERT,
|
||||||
Pidfile_Delete( );
|
"%s exiting due to fatal errors!", PACKAGE_NAME);
|
||||||
exit( 1 );
|
Pidfile_Delete();
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Main Run Loop */
|
/* Main Run Loop */
|
||||||
Conn_Handler( );
|
Conn_Handler();
|
||||||
|
|
||||||
Conn_Exit( );
|
Conn_Exit();
|
||||||
Client_Exit( );
|
Client_Exit();
|
||||||
Channel_Exit( );
|
Channel_Exit();
|
||||||
Log_Exit( );
|
Class_Exit();
|
||||||
|
Log_Exit();
|
||||||
|
Signals_Exit();
|
||||||
}
|
}
|
||||||
Pidfile_Delete( );
|
Pidfile_Delete();
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
} /* main */
|
} /* main */
|
||||||
@@ -344,70 +347,106 @@ main( int argc, const char *argv[] )
|
|||||||
* line switch.
|
* line switch.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
Fill_Version( void )
|
Fill_Version(void)
|
||||||
{
|
{
|
||||||
NGIRCd_VersionAddition[0] = '\0';
|
NGIRCd_VersionAddition[0] = '\0';
|
||||||
|
|
||||||
#ifdef SYSLOG
|
#ifdef ICONV
|
||||||
strlcpy( NGIRCd_VersionAddition, "SYSLOG", sizeof NGIRCd_VersionAddition );
|
|
||||||
#endif
|
|
||||||
#ifdef ZLIB
|
|
||||||
if( NGIRCd_VersionAddition[0] )
|
|
||||||
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
|
||||||
strlcat( NGIRCd_VersionAddition, "ZLIB", sizeof NGIRCd_VersionAddition );
|
|
||||||
#endif
|
|
||||||
#ifdef SSL_SUPPORT
|
|
||||||
if ( NGIRCd_VersionAddition[0] ) strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
|
||||||
strlcat( NGIRCd_VersionAddition, "SSL", sizeof NGIRCd_VersionAddition );
|
|
||||||
#endif
|
|
||||||
#ifdef TCPWRAP
|
|
||||||
if( NGIRCd_VersionAddition[0] )
|
|
||||||
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
|
||||||
strlcat( NGIRCd_VersionAddition, "TCPWRAP", sizeof NGIRCd_VersionAddition );
|
|
||||||
#endif
|
|
||||||
#ifdef IDENTAUTH
|
|
||||||
if( NGIRCd_VersionAddition[0] )
|
|
||||||
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
|
||||||
strlcat( NGIRCd_VersionAddition, "IDENT", sizeof NGIRCd_VersionAddition );
|
|
||||||
#endif
|
|
||||||
#ifdef PAM
|
|
||||||
if (NGIRCd_VersionAddition[0])
|
if (NGIRCd_VersionAddition[0])
|
||||||
strlcat(NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition);
|
strlcat(NGIRCd_VersionAddition, "+",
|
||||||
strlcat(NGIRCd_VersionAddition, "PAM", sizeof NGIRCd_VersionAddition);
|
sizeof NGIRCd_VersionAddition);
|
||||||
|
strlcat(NGIRCd_VersionAddition, "CHARCONV",
|
||||||
|
sizeof NGIRCd_VersionAddition);
|
||||||
#endif
|
#endif
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
if( NGIRCd_VersionAddition[0] )
|
if (NGIRCd_VersionAddition[0])
|
||||||
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
strlcat(NGIRCd_VersionAddition, "+",
|
||||||
strlcat( NGIRCd_VersionAddition, "DEBUG", sizeof NGIRCd_VersionAddition );
|
sizeof NGIRCd_VersionAddition);
|
||||||
|
strlcat(NGIRCd_VersionAddition, "DEBUG",
|
||||||
|
sizeof NGIRCd_VersionAddition);
|
||||||
#endif
|
#endif
|
||||||
#ifdef SNIFFER
|
#ifdef IDENTAUTH
|
||||||
if( NGIRCd_VersionAddition[0] )
|
if (NGIRCd_VersionAddition[0])
|
||||||
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
strlcat(NGIRCd_VersionAddition, "+",
|
||||||
strlcat( NGIRCd_VersionAddition, "SNIFFER", sizeof NGIRCd_VersionAddition );
|
sizeof NGIRCd_VersionAddition);
|
||||||
#endif
|
strlcat(NGIRCd_VersionAddition, "IDENT",
|
||||||
#ifdef STRICT_RFC
|
sizeof NGIRCd_VersionAddition);
|
||||||
if( NGIRCd_VersionAddition[0] )
|
|
||||||
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
|
||||||
strlcat( NGIRCd_VersionAddition, "RFC", sizeof NGIRCd_VersionAddition );
|
|
||||||
#endif
|
|
||||||
#ifdef IRCPLUS
|
|
||||||
if( NGIRCd_VersionAddition[0] )
|
|
||||||
strlcat( NGIRCd_VersionAddition, "+", sizeof NGIRCd_VersionAddition );
|
|
||||||
strlcat( NGIRCd_VersionAddition, "IRCPLUS", sizeof NGIRCd_VersionAddition );
|
|
||||||
#endif
|
#endif
|
||||||
#ifdef WANT_IPV6
|
#ifdef WANT_IPV6
|
||||||
if (NGIRCd_VersionAddition[0])
|
if (NGIRCd_VersionAddition[0])
|
||||||
strlcat(NGIRCd_VersionAddition, "+", sizeof(NGIRCd_VersionAddition));
|
strlcat(NGIRCd_VersionAddition, "+",
|
||||||
strlcat(NGIRCd_VersionAddition, "IPv6", sizeof(NGIRCd_VersionAddition));
|
sizeof(NGIRCd_VersionAddition));
|
||||||
|
strlcat(NGIRCd_VersionAddition, "IPv6",
|
||||||
|
sizeof(NGIRCd_VersionAddition));
|
||||||
#endif
|
#endif
|
||||||
if( NGIRCd_VersionAddition[0] )
|
#ifdef IRCPLUS
|
||||||
strlcat( NGIRCd_VersionAddition, "-", sizeof( NGIRCd_VersionAddition ));
|
if (NGIRCd_VersionAddition[0])
|
||||||
|
strlcat(NGIRCd_VersionAddition, "+",
|
||||||
|
sizeof NGIRCd_VersionAddition);
|
||||||
|
strlcat(NGIRCd_VersionAddition, "IRCPLUS",
|
||||||
|
sizeof NGIRCd_VersionAddition);
|
||||||
|
#endif
|
||||||
|
#ifdef PAM
|
||||||
|
if (NGIRCd_VersionAddition[0])
|
||||||
|
strlcat(NGIRCd_VersionAddition, "+",
|
||||||
|
sizeof NGIRCd_VersionAddition);
|
||||||
|
strlcat(NGIRCd_VersionAddition, "PAM",
|
||||||
|
sizeof NGIRCd_VersionAddition);
|
||||||
|
#endif
|
||||||
|
#ifdef STRICT_RFC
|
||||||
|
if (NGIRCd_VersionAddition[0])
|
||||||
|
strlcat(NGIRCd_VersionAddition, "+",
|
||||||
|
sizeof NGIRCd_VersionAddition);
|
||||||
|
strlcat(NGIRCd_VersionAddition, "RFC",
|
||||||
|
sizeof NGIRCd_VersionAddition);
|
||||||
|
#endif
|
||||||
|
#ifdef SNIFFER
|
||||||
|
if (NGIRCd_VersionAddition[0])
|
||||||
|
strlcat(NGIRCd_VersionAddition, "+",
|
||||||
|
sizeof NGIRCd_VersionAddition);
|
||||||
|
strlcat(NGIRCd_VersionAddition, "SNIFFER",
|
||||||
|
sizeof NGIRCd_VersionAddition);
|
||||||
|
#endif
|
||||||
|
#ifdef SSL_SUPPORT
|
||||||
|
if (NGIRCd_VersionAddition[0])
|
||||||
|
strlcat(NGIRCd_VersionAddition, "+",
|
||||||
|
sizeof NGIRCd_VersionAddition);
|
||||||
|
strlcat(NGIRCd_VersionAddition, "SSL",
|
||||||
|
sizeof NGIRCd_VersionAddition);
|
||||||
|
#endif
|
||||||
|
#ifdef SYSLOG
|
||||||
|
if (NGIRCd_VersionAddition[0])
|
||||||
|
strlcat(NGIRCd_VersionAddition, "+",
|
||||||
|
sizeof NGIRCd_VersionAddition);
|
||||||
|
strlcat(NGIRCd_VersionAddition, "SYSLOG",
|
||||||
|
sizeof NGIRCd_VersionAddition);
|
||||||
|
#endif
|
||||||
|
#ifdef TCPWRAP
|
||||||
|
if (NGIRCd_VersionAddition[0])
|
||||||
|
strlcat(NGIRCd_VersionAddition, "+",
|
||||||
|
sizeof NGIRCd_VersionAddition);
|
||||||
|
strlcat(NGIRCd_VersionAddition, "TCPWRAP",
|
||||||
|
sizeof NGIRCd_VersionAddition);
|
||||||
|
#endif
|
||||||
|
#ifdef ZLIB
|
||||||
|
if (NGIRCd_VersionAddition[0])
|
||||||
|
strlcat(NGIRCd_VersionAddition, "+",
|
||||||
|
sizeof NGIRCd_VersionAddition);
|
||||||
|
strlcat(NGIRCd_VersionAddition, "ZLIB",
|
||||||
|
sizeof NGIRCd_VersionAddition);
|
||||||
|
#endif
|
||||||
|
if (NGIRCd_VersionAddition[0])
|
||||||
|
strlcat(NGIRCd_VersionAddition, "-",
|
||||||
|
sizeof(NGIRCd_VersionAddition));
|
||||||
|
|
||||||
strlcat( NGIRCd_VersionAddition, TARGET_CPU, sizeof( NGIRCd_VersionAddition ));
|
strlcat(NGIRCd_VersionAddition, HOST_CPU,
|
||||||
strlcat( NGIRCd_VersionAddition, "/", sizeof( NGIRCd_VersionAddition ));
|
sizeof(NGIRCd_VersionAddition));
|
||||||
strlcat( NGIRCd_VersionAddition, TARGET_VENDOR, sizeof( NGIRCd_VersionAddition ));
|
strlcat(NGIRCd_VersionAddition, "/", sizeof(NGIRCd_VersionAddition));
|
||||||
strlcat( NGIRCd_VersionAddition, "/", sizeof( NGIRCd_VersionAddition ));
|
strlcat(NGIRCd_VersionAddition, HOST_VENDOR,
|
||||||
strlcat( NGIRCd_VersionAddition, TARGET_OS, sizeof( NGIRCd_VersionAddition ));
|
sizeof(NGIRCd_VersionAddition));
|
||||||
|
strlcat(NGIRCd_VersionAddition, "/", sizeof(NGIRCd_VersionAddition));
|
||||||
|
strlcat(NGIRCd_VersionAddition, HOST_OS,
|
||||||
|
sizeof(NGIRCd_VersionAddition));
|
||||||
|
|
||||||
snprintf(NGIRCd_Version, sizeof NGIRCd_Version, "%s %s-%s",
|
snprintf(NGIRCd_Version, sizeof NGIRCd_Version, "%s %s-%s",
|
||||||
PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_VersionAddition);
|
PACKAGE_NAME, PACKAGE_VERSION, NGIRCd_VersionAddition);
|
||||||
@@ -421,7 +460,7 @@ static void
|
|||||||
Show_Version( void )
|
Show_Version( void )
|
||||||
{
|
{
|
||||||
puts( NGIRCd_Version );
|
puts( NGIRCd_Version );
|
||||||
puts( "Copyright (c)2001-2011 Alexander Barton (<alex@barton.de>) and Contributors." );
|
puts( "Copyright (c)2001-2013 Alexander Barton (<alex@barton.de>) and Contributors." );
|
||||||
puts( "Homepage: <http://ngircd.barton.de/>\n" );
|
puts( "Homepage: <http://ngircd.barton.de/>\n" );
|
||||||
puts( "This is free software; see the source for copying conditions. There is NO" );
|
puts( "This is free software; see the source for copying conditions. There is NO" );
|
||||||
puts( "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." );
|
puts( "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." );
|
||||||
@@ -496,7 +535,8 @@ Pidfile_Create(pid_t pid)
|
|||||||
|
|
||||||
len = snprintf(pidbuf, sizeof pidbuf, "%ld\n", (long)pid);
|
len = snprintf(pidbuf, sizeof pidbuf, "%ld\n", (long)pid);
|
||||||
if (len < 0 || len >= (int)sizeof pidbuf) {
|
if (len < 0 || len >= (int)sizeof pidbuf) {
|
||||||
Log( LOG_ERR, "Error converting pid");
|
Log(LOG_ERR, "Error converting pid");
|
||||||
|
close(pidfd);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -527,6 +567,8 @@ Setup_FDStreams(int fd)
|
|||||||
} /* Setup_FDStreams */
|
} /* Setup_FDStreams */
|
||||||
|
|
||||||
|
|
||||||
|
#if !defined(SINGLE_USER_OS)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get user and group ID of unprivileged "nobody" user.
|
* Get user and group ID of unprivileged "nobody" user.
|
||||||
*
|
*
|
||||||
@@ -553,9 +595,10 @@ NGIRCd_getNobodyID(uid_t *uid, gid_t *gid )
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
pwd = getpwnam("nobody");
|
pwd = getpwnam("nobody");
|
||||||
if (!pwd) return false;
|
if (!pwd)
|
||||||
|
return false;
|
||||||
|
|
||||||
if ( !pwd->pw_uid || !pwd->pw_gid)
|
if (!pwd->pw_uid || !pwd->pw_gid)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
*uid = pwd->pw_uid;
|
*uid = pwd->pw_uid;
|
||||||
@@ -565,6 +608,8 @@ NGIRCd_getNobodyID(uid_t *uid, gid_t *gid )
|
|||||||
return true;
|
return true;
|
||||||
} /* NGIRCd_getNobodyID */
|
} /* NGIRCd_getNobodyID */
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static bool
|
static bool
|
||||||
Random_Init_Kern(const char *file)
|
Random_Init_Kern(const char *file)
|
||||||
@@ -593,19 +638,19 @@ Random_Init(void)
|
|||||||
return;
|
return;
|
||||||
if (Random_Init_Kern("/dev/arandom"))
|
if (Random_Init_Kern("/dev/arandom"))
|
||||||
return;
|
return;
|
||||||
srand(rand() ^ getpid() ^ time(NULL));
|
srand(rand() ^ (unsigned)getpid() ^ (unsigned)time(NULL));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize ngIRCd daemon.
|
* Initialize ngIRCd daemon.
|
||||||
*
|
*
|
||||||
* @param NGIRCd_NoDaemon Set to true if ngIRCd should run in the
|
* @param NGIRCd_NoDaemon Set to true if ngIRCd should run in the
|
||||||
* foreground and not as a daemon.
|
* foreground (and not as a daemon).
|
||||||
* @return true on success.
|
* @return true on success.
|
||||||
*/
|
*/
|
||||||
static bool
|
static bool
|
||||||
NGIRCd_Init( bool NGIRCd_NoDaemon )
|
NGIRCd_Init(bool NGIRCd_NoDaemon)
|
||||||
{
|
{
|
||||||
static bool initialized;
|
static bool initialized;
|
||||||
bool chrooted = false;
|
bool chrooted = false;
|
||||||
@@ -621,57 +666,74 @@ NGIRCd_Init( bool NGIRCd_NoDaemon )
|
|||||||
/* open /dev/null before chroot() */
|
/* open /dev/null before chroot() */
|
||||||
fd = open( "/dev/null", O_RDWR);
|
fd = open( "/dev/null", O_RDWR);
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
Log(LOG_WARNING, "Could not open /dev/null: %s", strerror(errno));
|
Log(LOG_WARNING, "Could not open /dev/null: %s",
|
||||||
|
strerror(errno));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* SSL initialization */
|
||||||
if (!ConnSSL_InitLibrary())
|
if (!ConnSSL_InitLibrary())
|
||||||
Log(LOG_WARNING,
|
Log(LOG_WARNING,
|
||||||
"Warning: Error during SSL initialization, continuing ...");
|
"Error during SSL initialization, continuing without SSL ...");
|
||||||
|
|
||||||
if( Conf_Chroot[0] ) {
|
/* Change root */
|
||||||
if( chdir( Conf_Chroot ) != 0 ) {
|
if (Conf_Chroot[0]) {
|
||||||
Log( LOG_ERR, "Can't chdir() in ChrootDir (%s): %s", Conf_Chroot, strerror( errno ));
|
if (chdir(Conf_Chroot) != 0) {
|
||||||
|
Log(LOG_ERR, "Can't chdir() in ChrootDir (%s): %s",
|
||||||
|
Conf_Chroot, strerror(errno));
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( chroot( Conf_Chroot ) != 0 ) {
|
if (chroot(Conf_Chroot) != 0) {
|
||||||
if (errno != EPERM) {
|
Log(LOG_ERR,
|
||||||
Log( LOG_ERR, "Can't change root directory to \"%s\": %s",
|
"Can't change root directory to \"%s\": %s",
|
||||||
Conf_Chroot, strerror( errno ));
|
Conf_Chroot, strerror(errno));
|
||||||
goto out;
|
goto out;
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
chrooted = true;
|
chrooted = true;
|
||||||
Log( LOG_INFO, "Changed root and working directory to \"%s\".", Conf_Chroot );
|
Log(LOG_INFO,
|
||||||
|
"Changed root and working directory to \"%s\".",
|
||||||
|
Conf_Chroot);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !defined(SINGLE_USER_OS)
|
||||||
|
/* Check user ID */
|
||||||
if (Conf_UID == 0) {
|
if (Conf_UID == 0) {
|
||||||
Log(LOG_INFO, "ServerUID must not be 0, using \"nobody\" instead.", Conf_UID);
|
pwd = getpwuid(0);
|
||||||
|
Log(LOG_INFO,
|
||||||
if (! NGIRCd_getNobodyID(&Conf_UID, &Conf_GID)) {
|
"ServerUID must not be %s(0), using \"nobody\" instead.",
|
||||||
Log(LOG_WARNING, "Could not get user/group ID of user \"nobody\": %s",
|
pwd ? pwd->pw_name : "?");
|
||||||
errno ? strerror(errno) : "not found" );
|
if (!NGIRCd_getNobodyID(&Conf_UID, &Conf_GID)) {
|
||||||
|
Log(LOG_WARNING,
|
||||||
|
"Could not get user/group ID of user \"nobody\": %s",
|
||||||
|
errno ? strerror(errno) : "not found" );
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Change group ID */
|
||||||
if (getgid() != Conf_GID) {
|
if (getgid() != Conf_GID) {
|
||||||
/* Change group ID */
|
|
||||||
if (setgid(Conf_GID) != 0) {
|
if (setgid(Conf_GID) != 0) {
|
||||||
real_errno = errno;
|
real_errno = errno;
|
||||||
Log( LOG_ERR, "Can't change group ID to %u: %s", Conf_GID, strerror( errno ));
|
grp = getgrgid(Conf_GID);
|
||||||
|
Log(LOG_ERR, "Can't change group ID to %s(%u): %s",
|
||||||
|
grp ? grp->gr_name : "?", Conf_GID,
|
||||||
|
strerror(errno));
|
||||||
if (real_errno != EPERM)
|
if (real_errno != EPERM)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Change user ID */
|
||||||
if (getuid() != Conf_UID) {
|
if (getuid() != Conf_UID) {
|
||||||
/* Change user ID */
|
|
||||||
if (setuid(Conf_UID) != 0) {
|
if (setuid(Conf_UID) != 0) {
|
||||||
real_errno = errno;
|
real_errno = errno;
|
||||||
Log(LOG_ERR, "Can't change user ID to %u: %s", Conf_UID, strerror(errno));
|
pwd = getpwuid(Conf_UID);
|
||||||
if (real_errno != EPERM)
|
Log(LOG_ERR, "Can't change user ID to %s(%u): %s",
|
||||||
|
pwd ? pwd->pw_name : "?", Conf_UID,
|
||||||
|
strerror(errno));
|
||||||
|
if (real_errno != EPERM)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -681,26 +743,27 @@ NGIRCd_Init( bool NGIRCd_NoDaemon )
|
|||||||
/* Normally a child process is forked which isn't any longer
|
/* Normally a child process is forked which isn't any longer
|
||||||
* connected to ther controlling terminal. Use "--nodaemon"
|
* connected to ther controlling terminal. Use "--nodaemon"
|
||||||
* to disable this "daemon mode" (useful for debugging). */
|
* to disable this "daemon mode" (useful for debugging). */
|
||||||
if ( ! NGIRCd_NoDaemon ) {
|
if (!NGIRCd_NoDaemon) {
|
||||||
pid = fork( );
|
pid = fork();
|
||||||
if( pid > 0 ) {
|
if (pid > 0) {
|
||||||
/* "Old" process: exit. */
|
/* "Old" process: exit. */
|
||||||
exit( 0 );
|
exit(0);
|
||||||
}
|
}
|
||||||
if( pid < 0 ) {
|
if (pid < 0) {
|
||||||
/* Error!? */
|
/* Error!? */
|
||||||
fprintf( stderr, "%s: Can't fork: %s!\nFatal error, exiting now ...\n",
|
fprintf(stderr,
|
||||||
PACKAGE_NAME, strerror( errno ));
|
"%s: Can't fork: %s!\nFatal error, exiting now ...\n",
|
||||||
exit( 1 );
|
PACKAGE_NAME, strerror(errno));
|
||||||
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* New child process */
|
/* New child process */
|
||||||
#ifndef NeXT
|
#ifdef HAVE_SETSID
|
||||||
(void)setsid( );
|
(void)setsid();
|
||||||
#else
|
#else
|
||||||
setpgrp(0, getpid());
|
setpgrp(0, getpid());
|
||||||
#endif
|
#endif
|
||||||
if (chdir( "/" ) != 0)
|
if (chdir("/") != 0)
|
||||||
Log(LOG_ERR, "Can't change directory to '/': %s",
|
Log(LOG_ERR, "Can't change directory to '/': %s",
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
|
|
||||||
@@ -711,19 +774,19 @@ NGIRCd_Init( bool NGIRCd_NoDaemon )
|
|||||||
}
|
}
|
||||||
pid = getpid();
|
pid = getpid();
|
||||||
|
|
||||||
Pidfile_Create( pid );
|
Pidfile_Create(pid);
|
||||||
|
|
||||||
/* Check UID/GID we are running as, can be different from values
|
/* Check UID/GID we are running as, can be different from values
|
||||||
* configured (e. g. if we were already started with a UID>0. */
|
* configured (e. g. if we were already started with a UID>0. */
|
||||||
Conf_UID = getuid();
|
Conf_UID = getuid();
|
||||||
Conf_GID = getgid();
|
Conf_GID = getgid();
|
||||||
|
|
||||||
pwd = getpwuid( Conf_UID );
|
pwd = getpwuid(Conf_UID);
|
||||||
grp = getgrgid( Conf_GID );
|
grp = getgrgid(Conf_GID);
|
||||||
|
|
||||||
Log(LOG_INFO, "Running as user %s(%ld), group %s(%ld), with PID %ld.",
|
Log(LOG_INFO, "Running as user %s(%ld), group %s(%ld), with PID %ld.",
|
||||||
pwd ? pwd->pw_name : "unknown", (long)Conf_UID,
|
pwd ? pwd->pw_name : "unknown", (long)Conf_UID,
|
||||||
grp ? grp->gr_name : "unknown", (long)Conf_GID, (long)pid);
|
grp ? grp->gr_name : "unknown", (long)Conf_GID, (long)pid);
|
||||||
|
|
||||||
if (chrooted) {
|
if (chrooted) {
|
||||||
Log(LOG_INFO, "Running with root directory \"%s\".",
|
Log(LOG_INFO, "Running with root directory \"%s\".",
|
||||||
@@ -732,20 +795,23 @@ NGIRCd_Init( bool NGIRCd_NoDaemon )
|
|||||||
} else
|
} else
|
||||||
Log(LOG_INFO, "Not running with changed root directory.");
|
Log(LOG_INFO, "Not running with changed root directory.");
|
||||||
|
|
||||||
/* Change working directory to home directory of the user
|
/* Change working directory to home directory of the user we are
|
||||||
* we are running as (only when running in daemon mode and not in chroot) */
|
* running as (only when running in daemon mode and not in chroot) */
|
||||||
|
|
||||||
|
if (NGIRCd_NoDaemon)
|
||||||
|
return true;
|
||||||
|
|
||||||
if (pwd) {
|
if (pwd) {
|
||||||
if (!NGIRCd_NoDaemon ) {
|
if (chdir(pwd->pw_dir) == 0)
|
||||||
if( chdir( pwd->pw_dir ) == 0 )
|
Log(LOG_DEBUG,
|
||||||
Log( LOG_DEBUG, "Changed working directory to \"%s\" ...", pwd->pw_dir );
|
"Changed working directory to \"%s\" ...",
|
||||||
else
|
pwd->pw_dir);
|
||||||
Log( LOG_INFO, "Notice: Can't change working directory to \"%s\": %s",
|
else
|
||||||
pwd->pw_dir, strerror( errno ));
|
Log(LOG_INFO,
|
||||||
}
|
"Notice: Can't change working directory to \"%s\": %s",
|
||||||
} else {
|
pwd->pw_dir, strerror(errno));
|
||||||
Log( LOG_ERR, "Can't get user informaton for UID %d!?", Conf_UID );
|
} else
|
||||||
}
|
Log(LOG_ERR, "Can't get user informaton for UID %d!?", Conf_UID);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
out:
|
out:
|
||||||
|
|||||||
@@ -28,6 +28,7 @@
|
|||||||
#include "conn.h"
|
#include "conn.h"
|
||||||
#include "conn-func.h"
|
#include "conn-func.h"
|
||||||
#include "channel.h"
|
#include "channel.h"
|
||||||
|
#include "class.h"
|
||||||
#include "irc-write.h"
|
#include "irc-write.h"
|
||||||
#include "lists.h"
|
#include "lists.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
@@ -47,12 +48,11 @@ Announce_Channel(CLIENT *Client, CHANNEL *Chan)
|
|||||||
CL2CHAN *cl2chan;
|
CL2CHAN *cl2chan;
|
||||||
CLIENT *cl;
|
CLIENT *cl;
|
||||||
char str[LINE_LEN], *ptr;
|
char str[LINE_LEN], *ptr;
|
||||||
bool njoin;
|
bool njoin, xop;
|
||||||
|
|
||||||
if (Conn_Options(Client_Conn(Client)) & CONN_RFC1459)
|
/* Check features of remote server */
|
||||||
njoin = false;
|
njoin = Conn_Options(Client_Conn(Client)) & CONN_RFC1459 ? false : true;
|
||||||
else
|
xop = strchr(Client_Flags(Client), 'X') ? true : false;
|
||||||
njoin = true;
|
|
||||||
|
|
||||||
/* Get all the members of this channel */
|
/* Get all the members of this channel */
|
||||||
cl2chan = Channel_FirstMember(Chan);
|
cl2chan = Channel_FirstMember(Chan);
|
||||||
@@ -62,14 +62,23 @@ Announce_Channel(CLIENT *Client, CHANNEL *Chan)
|
|||||||
assert(cl != NULL);
|
assert(cl != NULL);
|
||||||
|
|
||||||
if (njoin) {
|
if (njoin) {
|
||||||
/* RFC 2813: send NJOIN with nick names and modes
|
/* RFC 2813: send NJOIN with nicknames and modes
|
||||||
* (if user is channel operator or has voice) */
|
* (if user is channel operator or has voice) */
|
||||||
if (str[strlen(str) - 1] != ':')
|
if (str[strlen(str) - 1] != ':')
|
||||||
strlcat(str, ",", sizeof(str));
|
strlcat(str, ",", sizeof(str));
|
||||||
if (strchr(Channel_UserModes(Chan, cl), 'v'))
|
|
||||||
strlcat(str, "+", sizeof(str));
|
/* Prepare user prefix (ChanOp, voiced, ...) */
|
||||||
|
if (xop && strchr(Channel_UserModes(Chan, cl), 'q'))
|
||||||
|
strlcat(str, "~", sizeof(str));
|
||||||
|
if (xop && strchr(Channel_UserModes(Chan, cl), 'a'))
|
||||||
|
strlcat(str, "&", sizeof(str));
|
||||||
if (strchr(Channel_UserModes(Chan, cl), 'o'))
|
if (strchr(Channel_UserModes(Chan, cl), 'o'))
|
||||||
strlcat(str, "@", sizeof(str));
|
strlcat(str, "@", sizeof(str));
|
||||||
|
if (xop && strchr(Channel_UserModes(Chan, cl), 'h'))
|
||||||
|
strlcat(str, "%", sizeof(str));
|
||||||
|
if (strchr(Channel_UserModes(Chan, cl), 'v'))
|
||||||
|
strlcat(str, "+", sizeof(str));
|
||||||
|
|
||||||
strlcat(str, Client_ID(cl), sizeof(str));
|
strlcat(str, Client_ID(cl), sizeof(str));
|
||||||
|
|
||||||
/* Send the data if the buffer is "full" */
|
/* Send the data if the buffer is "full" */
|
||||||
@@ -170,32 +179,50 @@ Announce_User(CLIENT * Client, CLIENT * User)
|
|||||||
Client_ID(User), Client_ID(User),
|
Client_ID(User), Client_ID(User),
|
||||||
modes);
|
modes);
|
||||||
}
|
}
|
||||||
return CONNECTED;
|
|
||||||
} else {
|
} else {
|
||||||
/* RFC 2813 mode: one combined NICK or SERVICE command */
|
/* RFC 2813 mode: one combined NICK or SERVICE command */
|
||||||
if (Client_Type(User) == CLIENT_SERVICE
|
if (Client_Type(User) == CLIENT_SERVICE
|
||||||
&& strchr(Client_Flags(Client), 'S'))
|
&& strchr(Client_Flags(Client), 'S')) {
|
||||||
return IRC_WriteStrClient(Client,
|
if (!IRC_WriteStrClient(Client,
|
||||||
"SERVICE %s %d * +%s %d :%s", Client_Mask(User),
|
"SERVICE %s %d * +%s %d :%s",
|
||||||
Client_MyToken(Client_Introducer(User)),
|
Client_Mask(User),
|
||||||
Client_Modes(User), Client_Hops(User) + 1,
|
Client_MyToken(Client_Introducer(User)),
|
||||||
Client_Info(User));
|
Client_Modes(User), Client_Hops(User) + 1,
|
||||||
else
|
Client_Info(User)))
|
||||||
return IRC_WriteStrClient(Client,
|
return DISCONNECTED;
|
||||||
"NICK %s %d %s %s %d +%s :%s",
|
} else {
|
||||||
Client_ID(User), Client_Hops(User) + 1,
|
if (!IRC_WriteStrClient(Client,
|
||||||
Client_User(User), Client_Hostname(User),
|
"NICK %s %d %s %s %d +%s :%s",
|
||||||
Client_MyToken(Client_Introducer(User)),
|
Client_ID(User), Client_Hops(User) + 1,
|
||||||
Client_Modes(User), Client_Info(User));
|
Client_User(User), Client_Hostname(User),
|
||||||
|
Client_MyToken(Client_Introducer(User)),
|
||||||
|
Client_Modes(User), Client_Info(User)))
|
||||||
|
return DISCONNECTED;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (strchr(Client_Flags(Client), 'M')) {
|
||||||
|
/* Synchronize metadata */
|
||||||
|
if (Client_HostnameCloaked(User)) {
|
||||||
|
if (!IRC_WriteStrClient(Client,
|
||||||
|
"METADATA %s cloakhost :%s",
|
||||||
|
Client_ID(User),
|
||||||
|
Client_HostnameCloaked(User)))
|
||||||
|
return DISCONNECTED;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return CONNECTED;
|
||||||
} /* Announce_User */
|
} /* Announce_User */
|
||||||
|
|
||||||
|
|
||||||
#ifdef IRCPLUS
|
#ifdef IRCPLUS
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Synchronize invite and ban lists between servers
|
* Synchronize invite, ban, G- and K-Line lists between servers.
|
||||||
* @param Client New server
|
*
|
||||||
|
* @param Client New server.
|
||||||
|
* @return CONNECTED or DISCONNECTED.
|
||||||
*/
|
*/
|
||||||
static bool
|
static bool
|
||||||
Synchronize_Lists(CLIENT * Client)
|
Synchronize_Lists(CLIENT * Client)
|
||||||
@@ -206,6 +233,18 @@ Synchronize_Lists(CLIENT * Client)
|
|||||||
|
|
||||||
assert(Client != NULL);
|
assert(Client != NULL);
|
||||||
|
|
||||||
|
/* g-lines */
|
||||||
|
head = Class_GetList(CLASS_GLINE);
|
||||||
|
elem = Lists_GetFirst(head);
|
||||||
|
while (elem) {
|
||||||
|
if (!IRC_WriteStrClient(Client, "GLINE %s %ld :%s",
|
||||||
|
Lists_GetMask(elem),
|
||||||
|
Lists_GetValidity(elem) - time(NULL),
|
||||||
|
Lists_GetReason(elem)))
|
||||||
|
return DISCONNECTED;
|
||||||
|
elem = Lists_GetNext(elem);
|
||||||
|
}
|
||||||
|
|
||||||
c = Channel_First();
|
c = Channel_First();
|
||||||
while (c) {
|
while (c) {
|
||||||
/* ban list */
|
/* ban list */
|
||||||
@@ -369,6 +408,10 @@ IRC_Num_ENDOFMOTD(CLIENT * Client, UNUSED REQUEST * Req)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (!IRC_WriteStrClient(Client, "PING :%s",
|
||||||
|
Client_ID(Client_ThisServer())))
|
||||||
|
return DISCONNECTED;
|
||||||
|
|
||||||
return CONNECTED;
|
return CONNECTED;
|
||||||
} /* IRC_Num_ENDOFMOTD */
|
} /* IRC_Num_ENDOFMOTD */
|
||||||
|
|
||||||
@@ -394,12 +437,12 @@ IRC_Num_ISUPPORT(CLIENT * Client, REQUEST * Req)
|
|||||||
if ((unsigned int)atol(value) == Conf_MaxNickLength - 1)
|
if ((unsigned int)atol(value) == Conf_MaxNickLength - 1)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
/* Nick name length settings are different! */
|
/* Nickname length settings are different! */
|
||||||
Log(LOG_ERR,
|
Log(LOG_ERR,
|
||||||
"Peer uses incompatible nick name length (%d/%d)! Disconnecting ...",
|
"Peer uses incompatible nickname length (%d/%d)! Disconnecting ...",
|
||||||
Conf_MaxNickLength - 1, atoi(value));
|
Conf_MaxNickLength - 1, atoi(value));
|
||||||
Conn_Close(Client_Conn(Client),
|
Conn_Close(Client_Conn(Client),
|
||||||
"Incompatible nick name length",
|
"Incompatible nickname length",
|
||||||
NULL, false);
|
NULL, false);
|
||||||
return DISCONNECTED;
|
return DISCONNECTED;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,9 +58,15 @@ Op_NoPrivileges(CLIENT * Client, REQUEST * Req)
|
|||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Check that the client is an IRC operator allowed to administer this server.
|
* Check that the originator of a request is an IRC operator and allowed
|
||||||
|
* to administer this server.
|
||||||
|
*
|
||||||
|
* @param CLient Client from which the command has been received.
|
||||||
|
* @param Req Request structure.
|
||||||
|
* @return CLIENT structure of the client that initiated the command or
|
||||||
|
* NULL if client is not allowed to execute operator commands.
|
||||||
*/
|
*/
|
||||||
GLOBAL bool
|
GLOBAL CLIENT *
|
||||||
Op_Check(CLIENT * Client, REQUEST * Req)
|
Op_Check(CLIENT * Client, REQUEST * Req)
|
||||||
{
|
{
|
||||||
CLIENT *c;
|
CLIENT *c;
|
||||||
@@ -72,15 +78,20 @@ Op_Check(CLIENT * Client, REQUEST * Req)
|
|||||||
c = Client_Search(Req->prefix);
|
c = Client_Search(Req->prefix);
|
||||||
else
|
else
|
||||||
c = Client;
|
c = Client;
|
||||||
|
|
||||||
if (!c)
|
if (!c)
|
||||||
return false;
|
return NULL;
|
||||||
|
if (Client_Type(Client) == CLIENT_SERVER
|
||||||
|
&& Client_Type(c) == CLIENT_SERVER)
|
||||||
|
return c;
|
||||||
if (!Client_HasMode(c, 'o'))
|
if (!Client_HasMode(c, 'o'))
|
||||||
return false;
|
return NULL;
|
||||||
if (!Client_OperByMe(c) && !Conf_AllowRemoteOper)
|
if (!Client_OperByMe(c) && !Conf_AllowRemoteOper)
|
||||||
return false;
|
return NULL;
|
||||||
|
|
||||||
/* The client is an local IRC operator, or this server is configured
|
/* The client is an local IRC operator, or this server is configured
|
||||||
* to trust remote operators. */
|
* to trust remote operators. */
|
||||||
return true;
|
return c;
|
||||||
} /* Op_Check */
|
} /* Op_Check */
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* ngIRCd -- The Next Generation IRC Daemon
|
||||||
* Copyright (c)2001-2009 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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -18,7 +18,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
GLOBAL bool Op_NoPrivileges PARAMS((CLIENT * Client, REQUEST * Req));
|
GLOBAL bool Op_NoPrivileges PARAMS((CLIENT * Client, REQUEST * Req));
|
||||||
GLOBAL bool Op_Check PARAMS((CLIENT * Client, REQUEST * Req));
|
GLOBAL CLIENT *Op_Check PARAMS((CLIENT * Client, REQUEST * Req));
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -102,8 +102,8 @@ PAM_Authenticate(CLIENT *Client) {
|
|||||||
/* Set supplied client password */
|
/* Set supplied client password */
|
||||||
if (password)
|
if (password)
|
||||||
free(password);
|
free(password);
|
||||||
password = strdup(Client_Password(Client));
|
password = strdup(Conn_Password(Client_Conn(Client)));
|
||||||
conv.appdata_ptr = password;
|
conv.appdata_ptr = Conn_Password(Client_Conn(Client));
|
||||||
|
|
||||||
/* Initialize PAM */
|
/* Initialize PAM */
|
||||||
retval = pam_start("ngircd", Client_OrigUser(Client), &conv, &pam);
|
retval = pam_start("ngircd", Client_OrigUser(Client), &conv, &pam);
|
||||||
|
|||||||
@@ -36,9 +36,12 @@
|
|||||||
|
|
||||||
#include "imp.h"
|
#include "imp.h"
|
||||||
#include "irc.h"
|
#include "irc.h"
|
||||||
|
#include "irc-cap.h"
|
||||||
#include "irc-channel.h"
|
#include "irc-channel.h"
|
||||||
|
#include "irc-encoding.h"
|
||||||
#include "irc-info.h"
|
#include "irc-info.h"
|
||||||
#include "irc-login.h"
|
#include "irc-login.h"
|
||||||
|
#include "irc-metadata.h"
|
||||||
#include "irc-mode.h"
|
#include "irc-mode.h"
|
||||||
#include "irc-op.h"
|
#include "irc-op.h"
|
||||||
#include "irc-oper.h"
|
#include "irc-oper.h"
|
||||||
@@ -59,10 +62,12 @@ static COMMAND My_Commands[] =
|
|||||||
{
|
{
|
||||||
{ "ADMIN", IRC_ADMIN, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "ADMIN", IRC_ADMIN, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "AWAY", IRC_AWAY, CLIENT_USER, 0, 0, 0 },
|
{ "AWAY", IRC_AWAY, CLIENT_USER, 0, 0, 0 },
|
||||||
|
{ "CAP", IRC_CAP, 0xFFFF, 0, 0, 0 },
|
||||||
{ "CONNECT", IRC_CONNECT, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "CONNECT", IRC_CONNECT, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "DIE", IRC_DIE, CLIENT_USER, 0, 0, 0 },
|
{ "DIE", IRC_DIE, CLIENT_USER, 0, 0, 0 },
|
||||||
{ "DISCONNECT", IRC_DISCONNECT, CLIENT_USER, 0, 0, 0 },
|
{ "DISCONNECT", IRC_DISCONNECT, CLIENT_USER, 0, 0, 0 },
|
||||||
{ "ERROR", IRC_ERROR, 0xFFFF, 0, 0, 0 },
|
{ "ERROR", IRC_ERROR, 0xFFFF, 0, 0, 0 },
|
||||||
|
{ "GLINE", IRC_xLINE, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "HELP", IRC_HELP, CLIENT_USER, 0, 0, 0 },
|
{ "HELP", IRC_HELP, CLIENT_USER, 0, 0, 0 },
|
||||||
{ "INFO", IRC_INFO, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "INFO", IRC_INFO, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "INVITE", IRC_INVITE, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "INVITE", IRC_INVITE, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
@@ -70,9 +75,11 @@ static COMMAND My_Commands[] =
|
|||||||
{ "JOIN", IRC_JOIN, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "JOIN", IRC_JOIN, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "KICK", IRC_KICK, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "KICK", IRC_KICK, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "KILL", IRC_KILL, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "KILL", IRC_KILL, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
|
{ "KLINE", IRC_xLINE, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "LINKS", IRC_LINKS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "LINKS", IRC_LINKS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "LIST", IRC_LIST, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "LIST", IRC_LIST, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "LUSERS", IRC_LUSERS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "LUSERS", IRC_LUSERS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
|
{ "METADATA", IRC_METADATA, CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "MODE", IRC_MODE, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "MODE", IRC_MODE, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "MOTD", IRC_MOTD, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "MOTD", IRC_MOTD, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "NAMES", IRC_NAMES, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "NAMES", IRC_NAMES, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
@@ -94,6 +101,7 @@ static COMMAND My_Commands[] =
|
|||||||
{ "SQUERY", IRC_SQUERY, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "SQUERY", IRC_SQUERY, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "SQUIT", IRC_SQUIT, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "SQUIT", IRC_SQUIT, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "STATS", IRC_STATS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "STATS", IRC_STATS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
|
{ "SVSNICK", IRC_SVSNICK, CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "SUMMON", IRC_SUMMON, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "SUMMON", IRC_SUMMON, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "TIME", IRC_TIME, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "TIME", IRC_TIME, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "TOPIC", IRC_TOPIC, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "TOPIC", IRC_TOPIC, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
@@ -107,9 +115,14 @@ static COMMAND My_Commands[] =
|
|||||||
{ "WHO", IRC_WHO, CLIENT_USER, 0, 0, 0 },
|
{ "WHO", IRC_WHO, CLIENT_USER, 0, 0, 0 },
|
||||||
{ "WHOIS", IRC_WHOIS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "WHOIS", IRC_WHOIS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
{ "WHOWAS", IRC_WHOWAS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
{ "WHOWAS", IRC_WHOWAS, CLIENT_USER|CLIENT_SERVER, 0, 0, 0 },
|
||||||
|
|
||||||
#ifdef IRCPLUS
|
#ifdef IRCPLUS
|
||||||
{ "CHANINFO", IRC_CHANINFO, CLIENT_SERVER, 0, 0, 0 },
|
{ "CHANINFO", IRC_CHANINFO, CLIENT_SERVER, 0, 0, 0 },
|
||||||
|
# ifdef ICONV
|
||||||
|
{ "CHARCONV", IRC_CHARCONV, CLIENT_USER, 0, 0, 0 },
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef STRICT_RFC
|
#ifndef STRICT_RFC
|
||||||
{ "GET", IRC_QUIT_HTTP, CLIENT_UNKNOWN, 0, 0, 0 },
|
{ "GET", IRC_QUIT_HTTP, CLIENT_UNKNOWN, 0, 0, 0 },
|
||||||
{ "POST", IRC_QUIT_HTTP, CLIENT_UNKNOWN, 0, 0, 0 },
|
{ "POST", IRC_QUIT_HTTP, CLIENT_UNKNOWN, 0, 0, 0 },
|
||||||
@@ -325,13 +338,21 @@ Validate_Prefix( CONN_ID Idx, REQUEST *Req, bool *Closed )
|
|||||||
/* check if the client named in the prefix is expected
|
/* check if the client named in the prefix is expected
|
||||||
* to come from that direction */
|
* to come from that direction */
|
||||||
if (Client_NextHop(c) != client) {
|
if (Client_NextHop(c) != client) {
|
||||||
Log(LOG_ERR,
|
if (Client_Type(c) != CLIENT_SERVER) {
|
||||||
"Spoofed prefix \"%s\" from \"%s\" (connection %d, command \"%s\")!",
|
Log(LOG_ERR,
|
||||||
Req->prefix, Client_Mask(Conn_GetClient(Idx)), Idx,
|
"Spoofed prefix \"%s\" from \"%s\" (connection %d, command \"%s\")!",
|
||||||
Req->command);
|
Req->prefix, Client_Mask(Conn_GetClient(Idx)), Idx,
|
||||||
Conn_Close(Idx, NULL, "Spoofed prefix", true);
|
Req->command);
|
||||||
*Closed = true;
|
Conn_Close(Idx, NULL, "Spoofed prefix", true);
|
||||||
|
*Closed = true;
|
||||||
|
} else {
|
||||||
|
Log(LOG_INFO,
|
||||||
|
"Ignoring spoofed prefix \"%s\" from \"%s\" (connection %d, command \"%s\").",
|
||||||
|
Req->prefix, Client_Mask(Conn_GetClient(Idx)), Idx,
|
||||||
|
Req->command);
|
||||||
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@@ -493,10 +514,20 @@ Handle_Request( CONN_ID Idx, REQUEST *Req )
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(client_type & cmd->type))
|
if (!(client_type & cmd->type)) {
|
||||||
return IRC_WriteStrClient(client, ERR_NOTREGISTERED_MSG, Client_ID(client));
|
if (client_type == CLIENT_USER
|
||||||
|
&& cmd->type & CLIENT_SERVER)
|
||||||
|
return IRC_WriteStrClient(client,
|
||||||
|
ERR_NOTREGISTEREDSERVER_MSG,
|
||||||
|
Client_ID(client));
|
||||||
|
else
|
||||||
|
return IRC_WriteStrClient(client,
|
||||||
|
ERR_NOTREGISTERED_MSG,
|
||||||
|
Client_ID(client));
|
||||||
|
}
|
||||||
|
|
||||||
/* Command is allowed for this client: call it and count produced bytes */
|
/* Command is allowed for this client: call it and count
|
||||||
|
* generated bytes in output */
|
||||||
Conn_ResetWCounter();
|
Conn_ResetWCounter();
|
||||||
result = (cmd->function)(client, Req);
|
result = (cmd->function)(client, Req);
|
||||||
cmd->bytes += Conn_WCounter();
|
cmd->bytes += Conn_WCounter();
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* 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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -79,7 +79,6 @@ Proc_Fork(PROC_STAT *proc, int *pipefds, void (*cbfunc)(int, short), int timeout
|
|||||||
signal(SIGALRM, Proc_GenericSignalHandler);
|
signal(SIGALRM, Proc_GenericSignalHandler);
|
||||||
close(pipefds[0]);
|
close(pipefds[0]);
|
||||||
alarm(timeout);
|
alarm(timeout);
|
||||||
Conn_CloseAllSockets();
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,14 +137,28 @@ Proc_Read(PROC_STAT *proc, void *buffer, size_t buflen)
|
|||||||
return 0;
|
return 0;
|
||||||
Log(LOG_CRIT, "Can't read from child process %ld: %s",
|
Log(LOG_CRIT, "Can't read from child process %ld: %s",
|
||||||
proc->pid, strerror(errno));
|
proc->pid, strerror(errno));
|
||||||
|
Proc_Close(proc);
|
||||||
bytes_read = 0;
|
bytes_read = 0;
|
||||||
|
} else if (bytes_read == 0) {
|
||||||
|
/* EOF: clean up */
|
||||||
|
LogDebug("Child process %ld: EOF reached, closing pipe.",
|
||||||
|
proc->pid);
|
||||||
|
Proc_Close(proc);
|
||||||
}
|
}
|
||||||
#if DEBUG
|
|
||||||
else if (bytes_read == 0)
|
|
||||||
LogDebug("Can't read from child process %ld: EOF", proc->pid);
|
|
||||||
#endif
|
|
||||||
Proc_InitStruct(proc);
|
|
||||||
return (size_t)bytes_read;
|
return (size_t)bytes_read;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Close pipe to a forked child process.
|
||||||
|
*/
|
||||||
|
GLOBAL void
|
||||||
|
Proc_Close(PROC_STAT *proc)
|
||||||
|
{
|
||||||
|
/* Close socket, if it exists */
|
||||||
|
if (proc->pipe_fd >= 0)
|
||||||
|
io_close(proc->pipe_fd);
|
||||||
|
|
||||||
|
Proc_InitStruct(proc);
|
||||||
|
}
|
||||||
|
|
||||||
/* -eof- */
|
/* -eof- */
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
/*
|
/*
|
||||||
* ngIRCd -- The Next Generation IRC Daemon
|
* 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
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@@ -38,6 +38,9 @@ GLOBAL void Proc_GenericSignalHandler PARAMS((int Signal));
|
|||||||
|
|
||||||
GLOBAL size_t Proc_Read PARAMS((PROC_STAT *proc, void *buffer, size_t buflen));
|
GLOBAL size_t Proc_Read PARAMS((PROC_STAT *proc, void *buffer, size_t buflen));
|
||||||
|
|
||||||
|
GLOBAL void Proc_Close PARAMS((PROC_STAT *proc));
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* -eof- */
|
/* -eof- */
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user