login: nuke nonblock() - we have it in libbb; -400 bytes bss.
This commit is contained in:
parent
8a503be840
commit
c0415a9833
@ -8,7 +8,7 @@
|
|||||||
#include <sys/resource.h>
|
#include <sys/resource.h>
|
||||||
#include <syslog.h>
|
#include <syslog.h>
|
||||||
|
|
||||||
#ifdef CONFIG_SELINUX
|
#if ENABLE_SELINUX
|
||||||
#include <selinux/selinux.h> /* for is_selinux_enabled() */
|
#include <selinux/selinux.h> /* for is_selinux_enabled() */
|
||||||
#include <selinux/get_context_list.h> /* for get_default_context() */
|
#include <selinux/get_context_list.h> /* for get_default_context() */
|
||||||
#include <selinux/flask.h> /* for security class definitions */
|
#include <selinux/flask.h> /* for security class definitions */
|
||||||
@ -22,8 +22,7 @@ enum {
|
|||||||
TTYNAME_SIZE = 32,
|
TTYNAME_SIZE = 32,
|
||||||
};
|
};
|
||||||
|
|
||||||
static char full_tty[TTYNAME_SIZE];
|
static char* short_tty;
|
||||||
static char* short_tty = full_tty;
|
|
||||||
|
|
||||||
#if ENABLE_FEATURE_UTMP
|
#if ENABLE_FEATURE_UTMP
|
||||||
/* vv Taken from tinylogin utmp.c vv */
|
/* vv Taken from tinylogin utmp.c vv */
|
||||||
@ -41,9 +40,7 @@ static char* short_tty = full_tty;
|
|||||||
* command line flags.
|
* command line flags.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static struct utmp utent;
|
static void read_or_build_utent(struct utmp *utptr, int picky)
|
||||||
|
|
||||||
static void read_or_build_utent(int picky)
|
|
||||||
{
|
{
|
||||||
struct utmp *ut;
|
struct utmp *ut;
|
||||||
pid_t pid = getpid();
|
pid_t pid = getpid();
|
||||||
@ -58,23 +55,23 @@ static void read_or_build_utent(int picky)
|
|||||||
|
|
||||||
/* If there is one, just use it, otherwise create a new one. */
|
/* If there is one, just use it, otherwise create a new one. */
|
||||||
if (ut) {
|
if (ut) {
|
||||||
utent = *ut;
|
*utptr = *ut;
|
||||||
} else {
|
} else {
|
||||||
if (picky)
|
if (picky)
|
||||||
bb_error_msg_and_die("no utmp entry found");
|
bb_error_msg_and_die("no utmp entry found");
|
||||||
|
|
||||||
memset(&utent, 0, sizeof(utent));
|
memset(utptr, 0, sizeof(*utptr));
|
||||||
utent.ut_type = LOGIN_PROCESS;
|
utptr->ut_type = LOGIN_PROCESS;
|
||||||
utent.ut_pid = pid;
|
utptr->ut_pid = pid;
|
||||||
strncpy(utent.ut_line, short_tty, sizeof(utent.ut_line));
|
strncpy(utptr->ut_line, short_tty, sizeof(utptr->ut_line));
|
||||||
/* This one is only 4 chars wide. Try to fit something
|
/* This one is only 4 chars wide. Try to fit something
|
||||||
* remotely meaningful by skipping "tty"... */
|
* remotely meaningful by skipping "tty"... */
|
||||||
strncpy(utent.ut_id, short_tty + 3, sizeof(utent.ut_id));
|
strncpy(utptr->ut_id, short_tty + 3, sizeof(utptr->ut_id));
|
||||||
strncpy(utent.ut_user, "LOGIN", sizeof(utent.ut_user));
|
strncpy(utptr->ut_user, "LOGIN", sizeof(utptr->ut_user));
|
||||||
utent.ut_time = time(NULL);
|
utptr->ut_time = time(NULL);
|
||||||
}
|
}
|
||||||
if (!picky) /* root login */
|
if (!picky) /* root login */
|
||||||
memset(utent.ut_host, 0, sizeof(utent.ut_host));
|
memset(utptr->ut_host, 0, sizeof(utptr->ut_host));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -83,25 +80,25 @@ static void read_or_build_utent(int picky)
|
|||||||
* write_utent changes the type of the current utmp entry to
|
* write_utent changes the type of the current utmp entry to
|
||||||
* USER_PROCESS. the wtmp file will be updated as well.
|
* USER_PROCESS. the wtmp file will be updated as well.
|
||||||
*/
|
*/
|
||||||
static void write_utent(const char *username)
|
static void write_utent(struct utmp *utptr, const char *username)
|
||||||
{
|
{
|
||||||
utent.ut_type = USER_PROCESS;
|
utptr->ut_type = USER_PROCESS;
|
||||||
strncpy(utent.ut_user, username, sizeof(utent.ut_user));
|
strncpy(utptr->ut_user, username, sizeof(utptr->ut_user));
|
||||||
utent.ut_time = time(NULL);
|
utptr->ut_time = time(NULL);
|
||||||
/* other fields already filled in by read_or_build_utent above */
|
/* other fields already filled in by read_or_build_utent above */
|
||||||
setutent();
|
setutent();
|
||||||
pututline(&utent);
|
pututline(utptr);
|
||||||
endutent();
|
endutent();
|
||||||
#if ENABLE_FEATURE_WTMP
|
#if ENABLE_FEATURE_WTMP
|
||||||
if (access(bb_path_wtmp_file, R_OK|W_OK) == -1) {
|
if (access(bb_path_wtmp_file, R_OK|W_OK) == -1) {
|
||||||
close(creat(bb_path_wtmp_file, 0664));
|
close(creat(bb_path_wtmp_file, 0664));
|
||||||
}
|
}
|
||||||
updwtmp(bb_path_wtmp_file, &utent);
|
updwtmp(bb_path_wtmp_file, utptr);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
#else /* !ENABLE_FEATURE_UTMP */
|
#else /* !ENABLE_FEATURE_UTMP */
|
||||||
static inline void read_or_build_utent(int ATTRIBUTE_UNUSED picky) {}
|
#define read_or_build_utent(utptr, picky) ((void)0)
|
||||||
static inline void write_utent(const char ATTRIBUTE_UNUSED *username) {}
|
#define write_utent(utptr, username) ((void)0)
|
||||||
#endif /* !ENABLE_FEATURE_UTMP */
|
#endif /* !ENABLE_FEATURE_UTMP */
|
||||||
|
|
||||||
static void die_if_nologin_and_non_root(int amroot)
|
static void die_if_nologin_and_non_root(int amroot)
|
||||||
@ -195,18 +192,13 @@ static void motd(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void nonblock(int fd)
|
|
||||||
{
|
|
||||||
fcntl(fd, F_SETFL, O_NONBLOCK | fcntl(fd, F_GETFL));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void alarm_handler(int sig ATTRIBUTE_UNUSED)
|
static void alarm_handler(int sig ATTRIBUTE_UNUSED)
|
||||||
{
|
{
|
||||||
/* This is the escape hatch! Poor serial line users and the like
|
/* This is the escape hatch! Poor serial line users and the like
|
||||||
* arrive here when their connection is broken.
|
* arrive here when their connection is broken.
|
||||||
* We don't want to block here */
|
* We don't want to block here */
|
||||||
nonblock(1);
|
ndelay_on(1);
|
||||||
nonblock(2);
|
ndelay_on(2);
|
||||||
bb_info_msg("\r\nLogin timed out after %d seconds\r", TIMEOUT);
|
bb_info_msg("\r\nLogin timed out after %d seconds\r", TIMEOUT);
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
@ -228,8 +220,11 @@ int login_main(int argc, char **argv)
|
|||||||
struct passwd *pw;
|
struct passwd *pw;
|
||||||
char *opt_host = NULL;
|
char *opt_host = NULL;
|
||||||
char *opt_user = NULL;
|
char *opt_user = NULL;
|
||||||
|
char full_tty[TTYNAME_SIZE];
|
||||||
USE_SELINUX(security_context_t user_sid = NULL;)
|
USE_SELINUX(security_context_t user_sid = NULL;)
|
||||||
|
USE_FEATURE_UTMP(struct utmp utent;)
|
||||||
|
|
||||||
|
short_tty = full_tty;
|
||||||
username[0] = '\0';
|
username[0] = '\0';
|
||||||
amroot = (getuid() == 0);
|
amroot = (getuid() == 0);
|
||||||
signal(SIGALRM, alarm_handler);
|
signal(SIGALRM, alarm_handler);
|
||||||
@ -255,7 +250,7 @@ int login_main(int argc, char **argv)
|
|||||||
short_tty = full_tty + 5;
|
short_tty = full_tty + 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
read_or_build_utent(!amroot);
|
read_or_build_utent(&utent, !amroot);
|
||||||
|
|
||||||
if (opt_host) {
|
if (opt_host) {
|
||||||
USE_FEATURE_UTMP(
|
USE_FEATURE_UTMP(
|
||||||
@ -263,8 +258,7 @@ int login_main(int argc, char **argv)
|
|||||||
)
|
)
|
||||||
snprintf(fromhost, sizeof(fromhost)-1, " on '%.100s' from "
|
snprintf(fromhost, sizeof(fromhost)-1, " on '%.100s' from "
|
||||||
"'%.200s'", short_tty, opt_host);
|
"'%.200s'", short_tty, opt_host);
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
snprintf(fromhost, sizeof(fromhost)-1, " on '%.100s'", short_tty);
|
snprintf(fromhost, sizeof(fromhost)-1, " on '%.100s'", short_tty);
|
||||||
|
|
||||||
bb_setpgrp;
|
bb_setpgrp;
|
||||||
@ -313,7 +307,7 @@ auth_failed:
|
|||||||
alarm(0);
|
alarm(0);
|
||||||
die_if_nologin_and_non_root(pw->pw_uid == 0);
|
die_if_nologin_and_non_root(pw->pw_uid == 0);
|
||||||
|
|
||||||
write_utent(username);
|
write_utent(&utent, username);
|
||||||
|
|
||||||
#ifdef CONFIG_SELINUX
|
#ifdef CONFIG_SELINUX
|
||||||
if (is_selinux_enabled()) {
|
if (is_selinux_enabled()) {
|
||||||
|
Loading…
Reference in New Issue
Block a user