/* * SPDX-FileCopyrightText: 1989 - 1994, Julianne Frances Haugh * SPDX-FileCopyrightText: 1996 - 1999, Marek Michałkiewicz * SPDX-FileCopyrightText: 2003 - 2005, Tomasz Kłoczko * SPDX-FileCopyrightText: 2007 - 2008, Nicolas François * * SPDX-License-Identifier: BSD-3-Clause */ #include #ifdef RLOGIN #ident "$Id$" #include "prototypes.h" #include "defines.h" #include #include #include static struct { int spd_name; int spd_baud; } speed_table[] = { #ifdef B50 { B50, 50}, #endif #ifdef B75 { B75, 75}, #endif #ifdef B110 { B110, 110}, #endif #ifdef B134 { B134, 134}, #endif #ifdef B150 { B150, 150}, #endif #ifdef B200 { B200, 200}, #endif #ifdef B300 { B300, 300}, #endif #ifdef B600 { B600, 600}, #endif #ifdef B1200 { B1200, 1200}, #endif #ifdef B1800 { B1800, 1800}, #endif #ifdef B2400 { B2400, 2400}, #endif #ifdef B4800 { B4800, 4800}, #endif #ifdef B9600 { B9600, 9600}, #endif #ifdef B19200 { B19200, 19200}, #endif #ifdef B38400 { B38400, 38400}, #endif { -1, -1} }; static void get_remote_string (char *buf, size_t size) { for (;;) { if (read (0, buf, 1) != 1) { exit (EXIT_FAILURE); } if ('\0' == *buf) { return; } --size; if (size > 0) { ++buf; } } /*NOTREACHED*/} int do_rlogin (const char *remote_host, char *name, size_t namelen, char *term, size_t termlen) { struct passwd *pwd; char remote_name[32]; char *cp; unsigned long remote_speed = 9600; int speed_name = B9600; int i; TERMIO termio; get_remote_string (remote_name, sizeof remote_name); get_remote_string (name, namelen); get_remote_string (term, termlen); cp = strchr (term, '/'); if (NULL != cp) { *cp = '\0'; cp++; if (getulong (cp, &remote_speed) == 0) { remote_speed = 9600; } } for (i = 0; ( (speed_table[i].spd_baud != remote_speed) && (speed_table[i].spd_name != -1)); i++); if (-1 != speed_table[i].spd_name) { speed_name = speed_table[i].spd_name; } /* * Put the terminal in cooked mode with echo turned on. */ GTTY (0, &termio); termio.c_iflag |= ICRNL | IXON; termio.c_oflag |= OPOST | ONLCR; termio.c_lflag |= ICANON | ECHO | ECHOE; #ifdef CBAUD termio.c_cflag = (termio.c_cflag & ~CBAUD) | speed_name; #else termio.c_cflag = (termio.c_cflag) | speed_name; #endif STTY (0, &termio); pwd = getpwnam (name); /* local, no need for xgetpwnam */ if (NULL == pwd) { return 0; } /* * ruserok() returns 0 for success on modern systems, and 1 on * older ones. If you are having trouble with people logging * in without giving a required password, THIS is the culprit - * go fix the #define in config.h. */ #ifndef RUSEROK return 0; #else return ruserok (remote_host, pwd->pw_uid == 0, remote_name, name) == RUSEROK; #endif } #endif /* RLOGIN */