Deleted Added
full compact
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}