/* $Id: localopen.c 6155 2003-01-19 19:58:25Z rra $ ** */ #include "config.h" #include "clibrary.h" #include #include #include "inn/innconf.h" #include "libinn.h" #include "nntp.h" #include "paths.h" #if HAVE_UNIX_DOMAIN_SOCKETS # include #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) */ }