0.95.12 develop 1, a lot of systems calls changed to universal IPv4/IPv6 functions

This commit is contained in:
Michiel Broek
2011-01-29 13:03:22 +01:00
parent 6c577239f6
commit b533ef8233
15 changed files with 419 additions and 318 deletions

View File

@@ -32,19 +32,15 @@
#include "mbinet.h"
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 */
static int nntpsock = -1; /* TCP/IP socket */
int nntp_connect(void)
{
socklen_t addrlen;
char *p;
char *q, *ipver = NULL, ipstr[INET6_ADDRSTRLEN], servport[10];
struct addrinfo hints, *res = NULL, *p;
int rc;
if (nntpsock != -1)
return nntpsock;
@@ -54,46 +50,57 @@ int nntp_connect(void)
return -1;
}
Syslog('+', "NNTP: connecting host: %s:%d", CFG.nntpnode, CFG.nntpport);
memset(&nntp_loc, 0, sizeof(struct sockaddr_in));
memset(&nntp_rem, 0, sizeof(struct sockaddr_in));
snprintf(servport, 9, "%d", CFG.nntpport);
Syslog('+', "NNTP: connecting host: %s port %s", CFG.nntpnode, servport);
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
nntp_rem.sin_family = AF_INET;
if ((nhp = gethostbyname(CFG.nntpnode)) == NULL) {
WriteError("NNTP: can't find host %s", CFG.nntpnode);
return -1;
if ((rc = getaddrinfo(CFG.popnode, servport, &hints, &res)) != 0) {
WriteError("getaddrinfo %s:%s %s\n", CFG.popnode, servport, gai_strerror(rc));
return -1;
}
nntp_rem.sin_addr.s_addr = ((struct in_addr *)(nhp->h_addr))->s_addr;
nntp_rem.sin_port = htons(CFG.nntpport);
for (p = res; p != NULL; p = p->ai_next) {
void *addr;
if ((nntpsock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
WriteError("$NNTP: unable to create tcp socket");
return -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 ((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) {
WriteError("$NNTP: cannot connect tcp socket");
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) {
q = nntp_receive();
if (strlen(q) == 0) {
WriteError("NNTP: no response");
nntp_close();
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
*/
@@ -102,8 +109,8 @@ int nntp_connect(void)
nntp_close();
return -1;
}
} else if (strncmp(p, "200", 3)) {
WriteError("NNTP: bad response: %s", p);
} else if (strncmp(q, "200", 3)) {
WriteError("NNTP: bad response: %s", q);
// nntp_close(); FIXME: Don't close, the other end might have done that already
// If we do also, this program hangs. Must be fixed!
return -1;
@@ -112,20 +119,20 @@ int nntp_connect(void)
if (CFG.modereader) {
Syslog('+', "NNTP: setting mode reader");
nntp_send((char *)"MODE READER\r\n");
p = nntp_receive();
Syslog('+', "NNTP: %s", p);
if (strncmp(p, "480", 3) == 0) {
q = nntp_receive();
Syslog('+', "NNTP: %s", q);
if (strncmp(q, "480", 3) == 0) {
/*
* Must login with username and password
*/
Syslog('+', "NNTP: %s", p);
Syslog('+', "NNTP: %s", q);
if (nntp_auth() == FALSE) {
WriteError("NNTP: authorisation failure");
nntp_close();
return -1;
}
} else if (strncmp(p, "200", 3)) {
WriteError("NNTP: bad response: %s", p);
} else if (strncmp(q, "200", 3)) {
WriteError("NNTP: bad response: %s", q);
nntp_close();
return -1;
}

View File

@@ -1,10 +1,9 @@
/*****************************************************************************
*
* $Id: pop3.c,v 1.8 2007/08/25 15:29:14 mbse Exp $
* Purpose ...............: MBSE BBS Internet Library
*
*****************************************************************************
* Copyright (C) 1997-2004
* Copyright (C) 1997-2011
*
* Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10
@@ -33,81 +32,78 @@
#include "mbinet.h"
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 */
static int pop3sock = -1; /* TCP/IP socket */
int pop3_connect(void)
{
socklen_t addrlen;
char *p;
char *q, *ipver = NULL, ipstr[INET6_ADDRSTRLEN];
struct addrinfo hints, *res = NULL, *p;
int rc;
if (!strlen(CFG.popnode)) {
WriteError("POP3: host not configured");
return -1;
if (!strlen(CFG.popnode)) {
WriteError("POP3: host not configured");
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);
memset(&pop3_loc, 0, sizeof(struct sockaddr_in));
memset(&pop3_rem, 0, sizeof(struct sockaddr_in));
pop3_rem.sin_family = AF_INET;
if ((php = gethostbyname(CFG.popnode)) == NULL) {
WriteError("POP3: can't find host %s", CFG.popnode);
return -1;
if ((pop3sock = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
WriteError("$socket()");
return -1;
} else {
if (connect(pop3sock, p->ai_addr, p->ai_addrlen) == -1) {
WriteError("$connect %s port pop3", ipstr);
close(pop3sock);
} else {
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) {
/*
* RedHat doesn't follow IANA specs and uses pop-3 in /etc/services
*/
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 (strncmp(q, "+OK", 3)) {
WriteError("POP3: bad response: %s", q);
pop3_close();
return -1;
}
if ((pop3sock = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
WriteError("$POP3: unable to create tcp socket");
return -1;
}
Syslog('+', "POP3: %s", q);
if (connect(pop3sock, (struct sockaddr *)&pop3_rem, sizeof(struct sockaddr_in)) == -1) {
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;
return pop3sock;
}

View File

@@ -1,10 +1,9 @@
/*****************************************************************************
*
* $Id: smtp.c,v 1.10 2007/08/25 15:29:14 mbse Exp $
* Purpose ...............: MBSE BBS Internet Library
*
*****************************************************************************
* Copyright (C) 1997-2005
* Copyright (C) 1997-2011
*
* Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10
@@ -34,84 +33,86 @@
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)
{
socklen_t addrlen;
char *p, temp[40];
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;
}
char *q, *ipver = NULL, ipstr[INET6_ADDRSTRLEN], temp[41];
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(&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;
}

View File

@@ -1,10 +1,9 @@
/*****************************************************************************
*
* $Id: virscan.c,v 1.3 2008/02/25 12:11:42 mbse Exp $
* Purpose ...............: Scan a file for virusses
*
*****************************************************************************
* Copyright (C) 1997-2008
* Copyright (C) 1997-2011
*
* Michiel Broek FIDO: 2:280/2802
* Beekmansbos 10
@@ -43,43 +42,55 @@ extern pid_t mypid;
* 1 = Virus found.
* 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 addrinfo hints, *res;
struct addrinfo hints, *res = NULL, *p;
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;
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));
hints.ai_family = PF_INET;
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
if ((err = getaddrinfo(server, port, &hints, &res)) != 0) {
WriteError("getaddrinfo(%s:%s): %s\n", server, port, gai_strerror(err));
if ((err = getaddrinfo(servname, servport, &hints, &res)) != 0) {
WriteError("getaddrinfo(%s:%s): %s\n", servname, servport, gai_strerror(err));
return 2;
}
while (res) {
s = socket(PF_INET, SOCK_STREAM, 0);
if (s == -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 %s", ipver, ipstr, servport);
if ((s = socket(p->ai_family, p->ai_socktype, p->ai_protocol)) == -1) {
WriteError("$socket()");
return 2;
}
if (connect(s, res->ai_addr, sizeof(struct sockaddr)) == -1) {
struct sockaddr_in *sa = (struct sockaddr_in *)res->ai_addr;
WriteError("$connect(%s:%d)", inet_ntoa(sa->sin_addr), (int)ntohs(sa->sin_port));
res = res->ai_next;
if (connect(s, p->ai_addr, p->ai_addrlen) == -1) {
WriteError("$connect %s port %s", ipstr, servport);
p = p->ai_next;
close(s);
} else {
break;
}
}
if (res == NULL) {
WriteError("unable to connect to %s", server);
if (p == NULL) {
WriteError("unable to connect to %s", servname);
return 2;
}