aboutsummaryrefslogtreecommitdiff
path: root/toys/pending/telnetd.c
diff options
context:
space:
mode:
Diffstat (limited to 'toys/pending/telnetd.c')
-rw-r--r--toys/pending/telnetd.c32
1 files changed, 10 insertions, 22 deletions
diff --git a/toys/pending/telnetd.c b/toys/pending/telnetd.c
index c82ff61e..7bfbf316 100644
--- a/toys/pending/telnetd.c
+++ b/toys/pending/telnetd.c
@@ -25,7 +25,6 @@ config TELNETD
#define FOR_telnetd
#include "toys.h"
#include <arpa/telnet.h>
-#include <utmp.h>
GLOBALS(
char *login_path;
@@ -97,23 +96,6 @@ static void get_sockaddr(char *host, void *buf)
else ((struct sockaddr_in6*)buf)->sin6_port = port_num;
}
-static void utmp_entry(void)
-{
- struct utmp entry;
- struct utmp *utp_ptr;
- pid_t pid = getpid();
-
- utmpname(_PATH_UTMP);
- setutent(); //start from start
- while ((utp_ptr = getutent()) != NULL) {
- if (utp_ptr->ut_pid == pid && utp_ptr->ut_type >= INIT_PROCESS) break;
- }
- if (!utp_ptr) entry.ut_type = DEAD_PROCESS;
- entry.ut_time = time(0);
- setutent();
- pututline(&entry);
-}
-
static int listen_socket(void)
{
int s, af = AF_INET, yes = 1;
@@ -165,11 +147,13 @@ static void write_issue(char *tty)
static int new_session(int sockfd)
{
- char *argv_login[2]; //arguments for execvp cmd, NULL
+ char *argv_login[] = {NULL, "-h", NULL, NULL};
char tty_name[30]; //tty name length.
int fd, flags, i = 1;
char intial_iacs[] = {IAC, DO, TELOPT_ECHO, IAC, DO, TELOPT_NAWS,
IAC, WILL, TELOPT_ECHO, IAC, WILL, TELOPT_SGA };
+ struct sockaddr_storage sa;
+ socklen_t sl = sizeof(sa);
setsockopt(sockfd, SOL_SOCKET, SO_KEEPALIVE, &i, sizeof(i));
flags = fcntl(sockfd, F_GETFL);
@@ -183,9 +167,14 @@ static int new_session(int sockfd)
return fd;
}
if (TT.fork_pid < 0) perror_exit("fork");
+
+ if (getpeername(sockfd, (void *)&sa, &sl)) perror_exit("getpeername");
+ if (getnameinfo((void *)&sa, sl, toybuf, sizeof(toybuf), NULL, 0, 0))
+ perror_exit("getnameinfo");
+
write_issue(tty_name);
- argv_login[0] = strdup(TT.login_path);
- argv_login[1] = NULL;
+ argv_login[0] = TT.login_path;
+ argv_login[2] = toybuf;
execvp(argv_login[0], argv_login);
exit(EXIT_FAILURE);
}
@@ -418,7 +407,6 @@ void telnetd_main(void)
if (FLAG(i)) exit(EXIT_SUCCESS);
if (!prev) session_list = session_list->next;
else prev->next = tm->next;
- utmp_entry();
xclose(tm->pty_fd);
xclose(tm->new_fd);
free(tm);