summaryrefslogtreecommitdiff
path: root/networking
diff options
context:
space:
mode:
authorDenys Vlasenko2010-04-06 17:43:29 +0200
committerDenys Vlasenko2010-04-06 17:43:29 +0200
commitf6916dbed4233ef0e202d1b299cb5a2e9287a696 (patch)
treea761598c5f3d6e935239d8631e7f984c4cd490d6 /networking
parentfcad7681f8a835f5c7b2093da505f46865a89d25 (diff)
downloadbusybox-f6916dbed4233ef0e202d1b299cb5a2e9287a696.zip
busybox-f6916dbed4233ef0e202d1b299cb5a2e9287a696.tar.gz
telnetd: fill hostname field in utmp/wtmp records
function old new delta get_lsa - 109 +109 make_new_session 438 504 +66 get_peer_lsa - 10 +10 ftpd_main 2340 2267 -73 get_sock_lsa 101 10 -91 ------------------------------------------------------------------------------ (add/remove: 2/0 grow/shrink: 1/2 up/down: 185/-164) Total: 21 bytes Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'networking')
-rw-r--r--networking/ftpd.c15
-rw-r--r--networking/telnetd.c21
2 files changed, 15 insertions, 21 deletions
diff --git a/networking/ftpd.c b/networking/ftpd.c
index 375cc0c..9d43ea3 100644
--- a/networking/ftpd.c
+++ b/networking/ftpd.c
@@ -461,21 +461,6 @@ handle_epsv(void)
free(response);
}
-/* libbb candidate */
-static
-len_and_sockaddr* get_peer_lsa(int fd)
-{
- len_and_sockaddr *lsa;
- socklen_t len = 0;
-
- if (getpeername(fd, NULL, &len) != 0)
- return NULL;
- lsa = xzalloc(LSA_LEN_SIZE + len);
- lsa->len = len;
- getpeername(fd, &lsa->u.sa, &lsa->len);
- return lsa;
-}
-
static void
handle_port(void)
{
diff --git a/networking/telnetd.c b/networking/telnetd.c
index b3e66eb..a8c86b6 100644
--- a/networking/telnetd.c
+++ b/networking/telnetd.c
@@ -226,6 +226,9 @@ make_new_session(
IF_FEATURE_TELNETD_STANDALONE(int sock)
IF_NOT_FEATURE_TELNETD_STANDALONE(void)
) {
+#if !ENABLE_FEATURE_TELNETD_STANDALONE
+ enum { sock = 0 );
+#endif
const char *login_argv[2];
struct termios termbuf;
int fd, pid;
@@ -243,9 +246,9 @@ make_new_session(
ndelay_on(fd);
close_on_exec_on(fd);
-#if ENABLE_FEATURE_TELNETD_STANDALONE
/* SO_KEEPALIVE by popular demand */
setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &const_int_1, sizeof(const_int_1));
+#if ENABLE_FEATURE_TELNETD_STANDALONE
ts->sockfd_read = sock;
ndelay_on(sock);
if (sock == 0) { /* We are called with fd 0 - we are in inetd mode */
@@ -256,8 +259,6 @@ make_new_session(
if (sock > G.maxfd)
G.maxfd = sock;
#else
- /* SO_KEEPALIVE by popular demand */
- setsockopt(0, SOL_SOCKET, SO_KEEPALIVE, &const_int_1, sizeof(const_int_1));
/* ts->sockfd_read = 0; - done by xzalloc */
ts->sockfd_write = 1;
ndelay_on(0);
@@ -313,6 +314,17 @@ make_new_session(
/* Restore default signal handling ASAP */
bb_signals((1 << SIGCHLD) + (1 << SIGPIPE), SIG_DFL);
+ if (ENABLE_FEATURE_UTMP) {
+ len_and_sockaddr *lsa = get_peer_lsa(sock);
+ char *hostname = NULL;
+ if (lsa) {
+ hostname = xmalloc_sockaddr2dotted(&lsa->u.sa);
+ free(lsa);
+ }
+ write_new_utmp(pid, LOGIN_PROCESS, tty_name, /*username:*/ "LOGIN", hostname);
+ free(hostname);
+ }
+
/* Make new session and process group */
setsid();
@@ -326,9 +338,6 @@ make_new_session(
pid = getpid();
tcsetpgrp(0, pid); /* switch this tty's process group to us */
-//TODO: fetch remote addr via getpeername (see ftpd.c)
- write_new_utmp(pid, LOGIN_PROCESS, tty_name, /*username:*/ "LOGIN", /*hostname:*/ NULL);
-
/* The pseudo-terminal allocated to the client is configured to operate
* in cooked mode, and with XTABS CRMOD enabled (see tty(4)) */
tcgetattr(0, &termbuf);