From fef65421d3583585ef484383e7a06b2d6c75a1fb Mon Sep 17 00:00:00 2001 From: brian Date: Wed, 25 Jun 1997 19:30:05 +0000 Subject: Add "set server" to control the server socket. Catch SIGUSR1 to re-init listening socket. Document signal behaviour. Add missing '\n's to LogPrintf(LogWARN,...) Main() returns int not void. AF_LOCAL ideal suggested a long time ago by: joerg --- usr.sbin/ppp/server.c | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 usr.sbin/ppp/server.c (limited to 'usr.sbin/ppp/server.c') diff --git a/usr.sbin/ppp/server.c b/usr.sbin/ppp/server.c new file mode 100644 index 0000000..d6bd5d6 --- /dev/null +++ b/usr.sbin/ppp/server.c @@ -0,0 +1,120 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mbuf.h" +#include "log.h" +#include "loadalias.h" +#include "vars.h" +#include "server.h" + +int server = UNKNOWN_SERVER; +static struct sockaddr_un ifsun; +static char *rm; + +int +ServerLocalOpen(const char *name) +{ + int s; + + ifsun.sun_len = strlen(name); + if (ifsun.sun_len > sizeof ifsun.sun_path - 1) { + LogPrintf(LogERROR, "Local: %s: Path too long\n", name); + return 1; + } + ifsun.sun_family = AF_LOCAL; + strcpy(ifsun.sun_path, name); + + s = socket(PF_LOCAL, SOCK_STREAM, 0); + if (s < 0) { + LogPrintf(LogERROR, "Local: socket: %s\n", strerror(errno)); + return 2; + } + + setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &s, sizeof s); + if (bind(s, (struct sockaddr *) &ifsun, sizeof(ifsun)) < 0) { + LogPrintf(LogERROR, "Local: bind: %s\n", strerror(errno)); + if (errno == EADDRINUSE && VarTerm) + fprintf(VarTerm, "Wait for a while, then try again.\n"); + close(s); + unlink(name); + return 3; + } + if (listen(s, 5) != 0) { + LogPrintf(LogERROR, "Local: Unable to listen to socket - OS overload?\n"); + close(s); + unlink(name); + return 4; + } + ServerClose(); + server = s; + rm = ifsun.sun_path; + LogPrintf(LogPHASE, "Listening at local socket %s.\n", name); + return 0; +} + +int +ServerTcpOpen(int port) +{ + struct sockaddr_in ifsin; + int s; + + s = socket(PF_INET, SOCK_STREAM, 0); + if (s < 0) { + LogPrintf(LogERROR, "Tcp: socket: %s\n", strerror(errno)); + return 5; + } + ifsin.sin_family = AF_INET; + ifsin.sin_addr.s_addr = INADDR_ANY; + ifsin.sin_port = htons(port); + setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &s, sizeof s); + if (bind(s, (struct sockaddr *) &ifsin, sizeof(ifsin)) < 0) { + LogPrintf(LogERROR, "Tcp: bind: %s\n", strerror(errno)); + if (errno == EADDRINUSE && VarTerm) + fprintf(VarTerm, "Wait for a while, then try again.\n"); + close(s); + return 6; + } + if (listen(s, 5) != 0) { + LogPrintf(LogERROR, "Tcp: Unable to listen to socket - OS overload?\n"); + close(s); + return 7; + } + ServerClose(); + server = s; + LogPrintf(LogPHASE, "Listening at port %d.\n", port); + return 0; +} + +void +ServerClose() +{ + if (server >= 0) { + close(server); + if (rm) { + unlink(rm); + rm = 0; + } + } + server = -1; +} + +int +ServerType() +{ + if (server == UNKNOWN_SERVER) + return UNKNOWN_SERVER; + else if (server == NO_SERVER) + return NO_SERVER; + else if (rm) + return LOCAL_SERVER; + else + return INET_SERVER; +} -- cgit v1.1