server.c (3b0f8d2ed641ceeded11c0d3f253b0cacbf00880) | server.c (b6217683dc0269a53b799399522dbdfb5a4919cc) |
---|---|
1/*- 2 * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 9 unchanged lines hidden (view full) --- 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * | 1/*- 2 * Copyright (c) 1997 Brian Somers <brian@Awfulhak.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 9 unchanged lines hidden (view full) --- 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * |
26 * $Id: server.c,v 1.16.2.9 1998/03/20 19:48:23 brian Exp $ | 26 * $Id: server.c,v 1.16.2.10 1998/04/03 19:21:51 brian Exp $ |
27 */ 28 29#include <sys/param.h> 30#include <sys/socket.h> 31#include <netinet/in.h> 32#include <arpa/inet.h> 33#include <netinet/in_systm.h> | 27 */ 28 29#include <sys/param.h> 30#include <sys/socket.h> 31#include <netinet/in.h> 32#include <arpa/inet.h> 33#include <netinet/in_systm.h> |
34#include <netinet/ip.h> |
|
34 35#include <errno.h> 36#include <stdio.h> 37#include <string.h> 38#include <sys/stat.h> 39#include <sys/un.h> 40#include <termios.h> 41#include <unistd.h> --- 5 unchanged lines hidden (view full) --- 47#include "defs.h" 48#include "vars.h" 49#include "descriptor.h" 50#include "server.h" 51#include "id.h" 52#include "prompt.h" 53#include "timer.h" 54#include "auth.h" | 35 36#include <errno.h> 37#include <stdio.h> 38#include <string.h> 39#include <sys/stat.h> 40#include <sys/un.h> 41#include <termios.h> 42#include <unistd.h> --- 5 unchanged lines hidden (view full) --- 48#include "defs.h" 49#include "vars.h" 50#include "descriptor.h" 51#include "server.h" 52#include "id.h" 53#include "prompt.h" 54#include "timer.h" 55#include "auth.h" |
56#include "lqr.h" 57#include "hdlc.h" 58#include "fsm.h" 59#include "lcp.h" 60#include "ccp.h" 61#include "throughput.h" 62#include "link.h" 63#include "mp.h" 64#include "iplist.h" 65#include "slcompress.h" 66#include "ipcp.h" 67#include "filter.h" 68#include "bundle.h" |
|
55 56static int 57server_UpdateSet(struct descriptor *d, fd_set *r, fd_set *w, fd_set *e, int *n) 58{ 59 struct server *s = descriptor2server(d); 60 61 if (r && s->fd >= 0) { 62 if (*n < s->fd + 1) --- 10 unchanged lines hidden (view full) --- 73 struct server *s = descriptor2server(d); 74 return s->fd >= 0 && FD_ISSET(s->fd, fdset); 75} 76 77#define IN_SIZE sizeof(struct sockaddr_in) 78#define UN_SIZE sizeof(struct sockaddr_in) 79#define ADDRSZ (IN_SIZE > UN_SIZE ? IN_SIZE : UN_SIZE) 80 | 69 70static int 71server_UpdateSet(struct descriptor *d, fd_set *r, fd_set *w, fd_set *e, int *n) 72{ 73 struct server *s = descriptor2server(d); 74 75 if (r && s->fd >= 0) { 76 if (*n < s->fd + 1) --- 10 unchanged lines hidden (view full) --- 87 struct server *s = descriptor2server(d); 88 return s->fd >= 0 && FD_ISSET(s->fd, fdset); 89} 90 91#define IN_SIZE sizeof(struct sockaddr_in) 92#define UN_SIZE sizeof(struct sockaddr_in) 93#define ADDRSZ (IN_SIZE > UN_SIZE ? IN_SIZE : UN_SIZE) 94 |
95static char *rm; 96 |
|
81static void 82server_Read(struct descriptor *d, struct bundle *bundle, const fd_set *fdset) 83{ 84 struct server *s = descriptor2server(d); 85 char hisaddr[ADDRSZ]; 86 struct sockaddr *sa = (struct sockaddr *)hisaddr; 87 struct sockaddr_in *sin = (struct sockaddr_in *)hisaddr; 88 int ssize = ADDRSZ, wfd; | 97static void 98server_Read(struct descriptor *d, struct bundle *bundle, const fd_set *fdset) 99{ 100 struct server *s = descriptor2server(d); 101 char hisaddr[ADDRSZ]; 102 struct sockaddr *sa = (struct sockaddr *)hisaddr; 103 struct sockaddr_in *sin = (struct sockaddr_in *)hisaddr; 104 int ssize = ADDRSZ, wfd; |
105 struct prompt *p; |
|
89 90 wfd = accept(s->fd, sa, &ssize); 91 if (wfd < 0) { 92 LogPrintf(LogERROR, "server_Read: accept(): %s\n", strerror(errno)); 93 return; 94 } 95 96 switch (sa->sa_family) { --- 14 unchanged lines hidden (view full) --- 111 break; 112 113 default: 114 write(wfd, "Unrecognised access !\n", 22); 115 close(wfd); 116 return; 117 } 118 | 106 107 wfd = accept(s->fd, sa, &ssize); 108 if (wfd < 0) { 109 LogPrintf(LogERROR, "server_Read: accept(): %s\n", strerror(errno)); 110 return; 111 } 112 113 switch (sa->sa_family) { --- 14 unchanged lines hidden (view full) --- 128 break; 129 130 default: 131 write(wfd, "Unrecognised access !\n", 22); 132 close(wfd); 133 return; 134 } 135 |
119 if (!prompt_Init(&prompt, wfd)) { 120 write(wfd, "Connection already in use.\n", 27); | 136 if ((p = prompt_Create(s, bundle, wfd)) == NULL) { 137 write(wfd, "Connection refused.\n", 20); |
121 close(wfd); 122 } else { | 138 close(wfd); 139 } else { |
123 LocalAuthInit(); 124 IsInteractive(1); 125 prompt_Display(&prompt, bundle); | 140 switch (sa->sa_family) { 141 case AF_LOCAL: 142 snprintf(p->who, sizeof p->who, "local (%s)", rm); 143 break; 144 case AF_INET: 145 snprintf(p->who, sizeof p->who, "TCP (%s:%u)", 146 inet_ntoa(sin->sin_addr), sin->sin_port); 147 break; 148 } 149 IsInteractive(p); 150 prompt_TtyCommandMode(p); 151 prompt_Required(p); |
126 } 127} 128 129static void 130server_Write(struct descriptor *d, struct bundle *bundle, const fd_set *fdset) 131{ 132 /* We never want to write here ! */ 133 LogPrintf(LogERROR, "server_Write: Internal error: Bad call !\n"); --- 7 unchanged lines hidden (view full) --- 141 server_IsSet, 142 server_Read, 143 server_Write 144 }, 145 -1 146}; 147 148static struct sockaddr_un ifsun; | 152 } 153} 154 155static void 156server_Write(struct descriptor *d, struct bundle *bundle, const fd_set *fdset) 157{ 158 /* We never want to write here ! */ 159 LogPrintf(LogERROR, "server_Write: Internal error: Bad call !\n"); --- 7 unchanged lines hidden (view full) --- 167 server_IsSet, 168 server_Read, 169 server_Write 170 }, 171 -1 172}; 173 174static struct sockaddr_un ifsun; |
149static char *rm; | |
150 151int | 175 176int |
152ServerLocalOpen(const char *name, mode_t mask) | 177ServerLocalOpen(struct bundle *bundle, const char *name, mode_t mask) |
153{ 154 int s; 155 | 178{ 179 int s; 180 |
156 if (VarLocalAuth == LOCAL_DENY) { 157 LogPrintf(LogWARN, "Local: Can't open socket %s: No password " 158 "in ppp.secret\n", name); 159 return 1; 160 } 161 162 if (mode & MODE_INTER) { 163 LogPrintf(LogWARN, "Local: Can't open socket in interactive mode\n"); 164 return 1; 165 } 166 | |
167 memset(&ifsun, '\0', sizeof ifsun); 168 ifsun.sun_len = strlen(name); 169 if (ifsun.sun_len > sizeof ifsun.sun_path - 1) { 170 LogPrintf(LogERROR, "Local: %s: Path too long\n", name); 171 return 2; 172 } 173 ifsun.sun_family = AF_LOCAL; 174 strcpy(ifsun.sun_path, name); --- 4 unchanged lines hidden (view full) --- 179 return 3; 180 } 181 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &s, sizeof s); 182 if (mask != (mode_t)-1) 183 mask = umask(mask); 184 if (bind(s, (struct sockaddr *)&ifsun, sizeof ifsun) < 0) { 185 if (mask != (mode_t)-1) 186 umask(mask); | 181 memset(&ifsun, '\0', sizeof ifsun); 182 ifsun.sun_len = strlen(name); 183 if (ifsun.sun_len > sizeof ifsun.sun_path - 1) { 184 LogPrintf(LogERROR, "Local: %s: Path too long\n", name); 185 return 2; 186 } 187 ifsun.sun_family = AF_LOCAL; 188 strcpy(ifsun.sun_path, name); --- 4 unchanged lines hidden (view full) --- 193 return 3; 194 } 195 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &s, sizeof s); 196 if (mask != (mode_t)-1) 197 mask = umask(mask); 198 if (bind(s, (struct sockaddr *)&ifsun, sizeof ifsun) < 0) { 199 if (mask != (mode_t)-1) 200 umask(mask); |
187 LogPrintf(LogERROR, "Local: bind: %s\n", strerror(errno)); 188 if (errno == EADDRINUSE) 189 prompt_Printf(&prompt, "Wait for a while, then try again.\n"); | 201 LogPrintf(LogWARN, "Local: bind: %s\n", strerror(errno)); |
190 close(s); 191 return 4; 192 } 193 if (mask != (mode_t)-1) 194 umask(mask); 195 if (listen(s, 5) != 0) { 196 LogPrintf(LogERROR, "Local: Unable to listen to socket - BUNDLE overload?\n"); 197 close(s); 198 ID0unlink(name); 199 return 5; 200 } | 202 close(s); 203 return 4; 204 } 205 if (mask != (mode_t)-1) 206 umask(mask); 207 if (listen(s, 5) != 0) { 208 LogPrintf(LogERROR, "Local: Unable to listen to socket - BUNDLE overload?\n"); 209 close(s); 210 ID0unlink(name); 211 return 5; 212 } |
201 ServerClose(); | 213 ServerClose(bundle); |
202 server.fd = s; 203 rm = ifsun.sun_path; 204 LogPrintf(LogPHASE, "Listening at local socket %s.\n", name); 205 return 0; 206} 207 208int | 214 server.fd = s; 215 rm = ifsun.sun_path; 216 LogPrintf(LogPHASE, "Listening at local socket %s.\n", name); 217 return 0; 218} 219 220int |
209ServerTcpOpen(int port) | 221ServerTcpOpen(struct bundle *bundle, int port) |
210{ 211 struct sockaddr_in ifsin; 212 int s; 213 | 222{ 223 struct sockaddr_in ifsin; 224 int s; 225 |
214 if (VarLocalAuth == LOCAL_DENY) { 215 LogPrintf(LogWARN, "Tcp: Can't open socket %d: No password " 216 "in ppp.secret\n", port); 217 return 6; 218 } 219 220 if (mode & MODE_INTER) { 221 LogPrintf(LogWARN, "Tcp: Can't open socket in interactive mode\n"); 222 return 6; 223 } 224 | |
225 s = ID0socket(PF_INET, SOCK_STREAM, 0); 226 if (s < 0) { 227 LogPrintf(LogERROR, "Tcp: socket: %s\n", strerror(errno)); 228 return 7; 229 } 230 memset(&ifsin, '\0', sizeof ifsin); 231 ifsin.sin_family = AF_INET; 232 ifsin.sin_addr.s_addr = INADDR_ANY; 233 ifsin.sin_port = htons(port); 234 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &s, sizeof s); 235 if (bind(s, (struct sockaddr *)&ifsin, sizeof ifsin) < 0) { | 226 s = ID0socket(PF_INET, SOCK_STREAM, 0); 227 if (s < 0) { 228 LogPrintf(LogERROR, "Tcp: socket: %s\n", strerror(errno)); 229 return 7; 230 } 231 memset(&ifsin, '\0', sizeof ifsin); 232 ifsin.sin_family = AF_INET; 233 ifsin.sin_addr.s_addr = INADDR_ANY; 234 ifsin.sin_port = htons(port); 235 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &s, sizeof s); 236 if (bind(s, (struct sockaddr *)&ifsin, sizeof ifsin) < 0) { |
236 LogPrintf(LogERROR, "Tcp: bind: %s\n", strerror(errno)); 237 if (errno == EADDRINUSE) 238 prompt_Printf(&prompt, "Wait for a while, then try again.\n"); | 237 LogPrintf(LogWARN, "Tcp: bind: %s\n", strerror(errno)); |
239 close(s); 240 return 8; 241 } 242 if (listen(s, 5) != 0) { 243 LogPrintf(LogERROR, "Tcp: Unable to listen to socket - BUNDLE overload?\n"); 244 close(s); 245 return 9; 246 } | 238 close(s); 239 return 8; 240 } 241 if (listen(s, 5) != 0) { 242 LogPrintf(LogERROR, "Tcp: Unable to listen to socket - BUNDLE overload?\n"); 243 close(s); 244 return 9; 245 } |
247 ServerClose(); | 246 ServerClose(bundle); |
248 server.fd = s; 249 LogPrintf(LogPHASE, "Listening at port %d.\n", port); 250 return 0; 251} 252 253int | 247 server.fd = s; 248 LogPrintf(LogPHASE, "Listening at port %d.\n", port); 249 return 0; 250} 251 252int |
254ServerClose() | 253ServerClose(struct bundle *bundle) |
255{ 256 if (server.fd >= 0) { 257 close(server.fd); 258 if (rm) { 259 ID0unlink(rm); 260 rm = 0; 261 } 262 server.fd = -1; | 254{ 255 if (server.fd >= 0) { 256 close(server.fd); 257 if (rm) { 258 ID0unlink(rm); 259 rm = 0; 260 } 261 server.fd = -1; |
262 /* Drop associated prompts */ 263 bundle_DelPromptDescriptors(bundle, &server); |
|
263 return 1; 264 } 265 return 0; 266} | 264 return 1; 265 } 266 return 0; 267} |