0.95.12 develop 1, a lot of systems calls changed to universal IPv4/IPv6 functions
This commit is contained in:
parent
dabcb8fe60
commit
711ba56609
17
ChangeLog
17
ChangeLog
@ -1,3 +1,20 @@
|
|||||||
|
mbselib:
|
||||||
|
The virus stream scanner can now uses IPv4 and/or IPv6 to
|
||||||
|
connect to the clamav server and can use server clusters too.
|
||||||
|
Connect smtp, pop3 and nntp upgraded to IPv4 and IPv6 use.
|
||||||
|
|
||||||
|
mbcico:
|
||||||
|
Can accept both IPv6 and IPv4 calls.
|
||||||
|
Can call IPv4 and IPv6 nodes.
|
||||||
|
|
||||||
|
mbtask:
|
||||||
|
Upgraded the ping function to newer system calls. Note that
|
||||||
|
for now I leave the interbbs chat IPv4 only.
|
||||||
|
|
||||||
|
mblogin:
|
||||||
|
Don't use gethostbyname function.
|
||||||
|
|
||||||
|
|
||||||
v0.95.11 14-Jan-2011 (patches by Scott Street).
|
v0.95.11 14-Jan-2011 (patches by Scott Street).
|
||||||
|
|
||||||
mbselib:
|
mbselib:
|
||||||
|
4
TODO
4
TODO
@ -1,6 +1,6 @@
|
|||||||
|
|
||||||
MBSE BBS V0.95.6 TODO list.
|
MBSE BBS V0.95.12 TODO list.
|
||||||
---------------------------
|
----------------------------
|
||||||
|
|
||||||
These are a list of things that must be implemented one way or
|
These are a list of things that must be implemented one way or
|
||||||
another. Some things are urgent and necessary to operate the bbs
|
another. Some things are urgent and necessary to operate the bbs
|
||||||
|
2
configure
vendored
2
configure
vendored
@ -2274,7 +2274,7 @@ SUBDIRS="lib mbcico mbfido mbmon mbsebbs mbutils mbnntp mbtask mbsetup unix lang
|
|||||||
PACKAGE="mbsebbs"
|
PACKAGE="mbsebbs"
|
||||||
MAJOR="0"
|
MAJOR="0"
|
||||||
MINOR="95"
|
MINOR="95"
|
||||||
REVISION="11"
|
REVISION="12d1"
|
||||||
VERSION="$MAJOR.$MINOR.$REVISION"
|
VERSION="$MAJOR.$MINOR.$REVISION"
|
||||||
COPYRIGHT="Copyright (C) 1997-2011 Michiel Broek, All Rights Reserved"
|
COPYRIGHT="Copyright (C) 1997-2011 Michiel Broek, All Rights Reserved"
|
||||||
SHORTRIGHT="Copyright (C) 1997-2011 M. Broek"
|
SHORTRIGHT="Copyright (C) 1997-2011 M. Broek"
|
||||||
|
@ -12,7 +12,7 @@ AC_SUBST(SUBDIRS)
|
|||||||
PACKAGE="mbsebbs"
|
PACKAGE="mbsebbs"
|
||||||
MAJOR="0"
|
MAJOR="0"
|
||||||
MINOR="95"
|
MINOR="95"
|
||||||
REVISION="11"
|
REVISION="12d1"
|
||||||
VERSION="$MAJOR.$MINOR.$REVISION"
|
VERSION="$MAJOR.$MINOR.$REVISION"
|
||||||
COPYRIGHT="Copyright (C) 1997-2011 Michiel Broek, All Rights Reserved"
|
COPYRIGHT="Copyright (C) 1997-2011 Michiel Broek, All Rights Reserved"
|
||||||
SHORTRIGHT="Copyright (C) 1997-2011 M. Broek"
|
SHORTRIGHT="Copyright (C) 1997-2011 M. Broek"
|
||||||
|
97
lib/nntp.c
97
lib/nntp.c
@ -32,19 +32,15 @@
|
|||||||
#include "mbinet.h"
|
#include "mbinet.h"
|
||||||
|
|
||||||
|
|
||||||
static int nntpsock = -1; /* TCP/IP socket */
|
static int nntpsock = -1; /* TCP/IP socket */
|
||||||
struct hostent *nhp; /* Host info remote */
|
|
||||||
struct servent *nsp; /* Service information */
|
|
||||||
struct sockaddr_in nntp_loc; /* For local socket address */
|
|
||||||
struct sockaddr_in nntp_rem; /* For remote socket address */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int nntp_connect(void)
|
int nntp_connect(void)
|
||||||
{
|
{
|
||||||
socklen_t addrlen;
|
char *q, *ipver = NULL, ipstr[INET6_ADDRSTRLEN], servport[10];
|
||||||
char *p;
|
struct addrinfo hints, *res = NULL, *p;
|
||||||
|
int rc;
|
||||||
|
|
||||||
if (nntpsock != -1)
|
if (nntpsock != -1)
|
||||||
return nntpsock;
|
return nntpsock;
|
||||||
@ -54,46 +50,57 @@ int nntp_connect(void)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
Syslog('+', "NNTP: connecting host: %s:%d", CFG.nntpnode, CFG.nntpport);
|
snprintf(servport, 9, "%d", CFG.nntpport);
|
||||||
memset(&nntp_loc, 0, sizeof(struct sockaddr_in));
|
Syslog('+', "NNTP: connecting host: %s port %s", CFG.nntpnode, servport);
|
||||||
memset(&nntp_rem, 0, sizeof(struct sockaddr_in));
|
memset(&hints, 0, sizeof(hints));
|
||||||
|
hints.ai_family = AF_UNSPEC;
|
||||||
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
|
|
||||||
nntp_rem.sin_family = AF_INET;
|
if ((rc = getaddrinfo(CFG.popnode, servport, &hints, &res)) != 0) {
|
||||||
|
WriteError("getaddrinfo %s:%s %s\n", CFG.popnode, servport, gai_strerror(rc));
|
||||||
if ((nhp = gethostbyname(CFG.nntpnode)) == NULL) {
|
return -1;
|
||||||
WriteError("NNTP: can't find host %s", CFG.nntpnode);
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
nntp_rem.sin_addr.s_addr = ((struct in_addr *)(nhp->h_addr))->s_addr;
|
for (p = res; p != NULL; p = p->ai_next) {
|
||||||
nntp_rem.sin_port = htons(CFG.nntpport);
|
void *addr;
|
||||||
|
|
||||||
if ((nntpsock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
|
if (p->ai_family == AF_INET) {
|
||||||
WriteError("$NNTP: unable to create tcp socket");
|
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
|
||||||
return -1;
|
addr = &(ipv4->sin_addr);
|
||||||
|
ipver = (char *)"IPv4";
|
||||||
|
} else {
|
||||||
|
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
|
||||||
|
addr = &(ipv6->sin6_addr);
|
||||||
|
ipver = (char *)"IPv6";
|
||||||
|
}
|
||||||
|
inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr);
|
||||||
|
Syslog('+', "Trying %s %s port %s", ipver, ipstr, servport);
|
||||||
|
|
||||||
|
if ((nntpsock = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
|
||||||
|
WriteError("$socket()");
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
if (connect(nntpsock, p->ai_addr, p->ai_addrlen) == -1) {
|
||||||
|
WriteError("$connect %s port %s", ipstr, servport);
|
||||||
|
close(nntpsock);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (p == NULL) {
|
||||||
|
return -1; /* Not connected */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (connect(nntpsock, (struct sockaddr *)&nntp_rem, sizeof(struct sockaddr_in)) == -1) {
|
q = nntp_receive();
|
||||||
WriteError("$NNTP: cannot connect tcp socket");
|
if (strlen(q) == 0) {
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
addrlen = sizeof(struct sockaddr_in);
|
|
||||||
|
|
||||||
if (getsockname(nntpsock, (struct sockaddr *)&nntp_loc, &addrlen) == -1) {
|
|
||||||
WriteError("$NNTP: unable to read socket address");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
p = nntp_receive();
|
|
||||||
if (strlen(p) == 0) {
|
|
||||||
WriteError("NNTP: no response");
|
WriteError("NNTP: no response");
|
||||||
nntp_close();
|
nntp_close();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
Syslog('+', "NNTP: %s", p);
|
Syslog('+', "NNTP: %s", q);
|
||||||
|
|
||||||
if ((strncmp(p, "480", 3) == 0) || CFG.nntpforceauth) {
|
if ((strncmp(q, "480", 3) == 0) || CFG.nntpforceauth) {
|
||||||
/*
|
/*
|
||||||
* Must login with username and password
|
* Must login with username and password
|
||||||
*/
|
*/
|
||||||
@ -102,8 +109,8 @@ int nntp_connect(void)
|
|||||||
nntp_close();
|
nntp_close();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else if (strncmp(p, "200", 3)) {
|
} else if (strncmp(q, "200", 3)) {
|
||||||
WriteError("NNTP: bad response: %s", p);
|
WriteError("NNTP: bad response: %s", q);
|
||||||
// nntp_close(); FIXME: Don't close, the other end might have done that already
|
// nntp_close(); FIXME: Don't close, the other end might have done that already
|
||||||
// If we do also, this program hangs. Must be fixed!
|
// If we do also, this program hangs. Must be fixed!
|
||||||
return -1;
|
return -1;
|
||||||
@ -112,20 +119,20 @@ int nntp_connect(void)
|
|||||||
if (CFG.modereader) {
|
if (CFG.modereader) {
|
||||||
Syslog('+', "NNTP: setting mode reader");
|
Syslog('+', "NNTP: setting mode reader");
|
||||||
nntp_send((char *)"MODE READER\r\n");
|
nntp_send((char *)"MODE READER\r\n");
|
||||||
p = nntp_receive();
|
q = nntp_receive();
|
||||||
Syslog('+', "NNTP: %s", p);
|
Syslog('+', "NNTP: %s", q);
|
||||||
if (strncmp(p, "480", 3) == 0) {
|
if (strncmp(q, "480", 3) == 0) {
|
||||||
/*
|
/*
|
||||||
* Must login with username and password
|
* Must login with username and password
|
||||||
*/
|
*/
|
||||||
Syslog('+', "NNTP: %s", p);
|
Syslog('+', "NNTP: %s", q);
|
||||||
if (nntp_auth() == FALSE) {
|
if (nntp_auth() == FALSE) {
|
||||||
WriteError("NNTP: authorisation failure");
|
WriteError("NNTP: authorisation failure");
|
||||||
nntp_close();
|
nntp_close();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else if (strncmp(p, "200", 3)) {
|
} else if (strncmp(q, "200", 3)) {
|
||||||
WriteError("NNTP: bad response: %s", p);
|
WriteError("NNTP: bad response: %s", q);
|
||||||
nntp_close();
|
nntp_close();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
124
lib/pop3.c
124
lib/pop3.c
@ -1,10 +1,9 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
* $Id: pop3.c,v 1.8 2007/08/25 15:29:14 mbse Exp $
|
|
||||||
* Purpose ...............: MBSE BBS Internet Library
|
* Purpose ...............: MBSE BBS Internet Library
|
||||||
*
|
*
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
* Copyright (C) 1997-2004
|
* Copyright (C) 1997-2011
|
||||||
*
|
*
|
||||||
* Michiel Broek FIDO: 2:280/2802
|
* Michiel Broek FIDO: 2:280/2802
|
||||||
* Beekmansbos 10
|
* Beekmansbos 10
|
||||||
@ -33,81 +32,78 @@
|
|||||||
#include "mbinet.h"
|
#include "mbinet.h"
|
||||||
|
|
||||||
|
|
||||||
static int pop3sock = -1; /* TCP/IP socket */
|
static int pop3sock = -1; /* TCP/IP socket */
|
||||||
struct hostent *php; /* Host info remote */
|
|
||||||
struct servent *psp; /* Service information */
|
|
||||||
struct sockaddr_in pop3_loc; /* For local socket address */
|
|
||||||
struct sockaddr_in pop3_rem; /* For remote socket address */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int pop3_connect(void)
|
int pop3_connect(void)
|
||||||
{
|
{
|
||||||
socklen_t addrlen;
|
char *q, *ipver = NULL, ipstr[INET6_ADDRSTRLEN];
|
||||||
char *p;
|
struct addrinfo hints, *res = NULL, *p;
|
||||||
|
int rc;
|
||||||
|
|
||||||
if (!strlen(CFG.popnode)) {
|
if (!strlen(CFG.popnode)) {
|
||||||
WriteError("POP3: host not configured");
|
WriteError("POP3: host not configured");
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Syslog('+', "POP3: connecting host: %s", CFG.popnode);
|
||||||
|
memset(&hints, 0, sizeof(hints));
|
||||||
|
hints.ai_family = AF_UNSPEC;
|
||||||
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
|
|
||||||
|
if ((rc = getaddrinfo(CFG.popnode, "pop3", &hints, &res)) != 0) {
|
||||||
|
WriteError("getaddrinfo %s: %s\n", CFG.popnode, gai_strerror(rc));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (p = res; p != NULL; p = p->ai_next) {
|
||||||
|
void *addr;
|
||||||
|
|
||||||
|
if (p->ai_family == AF_INET) {
|
||||||
|
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
|
||||||
|
addr = &(ipv4->sin_addr);
|
||||||
|
ipver = (char *)"IPv4";
|
||||||
|
} else {
|
||||||
|
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
|
||||||
|
addr = &(ipv6->sin6_addr);
|
||||||
|
ipver = (char *)"IPv6";
|
||||||
}
|
}
|
||||||
|
inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr);
|
||||||
|
Syslog('+', "Trying %s %s port pop3", ipver, ipstr);
|
||||||
|
|
||||||
Syslog('+', "POP3: connecting host: %s", CFG.popnode);
|
if ((pop3sock = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
|
||||||
memset(&pop3_loc, 0, sizeof(struct sockaddr_in));
|
WriteError("$socket()");
|
||||||
memset(&pop3_rem, 0, sizeof(struct sockaddr_in));
|
return -1;
|
||||||
|
} else {
|
||||||
pop3_rem.sin_family = AF_INET;
|
if (connect(pop3sock, p->ai_addr, p->ai_addrlen) == -1) {
|
||||||
|
WriteError("$connect %s port pop3", ipstr);
|
||||||
if ((php = gethostbyname(CFG.popnode)) == NULL) {
|
close(pop3sock);
|
||||||
WriteError("POP3: can't find host %s", CFG.popnode);
|
} else {
|
||||||
return -1;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
if (p == NULL) {
|
||||||
|
return -1; /* Not connected */
|
||||||
|
}
|
||||||
|
|
||||||
pop3_rem.sin_addr.s_addr = ((struct in_addr *)(php->h_addr))->s_addr;
|
q = pop3_receive();
|
||||||
|
if (strlen(q) == 0) {
|
||||||
|
WriteError("POP3: no response from server");
|
||||||
|
pop3_close();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if ((psp = getservbyname("pop3", "tcp")) == NULL) {
|
if (strncmp(q, "+OK", 3)) {
|
||||||
/*
|
WriteError("POP3: bad response: %s", q);
|
||||||
* RedHat doesn't follow IANA specs and uses pop-3 in /etc/services
|
pop3_close();
|
||||||
*/
|
return -1;
|
||||||
if ((psp = getservbyname("pop-3", "tcp")) == NULL) {
|
}
|
||||||
WriteError("POP3: can't find service port for pop3/tcp");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pop3_rem.sin_port = psp->s_port;
|
|
||||||
|
|
||||||
if ((pop3sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
|
Syslog('+', "POP3: %s", q);
|
||||||
WriteError("$POP3: unable to create tcp socket");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (connect(pop3sock, (struct sockaddr *)&pop3_rem, sizeof(struct sockaddr_in)) == -1) {
|
return pop3sock;
|
||||||
WriteError("$POP3: cannot connect tcp socket");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
addrlen = sizeof(struct sockaddr_in);
|
|
||||||
|
|
||||||
if (getsockname(pop3sock, (struct sockaddr *)&pop3_loc, &addrlen) == -1) {
|
|
||||||
WriteError("$POP3: unable to read socket address");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
p = pop3_receive();
|
|
||||||
if (strlen(p) == 0) {
|
|
||||||
WriteError("POP3: no response from server");
|
|
||||||
pop3_close();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strncmp(p, "+OK", 3)) {
|
|
||||||
WriteError("POP3: bad response: %s", p);
|
|
||||||
pop3_close();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
Syslog('+', "POP3: %s", p);
|
|
||||||
|
|
||||||
return pop3sock;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
147
lib/smtp.c
147
lib/smtp.c
@ -1,10 +1,9 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
* $Id: smtp.c,v 1.10 2007/08/25 15:29:14 mbse Exp $
|
|
||||||
* Purpose ...............: MBSE BBS Internet Library
|
* Purpose ...............: MBSE BBS Internet Library
|
||||||
*
|
*
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
* Copyright (C) 1997-2005
|
* Copyright (C) 1997-2011
|
||||||
*
|
*
|
||||||
* Michiel Broek FIDO: 2:280/2802
|
* Michiel Broek FIDO: 2:280/2802
|
||||||
* Beekmansbos 10
|
* Beekmansbos 10
|
||||||
@ -34,84 +33,86 @@
|
|||||||
|
|
||||||
|
|
||||||
static int smtpsock = -1; /* TCP/IP socket */
|
static int smtpsock = -1; /* TCP/IP socket */
|
||||||
struct hostent *shp; /* Host info remote */
|
|
||||||
struct servent *ssp; /* Service information */
|
|
||||||
struct sockaddr_in smtp_loc; /* For local socket address */
|
|
||||||
struct sockaddr_in smtp_rem; /* For remote socket address */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
int smtp_connect(void)
|
int smtp_connect(void)
|
||||||
{
|
{
|
||||||
socklen_t addrlen;
|
char *q, *ipver = NULL, ipstr[INET6_ADDRSTRLEN], temp[41];
|
||||||
char *p, temp[40];
|
struct addrinfo hints, *res = NULL, *p;
|
||||||
|
int rc;
|
||||||
if (smtpsock != -1)
|
|
||||||
return smtpsock;
|
|
||||||
|
|
||||||
if (!strlen(CFG.smtpnode)) {
|
|
||||||
WriteError("SMTP: host not configured");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
Syslog('+', "SMTP: connecting host: %s", CFG.smtpnode);
|
|
||||||
memset(&smtp_loc, 0, sizeof(struct sockaddr_in));
|
|
||||||
memset(&smtp_rem, 0, sizeof(struct sockaddr_in));
|
|
||||||
|
|
||||||
smtp_rem.sin_family = AF_INET;
|
|
||||||
|
|
||||||
if ((shp = gethostbyname(CFG.smtpnode)) == NULL) {
|
|
||||||
WriteError("SMTP: can't find host %s", CFG.smtpnode);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
smtp_rem.sin_addr.s_addr = ((struct in_addr *)(shp->h_addr))->s_addr;
|
|
||||||
|
|
||||||
if ((ssp = getservbyname("smtp", "tcp")) == NULL) {
|
|
||||||
WriteError("SMTP: can't find service port for smtp/tcp");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
smtp_rem.sin_port = ssp->s_port;
|
|
||||||
|
|
||||||
if ((smtpsock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
|
|
||||||
WriteError("$SMTP: unable to create tcp socket");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (connect(smtpsock, (struct sockaddr *)&smtp_rem, sizeof(struct sockaddr_in)) == -1) {
|
|
||||||
WriteError("$SMTP: can't connect tcp socket");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
addrlen = sizeof(struct sockaddr_in);
|
|
||||||
|
|
||||||
if (getsockname(smtpsock, (struct sockaddr *)&smtp_loc, &addrlen) == -1) {
|
|
||||||
WriteError("$SMTP: unable to read socket address");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
p = smtp_receive();
|
|
||||||
if (strlen(p) == 0) {
|
|
||||||
WriteError("SMTP: no response");
|
|
||||||
smtp_close();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strncmp(p, "220", 3)) {
|
|
||||||
WriteError("SMTP: bad response: %s", p);
|
|
||||||
smtp_close();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
Syslog('+', "SMTP: %s", p);
|
|
||||||
|
|
||||||
snprintf(temp, 40, "HELO %s\r\n", CFG.sysdomain);
|
|
||||||
if (smtp_cmd(temp, 250)) {
|
|
||||||
smtp_close();
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (smtpsock != -1)
|
||||||
return smtpsock;
|
return smtpsock;
|
||||||
|
|
||||||
|
if (!strlen(CFG.smtpnode)) {
|
||||||
|
WriteError("SMTP: host not configured");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Syslog('+', "SMTP: connecting host: %s", CFG.smtpnode);
|
||||||
|
memset(&hints, 0, sizeof(hints));
|
||||||
|
hints.ai_family = AF_UNSPEC;
|
||||||
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
|
|
||||||
|
if ((rc = getaddrinfo(CFG.popnode, "smtp", &hints, &res)) != 0) {
|
||||||
|
WriteError("getaddrinfo %s: %s\n", CFG.popnode, gai_strerror(rc));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (p = res; p != NULL; p = p->ai_next) {
|
||||||
|
void *addr;
|
||||||
|
|
||||||
|
if (p->ai_family == AF_INET) {
|
||||||
|
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
|
||||||
|
addr = &(ipv4->sin_addr);
|
||||||
|
ipver = (char *)"IPv4";
|
||||||
|
} else {
|
||||||
|
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
|
||||||
|
addr = &(ipv6->sin6_addr);
|
||||||
|
ipver = (char *)"IPv6";
|
||||||
|
}
|
||||||
|
inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr);
|
||||||
|
Syslog('+', "Trying %s %s port pop3", ipver, ipstr);
|
||||||
|
|
||||||
|
if ((smtpsock = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
|
||||||
|
WriteError("$socket()");
|
||||||
|
return -1;
|
||||||
|
} else {
|
||||||
|
if (connect(smtpsock, p->ai_addr, p->ai_addrlen) == -1) {
|
||||||
|
WriteError("$connect %s port pop3", ipstr);
|
||||||
|
close(smtpsock);
|
||||||
|
} else {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (p == NULL) {
|
||||||
|
return -1; /* Not connected */
|
||||||
|
}
|
||||||
|
|
||||||
|
q = smtp_receive();
|
||||||
|
if (strlen(q) == 0) {
|
||||||
|
WriteError("SMTP: no response");
|
||||||
|
smtp_close();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strncmp(q, "220", 3)) {
|
||||||
|
WriteError("SMTP: bad response: %s", q);
|
||||||
|
smtp_close();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
Syslog('+', "SMTP: %s", q);
|
||||||
|
|
||||||
|
snprintf(temp, 40, "HELO %s\r\n", CFG.sysdomain);
|
||||||
|
if (smtp_cmd(temp, 250)) {
|
||||||
|
smtp_close();
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return smtpsock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
* $Id: virscan.c,v 1.3 2008/02/25 12:11:42 mbse Exp $
|
|
||||||
* Purpose ...............: Scan a file for virusses
|
* Purpose ...............: Scan a file for virusses
|
||||||
*
|
*
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
* Copyright (C) 1997-2008
|
* Copyright (C) 1997-2011
|
||||||
*
|
*
|
||||||
* Michiel Broek FIDO: 2:280/2802
|
* Michiel Broek FIDO: 2:280/2802
|
||||||
* Beekmansbos 10
|
* Beekmansbos 10
|
||||||
@ -43,43 +42,55 @@ extern pid_t mypid;
|
|||||||
* 1 = Virus found.
|
* 1 = Virus found.
|
||||||
* 2 = Internal error.
|
* 2 = Internal error.
|
||||||
*/
|
*/
|
||||||
int clam_stream_check(char *server, char *port, char *filename)
|
int clam_stream_check(char *servname, char *servport, char *filename)
|
||||||
{
|
{
|
||||||
struct sockaddr_in sa_in;
|
struct sockaddr_in sa_in;
|
||||||
struct addrinfo hints, *res;
|
struct addrinfo hints, *res = NULL, *p;
|
||||||
int s, ss, buf_len = 0, err;
|
int s, ss, buf_len = 0, err;
|
||||||
char buf[1024], *buf_c, *port_s;
|
char buf[1024], *buf_c, *port_s, *ipver = NULL, ipstr[INET6_ADDRSTRLEN];
|
||||||
FILE *fp;
|
FILE *fp;
|
||||||
|
|
||||||
Syslog('f', "clam_stream_check(%s, %s, %s)", server, port, filename);
|
Syslog('f', "clam_stream_check(%s, %s, %s)", servname, servport, filename);
|
||||||
memset(&hints, 0, sizeof(hints));
|
memset(&hints, 0, sizeof(hints));
|
||||||
hints.ai_family = PF_INET;
|
hints.ai_family = AF_UNSPEC;
|
||||||
hints.ai_socktype = SOCK_STREAM;
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
|
|
||||||
if ((err = getaddrinfo(server, port, &hints, &res)) != 0) {
|
if ((err = getaddrinfo(servname, servport, &hints, &res)) != 0) {
|
||||||
WriteError("getaddrinfo(%s:%s): %s\n", server, port, gai_strerror(err));
|
WriteError("getaddrinfo(%s:%s): %s\n", servname, servport, gai_strerror(err));
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (res) {
|
for (p = res; p != NULL; p = p->ai_next) {
|
||||||
s = socket(PF_INET, SOCK_STREAM, 0);
|
void *addr;
|
||||||
if (s == -1) {
|
|
||||||
|
if (p->ai_family == AF_INET) {
|
||||||
|
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
|
||||||
|
addr = &(ipv4->sin_addr);
|
||||||
|
ipver = (char *)"IPv4";
|
||||||
|
} else {
|
||||||
|
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
|
||||||
|
addr = &(ipv6->sin6_addr);
|
||||||
|
ipver = (char *)"IPv6";
|
||||||
|
}
|
||||||
|
inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr);
|
||||||
|
Syslog('+', "Trying %s %s port %s", ipver, ipstr, servport);
|
||||||
|
|
||||||
|
if ((s = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
|
||||||
WriteError("$socket()");
|
WriteError("$socket()");
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (connect(s, res->ai_addr, sizeof(struct sockaddr)) == -1) {
|
if (connect(s, p->ai_addr, p->ai_addrlen) == -1) {
|
||||||
struct sockaddr_in *sa = (struct sockaddr_in *)res->ai_addr;
|
WriteError("$connect %s port %s", ipstr, servport);
|
||||||
WriteError("$connect(%s:%d)", inet_ntoa(sa->sin_addr), (int)ntohs(sa->sin_port));
|
p = p->ai_next;
|
||||||
res = res->ai_next;
|
|
||||||
close(s);
|
close(s);
|
||||||
} else {
|
} else {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (res == NULL) {
|
if (p == NULL) {
|
||||||
WriteError("unable to connect to %s", server);
|
WriteError("unable to connect to %s", servname);
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
* $Id: binkp.c,v 1.135 2007/08/26 14:02:28 mbse Exp $
|
|
||||||
* Purpose .................: Fidonet binkp protocol
|
* Purpose .................: Fidonet binkp protocol
|
||||||
* Binkp protocol copyright : Dima Maloff.
|
* Binkp protocol copyright : Dima Maloff.
|
||||||
*
|
*
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
* Copyright (C) 1997-2007
|
* Copyright (C) 1997-2011
|
||||||
*
|
*
|
||||||
* Michiel Broek FIDO: 2:280/2802
|
* Michiel Broek FIDO: 2:280/2802
|
||||||
* Beekmansbos 10
|
* Beekmansbos 10
|
||||||
@ -72,7 +71,7 @@ extern char *tempinbound;
|
|||||||
extern char *ttystat[];
|
extern char *ttystat[];
|
||||||
extern int Loaded;
|
extern int Loaded;
|
||||||
extern pid_t mypid;
|
extern pid_t mypid;
|
||||||
extern struct sockaddr_in peeraddr;
|
extern struct sockaddr_in peeraddr4;
|
||||||
extern int most_debug;
|
extern int most_debug;
|
||||||
extern int laststat;
|
extern int laststat;
|
||||||
extern int crashme;
|
extern int crashme;
|
||||||
@ -693,7 +692,7 @@ SM_STATE(WaitConn)
|
|||||||
SM_ERROR;
|
SM_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!CFG.NoMD5 && ((bp.MD_Challenge = MD_getChallenge(NULL, &peeraddr)) != NULL)) {
|
if (!CFG.NoMD5 && ((bp.MD_Challenge = MD_getChallenge(NULL, &peeraddr4)) != NULL)) {
|
||||||
/*
|
/*
|
||||||
* Answering site MUST send CRAM message as very first M_NUL
|
* Answering site MUST send CRAM message as very first M_NUL
|
||||||
*/
|
*/
|
||||||
|
125
mbcico/opentcp.c
125
mbcico/opentcp.c
@ -1,10 +1,9 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
* $Id: opentcp.c,v 1.27 2006/07/17 18:54:16 mbse Exp $
|
|
||||||
* Purpose ...............: Fidonet mailer
|
* Purpose ...............: Fidonet mailer
|
||||||
*
|
*
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
* Copyright (C) 1997-2005
|
* Copyright (C) 1997-2011
|
||||||
*
|
*
|
||||||
* Michiel Broek FIDO: 2:280/2802
|
* Michiel Broek FIDO: 2:280/2802
|
||||||
* Beekmansbos 10
|
* Beekmansbos 10
|
||||||
@ -59,26 +58,32 @@ static int tcp_is_open = FALSE;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* opentcp() was rewritten by Martin Junius */
|
/*
|
||||||
|
* Parameter may be:
|
||||||
int opentcp(char *name)
|
* host.example.com
|
||||||
|
* host.example.com:portnumber
|
||||||
|
* host.example.com:portname
|
||||||
|
*/
|
||||||
|
int opentcp(char *servname)
|
||||||
{
|
{
|
||||||
struct servent *se;
|
struct servent *se;
|
||||||
struct hostent *he;
|
|
||||||
struct sockaddr_in server;
|
struct sockaddr_in server;
|
||||||
int a1, a2, a3, a4, GotPort = FALSE;
|
int rc, GotPort = FALSE;
|
||||||
char *errmsg, *portname;
|
char *portname, *ipver = NULL, servport[20], ipstr[INET6_ADDRSTRLEN];
|
||||||
short portnum;
|
u_int16_t portnum;
|
||||||
|
struct addrinfo hints, *res=NULL, *p;
|
||||||
|
|
||||||
Syslog('+', "Open TCP connection to \"%s\"", MBSE_SS(name));
|
memset(&hints, 0, sizeof(hints));
|
||||||
|
hints.ai_family = AF_UNSPEC;
|
||||||
|
hints.ai_socktype = SOCK_STREAM;
|
||||||
|
|
||||||
|
Syslog('+', "Open TCP connection to \"%s\"", MBSE_SS(servname));
|
||||||
tcp_is_open = FALSE;
|
tcp_is_open = FALSE;
|
||||||
server.sin_family = AF_INET;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get port number from name argument if there is a : part
|
* Get port number from name argument if there is a : part
|
||||||
*/
|
*/
|
||||||
if ((portname = strchr(name,':'))) {
|
if ((portname = strchr(servname,':'))) {
|
||||||
*portname++='\0';
|
*portname++='\0';
|
||||||
if ((portnum = atoi(portname))) {
|
if ((portnum = atoi(portname))) {
|
||||||
server.sin_port=htons(portnum);
|
server.sin_port=htons(portnum);
|
||||||
@ -112,23 +117,16 @@ int opentcp(char *name)
|
|||||||
default: server.sin_port = htons(FIDOPORT);
|
default: server.sin_port = htons(FIDOPORT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
snprintf(servport, 19, "%d", ntohs(server.sin_port));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Get IP address for the hostname
|
* Lookup hostname and return list of IPv4 and or IPv6 addresses.
|
||||||
*/
|
*/
|
||||||
if (sscanf(name,"%d.%d.%d.%d",&a1,&a2,&a3,&a4) == 4)
|
if ((rc = getaddrinfo(servname, servport, &hints, &res))) {
|
||||||
server.sin_addr.s_addr = inet_addr(name);
|
if (rc == EAI_SYSTEM)
|
||||||
else if ((he = gethostbyname(name)))
|
WriteError("opentcp: getaddrinfo() failed");
|
||||||
memcpy(&server.sin_addr,he->h_addr,he->h_length);
|
else
|
||||||
else {
|
Syslog('+', "Host not found --> %s\n", gai_strerror(rc));
|
||||||
switch (h_errno) {
|
|
||||||
case HOST_NOT_FOUND: errmsg = (char *)"Authoritative: Host not found"; break;
|
|
||||||
case TRY_AGAIN: errmsg = (char *)"Non-Authoritive: Host not found"; break;
|
|
||||||
case NO_RECOVERY: errmsg = (char *)"Non recoverable errors"; break;
|
|
||||||
case NO_ADDRESS: errmsg = (char *)"Host has no IP address"; break;
|
|
||||||
default: errmsg = (char *)"Unknown error"; break;
|
|
||||||
}
|
|
||||||
Syslog('+', "No IP address for %s: %s\n", name, errmsg);
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,29 +140,68 @@ int opentcp(char *name)
|
|||||||
close(0);
|
close(0);
|
||||||
close(1);
|
close(1);
|
||||||
|
|
||||||
if ((fd = socket(AF_INET,SOCK_STREAM,0)) != 0) {
|
/*
|
||||||
WriteError("$Cannot create socket (got %d, expected 0)", fd);
|
* In case a node has a A and AAAA dns entry, we now have a list of
|
||||||
open("/dev/null",O_RDONLY);
|
* possible connections to make, we try them until we succeed.
|
||||||
open("/dev/null",O_WRONLY);
|
* Most likely, the first one is ok.
|
||||||
return -1;
|
* Nice that this also works for clustered hosts, not that we will
|
||||||
|
* find any in fidonet, but .....
|
||||||
|
*/
|
||||||
|
for (p = res; p != NULL; p = p->ai_next) {
|
||||||
|
void *addr;
|
||||||
|
|
||||||
|
rc = 0;
|
||||||
|
if (p->ai_family == AF_INET) {
|
||||||
|
struct sockaddr_in *ipv4 = (struct sockaddr_in *)p->ai_addr;
|
||||||
|
addr = &(ipv4->sin_addr);
|
||||||
|
ipver = (char *)"IPv4";
|
||||||
|
} else {
|
||||||
|
struct sockaddr_in6 *ipv6 = (struct sockaddr_in6 *)p->ai_addr;
|
||||||
|
addr = &(ipv6->sin6_addr);
|
||||||
|
ipver = (char *)"IPv6";
|
||||||
|
}
|
||||||
|
inet_ntop(p->ai_family, addr, ipstr, sizeof ipstr);
|
||||||
|
Syslog('+', "Trying %s %s port %s", ipver, ipstr, servport);
|
||||||
|
|
||||||
|
if ((fd = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) != 0) {
|
||||||
|
if (fd > 0)
|
||||||
|
WriteError("Cannot create socket (got %d, expected 0)", fd);
|
||||||
|
else
|
||||||
|
WriteError("$Cannot create socket");
|
||||||
|
rc = -1;
|
||||||
|
} else {
|
||||||
|
if (dup(fd) != 1) {
|
||||||
|
WriteError("$Cannot dup socket");
|
||||||
|
rc = -1;
|
||||||
|
} else {
|
||||||
|
clearerr(stdin);
|
||||||
|
clearerr(stdout);
|
||||||
|
if (connect(fd, p->ai_addr, p->ai_addrlen) == -1) {
|
||||||
|
Syslog('+', "$Cannot connect %s port %s", ipstr, servport);
|
||||||
|
close(fd+1); /* close duped socket */
|
||||||
|
close(fd); /* close this socket */
|
||||||
|
rc = -1;
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* Connected, leave this loop
|
||||||
|
*/
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (dup(fd) != 1) {
|
if (rc == -1) {
|
||||||
WriteError("$Cannot dup socket");
|
open("/dev/null", O_RDONLY);
|
||||||
open("/dev/null",O_WRONLY);
|
open("/dev/null", O_WRONLY);
|
||||||
return -1;
|
freeaddrinfo(res);
|
||||||
}
|
|
||||||
clearerr(stdin);
|
|
||||||
clearerr(stdout);
|
|
||||||
if (connect(fd,(struct sockaddr *)&server,sizeof(server)) == -1) {
|
|
||||||
Syslog('+', "$Cannot connect %s",inet_ntoa(server.sin_addr));
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
f_flags=0;
|
f_flags=0;
|
||||||
|
Syslog('+', "Established %s/TCP %s connection with %s, port %s",
|
||||||
Syslog('+', "Established %s/TCP connection with %s, port %d",
|
|
||||||
(tcp_mode == TCPMODE_IFC) ? "IFC":(tcp_mode == TCPMODE_ITN) ?"ITN":(tcp_mode == TCPMODE_IBN) ? "IBN":"Unknown",
|
(tcp_mode == TCPMODE_IFC) ? "IFC":(tcp_mode == TCPMODE_ITN) ?"ITN":(tcp_mode == TCPMODE_IBN) ? "IBN":"Unknown",
|
||||||
inet_ntoa(server.sin_addr), (int)ntohs(server.sin_port));
|
ipver, ipstr, servport);
|
||||||
|
freeaddrinfo(res);
|
||||||
c_start = time(NULL);
|
c_start = time(NULL);
|
||||||
carrier = TRUE;
|
carrier = TRUE;
|
||||||
tcp_is_open = TRUE;
|
tcp_is_open = TRUE;
|
||||||
@ -181,7 +218,7 @@ void closetcp(void)
|
|||||||
if (!tcp_is_open)
|
if (!tcp_is_open)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
shutdown(fd, 2);
|
shutdown(fd, SHUT_RDWR);
|
||||||
signal(SIGHUP, SIG_IGN);
|
signal(SIGHUP, SIG_IGN);
|
||||||
signal(SIGPIPE, SIG_IGN);
|
signal(SIGPIPE, SIG_IGN);
|
||||||
|
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
* $Id: session.c,v 1.37 2007/10/14 13:15:34 mbse Exp $
|
|
||||||
* Purpose ...............: Fidonet mailer
|
* Purpose ...............: Fidonet mailer
|
||||||
*
|
*
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
* Copyright (C) 1997-2007
|
* Copyright (C) 1997-2011
|
||||||
*
|
*
|
||||||
* Michiel Broek FIDO: 2:280/2802
|
* Michiel Broek FIDO: 2:280/2802
|
||||||
* Beekmansbos 10
|
* Beekmansbos 10
|
||||||
@ -63,7 +62,8 @@ int session_state = STATE_BAD;
|
|||||||
|
|
||||||
static char *data=NULL;
|
static char *data=NULL;
|
||||||
|
|
||||||
struct sockaddr_in peeraddr;
|
struct sockaddr_in peeraddr4;
|
||||||
|
struct sockaddr_in6 peeraddr6;
|
||||||
|
|
||||||
|
|
||||||
char *typestr(int);
|
char *typestr(int);
|
||||||
@ -103,6 +103,17 @@ void geoiplookup(GeoIP* gi, char *hostname, int i)
|
|||||||
Syslog('+', "GeoIP location: %s, %s %s\n", country_name, country_code, country_continent);
|
Syslog('+', "GeoIP location: %s, %s %s\n", country_name, country_code, country_continent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (GEOIP_COUNTRY_EDITION_V6 == i) {
|
||||||
|
country_id = GeoIP_id_by_name_v6(gi, hostname);
|
||||||
|
country_code = GeoIP_country_code[country_id];
|
||||||
|
country_name = GeoIP_country_name[country_id];
|
||||||
|
country_continent = GeoIP_country_continent[country_id];
|
||||||
|
if (country_code == NULL) {
|
||||||
|
Syslog('+', "%s: IP Address not found\n", GeoIPDBDescription[i]);
|
||||||
|
} else {
|
||||||
|
Syslog('+', "GeoIP location: %s, %s %s\n", country_name, country_code, country_continent);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -111,12 +122,12 @@ void geoiplookup(GeoIP* gi, char *hostname, int i)
|
|||||||
int session(faddr *a, node *nl, int role, int tp, char *dt)
|
int session(faddr *a, node *nl, int role, int tp, char *dt)
|
||||||
{
|
{
|
||||||
int rc = MBERR_OK;
|
int rc = MBERR_OK;
|
||||||
socklen_t addrlen = sizeof(struct sockaddr_in);
|
socklen_t addrlen = sizeof(struct sockaddr_in6);
|
||||||
fa_list *tmpl;
|
fa_list *tmpl;
|
||||||
int Fdo = -1, input_pipe[2], output_pipe[2];
|
int Fdo = -1, input_pipe[2], output_pipe[2];
|
||||||
pid_t ipid, opid;
|
pid_t ipid, opid;
|
||||||
|
char str[INET6_ADDRSTRLEN];
|
||||||
#ifdef HAVE_GEOIP_H
|
#ifdef HAVE_GEOIP_H
|
||||||
char *hostname;
|
|
||||||
GeoIP *gi;
|
GeoIP *gi;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -124,18 +135,26 @@ int session(faddr *a, node *nl, int role, int tp, char *dt)
|
|||||||
session_type = tp;
|
session_type = tp;
|
||||||
nlent = nl;
|
nlent = nl;
|
||||||
|
|
||||||
if (getpeername(0,(struct sockaddr*)&peeraddr,&addrlen) == 0) {
|
if (getpeername(0,(struct sockaddr *)&peeraddr6, &addrlen) == 0) {
|
||||||
Syslog('s', "TCP connection: len=%d, family=%hd, port=%hu, addr=%s",
|
/*
|
||||||
addrlen,peeraddr.sin_family, peeraddr.sin_port, inet_ntoa(peeraddr.sin_addr));
|
* Copy IPv4 part into the IPv6 structure. There has to be a better way
|
||||||
|
* to deal with mixed incoming sockets ???
|
||||||
|
*/
|
||||||
|
memcpy(&peeraddr4, &peeraddr6, sizeof(struct sockaddr_in));
|
||||||
|
if ((peeraddr6.sin6_family == AF_INET6) && (inet_ntop(AF_INET6, &peeraddr6.sin6_addr, str, sizeof(str)))) {
|
||||||
|
Syslog('s', "IPv6 TCP connection: len=%d, port=%hu, addr=%s", addrlen, ntohs(peeraddr6.sin6_port), str);
|
||||||
|
} else if ((peeraddr4.sin_family == AF_INET) && (inet_ntop(AF_INET, &peeraddr4.sin_addr, str, sizeof(str)))) {
|
||||||
|
Syslog('s', "IPv4 TCP connection: len=%d, port=%hu, addr=%s", addrlen, ntohs(peeraddr4.sin_port), str);
|
||||||
|
}
|
||||||
if (role == 0) {
|
if (role == 0) {
|
||||||
if (tcp_mode == TCPMODE_IBN) {
|
if (tcp_mode == TCPMODE_IBN) {
|
||||||
Syslog('+', "Incoming IBN/TCP connection from %s", inet_ntoa(peeraddr.sin_addr));
|
Syslog('+', "Incoming IBN/TCP connection from %s", str);
|
||||||
IsDoing("Incoming IBN/TCP");
|
IsDoing("Incoming IBN/TCP");
|
||||||
} else if (tcp_mode == TCPMODE_IFC) {
|
} else if (tcp_mode == TCPMODE_IFC) {
|
||||||
Syslog('+', "Incoming IFC/TCP connection from %s", inet_ntoa(peeraddr.sin_addr));
|
Syslog('+', "Incoming IFC/TCP connection from %s", str);
|
||||||
IsDoing("Incoming IFC/TCP");
|
IsDoing("Incoming IFC/TCP");
|
||||||
} else if (tcp_mode == TCPMODE_ITN) {
|
} else if (tcp_mode == TCPMODE_ITN) {
|
||||||
Syslog('+', "Incoming ITN/TCP connection from %s", inet_ntoa(peeraddr.sin_addr));
|
Syslog('+', "Incoming ITN/TCP connection from %s", str);
|
||||||
IsDoing("Incoming ITN/TCP");
|
IsDoing("Incoming ITN/TCP");
|
||||||
} else if (tcp_mode == TCPMODE_NONE) {
|
} else if (tcp_mode == TCPMODE_NONE) {
|
||||||
WriteError("Unknown TCP connection, parameter missing");
|
WriteError("Unknown TCP connection, parameter missing");
|
||||||
@ -145,13 +164,21 @@ int session(faddr *a, node *nl, int role, int tp, char *dt)
|
|||||||
session_flags |= SESSION_TCP;
|
session_flags |= SESSION_TCP;
|
||||||
|
|
||||||
#ifdef HAVE_GEOIP_H
|
#ifdef HAVE_GEOIP_H
|
||||||
hostname = inet_ntoa(peeraddr.sin_addr);
|
|
||||||
_GeoIP_setup_dbfilename();
|
_GeoIP_setup_dbfilename();
|
||||||
if (GeoIP_db_avail(GEOIP_COUNTRY_EDITION)) {
|
if (peeraddr6.sin6_family == AF_INET6) {
|
||||||
if ((gi = GeoIP_open_type(GEOIP_COUNTRY_EDITION, GEOIP_STANDARD)) != NULL) {
|
if (GeoIP_db_avail(GEOIP_COUNTRY_EDITION_V6)) {
|
||||||
geoiplookup(gi, hostname, GEOIP_COUNTRY_EDITION);
|
if ((gi = GeoIP_open_type(GEOIP_COUNTRY_EDITION_V6, GEOIP_STANDARD)) != NULL) {
|
||||||
|
geoiplookup(gi, str, GEOIP_COUNTRY_EDITION_V6);
|
||||||
|
}
|
||||||
|
GeoIP_delete(gi);
|
||||||
|
}
|
||||||
|
} else if (peeraddr6.sin6_family == AF_INET) {
|
||||||
|
if (GeoIP_db_avail(GEOIP_COUNTRY_EDITION)) {
|
||||||
|
if ((gi = GeoIP_open_type(GEOIP_COUNTRY_EDITION, GEOIP_STANDARD)) != NULL) {
|
||||||
|
geoiplookup(gi, str, GEOIP_COUNTRY_EDITION);
|
||||||
|
}
|
||||||
|
GeoIP_delete(gi);
|
||||||
}
|
}
|
||||||
GeoIP_delete(gi);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -163,7 +190,6 @@ int session(faddr *a, node *nl, int role, int tp, char *dt)
|
|||||||
* since it's now on stadin and stdout.
|
* since it's now on stadin and stdout.
|
||||||
*/
|
*/
|
||||||
Fdo = dup(0);
|
Fdo = dup(0);
|
||||||
Syslog('s', "session: new socket %d", Fdo);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Close stdin and stdout so that when we create the pipes to
|
* Close stdin and stdout so that when we create the pipes to
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
* $Id: mbnntp.c,v 1.24 2007/10/14 15:29:58 mbse Exp $
|
|
||||||
* Purpose ...............: MBSE NNTP Server
|
* Purpose ...............: MBSE NNTP Server
|
||||||
*
|
*
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
* Copyright (C) 1997-2007
|
* Copyright (C) 1997-2011
|
||||||
*
|
*
|
||||||
* Michiel Broek FIDO: 2:280/2802
|
* Michiel Broek FIDO: 2:280/2802
|
||||||
* Beekmansbos 10
|
* Beekmansbos 10
|
||||||
@ -42,7 +41,8 @@
|
|||||||
time_t t_start;
|
time_t t_start;
|
||||||
time_t t_end;
|
time_t t_end;
|
||||||
char *envptr = NULL;
|
char *envptr = NULL;
|
||||||
struct sockaddr_in peeraddr;
|
struct sockaddr_in peeraddr4;
|
||||||
|
struct sockaddr_in6 peeraddr6;
|
||||||
pid_t mypid;
|
pid_t mypid;
|
||||||
unsigned int rcvdbytes = 0L;
|
unsigned int rcvdbytes = 0L;
|
||||||
unsigned int sentbytes = 0L;
|
unsigned int sentbytes = 0L;
|
||||||
@ -124,6 +124,17 @@ void geoiplookup(GeoIP* gi, char *hostname, int i)
|
|||||||
Syslog('+', "GeoIP location: %s, %s %s\n", country_name, country_code, country_continent);
|
Syslog('+', "GeoIP location: %s, %s %s\n", country_name, country_code, country_continent);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (GEOIP_COUNTRY_EDITION_V6 == i) {
|
||||||
|
country_id = GeoIP_id_by_name_v6(gi, hostname);
|
||||||
|
country_code = GeoIP_country_code[country_id];
|
||||||
|
country_name = GeoIP_country_name[country_id];
|
||||||
|
country_continent = GeoIP_country_continent[country_id];
|
||||||
|
if (country_code == NULL) {
|
||||||
|
Syslog('+', "%s: IP Address not found\n", GeoIPDBDescription[i]);
|
||||||
|
} else {
|
||||||
|
Syslog('+', "GeoIP location: %s, %s %s\n", country_name, country_code, country_continent);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -133,9 +144,9 @@ int main(int argc, char *argv[])
|
|||||||
{
|
{
|
||||||
struct passwd *pw;
|
struct passwd *pw;
|
||||||
int i, rc;
|
int i, rc;
|
||||||
socklen_t addrlen = sizeof(struct sockaddr_in);
|
socklen_t addrlen = sizeof(struct sockaddr_in6);
|
||||||
|
char str[INET6_ADDRSTRLEN];
|
||||||
#ifdef HAVE_GEOIP_H
|
#ifdef HAVE_GEOIP_H
|
||||||
char *hostname;
|
|
||||||
GeoIP *gi;
|
GeoIP *gi;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -190,18 +201,34 @@ int main(int argc, char *argv[])
|
|||||||
if ((rc = rawport()) != 0)
|
if ((rc = rawport()) != 0)
|
||||||
WriteError("Unable to set raw mode");
|
WriteError("Unable to set raw mode");
|
||||||
else {
|
else {
|
||||||
if (getpeername(0,(struct sockaddr*)&peeraddr,&addrlen) == 0) {
|
if (getpeername(0,(struct sockaddr*)&peeraddr6,&addrlen) == 0) {
|
||||||
Syslog('s', "TCP connection: len=%d, family=%hd, port=%hu, addr=%s",
|
/*
|
||||||
addrlen,peeraddr.sin_family, peeraddr.sin_port, inet_ntoa(peeraddr.sin_addr));
|
* Copy IPv4 part into the IPv6 structure. There has to be a better way
|
||||||
Syslog('+', "Incoming connection from %s", inet_ntoa(peeraddr.sin_addr));
|
* to deal with mixed incoming sockets ???
|
||||||
|
*/
|
||||||
|
memcpy(&peeraddr4, &peeraddr6, sizeof(struct sockaddr_in));
|
||||||
|
if ((peeraddr6.sin6_family == AF_INET6) && (inet_ntop(AF_INET6, &peeraddr6.sin6_addr, str, sizeof(str)))) {
|
||||||
|
Syslog('+', "Incoming IPv6 connection from %s", str);
|
||||||
|
} else if ((peeraddr4.sin_family == AF_INET) && (inet_ntop(AF_INET, &peeraddr4.sin_addr, str, sizeof(str)))) {
|
||||||
|
Syslog('+', "Incoming IPv4 connection from %s", str);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef HAVE_GEOIP_H
|
#ifdef HAVE_GEOIP_H
|
||||||
hostname = inet_ntoa(peeraddr.sin_addr);
|
|
||||||
_GeoIP_setup_dbfilename();
|
_GeoIP_setup_dbfilename();
|
||||||
if (GeoIP_db_avail(GEOIP_COUNTRY_EDITION)) {
|
if (peeraddr6.sin6_family == AF_INET6) {
|
||||||
if ((gi = GeoIP_open_type(GEOIP_COUNTRY_EDITION, GEOIP_STANDARD)) != NULL) {
|
if (GeoIP_db_avail(GEOIP_COUNTRY_EDITION_V6)) {
|
||||||
geoiplookup(gi, hostname, GEOIP_COUNTRY_EDITION);
|
if ((gi = GeoIP_open_type(GEOIP_COUNTRY_EDITION_V6, GEOIP_STANDARD)) != NULL) {
|
||||||
|
geoiplookup(gi, str, GEOIP_COUNTRY_EDITION_V6);
|
||||||
|
}
|
||||||
|
GeoIP_delete(gi);
|
||||||
|
}
|
||||||
|
} else if (peeraddr6.sin6_family == AF_INET) {
|
||||||
|
if (GeoIP_db_avail(GEOIP_COUNTRY_EDITION)) {
|
||||||
|
if ((gi = GeoIP_open_type(GEOIP_COUNTRY_EDITION, GEOIP_STANDARD)) != NULL) {
|
||||||
|
geoiplookup(gi, str, GEOIP_COUNTRY_EDITION);
|
||||||
|
}
|
||||||
|
GeoIP_delete(gi);
|
||||||
}
|
}
|
||||||
GeoIP_delete(gi);
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifdef USE_NEWSGATE
|
#ifdef USE_NEWSGATE
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
* $Id: mbtask.c,v 1.136 2008/03/09 12:21:26 mbse Exp $
|
|
||||||
* Purpose ...............: MBSE BBS Task Manager
|
* Purpose ...............: MBSE BBS Task Manager
|
||||||
*
|
*
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
* Copyright (C) 1997-2008
|
* Copyright (C) 1997-2011
|
||||||
*
|
*
|
||||||
* Michiel Broek FIDO: 2:280/2802
|
* Michiel Broek FIDO: 2:280/2802
|
||||||
* Beekmansbos 10
|
* Beekmansbos 10
|
||||||
@ -987,7 +986,7 @@ void check_sema(void)
|
|||||||
void start_scheduler(int port)
|
void start_scheduler(int port)
|
||||||
{
|
{
|
||||||
struct passwd *pw;
|
struct passwd *pw;
|
||||||
char *cmd = NULL;
|
char *cmd = NULL, ipstr[INET6_ADDRSTRLEN];
|
||||||
|
|
||||||
if (nodaemon)
|
if (nodaemon)
|
||||||
printf("init fidonet\n");
|
printf("init fidonet\n");
|
||||||
@ -1037,10 +1036,14 @@ void start_scheduler(int port)
|
|||||||
* Setup IBC socket
|
* Setup IBC socket
|
||||||
*/
|
*/
|
||||||
if (Run_IBC) {
|
if (Run_IBC) {
|
||||||
|
void *addr;
|
||||||
|
|
||||||
myaddr_in.sin_family = AF_INET;
|
myaddr_in.sin_family = AF_INET;
|
||||||
myaddr_in.sin_addr.s_addr = INADDR_ANY;
|
myaddr_in.sin_addr.s_addr = INADDR_ANY;
|
||||||
myaddr_in.sin_port = port;
|
myaddr_in.sin_port = port;
|
||||||
Syslog('+', "IBC: listen on %s, port %d", inet_ntoa(myaddr_in.sin_addr), ntohs(myaddr_in.sin_port));
|
addr = &(myaddr_in.sin_addr);
|
||||||
|
inet_ntop(AF_INET, addr, ipstr, sizeof ipstr);
|
||||||
|
Syslog('+', "IBC: listen on %s, port %d", ipstr, ntohs(myaddr_in.sin_port));
|
||||||
|
|
||||||
ibcsock = socket(AF_INET, SOCK_DGRAM, 0);
|
ibcsock = socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
if (ibcsock == -1) {
|
if (ibcsock == -1) {
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
*
|
*
|
||||||
* $Id: ping.c,v 1.41 2006/05/22 12:09:15 mbse Exp $
|
|
||||||
* Purpose ...............: mbtask - ping functions
|
* Purpose ...............: mbtask - ping functions
|
||||||
*
|
*
|
||||||
*****************************************************************************
|
*****************************************************************************
|
||||||
* Copyright (C) 1997-2006
|
* Copyright (C) 1997-2011
|
||||||
*
|
*
|
||||||
* Michiel Broek FIDO: 2:280/2802
|
* Michiel Broek FIDO: 2:280/2802
|
||||||
* Beekmansbos 10
|
* Beekmansbos 10
|
||||||
@ -349,7 +348,7 @@ void check_ping(void)
|
|||||||
|
|
||||||
ping_next = (time_t)(now + 20);
|
ping_next = (time_t)(now + 20);
|
||||||
|
|
||||||
if (inet_aton(pingaddress, &paddr)) {
|
if (inet_pton(AF_INET, pingaddress, &paddr)) {
|
||||||
pingresult[pingnr - 1] = FALSE;
|
pingresult[pingnr - 1] = FALSE;
|
||||||
rc = ping_send(paddr);
|
rc = ping_send(paddr);
|
||||||
if (rc) {
|
if (rc) {
|
||||||
|
@ -448,34 +448,12 @@ int main(int argc, char **argv)
|
|||||||
STRFCPY(tty, utent.ut_line);
|
STRFCPY(tty, utent.ut_line);
|
||||||
|
|
||||||
if (hflg) {
|
if (hflg) {
|
||||||
#ifdef UT_ADDR
|
/*
|
||||||
struct hostent *he;
|
* Add remote hostname to the environment. I think
|
||||||
|
* (not sure) I saw it once on Irix. --marekm
|
||||||
/*
|
*/
|
||||||
* Fill in the ut_addr field (remote login IP address).
|
addenv("REMOTEHOST", hostname);
|
||||||
* XXX - login from util-linux does it, but this is not
|
}
|
||||||
* the right place to do it. The program that starts
|
|
||||||
* login (telnetd, rlogind) knows the IP address, so it
|
|
||||||
* should create the utmp entry and fill in ut_addr.
|
|
||||||
* gethostbyname() is not 100% reliable (the remote host
|
|
||||||
* may be unknown, etc.). --marekm
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((he = gethostbyname(hostname))) {
|
|
||||||
utent.ut_addr = *((int32_t *)(he->h_addr_list[0]));
|
|
||||||
#endif
|
|
||||||
#ifdef UT_HOST
|
|
||||||
strncpy(utent.ut_host, hostname, sizeof(utent.ut_host));
|
|
||||||
#endif
|
|
||||||
#if HAVE_UTMPX_H
|
|
||||||
strncpy(utxent.ut_host, hostname, sizeof(utxent.ut_host));
|
|
||||||
#endif
|
|
||||||
/*
|
|
||||||
* Add remote hostname to the environment. I think
|
|
||||||
* (not sure) I saw it once on Irix. --marekm
|
|
||||||
*/
|
|
||||||
addenv("REMOTEHOST", hostname);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
/* workaround for init/getty leaving junk in ut_host at least in some
|
/* workaround for init/getty leaving junk in ut_host at least in some
|
||||||
|
Reference in New Issue
Block a user