/* $Id: localopen.c 6155 2003-01-19 19:58:25Z rra $
**
*/
#include "config.h"
#include "clibrary.h"
#include <errno.h>
#include <sys/socket.h>
#include "inn/innconf.h"
#include "libinn.h"
#include "nntp.h"
#include "paths.h"
#if HAVE_UNIX_DOMAIN_SOCKETS
# include <sys/un.h>
#endif
/*
** Open a connection to the local InterNetNews NNTP server and optionally
** create stdio FILE's for talking to it. Return -1 on error.
*/
int
NNTPlocalopen(FILE **FromServerp, FILE **ToServerp, char *errbuff)
{
#if defined(HAVE_UNIX_DOMAIN_SOCKETS)
int i;
int j;
int oerrno;
struct sockaddr_un server;
FILE *F;
char mybuff[NNTP_STRLEN + 2];
char *buff;
buff = errbuff ? errbuff : mybuff;
*buff = '\0';
/* Create a socket. */
if ((i = socket(AF_UNIX, SOCK_STREAM, 0)) < 0)
return -1;
/* Connect to the server. */
memset(&server, 0, sizeof server);
server.sun_family = AF_UNIX;
strlcpy(server.sun_path, innconf->pathrun, sizeof(server.sun_path));
strlcat(server.sun_path, "/", sizeof(server.sun_path));
strlcat(server.sun_path, _PATH_NNTPCONNECT, sizeof(server.sun_path));
if (connect(i, (struct sockaddr *)&server, SUN_LEN(&server)) < 0) {
oerrno = errno;
close(i);
errno = oerrno;
return -1;
}
/* Connected -- now make sure we can post. */
if ((F = fdopen(i, "r")) == NULL) {
oerrno = errno;
close(i);
errno = oerrno;
return -1;
}
if (fgets(buff, sizeof mybuff, F) == NULL) {
oerrno = errno;
fclose(F);
errno = oerrno;
return -1;
}
j = atoi(buff);
if (j != NNTP_POSTOK_VAL && j != NNTP_NOPOSTOK_VAL) {
fclose(F);
/* This seems like a reasonable error code to use... */
errno = EPERM;
return -1;
}
*FromServerp = F;
if ((*ToServerp = fdopen(dup(i), "w")) == NULL) {
oerrno = errno;
fclose(F);
errno = oerrno;
return -1;
}
return 0;
#else
return NNTPconnect("127.0.0.1", innconf->port, FromServerp, ToServerp,
errbuff);
#endif /* defined(HAVE_UNIX_DOMAIN_SOCKETS) */
}
syntax highlighted by Code2HTML, v. 0.9.1