server.c (67912) | server.c (71657) |
---|---|
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 * $FreeBSD: head/usr.sbin/ppp/server.c 67912 2000-10-30 00:15:29Z brian $ | 26 * $FreeBSD: head/usr.sbin/ppp/server.c 71657 2001-01-26 01:41:34Z brian $ |
27 */ 28 | 27 */ 28 |
29#include <sys/types.h> | 29#include <sys/param.h> 30 |
30#include <sys/socket.h> 31#include <netinet/in.h> 32#include <arpa/inet.h> 33#include <sys/un.h> 34 35#include <errno.h> 36#include <stdio.h> 37#include <string.h> --- 95 unchanged lines hidden (view full) --- 133 if (wfd >= 0) { 134 if ((p = prompt_Create(s, bundle, wfd)) == NULL) { 135 write(wfd, "Connection refused.\n", 20); 136 close(wfd); 137 } else { 138 switch (sa->sa_family) { 139 case AF_LOCAL: 140 p->src.type = "local"; | 31#include <sys/socket.h> 32#include <netinet/in.h> 33#include <arpa/inet.h> 34#include <sys/un.h> 35 36#include <errno.h> 37#include <stdio.h> 38#include <string.h> --- 95 unchanged lines hidden (view full) --- 134 if (wfd >= 0) { 135 if ((p = prompt_Create(s, bundle, wfd)) == NULL) { 136 write(wfd, "Connection refused.\n", 20); 137 close(wfd); 138 } else { 139 switch (sa->sa_family) { 140 case AF_LOCAL: 141 p->src.type = "local"; |
141 strncpy(p->src.from, s->rm, sizeof p->src.from - 1); | 142 strncpy(p->src.from, s->cfg.sockname, sizeof p->src.from - 1); |
142 p->src.from[sizeof p->src.from - 1] = '\0'; 143 break; 144 case AF_INET: 145 p->src.type = "tcp"; 146 snprintf(p->src.from, sizeof p->src.from, "%s:%u", 147 inet_ntoa(in->sin_addr), in->sin_port); 148 break; 149 } --- 25 unchanged lines hidden (view full) --- 175 server_UpdateSet, 176 server_IsSet, 177 server_Read, 178 server_Write 179 }, 180 -1 181}; 182 | 143 p->src.from[sizeof p->src.from - 1] = '\0'; 144 break; 145 case AF_INET: 146 p->src.type = "tcp"; 147 snprintf(p->src.from, sizeof p->src.from, "%s:%u", 148 inet_ntoa(in->sin_addr), in->sin_port); 149 break; 150 } --- 25 unchanged lines hidden (view full) --- 176 server_UpdateSet, 177 server_IsSet, 178 server_Read, 179 server_Write 180 }, 181 -1 182}; 183 |
183int | 184enum server_stat 185server_Reopen(struct bundle *bundle) 186{ 187 char name[sizeof server.cfg.sockname]; 188 u_short port; 189 mode_t mask; 190 enum server_stat ret; 191 192 if (server.cfg.sockname[0] != '\0') { 193 strcpy(name, server.cfg.sockname); 194 mask = server.cfg.mask; 195 server_Close(bundle); 196 if (server.cfg.sockname[0] != '\0') 197 /* blow it away - and hope nobody else is using it */ 198 unlink(server.cfg.sockname); 199 ret = server_LocalOpen(bundle, name, mask); 200 } else if (server.cfg.port != 0) { 201 port = server.cfg.port; 202 server_Close(bundle); 203 ret = server_TcpOpen(bundle, port); 204 } else 205 ret = SERVER_UNSET; 206 207 return ret; 208} 209 210enum server_stat |
184server_LocalOpen(struct bundle *bundle, const char *name, mode_t mask) 185{ | 211server_LocalOpen(struct bundle *bundle, const char *name, mode_t mask) 212{ |
213 struct sockaddr_un ifsun; 214 mode_t oldmask; |
|
186 int s; 187 | 215 int s; 216 |
188 if (server.rm && !strcmp(server.rm, name)) { 189 if (chmod(server.rm, 0777 & ~mask)) 190 log_Printf(LogERROR, "Local: chmod: %s\n", strerror(errno)); 191 return 0; 192 } | 217 oldmask = (mode_t)-1; /* Silence compiler */ |
193 | 218 |
194 memset(&server.ifsun, '\0', sizeof server.ifsun); 195 server.ifsun.sun_len = strlen(name); 196 if (server.ifsun.sun_len > sizeof server.ifsun.sun_path - 1) { | 219 if (server.cfg.sockname && !strcmp(server.cfg.sockname, name)) 220 server_Close(bundle); 221 222 memset(&ifsun, '\0', sizeof ifsun); 223 ifsun.sun_len = strlen(name); 224 if (ifsun.sun_len > sizeof ifsun.sun_path - 1) { |
197 log_Printf(LogERROR, "Local: %s: Path too long\n", name); | 225 log_Printf(LogERROR, "Local: %s: Path too long\n", name); |
198 return 2; | 226 return SERVER_INVALID; |
199 } | 227 } |
200 server.ifsun.sun_family = AF_LOCAL; 201 strcpy(server.ifsun.sun_path, name); | 228 ifsun.sun_family = AF_LOCAL; 229 strcpy(ifsun.sun_path, name); |
202 | 230 |
203 s = ID0socket(PF_LOCAL, SOCK_STREAM, 0); | 231 s = socket(PF_LOCAL, SOCK_STREAM, 0); |
204 if (s < 0) { 205 log_Printf(LogERROR, "Local: socket: %s\n", strerror(errno)); | 232 if (s < 0) { 233 log_Printf(LogERROR, "Local: socket: %s\n", strerror(errno)); |
206 return 3; | 234 goto failed; |
207 } 208 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &s, sizeof s); 209 if (mask != (mode_t)-1) | 235 } 236 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &s, sizeof s); 237 if (mask != (mode_t)-1) |
210 mask = umask(mask); 211 if (bind(s, (struct sockaddr *)&server.ifsun, sizeof server.ifsun) < 0) { | 238 oldmask = umask(mask); 239 if (bind(s, (struct sockaddr *)&ifsun, sizeof ifsun) < 0) { |
212 if (mask != (mode_t)-1) | 240 if (mask != (mode_t)-1) |
213 umask(mask); | 241 umask(oldmask); |
214 log_Printf(LogWARN, "Local: bind: %s\n", strerror(errno)); 215 close(s); | 242 log_Printf(LogWARN, "Local: bind: %s\n", strerror(errno)); 243 close(s); |
216 return 4; | 244 goto failed; |
217 } 218 if (mask != (mode_t)-1) | 245 } 246 if (mask != (mode_t)-1) |
219 umask(mask); | 247 umask(oldmask); |
220 if (listen(s, 5) != 0) { 221 log_Printf(LogERROR, "Local: Unable to listen to socket -" 222 " BUNDLE overload?\n"); 223 close(s); | 248 if (listen(s, 5) != 0) { 249 log_Printf(LogERROR, "Local: Unable to listen to socket -" 250 " BUNDLE overload?\n"); 251 close(s); |
224 ID0unlink(name); 225 return 5; | 252 unlink(name); 253 goto failed; |
226 } 227 server_Close(bundle); 228 server.fd = s; | 254 } 255 server_Close(bundle); 256 server.fd = s; |
229 server.rm = server.ifsun.sun_path; | 257 server.cfg.port = 0; 258 strncpy(server.cfg.sockname, ifsun.sun_path, sizeof server.cfg.sockname - 1); 259 server.cfg.sockname[sizeof server.cfg.sockname - 1] = '\0'; 260 server.cfg.mask = mask; |
230 log_Printf(LogPHASE, "Listening at local socket %s.\n", name); | 261 log_Printf(LogPHASE, "Listening at local socket %s.\n", name); |
231 return 0; | 262 263 return SERVER_OK; 264 265failed: 266 if (server.fd == -1) { 267 server.fd = -1; 268 server.cfg.port = 0; 269 strncpy(server.cfg.sockname, ifsun.sun_path, 270 sizeof server.cfg.sockname - 1); 271 server.cfg.sockname[sizeof server.cfg.sockname - 1] = '\0'; 272 server.cfg.mask = mask; 273 } 274 return SERVER_FAILED; |
232} 233 | 275} 276 |
234int 235server_TcpOpen(struct bundle *bundle, int port) | 277enum server_stat 278server_TcpOpen(struct bundle *bundle, u_short port) |
236{ 237 struct sockaddr_in ifsin; 238 int s; 239 | 279{ 280 struct sockaddr_in ifsin; 281 int s; 282 |
240 if (server.port == port) 241 return 0; | 283 if (server.cfg.port == port) 284 server_Close(bundle); |
242 | 285 |
243 s = ID0socket(PF_INET, SOCK_STREAM, 0); | 286 if (port == 0) 287 return SERVER_INVALID; 288 289 s = socket(PF_INET, SOCK_STREAM, 0); |
244 if (s < 0) { 245 log_Printf(LogERROR, "Tcp: socket: %s\n", strerror(errno)); | 290 if (s < 0) { 291 log_Printf(LogERROR, "Tcp: socket: %s\n", strerror(errno)); |
246 return 7; | 292 goto failed; |
247 } 248 memset(&ifsin, '\0', sizeof ifsin); 249 ifsin.sin_family = AF_INET; 250 ifsin.sin_addr.s_addr = INADDR_ANY; 251 ifsin.sin_port = htons(port); 252 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &s, sizeof s); 253 if (bind(s, (struct sockaddr *)&ifsin, sizeof ifsin) < 0) { 254 log_Printf(LogWARN, "Tcp: bind: %s\n", strerror(errno)); 255 close(s); | 293 } 294 memset(&ifsin, '\0', sizeof ifsin); 295 ifsin.sin_family = AF_INET; 296 ifsin.sin_addr.s_addr = INADDR_ANY; 297 ifsin.sin_port = htons(port); 298 setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &s, sizeof s); 299 if (bind(s, (struct sockaddr *)&ifsin, sizeof ifsin) < 0) { 300 log_Printf(LogWARN, "Tcp: bind: %s\n", strerror(errno)); 301 close(s); |
256 return 8; | 302 goto failed; |
257 } 258 if (listen(s, 5) != 0) { 259 log_Printf(LogERROR, "Tcp: Unable to listen to socket: %s\n", 260 strerror(errno)); 261 close(s); | 303 } 304 if (listen(s, 5) != 0) { 305 log_Printf(LogERROR, "Tcp: Unable to listen to socket: %s\n", 306 strerror(errno)); 307 close(s); |
262 return 9; | 308 goto failed; |
263 } 264 server_Close(bundle); 265 server.fd = s; | 309 } 310 server_Close(bundle); 311 server.fd = s; |
266 server.port = port; | 312 server.cfg.port = port; 313 *server.cfg.sockname = '\0'; 314 server.cfg.mask = 0; |
267 log_Printf(LogPHASE, "Listening at port %d.\n", port); | 315 log_Printf(LogPHASE, "Listening at port %d.\n", port); |
268 return 0; | 316 return SERVER_OK; 317 318failed: 319 if (server.fd == -1) { 320 server.fd = -1; 321 server.cfg.port = port; 322 *server.cfg.sockname = '\0'; 323 server.cfg.mask = 0; 324 } 325 return SERVER_FAILED; |
269} 270 271int 272server_Close(struct bundle *bundle) 273{ 274 if (server.fd >= 0) { | 326} 327 328int 329server_Close(struct bundle *bundle) 330{ 331 if (server.fd >= 0) { |
275 if (server.rm) { | 332 if (*server.cfg.sockname != '\0') { |
276 struct sockaddr_un un; 277 int sz = sizeof un; 278 279 if (getsockname(server.fd, (struct sockaddr *)&un, &sz) == 0 && 280 un.sun_family == AF_LOCAL && sz == sizeof un) | 333 struct sockaddr_un un; 334 int sz = sizeof un; 335 336 if (getsockname(server.fd, (struct sockaddr *)&un, &sz) == 0 && 337 un.sun_family == AF_LOCAL && sz == sizeof un) |
281 ID0unlink(un.sun_path); 282 server.rm = NULL; | 338 unlink(un.sun_path); |
283 } 284 close(server.fd); 285 server.fd = -1; | 339 } 340 close(server.fd); 341 server.fd = -1; |
286 server.port = 0; | |
287 /* Drop associated prompts */ 288 log_DestroyPrompts(&server); | 342 /* Drop associated prompts */ 343 log_DestroyPrompts(&server); |
344 |
|
289 return 1; 290 } | 345 return 1; 346 } |
347 |
|
291 return 0; 292} | 348 return 0; 349} |
350 351int 352server_Clear(struct bundle *bundle) 353{ 354 int ret; 355 356 ret = server_Close(bundle); 357 358 server.fd = -1; 359 server.cfg.port = 0; 360 *server.cfg.sockname = '\0'; 361 server.cfg.mask = 0; 362 363 return ret; 364} |
|