diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2006-11-22 16:10:39 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2006-11-22 16:10:39 +0000 |
commit | c8717cd8571cd35d71696aab8aa847169756bd9f (patch) | |
tree | 254a736d3e761bddc4ba4b00a8f6af1d430ad18f /networking | |
parent | 0801ef28ca655a28543b28754fd804ba0616c21c (diff) | |
download | busybox-w32-c8717cd8571cd35d71696aab8aa847169756bd9f.tar.gz busybox-w32-c8717cd8571cd35d71696aab8aa847169756bd9f.tar.bz2 busybox-w32-c8717cd8571cd35d71696aab8aa847169756bd9f.zip |
telnetd: move generic stuff into libbb. It will make it easy
to make other server applets IPv6-aware too.
Diffstat (limited to 'networking')
-rw-r--r-- | networking/fakeidentd.c | 4 | ||||
-rw-r--r-- | networking/telnetd.c | 80 |
2 files changed, 4 insertions, 80 deletions
diff --git a/networking/fakeidentd.c b/networking/fakeidentd.c index 18e86c50b..0e543e772 100644 --- a/networking/fakeidentd.c +++ b/networking/fakeidentd.c | |||
@@ -110,13 +110,13 @@ static void handlexitsigs(int signum) | |||
110 | /* May succeed. If not, won't care. */ | 110 | /* May succeed. If not, won't care. */ |
111 | static void writepid(uid_t nobody, uid_t nogrp) | 111 | static void writepid(uid_t nobody, uid_t nogrp) |
112 | { | 112 | { |
113 | char buf[24]; | 113 | char buf[sizeof(int)*3 + 2]; |
114 | int fd = open(PIDFILE, O_WRONLY|O_CREAT|O_TRUNC, 0664); | 114 | int fd = open(PIDFILE, O_WRONLY|O_CREAT|O_TRUNC, 0664); |
115 | 115 | ||
116 | if (fd < 0) | 116 | if (fd < 0) |
117 | return; | 117 | return; |
118 | 118 | ||
119 | snprintf(buf, 23, "%d\n", getpid()); | 119 | sprintf(buf, "%d\n", getpid()); |
120 | write(fd, buf, strlen(buf)); | 120 | write(fd, buf, strlen(buf)); |
121 | fchown(fd, nobody, nogrp); | 121 | fchown(fd, nobody, nogrp); |
122 | close(fd); | 122 | close(fd); |
diff --git a/networking/telnetd.c b/networking/telnetd.c index d524ac891..604f65c91 100644 --- a/networking/telnetd.c +++ b/networking/telnetd.c | |||
@@ -354,87 +354,10 @@ free_session(struct tsession *ts) | |||
354 | } | 354 | } |
355 | } | 355 | } |
356 | 356 | ||
357 | static int | ||
358 | dotted2sockaddr(const char *dotted, struct sockaddr* sp, int socklen) | ||
359 | { | ||
360 | union { | ||
361 | struct in_addr a4; | ||
362 | #if ENABLE_FEATURE_IPV6 | ||
363 | struct in6_addr a6; | ||
364 | #endif | ||
365 | } a; | ||
366 | |||
367 | #if ENABLE_FEATURE_IPV6 | ||
368 | if (socklen >= sizeof(struct sockaddr_in6) | ||
369 | && inet_pton(AF_INET6, dotted, &a) > 0 | ||
370 | ) { | ||
371 | ((struct sockaddr_in6*)sp)->sin6_family = AF_INET6; | ||
372 | ((struct sockaddr_in6*)sp)->sin6_addr = a.a6; | ||
373 | } else | ||
374 | #endif | ||
375 | if (socklen >= sizeof(struct sockaddr_in) | ||
376 | && inet_pton(AF_INET, dotted, &a) > 0 | ||
377 | ) { | ||
378 | ((struct sockaddr_in*)sp)->sin_family = AF_INET; | ||
379 | ((struct sockaddr_in*)sp)->sin_addr = a.a4; | ||
380 | } else | ||
381 | return 1; | ||
382 | |||
383 | return 0; /* success */ | ||
384 | } | ||
385 | |||
386 | static int | ||
387 | xsocket_stream_ip4or6(sa_family_t *fp) | ||
388 | { | ||
389 | int fd = socket(AF_INET6, SOCK_STREAM, 0); | ||
390 | if (fp) *fp = AF_INET6; | ||
391 | if (fd < 0) { | ||
392 | fd = xsocket(AF_INET, SOCK_STREAM, 0); | ||
393 | if (fp) *fp = AF_INET; | ||
394 | } | ||
395 | return fd; | ||
396 | } | ||
397 | |||
398 | static int | ||
399 | create_socket(const char *hostaddr, int port) | ||
400 | { | ||
401 | static const int on = 1; | ||
402 | int fd; | ||
403 | union { | ||
404 | struct sockaddr sa; | ||
405 | struct sockaddr_in sin; | ||
406 | #if ENABLE_FEATURE_IPV6 | ||
407 | struct sockaddr_in6 sin6; | ||
408 | #endif | ||
409 | } sa; | ||
410 | |||
411 | memset(&sa, 0, sizeof(sa)); | ||
412 | if (hostaddr && dotted2sockaddr(hostaddr, &sa.sa, sizeof(sa))) | ||
413 | bb_show_usage(); | ||
414 | |||
415 | if (!sa.sa.sa_family) | ||
416 | fd = xsocket_stream_ip4or6(&sa.sa.sa_family); | ||
417 | else /* user specified -b ADDR dictates family */ | ||
418 | fd = xsocket(sa.sa.sa_family, SOCK_STREAM, 0); | ||
419 | setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); | ||
420 | |||
421 | #if ENABLE_FEATURE_IPV6 | ||
422 | if (sa.sa.sa_family == AF_INET6) | ||
423 | sa.sin6.sin6_port = htons(port); | ||
424 | #endif | ||
425 | if (sa.sa.sa_family == AF_INET) | ||
426 | sa.sin.sin_port = htons(port); | ||
427 | |||
428 | xbind(fd, &sa.sa, sizeof(sa)); | ||
429 | xlisten(fd, 1); | ||
430 | return fd; | ||
431 | } | ||
432 | |||
433 | #else /* !FEATURE_TELNETD_STANDALONE */ | 357 | #else /* !FEATURE_TELNETD_STANDALONE */ |
434 | 358 | ||
435 | /* Never actually called */ | 359 | /* Never actually called */ |
436 | void free_session(struct tsession *ts); | 360 | void free_session(struct tsession *ts); |
437 | int create_socket(const char *hostaddr, int port); | ||
438 | 361 | ||
439 | #endif | 362 | #endif |
440 | 363 | ||
@@ -491,7 +414,8 @@ telnetd_main(int argc, char **argv) | |||
491 | if (IS_INETD) { | 414 | if (IS_INETD) { |
492 | sessions = make_new_session(0, 1); | 415 | sessions = make_new_session(0, 1); |
493 | } else { | 416 | } else { |
494 | master_fd = create_socket(opt_bindaddr, portnbr); | 417 | master_fd = create_and_bind_socket_ip4or6(opt_bindaddr, portnbr); |
418 | xlisten(master_fd, 1); | ||
495 | if (!(opt & OPT_FOREGROUND)) | 419 | if (!(opt & OPT_FOREGROUND)) |
496 | xdaemon(0, 0); | 420 | xdaemon(0, 0); |
497 | } | 421 | } |