1706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh/*- 2706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org> 3706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * All rights reserved. 4706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * 5706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * Redistribution and use in source and binary forms, with or without 6706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * modification, are permitted provided that the following conditions 7706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * are met: 8706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * 1. Redistributions of source code must retain the above copyright 9706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * notice, this list of conditions and the following disclaimer. 10706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * 2. Redistributions in binary form must reproduce the above copyright 11706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * notice, this list of conditions and the following disclaimer in the 12706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * documentation and/or other materials provided with the distribution. 13706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * 14706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 15706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 18706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * SUCH DAMAGE. 25706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * 26706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh * $FreeBSD: src/usr.sbin/ppp/server.c,v 1.44.14.1 2010/12/21 17:10:29 kensmith Exp $ 27706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh */ 28706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 29706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <sys/param.h> 30706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 31706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <sys/socket.h> 32706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <netinet/in.h> 33706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <sys/un.h> 34706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 35706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <errno.h> 36706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <stdarg.h> 37706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <stdio.h> 38706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <string.h> 39706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <sys/stat.h> 40706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <termios.h> 41706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include <unistd.h> 42706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 43706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "log.h" 44706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "descriptor.h" 45706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "server.h" 46706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "prompt.h" 47706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "ncpaddr.h" 48706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#include "probe.h" 49706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 50706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstatic int 51706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehserver_UpdateSet(struct fdescriptor *d, fd_set *r, fd_set *w, fd_set *e, int *n) 52706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 53706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct server *s = descriptor2server(d); 54706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct prompt *p; 55706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int sets; 56706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 57706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh sets = 0; 58706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (r && s->fd >= 0) { 59706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (*n < s->fd + 1) 60706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh *n = s->fd + 1; 61706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh FD_SET(s->fd, r); 62706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh log_Printf(LogTIMER, "server: fdset(r) %d\n", s->fd); 63706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh sets++; 64706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 65706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 66706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh for (p = log_PromptList(); p; p = p->next) 67706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh sets += descriptor_UpdateSet(&p->desc, r, w, e, n); 68706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 69706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return sets; 70706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 71706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 72706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstatic int 73706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehserver_IsSet(struct fdescriptor *d, const fd_set *fdset) 74706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 75706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct server *s = descriptor2server(d); 76706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct prompt *p; 77706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 78706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (s->fd >= 0 && FD_ISSET(s->fd, fdset)) 79706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return 1; 80706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 81706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh for (p = log_PromptList(); p; p = p->next) 82706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (descriptor_IsSet(&p->desc, fdset)) 83706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return 1; 84706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 85706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return 0; 86706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 87706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 88706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstatic void 89706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehserver_Read(struct fdescriptor *d, struct bundle *bundle, const fd_set *fdset) 90706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 91706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct server *s = descriptor2server(d); 92706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct sockaddr_storage ss; 93706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct sockaddr *sa = (struct sockaddr *)&ss; 94706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct sockaddr_in *sin = (struct sockaddr_in *)&ss; 95706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifndef NOINET6 96706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&ss; 97706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 98706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int ssize = sizeof ss, wfd; 99706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct prompt *p; 100706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct ncpaddr addr; 101706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 102706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (s->fd >= 0 && FD_ISSET(s->fd, fdset)) { 103706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh wfd = accept(s->fd, sa, &ssize); 104706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (wfd < 0) 105706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh log_Printf(LogERROR, "server_Read: accept(): %s\n", strerror(errno)); 106706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh else if (sa->sa_len == 0) { 107706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh close(wfd); 108706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh wfd = -1; 109706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 110706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } else 111706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh wfd = -1; 112706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 113706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (wfd >= 0) 114706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh switch (sa->sa_family) { 115706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh case AF_LOCAL: 116706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh log_Printf(LogPHASE, "Connected to local client.\n"); 117706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh break; 118706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 119706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh case AF_INET: 120706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ncpaddr_setsa(&addr, sa); 121706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (ntohs(sin->sin_port) < 1024) { 122706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh log_Printf(LogALERT, "Rejected client connection from %s:%u" 123706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh "(invalid port number) !\n", 124706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ncpaddr_ntoa(&addr), ntohs(sin->sin_port)); 125706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh close(wfd); 126706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh wfd = -1; 127706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh break; 128706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 129706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh log_Printf(LogPHASE, "Connected to client from %s:%u\n", 130706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ncpaddr_ntoa(&addr), ntohs(sin->sin_port)); 131706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh break; 132706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 133706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifndef NOINET6 134706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh case AF_INET6: 135706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ncpaddr_setsa(&addr, sa); 136706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (ntohs(sin6->sin6_port) < 1024) { 137706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh log_Printf(LogALERT, "Rejected client connection from %s:%u" 138706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh "(invalid port number) !\n", 139706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ncpaddr_ntoa(&addr), ntohs(sin6->sin6_port)); 140706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh close(wfd); 141706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh wfd = -1; 142706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh break; 143706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 144706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh log_Printf(LogPHASE, "Connected to client from %s:%u\n", 145706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ncpaddr_ntoa(&addr), ntohs(sin6->sin6_port)); 146706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh break; 147706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 148706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 149706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh default: 150706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh write(wfd, "Unrecognised access !\n", 22); 151706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh close(wfd); 152706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh wfd = -1; 153706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh break; 154706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 155706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 156706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (wfd >= 0) { 157706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if ((p = prompt_Create(s, bundle, wfd)) == NULL) { 158706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh write(wfd, "Connection refused.\n", 20); 159706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh close(wfd); 160706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } else { 161706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh switch (sa->sa_family) { 162706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh case AF_LOCAL: 163706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh p->src.type = "local"; 164706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh strncpy(p->src.from, s->cfg.sockname, sizeof p->src.from - 1); 165706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh p->src.from[sizeof p->src.from - 1] = '\0'; 166706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh break; 167706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh case AF_INET: 168706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh p->src.type = "ip"; 169706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh snprintf(p->src.from, sizeof p->src.from, "%s:%u", 170706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ncpaddr_ntoa(&addr), ntohs(sin->sin_port)); 171706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh break; 172706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifndef NOINET6 173706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh case AF_INET6: 174706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh p->src.type = "ip6"; 175706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh snprintf(p->src.from, sizeof p->src.from, "%s:%u", 176706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ncpaddr_ntoa(&addr), ntohs(sin6->sin6_port)); 177706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh break; 178706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 179706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 180706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh prompt_TtyCommandMode(p); 181706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh prompt_Required(p); 182706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 183706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 184706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 185706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh log_PromptListChanged = 0; 186706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh for (p = log_PromptList(); p; p = p->next) 187706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (descriptor_IsSet(&p->desc, fdset)) { 188706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh descriptor_Read(&p->desc, bundle, fdset); 189706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (log_PromptListChanged) 190706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh break; 191706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 192706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 193706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 194706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstatic int 195706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehserver_Write(struct fdescriptor *d __unused, struct bundle *bundle __unused, 196706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh const fd_set *fdset __unused) 197706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 198706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh /* We never want to write here ! */ 199706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh log_Printf(LogALERT, "server_Write: Internal error: Bad call !\n"); 200706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return 0; 201706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 202706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 203706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehstruct server server = { 204706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 205706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh SERVER_DESCRIPTOR, 206706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server_UpdateSet, 207706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server_IsSet, 208706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server_Read, 209706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server_Write 210706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh }, 211706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh -1, 212706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { "", "", 0, 0 } 213706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh}; 214706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 215706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehenum server_stat 216706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehserver_Reopen(struct bundle *bundle) 217706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 218706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh char name[sizeof server.cfg.sockname]; 219706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct stat st; 220706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh u_short port; 221706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh mode_t mask; 222706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh enum server_stat ret; 223706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 224706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (server.cfg.sockname[0] != '\0') { 225706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh strcpy(name, server.cfg.sockname); 226706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh mask = server.cfg.mask; 227706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server_Close(bundle); 228706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (server.cfg.sockname[0] != '\0' && stat(server.cfg.sockname, &st) == 0) 229706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (!(st.st_mode & S_IFSOCK) || unlink(server.cfg.sockname) != 0) 230706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return SERVER_FAILED; 231706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ret = server_LocalOpen(bundle, name, mask); 232706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } else if (server.cfg.port != 0) { 233706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh port = server.cfg.port; 234706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server_Close(bundle); 235706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ret = server_TcpOpen(bundle, port); 236706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } else 237706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ret = SERVER_UNSET; 238706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 239706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return ret; 240706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 241706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 242706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehenum server_stat 243706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehserver_LocalOpen(struct bundle *bundle, const char *name, mode_t mask) 244706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 245706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct sockaddr_un ifsun; 246706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh mode_t oldmask; 247706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int s; 248706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 249706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh oldmask = (mode_t)-1; /* Silence compiler */ 250706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 251706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (server.cfg.sockname && !strcmp(server.cfg.sockname, name)) 252706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server_Close(bundle); 253706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 254706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh memset(&ifsun, '\0', sizeof ifsun); 255706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ifsun.sun_len = strlen(name); 256706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (ifsun.sun_len > sizeof ifsun.sun_path - 1) { 257706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh log_Printf(LogERROR, "Local: %s: Path too long\n", name); 258706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return SERVER_INVALID; 259706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 260706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ifsun.sun_family = AF_LOCAL; 261706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh strcpy(ifsun.sun_path, name); 262706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 263706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh s = socket(PF_LOCAL, SOCK_STREAM, 0); 264706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (s < 0) { 265706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh log_Printf(LogERROR, "Local: socket: %s\n", strerror(errno)); 266706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh goto failed; 267706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 268706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &s, sizeof s); 269706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (mask != (mode_t)-1) 270706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh oldmask = umask(mask); 271706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (bind(s, (struct sockaddr *)&ifsun, sizeof ifsun) < 0) { 272706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (mask != (mode_t)-1) 273706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh umask(oldmask); 274706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh log_Printf(LogWARN, "Local: bind: %s\n", strerror(errno)); 275706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh close(s); 276706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh goto failed; 277706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 278706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (mask != (mode_t)-1) 279706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh umask(oldmask); 280706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (listen(s, 5) != 0) { 281706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh log_Printf(LogERROR, "Local: Unable to listen to socket -" 282706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh " BUNDLE overload?\n"); 283706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh close(s); 284706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh unlink(name); 285706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh goto failed; 286706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 287706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server_Close(bundle); 288706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server.fd = s; 289706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server.cfg.port = 0; 290706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh strncpy(server.cfg.sockname, ifsun.sun_path, sizeof server.cfg.sockname - 1); 291706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server.cfg.sockname[sizeof server.cfg.sockname - 1] = '\0'; 292706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server.cfg.mask = mask; 293706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh log_Printf(LogPHASE, "Listening at local socket %s.\n", name); 294706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 295706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return SERVER_OK; 296706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 297706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehfailed: 298706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (server.fd == -1) { 299706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server.fd = -1; 300706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server.cfg.port = 0; 301706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh strncpy(server.cfg.sockname, ifsun.sun_path, 302706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh sizeof server.cfg.sockname - 1); 303706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server.cfg.sockname[sizeof server.cfg.sockname - 1] = '\0'; 304706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server.cfg.mask = mask; 305706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 306706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return SERVER_FAILED; 307706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 308706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 309706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehenum server_stat 310706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehserver_TcpOpen(struct bundle *bundle, u_short port) 311706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 312706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct sockaddr_storage ss; 313706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct sockaddr_in *sin = (struct sockaddr_in *)&ss; 314706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifndef NOINET6 315706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&ss; 316706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 317706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int s, sz; 318706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 319706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (server.cfg.port == port) 320706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server_Close(bundle); 321706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 322706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (port == 0) 323706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return SERVER_INVALID; 324706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 325706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh memset(&ss, '\0', sizeof ss); 326706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifndef NOINET6 327706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (probe.ipv6_available) { 328706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh sin6->sin6_family = AF_INET6; 329706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh sin6->sin6_port = htons(port); 330706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh sin6->sin6_len = (u_int8_t)sizeof ss; 331706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh sz = sizeof *sin6; 332706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh s = socket(PF_INET6, SOCK_STREAM, 0); 333706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } else 334706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 335706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh { 336706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh sin->sin_family = AF_INET; 337706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh sin->sin_port = htons(port); 338706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh sin->sin_len = (u_int8_t)sizeof ss; 339706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh sin->sin_addr.s_addr = INADDR_ANY; 340706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh sz = sizeof *sin; 341706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh s = socket(PF_INET, SOCK_STREAM, 0); 342706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 343706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 344706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (s < 0) { 345706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh log_Printf(LogERROR, "Tcp: socket: %s\n", strerror(errno)); 346706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh goto failed; 347706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 348706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 349706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#ifndef NOINET6 350706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (probe.ipv6_available) { 351706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int off = 0; 352706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, (char *)&off, sizeof(off)); 353706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 354706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh#endif 355706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 356706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &s, sizeof s); 357706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (bind(s, (struct sockaddr *)&ss, sz) < 0) { 358706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh log_Printf(LogWARN, "Tcp: bind: %s\n", strerror(errno)); 359706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh close(s); 360706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh goto failed; 361706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 362706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (listen(s, 5) != 0) { 363706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh log_Printf(LogERROR, "Tcp: Unable to listen to socket: %s\n", 364706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh strerror(errno)); 365706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh close(s); 366706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh goto failed; 367706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 368706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server_Close(bundle); 369706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server.fd = s; 370706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server.cfg.port = port; 371706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh *server.cfg.sockname = '\0'; 372706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server.cfg.mask = 0; 373706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh log_Printf(LogPHASE, "Listening at port %d.\n", port); 374706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return SERVER_OK; 375706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 376706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehfailed: 377706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (server.fd == -1) { 378706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server.fd = -1; 379706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server.cfg.port = port; 380706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh *server.cfg.sockname = '\0'; 381706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server.cfg.mask = 0; 382706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 383706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return SERVER_FAILED; 384706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 385706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 386706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehint 387706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehserver_Close(struct bundle *bundle __unused) 388706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 389706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (server.fd >= 0) { 390706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (*server.cfg.sockname != '\0') { 391706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh struct sockaddr_un un; 392706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int sz = sizeof un; 393706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 394706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh if (getsockname(server.fd, (struct sockaddr *)&un, &sz) == 0 && 395706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh un.sun_family == AF_LOCAL && sz == sizeof un) 396706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh unlink(un.sun_path); 397706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 398706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh close(server.fd); 399706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server.fd = -1; 400706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh /* Drop associated prompts */ 401706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh log_DestroyPrompts(&server); 402706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 403706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return 1; 404706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh } 405706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 406706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return 0; 407706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 408706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 409706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehint 410706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yehserver_Clear(struct bundle *bundle) 411706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh{ 412706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh int ret; 413706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 414706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh ret = server_Close(bundle); 415706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 416706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server.fd = -1; 417706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server.cfg.port = 0; 418706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh *server.cfg.sockname = '\0'; 419706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh server.cfg.mask = 0; 420706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh 421706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh return ret; 422706e567fc5ff6b79738a5f470e5aa7b2cae76459Chia-chi Yeh} 423