mirror of
https://github.com/freebsd/freebsd-src.git
synced 2024-11-29 06:42:45 +00:00
Import sendmail 8.11.2
This commit is contained in:
parent
42e5d16589
commit
193538b7da
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/vendor/sendmail/dist/; revision=71345
@ -30,4 +30,9 @@ On many environments this will do everything for you, no fuss, no muss.
|
||||
read the README in the utility's directory. When you are ready to install
|
||||
it, back up your installed version and type "sh Build install".
|
||||
|
||||
$Revision: 8.3.16.1 $, Last updated $Date: 2000/05/09 20:20:44 $
|
||||
8. If you are upgrading from an older version of sendmail and are using any
|
||||
database maps, be sure to rebuild them with the new version of makemap,
|
||||
in case you are now using a different (and thereby incompatible) version
|
||||
of Berkeley DB.
|
||||
|
||||
$Revision: 8.3.16.2 $, Last updated $Date: 2000/12/30 06:24:03 $
|
||||
|
@ -61,6 +61,149 @@ FrAdFBf1y33xWo58zRsg2u2h
|
||||
=g1qL
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
Type Bits KeyID Created Expires Algorithm Use
|
||||
pub 1024 0xCC374F2D 2000-12-14 ---------- RSA Sign & Encrypt
|
||||
f16 Fingerprint16 = 59 AF DC 3E A2 7D 29 56 89 FA 25 70 90 0D 7E C1
|
||||
uid Sendmail Signing Key/2001 <sendmail@Sendmail.ORG>
|
||||
|
||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
Version: PGPfreeware 5.0i for non-commercial use
|
||||
|
||||
mQCNAzo5SykAAAEEANNKa1jxgODYsmC5w2FJj14JFX3MnF9yt+NblOrqXvjzs8fp
|
||||
l4qWCoEOsN6tueeNRAytrGTUFe5M+fJ/ddx9yRKuzjv6WxSeYsWHzXxMD2M6WWyn
|
||||
eCK43LhCAd1uuNoYrTdJFnADOrz7YiMu/N8+8IvBhM5ozEH7pzgi20fMN08tAAUR
|
||||
tDFTZW5kbWFpbCBTaWduaW5nIEtleS8yMDAxIDxzZW5kbWFpbEBTZW5kbWFpbC5P
|
||||
Ukc+iQCVAwUQOjlLKTgi20fMN08tAQF1YgP7BmBeA8wCY8sNlENCgMbYcgkqrmtO
|
||||
aDzCRwALiIDEC63i317iiopRq8wH8ZQcJewvmQDQKWgdZnpJbpAONLR8gzk0t995
|
||||
0wKHRgtGtzR8x8RtSXZ9yiC4AjxkLXogaOYtJk+ZXayX1VFCJ0lMoxRsNtTfXyHK
|
||||
RN0lMnJwaRPE3FqJAJUDBRA6OU38nBy94uNcVjUBARTzA/9rapch15EjSgZIywSY
|
||||
e53l0EfoqsUqKzCSoRGZqv+hJzpRVQ+R+D037pSV07OItK2q0nYGLZqH5ApLgXAG
|
||||
/SPlEYPnUzCooijIr/RsLU954lp1HDNuqUZfUs1ukk/f7wHmshsP3LS6zyvqnHR+
|
||||
va9fzU3wo5ZRv1ItWIL3b68+uIkAlQMFEDo5TglvUpPYo5umVQEBbqAD/Aj63aIn
|
||||
4f6W57E7APvhkP0FhWcrCp9sGu0+EdUP2lnn7KEn02D1hwx4mDLcJcFxikfXXVvh
|
||||
+Cfpr54oP0CWNpcpXVssS5CZoYoC8e8W0YoVkvYnxmHFDjnGRzwKDT88FdZYnbiS
|
||||
JWxlUkcOs45bOdOTE7pIeBwe9MJK/zCwrbmYiQCVAwUQOjlOGO9YlmTUMuGdAQGy
|
||||
YwP/fVIA/Y7SH+MxlALWNHOVOiPF6KdrZxOoB/Ya1G8uNCS5PttePZm/ZSoyVLSX
|
||||
QsJG1Xe/3YPXDobuPdRuC+Kpzli6upCHG0jbsH7/m/EPyATxPP6GvpU/eVK1a3el
|
||||
8aLl7J0m6NSEh349AbFAzCRhrRl9N/jIPt7rys61ELIMp/GJAJUDBRA6OU4wfEtn
|
||||
baAOFWMBAYELBACtu0kG7v4QYs2lJXIpdw7Bwl2/WNyH8mFhrqNgbAE9+Fsh4HAP
|
||||
nCBHf3qbjH4/Q3j4QNkDLor2HYIhnW8Hz21At//5/eEm/uJj2vsOjfKFYpGtwf/L
|
||||
VHQCQDbNFrxi8pLtwQARNL8M0ONT1rxNg5xyv0/3IWeo9GblkV3hdKO1sYkAlQMF
|
||||
EDo5TlnAKcpAFvTM6QEB9s4D/23DDLInFj4NoaO0MI+ZLWo1M8SXd/sWC32IYY+P
|
||||
dqABtONUNvVnaz2wSZxb2tKXcuju4DtsMrZFttcEQ6W4zaaGpcg6Hq6UqHGL0UAE
|
||||
2tkcJePvkIhJ/FokoEQnoAlj8IdxjK56gCT4Z7OOSmQEcNTcjmH5Z1AZUnTkIImT
|
||||
hFRuiQCVAwUQOjlOqNbgof5PvirdAQGzAQP7BtqC0bhCybf+P4ESP7XwSYVuSZvM
|
||||
LLrpkA017MQgf5BCHfh6x/r7NxGH4OOTnZwcKQJHJ0NzAxtmWCe3YjxLHMUlfRcK
|
||||
MIBQF5UhPTOkCo2XFDNIuQ/Tayj1D3Go1JHSRqfxe8et2U1SZi74JMMo+B7o+utX
|
||||
dUNzbv5QbD7yydGJAJUDBRA6OWaRmAfmW9hLWSEBAegOBACgsFNvkidMRX08xGEN
|
||||
oX3elJj5Ib/zYYvR7Ui/b27haw9KtuUNct0aRtb+MAb9sXb+0hphDR2W//AxSDgG
|
||||
Qh6ZiEO9c0xw74XX7MrSpwcgom4jJLxGN0fEx1YGmMF1LGmmlE8UWC+FJdVVnW8v
|
||||
m98v3zEmRaHvDnklGvFsgItw3okAlQMFEDo5anTObntw7cbX6wEBKGUD/0aIxmvb
|
||||
kwPlV27sCl6QGy+C3hIJTtz0go6wRh+X0wrP0G5c5OBlg12GqOYP/WlGEs7Qy8GU
|
||||
exXFZxF5kBtFgUiHLq5XxWsAv4DVyrtu3wtpFu9P+smKuMQWvUah5x2R5AdsyH2/
|
||||
/nn2tMcHqwsgwK/l2cd7ObtfZXoYyH4ZU+3SiQCVAwUQOjrpa88etQMiMnoBAQHp
|
||||
JgP9ENhWpB1jv9xrUDy6XCIEdx8hoSVFT/+PaiPhyRwEY1+sW6L68NeTPWnDAcuF
|
||||
y95sZlBl6xKIykf5sG0Cb8/Y8HMIIjuiet3nYTd4ehKE6/byOwwVNwe4zu65+kGz
|
||||
YT0NF8CaZ2zBFV9wM8JnM+BHshxu1X+4u57oTbenXCNBOmGJAEYEEBECAAYFAjo6
|
||||
70YACgkQAm4U2qPreYrl9QCfRFB0hJDrDCWjuVTFXdEg7/R7uKYAn2Aqn2DJ5eai
|
||||
Q5JHhAnY4uS8iOiciQCVAwUQOjt6hV8eyG+IDJ5VAQEMlAQAiMUmNGEmYcX74SLE
|
||||
LD46olA0CxMlOBARFCFd7SOG3vY8IKshHNr8D9fYhz6MulGOfJl0XXrcWWDW8KwS
|
||||
LPsJMIAB3NSe2h/ZEqnOp4A4E+AlNZJyGrmPwhBoNs4jsXSzlZTeOxh3GTJrCiMY
|
||||
qe9v9NJkntmjrubyUe0HZrM5tkmJAJUDBRA6Ovq+4dT8FObQdHEBAfO9A/9dP1q1
|
||||
bpbYRT23pqJLPWjXDKqld5dwaJy6SDyqi3kD+jtzWsmA6rRTWuA5Ykq/Ugj1CENl
|
||||
s/bgptFd38uMDh6F4WHpOGMcXx7OKqTzwlm87MBnuZ/rjqJDf+HwJWcwqebh9ADE
|
||||
k2acJjQBPOsOOmPatbnOSKGh8JbK/Xng7ZGHBYkAPwMFEDo7lA/OwoiMv2pMoREC
|
||||
uxoAoPrizznbyWF1kFGSzWOjPWdIkdMmAJ9xXra4pgV1uAKrRYE1zIOCp6TDcokA
|
||||
dQMFEDo7lwes4VzBBNt7HQEBivUC/iRk6/XsetmOW2RPqEIvOvleZSyNtmgkeMva
|
||||
+Q57Js1jDNA6DZTperfbl6Mwt0eVnZxH59l7apSWwl7ZGsum5AjZr0cuWyX+gMg3
|
||||
wBLI6dG1a0+y4tCnBKfPHDSTqqMKGYkARgQQEQIABgUCOjuApgAKCRDbzEgBadC1
|
||||
viYIAJ90YPSCIMcIhcyzzdqwVSlpIMSp+wCdFZH4YnjW1eFfzfym5tSbxiRVWCaJ
|
||||
AJUDBRA6POfsAPLZCeu7G0EBAUUoBACQdVkXeAia2QuOD0J0OH5lSILg3xTam1Vp
|
||||
JXpj70m/kmlzAR71BIgCFTeTsg1IhY/08cLBqEwksv7nLt+1FSxHCNt8o+SLkA24
|
||||
iMIBb7JeOHxkP8QZdiBbLSEvEE+4Dak9LaxqlLvw+u+fxCmw9er610OTr5zUq5cb
|
||||
POpMdl91r4kAlQMFEDo9NvgGfl7Yv7VlaQEBdJ0EALPhVgdb1IkNKgd5QCM1rHz1
|
||||
SqXVH40tOrMuSx6g1eW5Sv1Eg+xwYsCx9jICzVFntXZic11oWUqEVV6icvKZ207z
|
||||
aWTVQneBGEBZXa1q+8WxaxPTfBgxhuxF7iKVBQ2JOzjPo8K43wHfZVP90iwFVJHm
|
||||
jJ6uIUj4EdMVJ1WwHbfG
|
||||
=XS0J
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
Type Bits KeyID Created Expires Algorithm Use
|
||||
pub 1024 0xE35C5635 1999-12-13 ---------- RSA Sign & Encrypt
|
||||
f16 Fingerprint16 = 81 8C 58 EA 7A 9D 7C 1B 09 78 AC 5E EB 99 08 5D
|
||||
uid Sendmail Signing Key/2000 <sendmail@Sendmail.ORG>
|
||||
|
||||
-----BEGIN PGP PUBLIC KEY BLOCK-----
|
||||
Version: PGPfreeware 5.0i for non-commercial use
|
||||
|
||||
mQCNAzhVRnYAAAEEALjBKz/mDHemTNA+hNjGcruAJm6Blc9ZIGHPthQWkFt0ca70
|
||||
w0U8TBbK/m03WdMvq+PaZAb8EG5uqXctZKwmWIIGB7nRBLLnj42er8XwUfAT8KNJ
|
||||
PQ1p9x9zFWZc3byC8ekg8l+CK/hJLFhGTSGjx8nHv+LvPis/mpwcveLjXFY1AAUR
|
||||
tDFTZW5kbWFpbCBTaWduaW5nIEtleS8yMDAwIDxzZW5kbWFpbEBTZW5kbWFpbC5P
|
||||
Ukc+iQCVAwUQOFVGdpwcveLjXFY1AQG2vgP/QRG6TqsmJgixf27F2IFgoJLUU+7C
|
||||
ZmD1qNT9yL/1JMbE8pnzxOk64w8D47ZiDwr9dp3EzH8EpmV/eIpxLNYV7/Y+W59J
|
||||
8+EY2T9mzVmp0YGOMFYt8lLVw6NKqya19adQ80dDzkkmwRHfY514+9+DPbc6TvHR
|
||||
jNzo0SuetBiWW+2JAJUDBRA4VUa8b1KT2KObplUBAbtYA/491EG5lsbr09oV0g/e
|
||||
RSfxliLj+lCJdQiicwYeqHX5dZeB04yz3wUFovIff8dY01KcITXBL9TtDfarz5Pl
|
||||
nelUg5cIlKn7kxCeUP0ggA/tz6Zlg3v/LkoIqsUqrodqscjLPt2JTWPJYWYaVjM9
|
||||
fqXiXRXlVcy2urx6uEucvkjYY4kAlQMFEDhVRs3vWJZk1DLhnQEBwoYD/1zxfMMP
|
||||
pqj3HV3d9q1esyvZdPACiAH+1CJVmtcIV8TjO5qYulxz2TEtd/JLqdYsgUgf2N8T
|
||||
/ClMtfEReSTmVNWIsINAA75P16uIkDYZ8Tmo4XYOf80voeOhWlAwpyLQGIN3GVX+
|
||||
gLmC/9Fw2wo0E3LsCrUfXREZQTSXMqIe3YPJiQCVAwUQOFVG8XxLZ22gDhVjAQEA
|
||||
SwQAuIEC9CZfKcxAImFBvwqfJYrnKtWPorEV3QtqAN4WaCLFvI8jZJEPJJEf61N9
|
||||
aucpO/qj6x/iwu2k92E/T5FRVUiFKzXZb5bWm+qI5c+ynBZq34s+qvAq7Sx0gXxJ
|
||||
qimu4ZekACORdeRsILzgRYwGHA45SRONvTY5t9xGoRrsQcuJAJUDBRA4VUm8zx61
|
||||
AyIyegEBAczRA/0UjYKC81NSK+a9XNl83ANI/o0TZfqpsjotHl+Gagb3NWQTFe/3
|
||||
AjkDovLk24fB7cPEwcj7Y4oX0g61pH3DAyPK+Zo1VbYTPSEU9ljVB042YLz12EMe
|
||||
c+eD6k2yC//vVK8BJ6Iefh/gXg7Mb+Dis1YBMg9d+23p901DJi6OeZqJK4kAlQMF
|
||||
EDhVTYtuAhsP7LmozwEBBGgEAIVaUCZ3hplEkX5yBBPOccaTV4uioK/8tzahAC9h
|
||||
kN8slolrnvj9fQFMFEltDZSzIqn2855JCT8+ZoIdmGsJ6SyIfv2vlunMIsNfZiy1
|
||||
jE3jTJ3KEX98fg1h0SBGyzsaMHJd/NzdRiXbmqC/yQOj8eO/RRK3okAPdliVzNx1
|
||||
BjpaiQCVAwUQOFVRDAx2JIpOldm1AQFRvQP/RquJhO+TZJI2nZPUiGsjwHVe/WNT
|
||||
SQM3nIVyO/mwCFqIPmzywqwn3OsC50S68Bif7PwMToFQKcgNUOwQtZNyp4aico2v
|
||||
VLkxjbpAorqdNDkALdwFWziWIHZRZQ1BVEQDXj5sRoHpsQCmNjrYHh8mFYeVcMv/
|
||||
QMRebEt4BRQDXgaJAJUDBRA4VVFnXx7Ib4gMnlUBAXANA/9tmgZGCOUtMC2Xwa1W
|
||||
iLhYPiq1aSKOuErkalryTUg98qEOQuRxGyunJOZ5cR6ynfJcZwV1N5CXlb7kv1el
|
||||
M4iixtcBcytgauH/hgmBOt3oG5jhDoVTaFhFwCXaKOLQJueKeV4AslohDRY4oRhk
|
||||
WIVt3oue1nGpNxzSNRIRE3Mgi4kAPwMFEDhVUa0EgEc5fjtIOhECFNwAoKOO0KUW
|
||||
ehHMvIkketv0s9213ojkAKCpp6gMpNRbz90FH6zoM9nsXd3H2okAlQMFEDhVUy8S
|
||||
pjY8FSuHJQEBsscD/3/P1dO/DohAsUx6e024AIoAqj+PFZXwhj1hkN6UoRRgD0Is
|
||||
x81+oDSrukhBlMvhRcGMEAnUltHk6FBXgIXaOPc8dbFyTEd4Gwyo0HH1aFxiS3LO
|
||||
cs74huxWaJGzWY8o5hHGItZ/sLRhrC5t3Rza87tMXRqBUNGmFeJbIkaJi4TdiQCV
|
||||
AwUQOFVV1wDy2QnruxtBAQFKUgP/Su59Zw7pmtq9vqaxYT2JFP0PBlSRpM4dA6hZ
|
||||
MfkZzXTLQtUM4xZ/CTdMeLdzB4hhuY1ZFXsA0FGxrmfp1YBYEQCvShFQBXafMtKU
|
||||
goifwJjf2rOkcg/aW15ZscJilM1SXm+VFM0DR1LT3nSeFucwRhq9i29tQgTuWtvj
|
||||
KRLDRDmJAJUDBRA4VV4TAPze7UgudY0BARa8BACvWUEN7KFh74rnGf+OVBM/4q0i
|
||||
revTdp45qmMtoR7UA1rU9e+fucv3o9tW1RLjz60eMCXqCEsVfMhqiSokszCIENU/
|
||||
n0VJQv2/8bqUkilvJD4L6vyixCUt7KiISIJjvc5mSaeRRiuOPda6IhrBJArU+Dkv
|
||||
qlCdM78H4XEgGPoAsokAlQMFEDhVZDctWQ7R0tKsjQEBWowD/RqAe7GBmSt3bio/
|
||||
wNKbxfTPNQYJW5scK2XkA+6iSlBmM9kVxVLd9/hYrovWWHAaVjt2mmA60K98xuX5
|
||||
r9oLtsAV2CWw2+zAMeCicKqSx+4Qn8Cl/lujj/KIdEHphr1gDai0HBczeCwsQKX1
|
||||
z8n1YWzztBrGuFfpWexFuchR/KnHiQCVAwUQOFVn+ncdkq6JcsfBAQGXnAQAkF57
|
||||
i8b59pIlxqJ98waDtmyFPebj+otP9HEGqUdin2EqZaF0D3wKpemJU5CPvQiE7+8Q
|
||||
FllVn3DQT1FkbmSmFAu6o/T1AYxNlJUs6lts+3RBNB2pgW2Kg/jgDI8TadEt40nV
|
||||
sWualuu3wwv4/1EuRArmChZZYw48uEs1Sd7JVrKJAD8DBRA4VWhegwKhoT7fAuoR
|
||||
AlsxAJ4rOAUIdCCTGy7vLm0jrkIQBsgb3ACghD7HPZATPu9dEWN9u+iIesRQcq+J
|
||||
AJUDBRA4VWsRmAfmW9hLWSEBAfO1A/0cQkcmiObBST7kMokcLaVoV4agrBUcSgt4
|
||||
sfEYjZD2Jwa/yTcD/Q5iPEBvsU82vuSxMgznQQzQ5a/iQ4zo3aC4pCJdYWLd7Hsf
|
||||
Nb5YGZW8Qk2wwABIfaH8p047Akcfg6QyohSGCDi+XtKyYc0aV/qsyedSNrrIwut+
|
||||
O8BQFL2RTIkARgQQEQIABgUCOFV7rgAKCRBBmwi5FiBlLDWSAJ4nAq0EdKIqZ9bX
|
||||
hmaMODm9mIDlDwCcDskeOGPiG8JQXPquafgc/PucTUqJAJUDBRA4VX174dT8FObQ
|
||||
dHEBARU5A/9O/D/OGOqH/mn4kZT1qIEh/jBMvTvHov0NhBq1HlPplhe5iZcG8hM9
|
||||
N94zP1hZmsYJg4dn+DFw21LVEWQ8y0TbygA4YyxbLq4El40GXAN9/LvVuelY4Luc
|
||||
CNoqJKUrRR2Pd+PLEvZEcIqeDu0+dVS0uuXptMPqHYD2UMoNbl7q14kBFQMFEDhV
|
||||
YDaDyJl8YW+H3QEBuFMH+wRYTwfWgXJDQJ4v7T9zOvkdAVfZs0AgZUPSRKowwcV7
|
||||
rKUazJ9CwmdKUCVBpMPgePYy8x5Wc8tkScvAxlCV+wPhyn/V5cbDdL80QduMLVFW
|
||||
BILNwAkviNFPpEdjxZvCpBxG9pQIp/8YI7fRaCkJR5Q5bp++/2VbWa7YHGiWjLVW
|
||||
6T2z8dCxAplxC517qzQlo7i4pX34W7qNz0b89+RAgwWJXaFjXPQDv0sTwnRZBwrV
|
||||
q/V9TA/LY7qmVspylvu0w64NdtiUqnTa5jS/9BZtFf3eyOezqSIEwRkQC6My/JQx
|
||||
BKvXspdbJDnrJxD0D0B2eTWa3MQD7BK+WC1RRkTjvyqJAJUDBRA4Vt0jBn5e2L+1
|
||||
ZWkBAekjA/47X/leujEhaUEjj9hMyDY6/8HbgxwNyUd+Sx6i9FK+vhAGq8s07dTt
|
||||
y9brozqixmHCGYPyvvVkcsVpeQlEWoXc750hbj5a/Et1m3C1J6vGn979f0do144Z
|
||||
iiVpzTCh1LZHH5rALd5tuaNcD5MbOYQeP0vDVcJm2GQzm+IdjGtzPw==
|
||||
=RnIu
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
Type Bits KeyID Created Expires Algorithm Use
|
||||
pub 1024 0xA39BA655 1999-01-04 ---------- RSA Sign & Encrypt
|
||||
f16 Fingerprint16 = 25 73 4C 8E 94 B1 E8 EA EA 9B A4 D6 00 51 C3 71
|
||||
@ -389,4 +532,4 @@ BLK2NtITxxAIKQwj79xNqzgsfm3cpti32t+C/kGkYbONonZHz5uhAG+N0jQ=
|
||||
=idnw
|
||||
-----END PGP PUBLIC KEY BLOCK-----
|
||||
|
||||
$Revision: 8.5 $, Last updated $Date: 1999/11/23 19:08:03 $
|
||||
$Revision: 8.5.16.3 $, Last updated $Date: 2000/12/19 22:33:12 $
|
||||
|
@ -1,11 +1,130 @@
|
||||
SENDMAIL RELEASE NOTES
|
||||
$Id: RELEASE_NOTES,v 8.561.2.5.2.125 2000/09/27 06:25:28 gshapiro Exp $
|
||||
$Id: RELEASE_NOTES,v 8.561.2.5.2.181 2000/12/28 23:56:46 gshapiro Exp $
|
||||
|
||||
|
||||
This listing shows the version of the sendmail binary, the version
|
||||
of the sendmail configuration files, the date of release, and a
|
||||
summary of the changes in that release.
|
||||
|
||||
8.11.2/8.11.2 2000/12/29
|
||||
Prevent a segmentation fault when trying to set a class in
|
||||
address test mode due to a negative array index. Audit
|
||||
other array indexing. This bug is not believed to be
|
||||
exploitable. Noted by Michal Zalewski of the "Internet for
|
||||
Schools" project (IdS).
|
||||
Add an FFR (for future release) to drop privileges when using
|
||||
address test mode. This will be turned on in 8.12. It can
|
||||
be enabled by compiling with:
|
||||
APPENDDEF(`conf_sendmail_ENVDEF', `-D_FFR_TESTMODE_DROP_PRIVS')
|
||||
in your devtools/Site/site.config.m4 file. Suggested by
|
||||
Michal Zalewski of the "Internet for Schools" project (IdS).
|
||||
Fix potential problem with Cyrus-SASL security layer which may have
|
||||
caused I/O errors, especially for mechanism DIGEST-MD5.
|
||||
When QueueSortOrder was set to host, sendmail might not read
|
||||
enough of the queue file to determine the host, making the
|
||||
sort sub-optimal. Problem noted by Jeff Earickson of
|
||||
Colby College.
|
||||
Don't issue DSNs for addresses which use the NOTIFY parameter (per
|
||||
RFC 1891) but don't have FAILURE as value.
|
||||
Initialize Cyrus-SASL library before the SMTP daemon is started.
|
||||
This implies that every change to SASL related files requires
|
||||
a restart of the daemon, e.g., Sendmail.conf, new SASL
|
||||
mechanisms (in form of shared libraries).
|
||||
Properly set the STARTTLS related macros during a queue run for
|
||||
a cached connection. Bug reported by Michael Kellen of
|
||||
NxNetworks, Inc.
|
||||
Log the server name in relay= for ruleset tls_server instead of the
|
||||
client name.
|
||||
Include original length of bad field/header when reporting
|
||||
MaxMimeHeaderLength problems. Requested by Ulrich Windl of
|
||||
the Universitat Regensburg.
|
||||
Fix delivery to set-user-ID files that are expanded from aliases in
|
||||
DeliveryMode queue. Problem noted by Ric Anderson of the
|
||||
University of Arizona.
|
||||
Fix LDAP map -m (match only) flag. Problem noted by Jeff Giuliano
|
||||
of Collective Technologies.
|
||||
Avoid using a negative argument for sleep() calls when delaying answers
|
||||
to EXPN/VRFY commands on systems which respond very slowly.
|
||||
Problem noted by Mikolaj J. Habryn of Optus Internet
|
||||
Engineering.
|
||||
Make sure the F=u flag is set in the default prog mailer
|
||||
definition. Problem noted by Kari Hurtta of the Finnish
|
||||
Meteorological Institute.
|
||||
Fix IPv6 check for unspecified addresses. Patch from
|
||||
Jun-ichiro itojun Hagino of the KAME Project.
|
||||
Fix return values for IRIX nsd map. From Kari Hurtta of the Finnish
|
||||
Meteorological Institute.
|
||||
Fix parsing of DaemonPortOptions and ClientPortOptions. Read all
|
||||
of the parameters to find Family= setting before trying to
|
||||
interpret Addr= and Port=. Problem noted by Valdis
|
||||
Kletnieks of Virginia Tech.
|
||||
When delivering to a file directly from an alias, do not call
|
||||
initgroups(); instead use the DefaultUser group information.
|
||||
Problem noted by Marc Schaefer of ALPHANET NF.
|
||||
RunAsUser now overrides the ownership of the control socket, if
|
||||
created. Otherwise, sendmail can not remove it upon
|
||||
close. Problem noted by Werner Wiethege.
|
||||
Fix ConnectionRateThrottle counting as the option is the number of
|
||||
overall connections, not the number of connections per
|
||||
socket. A future version may change this to per socket
|
||||
counting.
|
||||
Portability:
|
||||
Clean up libsmdb so it functions properly on platforms
|
||||
where sizeof(u_int32_t) != sizeof(size_t). Problem
|
||||
noted by Rein Tollevik of Basefarm AS.
|
||||
Fix man page formatting for compatibility with Solaris'
|
||||
whatis. From Stephen Gildea of InTouch Systems, Inc.
|
||||
UnixWare 7 includes snprintf() support. From Larry
|
||||
Rosenman.
|
||||
IPv6 changes for platforms using KAME. Patch from
|
||||
Jun-ichiro itojun Hagino of the KAME Project.
|
||||
Avoid a typedef compile conflict with Berkeley DB 3.X and
|
||||
Solaris 2.5 or earlier. Problem noted by Bob Hughes
|
||||
of Pacific Access.
|
||||
Add preliminary support for AIX 5. Contributed by
|
||||
Valdis Kletnieks of Virginia Tech.
|
||||
Solaris 9 load average support from Andrew Tucker of Sun
|
||||
Microsystems.
|
||||
CONFIG: Reject addresses of the form a!b if FEATURE(`nouucp', `r')
|
||||
is used. Problem noted by Phil Homewood of Asia Online,
|
||||
patch from Neil Rickert of Northern Illinois University.
|
||||
CONFIG: Change the default DNS based blacklist server for
|
||||
FEATURE(`dnsbl') to blackholes.mail-abuse.org.
|
||||
CONFIG: Deal correctly with the 'C' flag in {daemon_flags}, i.e.,
|
||||
implicitly assume canonical host names.
|
||||
CONFIG: Deal with "::" in IPv6 addresses for access_db. Based on
|
||||
patch by Motonori Nakamura of Kyoto University.
|
||||
CONFIG: New OSTYPE(`aix5') contributed by Valdis Kletnieks of
|
||||
Virginia Tech.
|
||||
CONFIG: Pass the illegal header form <list:;> through untouched
|
||||
instead of making it worse. Problem noted by Motonori
|
||||
Nakamura of Kyoto University.
|
||||
CONTRIB: Added buildvirtuser (see `perldoc contrib/buildvirtuser`).
|
||||
CONTRIB: qtool.pl: An empty queue is not an error. Problem noted
|
||||
by Jan Krueger of digitalanswers communications consulting
|
||||
gmbh.
|
||||
CONTRIB: domainmap.m4: Handle domains with '-' in them. From Mark
|
||||
Roth of the University of Illinois at Urbana-Champaign.
|
||||
DEVTOOLS: Change the internal devtools OS, REL, and ARCH m4
|
||||
variables into bldOS, bldREL, and bldARCH to prevent
|
||||
namespace collisions. Problem noted by Motonori Nakamura
|
||||
of Kyoto University.
|
||||
RMAIL: Undo the 8.11.1 change to use -G when calling sendmail. It
|
||||
causes some changes in behavior and may break rmail for
|
||||
installations where sendmail is actually a wrapper to
|
||||
another MTA. The change will re-appear in a future
|
||||
version.
|
||||
SMRSH: Use the vendor supplied directory on HPUX 10.X, HPUX 11.X,
|
||||
and SunOS 5.8. Requested by Jeff A. Earickson of Colby
|
||||
College and John Beck of Sun Microsystems.
|
||||
VACATION: Fix pattern matching for addresses to ignore.
|
||||
VACATION: Don't reply to addresses of the form owner-*
|
||||
or *-owner.
|
||||
New Files:
|
||||
cf/ostype/aix5.m4
|
||||
contrib/buildvirtuser
|
||||
devtools/OS/AIX.5.0
|
||||
|
||||
8.11.1/8.11.1 2000/09/27
|
||||
Fix SMTP EXPN command output if the address expands to a single
|
||||
name. Fix from John Beck of Sun Microsystems.
|
||||
@ -28,7 +147,8 @@ summary of the changes in that release.
|
||||
attempt completes. Problem noted by Max France of AlphaNet.
|
||||
Fix from Neil Rickert of Northern Illinois University.
|
||||
Deal correctly with MaxMessageSize restriction if message size is
|
||||
greater than 2^31.
|
||||
greater than 2^31. Problem noted by Tim "Darth Dice" Bosserman
|
||||
of EarthLink.
|
||||
Turn off queue checkpointing if CheckpointInterval is set to zero.
|
||||
Treat an empty home directory (from getpw*() or $HOME) as
|
||||
non-existent instead of treating it as /. Problem noted by
|
||||
@ -882,7 +1002,7 @@ summary of the changes in that release.
|
||||
Ulrich Windl of the Universitat Regensburg.
|
||||
Add new F=% mailer flag to allow for a store and forward
|
||||
configuration. Mailers which have this flag will not attempt
|
||||
delivery on initial recipient of a message or on queue runs
|
||||
delivery on initial receipt of a message or on queue runs
|
||||
unless the queued message is selected using one of the
|
||||
-qI/-qR/-qS queue run modifiers or an ETRN request. Code
|
||||
provided by Philip Guenther of Gustavus Adolphus College.
|
||||
@ -921,9 +1041,8 @@ summary of the changes in that release.
|
||||
Macro expand PostmasterCopy and DoubleBounceAddress options.
|
||||
New "ph" map for performing ph queries in rulesets. More
|
||||
information is available at
|
||||
http://www-wsg.cso.uiuc.edu/sendmail/patches/.
|
||||
Contributed by Mark Roth of the University of Illinois at
|
||||
Urbana-Champaign.
|
||||
http://www-dev.cso.uiuc.edu/sendmail/. Contributed by Mark
|
||||
Roth of the University of Illinois at Urbana-Champaign.
|
||||
Detect temporary lookup failures in the host map if looking up a
|
||||
bracketed IP address. Problem noted by Kari Hurtta of the
|
||||
Finnish Meteorological Institute.
|
||||
@ -3309,9 +3428,9 @@ summary of the changes in that release.
|
||||
first" error message. Problem pointed out by Chris Thomas
|
||||
of UCLA; patch from John Beck of SunSoft.
|
||||
Handle "sendmail -bp -qSfoobar" properly if restrictqrun is set
|
||||
in PrivacyOptions. The -q shouldn't turn this command off.
|
||||
Problem noted by Murray Kucherawy of Pacific Bell Internet;
|
||||
based on a patch from Gregory Neil Shapiro of WPI.
|
||||
in PrivacyOptions. The -q shouldn't turn this command off.
|
||||
Problem noted by Murray Kucherawy of Pacific Bell Internet;
|
||||
based on a patch from Gregory Neil Shapiro of WPI.
|
||||
Don't consider SMTP reply codes 452 or 552 (exceeded storage allocation)
|
||||
in a DATA transaction to be sticky; these can occur because
|
||||
a message is too large, and smaller messages should still go
|
||||
|
@ -7,7 +7,7 @@ requires a post-V7 version of m4; if you are running the 4.2bsd, SysV.2, or
|
||||
GNU m4 version 1.1 or later also works. Unfortunately, the M4 on BSDI 1.0
|
||||
doesn't work -- you'll have to use a Net/2 or GNU version. GNU m4 is
|
||||
available from ftp://ftp.gnu.org/pub/gnu/m4/m4-1.4.tar.gz (check for the
|
||||
latset version). EXCEPTIONS: DEC's m4 on Digital UNIX 4.x is broken (3.x
|
||||
latest version). EXCEPTIONS: DEC's m4 on Digital UNIX 4.x is broken (3.x
|
||||
is fine). Use GNU m4 on this platform.
|
||||
|
||||
To get started, you may want to look at tcpproto.mc (for TCP-only sites),
|
||||
@ -426,13 +426,16 @@ DECNET_RELAY The host that will accept DECNET-addressed email.
|
||||
of the form node::user will not work.
|
||||
FAX_RELAY The host that will accept mail to the .FAX pseudo-domain.
|
||||
The "fax" mailer overrides this value.
|
||||
LOCAL_RELAY DEPRECATED. The site that will handle unqualified
|
||||
names -- that is, names with out an @domain extension.
|
||||
If not set, they are assumed to belong on this machine.
|
||||
This allows you to have a central site to store a
|
||||
company- or department-wide alias database. This
|
||||
only works at small sites, and only with some user
|
||||
agents.
|
||||
LOCAL_RELAY The site that will handle unqualified names -- that
|
||||
is, names with out an @domain extension.
|
||||
Normally MAIL_HUB is preferred for this function.
|
||||
LOCAL_RELAY is mostly useful in conjunction with
|
||||
FEATURE(stickyhost) -- see the discussion of
|
||||
stickyhost below. If not set, they are assumed to
|
||||
belong on this machine. This allows you to have a
|
||||
central site to store a company- or department-wide
|
||||
alias database. This only works at small sites,
|
||||
and only with some user agents.
|
||||
LUSER_RELAY The site that will handle lusers -- that is, apparently
|
||||
local names that aren't local accounts or aliases. To
|
||||
specify a local user instead of a site, set this to
|
||||
@ -513,7 +516,7 @@ usenet Usenet (network news) delivery. If this is specified,
|
||||
|
||||
fax Facsimile transmission. This is experimental and based
|
||||
on Sam Leffler's HylaFAX software. For more information,
|
||||
see http://www.vix.com/hylafax/.
|
||||
see http://www.hylafax.org/.
|
||||
|
||||
pop Post Office Protocol.
|
||||
|
||||
@ -623,8 +626,10 @@ nouucp Don't route UUCP addresses. This feature takes one
|
||||
given as parameter.
|
||||
|
||||
nocanonify Don't pass addresses to $[ ... $] for canonification
|
||||
by default. It can be changed by setting the
|
||||
DaemonPortOptions modifiers (M=). That is,
|
||||
by default, i.e., host/domain names are considered canonical,
|
||||
except for unqualified names, which must not be used in this
|
||||
mode (violation of the standard). It can be changed by
|
||||
setting the DaemonPortOptions modifiers (M=). That is,
|
||||
FEATURE(`nocanonify') will be overridden by setting the
|
||||
'c' flag. Conversely, if FEATURE(`nocanonify') is not used,
|
||||
it can be emulated by setting the 'C' flag
|
||||
@ -656,14 +661,22 @@ nocanonify Don't pass addresses to $[ ... $] for canonification
|
||||
<user@host>, will be canonified (and hopefully fully
|
||||
qualified), too.
|
||||
|
||||
stickyhost If set, email sent to "user@local.host" are marked
|
||||
as "sticky" -- that is, the local addresses aren't
|
||||
matched against UDB and don't go through ruleset 5.
|
||||
This is used if you want a set up where "user" is
|
||||
not necessarily the same as "user@local.host", e.g.,
|
||||
to make a distinct domain-wide namespace. Prior to
|
||||
8.7 this was the default, and notsticky was used to
|
||||
turn this off.
|
||||
stickyhost This feature is sometimes used with LOCAL_RELAY,
|
||||
although it can be used for a different effect with
|
||||
MAIL_HUB.
|
||||
|
||||
When used with without MAIL_HUB, email sent to
|
||||
"user@local.host" are marked as "sticky" -- that
|
||||
is, the local addresses aren't matched against UDB,
|
||||
don't go through ruleset 5, and are not forwarded to
|
||||
the LOCAL_RELAY (if defined).
|
||||
|
||||
With MAIL_HUB, mail addressed to "user@local.host"
|
||||
is forwarded to the mail hub, with the envelope
|
||||
address still remaining "user@local.host".
|
||||
Without stickyhost, the envelope would be changed
|
||||
to "user@mail_hub", in order to protect against
|
||||
mailing loops.
|
||||
|
||||
mailertable Include a "mailer table" which can be used to override
|
||||
routing for particular domains (which are not in class {w},
|
||||
@ -1064,6 +1077,12 @@ blacklist_recipients
|
||||
described in the anti-spam configuration control section
|
||||
later in this document.
|
||||
|
||||
delay_checks The rulesets check_mail and check_relay will not be called
|
||||
when a client connects or issues a MAIL command, respectively.
|
||||
Instead, those rulesets will be called by the check_rcpt
|
||||
ruleset; they will be skipped under certain circumstances.
|
||||
See "Delay all checks" in "ANTI-SPAM CONFIGURATION CONTROL".
|
||||
|
||||
rbl This feature is deprecated! Please use dnsbl instead.
|
||||
Turns on rejection of hosts found in the Realtime Blackhole
|
||||
List. If an argument is provided it is used as the domain
|
||||
@ -1074,13 +1093,13 @@ rbl This feature is deprecated! Please use dnsbl instead.
|
||||
dnsbl Turns on rejection of hosts found in an DNS based rejection
|
||||
list. If an argument is provided it is used as the domain
|
||||
in which blocked hosts are listed; otherwise it defaults to
|
||||
rbl.maps.vix.com. An explanation for an DNS based rejection
|
||||
list can be found http://maps.vix.com/rbl/. A second argument
|
||||
can be used to change the default error message of
|
||||
Mail from $&{client_addr} refused by blackhole site SERVER
|
||||
where SERVER is replaced by the first argument. This feature
|
||||
can be included several times to query different DNS based
|
||||
rejection lists.
|
||||
blackholes.mail-abuse.org. An explanation for an DNS based
|
||||
rejection list can be found http://mail-abuse.org/rbl/. A
|
||||
second argument can be used to change the default error
|
||||
message of Mail from $&{client_addr} refused by blackhole site
|
||||
SERVER where SERVER is replaced by the first argument. This
|
||||
feature can be included several times to query different DNS
|
||||
based rejection lists.
|
||||
|
||||
loose_relay_check
|
||||
Normally, if % addressing is used for a recipient, e.g.
|
||||
@ -1706,12 +1725,10 @@ The value part of the map can contain:
|
||||
REJECT Reject the sender or recipient with a general
|
||||
purpose message.
|
||||
DISCARD Discard the message completely using the
|
||||
$#discard mailer. For sender addresses it
|
||||
indicates that you should discard anything
|
||||
received from the indicated domain. If it
|
||||
is used for recipients, it affects only
|
||||
the designated recipients, not the whole
|
||||
message.
|
||||
$#discard mailer. If it is used in check_compat,
|
||||
it affects only the designated recipient, not
|
||||
the whole message as it does in all other cases.
|
||||
This should only be used if really necessary.
|
||||
### any text where ### is an RFC 821 compliant error code and
|
||||
"any text" is a message to return for the command.
|
||||
The string should be quoted to avoid surprises,
|
||||
@ -1803,11 +1820,14 @@ spammers. To use this database, use
|
||||
This will cause sendmail to reject mail from any site in the
|
||||
Realtime Blackhole List database. You can specify an alternative
|
||||
RBL domain to check by specifying an argument to the FEATURE.
|
||||
A second argument can be used to change the default error message
|
||||
Mail from $&{client_addr} refused by blackhole site DOMAIN
|
||||
where DOMAIN is replaced by the first argument. This FEATURE can
|
||||
be included several times to query different DNS based rejection
|
||||
lists, e.g., the dial-up user list (see http://maps.vix.com/dul/).
|
||||
The default error message is
|
||||
|
||||
Mail from $&{client_addr} refused by blackhole site DOMAIN
|
||||
|
||||
where DOMAIN is the first argument of the feature. A second argument
|
||||
can be used to specify a different text. This FEATURE can be
|
||||
included several times to query different DNS based rejection lists,
|
||||
e.g., the dial-up user list (see http://maps.vix.com/dul/).
|
||||
|
||||
The features described above make use of the check_relay, check_mail,
|
||||
and check_rcpt rulesets. If you wish to include your own checks,
|
||||
@ -2134,6 +2154,8 @@ parameter if it is identical to the authenticated user.
|
||||
Per default, relaying is allowed for any user who authenticated
|
||||
via a "trusted" mechanism, i.e., one that is defined via
|
||||
TRUST_AUTH_MECH(`list of mechanisms')
|
||||
For example:
|
||||
TRUST_AUTH_MECH(`KERBEROS_V4 DIGEST-MD5')
|
||||
|
||||
If the selected mechanism provides a security layer the number of
|
||||
bits used for the key of the symmetric cipher is stored in the
|
||||
@ -2157,9 +2179,9 @@ LOCAL_RULESETS respectively. For example:
|
||||
|
||||
|
||||
#if _FFR_MILTER
|
||||
+---------------------------+
|
||||
| ADDING NEW MAILER FILTERS |
|
||||
+---------------------------+
|
||||
+-------------------------+
|
||||
| ADDING NEW MAIL FILTERS |
|
||||
+-------------------------+
|
||||
|
||||
Sendmail supports mail filters to filter incoming SMTP messages according
|
||||
to the "Sendmail Mail Filter API" documentation. These filters can be
|
||||
@ -2756,7 +2778,7 @@ confMAX_DAEMON_CHILDREN MaxDaemonChildren
|
||||
rejected. If not set or <= 0, there is
|
||||
no limit.
|
||||
confMAX_HEADERS_LENGTH MaxHeadersLength
|
||||
[undefined] Maximum length of the sum
|
||||
[32768] Maximum length of the sum
|
||||
of all headers.
|
||||
confMAX_MIME_HEADER_LENGTH MaxMimeHeaderLength
|
||||
[undefined] Maximum length of
|
||||
@ -3235,4 +3257,4 @@ M4 DIVERSIONS
|
||||
8 DNS based blacklists
|
||||
9 special local rulesets (1 and 2)
|
||||
|
||||
$Revision: 8.383.2.1.2.24 $, Last updated $Date: 2000/09/24 02:05:54 $
|
||||
$Revision: 8.383.2.1.2.35 $, Last updated $Date: 2000/12/17 17:19:11 $
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Makefile for configuration files.
|
||||
#
|
||||
# $Id: Makefile,v 8.40.8.3 2000/08/08 22:23:30 gshapiro Exp $
|
||||
# $Id: Makefile,v 8.40.8.4 2000/10/26 18:27:44 gshapiro Exp $
|
||||
#
|
||||
|
||||
#
|
||||
@ -25,10 +25,10 @@ RM= rm -f
|
||||
$(CHMOD) $(ROMODE) $@
|
||||
|
||||
GENERIC=generic-bsd4.4.cf generic-hpux9.cf generic-hpux10.cf \
|
||||
generic-linux.cf \
|
||||
generic-linux.cf generic-nextstep3.3.cf \
|
||||
generic-osf1.cf generic-solaris2.cf \
|
||||
generic-sunos4.1.cf generic-ultrix4.cf
|
||||
BERKELEY=cs-hpux9.cf cs-osf1.cf cs-solaris2.cf \
|
||||
BERKELEY=cs-hpux9.cf cs-hpux10.cf cs-osf1.cf cs-solaris2.cf \
|
||||
cs-sunos4.1.cf cs-ultrix4.cf \
|
||||
s2k-osf1.cf s2k-ultrix4.cf \
|
||||
chez.cs.cf huginn.cs.cf mail.cs.cf mail.eecs.cf mailspool.cs.cf \
|
||||
|
@ -11,9 +11,9 @@ divert(-1)
|
||||
|
||||
divert(0)
|
||||
ifdef(`_DNSBL_R_',`dnl',`dnl
|
||||
VERSIONID(`$Id: dnsbl.m4,v 8.18 1999/08/03 04:30:56 gshapiro Exp $')')
|
||||
VERSIONID(`$Id: dnsbl.m4,v 8.18.16.1 2000/11/22 01:13:21 ca Exp $')')
|
||||
divert(-1)
|
||||
define(`_DNSBL_SRV_', `ifelse(len(X`'_ARG_),`1',`rbl.maps.vix.com',_ARG_)')dnl
|
||||
define(`_DNSBL_SRV_', `ifelse(len(X`'_ARG_),`1',`blackholes.mail-abuse.org',_ARG_)')dnl
|
||||
define(`_DNSBL_MSG_', `ifelse(len(X`'_ARG2_),`1',`"550 Mail from " $`'&{client_addr} " refused by blackhole site '_DNSBL_SRV_`"',`_ARG2_')')dnl
|
||||
divert(8)
|
||||
# DNS based IP address spam list _DNSBL_SRV_
|
||||
|
@ -13,7 +13,7 @@ divert(-1)
|
||||
#
|
||||
divert(0)
|
||||
|
||||
VERSIONID(`$Id: proto.m4,v 8.446.2.5.2.29 2000/09/15 04:45:14 gshapiro Exp $')
|
||||
VERSIONID(`$Id: proto.m4,v 8.446.2.5.2.38 2000/12/28 03:37:28 ca Exp $')
|
||||
|
||||
MAILER(local)dnl
|
||||
|
||||
@ -409,7 +409,7 @@ _OPTION(RefuseLA, `confREFUSE_LA', `12')
|
||||
_OPTION(MaxDaemonChildren, `confMAX_DAEMON_CHILDREN', `12')
|
||||
|
||||
# maximum number of new connections per second
|
||||
_OPTION(ConnectionRateThrottle, `confCONNECTION_RATE_THROTTLE', `3')
|
||||
_OPTION(ConnectionRateThrottle, `confCONNECTION_RATE_THROTTLE', `0')
|
||||
|
||||
# work recipient factor
|
||||
_OPTION(RecipientFactor, `confWORK_RECIPIENT_FACTOR', `30000')
|
||||
@ -635,6 +635,7 @@ R$* : $* [ $* ] $: $1 : $2 [ $3 ] <@> remark if leading colon
|
||||
R$* : $* <@> $: $2 strip colon if marked
|
||||
R$* <@> $: $1 unmark
|
||||
R$* ; $1 strip trailing semi
|
||||
R$* < $+ :; > $* $@ $2 :; <@> catch <list:;>
|
||||
R$* < $* ; > $1 < $2 > bogus bracketed semi
|
||||
|
||||
# null input now results from list:; syntax
|
||||
@ -779,6 +780,9 @@ dnl then $- does not work.
|
||||
R$* $| $* < @ $* > $* $: $2 < @ $[ $3 $] > $4', `dnl')', `dnl
|
||||
dnl _NO_CANONIFY_ is not set: canonify unless:
|
||||
dnl {daemon_flags} contains CC (do not canonify)
|
||||
dnl but add a trailing dot to qualified hostnames so other rules will work
|
||||
dnl should we do this for every hostname: even unqualified?
|
||||
R$* CC $* $| $* < @ $+.$+ > $* $: $3 < @ $4.$5 . > $6
|
||||
R$* CC $* $| $* $: $3
|
||||
# pass to name server to make hostname canonical
|
||||
R$* $| $* < @ $* > $* $: $2 < @ $[ $3 $] > $4')
|
||||
@ -806,6 +810,7 @@ R$* < @ $* . . > $* $1 < @ $2 . > $3
|
||||
##################################################
|
||||
Sfinal=4
|
||||
|
||||
R$+ :; <@> $@ $1 : handle <list:;>
|
||||
R$* <@> $@ handle <> and list:;
|
||||
|
||||
# strip trailing dot off possibly canonical name
|
||||
@ -1286,6 +1291,7 @@ R<?> <$+.$+> <$+> <$*> <+ $*> $: < $(access .$2 $: ? $) > <$1.$2> <$3> <$4> <+ $
|
||||
dnl lookup IP address (no check is done whether it is an IP number!)
|
||||
R<?> <[$+.$-]> <$+> <$*> <$*> $@ $>LookUpDomain <[$1]> <$3> <$4> <$5>
|
||||
dnl lookup IPv6 address
|
||||
R<?> <[$+::$-]> <$+> <$*> <$*> $: $>LookUpDomain <[$1]> <$3> <$4> <$5>
|
||||
R<?> <[$+:$-]> <$+> <$*> <$*> $: $>LookUpDomain <[$1]> <$3> <$4> <$5>
|
||||
dnl not found, but subdomain: try again
|
||||
R<?> <$+.$+> <$+> <$*> <$*> $@ $>LookUpDomain <$2> <$3> <$4> <$5>
|
||||
@ -1315,6 +1321,7 @@ R<$+> <$+> <$*> <$- $+> $: < $(access $5`'_TAG_DELIM_`'$1 $: ? $) > <$1> <$2> <
|
||||
dnl lookup without tag
|
||||
R<?> <$+> <$+> <$*> <+ $+> $: < $(access $1 $: ? $) > <$1> <$2> <$3> <+ $4>
|
||||
dnl no match; IPv6: remove last part
|
||||
R<?> <$+::$-> <$+> <$*> <$*> $@ $>LookUpAddress <$1> <$3> <$4> <$5>
|
||||
R<?> <$+:$-> <$+> <$*> <$*> $@ $>LookUpAddress <$1> <$3> <$4> <$5>
|
||||
dnl no match; IPv4: remove last part
|
||||
R<?> <$+.$-> <$+> <$*> <$*> $@ $>LookUpAddress <$1> <$3> <$4> <$5>
|
||||
@ -1682,9 +1689,10 @@ dnl use $# to override further tests (delay_checks): see check_rcpt below
|
||||
R$* $| $={TrustAuthMech} $# RELAYAUTH
|
||||
dnl undo addition of ${auth_type}
|
||||
R$* $| $* $: $1
|
||||
dnl workspace: localpart<@domain>
|
||||
dnl workspace: localpart<@domain> | localpart
|
||||
ifelse(defn(`_NO_UUCP_'), `r',
|
||||
`R$* ! $* < @ $* > $: <REMOTE> $2 < @ BANG_PATH >', `dnl')
|
||||
`R$* ! $* < @ $* > $: <REMOTE> $2 < @ BANG_PATH >
|
||||
R$* ! $* $: <REMOTE> $2 < @ BANG_PATH >', `dnl')
|
||||
# anything terminating locally is ok
|
||||
ifdef(`_RELAY_ENTIRE_DOMAIN_', `dnl
|
||||
R$+ < @ $* $=m > $@ RELAYTO', `dnl')
|
||||
@ -1957,7 +1965,7 @@ R$* $: $>LookUpDomain <$&{server_name}> <?> <> <! TLS_TRY_TAG>
|
||||
R<?>$* $: $>LookUpAddress <$&{server_addr}> <?> <> <! TLS_TRY_TAG>
|
||||
R<?>$* $: <$(access TLS_TRY_TAG: $: ? $)>
|
||||
R<?>$* $@ OK
|
||||
R<NO> <> $#error $@ 5.7.1 $: "550 do not try TLS with " $&{server_name} " ["$&{server_addr}"]"
|
||||
R<NO>$* $#error $@ 5.7.1 $: "550 do not try TLS with " $&{server_name} " ["$&{server_addr}"]"
|
||||
')dnl
|
||||
|
||||
# is connection with client "good" enough? (done in server)
|
||||
|
@ -11,8 +11,8 @@ divert(-1)
|
||||
# the sendmail distribution.
|
||||
#
|
||||
#
|
||||
VERSIONID(`$Id: version.m4,v 8.39.4.14 2000/09/19 07:28:06 gshapiro Exp $')
|
||||
VERSIONID(`$Id: version.m4,v 8.39.4.21 2000/12/29 18:22:15 gshapiro Exp $')
|
||||
#
|
||||
divert(0)
|
||||
# Configuration version number
|
||||
DZ8.11.1`'ifdef(`confCF_VERSION', `/confCF_VERSION')
|
||||
DZ8.11.2`'ifdef(`confCF_VERSION', `/confCF_VERSION')
|
||||
|
18
contrib/sendmail/cf/ostype/aix5.m4
Normal file
18
contrib/sendmail/cf/ostype/aix5.m4
Normal file
@ -0,0 +1,18 @@
|
||||
divert(-1)
|
||||
#
|
||||
# Copyright (c) 2000 Sendmail, Inc. and its suppliers.
|
||||
# All rights reserved.
|
||||
#
|
||||
# By using this file, you agree to the terms and conditions set
|
||||
# forth in the LICENSE file which can be found at the top level of
|
||||
# the sendmail distribution.
|
||||
#
|
||||
#
|
||||
|
||||
divert(0)
|
||||
VERSIONID(`$Id: aix5.m4,v 1.1.2.1 2000/12/09 03:32:08 ca Exp $')
|
||||
ifdef(`LOCAL_MAILER_PATH',, `define(`LOCAL_MAILER_PATH', /bin/bellmail)')dnl
|
||||
ifdef(`LOCAL_MAILER_ARGS',, `define(`LOCAL_MAILER_ARGS', mail -F $g $u)')dnl
|
||||
_DEFIFNOT(`LOCAL_MAILER_FLAGS', `mn9')dnl
|
||||
define(`confEBINDIR', `/usr/lib')dnl
|
||||
define(`confTIME_ZONE', `USE_TZ')dnl
|
167
contrib/sendmail/contrib/buildvirtuser
Executable file
167
contrib/sendmail/contrib/buildvirtuser
Executable file
@ -0,0 +1,167 @@
|
||||
#!/usr/bin/perl -w
|
||||
|
||||
# Copyright (c) 1999-2000 Gregory Neil Shapiro. All Rights Reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions
|
||||
# are met:
|
||||
#
|
||||
# 1. Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# 2. Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# 3. Neither the name of the author nor the names of its contributors
|
||||
# may be used to endorse or promote products derived from this software
|
||||
# without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
# SUCH DAMAGE.
|
||||
|
||||
# $Id: buildvirtuser,v 1.1.2.1 2000/10/26 22:51:03 gshapiro Exp $
|
||||
|
||||
=head1 NAME
|
||||
|
||||
buildvirtuser - Build virtusertable support from a directory of files
|
||||
|
||||
=head1 SYNOPSIS
|
||||
|
||||
buildvirtuser
|
||||
|
||||
=head1 DESCRIPTION
|
||||
|
||||
buildvirtuser will build /etc/mail/virtusertable.db and /etc/mail/virthosts
|
||||
based on the contents of the directory /etc/mail/virtusers/. That
|
||||
directory should contain one file per virtual domain with the filename
|
||||
matching the virtual domain name and the contents containing a list of
|
||||
usernames on the left and the actual address for that username on the
|
||||
right. An empty left column translates to the default for that domain.
|
||||
Blank lines and lines beginning with '#' are ignored.
|
||||
|
||||
=head1 CONFIGURATION
|
||||
|
||||
In order to function properly, sendmail must be configured to use these
|
||||
files with:
|
||||
|
||||
FEATURE(`virtusertable')dnl
|
||||
VIRTUSER_DOMAIN_FILE(`/etc/mail/virthosts')dnl
|
||||
|
||||
If a new domain is added (i.e., by adding a new file to
|
||||
/etc/mail/virtusers/), the sendmail daemon must be restarted for the change
|
||||
to take affect.
|
||||
|
||||
=head1 EXAMPLES
|
||||
|
||||
Here are some example files from the /etc/mail/virtusers/ directory:
|
||||
|
||||
=head2 /etc/mail/virtusers/bsdunix.org:
|
||||
|
||||
# Services
|
||||
MAILER-DAEMON gshapiro+MAILER-DAEMON.bsdunix.org@gshapiro.net
|
||||
postmaster gshapiro+postmaster.bsdunix.org@gshapiro.net
|
||||
webmaster gshapiro+webmaster.bsdunix.org@gshapiro.net
|
||||
|
||||
# Defaults
|
||||
error:nouser No such user
|
||||
|
||||
# Users
|
||||
gshapiro gshapiro+bsdunix.org@gshapiro.net
|
||||
bob robert@smtp.org
|
||||
|
||||
=head2 /etc/mail/virtusers/smtp.org:
|
||||
|
||||
# Defaults
|
||||
gshapiro+smtp.org@gshapiro.net
|
||||
|
||||
# Users
|
||||
john john@wookie.org
|
||||
nancy n@milter.com
|
||||
|
||||
=head1 AUTHOR
|
||||
|
||||
Gregory Neil Shapiro E<lt>F<gshapiro@gshapiro.net>E<gt>
|
||||
|
||||
=cut
|
||||
|
||||
my $makemap = "/usr/sbin/makemap";
|
||||
my $dbtype = "hash";
|
||||
my $maildir = "/etc/mail";
|
||||
my $virthosts = "$maildir/virthosts";
|
||||
my $newvirthosts = "$maildir/virthosts.new";
|
||||
my $virts = "$maildir/virtusers";
|
||||
my $newvirt = "$maildir/virtusertable.new.db";
|
||||
my $virt = "$maildir/virtusertable.db";
|
||||
my %virt = ();
|
||||
my $newest = 0;
|
||||
|
||||
opendir(VIRTS, $virts) || die "Could not open directory $virts: $!\n";
|
||||
my @virts = grep { -f "$virts/$_" } readdir(VIRTS);
|
||||
closedir(VIRTS) || die "Could not close directory $virts: $!\n";
|
||||
|
||||
foreach $domain (@virts)
|
||||
{
|
||||
open(DOMAIN, "$virts/$domain") || die "Could not open file $virts/$domain: $!\n";
|
||||
my $line = 0;
|
||||
my $mtime = (stat(DOMAIN))[9] || 0;
|
||||
if ($mtime > $newest)
|
||||
{
|
||||
$newest = $mtime;
|
||||
}
|
||||
LINE: while (<DOMAIN>)
|
||||
{
|
||||
chomp;
|
||||
$line++;
|
||||
next LINE if /^#/;
|
||||
next LINE if /^$/;
|
||||
if (m/^([^\t ]*)[\t ]+(.*)$/)
|
||||
{
|
||||
if (defined($1))
|
||||
{
|
||||
$key = "$1\@$domain";
|
||||
}
|
||||
else
|
||||
{
|
||||
$key = "\@$domain";
|
||||
}
|
||||
$value = $2;
|
||||
}
|
||||
else
|
||||
{
|
||||
die "Bogus line $line in $virts/$domain\n";
|
||||
}
|
||||
$virt{$key} = $value;
|
||||
}
|
||||
close(DOMAIN) || die "Could not close $virts/$domain: $!\n";
|
||||
}
|
||||
|
||||
my $virtmtime = (stat($virt))[9] || 0;
|
||||
if ($virtmtime < $newest)
|
||||
{
|
||||
print STDOUT "Rebuilding $virt\n";
|
||||
# logger -s -t ${prog} -p mail.info "Rebuilding ${basedir}/virtusertable"
|
||||
open(MAKEMAP, "|$makemap $dbtype $newvirt") || die "Could not start makemap: $!\n";
|
||||
foreach $key (keys %virt)
|
||||
{
|
||||
print MAKEMAP "$key\t\t$virt{$key}\n";
|
||||
}
|
||||
close(MAKEMAP) || die "Could not close makemap ($?): $!\n";
|
||||
rename($newvirt, $virt) || die "Could not rename $newvirt to $virt: $!\n";
|
||||
|
||||
open(VIRTHOST, ">$newvirthosts") || die "Could not open file $newvirthosts: $!\n";
|
||||
foreach $domain (sort @virts)
|
||||
{
|
||||
print VIRTHOST "$domain\n";
|
||||
}
|
||||
close(VIRTHOST) || die "Could not close $newvirthosts: $!\n";
|
||||
rename($newvirthosts, $virthosts) || die "Could not rename $newvirthosts to $virthosts: $!\n";
|
||||
}
|
||||
exit 0;
|
@ -69,11 +69,19 @@ LOCAL_RULESETS
|
||||
SDomainMapLookup
|
||||
R $=L <@ $=w .> $@ $1 <@ $2 .> weed out local users, in case
|
||||
# Cw contains a mapped domain
|
||||
R $+ <@ $+> $: $1 <@ $2 > < $2 > find domain
|
||||
ifdef(`DOMAINMAP_NO_REGEX',`dnl
|
||||
R $+ <@ $+> $: $1 <@ $2> <$2> find domain
|
||||
R $+ <$+> <$+ . $+> $1 <$2> < $(dequote $3 "_" $4 $) >
|
||||
# change "." to "_"
|
||||
R $+ <$+> <$+ .> $: $1 <$2> < $(dequote "domain_" $3 $) >
|
||||
# prepend "domain_"
|
||||
dnl',`dnl
|
||||
R $+ <@ $+> $: $1 <@ $2> <$2 :NOTDONE:> find domain
|
||||
R $+ <$+> <$+ . :NOTDONE:> $1 <$2> < $(domainmap_regex $3 $: $3 $) >
|
||||
# change "." and "-" to "_"
|
||||
R $+ <$+> <$+> $: $1 <$2> < $(dequote "domain_" $3 $) >
|
||||
# prepend "domain_"
|
||||
dnl')
|
||||
R $+ <$+> <$+> $: $1 <$2> <$3> $1 find user name
|
||||
R $+ <$+> <$+> $+ + $* $: $1 <$2> <$3> $4 handle user+detail syntax
|
||||
R $+ <$+> <$+> $+ $: $1 <$2> $( $3 $4 $: <ERROR> $)
|
||||
@ -84,8 +92,12 @@ R $+ <@ $+> $* <TEMP> $* $#dsmtp $@ localhost $: $1 @ $2
|
||||
R $+ + $* <$+> $+ @ $+ $: $1 + $2 <$3> $4 + $2 @ $5
|
||||
# reset original user+detail
|
||||
R $+ <$+> $+ $@ $>Recurse $3 recanonify
|
||||
define(`_DOMAIN_MAP_',`1')')
|
||||
|
||||
ifdef(`DOMAINMAP_NO_REGEX',`',`dnl
|
||||
LOCAL_CONFIG
|
||||
K domainmap_regex regex -a.:NOTDONE: -s1,2 -d_ (.*)[-\.]([^-\.]*)$
|
||||
')define(`_DOMAIN_MAP_',`1')')
|
||||
|
||||
LOCAL_CONFIG
|
||||
C{MappedDomain} _ARG_
|
||||
K `domain_'translit(_ARG_, `.', `_') _ARG2_ -T<TEMP>
|
||||
K `domain_'translit(_ARG_, `.-', `__') _ARG2_ -T<TEMP>
|
||||
|
@ -6,11 +6,11 @@
|
||||
.\" the sendmail distribution.
|
||||
.\"
|
||||
.\"
|
||||
.\" $Id: qtool.8,v 8.9 1999/08/26 00:04:10 cying Exp $
|
||||
.\" $Id: qtool.8,v 8.9.16.2 2000/12/15 19:50:41 gshapiro Exp $
|
||||
.\"
|
||||
.TH QTOOL 8 "July 12, 1999"
|
||||
.TH QTOOL 8 "$Date: 2000/12/15 19:50:41 $"
|
||||
.SH NAME
|
||||
.B qtool
|
||||
qtool
|
||||
\- manipulate sendmail queues
|
||||
.SH SYNOPSIS
|
||||
.B qtool.pl
|
||||
|
@ -3,7 +3,7 @@
|
||||
## Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
|
||||
## All rights reserved.
|
||||
##
|
||||
## $Id: qtool.pl,v 8.15.16.2 2000/09/17 17:04:22 gshapiro Exp $
|
||||
## $Id: qtool.pl,v 8.15.16.4 2000/11/30 07:14:01 gshapiro Exp $
|
||||
##
|
||||
use strict;
|
||||
use File::Basename;
|
||||
@ -133,13 +133,12 @@ while (@ARGV)
|
||||
if ($result)
|
||||
{
|
||||
print("$result.\n");
|
||||
exit;
|
||||
}
|
||||
}
|
||||
|
||||
if (keys(%sources) == 0)
|
||||
{
|
||||
print("You must at least specify at least one source.\n");
|
||||
usage();
|
||||
exit;
|
||||
}
|
||||
|
||||
@ -164,7 +163,7 @@ sub usage
|
||||
print(" -b Bounce the messages specified by source.\n");
|
||||
print(" -d Delete the messages specified by source.\n");
|
||||
print(" -e [perl expression] Move only messages for which perl expression returns true.\n");
|
||||
print(" -s [seconds] Move only messages older than seconds.\n");
|
||||
print(" -s [seconds] Move only messages whose qf file is older than seconds.\n");
|
||||
}
|
||||
|
||||
##
|
||||
|
@ -9,7 +9,7 @@
|
||||
.\" the sendmail distribution.
|
||||
.\"
|
||||
.\"
|
||||
.\" $Id: op.me,v 8.317.4.39 2000/09/22 15:01:37 ca Exp $
|
||||
.\" $Id: op.me,v 8.317.4.47 2000/12/17 00:54:56 gshapiro Exp $
|
||||
.\"
|
||||
.\" eqn op.me | pic | troff -me
|
||||
.eh 'SMM:08-%''Sendmail Installation and Operation Guide'
|
||||
@ -32,7 +32,6 @@
|
||||
\\$1 \\$2. \\$3
|
||||
.)x
|
||||
..
|
||||
.sc
|
||||
.+c
|
||||
.(l C
|
||||
.sz 16
|
||||
@ -54,7 +53,7 @@ eric@Sendmail.COM
|
||||
.de Ve
|
||||
Version \\$2
|
||||
..
|
||||
.Ve $Revision: 8.317.4.39 $
|
||||
.Ve $Revision: 8.317.4.47 $
|
||||
.rm Ve
|
||||
.sp
|
||||
For Sendmail Version 8.11
|
||||
@ -929,7 +928,7 @@ The ``controlling user'', that is, the name of the user
|
||||
whose credentials we use for delivery.
|
||||
.ip delay
|
||||
The total delay between the time this message was received
|
||||
and the time it was delivered.
|
||||
and the current delivery attempt.
|
||||
.ip xdelay
|
||||
The amount of time needed in this delivery attempt
|
||||
(normally indicative of the speed of the connection).
|
||||
@ -3486,8 +3485,8 @@ addr-->| 3 |-->| D |-- --->| 4 |-->msg
|
||||
.)c
|
||||
|
||||
.\}
|
||||
.el .ie !"\*(.T"" \
|
||||
\{\
|
||||
.el \{\
|
||||
.ie !"\*(.T"" \{\
|
||||
.PS
|
||||
boxwid = 0.3i
|
||||
boxht = 0.3i
|
||||
@ -3518,6 +3517,7 @@ Box0: arrow; box "0"
|
||||
.PE
|
||||
.\}
|
||||
.el .sp 2i
|
||||
.\}
|
||||
.ce
|
||||
Figure 1 \*- Rewriting set semantics
|
||||
.(c
|
||||
@ -4098,8 +4098,9 @@ Defined in the SMTP server only.
|
||||
The host name of the SMTP client.
|
||||
This may be the client's bracketed IP address
|
||||
in the form [ nnn.nnn.nnn.nnn ] if the client's
|
||||
IP address is not resolvable, or if the resolved
|
||||
name doesn't match ${client_name}.
|
||||
IP address is not resolvable, or if it is resolvable
|
||||
but the IP address of the resolved hostname
|
||||
doesn't match the original IP address.
|
||||
Defined in the SMTP server only.
|
||||
.ip ${client_port}
|
||||
The port number of the SMTP client.
|
||||
@ -5291,6 +5292,9 @@ comments (in parentheses) are deleted before processing,
|
||||
unless the second form
|
||||
.b $>+
|
||||
is used.
|
||||
Note: only one ruleset can be associated with a header;
|
||||
.i sendmail
|
||||
will silently ignore multiple entries.
|
||||
.pp
|
||||
For example, the configuration lines:
|
||||
.(b
|
||||
@ -5486,7 +5490,7 @@ Checkpoints the queue every
|
||||
addresses sent.
|
||||
If your system crashes during delivery to a large list,
|
||||
this prevents retransmission to any but the last
|
||||
.I N
|
||||
.i N
|
||||
recipients.
|
||||
.ip ClassFactor=\fIfact\fP
|
||||
[z]
|
||||
@ -6223,7 +6227,7 @@ If there is insufficient space
|
||||
gives a 452 response
|
||||
to the MAIL command.
|
||||
This invites the sender to try again later.
|
||||
.ip MinQueueAge=\fPage\fP
|
||||
.ip MinQueueAge=\fIage\fP
|
||||
[no short name]
|
||||
Don't process any queued jobs
|
||||
that have been in the queue less than the indicated time interval.
|
||||
@ -6342,6 +6346,7 @@ noreceipts Don't return success DSNs\**
|
||||
nobodyreturn Don't return the body of a message with DSNs
|
||||
goaway Disallow essentially all SMTP status queries
|
||||
authwarnings Put X-Authentication-Warning: headers in messages
|
||||
and log warnings
|
||||
.)b
|
||||
.(f
|
||||
\**N.B.:
|
||||
@ -6537,7 +6542,7 @@ and all files to be written must be writable by
|
||||
.i user
|
||||
Also, all file and program deliveries will be marked unsafe
|
||||
unless the option
|
||||
.b DontBlameSendmail=NonRootAddrSafe
|
||||
.b DontBlameSendmail=NonRootSafeAddr
|
||||
is set,
|
||||
in which case the delivery will be done as
|
||||
.i user .
|
||||
@ -7259,7 +7264,7 @@ Contributed and supported by
|
||||
Mark Roth, roth@uiuc.edu.
|
||||
For more information,
|
||||
consult the web site
|
||||
.q http://www-wsg.cso.uiuc.edu/sendmail/sendmail-phmap/ .
|
||||
.q http://www-dev.cso.uiuc.edu/sendmail/ .
|
||||
.ip nsd
|
||||
nsd map for IRIX 6.5 and later.
|
||||
Contributed and supported by Bob Mende of SGI,
|
||||
@ -7642,6 +7647,10 @@ Set the alias dereference option to one of never, always, search, or find.
|
||||
Set search scope to one of base, one (one level), or sub (subtree).
|
||||
.ip "\-h\fIhost\fP"
|
||||
LDAP server hostname.
|
||||
Some LDAP libraries allow you to specify multiple, space-separated hosts for
|
||||
redundancy.
|
||||
In addition, each of the hosts listed can be followed by a colon and a port
|
||||
number to override the default LDAP port.
|
||||
.ip "\-b\fIbase\fP"
|
||||
LDAP search base.
|
||||
.ip "\-p\fIport\fP"
|
||||
@ -8926,7 +8935,7 @@ to the specified
|
||||
.i value
|
||||
(for long form option names).
|
||||
These options are described in Section 5.6.
|
||||
.ip \-M\fIx\|value
|
||||
.ip \-M\fIx\|value\fP
|
||||
Set macro
|
||||
.i x
|
||||
to the specified
|
||||
@ -9381,7 +9390,7 @@ replace it with a blank sheet for double-sided output.
|
||||
.\".sz 10
|
||||
.\"Eric Allman
|
||||
.\".sp
|
||||
.\"Version $Revision: 8.317.4.39 $
|
||||
.\"Version $Revision: 8.317.4.47 $
|
||||
.\".ce 0
|
||||
.bp 3
|
||||
.ce
|
||||
|
@ -6,7 +6,7 @@
|
||||
** forth in the LICENSE file which can be found at the top level of
|
||||
** the sendmail distribution.
|
||||
**
|
||||
** $Id: smdb.h,v 8.29.2.1.2.1 2000/08/24 17:08:00 gshapiro Exp $
|
||||
** $Id: smdb.h,v 8.29.2.1.2.2 2000/10/05 22:23:55 gshapiro Exp $
|
||||
*/
|
||||
|
||||
#ifndef _SMDB_H_
|
||||
@ -53,7 +53,7 @@ ERROR NDBM or NEWDB must be defined.
|
||||
|
||||
typedef struct database_struct SMDB_DATABASE;
|
||||
typedef struct cursor_struct SMDB_CURSOR;
|
||||
typedef union database_entity_union SMDB_DBENT;
|
||||
typedef struct entry_struct SMDB_DBENT;
|
||||
|
||||
|
||||
/*
|
||||
@ -312,22 +312,12 @@ struct database_user_struct
|
||||
|
||||
typedef struct database_user_struct SMDB_USER_INFO;
|
||||
|
||||
union database_entity_union
|
||||
struct entry_struct
|
||||
{
|
||||
# ifdef NDBM
|
||||
datum dbm;
|
||||
# endif /* NDBM */
|
||||
# ifdef NEWDB
|
||||
DBT db;
|
||||
# endif /* NEWDB */
|
||||
struct
|
||||
{
|
||||
char *data;
|
||||
size_t size;
|
||||
} data;
|
||||
void *data;
|
||||
size_t size;
|
||||
};
|
||||
|
||||
|
||||
typedef char *SMDB_DBTYPE;
|
||||
typedef u_int SMDB_FLAG;
|
||||
|
||||
|
@ -9,7 +9,7 @@
|
||||
* the sendmail distribution.
|
||||
*
|
||||
*
|
||||
* $Id: pathnames.h,v 8.16.8.7 2000/08/25 18:36:57 geir Exp $
|
||||
* $Id: pathnames.h,v 8.16.8.8 2000/09/28 21:26:39 gshapiro Exp $
|
||||
*/
|
||||
|
||||
|
||||
|
@ -10,7 +10,7 @@
|
||||
* the sendmail distribution.
|
||||
*
|
||||
*
|
||||
* $Id: sendmail.h,v 8.34.4.5 2000/09/14 23:32:26 gshapiro Exp $
|
||||
* $Id: sendmail.h,v 8.34.4.7 2000/10/09 16:15:26 gshapiro Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -53,6 +53,9 @@
|
||||
|
||||
typedef unsigned int BITMAP256[BITMAPBYTES / sizeof (int)];
|
||||
|
||||
/* properly case and truncate bit */
|
||||
#define bitidx(bit) ((unsigned int) (bit) & 0xff)
|
||||
|
||||
/* test bit number N */
|
||||
#define bitnset(bit, map) ((map)[_BITWORD(bit)] & _BITBIT(bit))
|
||||
|
||||
|
@ -7,9 +7,18 @@ SMSRCDIR= ifdef(`confSMSRCDIR', `confSMSRCDIR', `${SRCDIR}/sendmail')
|
||||
PREPENDDEF(`confINCDIRS', `-I${SMSRCDIR} ')
|
||||
|
||||
bldPRODUCT_START(`library', `libmilter')
|
||||
define(`bldINSTALLABLE', `true')
|
||||
define(`bldSOURCES', `main.c engine.c listener.c handler.c comm.c smfi.c signal.c sm_gethost.c ')
|
||||
bldPUSH_SMLIB(`smutil')
|
||||
bldPUSH_INSTALL_TARGET(`install-mfapi')
|
||||
bldPRODUCT_END
|
||||
APPENDDEF(`confENVDEF', `-DNOT_SENDMAIL')
|
||||
|
||||
divert(bldTARGETS_SECTION)
|
||||
# Install the API header file
|
||||
MFAPI= ${SRCDIR}/include/libmilter/mfapi.h
|
||||
install-mfapi: ${MFAPI}
|
||||
${INSTALL} ${MFAPI} ${DESTDIR}${INCLUDEDIR}
|
||||
divert(0)
|
||||
|
||||
bldFINISH
|
||||
|
@ -178,6 +178,10 @@ See the sendmail(8) manual page for more information.
|
||||
| SOURCE FOR SAMPLE FILTER |
|
||||
+--------------------------+
|
||||
|
||||
Note that the filter below may not be thread safe on some operating
|
||||
systems. You should check your system man pages for the functions used
|
||||
below to verify the functions are thread safe.
|
||||
|
||||
/* A trivial filter that logs all email to a file. */
|
||||
|
||||
#include <sys/types.h>
|
||||
@ -412,4 +416,4 @@ main(argc, argv)
|
||||
|
||||
/* eof */
|
||||
|
||||
$Revision: 8.9.2.1.2.12 $, Last updated $Date: 2000/09/19 19:40:13 $
|
||||
$Revision: 8.9.2.1.2.13 $, Last updated $Date: 2000/12/29 18:55:23 $
|
||||
|
@ -9,7 +9,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: comm.c,v 8.30.4.5 2000/08/14 09:04:47 gshapiro Exp $";
|
||||
static char id[] = "@(#)$Id: comm.c,v 8.30.4.6 2000/10/05 22:44:01 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#if _FFR_MILTER
|
||||
@ -55,6 +55,7 @@ mi_rd_cmd(sd, timeout, cmd, rlen, name)
|
||||
|
||||
*cmd = '\0';
|
||||
*rlen = 0;
|
||||
|
||||
if (sd >= FD_SETSIZE)
|
||||
{
|
||||
smi_log(SMI_LOG_ERR, "%s: fd %d is larger than FD_SETSIZE %d",
|
||||
@ -62,6 +63,7 @@ mi_rd_cmd(sd, timeout, cmd, rlen, name)
|
||||
*cmd = SMFIC_SELECT;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
FD_Z;
|
||||
i = 0;
|
||||
while ((ret = select(sd + 1, &readset, NULL, &excset, timeout)) >= 1)
|
||||
|
@ -9,7 +9,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: engine.c,v 8.67.4.14 2000/08/14 08:27:30 gshapiro Exp $";
|
||||
static char id[] = "@(#)$Id: engine.c,v 8.67.4.15 2000/12/29 19:43:10 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#if _FFR_MILTER
|
||||
@ -381,7 +381,7 @@ sendreply(r, sd, timeout_ptr, ctx)
|
||||
{
|
||||
int ret = MI_SUCCESS;
|
||||
|
||||
switch(r)
|
||||
switch (r)
|
||||
{
|
||||
case SMFIS_CONTINUE:
|
||||
ret = mi_wr_cmd(sd, timeout_ptr, SMFIR_CONTINUE, NULL, 0);
|
||||
@ -807,7 +807,7 @@ st_macros(g)
|
||||
return _SMFIS_FAIL;
|
||||
if ((argv = dec_argv(g->a_buf + 1, g->a_len - 1)) == NULL)
|
||||
return _SMFIS_FAIL;
|
||||
switch(g->a_buf[0])
|
||||
switch (g->a_buf[0])
|
||||
{
|
||||
case SMFIC_CONNECT:
|
||||
i = CI_CONN;
|
||||
|
@ -9,7 +9,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: handler.c,v 8.19.4.2 2000/07/14 06:16:57 msk Exp $";
|
||||
static char id[] = "@(#)$Id: handler.c,v 8.19.4.3 2000/12/29 19:45:39 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#if _FFR_MILTER
|
||||
@ -44,9 +44,15 @@ mi_handle_session(ctx)
|
||||
return MI_FAILURE;
|
||||
ret = mi_engine(ctx);
|
||||
if (ValidSocket(ctx->ctx_sd))
|
||||
{
|
||||
(void) close(ctx->ctx_sd);
|
||||
ctx->ctx_sd = INVALID_SOCKET;
|
||||
}
|
||||
if (ctx->ctx_reply != NULL)
|
||||
{
|
||||
free(ctx->ctx_reply);
|
||||
ctx->ctx_reply = NULL;
|
||||
}
|
||||
if (ctx->ctx_privdata != NULL)
|
||||
{
|
||||
smi_log(SMI_LOG_WARN,
|
||||
|
@ -17,7 +17,7 @@
|
||||
# define EXTERN
|
||||
# define INIT(x) = x
|
||||
# ifndef lint
|
||||
static char MilterlId[] = "@(#)$Id: libmilter.h,v 8.3.6.9 2000/09/01 00:49:04 ca Exp $";
|
||||
static char MilterlId[] = "@(#)$Id: libmilter.h,v 8.3.6.10 2000/11/20 21:15:36 ca Exp $";
|
||||
# endif /* ! lint */
|
||||
#else /* _DEFINE */
|
||||
# define EXTERN extern
|
||||
@ -44,6 +44,13 @@ static char MilterlId[] = "@(#)$Id: libmilter.h,v 8.3.6.9 2000/09/01 00:49:04 ca
|
||||
# define thread_create(ptid,wr,arg) pthread_create(ptid, NULL, wr, arg)
|
||||
# define sthread_get_id() pthread_self()
|
||||
|
||||
typedef pthread_mutex_t smutex_t;
|
||||
# define smutex_init(mp) (pthread_mutex_init(mp, NULL) == 0)
|
||||
# define smutex_destroy(mp) (pthread_mutex_destroy(mp) == 0)
|
||||
# define smutex_lock(mp) (pthread_mutex_lock(mp) == 0)
|
||||
# define smutex_unlock(mp) (pthread_mutex_unlock(mp) == 0)
|
||||
# define smutex_trylock(mp) (pthread_mutex_trylock(mp) == 0)
|
||||
|
||||
#include <sys/time.h>
|
||||
|
||||
/* version info */
|
||||
|
@ -9,7 +9,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: listener.c,v 8.38.2.1.2.11 2000/09/01 00:49:04 ca Exp $";
|
||||
static char id[] = "@(#)$Id: listener.c,v 8.38.2.1.2.18 2000/12/29 19:44:28 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#if _FFR_MILTER
|
||||
@ -47,7 +47,6 @@ mi_milteropen(conn, backlog, socksize, name)
|
||||
char *p;
|
||||
char *colon;
|
||||
char *at;
|
||||
struct hostent *hp = NULL;
|
||||
SOCKADDR addr;
|
||||
|
||||
if (conn == NULL || conn[0] == '\0')
|
||||
@ -299,6 +298,8 @@ mi_milteropen(conn, backlog, socksize, name)
|
||||
}
|
||||
else
|
||||
{
|
||||
struct hostent *hp = NULL;
|
||||
|
||||
hp = mi_gethostbyname(at, addr.sa.sa_family);
|
||||
if (hp == NULL)
|
||||
{
|
||||
@ -334,6 +335,9 @@ mi_milteropen(conn, backlog, socksize, name)
|
||||
name, at, hp->h_addrtype);
|
||||
return INVALID_SOCKET;
|
||||
}
|
||||
# if _FFR_FREEHOSTENT && NETINET6
|
||||
freehostent(hp);
|
||||
# endif /* _FFR_FREEHOSTENT && NETINET6 */
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -411,6 +415,8 @@ mi_thread_handle_wrapper(arg)
|
||||
|
||||
static socket_t listenfd = INVALID_SOCKET;
|
||||
|
||||
static smutex_t L_Mutex;
|
||||
|
||||
/*
|
||||
** MI_CLOSENER -- close listen socket
|
||||
**
|
||||
@ -424,11 +430,13 @@ static socket_t listenfd = INVALID_SOCKET;
|
||||
void
|
||||
mi_closener()
|
||||
{
|
||||
(void) smutex_lock(&L_Mutex);
|
||||
if (ValidSocket(listenfd))
|
||||
{
|
||||
(void) close(listenfd);
|
||||
listenfd = INVALID_SOCKET;
|
||||
}
|
||||
(void) smutex_unlock(&L_Mutex);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -475,37 +483,56 @@ mi_listener(conn, dbg, smfi, timeout, backlog)
|
||||
smi_log(SMI_LOG_DEBUG,
|
||||
"%s: Opening listen socket on conn %s",
|
||||
smfi->xxfi_name, conn);
|
||||
(void) smutex_init(&L_Mutex);
|
||||
(void) smutex_lock(&L_Mutex);
|
||||
listenfd = mi_milteropen(conn, backlog, &socksize, smfi->xxfi_name);
|
||||
if (!ValidSocket(listenfd))
|
||||
{
|
||||
smi_log(SMI_LOG_FATAL,
|
||||
"%s: Unable to create listening socket on conn %s",
|
||||
smfi->xxfi_name, conn);
|
||||
(void) smutex_unlock(&L_Mutex);
|
||||
return MI_FAILURE;
|
||||
}
|
||||
clilen = socksize;
|
||||
|
||||
if (listenfd >= FD_SETSIZE)
|
||||
{
|
||||
smi_log(SMI_LOG_ERR, "%s: fd %d is larger than FD_SETSIZE %d",
|
||||
smfi->xxfi_name, listenfd, FD_SETSIZE);
|
||||
(void) smutex_unlock(&L_Mutex);
|
||||
return MI_FAILURE;
|
||||
}
|
||||
(void) smutex_unlock(&L_Mutex);
|
||||
|
||||
while (mi_stop() == MILTER_CONT)
|
||||
{
|
||||
(void) smutex_lock(&L_Mutex);
|
||||
if (!ValidSocket(listenfd))
|
||||
{
|
||||
(void) smutex_unlock(&L_Mutex);
|
||||
break;
|
||||
}
|
||||
|
||||
/* select on interface ports */
|
||||
FD_ZERO(&readset);
|
||||
FD_SET((u_int) listenfd, &readset);
|
||||
FD_ZERO(&excset);
|
||||
FD_SET((u_int) listenfd, &readset);
|
||||
FD_SET((u_int) listenfd, &excset);
|
||||
chktime.tv_sec = MI_CHK_TIME;
|
||||
chktime.tv_usec = 0;
|
||||
r = select(listenfd + 1, &readset, NULL, &excset, &chktime);
|
||||
if (r == 0) /* timeout */
|
||||
{
|
||||
(void) smutex_unlock(&L_Mutex);
|
||||
continue; /* just check mi_stop() */
|
||||
}
|
||||
if (r < 0)
|
||||
{
|
||||
if (errno == EINTR)
|
||||
int err = errno;
|
||||
|
||||
(void) smutex_unlock(&L_Mutex);
|
||||
if (err == EINTR)
|
||||
continue;
|
||||
ret = MI_FAILURE;
|
||||
break;
|
||||
@ -514,11 +541,13 @@ mi_listener(conn, dbg, smfi, timeout, backlog)
|
||||
{
|
||||
/* some error: just stop for now... */
|
||||
ret = MI_FAILURE;
|
||||
(void) smutex_unlock(&L_Mutex);
|
||||
break;
|
||||
}
|
||||
|
||||
connfd = accept(listenfd, (struct sockaddr *) &cliaddr,
|
||||
&clilen);
|
||||
(void) smutex_unlock(&L_Mutex);
|
||||
|
||||
if (!ValidSocket(connfd))
|
||||
{
|
||||
@ -577,7 +606,7 @@ mi_listener(conn, dbg, smfi, timeout, backlog)
|
||||
|
||||
if ((r = thread_create(&thread_id,
|
||||
mi_thread_handle_wrapper,
|
||||
(void *) ctx)) != MI_SUCCESS)
|
||||
(void *) ctx)) != 0)
|
||||
{
|
||||
smi_log(SMI_LOG_ERR,
|
||||
"%s: thread_create() failed: %d",
|
||||
@ -596,8 +625,9 @@ mi_listener(conn, dbg, smfi, timeout, backlog)
|
||||
}
|
||||
if (ret != MI_SUCCESS)
|
||||
mi_stop_milters(MILTER_ABRT);
|
||||
if (listenfd >= 0)
|
||||
(void) close(listenfd);
|
||||
else
|
||||
mi_closener();
|
||||
(void) smutex_destroy(&L_Mutex);
|
||||
return ret;
|
||||
}
|
||||
#endif /* _FFR_MILTER */
|
||||
|
@ -9,19 +9,12 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: signal.c,v 8.10.4.7 2000/09/01 00:49:04 ca Exp $";
|
||||
static char id[] = "@(#)$Id: signal.c,v 8.10.4.8 2000/11/20 21:15:37 ca Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#if _FFR_MILTER
|
||||
#include "libmilter.h"
|
||||
|
||||
typedef pthread_mutex_t smutex_t;
|
||||
# define smutex_init(mp) (pthread_mutex_init(mp, NULL) == 0)
|
||||
# define smutex_destroy(mp) (pthread_mutex_destroy(mp) == 0)
|
||||
# define smutex_lock(mp) (pthread_mutex_lock(mp) == 0)
|
||||
# define smutex_unlock(mp) (pthread_mutex_unlock(mp) == 0)
|
||||
# define smutex_trylock(mp) (pthread_mutex_trylock(mp) == 0)
|
||||
|
||||
/*
|
||||
** thread to handle signals
|
||||
*/
|
||||
|
@ -9,7 +9,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: sm_gethost.c,v 8.7.8.2 2000/09/17 17:04:24 gshapiro Exp $";
|
||||
static char id[] = "@(#)$Id: sm_gethost.c,v 8.7.8.4 2000/12/19 04:26:33 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#if _FFR_MILTER
|
||||
@ -61,6 +61,20 @@ getipnodebyname(name, family, flags, err)
|
||||
_res.options &= ~RES_USE_INET6;
|
||||
return h;
|
||||
}
|
||||
|
||||
# if _FFR_FREEHOSTENT
|
||||
void
|
||||
freehostent(h)
|
||||
struct hostent *h;
|
||||
{
|
||||
/*
|
||||
** Stub routine -- if they don't have getipnodeby*(),
|
||||
** they probably don't have the free routine either.
|
||||
*/
|
||||
|
||||
return;
|
||||
}
|
||||
# endif /* _FFR_FREEHOSTENT */
|
||||
#endif /* NEEDSGETIPNODE && NETINET6 && __RES < 19990909 */
|
||||
|
||||
struct hostent *
|
||||
|
@ -8,7 +8,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: smdb1.c,v 8.43.4.1 2000/08/24 17:08:00 gshapiro Exp $";
|
||||
static char id[] = "@(#)$Id: smdb1.c,v 8.43.4.3 2000/10/05 23:06:30 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#include <unistd.h>
|
||||
@ -175,8 +175,12 @@ smdb1_del(database, key, flags)
|
||||
u_int flags;
|
||||
{
|
||||
DB *db = ((SMDB_DB1_DATABASE *) database->smdb_impl)->smdb1_db;
|
||||
DBT dbkey;
|
||||
|
||||
return db->del(db, &key->db, flags);
|
||||
memset(&dbkey, '\0', sizeof dbkey);
|
||||
dbkey.data = key->data;
|
||||
dbkey.size = key->size;
|
||||
return db->del(db, &dbkey, flags);
|
||||
}
|
||||
|
||||
int
|
||||
@ -212,14 +216,22 @@ smdb1_get(database, key, data, flags)
|
||||
{
|
||||
int result;
|
||||
DB *db = ((SMDB_DB1_DATABASE *) database->smdb_impl)->smdb1_db;
|
||||
DBT dbkey, dbdata;
|
||||
|
||||
result = db->get(db, &key->db, &data->db, flags);
|
||||
memset(&dbdata, '\0', sizeof dbdata);
|
||||
memset(&dbkey, '\0', sizeof dbkey);
|
||||
dbkey.data = key->data;
|
||||
dbkey.size = key->size;
|
||||
|
||||
result = db->get(db, &dbkey, &dbdata, flags);
|
||||
if (result != 0)
|
||||
{
|
||||
if (result == 1)
|
||||
return SMDBE_NOT_FOUND;
|
||||
return errno;
|
||||
}
|
||||
data->data = dbdata.data;
|
||||
data->size = dbdata.size;
|
||||
return SMDBE_OK;
|
||||
}
|
||||
|
||||
@ -231,9 +243,17 @@ smdb1_put(database, key, data, flags)
|
||||
u_int flags;
|
||||
{
|
||||
DB *db = ((SMDB_DB1_DATABASE *) database->smdb_impl)->smdb1_db;
|
||||
DBT dbkey, dbdata;
|
||||
|
||||
return db->put(db, &key->db, &data->db,
|
||||
smdb_put_flags_to_db1_flags(flags));
|
||||
memset(&dbdata, '\0', sizeof dbdata);
|
||||
memset(&dbkey, '\0', sizeof dbkey);
|
||||
dbkey.data = key->data;
|
||||
dbkey.size = key->size;
|
||||
dbdata.data = data->data;
|
||||
dbdata.size = data->size;
|
||||
|
||||
return db->put(db, &dbkey, &dbdata,
|
||||
smdb_put_flags_to_db1_flags(flags));
|
||||
}
|
||||
|
||||
int
|
||||
@ -309,13 +329,21 @@ smdb1_cursor_get(cursor, key, value, flags)
|
||||
SMDB_DB1_CURSOR *db1_cursor = (SMDB_DB1_CURSOR *) cursor->smdbc_impl;
|
||||
SMDB_DB1_DATABASE *db1 = db1_cursor->db;
|
||||
DB *db = db1->smdb1_db;
|
||||
DBT dbkey, dbdata;
|
||||
|
||||
memset(&dbdata, '\0', sizeof dbdata);
|
||||
memset(&dbkey, '\0', sizeof dbkey);
|
||||
|
||||
db1_flags = smdb_cursor_get_flags_to_smdb1(flags);
|
||||
result = db->seq(db, &key->db, &value->db, db1_flags);
|
||||
result = db->seq(db, &dbkey, &dbdata, db1_flags);
|
||||
if (result == -1)
|
||||
return errno;
|
||||
if (result == 1)
|
||||
return SMDBE_LAST_ENTRY;
|
||||
value->data = dbdata.data;
|
||||
value->size = dbdata.size;
|
||||
key->data = dbkey.data;
|
||||
key->size = dbkey.size;
|
||||
return SMDBE_OK;
|
||||
}
|
||||
|
||||
@ -329,8 +357,16 @@ smdb1_cursor_put(cursor, key, value, flags)
|
||||
SMDB_DB1_CURSOR *db1_cursor = (SMDB_DB1_CURSOR *) cursor->smdbc_impl;
|
||||
SMDB_DB1_DATABASE *db1 = db1_cursor->db;
|
||||
DB *db = db1->smdb1_db;
|
||||
DBT dbkey, dbdata;
|
||||
|
||||
return db->put(db, &key->db, &value->db, R_CURSOR);
|
||||
memset(&dbdata, '\0', sizeof dbdata);
|
||||
memset(&dbkey, '\0', sizeof dbkey);
|
||||
dbkey.data = key->data;
|
||||
dbkey.size = key->size;
|
||||
dbdata.data = value->data;
|
||||
dbdata.size = value->size;
|
||||
|
||||
return db->put(db, &dbkey, &dbdata, R_CURSOR);
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -8,7 +8,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: smdb2.c,v 8.53.2.1.2.2 2000/08/24 17:08:00 gshapiro Exp $";
|
||||
static char id[] = "@(#)$Id: smdb2.c,v 8.53.2.1.2.5 2000/10/26 00:39:56 geir Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#include <fcntl.h>
|
||||
@ -250,8 +250,12 @@ smdb2_del(database, key, flags)
|
||||
u_int flags;
|
||||
{
|
||||
DB *db = ((SMDB_DB2_DATABASE *) database->smdb_impl)->smdb2_db;
|
||||
DBT dbkey;
|
||||
|
||||
return db2_error_to_smdb(db->del(db, NULL, &key->db, flags));
|
||||
memset(&dbkey, '\0', sizeof dbkey);
|
||||
dbkey.data = key->data;
|
||||
dbkey.size = key->size;
|
||||
return db2_error_to_smdb(db->del(db, NULL, &dbkey, flags));
|
||||
}
|
||||
|
||||
int
|
||||
@ -281,9 +285,19 @@ smdb2_get(database, key, data, flags)
|
||||
SMDB_DBENT *data;
|
||||
u_int flags;
|
||||
{
|
||||
int result;
|
||||
DB *db = ((SMDB_DB2_DATABASE *) database->smdb_impl)->smdb2_db;
|
||||
DBT dbkey, dbdata;
|
||||
|
||||
return db2_error_to_smdb(db->get(db, NULL, &key->db, &data->db, flags));
|
||||
memset(&dbdata, '\0', sizeof dbdata);
|
||||
memset(&dbkey, '\0', sizeof dbkey);
|
||||
dbkey.data = key->data;
|
||||
dbkey.size = key->size;
|
||||
|
||||
result = db->get(db, NULL, &dbkey, &dbdata, flags);
|
||||
data->data = dbdata.data;
|
||||
data->size = dbdata.size;
|
||||
return db2_error_to_smdb(result);
|
||||
}
|
||||
|
||||
int
|
||||
@ -294,8 +308,16 @@ smdb2_put(database, key, data, flags)
|
||||
u_int flags;
|
||||
{
|
||||
DB *db = ((SMDB_DB2_DATABASE *) database->smdb_impl)->smdb2_db;
|
||||
DBT dbkey, dbdata;
|
||||
|
||||
return db2_error_to_smdb(db->put(db, NULL, &key->db, &data->db,
|
||||
memset(&dbdata, '\0', sizeof dbdata);
|
||||
memset(&dbkey, '\0', sizeof dbkey);
|
||||
dbkey.data = key->data;
|
||||
dbkey.size = key->size;
|
||||
dbdata.data = data->data;
|
||||
dbdata.size = data->size;
|
||||
|
||||
return db2_error_to_smdb(db->put(db, NULL, &dbkey, &dbdata,
|
||||
smdb_put_flags_to_db2_flags(flags)));
|
||||
}
|
||||
|
||||
@ -362,11 +384,19 @@ smdb2_cursor_get(cursor, key, value, flags)
|
||||
int db2_flags;
|
||||
int result;
|
||||
DBC *dbc = (DBC *) cursor->smdbc_impl;
|
||||
DBT dbkey, dbdata;
|
||||
|
||||
memset(&dbdata, '\0', sizeof dbdata);
|
||||
memset(&dbkey, '\0', sizeof dbkey);
|
||||
|
||||
db2_flags = smdb_cursor_get_flags_to_db2(flags);
|
||||
result = dbc->c_get(dbc, &key->db, &value->db, db2_flags);
|
||||
result = dbc->c_get(dbc, &dbkey, &dbdata, db2_flags);
|
||||
if (result == DB_NOTFOUND)
|
||||
return SMDBE_LAST_ENTRY;
|
||||
key->data = dbkey.data;
|
||||
key->size = dbkey.size;
|
||||
value->data = dbdata.data;
|
||||
value->size = dbdata.size;
|
||||
return db2_error_to_smdb(result);
|
||||
}
|
||||
|
||||
@ -378,8 +408,16 @@ smdb2_cursor_put(cursor, key, value, flags)
|
||||
SMDB_FLAG flags;
|
||||
{
|
||||
DBC *dbc = (DBC *) cursor->smdbc_impl;
|
||||
DBT dbkey, dbdata;
|
||||
|
||||
return db2_error_to_smdb(dbc->c_put(dbc, &key->db, &value->db, 0));
|
||||
memset(&dbdata, '\0', sizeof dbdata);
|
||||
memset(&dbkey, '\0', sizeof dbkey);
|
||||
dbkey.data = key->data;
|
||||
dbkey.size = key->size;
|
||||
dbdata.data = value->data;
|
||||
dbdata.size = value->size;
|
||||
|
||||
return db2_error_to_smdb(dbc->c_put(dbc, &dbkey, &dbdata, 0));
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -8,7 +8,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: smndbm.c,v 8.40.4.1 2000/08/24 17:08:00 gshapiro Exp $";
|
||||
static char id[] = "@(#)$Id: smndbm.c,v 8.40.4.3 2000/10/05 22:27:50 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#include <fcntl.h>
|
||||
@ -124,9 +124,14 @@ smdbm_del(database, key, flags)
|
||||
{
|
||||
int result;
|
||||
DBM *dbm = ((SMDB_DBM_DATABASE *) database->smdb_impl)->smndbm_dbm;
|
||||
datum dbkey;
|
||||
|
||||
memset(&dbkey, '\0', sizeof dbkey);
|
||||
dbkey.dptr = key->data;
|
||||
dbkey.dsize = key->size;
|
||||
|
||||
errno = 0;
|
||||
result = dbm_delete(dbm, key->dbm);
|
||||
result = dbm_delete(dbm, dbkey);
|
||||
if (result != 0)
|
||||
{
|
||||
int save_errno = errno;
|
||||
@ -173,10 +178,16 @@ smdbm_get(database, key, data, flags)
|
||||
u_int flags;
|
||||
{
|
||||
DBM *dbm = ((SMDB_DBM_DATABASE *) database->smdb_impl)->smndbm_dbm;
|
||||
datum dbkey, dbdata;
|
||||
|
||||
memset(&dbkey, '\0', sizeof dbkey);
|
||||
memset(&dbdata, '\0', sizeof dbdata);
|
||||
dbkey.dptr = key->data;
|
||||
dbkey.dsize = key->size;
|
||||
|
||||
errno = 0;
|
||||
data->dbm = dbm_fetch(dbm, key->dbm);
|
||||
if (data->dbm.dptr == NULL)
|
||||
dbdata = dbm_fetch(dbm, dbkey);
|
||||
if (dbdata.dptr == NULL)
|
||||
{
|
||||
int save_errno = errno;
|
||||
|
||||
@ -188,7 +199,8 @@ smdbm_get(database, key, data, flags)
|
||||
|
||||
return SMDBE_NOT_FOUND;
|
||||
}
|
||||
|
||||
data->data = dbdata.dptr;
|
||||
data->size = dbdata.dsize;
|
||||
return SMDBE_OK;
|
||||
}
|
||||
|
||||
@ -202,9 +214,17 @@ smdbm_put(database, key, data, flags)
|
||||
int result;
|
||||
int save_errno;
|
||||
DBM *dbm = ((SMDB_DBM_DATABASE *) database->smdb_impl)->smndbm_dbm;
|
||||
datum dbkey, dbdata;
|
||||
|
||||
memset(&dbkey, '\0', sizeof dbkey);
|
||||
memset(&dbdata, '\0', sizeof dbdata);
|
||||
dbkey.dptr = key->data;
|
||||
dbkey.dsize = key->size;
|
||||
dbdata.dptr = data->data;
|
||||
dbdata.dsize = data->size;
|
||||
|
||||
errno = 0;
|
||||
result = dbm_store(dbm, key->dbm, data->dbm,
|
||||
result = dbm_store(dbm, dbkey, dbdata,
|
||||
smdb_put_flags_to_ndbm_flags(flags));
|
||||
switch (result)
|
||||
{
|
||||
@ -321,6 +341,10 @@ smdbm_cursor_get(cursor, key, value, flags)
|
||||
SMDB_DBM_CURSOR *dbm_cursor = (SMDB_DBM_CURSOR *) cursor->smdbc_impl;
|
||||
SMDB_DBM_DATABASE *db = dbm_cursor->smndbmc_db;
|
||||
DBM *dbm = db->smndbm_dbm;
|
||||
datum dbkey, dbdata;
|
||||
|
||||
memset(&dbkey, '\0', sizeof dbkey);
|
||||
memset(&dbdata, '\0', sizeof dbdata);
|
||||
|
||||
if (flags == SMDB_CURSOR_GET_RANGE)
|
||||
return SMDBE_UNSUPPORTED;
|
||||
@ -347,8 +371,8 @@ smdbm_cursor_get(cursor, key, value, flags)
|
||||
}
|
||||
|
||||
errno = 0;
|
||||
value->dbm = dbm_fetch(dbm, dbm_cursor->smndbmc_current_key);
|
||||
if (value->dbm.dptr == NULL)
|
||||
dbdata = dbm_fetch(dbm, dbm_cursor->smndbmc_current_key);
|
||||
if (dbdata.dptr == NULL)
|
||||
{
|
||||
int save_errno = errno;
|
||||
|
||||
@ -360,7 +384,10 @@ smdbm_cursor_get(cursor, key, value, flags)
|
||||
|
||||
return SMDBE_NOT_FOUND;
|
||||
}
|
||||
key->dbm = dbm_cursor->smndbmc_current_key;
|
||||
value->data = dbdata.dptr;
|
||||
value->size = dbdata.dsize;
|
||||
key->data = dbm_cursor->smndbmc_current_key.dptr;
|
||||
key->size = dbm_cursor->smndbmc_current_key.dsize;
|
||||
|
||||
return SMDBE_OK;
|
||||
}
|
||||
@ -377,9 +404,14 @@ smdbm_cursor_put(cursor, key, value, flags)
|
||||
SMDB_DBM_CURSOR *dbm_cursor = (SMDB_DBM_CURSOR *) cursor->smdbc_impl;
|
||||
SMDB_DBM_DATABASE *db = dbm_cursor->smndbmc_db;
|
||||
DBM *dbm = db->smndbm_dbm;
|
||||
datum dbdata;
|
||||
|
||||
memset(&dbdata, '\0', sizeof dbdata);
|
||||
dbdata.dptr = value->data;
|
||||
dbdata.dsize = value->size;
|
||||
|
||||
errno = 0;
|
||||
result = dbm_store(dbm, dbm_cursor->smndbmc_current_key, value->dbm,
|
||||
result = dbm_store(dbm, dbm_cursor->smndbmc_current_key, dbdata,
|
||||
smdb_put_flags_to_ndbm_flags(flags));
|
||||
switch (result)
|
||||
{
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
|
||||
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
|
||||
* Copyright (c) 1988, 1993
|
||||
@ -12,7 +12,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: lockfile.c,v 8.3 1999/08/31 15:38:27 ca Exp $";
|
||||
static char id[] = "@(#)$Id: lockfile.c,v 8.3.16.11 2000/11/16 02:54:28 geir Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#include <sendmail.h>
|
||||
@ -27,6 +27,7 @@ static char id[] = "@(#)$Id: lockfile.c,v 8.3 1999/08/31 15:38:27 ca Exp $";
|
||||
** type -- type of the lock. Bits can be:
|
||||
** LOCK_EX -- exclusive lock.
|
||||
** LOCK_NB -- non-blocking.
|
||||
** LOCK_UN -- unlock.
|
||||
**
|
||||
** Returns:
|
||||
** TRUE if the lock was acquired.
|
||||
|
@ -8,15 +8,17 @@
|
||||
.\" the sendmail distribution.
|
||||
.\"
|
||||
.\"
|
||||
.\" $Id: mail.local.8,v 8.14.14.3 2000/09/17 17:04:25 gshapiro Exp $
|
||||
.\" $Id: mail.local.8,v 8.14.14.5 2000/12/29 18:12:16 gshapiro Exp $
|
||||
.\"
|
||||
.TH MAIL.LOCAL 8 "$Date: 2000/09/17 17:04:25 $"
|
||||
.TH MAIL.LOCAL 8 "$Date: 2000/12/29 18:12:16 $"
|
||||
.SH NAME
|
||||
.B mail.local
|
||||
mail.local
|
||||
\- store mail in a mailbox
|
||||
.SH SYNOPSIS
|
||||
.B mail.local
|
||||
.RB [ \-7 "] [" \-b "] [" \-d "] [" \-l "] [" \-f
|
||||
.RB [ \-7 "] [" \-b "] [" \-d "] [" \-l "] [" \-f
|
||||
.IR from "] "
|
||||
.RB [ \-r
|
||||
.IR from "] " "user ..."
|
||||
.SH DESCRIPTION
|
||||
.B Mail.local
|
||||
|
@ -19,7 +19,7 @@ static char copyright[] =
|
||||
#endif /* ! lint */
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: mail.local.c,v 8.143.4.37 2000/09/22 00:49:10 doug Exp $";
|
||||
static char id[] = "@(#)$Id: mail.local.c,v 8.143.4.39 2000/11/14 20:02:47 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
/*
|
||||
@ -650,7 +650,7 @@ dolmtp(bouncequota)
|
||||
printf("250 2.0.0 ok\r\n");
|
||||
|
||||
rset:
|
||||
while (rcpt_num)
|
||||
while (rcpt_num > 0)
|
||||
free(rcpt_addr[--rcpt_num]);
|
||||
if (return_path != NULL)
|
||||
free(return_path);
|
||||
@ -911,7 +911,7 @@ deliver(fd, name, bouncequota)
|
||||
struct stat sb;
|
||||
struct passwd *pw;
|
||||
char path[MAXPATHLEN];
|
||||
int mbfd, nr = 0, nw, off;
|
||||
int mbfd = -1, nr = 0, nw, off;
|
||||
char *p;
|
||||
off_t curoff;
|
||||
#ifdef CONTENTLENGTH
|
||||
|
@ -6,11 +6,11 @@
|
||||
.\" the sendmail distribution.
|
||||
.\"
|
||||
.\"
|
||||
.\" $Id: mailstats.8,v 8.17 2000/03/11 20:18:21 gshapiro Exp $
|
||||
.\" $Id: mailstats.8,v 8.17.4.3 2000/12/29 18:12:20 gshapiro Exp $
|
||||
.\"
|
||||
.TH MAILSTATS 1 "April 25, 1996"
|
||||
.TH MAILSTATS 1 "$Date: 2000/12/29 18:12:20 $"
|
||||
.SH NAME
|
||||
.B mailstats
|
||||
mailstats
|
||||
\- display mail statistics
|
||||
.SH SYNOPSIS
|
||||
.B mailstats
|
||||
@ -72,13 +72,13 @@ The options are as follows:
|
||||
.B \-C
|
||||
Read the specified file instead of the default
|
||||
.B sendmail
|
||||
``cf'' file.
|
||||
configuration file.
|
||||
.TP
|
||||
.B \-f
|
||||
Read the specified statistics file instead of the statistics file
|
||||
specified in the
|
||||
.B sendmail
|
||||
``cf'' file.
|
||||
configuration file.
|
||||
.TP
|
||||
.B \-p
|
||||
Output information in program-readable mode and clear statistics.
|
||||
@ -95,7 +95,7 @@ utility exits 0 on success, and >0 if an error occurs.
|
||||
/etc/mail/sendmail.cf
|
||||
The default
|
||||
.B sendmail
|
||||
``cf'' file.
|
||||
configuration file.
|
||||
.TP
|
||||
/etc/mail/statistics
|
||||
The default
|
||||
|
@ -8,11 +8,11 @@
|
||||
.\" the sendmail distribution.
|
||||
.\"
|
||||
.\"
|
||||
.\" $Id: makemap.8,v 8.21.16.2 2000/09/17 17:04:26 gshapiro Exp $
|
||||
.\" $Id: makemap.8,v 8.21.16.5 2000/12/29 18:12:20 gshapiro Exp $
|
||||
.\"
|
||||
.TH MAKEMAP 8 "November 16, 1992"
|
||||
.TH MAKEMAP 8 "$Date: 2000/12/29 18:12:20 $"
|
||||
.SH NAME
|
||||
.B makemap
|
||||
makemap
|
||||
\- create database maps for sendmail
|
||||
.SH SYNOPSIS
|
||||
.B makemap
|
||||
@ -87,8 +87,9 @@ the specified
|
||||
.SS Flags
|
||||
.TP
|
||||
.B \-C
|
||||
Use the specified sendmail configuration file for
|
||||
looking up the TrustedUser option.
|
||||
Use the specified
|
||||
.B sendmail
|
||||
configuration file for looking up the TrustedUser option.
|
||||
.TP
|
||||
.B \-N
|
||||
Include the null byte that terminates strings
|
||||
|
@ -21,7 +21,7 @@ static char copyright[] =
|
||||
#endif /* ! lint */
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: makemap.c,v 8.135.4.11 2000/09/13 01:11:10 gshapiro Exp $";
|
||||
static char id[] = "@(#)$Id: makemap.c,v 8.135.4.13 2000/10/05 23:00:50 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
|
||||
@ -356,7 +356,6 @@ main(argc, argv)
|
||||
exitstat = EX_OK;
|
||||
if (unmake)
|
||||
{
|
||||
bool stop;
|
||||
errno = database->smdb_cursor(database, &cursor, 0);
|
||||
if (errno != SMDBE_OK)
|
||||
{
|
||||
@ -370,20 +369,18 @@ main(argc, argv)
|
||||
memset(&db_key, '\0', sizeof db_key);
|
||||
memset(&db_val, '\0', sizeof db_val);
|
||||
|
||||
for (stop = FALSE, lineno = 0; !stop; lineno++)
|
||||
for (lineno = 0; ; lineno++)
|
||||
{
|
||||
errno = cursor->smdbc_get(cursor, &db_key, &db_val,
|
||||
SMDB_CURSOR_GET_NEXT);
|
||||
if (errno != SMDBE_OK)
|
||||
{
|
||||
stop = TRUE;
|
||||
}
|
||||
if (!stop)
|
||||
printf("%.*s\t%.*s\n",
|
||||
(int) db_key.data.size,
|
||||
(char *) db_key.data.data,
|
||||
(int) db_val.data.size,
|
||||
(char *)db_val.data.data);
|
||||
break;
|
||||
|
||||
printf("%.*s\t%.*s\n",
|
||||
(int) db_key.size,
|
||||
(char *) db_key.data,
|
||||
(int) db_val.size,
|
||||
(char *)db_val.data);
|
||||
|
||||
}
|
||||
(void) cursor->smdbc_close(cursor);
|
||||
@ -430,16 +427,16 @@ main(argc, argv)
|
||||
|
||||
memset(&db_key, '\0', sizeof db_key);
|
||||
memset(&db_val, '\0', sizeof db_val);
|
||||
db_key.data.data = ibuf;
|
||||
db_key.data = ibuf;
|
||||
|
||||
for (p = ibuf; *p != '\0' && !(ISSEP(*p)); p++)
|
||||
{
|
||||
if (foldcase && isascii(*p) && isupper(*p))
|
||||
*p = tolower(*p);
|
||||
}
|
||||
db_key.data.size = p - ibuf;
|
||||
db_key.size = p - ibuf;
|
||||
if (inclnull)
|
||||
db_key.data.size++;
|
||||
db_key.size++;
|
||||
|
||||
if (*p != '\0')
|
||||
*p++ = '\0';
|
||||
@ -450,15 +447,15 @@ main(argc, argv)
|
||||
fprintf(stderr,
|
||||
"%s: %s: line %d: no RHS for LHS %s\n",
|
||||
progname, mapname, lineno,
|
||||
(char *) db_key.data.data);
|
||||
(char *) db_key.data);
|
||||
exitstat = EX_DATAERR;
|
||||
continue;
|
||||
}
|
||||
|
||||
db_val.data.data = p;
|
||||
db_val.data.size = strlen(p);
|
||||
db_val.data = p;
|
||||
db_val.size = strlen(p);
|
||||
if (inclnull)
|
||||
db_val.data.size++;
|
||||
db_val.size++;
|
||||
|
||||
/*
|
||||
** Do the database insert.
|
||||
@ -467,8 +464,8 @@ main(argc, argv)
|
||||
if (verbose)
|
||||
{
|
||||
printf("key=`%s', val=`%s'\n",
|
||||
(char *) db_key.data.data,
|
||||
(char *) db_val.data.data);
|
||||
(char *) db_key.data,
|
||||
(char *) db_val.data);
|
||||
}
|
||||
|
||||
errno = database->smdb_put(database, &db_key, &db_val,
|
||||
@ -493,7 +490,7 @@ main(argc, argv)
|
||||
fprintf(stderr,
|
||||
"%s: %s: line %d: key %s: put error: %s\n",
|
||||
progname, mapname, lineno,
|
||||
(char *) db_key.data.data,
|
||||
(char *) db_key.data,
|
||||
errstring(errno));
|
||||
exitstat = EX_IOERR;
|
||||
}
|
||||
@ -502,7 +499,7 @@ main(argc, argv)
|
||||
fprintf(stderr,
|
||||
"%s: %s: line %d: key %s: duplicate key\n",
|
||||
progname, mapname,
|
||||
lineno, (char *) db_key.data.data);
|
||||
lineno, (char *) db_key.data);
|
||||
exitstat = EX_DATAERR;
|
||||
}
|
||||
}
|
||||
|
@ -6,11 +6,11 @@
|
||||
.\" the sendmail distribution.
|
||||
.\"
|
||||
.\"
|
||||
.\" $Id: praliases.8,v 8.15 2000/04/06 16:47:24 ca Exp $
|
||||
.\" $Id: praliases.8,v 8.15.4.2 2000/12/15 19:50:45 gshapiro Exp $
|
||||
.\"
|
||||
.TH PRALIASES 8 "April 25, 1996"
|
||||
.TH PRALIASES 8 "$Date: 2000/12/15 19:50:45 $"
|
||||
.SH NAME
|
||||
.B praliases
|
||||
praliases
|
||||
\- display system mail aliases
|
||||
.SH SYNOPSIS
|
||||
.B praliases
|
||||
|
@ -21,7 +21,7 @@ static char copyright[] =
|
||||
#endif /* ! lint */
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: praliases.c,v 8.59.4.10 2000/07/18 05:41:39 gshapiro Exp $";
|
||||
static char id[] = "@(#)$Id: praliases.c,v 8.59.4.15 2000/10/24 00:42:59 geir Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
@ -56,6 +56,8 @@ BITMAP256 DontBlameSendmail;
|
||||
|
||||
extern void syserr __P((const char *, ...));
|
||||
|
||||
# define DELIMITERS " ,/"
|
||||
# define PATH_SEPARATOR ':'
|
||||
|
||||
int
|
||||
main(argc, argv)
|
||||
@ -170,7 +172,7 @@ main(argc, argv)
|
||||
break;
|
||||
b = p;
|
||||
|
||||
p = strpbrk(p, " ,/");
|
||||
p = strpbrk(p, DELIMITERS);
|
||||
|
||||
/* find end of spec */
|
||||
if (p != NULL)
|
||||
@ -244,7 +246,7 @@ praliases(filename, argc, argv)
|
||||
SMDB_DBPARAMS params;
|
||||
SMDB_USER_INFO user_info;
|
||||
|
||||
colon = strchr(filename, ':');
|
||||
colon = strchr(filename, PATH_SEPARATOR);
|
||||
if (colon == NULL)
|
||||
{
|
||||
db_name = filename;
|
||||
@ -262,6 +264,7 @@ praliases(filename, argc, argv)
|
||||
{
|
||||
while (isascii(*db_name) && isspace(*db_name))
|
||||
db_name++;
|
||||
|
||||
if (*db_name != '-')
|
||||
break;
|
||||
while (*db_name != '\0' &&
|
||||
@ -313,20 +316,20 @@ praliases(filename, argc, argv)
|
||||
{
|
||||
#if 0
|
||||
/* skip magic @:@ entry */
|
||||
if (db_key.data.size == 2 &&
|
||||
db_key.data.data[0] == '@' &&
|
||||
db_key.data.data[1] == '\0' &&
|
||||
db_value.data.size == 2 &&
|
||||
db_value.data.data[0] == '@' &&
|
||||
db_value.data.data[1] == '\0')
|
||||
if (db_key.size == 2 &&
|
||||
db_key.data[0] == '@' &&
|
||||
db_key.data[1] == '\0' &&
|
||||
db_value.size == 2 &&
|
||||
db_value.data[0] == '@' &&
|
||||
db_value.data[1] == '\0')
|
||||
continue;
|
||||
#endif /* 0 */
|
||||
|
||||
printf("%.*s:%.*s\n",
|
||||
(int) db_key.data.size,
|
||||
(char *) db_key.data.data,
|
||||
(int) db_value.data.size,
|
||||
(char *) db_value.data.data);
|
||||
(int) db_key.size,
|
||||
(char *) db_key.data,
|
||||
(int) db_value.size,
|
||||
(char *) db_value.data);
|
||||
}
|
||||
|
||||
if (result != SMDBE_OK && result != SMDBE_LAST_ENTRY)
|
||||
@ -341,19 +344,19 @@ praliases(filename, argc, argv)
|
||||
{
|
||||
memset(&db_key, '\0', sizeof db_key);
|
||||
memset(&db_value, '\0', sizeof db_value);
|
||||
db_key.data.data = *argv;
|
||||
db_key.data.size = strlen(*argv) + 1;
|
||||
db_key.data = *argv;
|
||||
db_key.size = strlen(*argv) + 1;
|
||||
if (database->smdb_get(database, &db_key,
|
||||
&db_value, 0) == SMDBE_OK)
|
||||
{
|
||||
printf("%.*s:%.*s\n",
|
||||
(int) db_key.data.size,
|
||||
(char *) db_key.data.data,
|
||||
(int) db_value.data.size,
|
||||
(char *) db_value.data.data);
|
||||
(int) db_key.size,
|
||||
(char *) db_key.data,
|
||||
(int) db_value.size,
|
||||
(char *) db_value.data);
|
||||
}
|
||||
else
|
||||
printf("%s: No such key\n", (char *) db_key.data.data);
|
||||
printf("%s: No such key\n", (char *) db_key.data);
|
||||
}
|
||||
|
||||
fatal:
|
||||
|
@ -8,14 +8,17 @@
|
||||
.\" the sendmail distribution.
|
||||
.\"
|
||||
.\"
|
||||
.\" $Id: rmail.8,v 8.1 1999/06/22 20:41:33 tony Exp $
|
||||
.\" $Id: rmail.8,v 8.1.16.2 2000/12/29 18:12:22 gshapiro Exp $
|
||||
.\"
|
||||
.TH RMAIL 8 "$Date: 1999/06/22 20:41:33 $"
|
||||
.TH RMAIL 8 "$Date: 2000/12/29 18:12:22 $"
|
||||
.SH NAME
|
||||
.B rmail
|
||||
rmail
|
||||
\- handle remote mail received via uucp
|
||||
.SH SYNOPSIS
|
||||
.B rmail
|
||||
.RB [ \-D
|
||||
.IR domain ]
|
||||
.RB [ \-T ]
|
||||
.I
|
||||
user ...
|
||||
.SH DESCRIPTION
|
||||
@ -34,6 +37,15 @@ is explicitly designed for use with
|
||||
uucp
|
||||
and
|
||||
sendmail.
|
||||
.SS Flags
|
||||
.TP
|
||||
.B \-D
|
||||
Use the specified
|
||||
.I domain
|
||||
instead of the default domain of ``UUCP''.
|
||||
.TP
|
||||
.B \-T
|
||||
Turn on debugging.
|
||||
.SH SEE ALSO
|
||||
uucp(1),
|
||||
mail.local(8),
|
||||
|
@ -19,7 +19,7 @@ static char copyright[] =
|
||||
#endif /* ! lint */
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: rmail.c,v 8.39.4.8 2000/09/16 22:20:25 gshapiro Exp $";
|
||||
static char id[] = "@(#)$Id: rmail.c,v 8.39.4.9 2000/11/17 08:42:56 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
/*
|
||||
@ -311,12 +311,11 @@ main(argc, argv)
|
||||
}
|
||||
|
||||
|
||||
/* Allocate args (with room for sendmail args as well as recipients */
|
||||
/* Allocate args (with room for sendmail args as well as recipients) */
|
||||
args = (char **)xalloc(sizeof(*args) * (10 + argc));
|
||||
|
||||
i = 0;
|
||||
args[i++] = _PATH_SENDMAIL; /* Build sendmail's argument list. */
|
||||
args[i++] = "-G"; /* relay submission */
|
||||
args[i++] = "-oee"; /* No errors, just status. */
|
||||
args[i++] = "-odq"; /* Queue it, don't try to deliver. */
|
||||
args[i++] = "-oi"; /* Ignore '.' on a line by itself. */
|
||||
|
@ -75,8 +75,8 @@ You should NOT include interpreter programs such as sh(1), csh(1),
|
||||
perl(1), uudecode(1) or the stream editor sed(1) in your list of
|
||||
acceptable commands.
|
||||
|
||||
|
||||
You will next need to create the directory /usr/adm/sm.bin and populate
|
||||
If your platform doesn't have a default CMDDIR setting, you will
|
||||
next need to create the directory /usr/adm/sm.bin and populate
|
||||
it with the programs that your site feels are allowable for sendmail
|
||||
to execute. This directory is explicitly specified in the source
|
||||
code for smrsh, so changing this directory must be accompanied with
|
||||
@ -153,4 +153,4 @@ a typical system follows:
|
||||
host.domain# /usr/sbin/sendmail -bd -q30m
|
||||
|
||||
|
||||
$Revision: 8.6 $, Last updated $Date: 1999/04/28 01:09:51 $
|
||||
$Revision: 8.6.16.1 $, Last updated $Date: 2000/10/09 20:39:55 $
|
||||
|
@ -1,4 +1,4 @@
|
||||
.\" Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
|
||||
.\" Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
|
||||
.\" All rights reserved.
|
||||
.\" Copyright (c) 1993 Eric P. Allman. All rights reserved.
|
||||
.\" Copyright (c) 1993
|
||||
@ -9,9 +9,9 @@
|
||||
.\" the sendmail distribution.
|
||||
.\"
|
||||
.\"
|
||||
.\" $Id: smrsh.8,v 8.11 1999/06/09 16:51:07 ca Exp $
|
||||
.\" $Id: smrsh.8,v 8.11.16.2 2000/12/15 19:50:46 gshapiro Exp $
|
||||
.\"
|
||||
.TH SMRSH 8 11/02/93
|
||||
.TH SMRSH 8 "$Date: 2000/12/15 19:50:46 $"
|
||||
.SH NAME
|
||||
smrsh \- restricted shell for sendmail
|
||||
.SH SYNOPSIS
|
||||
@ -37,7 +37,8 @@ limits the set of programs that he or she can execute.
|
||||
.PP
|
||||
Briefly,
|
||||
.I smrsh
|
||||
limits programs to be in the directory
|
||||
limits programs to be in a single directory,
|
||||
by default
|
||||
/usr/adm/sm.bin,
|
||||
allowing the system administrator to choose the set of acceptable commands,
|
||||
and to the shell builtin commands ``exec'', ``exit'', and ``echo''.
|
||||
@ -58,7 +59,7 @@ all actually forward to
|
||||
``/usr/adm/sm.bin/vacation''.
|
||||
.PP
|
||||
System administrators should be conservative about populating
|
||||
/usr/adm/sm.bin.
|
||||
the sm.bin directory.
|
||||
Reasonable additions are
|
||||
.IR vacation (1),
|
||||
.IR procmail (1),
|
||||
|
@ -21,7 +21,7 @@ static char copyright[] =
|
||||
#endif /* ! lint */
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: smrsh.c,v 8.31.4.5 2000/09/17 17:04:27 gshapiro Exp $";
|
||||
static char id[] = "@(#)$Id: smrsh.c,v 8.31.4.6 2000/10/09 20:37:16 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
/*
|
||||
@ -74,7 +74,11 @@ static char id[] = "@(#)$Id: smrsh.c,v 8.31.4.5 2000/09/17 17:04:27 gshapiro Exp
|
||||
|
||||
/* directory in which all commands must reside */
|
||||
#ifndef CMDDIR
|
||||
# define CMDDIR "/usr/adm/sm.bin"
|
||||
# if defined(HPUX10) || defined(HPUX11) || SOLARIS >= 20800
|
||||
# define CMDDIR "/var/adm/sm.bin"
|
||||
# else /* HPUX10 || HPUX11 || SOLARIS > 20800 */
|
||||
# define CMDDIR "/usr/adm/sm.bin"
|
||||
# endif /* HPUX10 || HPUX11 || SOLARIS > 20800 */
|
||||
#endif /* ! CMDDIR */
|
||||
|
||||
/* characters disallowed in the shell "-c" argument */
|
||||
|
@ -9,7 +9,7 @@
|
||||
# the sendmail distribution.
|
||||
#
|
||||
#
|
||||
# $Id: README,v 8.263.2.1.2.21 2000/09/27 16:36:26 ca Exp $
|
||||
# $Id: README,v 8.263.2.1.2.27 2000/12/16 16:46:02 gshapiro Exp $
|
||||
#
|
||||
|
||||
This directory contains the source files for sendmail(TM).
|
||||
@ -593,9 +593,8 @@ SFIO Uses sfio instead of stdio. sfio is available from AT&T
|
||||
stdio.h must be installed in a subdirectory called sfio,
|
||||
i.e., if you install sfio in /usr/local, stdio.h should
|
||||
be in /usr/local/include/sfio, and libsfio.a should be in
|
||||
/usr/local/lib. Notice: you may run into problems if
|
||||
you use sfio2000 (the body of a message is lost). Use
|
||||
sfio1999 instead.
|
||||
/usr/local/lib. Notice: read the sfio section in
|
||||
OPERATING SYSTEM AND COMPILE QUIRKS.
|
||||
|
||||
|
||||
+---------------------+
|
||||
@ -629,6 +628,12 @@ different version of the database internally that does not include
|
||||
wildcard MX records that match your domain. ANYTHING ELSE WILL GIVE
|
||||
YOU HEADACHES!
|
||||
|
||||
When attempting to canonify a hostname, some broken name servers will
|
||||
return SERVFAIL (a temporary failure) on T_AAAA (IPv6) lookups. If you
|
||||
want to excuse this behavior, compile sendmail with
|
||||
-D_FFR_WORKAROUND_BROKEN_NAMESERVERS. However, instead, we recommend catching
|
||||
the problem and reporting it to the name server administrator so we can rid
|
||||
the world of broken name servers.
|
||||
|
||||
+----------------------------------------+
|
||||
| STARTTLS COMPILATION AND CONFIGURATION |
|
||||
@ -918,6 +923,25 @@ Solaris 7 (SunOS 5.7)
|
||||
to ldap_set_option for LDAP_OPT_REFERRALS in ldapmap_setopts if
|
||||
LDAP support is compiled in sendmail.
|
||||
|
||||
Solaris
|
||||
If you are using dns for hostname resolution on Solaris, make sure
|
||||
that the 'dns' entry is last on the hosts line in
|
||||
'/etc/nsswitch.conf'. For example, use:
|
||||
|
||||
hosts: nisplus files dns
|
||||
|
||||
Do not use:
|
||||
|
||||
host: nisplus dns [NOTFOUND=return] files
|
||||
|
||||
Note that 'nisplus' above is an illustration. The same comment
|
||||
applies no matter what naming services you are using. If you have
|
||||
anything other than dns last, even after "[NOTFOUND=return]",
|
||||
sendmail may not be able to determine whether an error was
|
||||
temporary or permanent. The error returned by the solaris
|
||||
gethostbyname() is the error for the last lookup used, and other
|
||||
naming services do not have the same concept of temporary failure.
|
||||
|
||||
Ultrix
|
||||
By default, the IDENT protocol is turned off on Ultrix. If you
|
||||
are running Ultrix 4.4 or later, or if you have included patch
|
||||
@ -1247,7 +1271,7 @@ AIX 4.3.3
|
||||
2) Build against a real Bind 8.2.2 include/lib tree
|
||||
3) Wait for IBM to fix it
|
||||
|
||||
AIX 4.2
|
||||
AIX 4.X
|
||||
The AIX m4 implements a different mechanism for ifdef which is
|
||||
inconsistent with other versions of m4. Therefore, it will not
|
||||
work properly with the sendmail Build architecture or m4
|
||||
@ -1470,9 +1494,30 @@ OpenSSL
|
||||
Do not use 0.9.3, but OpenSSL 0.9.5a or later if compatible with
|
||||
0.9.5a.
|
||||
|
||||
sfio
|
||||
You may run into problems if you use sfio2000 (the body of a
|
||||
message is lost). Use sfio1999 instead; however, it also has
|
||||
a bug that can cause sendmail to fail. A patch has been provided
|
||||
by Petr Lampa of Brno University of Technology, which is given here:
|
||||
|
||||
diff -rc ../../../../sfio/src/lib/sfio/sfputr.c ./sfputr.c
|
||||
*** ../../../../sfio/src/lib/sfio/sfputr.c Tue May 16 18:25:49 2000
|
||||
--- ./sfputr.c Wed Sep 20 09:06:01 2000
|
||||
***************
|
||||
*** 24,29 ****
|
||||
--- 24,30 ----
|
||||
for(w = 0; (*s || rc >= 0); )
|
||||
{ SFWPEEK(f,ps,p);
|
||||
|
||||
+ if(p == -1) return -1; /* PL */
|
||||
if(p == 0 || (f->flags&SF_WHOLE) )
|
||||
{ n = strlen(s);
|
||||
if(p >= (n + (rc < 0 ? 0 : 1)) )
|
||||
|
||||
|
||||
PH
|
||||
PH support is provided by Mark Roth <roth@uiuc.edu>. The map is
|
||||
described at http://www-wsg.cso.uiuc.edu/sendmail/patches/ .
|
||||
described at http://www-dev.cso.uiuc.edu/sendmail/ .
|
||||
Please contact Mark Roth for support and questions regarding the
|
||||
map.
|
||||
|
||||
@ -1623,4 +1668,4 @@ util.c Some general purpose routines used by sendmail.
|
||||
version.c The version number and information about this
|
||||
version of sendmail.
|
||||
|
||||
(Version $Revision: 8.263.2.1.2.21 $, last update $Date: 2000/09/27 16:36:26 $ )
|
||||
(Version $Revision: 8.263.2.1.2.27 $, last update $Date: 2000/12/16 16:46:02 $ )
|
||||
|
@ -13,7 +13,7 @@
|
||||
#include <sendmail.h>
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: alias.c,v 8.142.4.3 2000/09/21 21:52:16 ca Exp $";
|
||||
static char id[] = "@(#)$Id: alias.c,v 8.142.4.9 2000/11/08 20:58:42 geir Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
# define SEPARATOR ':'
|
||||
@ -279,7 +279,7 @@ setalias(spec)
|
||||
map = &s->s_map;
|
||||
memset(map, '\0', sizeof *map);
|
||||
map->map_mname = s->s_name;
|
||||
p = strpbrk(p,ALIAS_SPEC_SEPARATORS);
|
||||
p = strpbrk(p, ALIAS_SPEC_SEPARATORS);
|
||||
if (p != NULL && *p == SEPARATOR)
|
||||
{
|
||||
/* map name */
|
||||
@ -732,7 +732,7 @@ readaliases(map, af, announcestats, logstats)
|
||||
register char *nlp;
|
||||
|
||||
nlp = &p[strlen(p)];
|
||||
if (nlp[-1] == '\n')
|
||||
if (nlp > p && nlp[-1] == '\n')
|
||||
*--nlp = '\0';
|
||||
|
||||
if (CheckAliases)
|
||||
|
@ -1,5 +1,5 @@
|
||||
#
|
||||
# $Id: aliases,v 8.1 1999/02/06 18:44:07 gshapiro Exp $
|
||||
# $Id: aliases,v 8.1.36.1 2000/10/16 20:18:39 gshapiro Exp $
|
||||
# @(#)aliases 8.2 (Berkeley) 3/5/94
|
||||
#
|
||||
# Aliases in this file will NOT be expanded in the header from
|
||||
@ -31,24 +31,3 @@ operator: root
|
||||
|
||||
# trap decode to catch security attacks
|
||||
decode: root
|
||||
|
||||
# OFFICIAL CSRG/BUG ADDRESSES
|
||||
|
||||
# Ftp maintainer.
|
||||
ftp: ftp-bugs
|
||||
ftp-bugs: bigbug@cs.berkeley.edu
|
||||
|
||||
# Distribution office.
|
||||
bsd-dist: bsd-dist@cs.berkeley.edu
|
||||
|
||||
# Fortune maintainer.
|
||||
fortune: fortune@cs.berkeley.edu
|
||||
|
||||
# Termcap maintainer.
|
||||
termcap: termcap@cs.berkeley.edu
|
||||
|
||||
# General bug address.
|
||||
ucb-fixes: bigbug@cs.berkeley.edu
|
||||
ucb-fixes-request: bigbug@cs.berkeley.edu
|
||||
bugs: bugs@cs.berkeley.edu
|
||||
# END OFFICIAL BUG ADDRESSES
|
||||
|
@ -9,11 +9,11 @@
|
||||
.\" the sendmail distribution.
|
||||
.\"
|
||||
.\"
|
||||
.\" $Id: aliases.5,v 8.15.4.1 2000/07/18 07:23:02 gshapiro Exp $
|
||||
.\" $Id: aliases.5,v 8.15.4.2 2000/12/14 23:08:15 gshapiro Exp $
|
||||
.\"
|
||||
.TH ALIASES 5 "$Date: 2000/07/18 07:23:02 $"
|
||||
.TH ALIASES 5 "$Date: 2000/12/14 23:08:15 $"
|
||||
.SH NAME
|
||||
.B aliases
|
||||
aliases
|
||||
\- aliases file for sendmail
|
||||
.SH SYNOPSIS
|
||||
.B aliases
|
||||
|
@ -12,7 +12,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: collect.c,v 8.136.4.6 2000/09/21 21:52:16 ca Exp $";
|
||||
static char id[] = "@(#)$Id: collect.c,v 8.136.4.8 2000/10/09 00:50:04 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#include <sendmail.h>
|
||||
@ -436,7 +436,7 @@ nextstate:
|
||||
dprintf("collect: rscheck(\"check_eoh\", \"%s $| %s\")\n",
|
||||
hnum, hsize);
|
||||
rstat = rscheck("check_eoh", hnum, hsize, e, FALSE,
|
||||
TRUE, 4);
|
||||
TRUE, 4, NULL);
|
||||
|
||||
bp = buf;
|
||||
|
||||
@ -854,6 +854,11 @@ eatfrom(fm, e)
|
||||
p++;
|
||||
while (*p == ' ')
|
||||
p++;
|
||||
if (strlen(p) < 17)
|
||||
{
|
||||
/* no room for the date */
|
||||
return;
|
||||
}
|
||||
if (!(isascii(*p) && isupper(*p)) ||
|
||||
p[3] != ' ' || p[13] != ':' || p[16] != ':')
|
||||
continue;
|
||||
@ -866,8 +871,10 @@ eatfrom(fm, e)
|
||||
continue;
|
||||
|
||||
for (dt = MonthList; *dt != NULL; dt++)
|
||||
{
|
||||
if (strncmp(*dt, &p[4], 3) == 0)
|
||||
break;
|
||||
}
|
||||
if (*dt != NULL)
|
||||
break;
|
||||
}
|
||||
|
@ -12,7 +12,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: conf.c,v 8.646.2.2.2.32 2000/09/23 00:31:33 ca Exp $";
|
||||
static char id[] = "@(#)$Id: conf.c,v 8.646.2.2.2.61 2000/12/28 23:46:41 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#include <sendmail.h>
|
||||
@ -380,7 +380,7 @@ setupmailers()
|
||||
{
|
||||
char buf[100];
|
||||
|
||||
(void) strlcpy(buf, "prog, P=/bin/sh, F=lsoDq9, T=X-Unix/X-Unix/X-Unix, A=sh -c \201u",
|
||||
(void) strlcpy(buf, "prog, P=/bin/sh, F=lsouDq9, T=X-Unix/X-Unix/X-Unix, A=sh -c \201u",
|
||||
sizeof buf);
|
||||
makemailer(buf);
|
||||
|
||||
@ -825,7 +825,7 @@ switch_map_find(service, maptype, mapreturn)
|
||||
char *maptype[MAXMAPSTACK];
|
||||
short mapreturn[MAXMAPACTIONS];
|
||||
{
|
||||
int svcno;
|
||||
int svcno = 0;
|
||||
int save_errno = errno;
|
||||
|
||||
#ifdef _USE_SUN_NSSWITCH_
|
||||
@ -845,7 +845,7 @@ switch_map_find(service, maptype, mapreturn)
|
||||
else
|
||||
lk = nsw_conf->lookups;
|
||||
svcno = 0;
|
||||
while (lk != NULL)
|
||||
while (lk != NULL && svcno < MAXMAPSTACK)
|
||||
{
|
||||
maptype[svcno] = lk->service_name;
|
||||
if (lk->actions[__NSW_NOTFOUND] == __NSW_RETURN)
|
||||
@ -882,7 +882,7 @@ switch_map_find(service, maptype, mapreturn)
|
||||
errno = save_errno;
|
||||
return -1;
|
||||
}
|
||||
for (svcno = 0; svcno < SVC_PATHSIZE; svcno++)
|
||||
for (svcno = 0; svcno < SVC_PATHSIZE && svcno < MAXMAPSTACK; svcno++)
|
||||
{
|
||||
switch (svcinfo->svcpath[svc][svcno])
|
||||
{
|
||||
@ -1512,6 +1512,7 @@ init_vendor_macros(e)
|
||||
#define LA_KSTAT 12 /* special Solaris kstat(3k) implementation */
|
||||
#define LA_DEVSHORT 13 /* read short from a device */
|
||||
#define LA_ALPHAOSF 14 /* Digital UNIX (OSF/1 on Alpha) table() call */
|
||||
#define LA_PSET 15 /* Solaris per-processor-set load average */
|
||||
|
||||
/* do guesses based on general OS type */
|
||||
#ifndef LA_TYPE
|
||||
@ -2069,6 +2070,28 @@ int getla()
|
||||
|
||||
#endif /* LA_TYPE == LA_ALPHAOSF */
|
||||
|
||||
#if LA_TYPE == LA_PSET
|
||||
|
||||
static int
|
||||
getla()
|
||||
{
|
||||
double avenrun[3];
|
||||
|
||||
if (pset_getloadavg(PS_MYID, avenrun,
|
||||
sizeof(avenrun) / sizeof(avenrun[0])) < 0)
|
||||
{
|
||||
if (tTd(3, 1))
|
||||
dprintf("getla: pset_getloadavg failed: %s",
|
||||
errstring(errno));
|
||||
return -1;
|
||||
}
|
||||
if (tTd(3, 1))
|
||||
dprintf("getla: %d\n", (int) (avenrun[0] +0.5));
|
||||
return ((int) (avenrun[0] + 0.5));
|
||||
}
|
||||
|
||||
#endif /* LA_TYPE == LA_PSET */
|
||||
|
||||
#if LA_TYPE == LA_ZERO
|
||||
|
||||
static int
|
||||
@ -2228,35 +2251,12 @@ refuseconnections(name, e, d)
|
||||
ENVELOPE *e;
|
||||
int d;
|
||||
{
|
||||
time_t now;
|
||||
static time_t lastconn[MAXDAEMONS];
|
||||
static int conncnt[MAXDAEMONS];
|
||||
|
||||
|
||||
#ifdef XLA
|
||||
if (!xla_smtp_ok())
|
||||
return TRUE;
|
||||
#endif /* XLA */
|
||||
|
||||
now = curtime();
|
||||
if (now != lastconn[d])
|
||||
{
|
||||
lastconn[d] = now;
|
||||
conncnt[d] = 0;
|
||||
}
|
||||
else if (conncnt[d]++ > ConnRateThrottle && ConnRateThrottle > 0)
|
||||
{
|
||||
/* sleep to flatten out connection load */
|
||||
sm_setproctitle(TRUE, e, "deferring connections on daemon %s: %d per second",
|
||||
name, ConnRateThrottle);
|
||||
if (LogLevel >= 9)
|
||||
sm_syslog(LOG_INFO, NOQID,
|
||||
"deferring connections on daemon %s: %d per second",
|
||||
name, ConnRateThrottle);
|
||||
(void) sleep(1);
|
||||
}
|
||||
|
||||
CurrentLA = getla();
|
||||
CurrentLA = sm_getla(NULL);
|
||||
if (RefuseLA > 0 && CurrentLA >= RefuseLA)
|
||||
{
|
||||
sm_setproctitle(TRUE, e, "rejecting connections on daemon %s: load average: %d",
|
||||
@ -2473,7 +2473,7 @@ setproctitle(fmt, va_alist)
|
||||
if (kmem < 0 || kmempid != getpid())
|
||||
{
|
||||
if (kmem >= 0)
|
||||
close(kmem);
|
||||
(void) close(kmem);
|
||||
kmem = open(_PATH_KMEM, O_RDWR, 0);
|
||||
if (kmem < 0)
|
||||
return;
|
||||
@ -3629,6 +3629,7 @@ transienterror(err)
|
||||
** type -- type of the lock. Bits can be:
|
||||
** LOCK_EX -- exclusive lock.
|
||||
** LOCK_NB -- non-blocking.
|
||||
** LOCK_UN -- unlock.
|
||||
**
|
||||
** Returns:
|
||||
** TRUE if the lock was acquired.
|
||||
@ -4137,7 +4138,7 @@ validate_connection(sap, hostname, e)
|
||||
hostname, anynet_ntoa(sap));
|
||||
|
||||
if (rscheck("check_relay", hostname, anynet_ntoa(sap),
|
||||
e, TRUE, TRUE, 4) != EX_OK)
|
||||
e, TRUE, TRUE, 4, NULL) != EX_OK)
|
||||
{
|
||||
static char reject[BUFSIZ*2];
|
||||
extern char MsgBuf[];
|
||||
@ -4379,6 +4380,20 @@ getipnodebyaddr(addr, len, family, err)
|
||||
*err = h_errno;
|
||||
return h;
|
||||
}
|
||||
|
||||
# if _FFR_FREEHOSTENT
|
||||
void
|
||||
freehostent(h)
|
||||
struct hostent *h;
|
||||
{
|
||||
/*
|
||||
** Stub routine -- if they don't have getipnodeby*(),
|
||||
** they probably don't have the free routine either.
|
||||
*/
|
||||
|
||||
return;
|
||||
}
|
||||
# endif /* _FFR_FREEHOSTENT */
|
||||
#endif /* NEEDSGETIPNODE && NETINET6 && __RES < 19990909 */
|
||||
|
||||
struct hostent *
|
||||
@ -4435,9 +4450,12 @@ sm_gethostbyname(name, family)
|
||||
|
||||
nmaps = switch_map_find("hosts", maptype, mapreturn);
|
||||
while (--nmaps >= 0)
|
||||
{
|
||||
if (strcmp(maptype[nmaps], "nis") == 0 ||
|
||||
strcmp(maptype[nmaps], "files") == 0)
|
||||
break;
|
||||
}
|
||||
|
||||
if (nmaps >= 0)
|
||||
{
|
||||
/* try short name */
|
||||
@ -4668,14 +4686,16 @@ add_hostnames(sa)
|
||||
#if NETINET
|
||||
case AF_INET:
|
||||
hp = sm_gethostbyaddr((char *) &sa->sin.sin_addr,
|
||||
sizeof(sa->sin.sin_addr), sa->sa.sa_family);
|
||||
sizeof(sa->sin.sin_addr),
|
||||
sa->sa.sa_family);
|
||||
break;
|
||||
#endif /* NETINET */
|
||||
|
||||
#if NETINET6
|
||||
case AF_INET6:
|
||||
hp = sm_gethostbyaddr((char *) &sa->sin6.sin6_addr,
|
||||
sizeof(sa->sin6.sin6_addr), sa->sa.sa_family);
|
||||
sizeof(sa->sin6.sin6_addr),
|
||||
sa->sa.sa_family);
|
||||
break;
|
||||
#endif /* NETINET6 */
|
||||
|
||||
@ -4748,6 +4768,9 @@ add_hostnames(sa)
|
||||
*ha);
|
||||
}
|
||||
}
|
||||
#if _FFR_FREEHOSTENT && NETINET6
|
||||
freehostent(hp);
|
||||
#endif /* _FFR_FREEHOSTENT && NETINET6 */
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
@ -4816,7 +4839,7 @@ load_if_names()
|
||||
|
||||
if (numifs <= 0)
|
||||
{
|
||||
close(s);
|
||||
(void) close(s);
|
||||
return;
|
||||
}
|
||||
lifc.lifc_len = numifs * sizeof (struct lifreq);
|
||||
@ -4827,7 +4850,8 @@ load_if_names()
|
||||
{
|
||||
if (tTd(0, 4))
|
||||
dprintf("SIOCGLIFCONF failed: %s\n", errstring(errno));
|
||||
close(s);
|
||||
(void) close(s);
|
||||
free(lifc.lifc_buf);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -4860,7 +4884,10 @@ load_if_names()
|
||||
|
||||
s = socket(af, SOCK_DGRAM, 0);
|
||||
if (s == -1)
|
||||
{
|
||||
free(lifc.lifc_buf);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
** If we don't have a complete ifr structure,
|
||||
@ -4909,7 +4936,18 @@ load_if_names()
|
||||
{
|
||||
case AF_INET6:
|
||||
ia6 = sa->sin6.sin6_addr;
|
||||
if (ia6.s6_addr == in6addr_any.s6_addr)
|
||||
# ifdef __KAME__
|
||||
/* convert into proper scoped address - */
|
||||
if ((IN6_IS_ADDR_LINKLOCAL(&ia6) ||
|
||||
IN6_IS_ADDR_SITELOCAL(&ia6)) &&
|
||||
sa->sin6.sin6_scope_id == 0)
|
||||
{
|
||||
sa->sin6.sin6_scope_id = ntohs(ia6.s6_addr[3] |
|
||||
((unsigned int) ia6.s6_addr[2] << 8));
|
||||
ia6.s6_addr[2] = ia6.s6_addr[3] = 0;
|
||||
}
|
||||
# endif /* __KAME__ */
|
||||
if (IN6_IS_ADDR_UNSPECIFIED(&ia6))
|
||||
{
|
||||
addr = anynet_ntop(&ia6, buf6, sizeof buf6);
|
||||
message("WARNING: interface %s is UP with %s address",
|
||||
@ -4960,7 +4998,7 @@ load_if_names()
|
||||
(void) add_hostnames(sa);
|
||||
}
|
||||
free(lifc.lifc_buf);
|
||||
close(s);
|
||||
(void) close(s);
|
||||
#else /* NETINET6 && defined(SIOCGLIFCONF) */
|
||||
# if defined(SIOCGIFCONF) && !SIOCGIFCONF_IS_BROKEN
|
||||
int s;
|
||||
@ -5092,7 +5130,7 @@ load_if_names()
|
||||
# if NETINET6
|
||||
case AF_INET6:
|
||||
ia6 = sa->sin6.sin6_addr;
|
||||
if (ia6.s6_addr == in6addr_any.s6_addr)
|
||||
if (IN6_IS_ADDR_UNSPECIFIED(&ia6))
|
||||
{
|
||||
addr = anynet_ntop(&ia6, buf6, sizeof buf6);
|
||||
message("WARNING: interface %s is UP with %s address",
|
||||
|
@ -10,7 +10,7 @@
|
||||
* the sendmail distribution.
|
||||
*
|
||||
*
|
||||
* $Id: conf.h,v 8.496.4.25 2000/08/08 23:50:40 ca Exp $
|
||||
* $Id: conf.h,v 8.496.4.32 2000/12/15 19:20:53 gshapiro Exp $
|
||||
*/
|
||||
|
||||
/*
|
||||
@ -90,6 +90,7 @@ struct rusage; /* forward declaration to get gcc to shut up in wait.h */
|
||||
#define MAXSHORTSTR 203 /* max short string length */
|
||||
#define MAXMACNAMELEN 25 /* max macro name length */
|
||||
#define MAXMACROID 0377 /* max macro id number */
|
||||
/* Must match (BITMAPBITS - 1) */
|
||||
#ifndef MAXHDRSLEN
|
||||
# define MAXHDRSLEN (32 * 1024) /* max size of message headers */
|
||||
#endif /* ! MAXHDRSLEN */
|
||||
@ -526,12 +527,19 @@ typedef int pid_t;
|
||||
# if SOLARIS >= 20600 || (SOLARIS < 10000 && SOLARIS >= 206)
|
||||
# define HASSNPRINTF 1 /* has snprintf starting in 2.6 */
|
||||
# else /* SOLARIS >= 20600 || (SOLARIS < 10000 && SOLARIS >= 206) */
|
||||
typedef int int32_t;
|
||||
# if _FFR_MILTER
|
||||
# define SM_INT32 int /* 32bit integer */
|
||||
# endif /* _FFR_MILTER */
|
||||
# endif /* SOLARIS >= 20600 || (SOLARIS < 10000 && SOLARIS >= 206) */
|
||||
# if SOLARIS >= 20700 || (SOLARIS < 10000 && SOLARIS >= 207)
|
||||
# ifndef LA_TYPE
|
||||
# include <sys/loadavg.h>
|
||||
# define LA_TYPE LA_SUBR /* getloadavg(3c) appears in 2.7 */
|
||||
# if SOLARIS >= 20900 || (SOLARIS < 10000 && SOLARIS >= 209)
|
||||
# include <sys/pset.h>
|
||||
# define LA_TYPE LA_PSET /* pset_getloadavg(3c) appears in 2.9 */
|
||||
# else
|
||||
# define LA_TYPE LA_SUBR /* getloadavg(3c) appears in 2.7 */
|
||||
# endif /* SOLARIS >= 20900 || (SOLARIS < 10000 && SOLARIS >= 209) */
|
||||
# endif /* ! LA_TYPE */
|
||||
# define HASGETUSERSHELL 1 /* getusershell(3c) bug fixed in 2.7 */
|
||||
# endif /* SOLARIS >= 20700 || (SOLARIS < 10000 && SOLARIS >= 207) */
|
||||
@ -1698,6 +1706,7 @@ typedef int pid_t;
|
||||
# define __svr4__
|
||||
# define SYS5SIGNALS 1
|
||||
# define HASSETSID 1
|
||||
# define HASSNPRINTF 1
|
||||
# define HASSETREUID 1
|
||||
# define HASWAITPID 1
|
||||
# define HASGETDTABLESIZE 1
|
||||
@ -1717,6 +1726,7 @@ typedef int pid_t;
|
||||
# ifndef _PATH_SENDMAILPID
|
||||
# define _PATH_SENDMAILPID "/etc/sendmail.pid"
|
||||
# endif /* ! _PATH_SENDMAILPID */
|
||||
# undef offsetof /* avoid stddefs.h, sys/sysmacros.h conflict */
|
||||
#endif /* __svr5__ */
|
||||
|
||||
/* ###################################################################### */
|
||||
|
@ -9,7 +9,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: control.c,v 8.44.14.8 2000/09/17 17:04:26 gshapiro Exp $";
|
||||
static char id[] = "@(#)$Id: control.c,v 8.44.14.13 2000/12/28 21:25:52 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#include <sendmail.h>
|
||||
@ -77,16 +77,26 @@ opencontrolsocket()
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (geteuid() == 0 && TrustedUid != 0)
|
||||
if (geteuid() == 0)
|
||||
{
|
||||
if (chown(ControlSocketName, TrustedUid, -1) < 0)
|
||||
uid_t u = 0;
|
||||
|
||||
if (RunAsUid != 0)
|
||||
u = RunAsUid;
|
||||
else if (TrustedUid != 0)
|
||||
u = TrustedUid;
|
||||
|
||||
if (u != 0 &&
|
||||
chown(ControlSocketName, u, -1) < 0)
|
||||
{
|
||||
save_errno = errno;
|
||||
sm_syslog(LOG_ALERT, NOQID,
|
||||
"ownership change on %s failed: %s",
|
||||
ControlSocketName, errstring(save_errno));
|
||||
message("050 ownership change on %s failed: %s",
|
||||
ControlSocketName, errstring(save_errno));
|
||||
"ownership change on %s to uid %d failed: %s",
|
||||
ControlSocketName, (int) u,
|
||||
errstring(save_errno));
|
||||
message("050 ownership change on %s to uid %d failed: %s",
|
||||
ControlSocketName, (int) u,
|
||||
errstring(save_errno));
|
||||
closecontrolsocket(TRUE);
|
||||
errno = save_errno;
|
||||
return -1;
|
||||
@ -141,8 +151,8 @@ closecontrolsocket(fullclose)
|
||||
ControlSocket = -1;
|
||||
}
|
||||
|
||||
rval = safefile(ControlSocketName, RunAsUid, RunAsGid, RunAsUserName,
|
||||
sff, S_IRUSR|S_IWUSR, NULL);
|
||||
rval = safefile(ControlSocketName, RunAsUid, RunAsGid,
|
||||
RunAsUserName, sff, S_IRUSR|S_IWUSR, NULL);
|
||||
|
||||
/* if not safe, don't unlink */
|
||||
if (rval != 0)
|
||||
|
@ -16,9 +16,9 @@
|
||||
|
||||
#ifndef lint
|
||||
# ifdef DAEMON
|
||||
static char id[] = "@(#)$Id: daemon.c,v 8.401.4.18 2000/09/21 21:52:16 ca Exp $ (with daemon mode)";
|
||||
static char id[] = "@(#)$Id: daemon.c,v 8.401.4.41 2000/12/28 23:46:43 gshapiro Exp $ (with daemon mode)";
|
||||
# else /* DAEMON */
|
||||
static char id[] = "@(#)$Id: daemon.c,v 8.401.4.18 2000/09/21 21:52:16 ca Exp $ (without daemon mode)";
|
||||
static char id[] = "@(#)$Id: daemon.c,v 8.401.4.41 2000/12/28 23:46:43 gshapiro Exp $ (without daemon mode)";
|
||||
# endif /* DAEMON */
|
||||
#endif /* ! lint */
|
||||
|
||||
@ -162,8 +162,6 @@ getrequests(e)
|
||||
# endif /* NETUNIX */
|
||||
extern ENVELOPE BlankEnvelope;
|
||||
|
||||
#define D(x,idx) x[idx]
|
||||
|
||||
|
||||
for (idx = 0; idx < ndaemons; idx++)
|
||||
{
|
||||
@ -171,6 +169,7 @@ getrequests(e)
|
||||
Daemons[idx].d_firsttime = TRUE;
|
||||
Daemons[idx].d_refuse_connections_until = (time_t) 0;
|
||||
}
|
||||
|
||||
/*
|
||||
** Try to actually open the connection.
|
||||
*/
|
||||
@ -178,9 +177,11 @@ getrequests(e)
|
||||
if (tTd(15, 1))
|
||||
{
|
||||
for (idx = 0; idx < ndaemons; idx++)
|
||||
{
|
||||
dprintf("getrequests: daemon %s: port %d\n",
|
||||
Daemons[idx].d_name,
|
||||
ntohs(Daemons[idx].d_port));
|
||||
}
|
||||
}
|
||||
|
||||
/* get a socket for the SMTP connection */
|
||||
@ -225,72 +226,124 @@ getrequests(e)
|
||||
bool control = FALSE;
|
||||
int save_errno;
|
||||
int pipefd[2];
|
||||
time_t timenow;
|
||||
# if STARTTLS
|
||||
long seed;
|
||||
time_t timenow;
|
||||
# endif /* STARTTLS */
|
||||
extern bool refuseconnections __P((char *, ENVELOPE *, int));
|
||||
|
||||
/* see if we are rejecting connections */
|
||||
(void) blocksignal(SIGALRM);
|
||||
|
||||
timenow = curtime();
|
||||
|
||||
/*
|
||||
** Use ConnRateThrottle only if the
|
||||
** last pass was for a connection
|
||||
*/
|
||||
|
||||
if (ConnRateThrottle > 0 && curdaemon >= 0)
|
||||
{
|
||||
static int conncnt = 0;
|
||||
static time_t lastconn = 0;
|
||||
|
||||
if (timenow != lastconn)
|
||||
{
|
||||
lastconn = timenow;
|
||||
conncnt = 1;
|
||||
}
|
||||
else if (++conncnt > ConnRateThrottle)
|
||||
{
|
||||
/* sleep to flatten out connection load */
|
||||
sm_setproctitle(TRUE, e,
|
||||
"deferring connections: %d per second",
|
||||
ConnRateThrottle);
|
||||
if (LogLevel >= 9)
|
||||
sm_syslog(LOG_INFO, NOQID,
|
||||
"deferring connections: %d per second",
|
||||
ConnRateThrottle);
|
||||
(void) sleep(1);
|
||||
}
|
||||
}
|
||||
|
||||
for (idx = 0; idx < ndaemons; idx++)
|
||||
{
|
||||
if (curtime() < Daemons[idx].d_refuse_connections_until)
|
||||
if (timenow < Daemons[idx].d_refuse_connections_until)
|
||||
continue;
|
||||
if (refuseconnections(Daemons[idx].d_name, e, idx))
|
||||
{
|
||||
if (Daemons[idx].d_socket >= 0)
|
||||
{
|
||||
/* close socket so peer fails quickly */
|
||||
(void) close(Daemons[idx].d_socket);
|
||||
Daemons[idx].d_socket = -1;
|
||||
/* close socket so peer fails quickly */
|
||||
(void) close(Daemons[idx].d_socket);
|
||||
Daemons[idx].d_socket = -1;
|
||||
}
|
||||
|
||||
/* refuse connections for next 15 seconds */
|
||||
Daemons[idx].d_refuse_connections_until = curtime() + 15;
|
||||
Daemons[idx].d_refuse_connections_until = timenow + 15;
|
||||
}
|
||||
else if (Daemons[idx].d_socket < 0 ||
|
||||
Daemons[idx].d_firsttime)
|
||||
{
|
||||
if (!Daemons[idx].d_firsttime && LogLevel >= 9)
|
||||
sm_syslog(LOG_INFO, NOQID,
|
||||
"accepting connections again for daemon %s",
|
||||
Daemons[idx].d_name);
|
||||
if (!Daemons[idx].d_firsttime && LogLevel >= 9)
|
||||
sm_syslog(LOG_INFO, NOQID,
|
||||
"accepting connections again for daemon %s",
|
||||
Daemons[idx].d_name);
|
||||
|
||||
/* arrange to (re)open the socket if needed */
|
||||
(void) opendaemonsocket(&Daemons[idx], FALSE);
|
||||
Daemons[idx].d_firsttime = FALSE;
|
||||
/* arrange to (re)open the socket if needed */
|
||||
(void) opendaemonsocket(&Daemons[idx], FALSE);
|
||||
Daemons[idx].d_firsttime = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
if (curtime() >= last_disk_space_check)
|
||||
if (timenow >= last_disk_space_check)
|
||||
{
|
||||
bool logged = FALSE;
|
||||
|
||||
if (!enoughdiskspace(MinBlocksFree + 1, FALSE))
|
||||
{
|
||||
if (!bitnset(D_ETRNONLY, Daemons[idx].d_flags))
|
||||
for (idx = 0; idx < ndaemons; idx++)
|
||||
{
|
||||
/* log only if not logged before */
|
||||
if (LogLevel >= 9)
|
||||
sm_syslog(LOG_INFO, NOQID,
|
||||
"rejecting new messages: min free: %ld",
|
||||
MinBlocksFree);
|
||||
sm_setproctitle(TRUE, e,
|
||||
"rejecting new messages: min free: %ld",
|
||||
MinBlocksFree);
|
||||
setbitn(D_ETRNONLY, Daemons[idx].d_flags);
|
||||
if (!bitnset(D_ETRNONLY, Daemons[idx].d_flags))
|
||||
{
|
||||
/* log only if not logged before */
|
||||
if (!logged)
|
||||
{
|
||||
if (LogLevel >= 9)
|
||||
sm_syslog(LOG_INFO, NOQID,
|
||||
"rejecting new messages: min free: %ld",
|
||||
MinBlocksFree);
|
||||
logged = TRUE;
|
||||
sm_setproctitle(TRUE, e,
|
||||
"rejecting new messages: min free: %ld",
|
||||
MinBlocksFree);
|
||||
}
|
||||
setbitn(D_ETRNONLY, Daemons[idx].d_flags);
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (bitnset(D_ETRNONLY, Daemons[idx].d_flags))
|
||||
else
|
||||
{
|
||||
/* log only if not logged before */
|
||||
if (LogLevel >= 9)
|
||||
sm_syslog(LOG_INFO, NOQID,
|
||||
"accepting new messages (again)");
|
||||
/* title will be set below */
|
||||
clrbitn(D_ETRNONLY, Daemons[idx].d_flags);
|
||||
for (idx = 0; idx < ndaemons; idx++)
|
||||
{
|
||||
if (bitnset(D_ETRNONLY, Daemons[idx].d_flags))
|
||||
{
|
||||
/* log only if not logged before */
|
||||
if (!logged)
|
||||
{
|
||||
if (LogLevel >= 9)
|
||||
sm_syslog(LOG_INFO, NOQID,
|
||||
"accepting new messages (again)");
|
||||
logged = TRUE;
|
||||
}
|
||||
|
||||
/* title will be set below */
|
||||
clrbitn(D_ETRNONLY, Daemons[idx].d_flags);
|
||||
}
|
||||
}
|
||||
}
|
||||
/* only check disk space once a minute */
|
||||
last_disk_space_check = curtime() + 60;
|
||||
last_disk_space_check = timenow + 60;
|
||||
}
|
||||
|
||||
# if XDEBUG
|
||||
@ -331,6 +384,7 @@ getrequests(e)
|
||||
|
||||
for (;;)
|
||||
{
|
||||
bool setproc = FALSE;
|
||||
int highest = -1;
|
||||
fd_set readfds;
|
||||
struct timeval timeout;
|
||||
@ -342,10 +396,13 @@ getrequests(e)
|
||||
/* wait for a connection */
|
||||
if (Daemons[idx].d_socket >= 0)
|
||||
{
|
||||
if (!bitnset(D_ETRNONLY, Daemons[idx].d_flags))
|
||||
if (!setproc &&
|
||||
!bitnset(D_ETRNONLY,
|
||||
Daemons[idx].d_flags))
|
||||
{
|
||||
sm_setproctitle(TRUE, e,
|
||||
"accepting connections");
|
||||
setproc = TRUE;
|
||||
}
|
||||
if (Daemons[idx].d_socket > highest)
|
||||
highest = Daemons[idx].d_socket;
|
||||
@ -367,6 +424,7 @@ getrequests(e)
|
||||
** to 5 seconds (so it might get reopened soon),
|
||||
** otherwise (all sockets open) 60.
|
||||
*/
|
||||
|
||||
idx = 0;
|
||||
while (idx < ndaemons && Daemons[idx].d_socket >= 0)
|
||||
idx++;
|
||||
@ -379,8 +437,12 @@ getrequests(e)
|
||||
t = select(highest + 1, FDSET_CAST &readfds,
|
||||
NULL, NULL, &timeout);
|
||||
|
||||
|
||||
|
||||
if (DoQueueRun)
|
||||
(void) runqueue(TRUE, FALSE);
|
||||
|
||||
curdaemon = -1;
|
||||
if (t <= 0)
|
||||
{
|
||||
timedout = TRUE;
|
||||
@ -389,7 +451,6 @@ getrequests(e)
|
||||
|
||||
control = FALSE;
|
||||
errno = 0;
|
||||
curdaemon = -1;
|
||||
|
||||
/* look "round-robin" for an active socket */
|
||||
if ((idx = olddaemon + 1) >= ndaemons)
|
||||
@ -411,7 +472,7 @@ getrequests(e)
|
||||
}
|
||||
# if NETUNIX
|
||||
if (curdaemon == -1 && ControlSocket >= 0 &&
|
||||
FD_ISSET(ControlSocket, &readfds))
|
||||
FD_ISSET(ControlSocket, &readfds))
|
||||
{
|
||||
struct sockaddr_un sa_un;
|
||||
|
||||
@ -421,6 +482,12 @@ getrequests(e)
|
||||
&lotherend);
|
||||
control = TRUE;
|
||||
}
|
||||
# else /* NETUNIX */
|
||||
if (curdaemon == -1)
|
||||
{
|
||||
/* No daemon to service */
|
||||
continue;
|
||||
}
|
||||
# endif /* NETUNIX */
|
||||
if (t >= 0 || errno != EINTR)
|
||||
break;
|
||||
@ -431,6 +498,7 @@ getrequests(e)
|
||||
continue;
|
||||
}
|
||||
save_errno = errno;
|
||||
timenow = curtime();
|
||||
(void) blocksignal(SIGALRM);
|
||||
if (t < 0)
|
||||
{
|
||||
@ -447,7 +515,7 @@ getrequests(e)
|
||||
** force accept() to fail on affected systems.
|
||||
*/
|
||||
|
||||
Daemons[curdaemon].d_refuse_connections_until = curtime() + 15;
|
||||
Daemons[curdaemon].d_refuse_connections_until = timenow + 15;
|
||||
# endif /* SO_REUSEADDR_IS_BROKEN */
|
||||
continue;
|
||||
}
|
||||
@ -521,13 +589,13 @@ getrequests(e)
|
||||
seed = get_random();
|
||||
RAND_seed((void *) &last_disk_space_check,
|
||||
sizeof last_disk_space_check);
|
||||
timenow = curtime();
|
||||
RAND_seed((void *) &timenow, sizeof timenow);
|
||||
RAND_seed((void *) &seed, sizeof seed);
|
||||
# else /* STARTTLS */
|
||||
(void) get_random();
|
||||
# endif /* STARTTLS */
|
||||
|
||||
#ifndef DEBUG_NO_FORK
|
||||
/*
|
||||
** Create a pipe to keep the child from writing to the
|
||||
** socket until after the parent has closed it. Otherwise
|
||||
@ -552,6 +620,9 @@ getrequests(e)
|
||||
(void) close(t);
|
||||
continue;
|
||||
}
|
||||
#else /* ! DEBUG_NO_FORK */
|
||||
pid = 0;
|
||||
#endif /* ! DEBUG_NO_FORK */
|
||||
|
||||
if (pid == 0)
|
||||
{
|
||||
@ -608,6 +679,7 @@ getrequests(e)
|
||||
anynet_ntoa(&RealHostAddr));
|
||||
}
|
||||
|
||||
#ifndef DEBUG_NO_FORK
|
||||
if (pipefd[0] != -1)
|
||||
{
|
||||
auto char c;
|
||||
@ -629,6 +701,7 @@ getrequests(e)
|
||||
continue;
|
||||
(void) close(pipefd[0]);
|
||||
}
|
||||
#endif /* ! DEBUG_NO_FORK */
|
||||
|
||||
/* control socket processing */
|
||||
if (control)
|
||||
@ -1045,10 +1118,12 @@ setsockaddroptions(p, d)
|
||||
struct daemon *d;
|
||||
{
|
||||
# if NETISO
|
||||
short port;
|
||||
short portno;
|
||||
# endif /* NETISO */
|
||||
int l;
|
||||
char *h, *flags;
|
||||
char *port = NULL;
|
||||
char *addr = NULL;
|
||||
|
||||
# if NETINET
|
||||
if (d->d_addr.sa.sa_family == AF_UNSPEC)
|
||||
@ -1107,152 +1182,11 @@ setsockaddroptions(p, d)
|
||||
break;
|
||||
|
||||
case 'A': /* address */
|
||||
switch (d->d_addr.sa.sa_family)
|
||||
{
|
||||
# if NETINET
|
||||
case AF_INET:
|
||||
if (!isascii(*v) || !isdigit(*v) ||
|
||||
((d->d_addr.sin.sin_addr.s_addr = inet_addr(v)) == INADDR_NONE))
|
||||
{
|
||||
register struct hostent *hp;
|
||||
|
||||
hp = sm_gethostbyname(v, AF_INET);
|
||||
if (hp == NULL)
|
||||
syserr("554 5.3.0 host \"%s\" unknown",
|
||||
v);
|
||||
else
|
||||
{
|
||||
while (*(hp->h_addr_list) &&
|
||||
hp->h_addrtype != AF_INET)
|
||||
hp->h_addr_list++;
|
||||
if (*(hp->h_addr_list) == NULL)
|
||||
syserr("554 5.3.0 host \"%s\" unknown",
|
||||
v);
|
||||
else
|
||||
memmove(&d->d_addr.sin.sin_addr,
|
||||
*(hp->h_addr_list),
|
||||
INADDRSZ);
|
||||
}
|
||||
}
|
||||
break;
|
||||
# endif /* NETINET */
|
||||
|
||||
# if NETINET6
|
||||
case AF_INET6:
|
||||
if (!isascii(*v) || !isxdigit(*v) ||
|
||||
inet_pton(AF_INET6, v,
|
||||
&d->d_addr.sin6.sin6_addr) != 1)
|
||||
{
|
||||
register struct hostent *hp;
|
||||
|
||||
hp = sm_gethostbyname(v, AF_INET6);
|
||||
if (hp == NULL)
|
||||
syserr("554 5.3.0 host \"%s\" unknown",
|
||||
v);
|
||||
else
|
||||
{
|
||||
while (*(hp->h_addr_list) &&
|
||||
hp->h_addrtype != AF_INET6)
|
||||
hp->h_addr_list++;
|
||||
if (*(hp->h_addr_list) == NULL)
|
||||
syserr("554 5.3.0 host \"%s\" unknown",
|
||||
v);
|
||||
else
|
||||
memmove(&d->d_addr.sin6.sin6_addr,
|
||||
*(hp->h_addr_list),
|
||||
IN6ADDRSZ);
|
||||
}
|
||||
}
|
||||
break;
|
||||
# endif /* NETINET6 */
|
||||
|
||||
default:
|
||||
syserr("554 5.3.5 address= option unsupported for family %d",
|
||||
d->d_addr.sa.sa_family);
|
||||
break;
|
||||
}
|
||||
addr = v;
|
||||
break;
|
||||
|
||||
case 'P': /* port */
|
||||
switch (d->d_addr.sa.sa_family)
|
||||
{
|
||||
# if NETINET
|
||||
case AF_INET:
|
||||
if (isascii(*v) && isdigit(*v))
|
||||
d->d_addr.sin.sin_port = htons((u_short)atoi((const char *)v));
|
||||
else
|
||||
{
|
||||
# ifdef NO_GETSERVBYNAME
|
||||
syserr("554 5.3.5 invalid port number: %s",
|
||||
v);
|
||||
# else /* NO_GETSERVBYNAME */
|
||||
register struct servent *sp;
|
||||
|
||||
sp = getservbyname(v, "tcp");
|
||||
if (sp == NULL)
|
||||
syserr("554 5.3.5 service \"%s\" unknown",
|
||||
v);
|
||||
else
|
||||
d->d_addr.sin.sin_port = sp->s_port;
|
||||
# endif /* NO_GETSERVBYNAME */
|
||||
}
|
||||
break;
|
||||
# endif /* NETINET */
|
||||
|
||||
# if NETINET6
|
||||
case AF_INET6:
|
||||
if (isascii(*v) && isdigit(*v))
|
||||
d->d_addr.sin6.sin6_port = htons((u_short)atoi(v));
|
||||
else
|
||||
{
|
||||
# ifdef NO_GETSERVBYNAME
|
||||
syserr("554 5.3.5 invalid port number: %s",
|
||||
v);
|
||||
# else /* NO_GETSERVBYNAME */
|
||||
register struct servent *sp;
|
||||
|
||||
sp = getservbyname(v, "tcp");
|
||||
if (sp == NULL)
|
||||
syserr("554 5.3.5 service \"%s\" unknown",
|
||||
v);
|
||||
else
|
||||
d->d_addr.sin6.sin6_port = sp->s_port;
|
||||
# endif /* NO_GETSERVBYNAME */
|
||||
}
|
||||
break;
|
||||
# endif /* NETINET6 */
|
||||
|
||||
# if NETISO
|
||||
case AF_ISO:
|
||||
/* assume two byte transport selector */
|
||||
if (isascii(*v) && isdigit(*v))
|
||||
port = htons((u_short)atoi(v));
|
||||
else
|
||||
{
|
||||
# ifdef NO_GETSERVBYNAME
|
||||
syserr("554 5.3.5 invalid port number: %s",
|
||||
v);
|
||||
# else /* NO_GETSERVBYNAME */
|
||||
register struct servent *sp;
|
||||
|
||||
sp = getservbyname(v, "tcp");
|
||||
if (sp == NULL)
|
||||
syserr("554 5.3.5 service \"%s\" unknown",
|
||||
v);
|
||||
else
|
||||
port = sp->s_port;
|
||||
# endif /* NO_GETSERVBYNAME */
|
||||
}
|
||||
memmove(TSEL(&d->d_addr.siso),
|
||||
(char *) &port, 2);
|
||||
break;
|
||||
# endif /* NETISO */
|
||||
|
||||
default:
|
||||
syserr("554 5.3.5 Port= option unsupported for family %d",
|
||||
d->d_addr.sa.sa_family);
|
||||
break;
|
||||
}
|
||||
port = v;
|
||||
break;
|
||||
|
||||
case 'L': /* listen queue size */
|
||||
@ -1278,7 +1212,7 @@ setsockaddroptions(p, d)
|
||||
*flags++ = '\0';
|
||||
for (; *v != '\0'; v++)
|
||||
if (!(isascii(*v) && isspace(*v)))
|
||||
setbitn(*v, d->d_flags);
|
||||
setbitn(bitidx(*v), d->d_flags);
|
||||
break;
|
||||
|
||||
case 'S': /* send buffer size */
|
||||
@ -1298,6 +1232,167 @@ setsockaddroptions(p, d)
|
||||
f);
|
||||
}
|
||||
}
|
||||
|
||||
/* Check addr and port after finding family */
|
||||
if (addr != NULL)
|
||||
{
|
||||
switch (d->d_addr.sa.sa_family)
|
||||
{
|
||||
# if NETINET
|
||||
case AF_INET:
|
||||
if (!isascii(*addr) || !isdigit(*addr) ||
|
||||
((d->d_addr.sin.sin_addr.s_addr = inet_addr(addr)) == INADDR_NONE))
|
||||
{
|
||||
register struct hostent *hp;
|
||||
|
||||
hp = sm_gethostbyname(addr, AF_INET);
|
||||
if (hp == NULL)
|
||||
syserr("554 5.3.0 host \"%s\" unknown",
|
||||
addr);
|
||||
else
|
||||
{
|
||||
while (*(hp->h_addr_list) != NULL &&
|
||||
hp->h_addrtype != AF_INET)
|
||||
hp->h_addr_list++;
|
||||
if (*(hp->h_addr_list) == NULL)
|
||||
syserr("554 5.3.0 host \"%s\" unknown",
|
||||
addr);
|
||||
else
|
||||
memmove(&d->d_addr.sin.sin_addr,
|
||||
*(hp->h_addr_list),
|
||||
INADDRSZ);
|
||||
# if _FFR_FREEHOSTENT && NETINET6
|
||||
freehostent(hp);
|
||||
hp = NULL;
|
||||
# endif /* _FFR_FREEHOSTENT && NETINET6 */
|
||||
}
|
||||
}
|
||||
break;
|
||||
# endif /* NETINET */
|
||||
|
||||
# if NETINET6
|
||||
case AF_INET6:
|
||||
if (!isascii(*addr) ||
|
||||
(!isxdigit(*addr) && *addr != ':') ||
|
||||
inet_pton(AF_INET6, addr,
|
||||
&d->d_addr.sin6.sin6_addr) != 1)
|
||||
{
|
||||
register struct hostent *hp;
|
||||
|
||||
hp = sm_gethostbyname(addr, AF_INET6);
|
||||
if (hp == NULL)
|
||||
syserr("554 5.3.0 host \"%s\" unknown",
|
||||
addr);
|
||||
else
|
||||
{
|
||||
while (*(hp->h_addr_list) != NULL &&
|
||||
hp->h_addrtype != AF_INET6)
|
||||
hp->h_addr_list++;
|
||||
if (*(hp->h_addr_list) == NULL)
|
||||
syserr("554 5.3.0 host \"%s\" unknown",
|
||||
addr);
|
||||
else
|
||||
memmove(&d->d_addr.sin6.sin6_addr,
|
||||
*(hp->h_addr_list),
|
||||
IN6ADDRSZ);
|
||||
# if _FFR_FREEHOSTENT
|
||||
freehostent(hp);
|
||||
hp = NULL;
|
||||
# endif /* _FFR_FREEHOSTENT */
|
||||
}
|
||||
}
|
||||
break;
|
||||
# endif /* NETINET6 */
|
||||
|
||||
default:
|
||||
syserr("554 5.3.5 address= option unsupported for family %d",
|
||||
d->d_addr.sa.sa_family);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (port != NULL)
|
||||
{
|
||||
switch (d->d_addr.sa.sa_family)
|
||||
{
|
||||
# if NETINET
|
||||
case AF_INET:
|
||||
if (isascii(*port) && isdigit(*port))
|
||||
d->d_addr.sin.sin_port = htons((u_short)atoi((const char *)port));
|
||||
else
|
||||
{
|
||||
# ifdef NO_GETSERVBYNAME
|
||||
syserr("554 5.3.5 invalid port number: %s",
|
||||
port);
|
||||
# else /* NO_GETSERVBYNAME */
|
||||
register struct servent *sp;
|
||||
|
||||
sp = getservbyname(port, "tcp");
|
||||
if (sp == NULL)
|
||||
syserr("554 5.3.5 service \"%s\" unknown",
|
||||
port);
|
||||
else
|
||||
d->d_addr.sin.sin_port = sp->s_port;
|
||||
# endif /* NO_GETSERVBYNAME */
|
||||
}
|
||||
break;
|
||||
# endif /* NETINET */
|
||||
|
||||
# if NETINET6
|
||||
case AF_INET6:
|
||||
if (isascii(*port) && isdigit(*port))
|
||||
d->d_addr.sin6.sin6_port = htons((u_short)atoi(port));
|
||||
else
|
||||
{
|
||||
# ifdef NO_GETSERVBYNAME
|
||||
syserr("554 5.3.5 invalid port number: %s",
|
||||
port);
|
||||
# else /* NO_GETSERVBYNAME */
|
||||
register struct servent *sp;
|
||||
|
||||
sp = getservbyname(port, "tcp");
|
||||
if (sp == NULL)
|
||||
syserr("554 5.3.5 service \"%s\" unknown",
|
||||
port);
|
||||
else
|
||||
d->d_addr.sin6.sin6_port = sp->s_port;
|
||||
# endif /* NO_GETSERVBYNAME */
|
||||
}
|
||||
break;
|
||||
# endif /* NETINET6 */
|
||||
|
||||
# if NETISO
|
||||
case AF_ISO:
|
||||
/* assume two byte transport selector */
|
||||
if (isascii(*port) && isdigit(*port))
|
||||
portno = htons((u_short)atoi(port));
|
||||
else
|
||||
{
|
||||
# ifdef NO_GETSERVBYNAME
|
||||
syserr("554 5.3.5 invalid port number: %s",
|
||||
port);
|
||||
# else /* NO_GETSERVBYNAME */
|
||||
register struct servent *sp;
|
||||
|
||||
sp = getservbyname(port, "tcp");
|
||||
if (sp == NULL)
|
||||
syserr("554 5.3.5 service \"%s\" unknown",
|
||||
port);
|
||||
else
|
||||
portno = sp->s_port;
|
||||
# endif /* NO_GETSERVBYNAME */
|
||||
}
|
||||
memmove(TSEL(&d->d_addr.siso),
|
||||
(char *) &portno, 2);
|
||||
break;
|
||||
# endif /* NETISO */
|
||||
|
||||
default:
|
||||
syserr("554 5.3.5 Port= option unsupported for family %d",
|
||||
d->d_addr.sa.sa_family);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*
|
||||
** SETDAEMONOPTIONS -- set options for running the MTA daemon
|
||||
@ -1494,7 +1589,7 @@ makeconnection(host, port, mci, e)
|
||||
for (; *p != '\0'; p++)
|
||||
{
|
||||
if (!(isascii(*p) && isspace(*p)))
|
||||
setbitn(*p, d_flags);
|
||||
setbitn(bitidx(*p), d_flags);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1506,7 +1601,7 @@ makeconnection(host, port, mci, e)
|
||||
/* look for just this one flag */
|
||||
if (*p == D_IFNHELO)
|
||||
{
|
||||
setbitn(*p, d_flags);
|
||||
setbitn(bitidx(*p), d_flags);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -1846,6 +1941,10 @@ gothostent:
|
||||
syserr("Can't connect to address family %d", addr.sa.sa_family);
|
||||
mci_setstat(mci, EX_NOHOST, "5.1.2", NULL);
|
||||
errno = EINVAL;
|
||||
# if _FFR_FREEHOSTENT && NETINET6
|
||||
if (hp != NULL)
|
||||
freehostent(hp);
|
||||
# endif /* _FFR_FREEHOSTENT && NETINET6 */
|
||||
return EX_NOHOST;
|
||||
}
|
||||
|
||||
@ -1856,7 +1955,13 @@ gothostent:
|
||||
# ifdef XLA
|
||||
/* if too many connections, don't bother trying */
|
||||
if (!xla_noqueue_ok(host))
|
||||
{
|
||||
# if _FFR_FREEHOSTENT && NETINET6
|
||||
if (hp != NULL)
|
||||
freehostent(hp);
|
||||
# endif /* _FFR_FREEHOSTENT && NETINET6 */
|
||||
return EX_TEMPFAIL;
|
||||
}
|
||||
# endif /* XLA */
|
||||
|
||||
firstconnect = TRUE;
|
||||
@ -1887,6 +1992,10 @@ gothostent:
|
||||
xla_host_end(host);
|
||||
# endif /* XLA */
|
||||
mci_setstat(mci, EX_TEMPFAIL, "4.4.5", NULL);
|
||||
# if _FFR_FREEHOSTENT && NETINET6
|
||||
if (hp != NULL)
|
||||
freehostent(hp);
|
||||
# endif /* _FFR_FREEHOSTENT && NETINET6 */
|
||||
errno = save_errno;
|
||||
return EX_TEMPFAIL;
|
||||
}
|
||||
@ -1960,6 +2069,10 @@ gothostent:
|
||||
errno = save_errno;
|
||||
syserr("makeconnection: cannot bind socket [%s]",
|
||||
anynet_ntoa(&clt_addr));
|
||||
# if _FFR_FREEHOSTENT && NETINET6
|
||||
if (hp != NULL)
|
||||
freehostent(hp);
|
||||
# endif /* _FFR_FREEHOSTENT && NETINET6 */
|
||||
errno = save_errno;
|
||||
return EX_TEMPFAIL;
|
||||
}
|
||||
@ -2068,6 +2181,13 @@ gothostent:
|
||||
errstring(save_errno));
|
||||
v6found = TRUE;
|
||||
family = AF_INET;
|
||||
# if _FFR_FREEHOSTENT
|
||||
if (hp != NULL)
|
||||
{
|
||||
freehostent(hp);
|
||||
hp = NULL;
|
||||
}
|
||||
# endif /* _FFR_FREEHOSTENT */
|
||||
goto v4retry;
|
||||
}
|
||||
v6tempfail:
|
||||
@ -2084,10 +2204,22 @@ gothostent:
|
||||
xla_host_end(host);
|
||||
# endif /* XLA */
|
||||
mci_setstat(mci, EX_TEMPFAIL, "4.4.1", NULL);
|
||||
# if _FFR_FREEHOSTENT && NETINET6
|
||||
if (hp != NULL)
|
||||
freehostent(hp);
|
||||
# endif /* _FFR_FREEHOSTENT && NETINET6 */
|
||||
errno = save_errno;
|
||||
return EX_TEMPFAIL;
|
||||
}
|
||||
|
||||
# if _FFR_FREEHOSTENT && NETINET6
|
||||
if (hp != NULL)
|
||||
{
|
||||
freehostent(hp);
|
||||
hp = NULL;
|
||||
}
|
||||
# endif /* _FFR_FREEHOSTENT && NETINET6 */
|
||||
|
||||
/* connection ok, put it into canonical form */
|
||||
mci->mci_out = NULL;
|
||||
if ((mci->mci_out = fdopen(s, "w")) == NULL ||
|
||||
@ -2449,7 +2581,7 @@ getauthinfo(fd, may_be_forged)
|
||||
errno = 0;
|
||||
}
|
||||
(void) snprintf(hbuf, sizeof hbuf, "%s@localhost",
|
||||
RealUserName);
|
||||
RealUserName);
|
||||
if (tTd(9, 1))
|
||||
dprintf("getauthinfo: %s\n", hbuf);
|
||||
return hbuf;
|
||||
@ -2487,6 +2619,10 @@ getauthinfo(fd, may_be_forged)
|
||||
if (addrcmp(hp, *ha, &RealHostAddr) == 0)
|
||||
break;
|
||||
*may_be_forged = *ha == NULL;
|
||||
# if _FFR_FREEHOSTENT && NETINET6
|
||||
freehostent(hp);
|
||||
hp = NULL;
|
||||
# endif /* _FFR_FREEHOSTENT && NETINET6 */
|
||||
}
|
||||
}
|
||||
|
||||
@ -2971,7 +3107,11 @@ host_map_lookup(map, name, av, statp)
|
||||
else
|
||||
{
|
||||
if ((cp = strchr(name, ']')) == NULL)
|
||||
{
|
||||
if (tTd(9, 1))
|
||||
dprintf("FAILED\n");
|
||||
return NULL;
|
||||
}
|
||||
*cp = '\0';
|
||||
|
||||
hp = NULL;
|
||||
@ -2992,6 +3132,10 @@ host_map_lookup(map, name, av, statp)
|
||||
{
|
||||
/* found a match -- copy out */
|
||||
ans = denlstring((char *) hp->h_name, TRUE, TRUE);
|
||||
# if _FFR_FREEHOSTENT && NETINET6
|
||||
freehostent(hp);
|
||||
hp = NULL;
|
||||
# endif /* _FFR_FREEHOSTENT && NETINET6 */
|
||||
}
|
||||
}
|
||||
|
||||
@ -3006,6 +3150,8 @@ host_map_lookup(map, name, av, statp)
|
||||
cp = map_rewrite(map, name, strlen(name), NULL);
|
||||
else
|
||||
cp = map_rewrite(map, ans, strlen(ans), av);
|
||||
if (tTd(9, 1))
|
||||
dprintf("FOUND %s\n", ans);
|
||||
return cp;
|
||||
}
|
||||
|
||||
@ -3176,6 +3322,9 @@ host_map_lookup(map, name, avp, statp)
|
||||
cp = map_rewrite(map, name, strlen(name), NULL);
|
||||
else
|
||||
cp = map_rewrite(map, hp->h_name, strlen(hp->h_name), avp);
|
||||
# if _FFR_FREEHOSTENT && NETINET6
|
||||
freehostent(hp);
|
||||
# endif /* _FFR_FREEHOSTENT && NETINET6 */
|
||||
return cp;
|
||||
}
|
||||
|
||||
@ -3428,8 +3577,35 @@ hostnamebyanyaddr(sap)
|
||||
&& inet_addr(hp->h_name) == INADDR_NONE
|
||||
# endif /* NETINET */
|
||||
)
|
||||
return denlstring((char *) hp->h_name, TRUE, TRUE);
|
||||
{
|
||||
char *name;
|
||||
|
||||
name = denlstring((char *) hp->h_name, TRUE, TRUE);
|
||||
|
||||
# if _FFR_FREEHOSTENT && NETINET6
|
||||
if (name == hp->h_name)
|
||||
{
|
||||
static char n[MAXNAME + 1];
|
||||
|
||||
/* Copy the string, hp->h_name is about to disappear */
|
||||
strlcpy(n, name, sizeof n);
|
||||
name = n;
|
||||
}
|
||||
|
||||
freehostent(hp);
|
||||
# endif /* _FFR_FREEHOSTENT && NETINET6 */
|
||||
return name;
|
||||
}
|
||||
# endif /* NETINET || NETINET6 */
|
||||
|
||||
# if _FFR_FREEHOSTENT && NETINET6
|
||||
if (hp != NULL)
|
||||
{
|
||||
freehostent(hp);
|
||||
hp = NULL;
|
||||
}
|
||||
# endif /* _FFR_FREEHOSTENT && NETINET6 */
|
||||
|
||||
# if NETUNIX
|
||||
if (sap->sa.sa_family == AF_UNIX && sap->sunix.sun_path[0] == '\0')
|
||||
return "localhost";
|
||||
|
@ -12,7 +12,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: deliver.c,v 8.600.2.1.2.44 2000/09/21 21:52:17 ca Exp $";
|
||||
static char id[] = "@(#)$Id: deliver.c,v 8.600.2.1.2.56 2000/12/19 01:16:12 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#include <sendmail.h>
|
||||
@ -463,17 +463,19 @@ sendall(e, mode)
|
||||
if (!somedeliveries && mode != SM_QUEUE && mode != SM_DEFER &&
|
||||
mode != SM_VERIFY)
|
||||
{
|
||||
time_t now = curtime();
|
||||
|
||||
if (tTd(13, 29))
|
||||
dprintf("No deliveries: auto-queuing\n");
|
||||
mode = SM_QUEUE;
|
||||
|
||||
/* treat this as a delivery in terms of counting tries */
|
||||
e->e_dtime = curtime();
|
||||
e->e_dtime = now;
|
||||
if (!expensive)
|
||||
e->e_ntries++;
|
||||
for (ee = splitenv; ee != NULL; ee = ee->e_sibling)
|
||||
{
|
||||
ee->e_dtime = curtime();
|
||||
ee->e_dtime = now;
|
||||
if (!expensive)
|
||||
ee->e_ntries++;
|
||||
}
|
||||
@ -1239,7 +1241,7 @@ deliver(e, firstto)
|
||||
ovr = TRUE;
|
||||
/* do config file checking of compatibility */
|
||||
rcode = rscheck("check_compat", e->e_from.q_paddr, to->q_paddr,
|
||||
e, TRUE, TRUE, 4);
|
||||
e, TRUE, TRUE, 4, NULL);
|
||||
if (rcode == EX_OK)
|
||||
{
|
||||
/* do in-code checking if not discarding */
|
||||
@ -2238,21 +2240,17 @@ tryhost:
|
||||
#if SMTP
|
||||
if (clever && mci->mci_state != MCIS_CLOSED)
|
||||
{
|
||||
static u_short again;
|
||||
# if SASL && SFIO
|
||||
# define DONE_TLS_B 0x01
|
||||
# define DONE_TLS bitset(DONE_TLS_B, again)
|
||||
# define DONE_AUTH(f) bitset(MCIF_AUTHACT, f)
|
||||
# endif /* SASL && SFIO */
|
||||
# if STARTTLS
|
||||
# define DONE_STARTTLS_B 0x02
|
||||
# define DONE_STARTTLS bitset(DONE_STARTTLS_B, again)
|
||||
# define DONE_STARTTLS(f) bitset(MCIF_TLSACT, f)
|
||||
# endif /* STARTTLS */
|
||||
# define ONLY_HELO_B 0x04
|
||||
# define ONLY_HELO bitset(ONLY_HELO_B, again)
|
||||
# define SET_HELO again |= ONLY_HELO_B
|
||||
# define CLR_HELO again &= ~ONLY_HELO_B
|
||||
# define ONLY_HELO(f) bitset(MCIF_ONLY_EHLO, f)
|
||||
# define SET_HELO(f) f |= MCIF_ONLY_EHLO
|
||||
# define CLR_HELO(f) f &= ~MCIF_ONLY_EHLO
|
||||
|
||||
|
||||
again = 0;
|
||||
# if STARTTLS || (SASL && SFIO)
|
||||
reconnect: /* after switching to an authenticated connection */
|
||||
# endif /* STARTTLS || (SASL && SFIO) */
|
||||
@ -2260,18 +2258,20 @@ reconnect: /* after switching to an authenticated connection */
|
||||
# if SASL
|
||||
mci->mci_saslcap = NULL;
|
||||
# endif /* SASL */
|
||||
smtpinit(m, mci, e, ONLY_HELO);
|
||||
CLR_HELO;
|
||||
smtpinit(m, mci, e, ONLY_HELO(mci->mci_flags));
|
||||
CLR_HELO(mci->mci_flags);
|
||||
|
||||
# if STARTTLS
|
||||
/* first TLS then AUTH to provide a security layer */
|
||||
if (mci->mci_state != MCIS_CLOSED && !DONE_STARTTLS)
|
||||
if (mci->mci_state != MCIS_CLOSED &&
|
||||
!DONE_STARTTLS(mci->mci_flags))
|
||||
{
|
||||
int olderrors;
|
||||
bool hasdot;
|
||||
bool usetls;
|
||||
bool saveQuickAbort = QuickAbort;
|
||||
bool saveSuprErrs = SuprErrs;
|
||||
char *host = NULL;
|
||||
# if _FFR_TLS_CLT1
|
||||
char *p;
|
||||
# endif /* _FFR_TLS_CLT1 */
|
||||
@ -2306,20 +2306,22 @@ reconnect: /* after switching to an authenticated connection */
|
||||
newstr(anynet_ntoa(&CurHostAddr)), e);
|
||||
else
|
||||
define(macid("{server_addr}", NULL), NULL, e);
|
||||
# if _FFR_TLS_O_T
|
||||
if (usetls)
|
||||
{
|
||||
host = macvalue(macid("{server_name}", NULL),
|
||||
e);
|
||||
# if _FFR_TLS_O_T
|
||||
olderrors = Errors;
|
||||
QuickAbort = FALSE;
|
||||
SuprErrs = TRUE;
|
||||
if (rscheck("try_tls", CurHostName, NULL,
|
||||
e, TRUE, FALSE, 8) != EX_OK
|
||||
e, TRUE, FALSE, 8, host) != EX_OK
|
||||
|| Errors > olderrors)
|
||||
usetls = FALSE;
|
||||
SuprErrs = saveSuprErrs;
|
||||
QuickAbort = saveQuickAbort;
|
||||
}
|
||||
# endif /* _FFR_TLS_O_T */
|
||||
}
|
||||
|
||||
/* undo change of CurHostName */
|
||||
if (hasdot)
|
||||
@ -2329,7 +2331,6 @@ reconnect: /* after switching to an authenticated connection */
|
||||
if ((rcode = starttls(m, mci, e)) == EX_OK)
|
||||
{
|
||||
/* start again without STARTTLS */
|
||||
again |= DONE_STARTTLS_B;
|
||||
mci->mci_flags |= MCIF_TLSACT;
|
||||
}
|
||||
else
|
||||
@ -2367,6 +2368,12 @@ reconnect: /* after switching to an authenticated connection */
|
||||
newstr(s), e);
|
||||
}
|
||||
}
|
||||
else if (mci->mci_ssl != NULL)
|
||||
{
|
||||
/* active TLS connection, use that data */
|
||||
(void) tls_get_info(mci->mci_ssl, e, FALSE,
|
||||
mci->mci_host, FALSE);
|
||||
}
|
||||
else
|
||||
define(macid("{verify}", NULL), "NONE", e);
|
||||
olderrors = Errors;
|
||||
@ -2383,7 +2390,7 @@ reconnect: /* after switching to an authenticated connection */
|
||||
*/
|
||||
if (rscheck("tls_server",
|
||||
macvalue(macid("{verify}", NULL), e),
|
||||
NULL, e, TRUE, TRUE, 6) != EX_OK ||
|
||||
NULL, e, TRUE, TRUE, 6, host) != EX_OK ||
|
||||
Errors > olderrors ||
|
||||
rcode == EX_SOFTWARE)
|
||||
{
|
||||
@ -2422,6 +2429,9 @@ reconnect: /* after switching to an authenticated connection */
|
||||
smtpquit(m, mci, e);
|
||||
}
|
||||
|
||||
/* avoid bogus error msg */
|
||||
mci->mci_errno = 0;
|
||||
|
||||
/* temp or permanent failure? */
|
||||
rcode = (*p == '4') ? EX_TEMPFAIL
|
||||
: EX_UNAVAILABLE;
|
||||
@ -2435,20 +2445,27 @@ reconnect: /* after switching to an authenticated connection */
|
||||
}
|
||||
QuickAbort = saveQuickAbort;
|
||||
SuprErrs = saveSuprErrs;
|
||||
if (DONE_STARTTLS && mci->mci_state != MCIS_CLOSED)
|
||||
if (DONE_STARTTLS(mci->mci_flags) &&
|
||||
mci->mci_state != MCIS_CLOSED)
|
||||
{
|
||||
SET_HELO;
|
||||
SET_HELO(mci->mci_flags);
|
||||
mci->mci_flags &= ~MCIF_EXTENS;
|
||||
goto reconnect;
|
||||
}
|
||||
}
|
||||
else if (mci->mci_ssl != NULL)
|
||||
{
|
||||
/* active TLS connection, use that data */
|
||||
(void) tls_get_info(mci->mci_ssl, e, FALSE,
|
||||
mci->mci_host, FALSE);
|
||||
}
|
||||
# endif /* STARTTLS */
|
||||
# if SASL
|
||||
/* if other server supports authentication let's authenticate */
|
||||
if (mci->mci_state != MCIS_CLOSED &&
|
||||
mci->mci_saslcap != NULL &&
|
||||
# if SFIO
|
||||
!DONE_TLS &&
|
||||
!DONE_AUTH(mci->mci_flags) &&
|
||||
# endif /* SFIO */
|
||||
SASLInfo != NULL)
|
||||
{
|
||||
@ -2490,8 +2507,7 @@ reconnect: /* after switching to an authenticated connection */
|
||||
if (sfdcsasl(mci->mci_in, mci->mci_out,
|
||||
mci->mci_conn) == 0)
|
||||
{
|
||||
again |= DONE_TLS_B;
|
||||
SET_HELO;
|
||||
SET_HELO(mci->mci_flags);
|
||||
mci->mci_flags &= ~MCIF_EXTENS;
|
||||
mci->mci_flags |= MCIF_AUTHACT;
|
||||
goto reconnect;
|
||||
@ -2609,9 +2625,11 @@ do_transfer:
|
||||
# if STARTTLS
|
||||
# if _FFR_TLS_RCPT
|
||||
i = rscheck("tls_rcpt", to->q_user, NULL, e,
|
||||
TRUE, TRUE, 4);
|
||||
TRUE, TRUE, 4, mci->mci_host);
|
||||
if (i != EX_OK)
|
||||
{
|
||||
/* avoid bogus error msg */
|
||||
errno = 0;
|
||||
markfailure(e, to, mci, i, FALSE);
|
||||
giveresponse(i, to->q_status, m,
|
||||
mci, ctladdr, xstart, e);
|
||||
@ -3368,6 +3386,7 @@ logdelivery(m, mci, dsn, status, ctladdr, xstart, e)
|
||||
register char *bp;
|
||||
register char *p;
|
||||
int l;
|
||||
time_t now;
|
||||
char buf[1024];
|
||||
|
||||
#if (SYSLOG_BUFSIZE) >= 256
|
||||
@ -3388,14 +3407,15 @@ logdelivery(m, mci, dsn, status, ctladdr, xstart, e)
|
||||
}
|
||||
|
||||
/* delay & xdelay: max 41 bytes */
|
||||
now = curtime();
|
||||
snprintf(bp, SPACELEFT(buf, bp), ", delay=%s",
|
||||
pintvl(curtime() - e->e_ctime, TRUE));
|
||||
pintvl(now - e->e_ctime, TRUE));
|
||||
bp += strlen(bp);
|
||||
|
||||
if (xstart != (time_t) 0)
|
||||
{
|
||||
snprintf(bp, SPACELEFT(buf, bp), ", xdelay=%s",
|
||||
pintvl(curtime() - xstart, TRUE));
|
||||
pintvl(now - xstart, TRUE));
|
||||
bp += strlen(bp);
|
||||
}
|
||||
|
||||
@ -3553,12 +3573,12 @@ logdelivery(m, mci, dsn, status, ctladdr, xstart, e)
|
||||
}
|
||||
bp = buf;
|
||||
snprintf(bp, SPACELEFT(buf, bp), "delay=%s",
|
||||
pintvl(curtime() - e->e_ctime, TRUE));
|
||||
pintvl(now - e->e_ctime, TRUE));
|
||||
bp += strlen(bp);
|
||||
if (xstart != (time_t) 0)
|
||||
{
|
||||
snprintf(bp, SPACELEFT(buf, bp), ", xdelay=%s",
|
||||
pintvl(curtime() - xstart, TRUE));
|
||||
pintvl(now - xstart, TRUE));
|
||||
bp += strlen(bp);
|
||||
}
|
||||
|
||||
@ -3901,6 +3921,11 @@ putbody(mci, e, separator)
|
||||
dead = TRUE;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
}
|
||||
pos++;
|
||||
}
|
||||
for (xp = buf; xp < bp; xp++)
|
||||
@ -3911,9 +3936,11 @@ putbody(mci, e, separator)
|
||||
dead = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
else
|
||||
{
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
}
|
||||
}
|
||||
if (dead)
|
||||
continue;
|
||||
@ -3922,6 +3949,11 @@ putbody(mci, e, separator)
|
||||
if (fputs(mci->mci_mailer->m_eol,
|
||||
mci->mci_out) == EOF)
|
||||
break;
|
||||
else
|
||||
{
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
}
|
||||
pos = 0;
|
||||
}
|
||||
else
|
||||
@ -3931,8 +3963,6 @@ putbody(mci, e, separator)
|
||||
*pbp++ = c;
|
||||
}
|
||||
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
bp = buf;
|
||||
|
||||
/* determine next state */
|
||||
@ -3951,9 +3981,11 @@ putbody(mci, e, separator)
|
||||
if (fputs(mci->mci_mailer->m_eol,
|
||||
mci->mci_out) == EOF)
|
||||
continue;
|
||||
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
else
|
||||
{
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
}
|
||||
|
||||
if (TrafficLogFile != NULL)
|
||||
{
|
||||
@ -4005,6 +4037,11 @@ putch:
|
||||
dead = TRUE;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
}
|
||||
pos++;
|
||||
continue;
|
||||
}
|
||||
@ -4016,9 +4053,11 @@ putch:
|
||||
dead = TRUE;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
else
|
||||
{
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
}
|
||||
|
||||
if (TrafficLogFile != NULL)
|
||||
{
|
||||
@ -4037,6 +4076,11 @@ putch:
|
||||
if (fputs(mci->mci_mailer->m_eol,
|
||||
mci->mci_out) == EOF)
|
||||
continue;
|
||||
else
|
||||
{
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
}
|
||||
pos = 0;
|
||||
ostate = OS_HEAD;
|
||||
}
|
||||
@ -4051,12 +4095,14 @@ putch:
|
||||
dead = TRUE;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
}
|
||||
pos++;
|
||||
ostate = OS_INLINE;
|
||||
}
|
||||
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -4078,9 +4124,11 @@ putch:
|
||||
dead = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
else
|
||||
{
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
}
|
||||
}
|
||||
pos += bp - buf;
|
||||
}
|
||||
@ -4398,12 +4446,21 @@ mailfile(filename, mailer, ctladdr, sfflags, e)
|
||||
}
|
||||
else if (bitset(S_ISGID, mode))
|
||||
RealGid = stb.st_gid;
|
||||
else if (ctladdr != NULL && ctladdr->q_uid != 0)
|
||||
RealGid = ctladdr->q_gid;
|
||||
else if (ctladdr != NULL &&
|
||||
ctladdr->q_uid == DefUid &&
|
||||
ctladdr->q_gid == 0)
|
||||
{
|
||||
/*
|
||||
** Special case: This means it is an
|
||||
** alias and we should act as DefaultUser.
|
||||
** See alias()'s comments.
|
||||
*/
|
||||
|
||||
RealGid = DefGid;
|
||||
RealUserName = DefUser;
|
||||
}
|
||||
else if (ctladdr != NULL && ctladdr->q_uid != 0)
|
||||
RealGid = ctladdr->q_gid;
|
||||
else if (mailer != NULL && mailer->m_gid != 0)
|
||||
RealGid = mailer->m_gid;
|
||||
else
|
||||
@ -4698,6 +4755,7 @@ hostsignature(m, host)
|
||||
int len;
|
||||
int nmx;
|
||||
int hl;
|
||||
time_t now;
|
||||
char *hp;
|
||||
char *endp;
|
||||
int oldoptions = _res.options;
|
||||
@ -4756,6 +4814,7 @@ hostsignature(m, host)
|
||||
if (ConfigLevel < 2)
|
||||
_res.options &= ~(RES_DEFNAMES | RES_DNSRCH); /* XXX */
|
||||
|
||||
now = curtime();
|
||||
for (hp = host; hp != NULL; hp = endp)
|
||||
{
|
||||
#if NETINET6
|
||||
@ -4795,7 +4854,7 @@ hostsignature(m, host)
|
||||
mci = mci_get(hp, m);
|
||||
mci->mci_errno = errno;
|
||||
mci->mci_herrno = h_errno;
|
||||
mci->mci_lastuse = curtime();
|
||||
mci->mci_lastuse = now;
|
||||
if (rcode == EX_NOHOST)
|
||||
mci_setstat(mci, rcode, "5.1.2",
|
||||
"550 Host unknown");
|
||||
@ -5113,7 +5172,7 @@ starttls(m, mci, e)
|
||||
return EX_SOFTWARE;
|
||||
}
|
||||
mci->mci_ssl = clt_ssl;
|
||||
result = tls_get_info(clt_ssl, e, FALSE, mci->mci_host);
|
||||
result = tls_get_info(clt_ssl, e, FALSE, mci->mci_host, TRUE);
|
||||
|
||||
/* switch to use SSL... */
|
||||
#if SFIO
|
||||
|
@ -15,9 +15,9 @@
|
||||
|
||||
#ifndef lint
|
||||
# if NAMED_BIND
|
||||
static char id[] = "@(#)$Id: domain.c,v 8.114.6.1.2.3 2000/06/13 18:00:08 gshapiro Exp $ (with name server)";
|
||||
static char id[] = "@(#)$Id: domain.c,v 8.114.6.1.2.6 2000/12/19 02:50:33 gshapiro Exp $ (with name server)";
|
||||
# else /* NAMED_BIND */
|
||||
static char id[] = "@(#)$Id: domain.c,v 8.114.6.1.2.3 2000/06/13 18:00:08 gshapiro Exp $ (without name server)";
|
||||
static char id[] = "@(#)$Id: domain.c,v 8.114.6.1.2.6 2000/12/19 02:50:33 gshapiro Exp $ (without name server)";
|
||||
# endif /* NAMED_BIND */
|
||||
#endif /* ! lint */
|
||||
|
||||
@ -393,6 +393,10 @@ punt:
|
||||
host, MyHostName);
|
||||
return -1;
|
||||
}
|
||||
# if _FFR_FREEHOSTENT && NETINET6
|
||||
freehostent(h);
|
||||
hp = NULL;
|
||||
# endif /* _FFR_FREEHOSTENT && NETINET6 */
|
||||
}
|
||||
if (strlen(host) >= (SIZE_T) sizeof MXHostBuf)
|
||||
{
|
||||
@ -640,6 +644,8 @@ dns_getcanonname(host, hbsize, trymx, statp)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
*statp = EX_OK;
|
||||
|
||||
/*
|
||||
** Initialize domain search list. If there is at least one
|
||||
** dot in the name, search the unmodified name first so we
|
||||
@ -730,6 +736,7 @@ cnameloop:
|
||||
qtype == T_A ? "A" :
|
||||
qtype == T_MX ? "MX" :
|
||||
"???");
|
||||
errno = 0;
|
||||
ret = res_querydomain(host, *dp, C_IN, qtype,
|
||||
answer.qb2, sizeof(answer.qb2));
|
||||
if (ret <= 0)
|
||||
@ -740,7 +747,11 @@ cnameloop:
|
||||
|
||||
if (errno == ECONNREFUSED || h_errno == TRY_AGAIN)
|
||||
{
|
||||
/* the name server seems to be down */
|
||||
/*
|
||||
** the name server seems to be down or
|
||||
** broken.
|
||||
*/
|
||||
|
||||
h_errno = TRY_AGAIN;
|
||||
*statp = EX_TEMPFAIL;
|
||||
|
||||
@ -757,8 +768,23 @@ cnameloop:
|
||||
** the cache so this isn't dangerous.
|
||||
*/
|
||||
|
||||
#if _FFR_WORKAROUND_BROKEN_NAMESERVERS
|
||||
/*
|
||||
** Only return if not TRY_AGAIN as an
|
||||
** attempt with a different qtype may
|
||||
** succeed (res_querydomain() calls
|
||||
** res_query() calls res_send() which
|
||||
** sets errno to ETIMEDOUT if the
|
||||
** nameservers could be contacted but
|
||||
** didn't give an answer).
|
||||
*/
|
||||
|
||||
if (qtype != T_ANY && errno != ETIMEDOUT)
|
||||
return FALSE;
|
||||
#else /* _FFR_WORKAROUND_BROKEN_NAMESERVERS */
|
||||
if (qtype != T_ANY)
|
||||
return FALSE;
|
||||
#endif /* _FFR_WORKAROUND_BROKEN_NAMESERVERS */
|
||||
}
|
||||
|
||||
if (h_errno != HOST_NOT_FOUND)
|
||||
@ -976,7 +1002,8 @@ cnameloop:
|
||||
/* if nothing was found, we are done */
|
||||
if (mxmatch == NULL)
|
||||
{
|
||||
*statp = EX_NOHOST;
|
||||
if (*statp == EX_OK)
|
||||
*statp = EX_NOHOST;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
@ -12,7 +12,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: envelope.c,v 8.180.14.4 2000/08/22 18:22:39 gshapiro Exp $";
|
||||
static char id[] = "@(#)$Id: envelope.c,v 8.180.14.6 2000/11/30 00:39:46 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#include <sendmail.h>
|
||||
@ -91,6 +91,7 @@ dropenvelope(e, fulldrop)
|
||||
bool done = FALSE;
|
||||
register ADDRESS *q;
|
||||
char *id = e->e_id;
|
||||
time_t now;
|
||||
char buf[MAXLINE];
|
||||
|
||||
if (tTd(50, 1))
|
||||
@ -130,7 +131,8 @@ dropenvelope(e, fulldrop)
|
||||
** Extract state information from dregs of send list.
|
||||
*/
|
||||
|
||||
if (curtime() > e->e_ctime + TimeOuts.to_q_return[e->e_timeoutclass])
|
||||
now = curtime();
|
||||
if (now > e->e_ctime + TimeOuts.to_q_return[e->e_timeoutclass])
|
||||
message_timeout = TRUE;
|
||||
|
||||
if (TimeOuts.to_q_return[e->e_timeoutclass] == NOW &&
|
||||
@ -208,7 +210,7 @@ dropenvelope(e, fulldrop)
|
||||
}
|
||||
}
|
||||
else if (TimeOuts.to_q_warning[e->e_timeoutclass] > 0 &&
|
||||
curtime() > e->e_ctime + TimeOuts.to_q_warning[e->e_timeoutclass])
|
||||
now > e->e_ctime + TimeOuts.to_q_warning[e->e_timeoutclass])
|
||||
{
|
||||
if (!bitset(EF_WARNING|EF_RESPONSE, e->e_flags) &&
|
||||
e->e_class >= 0 &&
|
||||
@ -965,7 +967,7 @@ static struct eflags EnvelopeFlags[] =
|
||||
{ "HAS_DF", EF_HAS_DF },
|
||||
{ "IS_MIME", EF_IS_MIME },
|
||||
{ "DONT_MIME", EF_DONT_MIME },
|
||||
{ NULL }
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
void
|
||||
|
@ -12,12 +12,12 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: headers.c,v 8.203.4.7 2000/08/22 21:50:36 gshapiro Exp $";
|
||||
static char id[] = "@(#)$Id: headers.c,v 8.203.4.10 2000/10/13 17:54:30 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#include <sendmail.h>
|
||||
|
||||
static bool fix_mime_header __P((char *));
|
||||
static size_t fix_mime_header __P((char *));
|
||||
static int priencode __P((char *));
|
||||
static void put_vanilla_header __P((HDR *, char *, MCI *));
|
||||
|
||||
@ -164,7 +164,7 @@ chompheader(line, pflag, hdrp, e)
|
||||
goto hse;
|
||||
}
|
||||
|
||||
setbitn(*p, mopts);
|
||||
setbitn(bitidx(*p), mopts);
|
||||
cond = TRUE;
|
||||
p++;
|
||||
}
|
||||
@ -344,7 +344,8 @@ hse:
|
||||
free(sp);
|
||||
define(macid("{currHeader}", NULL), newstr(qval), e);
|
||||
define(macid("{hdr_name}", NULL), newstr(fname), e);
|
||||
(void) rscheck(rs, fvalue, NULL, e, stripcom, TRUE, 4);
|
||||
(void) rscheck(rs, fvalue, NULL, e, stripcom, TRUE, 4,
|
||||
NULL);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1388,14 +1389,18 @@ putheader(mci, hdr, e, flags)
|
||||
wordinclass(h->h_field,
|
||||
macid("{checkMIMEFieldHeaders}", NULL)))
|
||||
{
|
||||
if (fix_mime_header(h->h_value))
|
||||
size_t len;
|
||||
|
||||
len = fix_mime_header(h->h_value);
|
||||
if (len > 0)
|
||||
{
|
||||
sm_syslog(LOG_ALERT, e->e_id,
|
||||
"Truncated MIME %s header due to field size (possible attack)",
|
||||
h->h_field);
|
||||
"Truncated MIME %s header due to field size (length = %ld) (possible attack)",
|
||||
h->h_field, (unsigned long) len);
|
||||
if (tTd(34, 11))
|
||||
dprintf(" truncated MIME %s header due to field size (possible attack)\n",
|
||||
h->h_field);
|
||||
dprintf(" truncated MIME %s header due to field size (length = %ld) (possible attack)\n",
|
||||
h->h_field,
|
||||
(unsigned long) len);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1403,15 +1408,19 @@ putheader(mci, hdr, e, flags)
|
||||
wordinclass(h->h_field,
|
||||
macid("{checkMIMETextHeaders}", NULL)))
|
||||
{
|
||||
if (strlen(h->h_value) > (size_t)MaxMimeHeaderLength)
|
||||
size_t len;
|
||||
|
||||
len = strlen(h->h_value);
|
||||
if (len > (size_t) MaxMimeHeaderLength)
|
||||
{
|
||||
h->h_value[MaxMimeHeaderLength - 1] = '\0';
|
||||
sm_syslog(LOG_ALERT, e->e_id,
|
||||
"Truncated long MIME %s header (possible attack)",
|
||||
h->h_field);
|
||||
"Truncated long MIME %s header (length = %ld) (possible attack)",
|
||||
h->h_field, (unsigned long) len);
|
||||
if (tTd(34, 11))
|
||||
dprintf(" truncated long MIME %s header (possible attack)\n",
|
||||
h->h_field);
|
||||
dprintf(" truncated long MIME %s header (length = %ld) (possible attack)\n",
|
||||
h->h_field,
|
||||
(unsigned long) len);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1419,14 +1428,19 @@ putheader(mci, hdr, e, flags)
|
||||
wordinclass(h->h_field,
|
||||
macid("{checkMIMEHeaders}", NULL)))
|
||||
{
|
||||
if (shorten_rfc822_string(h->h_value, MaxMimeHeaderLength))
|
||||
size_t len;
|
||||
|
||||
len = strlen(h->h_value);
|
||||
if (shorten_rfc822_string(h->h_value,
|
||||
MaxMimeHeaderLength))
|
||||
{
|
||||
sm_syslog(LOG_ALERT, e->e_id,
|
||||
"Truncated long MIME %s header (possible attack)",
|
||||
h->h_field);
|
||||
"Truncated long MIME %s header (length = %ld) (possible attack)",
|
||||
h->h_field, (unsigned long) len);
|
||||
if (tTd(34, 11))
|
||||
dprintf(" truncated long MIME %s header (possible attack)\n",
|
||||
h->h_field);
|
||||
dprintf(" truncated long MIME %s header (length = %ld) (possible attack)\n",
|
||||
h->h_field,
|
||||
(unsigned long) len);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1457,7 +1471,7 @@ putheader(mci, hdr, e, flags)
|
||||
if (bitset(H_CHECK|H_ACHECK, h->h_flags) &&
|
||||
!bitintersect(h->h_mflags, mci->mci_mailer->m_flags) &&
|
||||
(h->h_macro == '\0' ||
|
||||
macvalue(h->h_macro & 0377, e) == NULL))
|
||||
macvalue(bitidx(h->h_macro), e) == NULL))
|
||||
{
|
||||
if (tTd(34, 11))
|
||||
dprintf(" (skipped)\n");
|
||||
@ -1819,22 +1833,23 @@ copyheader(header)
|
||||
** string -- the full header
|
||||
**
|
||||
** Returns:
|
||||
** TRUE if the header was modified, FALSE otherwise
|
||||
** length of last offending field, 0 if all ok.
|
||||
**
|
||||
** Side Effects:
|
||||
** string modified in place
|
||||
*/
|
||||
|
||||
static bool
|
||||
static size_t
|
||||
fix_mime_header(string)
|
||||
char *string;
|
||||
{
|
||||
bool modified = FALSE;
|
||||
char *begin = string;
|
||||
char *end;
|
||||
size_t len = 0;
|
||||
size_t retlen = 0;
|
||||
|
||||
if (string == NULL || *string == '\0')
|
||||
return FALSE;
|
||||
return 0;
|
||||
|
||||
/* Split on each ';' */
|
||||
while ((end = find_character(begin, ';')) != NULL)
|
||||
@ -1844,9 +1859,11 @@ fix_mime_header(string)
|
||||
|
||||
*end = '\0';
|
||||
|
||||
len = strlen(begin);
|
||||
|
||||
/* Shorten individual parameter */
|
||||
if (shorten_rfc822_string(begin, MaxMimeFieldLength))
|
||||
modified = TRUE;
|
||||
retlen = len;
|
||||
|
||||
/* Collapse the possibly shortened string with rest */
|
||||
bp = begin + strlen(begin);
|
||||
@ -1870,5 +1887,5 @@ fix_mime_header(string)
|
||||
/* Move past ';' */
|
||||
begin = end + 1;
|
||||
}
|
||||
return modified;
|
||||
return retlen;
|
||||
}
|
||||
|
@ -12,14 +12,17 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: macro.c,v 8.40.16.2 2000/09/17 17:04:26 gshapiro Exp $";
|
||||
static char id[] = "@(#)$Id: macro.c,v 8.40.16.7 2000/10/09 15:49:06 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#include <sendmail.h>
|
||||
|
||||
char *MacroName[256]; /* macro id to name table */
|
||||
int NextMacroId = 0240; /* codes for long named macros */
|
||||
#if MAXMACROID != (BITMAPBITS - 1)
|
||||
ERROR Read the comment in conf.h
|
||||
#endif /* MAXMACROID != (BITMAPBITS - 1) */
|
||||
|
||||
char *MacroName[MAXMACROID + 1]; /* macro id to name table */
|
||||
int NextMacroId = 0240; /* codes for long named macros */
|
||||
|
||||
/*
|
||||
** EXPAND -- macro expand a string using $x escapes.
|
||||
@ -111,7 +114,7 @@ expand(s, buf, bufsize, e)
|
||||
continue;
|
||||
|
||||
case MACROEXPAND: /* macro interpolation */
|
||||
c = *++s & 0377;
|
||||
c = bitidx(*++s);
|
||||
if (c != '\0')
|
||||
q = macvalue(c, e);
|
||||
else
|
||||
@ -247,7 +250,7 @@ define(n, v, e)
|
||||
{
|
||||
int m;
|
||||
|
||||
m = n & 0377;
|
||||
m = bitidx(n);
|
||||
if (tTd(35, 9))
|
||||
{
|
||||
dprintf("%sdefine(%s as ",
|
||||
@ -285,7 +288,7 @@ macvalue(n, e)
|
||||
int n;
|
||||
register ENVELOPE *e;
|
||||
{
|
||||
n &= 0377;
|
||||
n = bitidx(n);
|
||||
while (e != NULL)
|
||||
{
|
||||
register char *p = e->e_macro[n];
|
||||
@ -315,7 +318,7 @@ macname(n)
|
||||
{
|
||||
static char mbuf[2];
|
||||
|
||||
n &= 0377;
|
||||
n = bitidx(n);
|
||||
if (bitset(0200, n))
|
||||
{
|
||||
char *p = MacroName[n];
|
||||
@ -368,7 +371,7 @@ macid(p, ep)
|
||||
*ep = p;
|
||||
if (tTd(35, 14))
|
||||
dprintf("NULL\n");
|
||||
return '\0';
|
||||
return 0;
|
||||
}
|
||||
if (*p != '{')
|
||||
{
|
||||
@ -376,8 +379,8 @@ macid(p, ep)
|
||||
if (ep != NULL)
|
||||
*ep = p + 1;
|
||||
if (tTd(35, 14))
|
||||
dprintf("%c\n", *p);
|
||||
return *p;
|
||||
dprintf("%c\n", bitidx(*p));
|
||||
return bitidx(*p);
|
||||
}
|
||||
bp = mbuf;
|
||||
while (*++p != '\0' && *p != '}' && bp < &mbuf[sizeof mbuf - 1])
|
||||
@ -401,7 +404,7 @@ macid(p, ep)
|
||||
else if (mbuf[1] == '\0')
|
||||
{
|
||||
/* ${x} == $x */
|
||||
mid = mbuf[0];
|
||||
mid = bitidx(mbuf[0]);
|
||||
p++;
|
||||
}
|
||||
else
|
||||
@ -428,6 +431,13 @@ macid(p, ep)
|
||||
}
|
||||
if (ep != NULL)
|
||||
*ep = p;
|
||||
if (mid < 0 || mid > MAXMACROID)
|
||||
{
|
||||
syserr("Unable to assign macro/class ID (mid = 0x%x)", mid);
|
||||
if (tTd(35, 14))
|
||||
dprintf("NULL\n");
|
||||
return 0;
|
||||
}
|
||||
if (tTd(35, 14))
|
||||
dprintf("0x%x\n", mid);
|
||||
return mid;
|
||||
@ -452,5 +462,5 @@ wordinclass(str, cl)
|
||||
register STAB *s;
|
||||
|
||||
s = stab(str, ST_CLASS, ST_FIND);
|
||||
return s != NULL && bitnset(cl & 0xff, s->s_class);
|
||||
return s != NULL && bitnset(bitidx(cl), s->s_class);
|
||||
}
|
||||
|
@ -9,11 +9,11 @@
|
||||
.\" the sendmail distribution.
|
||||
.\"
|
||||
.\"
|
||||
.\" $Id: mailq.1,v 8.14.28.2 2000/09/17 17:04:27 gshapiro Exp $
|
||||
.\" $Id: mailq.1,v 8.14.28.3 2000/12/14 23:08:15 gshapiro Exp $
|
||||
.\"
|
||||
.TH MAILQ 1 "$Date: 2000/09/17 17:04:27 $"
|
||||
.TH MAILQ 1 "$Date: 2000/12/14 23:08:15 $"
|
||||
.SH NAME
|
||||
.B mailq
|
||||
mailq
|
||||
\- print the mail queue
|
||||
.SH SYNOPSIS
|
||||
.B mailq
|
||||
|
@ -21,7 +21,7 @@ static char copyright[] =
|
||||
#endif /* ! lint */
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: main.c,v 8.485.4.27 2000/09/26 01:30:38 gshapiro Exp $";
|
||||
static char id[] = "@(#)$Id: main.c,v 8.485.4.38 2000/12/19 02:50:33 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#define _DEFINE
|
||||
@ -624,6 +624,10 @@ main(argc, argv, envp)
|
||||
setclass('w', ipbuf);
|
||||
}
|
||||
#endif /* NETINET || NETINET6 */
|
||||
#if _FFR_FREEHOSTENT && NETINET6
|
||||
freehostent(hp);
|
||||
hp = NULL;
|
||||
#endif /* _FFR_FREEHOSTENT && NETINET6 */
|
||||
}
|
||||
|
||||
/* current time */
|
||||
@ -1540,6 +1544,15 @@ main(argc, argv, envp)
|
||||
{
|
||||
char buf[MAXLINE];
|
||||
|
||||
#if _FFR_TESTMODE_DROP_PRIVS
|
||||
dp = drop_privileges(TRUE);
|
||||
if (dp != EX_OK)
|
||||
{
|
||||
CurEnv->e_id = NULL;
|
||||
finis(TRUE, dp);
|
||||
}
|
||||
#endif /* _FFR_TESTMODE_DROP_PRIVS */
|
||||
|
||||
if (isatty(fileno(stdin)))
|
||||
Verbose = 2;
|
||||
|
||||
@ -1608,6 +1621,16 @@ main(argc, argv, envp)
|
||||
}
|
||||
#endif /* QUEUE */
|
||||
|
||||
# if SASL
|
||||
if (OpMode == MD_SMTP || OpMode == MD_DAEMON)
|
||||
{
|
||||
/* give a syserr or just disable AUTH ? */
|
||||
if ((i = sasl_server_init(srvcallbacks, "Sendmail")) != SASL_OK)
|
||||
syserr("!sasl_server_init failed! [%s]",
|
||||
sasl_errstring(i, NULL, NULL));
|
||||
}
|
||||
# endif /* SASL */
|
||||
|
||||
/*
|
||||
** If a daemon, wait for a request.
|
||||
** getrequests will always return in a child.
|
||||
@ -1760,13 +1783,6 @@ main(argc, argv, envp)
|
||||
define(macid("{client_port}", NULL),
|
||||
newstr(pbuf), &BlankEnvelope);
|
||||
|
||||
#if SASL
|
||||
/* give a syserr or just disable AUTH ? */
|
||||
if ((i = sasl_server_init(srvcallbacks, "Sendmail")) != SASL_OK)
|
||||
syserr("!sasl_server_init failed! [%s]",
|
||||
sasl_errstring(i, NULL, NULL));
|
||||
#endif /* SASL */
|
||||
|
||||
if (OpMode == MD_DAEMON)
|
||||
{
|
||||
/* validate the connection */
|
||||
@ -1784,6 +1800,8 @@ main(argc, argv, envp)
|
||||
if (OpMode == MD_SMTP)
|
||||
(void) initsrvtls();
|
||||
# endif /* STARTTLS */
|
||||
|
||||
|
||||
smtp(nullserver, *p_flags, CurEnv);
|
||||
}
|
||||
#endif /* SMTP */
|
||||
@ -2167,7 +2185,7 @@ struct metamac MetaMacros[] =
|
||||
/* miscellaneous control characters */
|
||||
{ '&', MACRODEXPAND },
|
||||
|
||||
{ '\0' }
|
||||
{ '\0', '\0' }
|
||||
};
|
||||
|
||||
#define MACBINDING(name, mid) \
|
||||
@ -2181,7 +2199,7 @@ initmacros(e)
|
||||
register struct metamac *m;
|
||||
register int c;
|
||||
char buf[5];
|
||||
extern char *MacroName[256];
|
||||
extern char *MacroName[MAXMACROID + 1];
|
||||
|
||||
for (m = MetaMacros; m->metaname != '\0'; m++)
|
||||
{
|
||||
@ -2388,7 +2406,18 @@ auth_warning(e, msg, va_alist)
|
||||
static char hostbuf[48];
|
||||
|
||||
if (hostbuf[0] == '\0')
|
||||
(void) myhostname(hostbuf, sizeof hostbuf);
|
||||
{
|
||||
struct hostent *hp;
|
||||
|
||||
hp = myhostname(hostbuf, sizeof hostbuf);
|
||||
#if _FFR_FREEHOSTENT && NETINET6
|
||||
if (hp != NULL)
|
||||
{
|
||||
freehostent(hp);
|
||||
hp = NULL;
|
||||
}
|
||||
#endif /* _FFR_FREEHOSTENT && NETINET6 */
|
||||
}
|
||||
|
||||
(void) snprintf(buf, sizeof buf, "%s: ", hostbuf);
|
||||
p = &buf[strlen(buf)];
|
||||
@ -2782,7 +2811,7 @@ testmodeline(line, e)
|
||||
{
|
||||
case 'D':
|
||||
mid = macid(&line[2], &delimptr);
|
||||
if (mid == '\0')
|
||||
if (mid == 0)
|
||||
return;
|
||||
translate_dollars(delimptr);
|
||||
define(mid, newstr(delimptr), e);
|
||||
@ -2793,7 +2822,7 @@ testmodeline(line, e)
|
||||
return;
|
||||
|
||||
mid = macid(&line[2], &delimptr);
|
||||
if (mid == '\0')
|
||||
if (mid == 0)
|
||||
return;
|
||||
translate_dollars(delimptr);
|
||||
expand(delimptr, exbuf, sizeof exbuf, e);
|
||||
@ -2899,12 +2928,12 @@ testmodeline(line, e)
|
||||
if (line[1] == '=')
|
||||
{
|
||||
mid = macid(&line[2], NULL);
|
||||
if (mid != '\0')
|
||||
if (mid != 0)
|
||||
stabapply(dump_class, mid);
|
||||
return;
|
||||
}
|
||||
mid = macid(&line[1], NULL);
|
||||
if (mid == '\0')
|
||||
if (mid == 0)
|
||||
return;
|
||||
p = macvalue(mid, e);
|
||||
if (p == NULL)
|
||||
@ -3169,6 +3198,6 @@ dump_class(s, id)
|
||||
{
|
||||
if (s->s_type != ST_CLASS)
|
||||
return;
|
||||
if (bitnset(id & 0xff, s->s_class))
|
||||
if (bitnset(bitidx(id), s->s_class))
|
||||
printf("%s\n", s->s_name);
|
||||
}
|
||||
|
@ -12,7 +12,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: map.c,v 8.414.4.24 2000/09/27 04:11:29 gshapiro Exp $";
|
||||
static char id[] = "@(#)$Id: map.c,v 8.414.4.34 2000/12/18 18:00:43 ca Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#include <sendmail.h>
|
||||
@ -2895,6 +2895,7 @@ ldapmap_start(map)
|
||||
|
||||
# if USE_LDAP_INIT
|
||||
ld = ldap_init(lmap->ldap_host, lmap->ldap_port);
|
||||
save_errno = errno;
|
||||
# else /* USE_LDAP_INIT */
|
||||
/*
|
||||
** If using ldap_open(), the actual connection to the server
|
||||
@ -3574,7 +3575,7 @@ ldapmap_lookup(map, name, av, statp)
|
||||
}
|
||||
|
||||
/* Did we match anything? */
|
||||
if (vp == NULL)
|
||||
if (vp == NULL && !bitset(MF_MATCHONLY, map->map_mflags))
|
||||
return NULL;
|
||||
|
||||
/*
|
||||
@ -3586,22 +3587,26 @@ ldapmap_lookup(map, name, av, statp)
|
||||
|
||||
if (bitset(MF_NOREWRITE, map->map_mflags))
|
||||
{
|
||||
/* vp != NULL due to test above */
|
||||
free(vp);
|
||||
if (vp != NULL)
|
||||
free(vp);
|
||||
return "";
|
||||
}
|
||||
|
||||
if (*statp == EX_OK)
|
||||
{
|
||||
/* vp != NULL due to test above */
|
||||
if (LogLevel > 9)
|
||||
sm_syslog(LOG_INFO, CurEnv->e_id,
|
||||
"ldap %.100s => %s", name, vp);
|
||||
"ldap %.100s => %s", name,
|
||||
vp == NULL ? "<NULL>" : vp);
|
||||
if (bitset(MF_MATCHONLY, map->map_mflags))
|
||||
result = map_rewrite(map, name, strlen(name), NULL);
|
||||
else
|
||||
{
|
||||
/* vp != NULL according to test above */
|
||||
result = map_rewrite(map, vp, strlen(vp), av);
|
||||
free(vp);
|
||||
}
|
||||
if (vp != NULL)
|
||||
free(vp);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@ -4238,7 +4243,7 @@ ldapmap_parseargs(map, args)
|
||||
if (p != NULL)
|
||||
*p++ = '\0';
|
||||
|
||||
if (i == LDAPMAP_MAX_ATTR)
|
||||
if (i >= LDAPMAP_MAX_ATTR)
|
||||
{
|
||||
syserr("Too many return attributes in %s (max %d)",
|
||||
map->map_mname, LDAPMAP_MAX_ATTR);
|
||||
@ -4631,7 +4636,7 @@ ph_map_open(map, mode)
|
||||
{
|
||||
if (tTd(9, 1))
|
||||
dprintf("ph_map_open(%s) => DEFERRED\n",
|
||||
map->map_mname);
|
||||
map->map_mname);
|
||||
|
||||
/*
|
||||
** Unset MF_DEFER here so that map_lookup() returns
|
||||
@ -6719,7 +6724,7 @@ macro_map_lookup(map, name, av, statp)
|
||||
|
||||
struct regex_map
|
||||
{
|
||||
regex_t regex_pattern_buf; /* xalloc it */
|
||||
regex_t *regex_pattern_buf; /* xalloc it */
|
||||
int *regex_subfields; /* move to type MAP */
|
||||
char *regex_delim; /* move to type MAP */
|
||||
};
|
||||
@ -6796,6 +6801,7 @@ regex_map_init(map, ap)
|
||||
p = ap;
|
||||
|
||||
map_p = (struct regex_map *) xnalloc(sizeof *map_p);
|
||||
map_p->regex_pattern_buf = (regex_t *)xnalloc(sizeof(regex_t));
|
||||
|
||||
for (;;)
|
||||
{
|
||||
@ -6852,14 +6858,15 @@ regex_map_init(map, ap)
|
||||
if (tTd(38, 3))
|
||||
dprintf("regex_map_init: compile '%s' 0x%x\n", p, pflags);
|
||||
|
||||
if ((regerr = regcomp(&(map_p->regex_pattern_buf), p, pflags)) != 0)
|
||||
if ((regerr = regcomp(map_p->regex_pattern_buf, p, pflags)) != 0)
|
||||
{
|
||||
/* Errorhandling */
|
||||
char errbuf[ERRBUF_SIZE];
|
||||
|
||||
(void) regerror(regerr, &(map_p->regex_pattern_buf),
|
||||
(void) regerror(regerr, map_p->regex_pattern_buf,
|
||||
errbuf, ERRBUF_SIZE);
|
||||
syserr("pattern-compile-error: %s\n", errbuf);
|
||||
free(map_p->regex_pattern_buf);
|
||||
free(map_p);
|
||||
return FALSE;
|
||||
}
|
||||
@ -6877,7 +6884,7 @@ regex_map_init(map, ap)
|
||||
int substrings;
|
||||
int *fields = (int *) xalloc(sizeof(int) * (MAX_MATCH + 1));
|
||||
|
||||
substrings = map_p->regex_pattern_buf.re_nsub + 1;
|
||||
substrings = map_p->regex_pattern_buf->re_nsub + 1;
|
||||
|
||||
if (tTd(38, 3))
|
||||
dprintf("regex_map_init: nr of substrings %d\n",
|
||||
@ -6886,6 +6893,7 @@ regex_map_init(map, ap)
|
||||
if (substrings >= MAX_MATCH)
|
||||
{
|
||||
syserr("too many substrings, %d max\n", MAX_MATCH);
|
||||
free(map_p->regex_pattern_buf);
|
||||
free(map_p);
|
||||
return FALSE;
|
||||
}
|
||||
@ -6955,7 +6963,7 @@ regex_map_lookup(map, name, av, statp)
|
||||
}
|
||||
|
||||
map_p = (struct regex_map *)(map->map_db1);
|
||||
reg_res = regexec(&(map_p->regex_pattern_buf),
|
||||
reg_res = regexec(map_p->regex_pattern_buf,
|
||||
name, MAX_MATCH, pmatch, 0);
|
||||
|
||||
if (bitset(MF_REGEX_NOT, map->map_mflags))
|
||||
@ -6987,7 +6995,7 @@ regex_map_lookup(map, name, av, statp)
|
||||
if (av[1] != NULL)
|
||||
{
|
||||
if (parse_fields(av[1], fields, MAX_MATCH + 1,
|
||||
(int) map_p->regex_pattern_buf.re_nsub + 1) == -1)
|
||||
(int) map_p->regex_pattern_buf->re_nsub + 1) == -1)
|
||||
{
|
||||
*statp = EX_CONFIG;
|
||||
return NULL;
|
||||
@ -7011,7 +7019,8 @@ regex_map_lookup(map, name, av, statp)
|
||||
first = FALSE;
|
||||
|
||||
|
||||
if (pmatch[*ip].rm_so < 0 || pmatch[*ip].rm_eo < 0)
|
||||
if (*ip >= MAX_MATCH ||
|
||||
pmatch[*ip].rm_so < 0 || pmatch[*ip].rm_eo < 0)
|
||||
continue;
|
||||
|
||||
sp = name + pmatch[*ip].rm_so;
|
||||
@ -7128,7 +7137,7 @@ nsd_map_lookup(map, name, av, statp)
|
||||
char **av;
|
||||
int *statp;
|
||||
{
|
||||
int buflen;
|
||||
int buflen, r;
|
||||
char *p;
|
||||
ns_map_t *ns_map;
|
||||
char keybuf[MAXNAME + 1];
|
||||
@ -7150,12 +7159,27 @@ nsd_map_lookup(map, name, av, statp)
|
||||
{
|
||||
if (tTd(38, 20))
|
||||
dprintf("nsd_map_t_find failed\n");
|
||||
*statp = EX_UNAVAILABLE;
|
||||
return NULL;
|
||||
}
|
||||
r = ns_lookup(ns_map, NULL, map->map_file, keybuf, NULL, buf, MAXLINE);
|
||||
if (r == NS_UNAVAIL || r == NS_TRYAGAIN)
|
||||
{
|
||||
*statp = EX_TEMPFAIL;
|
||||
return NULL;
|
||||
}
|
||||
if (r == NS_BADREQ || r == NS_NOPERM)
|
||||
{
|
||||
*statp = EX_CONFIG;
|
||||
return NULL;
|
||||
}
|
||||
if (r != NS_SUCCESS)
|
||||
{
|
||||
*statp = EX_NOTFOUND;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (ns_lookup(ns_map, NULL, map->map_file,
|
||||
keybuf, NULL, buf, MAXLINE) == NULL)
|
||||
return NULL;
|
||||
*statp = EX_OK;
|
||||
|
||||
/* Null out trailing \n */
|
||||
if ((p = strchr(buf, '\n')) != NULL)
|
||||
|
@ -12,7 +12,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: mci.c,v 8.133.10.3 2000/06/23 16:17:06 ca Exp $";
|
||||
static char id[] = "@(#)$Id: mci.c,v 8.133.10.7 2000/12/12 00:39:34 ca Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#include <sendmail.h>
|
||||
@ -274,8 +274,10 @@ mci_flush(doquit, allbut)
|
||||
return;
|
||||
|
||||
for (i = 0; i < MaxMciCache; i++)
|
||||
{
|
||||
if (allbut != MciCache[i])
|
||||
mci_uncache(&MciCache[i], doquit);
|
||||
}
|
||||
}
|
||||
/*
|
||||
** MCI_GET -- get information about a particular host
|
||||
@ -300,7 +302,7 @@ mci_get(host, m)
|
||||
(void) mci_scan(NULL);
|
||||
|
||||
if (m->m_mno < 0)
|
||||
syserr("negative mno %d (%s)", m->m_mno, m->m_name);
|
||||
syserr("!negative mno %d (%s)", m->m_mno, m->m_name);
|
||||
|
||||
s = stab(host, ST_MCI + m->m_mno, ST_ENTER);
|
||||
mci = &s->s_mci;
|
||||
@ -383,7 +385,7 @@ mci_match(host, m)
|
||||
register MCI *mci;
|
||||
register STAB *s;
|
||||
|
||||
if (m->m_mno < 0)
|
||||
if (m->m_mno < 0 || m->m_mno > MAXMAILERS)
|
||||
return FALSE;
|
||||
s = stab(host, ST_MCI + m->m_mno, ST_FIND);
|
||||
if (s == NULL)
|
||||
@ -460,7 +462,7 @@ static struct mcifbits MciFlags[] =
|
||||
{ MCIF_8BITOK, "8BITOK" },
|
||||
{ MCIF_CVT7TO8, "CVT7TO8" },
|
||||
{ MCIF_INMIME, "INMIME" },
|
||||
{ 0, NULL }
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
|
||||
@ -1327,12 +1329,12 @@ mci_generate_persistent_path(host, path, pathlen, createflag)
|
||||
|
||||
#if NETINET || NETINET6
|
||||
/* check for bogus bracketed address */
|
||||
if (host[0] == '[' &&
|
||||
if (host[0] == '['
|
||||
# if NETINET6
|
||||
inet_pton(AF_INET6, t_host, &in6_addr) != 1 &&
|
||||
&& inet_pton(AF_INET6, t_host, &in6_addr) != 1
|
||||
# endif /* NETINET6 */
|
||||
# if NETINET
|
||||
inet_addr(t_host) == INADDR_NONE
|
||||
&& inet_addr(t_host) == INADDR_NONE
|
||||
# endif /* NETINET */
|
||||
)
|
||||
return -1;
|
||||
|
@ -9,7 +9,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: milter.c,v 8.50.4.33 2000/09/19 19:40:15 gshapiro Exp $";
|
||||
static char id[] = "@(#)$Id: milter.c,v 8.50.4.41 2000/12/27 21:35:32 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#if _FFR_MILTER
|
||||
@ -22,6 +22,9 @@ static char id[] = "@(#)$Id: milter.c,v 8.50.4.33 2000/09/19 19:40:15 gshapiro E
|
||||
# include <arpa/inet.h>
|
||||
# endif /* NETINET || NETINET6 */
|
||||
|
||||
# define SM_FD_SET FD_SET
|
||||
# define SM_FD_ISSET FD_ISSET
|
||||
# define SM_FD_SETSIZE FD_SETSIZE
|
||||
|
||||
static void milter_error __P((struct milter *));
|
||||
static int milter_open __P((struct milter *, bool, ENVELOPE *));
|
||||
@ -113,29 +116,28 @@ static char *MilterEnvRcptMacros[MAXFILTERMACROS + 1];
|
||||
** Assumes 'm' is a milter structure for the current socket.
|
||||
*/
|
||||
|
||||
|
||||
# define MILTER_TIMEOUT(routine, secs, write) \
|
||||
# define MILTER_TIMEOUT(routine, secs, write) \
|
||||
{ \
|
||||
int ret; \
|
||||
int save_errno; \
|
||||
fd_set fds; \
|
||||
struct timeval tv; \
|
||||
\
|
||||
if (m->mf_sock >= FD_SETSIZE) \
|
||||
if (SM_FD_SETSIZE != 0 && m->mf_sock >= SM_FD_SETSIZE) \
|
||||
{ \
|
||||
if (tTd(64, 5)) \
|
||||
dprintf("%s(%s): socket %d is larger than FD_SETSIZE %d\n", \
|
||||
routine, m->mf_name, m->mf_sock, FD_SETSIZE); \
|
||||
routine, m->mf_name, m->mf_sock, SM_FD_SETSIZE); \
|
||||
if (LogLevel > 0) \
|
||||
sm_syslog(LOG_ERR, e->e_id, \
|
||||
"%s(%s): socket %d is larger than FD_SETSIZE %d\n", \
|
||||
routine, m->mf_name, m->mf_sock, FD_SETSIZE); \
|
||||
routine, m->mf_name, m->mf_sock, SM_FD_SETSIZE); \
|
||||
milter_error(m); \
|
||||
return NULL; \
|
||||
} \
|
||||
\
|
||||
FD_ZERO(&fds); \
|
||||
FD_SET(m->mf_sock, &fds); \
|
||||
SM_FD_SET(m->mf_sock, &fds); \
|
||||
tv.tv_sec = secs; \
|
||||
tv.tv_usec = 0; \
|
||||
ret = select(m->mf_sock + 1, \
|
||||
@ -167,7 +169,7 @@ static char *MilterEnvRcptMacros[MAXFILTERMACROS + 1];
|
||||
return NULL; \
|
||||
\
|
||||
default: \
|
||||
if (FD_ISSET(m->mf_sock, &fds)) \
|
||||
if (SM_FD_ISSET(m->mf_sock, &fds)) \
|
||||
break; \
|
||||
if (tTd(64, 5)) \
|
||||
dprintf("%s(%s): socket not ready\n", \
|
||||
@ -181,7 +183,6 @@ static char *MilterEnvRcptMacros[MAXFILTERMACROS + 1];
|
||||
} \
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
** Low level functions
|
||||
*/
|
||||
@ -879,6 +880,9 @@ milter_open(m, parseonly, e)
|
||||
m->mf_name, at,
|
||||
hp->h_addrtype);
|
||||
milter_error(m);
|
||||
# if _FFR_FREEHOSTENT && NETINET6
|
||||
freehostent(hp);
|
||||
# endif /* _FFR_FREEHOSTENT && NETINET6 */
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
@ -901,6 +905,10 @@ milter_open(m, parseonly, e)
|
||||
if (parseonly)
|
||||
{
|
||||
m->mf_state = SMFS_READY;
|
||||
# if _FFR_FREEHOSTENT && NETINET6
|
||||
if (hp != NULL)
|
||||
freehostent(hp);
|
||||
# endif /* _FFR_FREEHOSTENT && NETINET6 */
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -913,6 +921,10 @@ milter_open(m, parseonly, e)
|
||||
dprintf("milter_open(%s): Trying to open filter in state %c\n",
|
||||
m->mf_name, (char) m->mf_state);
|
||||
milter_error(m);
|
||||
# if _FFR_FREEHOSTENT && NETINET6
|
||||
if (hp != NULL)
|
||||
freehostent(hp);
|
||||
# endif /* _FFR_FREEHOSTENT && NETINET6 */
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -931,6 +943,10 @@ milter_open(m, parseonly, e)
|
||||
"X%s: error creating socket: %s",
|
||||
m->mf_name, errstring(save_errno));
|
||||
milter_error(m);
|
||||
# if _FFR_FREEHOSTENT && NETINET6
|
||||
if (hp != NULL)
|
||||
freehostent(hp);
|
||||
# endif /* _FFR_FREEHOSTENT && NETINET6 */
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -983,6 +999,9 @@ milter_open(m, parseonly, e)
|
||||
m->mf_name, at,
|
||||
hp->h_addrtype);
|
||||
milter_error(m);
|
||||
# if _FFR_FREEHOSTENT && NETINET6
|
||||
freehostent(hp);
|
||||
# endif /* _FFR_FREEHOSTENT && NETINET6 */
|
||||
return -1;
|
||||
}
|
||||
continue;
|
||||
@ -995,9 +1014,20 @@ milter_open(m, parseonly, e)
|
||||
"X%s: error connecting to filter",
|
||||
m->mf_name);
|
||||
milter_error(m);
|
||||
# if _FFR_FREEHOSTENT && NETINET6
|
||||
if (hp != NULL)
|
||||
freehostent(hp);
|
||||
# endif /* _FFR_FREEHOSTENT && NETINET6 */
|
||||
return -1;
|
||||
}
|
||||
m->mf_state = SMFS_OPEN;
|
||||
# if _FFR_FREEHOSTENT && NETINET6
|
||||
if (hp != NULL)
|
||||
{
|
||||
freehostent(hp);
|
||||
hp = NULL;
|
||||
}
|
||||
# endif /* _FFR_FREEHOSTENT && NETINET6 */
|
||||
return sock;
|
||||
}
|
||||
/*
|
||||
@ -1078,7 +1108,7 @@ milter_setup(line)
|
||||
for (; *p != '\0'; p++)
|
||||
{
|
||||
if (!(isascii(*p) && isspace(*p)))
|
||||
setbitn(*p, m->mf_flags);
|
||||
setbitn(bitidx(*p), m->mf_flags);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -1549,8 +1579,11 @@ milter_quit_filter(m, e)
|
||||
|
||||
(void) milter_write(m, SMFIC_QUIT, (char *) NULL, 0,
|
||||
m->mf_timeout[SMFTO_WRITE], e);
|
||||
(void) close(m->mf_sock);
|
||||
m->mf_sock = -1;
|
||||
if (m->mf_sock >= 0)
|
||||
{
|
||||
(void) close(m->mf_sock);
|
||||
m->mf_sock = -1;
|
||||
}
|
||||
if (m->mf_state != SMFS_ERROR)
|
||||
m->mf_state = SMFS_CLOSED;
|
||||
}
|
||||
@ -1617,7 +1650,7 @@ milter_send_macros(m, macros, cmd, e)
|
||||
for (i = 0; macros[i] != NULL; i++)
|
||||
{
|
||||
mid = macid(macros[i], NULL);
|
||||
if (mid == '\0')
|
||||
if (mid == 0)
|
||||
continue;
|
||||
v = macvalue(mid, e);
|
||||
if (v == NULL)
|
||||
@ -1631,7 +1664,7 @@ milter_send_macros(m, macros, cmd, e)
|
||||
for (i = 0; macros[i] != NULL; i++)
|
||||
{
|
||||
mid = macid(macros[i], NULL);
|
||||
if (mid == '\0')
|
||||
if (mid == 0)
|
||||
continue;
|
||||
v = macvalue(mid, e);
|
||||
if (v == NULL)
|
||||
@ -1841,6 +1874,13 @@ milter_command(command, data, sz, macros, e, state)
|
||||
{
|
||||
struct milter *m = InputFilters[i];
|
||||
|
||||
/* previous problem? */
|
||||
if (m->mf_state == SMFS_ERROR)
|
||||
{
|
||||
MILTER_CHECK_ERROR(continue);
|
||||
break;
|
||||
}
|
||||
|
||||
/* sanity check */
|
||||
if (m->mf_sock < 0 ||
|
||||
(m->mf_state != SMFS_OPEN && m->mf_state != SMFS_INMSG))
|
||||
@ -2282,6 +2322,7 @@ milter_addheader(response, rlen, e)
|
||||
ENVELOPE *e;
|
||||
{
|
||||
char *val;
|
||||
HDR *h;
|
||||
|
||||
if (tTd(64, 10))
|
||||
dprintf("milter_addheader: ");
|
||||
@ -2319,13 +2360,31 @@ milter_addheader(response, rlen, e)
|
||||
return;
|
||||
}
|
||||
|
||||
for (h = e->e_header; h != NULL; h = h->h_link)
|
||||
{
|
||||
if (strcasecmp(h->h_field, response) == 0 &&
|
||||
!bitset(H_USER, h->h_flags) &&
|
||||
!bitset(H_TRACE, h->h_flags))
|
||||
break;
|
||||
}
|
||||
|
||||
/* add to e_msgsize */
|
||||
e->e_msgsize += strlen(response) + 2 + strlen(val);
|
||||
|
||||
if (tTd(64, 10))
|
||||
dprintf("Add %s: %s\n", response, val);
|
||||
|
||||
addheader(newstr(response), val, H_USER, &e->e_header);
|
||||
if (h != NULL)
|
||||
{
|
||||
if (tTd(64, 10))
|
||||
dprintf("Replace default header %s value with %s\n",
|
||||
h->h_field, val);
|
||||
h->h_value = newstr(val);
|
||||
h->h_flags |= H_USER;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (tTd(64, 10))
|
||||
dprintf("Add %s: %s\n", response, val);
|
||||
addheader(newstr(response), val, H_USER, &e->e_header);
|
||||
}
|
||||
}
|
||||
/*
|
||||
** MILTER_CHANGEHEADER -- Change the supplied header in the message
|
||||
@ -2347,7 +2406,7 @@ milter_changeheader(response, rlen, e)
|
||||
{
|
||||
mi_int32 i, index;
|
||||
char *field, *val;
|
||||
HDR *h;
|
||||
HDR *h, *sysheader;
|
||||
|
||||
if (tTd(64, 10))
|
||||
dprintf("milter_changeheader: ");
|
||||
@ -2389,14 +2448,36 @@ milter_changeheader(response, rlen, e)
|
||||
return;
|
||||
}
|
||||
|
||||
sysheader = NULL;
|
||||
for (h = e->e_header; h != NULL; h = h->h_link)
|
||||
{
|
||||
if (bitset(H_USER, h->h_flags) &&
|
||||
strcasecmp(h->h_field, field) == 0 &&
|
||||
--index <= 0)
|
||||
break;
|
||||
if (strcasecmp(h->h_field, field) == 0)
|
||||
{
|
||||
if (bitset(H_USER, h->h_flags) &&
|
||||
--index <= 0)
|
||||
{
|
||||
sysheader = NULL;
|
||||
break;
|
||||
}
|
||||
else if (!bitset(H_USER, h->h_flags) &&
|
||||
!bitset(H_TRACE, h->h_flags))
|
||||
{
|
||||
/*
|
||||
** DRUMS msg-fmt draft says can only have
|
||||
** multiple occurences of trace fields,
|
||||
** so make sure we replace any non-trace,
|
||||
** non-user field.
|
||||
*/
|
||||
|
||||
sysheader = h;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* if not found as user-provided header at index, use sysheader */
|
||||
if (h == NULL)
|
||||
h = sysheader;
|
||||
|
||||
if (h == NULL)
|
||||
{
|
||||
if (*val == '\0')
|
||||
@ -2419,19 +2500,22 @@ milter_changeheader(response, rlen, e)
|
||||
{
|
||||
if (*val == '\0')
|
||||
{
|
||||
dprintf("Delete %s: %s\n", field,
|
||||
dprintf("Delete%s %s: %s\n",
|
||||
h == sysheader ? " (default header)" : "",
|
||||
field,
|
||||
h->h_value == NULL ? "<NULL>" : h->h_value);
|
||||
}
|
||||
else
|
||||
{
|
||||
dprintf("Change %s: from %s to %s\n",
|
||||
dprintf("Change%s %s: from %s to %s\n",
|
||||
h == sysheader ? " (default header)" : "",
|
||||
field,
|
||||
h->h_value == NULL ? "<NULL>" : h->h_value,
|
||||
val);
|
||||
}
|
||||
}
|
||||
|
||||
if (h->h_value != NULL)
|
||||
if (h != sysheader && h->h_value != NULL)
|
||||
{
|
||||
e->e_msgsize -= strlen(h->h_value);
|
||||
free(h->h_value);
|
||||
@ -2440,12 +2524,14 @@ milter_changeheader(response, rlen, e)
|
||||
if (*val == '\0')
|
||||
{
|
||||
/* Remove "Field: " from message size */
|
||||
e->e_msgsize -= strlen(h->h_field) + 2;
|
||||
if (h != sysheader)
|
||||
e->e_msgsize -= strlen(h->h_field) + 2;
|
||||
h->h_value = NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
h->h_value = newstr(val);
|
||||
h->h_flags |= H_USER;
|
||||
e->e_msgsize += strlen(h->h_value);
|
||||
}
|
||||
}
|
||||
@ -2693,17 +2779,8 @@ milter_init(e, state)
|
||||
m->mf_sock < 0 ? "open" : "negotiate");
|
||||
|
||||
/* if negotation failure, close socket */
|
||||
if (m->mf_sock >= 0)
|
||||
{
|
||||
(void) close(m->mf_sock);
|
||||
m->mf_sock = -1;
|
||||
}
|
||||
milter_error(m);
|
||||
if (m->mf_state == SMFS_ERROR)
|
||||
{
|
||||
MILTER_CHECK_ERROR(continue);
|
||||
break;
|
||||
}
|
||||
MILTER_CHECK_ERROR(continue);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3087,6 +3164,13 @@ milter_data(e, state)
|
||||
*state = SMFIR_CONTINUE;
|
||||
newfilter = TRUE;
|
||||
|
||||
/* previous problem? */
|
||||
if (m->mf_state == SMFS_ERROR)
|
||||
{
|
||||
MILTER_CHECK_ERROR(continue);
|
||||
break;
|
||||
}
|
||||
|
||||
/* sanity checks */
|
||||
if (m->mf_sock < 0 ||
|
||||
(m->mf_state != SMFS_OPEN && m->mf_state != SMFS_INMSG))
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
|
||||
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 1994, 1996-1997 Eric P. Allman. All rights reserved.
|
||||
* Copyright (c) 1994
|
||||
@ -15,7 +15,7 @@
|
||||
#include <string.h>
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: mime.c,v 8.94 1999/10/17 17:35:58 ca Exp $";
|
||||
static char id[] = "@(#)$Id: mime.c,v 8.94.16.3 2000/10/09 02:46:10 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
static int isboundary __P((char *, char **));
|
||||
@ -277,8 +277,10 @@ mime8to7(mci, header, e, boundaries, flags)
|
||||
if (tTd(43, 1))
|
||||
dprintf("mime8to7: multipart boundary \"%s\"\n", bbuf);
|
||||
for (i = 0; i < MAXMIMENESTING; i++)
|
||||
{
|
||||
if (boundaries[i] == NULL)
|
||||
break;
|
||||
}
|
||||
if (i >= MAXMIMENESTING)
|
||||
{
|
||||
usrerr("mime8to7: multipart nesting boundary too deep");
|
||||
@ -621,7 +623,7 @@ mime8to7(mci, header, e, boundaries, flags)
|
||||
linelen++;
|
||||
}
|
||||
}
|
||||
if (bitnset(c1 & 0xff, badchars))
|
||||
if (bitnset(bitidx(c1), badchars))
|
||||
{
|
||||
*bp++ = '=';
|
||||
*bp++ = Base16Code[(c1 >> 4) & 0x0f];
|
||||
@ -828,11 +830,11 @@ mimeboundary(line, boundaries)
|
||||
if (line[0] != '-' || line[1] != '-' || boundaries == NULL)
|
||||
return MBT_NOTSEP;
|
||||
i = strlen(line);
|
||||
if (line[i - 1] == '\n')
|
||||
if (i > 0 && line[i - 1] == '\n')
|
||||
i--;
|
||||
|
||||
/* strip off trailing whitespace */
|
||||
while (line[i - 1] == ' ' || line[i - 1] == '\t')
|
||||
while (i > 0 && (line[i - 1] == ' ' || line[i - 1] == '\t'))
|
||||
i--;
|
||||
savec = line[i];
|
||||
line[i] = '\0';
|
||||
@ -904,7 +906,7 @@ isboundary(line, boundaries)
|
||||
{
|
||||
register int i;
|
||||
|
||||
for (i = 0; boundaries[i] != NULL; i++)
|
||||
for (i = 0; i <= MAXMIMENESTING && boundaries[i] != NULL; i++)
|
||||
{
|
||||
if (strcmp(line, boundaries[i]) == 0)
|
||||
return i;
|
||||
|
@ -9,11 +9,11 @@
|
||||
.\" the sendmail distribution.
|
||||
.\"
|
||||
.\"
|
||||
.\" $Id: newaliases.1,v 8.15 1999/06/22 20:41:34 tony Exp $
|
||||
.\" $Id: newaliases.1,v 8.15.28.1 2000/12/14 23:08:15 gshapiro Exp $
|
||||
.\"
|
||||
.TH NEWALIASES 1 "$Date: 1999/06/22 20:41:34 $"
|
||||
.TH NEWALIASES 1 "$Date: 2000/12/14 23:08:15 $"
|
||||
.SH NAME
|
||||
.B newaliases
|
||||
newaliases
|
||||
\- rebuild the data base for the mail aliases file
|
||||
.SH SYNOPSIS
|
||||
.B newaliases
|
||||
|
@ -12,7 +12,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: parseaddr.c,v 8.234.4.5 2000/09/25 07:53:29 gshapiro Exp $";
|
||||
static char id[] = "@(#)$Id: parseaddr.c,v 8.234.4.9 2000/10/09 03:14:48 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#include <sendmail.h>
|
||||
@ -2054,7 +2054,7 @@ static struct qflags AddressFlags[] =
|
||||
{ "QDELAYED", QDELAYED },
|
||||
{ "QTHISPASS", QTHISPASS },
|
||||
{ "QRCPTOK", QRCPTOK },
|
||||
{ NULL }
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
void
|
||||
@ -2644,6 +2644,7 @@ dequote_map(map, name, av, statp)
|
||||
** rmcomm -- remove comments?
|
||||
** cnt -- count rejections (statistics)?
|
||||
** logl -- logging level
|
||||
** host -- NULL or relay host.
|
||||
**
|
||||
** Returns:
|
||||
** EX_OK -- if the rwset doesn't resolve to $#error
|
||||
@ -2651,13 +2652,14 @@ dequote_map(map, name, av, statp)
|
||||
*/
|
||||
|
||||
int
|
||||
rscheck(rwset, p1, p2, e, rmcomm, cnt, logl)
|
||||
rscheck(rwset, p1, p2, e, rmcomm, cnt, logl, host)
|
||||
char *rwset;
|
||||
char *p1;
|
||||
char *p2;
|
||||
ENVELOPE *e;
|
||||
bool rmcomm, cnt;
|
||||
int logl;
|
||||
char *host;
|
||||
{
|
||||
char *buf;
|
||||
int bufsize;
|
||||
@ -2775,7 +2777,12 @@ rscheck(rwset, p1, p2, e, rmcomm, cnt, logl)
|
||||
p2);
|
||||
p += strlen(p);
|
||||
}
|
||||
if ((relay = macvalue('_', e)) != NULL)
|
||||
|
||||
if (host != NULL)
|
||||
relay = host;
|
||||
else
|
||||
relay = macvalue('_', e);
|
||||
if (relay != NULL)
|
||||
{
|
||||
snprintf(p, SPACELEFT(lbuf, p),
|
||||
", relay=%s", relay);
|
||||
|
@ -16,9 +16,9 @@
|
||||
|
||||
#ifndef lint
|
||||
# if QUEUE
|
||||
static char id[] = "@(#)$Id: queue.c,v 8.343.4.17 2000/09/15 03:34:51 gshapiro Exp $ (with queueing)";
|
||||
static char id[] = "@(#)$Id: queue.c,v 8.343.4.38 2000/12/08 14:33:02 ca Exp $ (with queueing)";
|
||||
# else /* QUEUE */
|
||||
static char id[] = "@(#)$Id: queue.c,v 8.343.4.17 2000/09/15 03:34:51 gshapiro Exp $ (without queueing)";
|
||||
static char id[] = "@(#)$Id: queue.c,v 8.343.4.38 2000/12/08 14:33:02 ca Exp $ (without queueing)";
|
||||
# endif /* QUEUE */
|
||||
#endif /* ! lint */
|
||||
|
||||
@ -84,6 +84,7 @@ static int workcmpf4();
|
||||
*/
|
||||
|
||||
# define TEMPQF_LETTER 'T'
|
||||
# define LOSEQF_LETTER 'Q'
|
||||
|
||||
void
|
||||
queueup(e, announce)
|
||||
@ -384,6 +385,9 @@ queueup(e, announce)
|
||||
(void) putc('F', tfp);
|
||||
if (bitset(QPINGONDELAY, q->q_flags))
|
||||
(void) putc('D', tfp);
|
||||
if (q->q_alias != NULL &&
|
||||
bitset(QALIAS, q->q_alias->q_flags))
|
||||
(void) putc('A', tfp);
|
||||
(void) putc(':', tfp);
|
||||
(void) fprintf(tfp, "%s\n", denlstring(q->q_paddr, TRUE, FALSE));
|
||||
if (announce)
|
||||
@ -447,7 +451,7 @@ queueup(e, announce)
|
||||
{
|
||||
if (bitset(0200, h->h_macro))
|
||||
fprintf(tfp, "${%s}",
|
||||
macname(h->h_macro & 0377));
|
||||
macname(bitidx(h->h_macro)));
|
||||
else
|
||||
fprintf(tfp, "$%c", h->h_macro);
|
||||
}
|
||||
@ -520,7 +524,6 @@ queueup(e, announce)
|
||||
if (rename(tf, qf) < 0)
|
||||
syserr("cannot rename(%s, %s), uid=%d",
|
||||
tf, qf, geteuid());
|
||||
|
||||
/*
|
||||
** fsync() after renaming to make sure
|
||||
** metadata is written to disk on
|
||||
@ -529,8 +532,7 @@ queueup(e, announce)
|
||||
*/
|
||||
|
||||
if (tfd >= 0 && SuperSafe && fsync(tfd) < 0)
|
||||
syserr("!queueup: cannot fsync queue temp file %s",
|
||||
tf);
|
||||
syserr("!queueup: cannot fsync queue temp file %s", tf);
|
||||
|
||||
/* close and unlock old (locked) qf */
|
||||
if (e->e_lockfp != NULL)
|
||||
@ -653,6 +655,9 @@ runqueue(forkflag, verbose)
|
||||
bool ret = TRUE;
|
||||
static int curnum = 0;
|
||||
|
||||
DoQueueRun = FALSE;
|
||||
|
||||
|
||||
if (!forkflag && NumQueues > 1 && !verbose)
|
||||
forkflag = TRUE;
|
||||
|
||||
@ -710,11 +715,9 @@ run_single_queue(queuedir, forkflag, verbose)
|
||||
register ENVELOPE *e;
|
||||
int njobs;
|
||||
int sequenceno = 0;
|
||||
time_t current_la_time;
|
||||
time_t current_la_time, now;
|
||||
extern ENVELOPE BlankEnvelope;
|
||||
|
||||
DoQueueRun = FALSE;
|
||||
|
||||
/*
|
||||
** If no work will ever be selected, don't even bother reading
|
||||
** the queue.
|
||||
@ -877,10 +880,11 @@ run_single_queue(queuedir, forkflag, verbose)
|
||||
** Get new load average every 30 seconds.
|
||||
*/
|
||||
|
||||
if (current_la_time < curtime() - 30)
|
||||
now = curtime();
|
||||
if (current_la_time < now - 30)
|
||||
{
|
||||
CurrentLA = sm_getla(e);
|
||||
current_la_time = curtime();
|
||||
current_la_time = now;
|
||||
}
|
||||
if (shouldqueue(WkRecipFact, current_la_time))
|
||||
{
|
||||
@ -993,6 +997,7 @@ runqueueevent()
|
||||
# define NEED_T 002
|
||||
# define NEED_R 004
|
||||
# define NEED_S 010
|
||||
# define NEED_H 020
|
||||
|
||||
static WORK *WorkList = NULL;
|
||||
static int WorkListSize = 0;
|
||||
@ -1163,6 +1168,7 @@ orderq(queuedir, doall)
|
||||
|
||||
/* open control file */
|
||||
cf = fopen(qf, "r");
|
||||
|
||||
if (cf == NULL)
|
||||
{
|
||||
/* this may be some random person sending hir msgs */
|
||||
@ -1185,6 +1191,11 @@ orderq(queuedir, doall)
|
||||
|
||||
/* extract useful information */
|
||||
i = NEED_P | NEED_T;
|
||||
if (QueueSortOrder == QSO_BYHOST)
|
||||
{
|
||||
/* need w_host set for host sort order */
|
||||
i |= NEED_H;
|
||||
}
|
||||
if (QueueLimitSender != NULL)
|
||||
i |= NEED_S;
|
||||
if (QueueLimitRecipient != NULL)
|
||||
@ -1226,6 +1237,7 @@ orderq(queuedir, doall)
|
||||
{
|
||||
w->w_host = strrev(&p[1]);
|
||||
makelower(w->w_host);
|
||||
i &= ~NEED_H;
|
||||
}
|
||||
if (QueueLimitRecipient == NULL)
|
||||
{
|
||||
@ -1952,6 +1964,7 @@ readqf(e)
|
||||
u_long qflags;
|
||||
ADDRESS *q;
|
||||
int mid;
|
||||
time_t now;
|
||||
auto char *ep;
|
||||
|
||||
if (tTd(40, 4))
|
||||
@ -2013,6 +2026,11 @@ readqf(e)
|
||||
case 'P':
|
||||
qflags |= QPRIMARY;
|
||||
break;
|
||||
|
||||
case 'A':
|
||||
if (ctladdr != NULL)
|
||||
ctladdr->q_flags |= QALIAS;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -2088,12 +2106,13 @@ readqf(e)
|
||||
e->e_ntries = atoi(&buf[1]);
|
||||
|
||||
/* if this has been tried recently, let it be */
|
||||
if (e->e_ntries > 0 && e->e_dtime <= curtime() &&
|
||||
curtime() < e->e_dtime + queuedelay(e))
|
||||
now = curtime();
|
||||
if (e->e_ntries > 0 && e->e_dtime <= now &&
|
||||
now < e->e_dtime + queuedelay(e))
|
||||
{
|
||||
char *howlong;
|
||||
|
||||
howlong = pintvl(curtime() - e->e_dtime, TRUE);
|
||||
howlong = pintvl(now - e->e_dtime, TRUE);
|
||||
if (Verbose)
|
||||
printf("%s: too young (%s)\n",
|
||||
e->e_id, howlong);
|
||||
@ -2183,6 +2202,9 @@ readqf(e)
|
||||
char *p;
|
||||
|
||||
mid = macid(&bp[1], &ep);
|
||||
if (mid == 0)
|
||||
break;
|
||||
|
||||
p = newstr(ep);
|
||||
define(mid, p, e);
|
||||
|
||||
@ -2339,7 +2361,7 @@ printqueue()
|
||||
** queuedir -- queue directory
|
||||
**
|
||||
** Returns:
|
||||
** none.
|
||||
** number of entries
|
||||
**
|
||||
** Side Effects:
|
||||
** Prints a listing of the mail queue on the standard output.
|
||||
@ -2618,9 +2640,9 @@ queuename(e, type)
|
||||
sub = "/df";
|
||||
break;
|
||||
|
||||
case 'T':
|
||||
case TEMPQF_LETTER:
|
||||
case 't':
|
||||
case 'Q':
|
||||
case LOSEQF_LETTER:
|
||||
case 'q':
|
||||
if (bitset(QP_SUBQF, QPaths[e->e_queuedir].qp_subdirs))
|
||||
sub = "/qf";
|
||||
@ -2873,8 +2895,6 @@ setctluser(user, qfver)
|
||||
** none.
|
||||
*/
|
||||
|
||||
# define LOSEQF_LETTER 'Q'
|
||||
|
||||
void
|
||||
loseqfile(e, why)
|
||||
register ENVELOPE *e;
|
||||
@ -3138,7 +3158,7 @@ multiqueue_cache()
|
||||
syserr("QueueDirectory: can not wildcard relative path");
|
||||
if (tTd(41, 2))
|
||||
dprintf("multiqueue_cache: \"%s\": Can not wildcard relative path.\n",
|
||||
QueueDir);
|
||||
qpath);
|
||||
ExitStat = EX_CONFIG;
|
||||
return;
|
||||
}
|
||||
|
@ -12,7 +12,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: readcf.c,v 8.382.4.27 2000/09/28 01:31:16 gshapiro Exp $";
|
||||
static char id[] = "@(#)$Id: readcf.c,v 8.382.4.31 2000/12/18 18:00:43 ca Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#include <sendmail.h>
|
||||
@ -356,6 +356,8 @@ readcf(cfname, safe, e)
|
||||
|
||||
case 'D': /* macro definition */
|
||||
mid = macid(&bp[1], &ep);
|
||||
if (mid == 0)
|
||||
break;
|
||||
p = munchstring(ep, NULL, '\0');
|
||||
define(mid, newstr(p), e);
|
||||
break;
|
||||
@ -369,6 +371,8 @@ readcf(cfname, safe, e)
|
||||
if (bp[0] == 'C')
|
||||
{
|
||||
mid = macid(&bp[1], &ep);
|
||||
if (mid == 0)
|
||||
break;
|
||||
expand(ep, exbuf, sizeof exbuf, e);
|
||||
p = exbuf;
|
||||
}
|
||||
@ -397,6 +401,8 @@ readcf(cfname, safe, e)
|
||||
|
||||
case 'F': /* word class from file */
|
||||
mid = macid(&bp[1], &ep);
|
||||
if (mid == 0)
|
||||
break;
|
||||
for (p = ep; isascii(*p) && isspace(*p); )
|
||||
p++;
|
||||
if (p[0] == '-' && p[1] == 'o')
|
||||
@ -869,7 +875,10 @@ makemailer(line)
|
||||
if (*p != '\0')
|
||||
*p++ = '\0';
|
||||
if (line[0] == '\0')
|
||||
{
|
||||
syserr("name required for mailer");
|
||||
return;
|
||||
}
|
||||
m->m_name = newstr(line);
|
||||
|
||||
/* now scan through and assign info from the fields */
|
||||
@ -901,13 +910,14 @@ makemailer(line)
|
||||
case 'P': /* pathname */
|
||||
if (*p == '\0')
|
||||
syserr("mailer %s: empty path name", m->m_name);
|
||||
m->m_mailer = newstr(p);
|
||||
else
|
||||
m->m_mailer = newstr(p);
|
||||
break;
|
||||
|
||||
case 'F': /* flags */
|
||||
for (; *p != '\0'; p++)
|
||||
if (!(isascii(*p) && isspace(*p)))
|
||||
setbitn(*p, m->m_flags);
|
||||
setbitn(bitidx(*p), m->m_flags);
|
||||
break;
|
||||
|
||||
case 'S': /* sender rewriting ruleset */
|
||||
@ -937,14 +947,16 @@ makemailer(line)
|
||||
if (*p == '\0')
|
||||
syserr("mailer %s: null end-of-line string",
|
||||
m->m_name);
|
||||
m->m_eol = newstr(p);
|
||||
else
|
||||
m->m_eol = newstr(p);
|
||||
break;
|
||||
|
||||
case 'A': /* argument vector */
|
||||
if (*p == '\0')
|
||||
syserr("mailer %s: null argument vector",
|
||||
m->m_name);
|
||||
m->m_argv = makeargv(p);
|
||||
else
|
||||
m->m_argv = makeargv(p);
|
||||
break;
|
||||
|
||||
case 'M': /* maximum message size */
|
||||
@ -975,13 +987,15 @@ makemailer(line)
|
||||
if (*p == '\0')
|
||||
syserr("mailer %s: null working directory",
|
||||
m->m_name);
|
||||
m->m_execdir = newstr(p);
|
||||
else
|
||||
m->m_execdir = newstr(p);
|
||||
break;
|
||||
|
||||
case 'C': /* default charset */
|
||||
if (*p == '\0')
|
||||
syserr("mailer %s: null charset", m->m_name);
|
||||
m->m_defcharset = newstr(p);
|
||||
else
|
||||
m->m_defcharset = newstr(p);
|
||||
break;
|
||||
|
||||
case 'T': /* MTA-Name/Address/Diagnostic types */
|
||||
@ -1030,11 +1044,17 @@ makemailer(line)
|
||||
if (*p != '\0')
|
||||
*p++ = '\0';
|
||||
if (*q == '\0')
|
||||
{
|
||||
syserr("mailer %s: null user name",
|
||||
m->m_name);
|
||||
break;
|
||||
}
|
||||
pw = sm_getpwnam(q);
|
||||
if (pw == NULL)
|
||||
{
|
||||
syserr("readcf: mailer U= flag: unknown user %s", q);
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
m->m_uid = pw->pw_uid;
|
||||
@ -1065,11 +1085,17 @@ makemailer(line)
|
||||
p++;
|
||||
*p++ = '\0';
|
||||
if (*q == '\0')
|
||||
{
|
||||
syserr("mailer %s: null group name",
|
||||
m->m_name);
|
||||
break;
|
||||
}
|
||||
gr = getgrnam(q);
|
||||
if (gr == NULL)
|
||||
{
|
||||
syserr("readcf: mailer U= flag: unknown group %s", q);
|
||||
break;
|
||||
}
|
||||
else
|
||||
m->m_gid = gr->gr_gid;
|
||||
}
|
||||
@ -1137,6 +1163,7 @@ makemailer(line)
|
||||
#if _FFR_REMOVE_TCP_MAILER_PATH
|
||||
syserr("M%s: P=[TCP] is deprecated, use P=[IPC] instead\n",
|
||||
m->m_name);
|
||||
return;
|
||||
#else /* _FFR_REMOVE_TCP_MAILER_PATH */
|
||||
printf("M%s: Warning: P=[TCP] is deprecated, use P=[IPC] instead\n",
|
||||
m->m_name);
|
||||
@ -1155,6 +1182,7 @@ makemailer(line)
|
||||
{
|
||||
syserr("M%s: too few parameters for %s mailer",
|
||||
m->m_name, m->m_mailer);
|
||||
return;
|
||||
}
|
||||
if (strcmp(m->m_argv[0], "TCP") != 0
|
||||
#if NETUNIX
|
||||
@ -1186,11 +1214,13 @@ makemailer(line)
|
||||
m->m_name,
|
||||
(m->m_argv[0] == NULL ||
|
||||
m->m_argv[1] == NULL) ? "few" : "many");
|
||||
return;
|
||||
}
|
||||
else if (strcmp(m->m_argv[0], "FILE") != 0)
|
||||
{
|
||||
syserr("M%s: first argument in [FILE] mailer must be FILE",
|
||||
m->m_name);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1956,6 +1986,7 @@ setoption(opt, val, safe, sticky, e)
|
||||
case SM_DEFER: /* queue only and defer map lookups */
|
||||
#if !QUEUE
|
||||
syserr("need QUEUE to set -odqueue or -oddefer");
|
||||
break;
|
||||
#endif /* !QUEUE */
|
||||
/* FALLTHROUGH */
|
||||
|
||||
@ -2115,12 +2146,14 @@ setoption(opt, val, safe, sticky, e)
|
||||
break;
|
||||
|
||||
case 'M': /* define macro */
|
||||
sticky = FALSE;
|
||||
mid = macid(val, &ep);
|
||||
if (mid == 0)
|
||||
break;
|
||||
p = newstr(ep);
|
||||
if (!safe)
|
||||
cleanstrcpy(p, p, MAXNAME);
|
||||
define(mid, p, CurEnv);
|
||||
sticky = FALSE;
|
||||
break;
|
||||
|
||||
case 'm': /* send to me too */
|
||||
@ -2136,9 +2169,7 @@ setoption(opt, val, safe, sticky, e)
|
||||
case 'O': /* daemon options */
|
||||
#if DAEMON
|
||||
if (!setdaemonoptions(val))
|
||||
{
|
||||
syserr("too many daemons defined (%d max)", MAXDAEMONS);
|
||||
}
|
||||
#else /* DAEMON */
|
||||
syserr("DaemonPortOptions (O option) set but DAEMON not compiled in");
|
||||
#endif /* DAEMON */
|
||||
@ -2175,7 +2206,8 @@ setoption(opt, val, safe, sticky, e)
|
||||
}
|
||||
if (pv->pv_name == NULL)
|
||||
syserr("readcf: Op line: %s unrecognized", val);
|
||||
PrivacyFlags |= pv->pv_flag;
|
||||
else
|
||||
PrivacyFlags |= pv->pv_flag;
|
||||
}
|
||||
sticky = FALSE;
|
||||
break;
|
||||
@ -2262,7 +2294,10 @@ setoption(opt, val, safe, sticky, e)
|
||||
DefUid = -1;
|
||||
pw = sm_getpwnam(val);
|
||||
if (pw == NULL)
|
||||
{
|
||||
syserr("readcf: option u: unknown user %s", val);
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
DefUid = pw->pw_uid;
|
||||
@ -2275,7 +2310,8 @@ setoption(opt, val, safe, sticky, e)
|
||||
if (DefUid > UID_MAX)
|
||||
{
|
||||
syserr("readcf: option u: uid value (%ld) > UID_MAX (%ld); ignored",
|
||||
DefUid, UID_MAX);
|
||||
(long) DefUid, (long) UID_MAX);
|
||||
break;
|
||||
}
|
||||
#endif /* UID_MAX */
|
||||
|
||||
@ -2540,7 +2576,10 @@ setoption(opt, val, safe, sticky, e)
|
||||
|
||||
pw = sm_getpwnam(val);
|
||||
if (pw == NULL)
|
||||
{
|
||||
syserr("readcf: option RunAsUser: unknown user %s", val);
|
||||
break;
|
||||
}
|
||||
else if (can_setuid)
|
||||
{
|
||||
if (*p == '\0')
|
||||
@ -2553,7 +2592,8 @@ setoption(opt, val, safe, sticky, e)
|
||||
if (RunAsUid > UID_MAX)
|
||||
{
|
||||
syserr("readcf: option RunAsUser: uid value (%ld) > UID_MAX (%ld); ignored",
|
||||
RunAsUid, UID_MAX);
|
||||
(long) RunAsUid, (long) UID_MAX);
|
||||
break;
|
||||
}
|
||||
#endif /* UID_MAX */
|
||||
if (*p != '\0')
|
||||
@ -2679,7 +2719,10 @@ setoption(opt, val, safe, sticky, e)
|
||||
TrustedUid = 0;
|
||||
pw = sm_getpwnam(val);
|
||||
if (pw == NULL)
|
||||
{
|
||||
syserr("readcf: option TrustedUser: unknown user %s", val);
|
||||
break;
|
||||
}
|
||||
else
|
||||
TrustedUid = pw->pw_uid;
|
||||
}
|
||||
@ -2688,7 +2731,7 @@ setoption(opt, val, safe, sticky, e)
|
||||
if (TrustedUid > UID_MAX)
|
||||
{
|
||||
syserr("readcf: option TrustedUser: uid value (%ld) > UID_MAX (%ld)",
|
||||
TrustedUid, UID_MAX);
|
||||
(long) TrustedUid, (long) UID_MAX);
|
||||
TrustedUid = 0;
|
||||
}
|
||||
# endif /* UID_MAX */
|
||||
@ -2997,7 +3040,7 @@ setclass(class, str)
|
||||
|
||||
str++;
|
||||
mid = macid(str, NULL);
|
||||
if (mid == '\0')
|
||||
if (mid == 0)
|
||||
return;
|
||||
|
||||
if (tTd(37, 8))
|
||||
@ -3011,7 +3054,7 @@ setclass(class, str)
|
||||
dprintf("setclass(%s, %s)\n", macname(class), str);
|
||||
|
||||
s = stab(str, ST_CLASS, ST_ENTER);
|
||||
setbitn(class, s->s_class);
|
||||
setbitn(bitidx(class), s->s_class);
|
||||
}
|
||||
}
|
||||
/*
|
||||
@ -3209,7 +3252,7 @@ strtorwset(p, endp, stabmode)
|
||||
{
|
||||
s->s_ruleset = ruleset;
|
||||
}
|
||||
if (stabmode == ST_ENTER)
|
||||
if (stabmode == ST_ENTER && ruleset >= 0)
|
||||
{
|
||||
char *h = NULL;
|
||||
|
||||
@ -3334,7 +3377,11 @@ settimeout(name, val, sticky)
|
||||
}
|
||||
|
||||
if (to->to_name == NULL)
|
||||
{
|
||||
errno = 0; /* avoid bogus error text */
|
||||
syserr("settimeout: invalid timeout %s", name);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
** See if this option is preset for us.
|
||||
|
@ -12,7 +12,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: savemail.c,v 8.212.4.5 2000/08/22 22:46:00 gshapiro Exp $";
|
||||
static char id[] = "@(#)$Id: savemail.c,v 8.212.4.11 2000/12/18 18:00:44 ca Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#include <sendmail.h>
|
||||
@ -614,7 +614,7 @@ returntosender(msg, returnq, flags, e)
|
||||
addheader("MIME-Version", "1.0", 0, &ee->e_header);
|
||||
|
||||
(void) snprintf(buf, sizeof buf, "%s.%ld/%.100s",
|
||||
ee->e_id, curtime(), MyHostName);
|
||||
ee->e_id, (long) curtime(), MyHostName);
|
||||
ee->e_msgboundary = newstr(buf);
|
||||
(void) snprintf(buf, sizeof buf,
|
||||
#if DSN
|
||||
@ -993,6 +993,8 @@ errbody(mci, e, separator)
|
||||
|
||||
if (e->e_msgboundary != NULL)
|
||||
{
|
||||
time_t now = curtime();
|
||||
|
||||
putline("", mci);
|
||||
(void) snprintf(buf, sizeof buf, "--%s", e->e_msgboundary);
|
||||
putline(buf, mci);
|
||||
@ -1046,7 +1048,13 @@ errbody(mci, e, separator)
|
||||
char *action;
|
||||
|
||||
if (QS_IS_BADADDR(q->q_state))
|
||||
{
|
||||
/* RFC 1891, 6.2.6 (b) */
|
||||
if (bitset(QHASNOTIFY, q->q_flags) &&
|
||||
!bitset(QPINGONFAILURE, q->q_flags))
|
||||
continue;
|
||||
action = "failed";
|
||||
}
|
||||
else if (!bitset(QPRIMARY, q->q_flags))
|
||||
continue;
|
||||
else if (bitset(QDELIVERED, q->q_flags))
|
||||
@ -1196,7 +1204,7 @@ errbody(mci, e, separator)
|
||||
|
||||
/* Last-Attempt-Date: -- fine granularity */
|
||||
if (q->q_statdate == (time_t) 0L)
|
||||
q->q_statdate = curtime();
|
||||
q->q_statdate = now;
|
||||
(void) snprintf(buf, sizeof buf,
|
||||
"Last-Attempt-Date: %s",
|
||||
arpadate(ctime(&q->q_statdate)));
|
||||
|
@ -9,11 +9,11 @@
|
||||
.\" the sendmail distribution.
|
||||
.\"
|
||||
.\"
|
||||
.\" $Id: sendmail.8,v 8.36.8.2 2000/09/07 21:14:00 ca Exp $
|
||||
.\" $Id: sendmail.8,v 8.36.8.3 2000/12/14 23:08:15 gshapiro Exp $
|
||||
.\"
|
||||
.TH SENDMAIL 8 "$Date: 2000/09/07 21:14:00 $"
|
||||
.TH SENDMAIL 8 "$Date: 2000/12/14 23:08:15 $"
|
||||
.SH NAME
|
||||
.B sendmail
|
||||
sendmail
|
||||
\- an electronic mail transport agent
|
||||
.SH SYNOPSIS
|
||||
.B sendmail
|
||||
|
@ -20,7 +20,7 @@
|
||||
#ifdef _DEFINE
|
||||
# define EXTERN
|
||||
# ifndef lint
|
||||
static char SmailId[] = "@(#)$Id: sendmail.h,v 8.517.4.37 2000/09/25 07:53:29 gshapiro Exp $";
|
||||
static char SmailId[] = "@(#)$Id: sendmail.h,v 8.517.4.45 2000/12/28 23:46:44 gshapiro Exp $";
|
||||
# endif /* ! lint */
|
||||
#else /* _DEFINE */
|
||||
# define EXTERN extern
|
||||
@ -226,14 +226,14 @@ typedef struct address ADDRESS;
|
||||
#define QS_QUEUEUP 3 /* save address in queue */
|
||||
#define QS_VERIFIED 4 /* verified, but not expanded */
|
||||
#define QS_DONTSEND 5 /* don't send to this address */
|
||||
#define QS_EXPANDED 6 /* expanded */
|
||||
#define QS_SENDER 7 /* message sender (MeToo) */
|
||||
#define QS_CLONED 8 /* addr cloned to a split envelope */
|
||||
#define QS_DISCARDED 9 /* recipient discarded (EF_DISCARD) */
|
||||
#define QS_REPLACED 10 /* maplocaluser()/UserDB replaced */
|
||||
#define QS_REMOVED 11 /* removed (removefromlist()) */
|
||||
#define QS_DUPLICATE 12 /* duplicate suppressed */
|
||||
#define QS_INCLUDED 13 /* :include: delivery */
|
||||
#define QS_EXPANDED 6 /* QS_DONTSEND: expanded */
|
||||
#define QS_SENDER 7 /* QS_DONTSEND: message sender (MeToo) */
|
||||
#define QS_CLONED 8 /* QS_DONTSEND: addr cloned to split envelope */
|
||||
#define QS_DISCARDED 9 /* QS_DONTSEND: rcpt discarded (EF_DISCARD) */
|
||||
#define QS_REPLACED 10 /* QS_DONTSEND: maplocaluser()/UserDB replaced */
|
||||
#define QS_REMOVED 11 /* QS_DONTSEND: removed (removefromlist()) */
|
||||
#define QS_DUPLICATE 12 /* QS_DONTSEND: duplicate suppressed */
|
||||
#define QS_INCLUDED 13 /* QS_DONTSEND: :include: delivery */
|
||||
|
||||
/* address state testing primitives */
|
||||
#define QS_IS_OK(s) ((s) == QS_OK)
|
||||
@ -459,6 +459,8 @@ MCI
|
||||
#else /* STARTTLS */
|
||||
#define MCIF_EXTENS (MCIF_EXPN | MCIF_SIZE | MCIF_8BITMIME | MCIF_DSN | MCIF_8BITOK | MCIF_AUTH | MCIF_ENHSTAT)
|
||||
#endif /* STARTTLS */
|
||||
#define MCIF_ONLY_EHLO 0x10000000 /* use only EHLO in smtpinit */
|
||||
|
||||
|
||||
/* states */
|
||||
#define MCIS_CLOSED 0 /* no traffic on this connection */
|
||||
@ -627,7 +629,7 @@ struct envelope
|
||||
int e_ntries; /* number of delivery attempts */
|
||||
dev_t e_dfdev; /* df file's device, for crash recov */
|
||||
ino_t e_dfino; /* df file's ino, for crash recovery */
|
||||
char *e_macro[256]; /* macro definitions */
|
||||
char *e_macro[MAXMACROID + 1]; /* macro definitions */
|
||||
char *e_if_macros[2]; /* HACK: incoming interface info */
|
||||
char *e_auth_param;
|
||||
TIMERS e_timers; /* per job timers */
|
||||
@ -776,7 +778,7 @@ extern void expand __P((char *, char *, size_t, ENVELOPE *));
|
||||
extern int macid __P((char *, char **));
|
||||
extern char *macname __P((int));
|
||||
extern char *macvalue __P((int, ENVELOPE *));
|
||||
extern int rscheck __P((char *, char *, char *, ENVELOPE *, bool, bool, int));
|
||||
extern int rscheck __P((char *, char *, char *, ENVELOPE *, bool, bool, int, char *));
|
||||
extern void setclass __P((int, char *));
|
||||
extern int strtorwset __P((char *, char **, int));
|
||||
extern void translate_dollars __P((char *));
|
||||
@ -1870,7 +1872,7 @@ extern void apps_ssl_info_cb __P((SSL *, int , int));
|
||||
extern bool inittls __P((SSL_CTX **, u_long, bool, char *, char *, char *, char *, char *));
|
||||
extern bool initclttls __P((void));
|
||||
extern bool initsrvtls __P((void));
|
||||
extern int tls_get_info __P((SSL *, ENVELOPE *, bool, char *));
|
||||
extern int tls_get_info __P((SSL *, ENVELOPE *, bool, char *, bool));
|
||||
extern int endtls __P((SSL *, char *));
|
||||
extern int endtlsclt __P((MCI *));
|
||||
extern void tlslogerr __P((void));
|
||||
@ -2044,7 +2046,6 @@ extern void queueup_macros __P((int, FILE *, ENVELOPE *));
|
||||
extern SIGFUNC_DECL quiesce __P((int));
|
||||
extern void readcf __P((char *, bool, ENVELOPE *));
|
||||
extern SIGFUNC_DECL reapchild __P((int));
|
||||
extern bool refuseconnections __P((char *, ENVELOPE *, int));
|
||||
extern int releasesignal __P((int));
|
||||
extern void resetlimits __P((void));
|
||||
extern bool rfc822_string __P((char *));
|
||||
|
@ -9,7 +9,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: sfsasl.c,v 8.17.4.8 2000/09/14 00:14:13 ca Exp $";
|
||||
static char id[] = "@(#)$Id: sfsasl.c,v 8.17.4.13 2000/11/03 00:24:49 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#if SFIO
|
||||
@ -27,6 +27,9 @@ static char id[] = "@(#)$Id: sfsasl.c,v 8.17.4.8 2000/09/14 00:14:13 ca Exp $";
|
||||
# include <sasl.h>
|
||||
# include "sfsasl.h"
|
||||
|
||||
/* how to deallocate a buffer allocated by SASL */
|
||||
# define SASL_DEALLOC(b) free(b)
|
||||
|
||||
static ssize_t
|
||||
sasl_read(f, buf, size, disc)
|
||||
Sfio_t *f;
|
||||
@ -35,29 +38,61 @@ sasl_read(f, buf, size, disc)
|
||||
Sfdisc_t *disc;
|
||||
{
|
||||
int len, result;
|
||||
char *outbuf;
|
||||
unsigned int outlen;
|
||||
static char *outbuf = NULL;
|
||||
static unsigned int outlen = 0;
|
||||
static unsigned int offset = 0;
|
||||
Sasldisc_t *sd = (Sasldisc_t *) disc;
|
||||
|
||||
len = sfrd(f, buf, size, disc);
|
||||
/*
|
||||
** sasl_decode() may require more data than a single read() returns.
|
||||
** Hence we have to put a loop around the decoding.
|
||||
** This also requires that we may have to split up the returned
|
||||
** data since it might be larger than the allowed size.
|
||||
** Therefore we use a static pointer and return portions of it
|
||||
** if necessary.
|
||||
*/
|
||||
|
||||
if (len <= 0)
|
||||
return len;
|
||||
|
||||
result = sasl_decode(sd->conn, buf, len, &outbuf, &outlen);
|
||||
|
||||
if (result != SASL_OK)
|
||||
while (outbuf == NULL && outlen == 0)
|
||||
{
|
||||
/* eventually, we'll want an exception here */
|
||||
return -1;
|
||||
len = sfrd(f, buf, size, disc);
|
||||
if (len <= 0)
|
||||
return len;
|
||||
result = sasl_decode(sd->conn, buf, len, &outbuf, &outlen);
|
||||
if (result != SASL_OK)
|
||||
{
|
||||
outbuf = NULL;
|
||||
offset = 0;
|
||||
outlen = 0;
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
if (outbuf != NULL)
|
||||
{
|
||||
(void)memcpy(buf, outbuf, outlen);
|
||||
free(outbuf);
|
||||
if (outlen - offset > size)
|
||||
{
|
||||
/* return another part of the buffer */
|
||||
(void) memcpy(buf, outbuf + offset, (size_t) size);
|
||||
offset += size;
|
||||
result = size;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* return the rest of the buffer */
|
||||
result = outlen - offset;
|
||||
(void) memcpy(buf, outbuf + offset, (size_t) result);
|
||||
SASL_DEALLOC(outbuf);
|
||||
outbuf = NULL;
|
||||
offset = 0;
|
||||
outlen = 0;
|
||||
}
|
||||
}
|
||||
return outlen;
|
||||
else
|
||||
{
|
||||
/* be paranoid: outbuf == NULL but outlen != 0 */
|
||||
syserr("!sasl_read failure: outbuf == NULL but outlen != 0");
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static ssize_t
|
||||
@ -75,15 +110,12 @@ sasl_write(f, buf, size, disc)
|
||||
result = sasl_encode(sd->conn, buf, size, &outbuf, &outlen);
|
||||
|
||||
if (result != SASL_OK)
|
||||
{
|
||||
/* eventually, we'll want an exception here */
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (outbuf != NULL)
|
||||
{
|
||||
sfwr(f, outbuf, outlen, disc);
|
||||
free(outbuf);
|
||||
SASL_DEALLOC(outbuf);
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
@ -16,9 +16,9 @@
|
||||
|
||||
#ifndef lint
|
||||
# if SMTP
|
||||
static char id[] = "@(#)$Id: srvrsmtp.c,v 8.471.2.2.2.58 2000/09/21 21:52:18 ca Exp $ (with SMTP)";
|
||||
static char id[] = "@(#)$Id: srvrsmtp.c,v 8.471.2.2.2.66 2000/12/18 18:00:44 ca Exp $ (with SMTP)";
|
||||
# else /* SMTP */
|
||||
static char id[] = "@(#)$Id: srvrsmtp.c,v 8.471.2.2.2.58 2000/09/21 21:52:18 ca Exp $ (without SMTP)";
|
||||
static char id[] = "@(#)$Id: srvrsmtp.c,v 8.471.2.2.2.66 2000/12/18 18:00:44 ca Exp $ (without SMTP)";
|
||||
# endif /* SMTP */
|
||||
#endif /* ! lint */
|
||||
|
||||
@ -376,8 +376,8 @@ smtp(nullserver, d_flags, e)
|
||||
saveSuprErrs = SuprErrs;
|
||||
SuprErrs = TRUE;
|
||||
QuickAbort = FALSE;
|
||||
if (rscheck("offer_tls", CurSmtpClient, "", e, TRUE, FALSE, 8) != EX_OK
|
||||
|| Errors > 0)
|
||||
if (rscheck("offer_tls", CurSmtpClient, "", e, TRUE, FALSE, 8,
|
||||
NULL) != EX_OK || Errors > 0)
|
||||
usetls = FALSE;
|
||||
QuickAbort = saveQuickAbort;
|
||||
SuprErrs = saveSuprErrs;
|
||||
@ -1054,7 +1054,7 @@ smtp(nullserver, d_flags, e)
|
||||
|
||||
/* ignore return code for now, it's in {verify} */
|
||||
(void) tls_get_info(srv_ssl, &BlankEnvelope, TRUE,
|
||||
CurSmtpClient);
|
||||
CurSmtpClient, TRUE);
|
||||
|
||||
/*
|
||||
** call Stls_client to find out whether
|
||||
@ -1067,8 +1067,8 @@ smtp(nullserver, d_flags, e)
|
||||
QuickAbort = FALSE;
|
||||
if (rscheck("tls_client",
|
||||
macvalue(macid("{verify}", NULL), e),
|
||||
"STARTTLS", e, TRUE, TRUE, 6) != EX_OK ||
|
||||
Errors > 0)
|
||||
"STARTTLS", e, TRUE, TRUE, 6, NULL) !=
|
||||
EX_OK || Errors > 0)
|
||||
{
|
||||
extern char MsgBuf[];
|
||||
|
||||
@ -1520,7 +1520,7 @@ smtp(nullserver, d_flags, e)
|
||||
|
||||
/* do config file checking of the sender */
|
||||
if (rscheck("check_mail", addr,
|
||||
NULL, e, TRUE, TRUE, 4) != EX_OK ||
|
||||
NULL, e, TRUE, TRUE, 4, NULL) != EX_OK ||
|
||||
Errors > 0)
|
||||
goto undo_subproc_no_pm;
|
||||
|
||||
@ -1715,7 +1715,7 @@ smtp(nullserver, d_flags, e)
|
||||
|
||||
/* do config file checking of the recipient */
|
||||
if (rscheck("check_rcpt", addr,
|
||||
NULL, e, TRUE, TRUE, 4) != EX_OK ||
|
||||
NULL, e, TRUE, TRUE, 4, NULL) != EX_OK ||
|
||||
Errors > 0)
|
||||
break;
|
||||
|
||||
@ -2074,13 +2074,19 @@ smtp(nullserver, d_flags, e)
|
||||
{
|
||||
/* do config file checking of the address */
|
||||
if (rscheck(vrfy ? "check_vrfy" : "check_expn",
|
||||
p, NULL, e, TRUE, FALSE, 4)
|
||||
p, NULL, e, TRUE, FALSE, 4, NULL)
|
||||
!= EX_OK || Errors > 0)
|
||||
goto undo_subproc;
|
||||
(void) sendtolist(p, NULLADDR, &vrfyqueue, 0, e);
|
||||
}
|
||||
if (wt > 0)
|
||||
(void) sleep(wt - (curtime() - previous));
|
||||
{
|
||||
time_t t;
|
||||
|
||||
t = wt - (curtime() - previous);
|
||||
if (t > 0)
|
||||
(void) sleep(t);
|
||||
}
|
||||
if (Errors > 0)
|
||||
goto undo_subproc;
|
||||
if (vrfyqueue == NULL)
|
||||
@ -2141,8 +2147,8 @@ smtp(nullserver, d_flags, e)
|
||||
"ETRN", e);
|
||||
|
||||
/* do config file checking of the parameter */
|
||||
if (rscheck("check_etrn", p, NULL, e, TRUE, FALSE, 4)
|
||||
!= EX_OK || Errors > 0)
|
||||
if (rscheck("check_etrn", p, NULL, e, TRUE, FALSE, 4,
|
||||
NULL) != EX_OK || Errors > 0)
|
||||
break;
|
||||
|
||||
if (LogLevel > 5)
|
||||
@ -2330,7 +2336,7 @@ doquit:
|
||||
** e -- the current envelope.
|
||||
**
|
||||
** Returns:
|
||||
** none.
|
||||
** time to wait.
|
||||
**
|
||||
** Side Effects:
|
||||
** Slows down if we seem to be under attack.
|
||||
@ -2448,7 +2454,7 @@ mail_esmtp_args(kp, vp, e)
|
||||
/* NOTREACHED */
|
||||
}
|
||||
define(macid("{msg_size}", NULL), newstr(vp), e);
|
||||
e->e_msgsize = strtol(vp, (char **) NULL, 10);
|
||||
e->e_msgsize = strtol(vp, (char **) NULL, 10);
|
||||
if (e->e_msgsize == LONG_MAX && errno == ERANGE)
|
||||
{
|
||||
usrerr("552 5.2.3 Message size exceeds maximum value");
|
||||
@ -2580,8 +2586,8 @@ mail_esmtp_args(kp, vp, e)
|
||||
SuprErrs = TRUE;
|
||||
QuickAbort = FALSE;
|
||||
if (strcmp(auth_param, "<>") != 0 &&
|
||||
(rscheck("trust_auth", pbuf, NULL, e, TRUE, FALSE, 10)
|
||||
!= EX_OK || Errors > 0))
|
||||
(rscheck("trust_auth", pbuf, NULL, e, TRUE, FALSE, 10,
|
||||
NULL) != EX_OK || Errors > 0))
|
||||
{
|
||||
if (tTd(95, 8))
|
||||
{
|
||||
@ -2800,6 +2806,7 @@ runinchild(label, e)
|
||||
|
||||
(void) blocksignal(SIGCHLD);
|
||||
|
||||
|
||||
childpid = dofork();
|
||||
if (childpid < 0)
|
||||
{
|
||||
@ -2889,6 +2896,7 @@ saslmechs(conn, mechlist)
|
||||
sm_syslog(LOG_WARNING, NOQID,
|
||||
"SASL error: listmech=%d, num=%d",
|
||||
result, num);
|
||||
num = 0;
|
||||
}
|
||||
return num;
|
||||
}
|
||||
@ -3812,6 +3820,7 @@ initsrvtls()
|
||||
** e -- current envelope
|
||||
** srv -- server or client
|
||||
** host -- hostname of other side
|
||||
** log -- log connection information?
|
||||
**
|
||||
** Returns:
|
||||
** result of authentication.
|
||||
@ -3822,11 +3831,12 @@ initsrvtls()
|
||||
*/
|
||||
|
||||
int
|
||||
tls_get_info(ssl, e, srv, host)
|
||||
tls_get_info(ssl, e, srv, host, log)
|
||||
SSL *ssl;
|
||||
ENVELOPE *e;
|
||||
bool srv;
|
||||
char *host;
|
||||
bool log;
|
||||
{
|
||||
SSL_CIPHER *c;
|
||||
int b, r;
|
||||
@ -3849,7 +3859,7 @@ tls_get_info(ssl, e, srv, host)
|
||||
define(macid("{tls_version}", NULL), newstr(s), e);
|
||||
|
||||
cert = SSL_get_peer_certificate(ssl);
|
||||
if (LogLevel >= 14)
|
||||
if (log && LogLevel >= 14)
|
||||
sm_syslog(LOG_INFO, e->e_id,
|
||||
"TLS: get_verify in %s: %ld get_peer: 0x%lx",
|
||||
srv ? "srv" : "clt",
|
||||
@ -3910,7 +3920,7 @@ tls_get_info(ssl, e, srv, host)
|
||||
X509_free(cert);
|
||||
|
||||
/* do some logging */
|
||||
if (LogLevel > 9)
|
||||
if (log && LogLevel > 9)
|
||||
{
|
||||
char *vers, *s1, *s2, *bits;
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
|
||||
* Copyright (c) 1998-2000 Sendmail, Inc. and its suppliers.
|
||||
* All rights reserved.
|
||||
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
|
||||
* Copyright (c) 1988, 1993
|
||||
@ -12,7 +12,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: stab.c,v 8.40.16.2 2000/06/05 21:46:59 gshapiro Exp $";
|
||||
static char id[] = "@(#)$Id: stab.c,v 8.40.16.3 2000/10/09 02:46:12 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#include <sendmail.h>
|
||||
@ -268,6 +268,7 @@ queueup_macros(class, qfp, e)
|
||||
if (e == NULL)
|
||||
return;
|
||||
|
||||
class = bitidx(class);
|
||||
for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++)
|
||||
{
|
||||
for (s = *shead; s != NULL; s = s->s_next)
|
||||
@ -276,7 +277,7 @@ queueup_macros(class, qfp, e)
|
||||
char *p;
|
||||
|
||||
if (s->s_type == ST_CLASS &&
|
||||
bitnset(class & 0xff, s->s_class) &&
|
||||
bitnset(class, s->s_class) &&
|
||||
(m = macid(s->s_name, NULL)) != '\0' &&
|
||||
(p = macvalue(m, e)) != NULL)
|
||||
{
|
||||
@ -326,12 +327,14 @@ copy_class(src, dst)
|
||||
register STAB **shead;
|
||||
register STAB *s;
|
||||
|
||||
src = bitidx(src);
|
||||
dst = bitidx(dst);
|
||||
for (shead = SymTab; shead < &SymTab[STABSIZE]; shead++)
|
||||
{
|
||||
for (s = *shead; s != NULL; s = s->s_next)
|
||||
{
|
||||
if (s->s_type == ST_CLASS &&
|
||||
bitnset(src & 0xff, s->s_class))
|
||||
bitnset(src, s->s_class))
|
||||
setbitn(dst, s->s_class);
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 1999 Sendmail, Inc. and its suppliers.
|
||||
* Copyright (c) 1999-2000 Sendmail, Inc. and its suppliers.
|
||||
* All rights reserved.
|
||||
*
|
||||
* By using this file, you agree to the terms and conditions set
|
||||
@ -11,7 +11,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: timers.c,v 8.13 1999/11/23 07:22:28 gshapiro Exp $";
|
||||
static char id[] = "@(#)$Id: timers.c,v 8.13.16.1 2000/10/09 01:06:45 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#if _FFR_TIMERS
|
||||
@ -204,8 +204,11 @@ poptimer(ptimer)
|
||||
|
||||
/* pop back to this timer */
|
||||
for (i = 0; i < NTimers; i++)
|
||||
{
|
||||
if (TimerStack[i] == ptimer)
|
||||
break;
|
||||
}
|
||||
|
||||
if (i != NTimers - 1)
|
||||
warntimer("poptimer: odd pop (timer=0x%lx, index=%d, NTimers=%d)",
|
||||
(u_long) ptimer, i, NTimers);
|
||||
|
@ -15,9 +15,9 @@
|
||||
|
||||
#ifndef lint
|
||||
# if SMTP
|
||||
static char id[] = "@(#)$Id: usersmtp.c,v 8.245.4.13 2000/09/26 00:46:21 gshapiro Exp $ (with SMTP)";
|
||||
static char id[] = "@(#)$Id: usersmtp.c,v 8.245.4.18 2000/12/20 16:36:11 ca Exp $ (with SMTP)";
|
||||
# else /* SMTP */
|
||||
static char id[] = "@(#)$Id: usersmtp.c,v 8.245.4.13 2000/09/26 00:46:21 gshapiro Exp $ (without SMTP)";
|
||||
static char id[] = "@(#)$Id: usersmtp.c,v 8.245.4.18 2000/12/20 16:36:11 ca Exp $ (without SMTP)";
|
||||
# endif /* SMTP */
|
||||
#endif /* ! lint */
|
||||
|
||||
@ -1187,7 +1187,7 @@ attemptauth(m, mci, e, mechused)
|
||||
return EX_TEMPFAIL;
|
||||
addrsize = sizeof(struct sockaddr_in);
|
||||
if (getsockname(fileno(mci->mci_out),
|
||||
(struct sockaddr *) &saddr_l, &addrsize) != 0)
|
||||
(struct sockaddr *) &saddr_l, &addrsize) == 0)
|
||||
{
|
||||
if (sasl_setprop(mci->mci_conn, SASL_IP_LOCAL,
|
||||
&saddr_l) != SASL_OK)
|
||||
@ -1298,7 +1298,7 @@ attemptauth(m, mci, e, mechused)
|
||||
}
|
||||
else
|
||||
in64[0] = '\0';
|
||||
smtpmessage(in64, m, mci);
|
||||
smtpmessage("%s", m, mci, in64);
|
||||
smtpresult = reply(m, mci, e, TimeOuts.to_datafinal,
|
||||
getsasldata, NULL);
|
||||
/* which timeout? XXX */
|
||||
@ -1542,7 +1542,7 @@ smtpmailfrom(m, mci, e)
|
||||
smtpquit(m, mci, e);
|
||||
return EX_TEMPFAIL;
|
||||
}
|
||||
else if (r == 421)
|
||||
else if (r == SMTPCLOSING)
|
||||
{
|
||||
/* service shutting down */
|
||||
mci_setstat(mci, EX_TEMPFAIL, ENHSCN(enhsc, "4.5.0"),
|
||||
@ -2106,7 +2106,7 @@ smtpquit(m, mci, e)
|
||||
|
||||
/* look for naughty mailers */
|
||||
sm_syslog(LOG_ERR, e->e_id,
|
||||
"smtpquit: mailer%s%s exited with exit value %d\n",
|
||||
"smtpquit: mailer%s%s exited with exit value %d",
|
||||
mailer == NULL ? "" : " ",
|
||||
mailer == NULL ? "" : mailer,
|
||||
rcode);
|
||||
@ -2141,9 +2141,13 @@ smtprset(m, mci, e)
|
||||
** Any response is deemed to be acceptable.
|
||||
** The standard does not state the proper action
|
||||
** to take when a value other than 250 is received.
|
||||
**
|
||||
** However, if 421 is returned for the RSET, leave
|
||||
** mci_state as MCIS_SSD (set in reply()).
|
||||
*/
|
||||
|
||||
mci->mci_state = MCIS_OPEN;
|
||||
if (mci->mci_state != MCIS_SSD)
|
||||
mci->mci_state = MCIS_OPEN;
|
||||
return;
|
||||
}
|
||||
smtpquit(m, mci, e);
|
||||
|
@ -12,7 +12,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: util.c,v 8.225.2.1.2.8 2000/07/03 18:28:56 geir Exp $";
|
||||
static char id[] = "@(#)$Id: util.c,v 8.225.2.1.2.15 2000/10/18 23:46:07 ca Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#include <sendmail.h>
|
||||
@ -209,6 +209,7 @@ shorten_rfc822_string(string, length)
|
||||
** If have to rebalance an already short enough string,
|
||||
** need to do it within allocated space.
|
||||
*/
|
||||
|
||||
slen = strlen(string);
|
||||
if (length == 0 || slen < length)
|
||||
length = slen;
|
||||
@ -500,10 +501,13 @@ log_sendmail_pid(e)
|
||||
}
|
||||
else
|
||||
{
|
||||
long pid;
|
||||
extern char *CommandLineArgs;
|
||||
|
||||
pid = (long) getpid();
|
||||
|
||||
/* write the process id on line 1 */
|
||||
fprintf(pidf, "%ld\n", (long) getpid());
|
||||
fprintf(pidf, "%ld\n", pid);
|
||||
|
||||
/* line 2 contains all command line flags */
|
||||
fprintf(pidf, "%s\n", CommandLineArgs);
|
||||
@ -640,7 +644,7 @@ xputs(s)
|
||||
if (strchr("=~&?", *s) != NULL)
|
||||
(void) putchar(*s++);
|
||||
if (bitset(0200, *s))
|
||||
printf("{%s}", macname(*s++ & 0377));
|
||||
printf("{%s}", macname(bitidx(*s++)));
|
||||
else
|
||||
printf("%c", *s++);
|
||||
continue;
|
||||
@ -918,6 +922,11 @@ putxline(l, len, mci, pxflags)
|
||||
{
|
||||
if (putc('.', mci->mci_out) == EOF)
|
||||
dead = TRUE;
|
||||
else
|
||||
{
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
}
|
||||
if (TrafficLogFile != NULL)
|
||||
(void) putc('.', TrafficLogFile);
|
||||
}
|
||||
@ -928,6 +937,11 @@ putxline(l, len, mci, pxflags)
|
||||
{
|
||||
if (putc('>', mci->mci_out) == EOF)
|
||||
dead = TRUE;
|
||||
else
|
||||
{
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
}
|
||||
if (TrafficLogFile != NULL)
|
||||
(void) putc('>', TrafficLogFile);
|
||||
}
|
||||
@ -942,9 +956,11 @@ putxline(l, len, mci, pxflags)
|
||||
dead = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
else
|
||||
{
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
}
|
||||
}
|
||||
if (dead)
|
||||
break;
|
||||
@ -957,10 +973,11 @@ putxline(l, len, mci, pxflags)
|
||||
dead = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
|
||||
else
|
||||
{
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
}
|
||||
if (TrafficLogFile != NULL)
|
||||
{
|
||||
for (l = l_base; l < q; l++)
|
||||
@ -981,6 +998,11 @@ putxline(l, len, mci, pxflags)
|
||||
{
|
||||
if (putc('.', mci->mci_out) == EOF)
|
||||
break;
|
||||
else
|
||||
{
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
}
|
||||
if (TrafficLogFile != NULL)
|
||||
(void) putc('.', TrafficLogFile);
|
||||
}
|
||||
@ -991,6 +1013,11 @@ putxline(l, len, mci, pxflags)
|
||||
{
|
||||
if (putc('>', mci->mci_out) == EOF)
|
||||
break;
|
||||
else
|
||||
{
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
}
|
||||
if (TrafficLogFile != NULL)
|
||||
(void) putc('>', TrafficLogFile);
|
||||
}
|
||||
@ -1003,9 +1030,11 @@ putxline(l, len, mci, pxflags)
|
||||
dead = TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
else
|
||||
{
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
}
|
||||
}
|
||||
if (dead)
|
||||
break;
|
||||
@ -1014,6 +1043,11 @@ putxline(l, len, mci, pxflags)
|
||||
(void) putc('\n', TrafficLogFile);
|
||||
if (fputs(mci->mci_mailer->m_eol, mci->mci_out) == EOF)
|
||||
break;
|
||||
else
|
||||
{
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
}
|
||||
if (l < end && *l == '\n')
|
||||
{
|
||||
if (*++l != ' ' && *l != '\t' && *l != '\0' &&
|
||||
@ -1021,13 +1055,15 @@ putxline(l, len, mci, pxflags)
|
||||
{
|
||||
if (putc(' ', mci->mci_out) == EOF)
|
||||
break;
|
||||
else
|
||||
{
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
}
|
||||
if (TrafficLogFile != NULL)
|
||||
(void) putc(' ', TrafficLogFile);
|
||||
}
|
||||
}
|
||||
|
||||
/* record progress for DATA timeout */
|
||||
DataProgress = TRUE;
|
||||
} while (l < end);
|
||||
}
|
||||
/*
|
||||
@ -1347,8 +1383,10 @@ bitintersect(a, b)
|
||||
int i;
|
||||
|
||||
for (i = BITMAPBYTES / sizeof (int); --i >= 0; )
|
||||
{
|
||||
if ((a[i] & b[i]) != 0)
|
||||
return TRUE;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
/*
|
||||
@ -1372,8 +1410,10 @@ bitzerop(map)
|
||||
int i;
|
||||
|
||||
for (i = BITMAPBYTES / sizeof (int); --i >= 0; )
|
||||
{
|
||||
if (map[i] != 0)
|
||||
return FALSE;
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
/*
|
||||
@ -1485,8 +1525,8 @@ checkfds(where)
|
||||
static BITMAP256 baseline;
|
||||
extern int DtableSize;
|
||||
|
||||
if (DtableSize > 256)
|
||||
maxfd = 256;
|
||||
if (DtableSize > BITMAPBITS)
|
||||
maxfd = BITMAPBITS;
|
||||
else
|
||||
maxfd = DtableSize;
|
||||
if (where == NULL)
|
||||
|
@ -12,7 +12,7 @@
|
||||
*/
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: version.c,v 8.43.4.16 2000/09/21 04:12:23 geir Exp $";
|
||||
static char id[] = "@(#)$Id: version.c,v 8.43.4.25 2000/12/29 18:22:18 gshapiro Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
char Version[] = "8.11.1";
|
||||
char Version[] = "8.11.2";
|
||||
|
@ -9,19 +9,19 @@
|
||||
.\" the sendmail distribution.
|
||||
.\"
|
||||
.\"
|
||||
.\" $Id: vacation.1,v 8.11 2000/03/17 07:32:50 gshapiro Exp $
|
||||
.\" $Id: vacation.1,v 8.11.4.6 2000/12/29 18:12:23 gshapiro Exp $
|
||||
.\"
|
||||
.TH VACATION 1 "$Date: 2000/03/17 07:32:50 $"
|
||||
.TH VACATION 1 "$Date: 2000/12/29 18:12:23 $"
|
||||
.SH NAME
|
||||
.B vacation
|
||||
vacation
|
||||
\- return ``I am not here'' indication
|
||||
.SH SYNOPSIS
|
||||
.B vacation
|
||||
.B \-i
|
||||
.RB [ \-i ]
|
||||
.RB [ \-I ]
|
||||
.RB [ \-r
|
||||
.IR interval ]
|
||||
.RB [ \-x ]
|
||||
.B vacation
|
||||
.RB [ \-a
|
||||
.IR alias ]
|
||||
.RB [ \-f
|
||||
@ -74,6 +74,11 @@ before you modify your
|
||||
.I .forward
|
||||
file.
|
||||
.TP
|
||||
.B \-I
|
||||
Same as
|
||||
.B \-i
|
||||
(for backwards compatibility).
|
||||
.TP
|
||||
.BI \-m " filename"
|
||||
Use
|
||||
.I filename
|
||||
@ -95,9 +100,9 @@ one reply.
|
||||
.BI \-s " address"
|
||||
Use
|
||||
.I address
|
||||
instead of the sender address in the
|
||||
instead of the incoming message sender address on the
|
||||
.I From
|
||||
line to determine the reply address.
|
||||
line as the recipient for the vacation message.
|
||||
.TP
|
||||
.BI \-t " time"
|
||||
Ignored, available only for compatibility with Sun's
|
||||
@ -132,6 +137,9 @@ or
|
||||
headers of the mail.
|
||||
No messages from
|
||||
``???-REQUEST'',
|
||||
``???-RELAY'',
|
||||
``???-OWNER'',
|
||||
``OWNER-???'',
|
||||
``Postmaster'',
|
||||
``UUCP'',
|
||||
``MAILER'',
|
||||
@ -186,10 +194,10 @@ syslog(8).
|
||||
.SH FILES
|
||||
.TP 1.8i
|
||||
~/.vacation.db
|
||||
database file
|
||||
default database file
|
||||
.TP
|
||||
~/.vacation.msg
|
||||
message to send
|
||||
default message to send
|
||||
.SH SEE ALSO
|
||||
sendmail(8),
|
||||
syslog(8)
|
||||
|
@ -21,7 +21,7 @@ static char copyright[] =
|
||||
#endif /* ! lint */
|
||||
|
||||
#ifndef lint
|
||||
static char id[] = "@(#)$Id: vacation.c,v 8.68.4.7 2000/09/05 21:48:45 gshapiro Exp $";
|
||||
static char id[] = "@(#)$Id: vacation.c,v 8.68.4.15 2000/11/27 22:17:27 ca Exp $";
|
||||
#endif /* ! lint */
|
||||
|
||||
#include <ctype.h>
|
||||
@ -48,6 +48,11 @@ static char id[] = "@(#)$Id: vacation.c,v 8.68.4.7 2000/09/05 21:48:45 gshapiro
|
||||
#define ONLY_ONCE ((time_t) 0) /* send at most one reply */
|
||||
#define INTERVAL_UNDEF ((time_t) (-1)) /* no value given */
|
||||
|
||||
#ifndef TRUE
|
||||
# define TRUE 1
|
||||
# define FALSE 0
|
||||
#endif /* ! TRUE */
|
||||
|
||||
uid_t RealUid;
|
||||
gid_t RealGid;
|
||||
char *RealUserName;
|
||||
@ -73,11 +78,6 @@ BITMAP256 DontBlameSendmail;
|
||||
#define SECSPERDAY (60 * 60 * 24)
|
||||
#define DAYSPERWEEK 7
|
||||
|
||||
#ifndef TRUE
|
||||
# define TRUE 1
|
||||
# define FALSE 0
|
||||
#endif /* ! TRUE */
|
||||
|
||||
#ifndef __P
|
||||
# ifdef __STDC__
|
||||
# define __P(protos) protos
|
||||
@ -111,7 +111,7 @@ static void eatmsg __P((void));
|
||||
/* exit after reading input */
|
||||
#define EXITIT(excode) { \
|
||||
eatmsg(); \
|
||||
exit(excode); \
|
||||
return excode; \
|
||||
}
|
||||
int
|
||||
main(argc, argv)
|
||||
@ -138,7 +138,7 @@ main(argc, argv)
|
||||
extern char *optarg;
|
||||
extern void usage __P((void));
|
||||
extern void setinterval __P((time_t));
|
||||
extern void readheaders __P((void));
|
||||
extern int readheaders __P((void));
|
||||
extern bool recent __P((void));
|
||||
extern void setreply __P((char *, time_t));
|
||||
extern void sendmessage __P((char *, char *, bool));
|
||||
@ -348,7 +348,7 @@ main(argc, argv)
|
||||
static void listdb __P((void));
|
||||
|
||||
listdb();
|
||||
(void)Db->smdb_close(Db);
|
||||
(void) Db->smdb_close(Db);
|
||||
exit(EX_OK);
|
||||
}
|
||||
#endif /* _FFR_LISTDB */
|
||||
@ -356,17 +356,16 @@ main(argc, argv)
|
||||
if (interval != INTERVAL_UNDEF)
|
||||
setinterval(interval);
|
||||
|
||||
if (iflag)
|
||||
if (iflag && !exclude)
|
||||
{
|
||||
result = Db->smdb_close(Db);
|
||||
if (!exclude)
|
||||
exit(EX_OK);
|
||||
(void) Db->smdb_close(Db);
|
||||
exit(EX_OK);
|
||||
}
|
||||
|
||||
if (exclude)
|
||||
{
|
||||
xclude(stdin);
|
||||
result = Db->smdb_close(Db);
|
||||
(void) Db->smdb_close(Db);
|
||||
EXITM(EX_OK);
|
||||
}
|
||||
|
||||
@ -374,27 +373,28 @@ main(argc, argv)
|
||||
{
|
||||
msglog(LOG_NOTICE,
|
||||
"vacation: can't allocate memory for username.\n");
|
||||
(void) Db->smdb_close(Db);
|
||||
EXITM(EX_OSERR);
|
||||
}
|
||||
cur->name = name;
|
||||
cur->next = Names;
|
||||
Names = cur;
|
||||
|
||||
readheaders();
|
||||
if (!recent())
|
||||
result = readheaders();
|
||||
if (result == EX_OK && !recent())
|
||||
{
|
||||
time_t now;
|
||||
|
||||
(void) time(&now);
|
||||
setreply(From, now);
|
||||
result = Db->smdb_close(Db);
|
||||
(void) Db->smdb_close(Db);
|
||||
sendmessage(name, msgfilename, emptysender);
|
||||
}
|
||||
else
|
||||
result = Db->smdb_close(Db);
|
||||
exit(EX_OK);
|
||||
/* NOTREACHED */
|
||||
return EX_OK;
|
||||
(void) Db->smdb_close(Db);
|
||||
if (result == EX_NOUSER)
|
||||
result = EX_OK;
|
||||
exit(result);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -425,13 +425,14 @@ eatmsg()
|
||||
** none.
|
||||
**
|
||||
** Returns:
|
||||
** nothing.
|
||||
** a exit code: NOUSER if no reply, OK if reply, * if error
|
||||
**
|
||||
** Side Effects:
|
||||
** may exit().
|
||||
**
|
||||
*/
|
||||
void
|
||||
|
||||
int
|
||||
readheaders()
|
||||
{
|
||||
bool tome, cont;
|
||||
@ -484,12 +485,12 @@ readheaders()
|
||||
|
||||
/* ok since both strings have MAXLINE length */
|
||||
if (*From == '\0')
|
||||
(void)strlcpy(From, buf + 5,
|
||||
sizeof From);
|
||||
(void) strlcpy(From, buf + 5,
|
||||
sizeof From);
|
||||
if ((p = strchr(buf + 5, '\n')) != NULL)
|
||||
*p = '\0';
|
||||
if (junkmail(buf + 5))
|
||||
EXITIT(EX_OK);
|
||||
EXITIT(EX_NOUSER);
|
||||
}
|
||||
break;
|
||||
|
||||
@ -509,7 +510,7 @@ readheaders()
|
||||
if (strncasecmp(p, "junk", 4) == 0 ||
|
||||
strncasecmp(p, "bulk", 4) == 0 ||
|
||||
strncasecmp(p, "list", 4) == 0)
|
||||
EXITIT(EX_OK);
|
||||
EXITIT(EX_NOUSER);
|
||||
break;
|
||||
|
||||
case 'C': /* "Cc:" */
|
||||
@ -540,12 +541,13 @@ findme:
|
||||
}
|
||||
}
|
||||
if (!tome)
|
||||
EXITIT(EX_OK);
|
||||
EXITIT(EX_NOUSER);
|
||||
if (*From == '\0')
|
||||
{
|
||||
msglog(LOG_NOTICE, "vacation: no initial \"From \" line.\n");
|
||||
EXITIT(EX_DATAERR);
|
||||
}
|
||||
EXITIT(EX_OK);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -600,52 +602,142 @@ nsearch(name, str)
|
||||
** is this some automated/junk/bulk/list mail?
|
||||
**
|
||||
*/
|
||||
|
||||
struct ignore
|
||||
{
|
||||
char *name;
|
||||
size_t len;
|
||||
};
|
||||
|
||||
typedef struct ignore IGNORE_T;
|
||||
|
||||
#define MAX_USER_LEN 256 /* maximum length of local part (sender) */
|
||||
|
||||
/* delimiters for the local part of an address */
|
||||
#define isdelim(c) ((c) == '%' || (c) == '@' || (c) == '+')
|
||||
|
||||
bool
|
||||
junkmail(from)
|
||||
char *from;
|
||||
{
|
||||
register size_t len;
|
||||
register char *p;
|
||||
register struct ignore *cur;
|
||||
static struct ignore
|
||||
bool quot;
|
||||
char *e;
|
||||
size_t len;
|
||||
IGNORE_T *cur;
|
||||
char sender[MAX_USER_LEN];
|
||||
static IGNORE_T ignore[] =
|
||||
{
|
||||
char *name;
|
||||
size_t len;
|
||||
} ignore[] =
|
||||
{
|
||||
{ "-request", 8 },
|
||||
{ "postmaster", 10 },
|
||||
{ "uucp", 4 },
|
||||
{ "mailer-daemon", 13 },
|
||||
{ "mailer", 6 },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
static IGNORE_T ignorepost[] =
|
||||
{
|
||||
{ "-request", 8 },
|
||||
{ "-relay", 6 },
|
||||
{ "-owner", 6 },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
static IGNORE_T ignorepre[] =
|
||||
{
|
||||
{ "owner-", 6 },
|
||||
{ NULL, 0 }
|
||||
};
|
||||
|
||||
/*
|
||||
* This is mildly amusing, and I'm not positive it's right; trying
|
||||
* to find the "real" name of the sender, assuming that addresses
|
||||
* will be some variant of:
|
||||
*
|
||||
* From site!site!SENDER%site.domain%site.domain@site.domain
|
||||
*/
|
||||
if ((p = strchr(from, '%')) == NULL &&
|
||||
(p = strchr(from, '@')) == NULL)
|
||||
** This is mildly amusing, and I'm not positive it's right; trying
|
||||
** to find the "real" name of the sender, assuming that addresses
|
||||
** will be some variant of:
|
||||
**
|
||||
** From site!site!SENDER%site.domain%site.domain@site.domain
|
||||
*/
|
||||
|
||||
quot = FALSE;
|
||||
e = from;
|
||||
len = 0;
|
||||
while (*e != '\0' && (quot || !isdelim(*e)))
|
||||
{
|
||||
if ((p = strrchr(from, '!')) != NULL)
|
||||
++p;
|
||||
else
|
||||
p = from;
|
||||
for (; *p; ++p)
|
||||
if (*e == '"')
|
||||
{
|
||||
quot = !quot;
|
||||
++e;
|
||||
continue;
|
||||
}
|
||||
if (*e == '\\')
|
||||
{
|
||||
if (*(++e) == '\0')
|
||||
{
|
||||
/* '\\' at end of string? */
|
||||
break;
|
||||
}
|
||||
if (len < MAX_USER_LEN)
|
||||
sender[len++] = *e;
|
||||
++e;
|
||||
continue;
|
||||
}
|
||||
if (*e == '!' && !quot)
|
||||
{
|
||||
len = 0;
|
||||
sender[len] = '\0';
|
||||
}
|
||||
else
|
||||
if (len < MAX_USER_LEN)
|
||||
sender[len++] = *e;
|
||||
++e;
|
||||
}
|
||||
len = p - from;
|
||||
for (cur = ignore; cur->name != NULL; ++cur)
|
||||
if (len < MAX_USER_LEN)
|
||||
sender[len] = '\0';
|
||||
else
|
||||
sender[MAX_USER_LEN - 1] = '\0';
|
||||
|
||||
if (len <= 0)
|
||||
return FALSE;
|
||||
#if 0
|
||||
if (quot)
|
||||
return FALSE; /* syntax error... */
|
||||
#endif /* 0 */
|
||||
|
||||
/* test prefixes */
|
||||
for (cur = ignorepre; cur->name != NULL; ++cur)
|
||||
{
|
||||
if (len >= cur->len &&
|
||||
strncasecmp(cur->name, p - cur->len, cur->len) == 0)
|
||||
strncasecmp(cur->name, sender, cur->len) == 0)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
** If the name is truncated, don't test the rest.
|
||||
** We could extract the "tail" of the sender address and
|
||||
** compare it it ignorepost, however, it seems not worth
|
||||
** the effort.
|
||||
** The address surely can't match any entry in ignore[]
|
||||
** (as long as all of them are shorter than MAX_USER_LEN).
|
||||
*/
|
||||
|
||||
if (len > MAX_USER_LEN)
|
||||
return FALSE;
|
||||
|
||||
/* test full local parts */
|
||||
for (cur = ignore; cur->name != NULL; ++cur)
|
||||
{
|
||||
if (len == cur->len &&
|
||||
strncasecmp(cur->name, sender, cur->len) == 0)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* test postfixes */
|
||||
for (cur = ignorepost; cur->name != NULL; ++cur)
|
||||
{
|
||||
if (len >= cur->len &&
|
||||
strncasecmp(cur->name, e - cur->len - 1,
|
||||
cur->len) == 0)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ -675,27 +767,27 @@ recent()
|
||||
memset(&data, '\0', sizeof data);
|
||||
|
||||
/* get interval time */
|
||||
key.data.data = VIT;
|
||||
key.data.size = sizeof(VIT);
|
||||
key.data = VIT;
|
||||
key.size = sizeof(VIT);
|
||||
|
||||
st = Db->smdb_get(Db, &key, &data, 0);
|
||||
if (st != SMDBE_OK)
|
||||
next = SECSPERDAY * DAYSPERWEEK;
|
||||
else
|
||||
memmove(&next, data.data.data, sizeof(next));
|
||||
memmove(&next, data.data, sizeof(next));
|
||||
|
||||
memset(&data, '\0', sizeof data);
|
||||
|
||||
/* get record for this address */
|
||||
key.data.data = From;
|
||||
key.data.size = strlen(From);
|
||||
key.data = From;
|
||||
key.size = strlen(From);
|
||||
|
||||
do
|
||||
{
|
||||
st = Db->smdb_get(Db, &key, &data, 0);
|
||||
if (st == SMDBE_OK)
|
||||
{
|
||||
memmove(&then, data.data.data, sizeof(then));
|
||||
memmove(&then, data.data, sizeof(then));
|
||||
if (next == ONLY_ONCE || then == ONLY_ONCE ||
|
||||
then + next > time(NULL))
|
||||
return TRUE;
|
||||
@ -703,8 +795,8 @@ recent()
|
||||
if ((trydomain = !trydomain) &&
|
||||
(domain = strchr(From, '@')) != NULL)
|
||||
{
|
||||
key.data.data = domain;
|
||||
key.data.size = strlen(domain);
|
||||
key.data = domain;
|
||||
key.size = strlen(domain);
|
||||
}
|
||||
} while (trydomain);
|
||||
return FALSE;
|
||||
@ -732,11 +824,11 @@ setinterval(interval)
|
||||
memset(&key, '\0', sizeof key);
|
||||
memset(&data, '\0', sizeof data);
|
||||
|
||||
key.data.data = VIT;
|
||||
key.data.size = sizeof(VIT);
|
||||
data.data.data = (char*) &interval;
|
||||
data.data.size = sizeof(interval);
|
||||
(void)(Db->smdb_put)(Db, &key, &data, 0);
|
||||
key.data = VIT;
|
||||
key.size = sizeof(VIT);
|
||||
data.data = (char*) &interval;
|
||||
data.size = sizeof(interval);
|
||||
(void) (Db->smdb_put)(Db, &key, &data, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -763,11 +855,11 @@ setreply(from, when)
|
||||
memset(&key, '\0', sizeof key);
|
||||
memset(&data, '\0', sizeof data);
|
||||
|
||||
key.data.data = from;
|
||||
key.data.size = strlen(from);
|
||||
data.data.data = (char*) &when;
|
||||
data.data.size = sizeof(when);
|
||||
(void)(Db->smdb_put)(Db, &key, &data, 0);
|
||||
key.data = from;
|
||||
key.size = strlen(from);
|
||||
data.data = (char*) &when;
|
||||
data.size = sizeof(when);
|
||||
(void) (Db->smdb_put)(Db, &key, &data, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -932,28 +1024,26 @@ listdb()
|
||||
SMDB_CURSOR_GET_NEXT)) == SMDBE_OK)
|
||||
{
|
||||
/* skip magic VIT entry */
|
||||
if ((int)db_key.data.size -1 == strlen(VIT) &&
|
||||
strncmp((char *)db_key.data.data, VIT,
|
||||
(int)db_key.data.size - 1) == 0)
|
||||
if ((int)db_key.size -1 == strlen(VIT) &&
|
||||
strncmp((char *)db_key.data, VIT,
|
||||
(int)db_key.size - 1) == 0)
|
||||
continue;
|
||||
|
||||
/* skip bogus values */
|
||||
if (db_value.data.size != sizeof t)
|
||||
if (db_value.size != sizeof t)
|
||||
{
|
||||
fprintf(stderr, "vacation: %.*s invalid time stamp\n",
|
||||
(int) db_key.data.size,
|
||||
(char *) db_key.data.data);
|
||||
(int) db_key.size, (char *) db_key.data);
|
||||
continue;
|
||||
}
|
||||
|
||||
memcpy(&t, db_value.data.data, sizeof t);
|
||||
memcpy(&t, db_value.data, sizeof t);
|
||||
|
||||
if (db_key.data.size > 40)
|
||||
db_key.data.size = 40;
|
||||
if (db_key.size > 40)
|
||||
db_key.size = 40;
|
||||
|
||||
printf("%-40.*s %-10s",
|
||||
(int) db_key.data.size, (char *) db_key.data.data,
|
||||
ctime(&t));
|
||||
(int) db_key.size, (char *) db_key.data, ctime(&t));
|
||||
|
||||
memset(&db_key, '\0', sizeof db_key);
|
||||
memset(&db_value, '\0', sizeof db_value);
|
||||
|
Loading…
Reference in New Issue
Block a user