getty: a small code shrink
touch - 40 +40 fakehost 4 - -4 getty_main 2546 2493 -53
This commit is contained in:
parent
c689fcfdb0
commit
f3fca91e9f
@ -28,12 +28,16 @@
|
|||||||
* System V, assume it is SunOS 4.
|
* System V, assume it is SunOS 4.
|
||||||
*/
|
*/
|
||||||
#ifdef LOGIN_PROCESS /* defined in System V utmp.h */
|
#ifdef LOGIN_PROCESS /* defined in System V utmp.h */
|
||||||
#define SYSV_STYLE /* select System V style getty */
|
|
||||||
#include <sys/utsname.h>
|
#include <sys/utsname.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#if ENABLE_FEATURE_WTMP
|
#if ENABLE_FEATURE_WTMP
|
||||||
extern void updwtmp(const char *filename, const struct utmp *ut);
|
extern void updwtmp(const char *filename, const struct utmp *ut);
|
||||||
#endif
|
#endif
|
||||||
|
#else /* if !sysV style, wtmp/utmp code is off */
|
||||||
|
#undef ENABLE_FEATURE_UTMP
|
||||||
|
#undef ENABLE_FEATURE_WTMP
|
||||||
|
#define ENABLE_FEATURE_UTMP 0
|
||||||
|
#define ENABLE_FEATURE_WTMP 0
|
||||||
#endif /* LOGIN_PROCESS */
|
#endif /* LOGIN_PROCESS */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -116,7 +120,7 @@ static const struct chardata init_chardata = {
|
|||||||
static const char opt_string[] ALIGN1 = "I:LH:f:hil:mt:wn";
|
static const char opt_string[] ALIGN1 = "I:LH:f:hil:mt:wn";
|
||||||
#define F_INITSTRING (1 << 0) /* -I initstring is set */
|
#define F_INITSTRING (1 << 0) /* -I initstring is set */
|
||||||
#define F_LOCAL (1 << 1) /* -L force local */
|
#define F_LOCAL (1 << 1) /* -L force local */
|
||||||
#define F_FAKEHOST (1 << 2) /* -H force fakehost */
|
#define F_FAKEHOST (1 << 2) /* -H fake hostname */
|
||||||
#define F_CUSTISSUE (1 << 3) /* -f give alternative issue file */
|
#define F_CUSTISSUE (1 << 3) /* -f give alternative issue file */
|
||||||
#define F_RTSCTS (1 << 4) /* -h enable RTS/CTS flow control */
|
#define F_RTSCTS (1 << 4) /* -h enable RTS/CTS flow control */
|
||||||
#define F_ISSUE (1 << 5) /* -i display /etc/issue */
|
#define F_ISSUE (1 << 5) /* -i display /etc/issue */
|
||||||
@ -124,11 +128,9 @@ static const char opt_string[] ALIGN1 = "I:LH:f:hil:mt:wn";
|
|||||||
#define F_PARSE (1 << 7) /* -m process modem status messages */
|
#define F_PARSE (1 << 7) /* -m process modem status messages */
|
||||||
#define F_TIMEOUT (1 << 8) /* -t time out */
|
#define F_TIMEOUT (1 << 8) /* -t time out */
|
||||||
#define F_WAITCRLF (1 << 9) /* -w wait for CR or LF */
|
#define F_WAITCRLF (1 << 9) /* -w wait for CR or LF */
|
||||||
#define F_NOPROMPT (1 << 10) /* -n don't ask for login name! */
|
#define F_NOPROMPT (1 << 10) /* -n don't ask for login name */
|
||||||
|
|
||||||
|
|
||||||
/* Fake hostname for ut_host specified on command line. */
|
|
||||||
static char *fakehost = NULL;
|
|
||||||
#define line_buf bb_common_bufsiz1
|
#define line_buf bb_common_bufsiz1
|
||||||
|
|
||||||
/* The following is used for understandable diagnostics. */
|
/* The following is used for understandable diagnostics. */
|
||||||
@ -175,20 +177,20 @@ static void parse_speeds(struct options *op, char *arg)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* parse_args - parse command-line arguments */
|
/* parse_args - parse command-line arguments */
|
||||||
static void parse_args(char **argv, struct options *op)
|
static void parse_args(char **argv, struct options *op, char **fakehost_p)
|
||||||
{
|
{
|
||||||
char *ts;
|
char *ts;
|
||||||
|
|
||||||
opt_complementary = "-2"; /* at least 2 args */
|
opt_complementary = "-2"; /* at least 2 args */
|
||||||
op->flags = getopt32(argv, opt_string,
|
op->flags = getopt32(argv, opt_string,
|
||||||
&(op->initstring), &fakehost, &(op->issue),
|
&(op->initstring), fakehost_p, &(op->issue),
|
||||||
&(op->login), &ts);
|
&(op->login), &ts);
|
||||||
argv += optind;
|
argv += optind;
|
||||||
if (op->flags & F_INITSTRING) {
|
if (op->flags & F_INITSTRING) {
|
||||||
const char *p = op->initstring;
|
const char *p = op->initstring;
|
||||||
char *q;
|
char *q;
|
||||||
|
|
||||||
op->initstring = q = xstrdup(op->initstring);
|
op->initstring = q = xstrdup(p);
|
||||||
/* copy optarg into op->initstring decoding \ddd
|
/* copy optarg into op->initstring decoding \ddd
|
||||||
octal codes into chars */
|
octal codes into chars */
|
||||||
while (*p) {
|
while (*p) {
|
||||||
@ -564,16 +566,24 @@ static void termios_final(struct options *op, struct termios *tp, struct chardat
|
|||||||
ioctl_or_perror_and_die(0, TCSETS, tp, "%s: TCSETS", op->tty);
|
ioctl_or_perror_and_die(0, TCSETS, tp, "%s: TCSETS", op->tty);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SYSV_STYLE
|
|
||||||
#if ENABLE_FEATURE_UTMP
|
#if ENABLE_FEATURE_UTMP
|
||||||
|
static void touch(const char *filename)
|
||||||
|
{
|
||||||
|
if (access(filename, R_OK | W_OK) == -1)
|
||||||
|
close(open(filename, O_WRONLY | O_CREAT, 0664));
|
||||||
|
}
|
||||||
|
|
||||||
/* update_utmp - update our utmp entry */
|
/* update_utmp - update our utmp entry */
|
||||||
static void update_utmp(const char *line)
|
static void update_utmp(const char *line, char *fakehost)
|
||||||
{
|
{
|
||||||
struct utmp ut;
|
struct utmp ut;
|
||||||
struct utmp *utp;
|
struct utmp *utp;
|
||||||
time_t t;
|
|
||||||
int mypid = getpid();
|
int mypid = getpid();
|
||||||
|
|
||||||
|
/* In case we won't find an entry below... */
|
||||||
|
memset(&ut, 0, sizeof(ut));
|
||||||
|
safe_strncpy(ut.ut_id, line + 3, sizeof(ut.ut_id));
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The utmp file holds miscellaneous information about things started by
|
* The utmp file holds miscellaneous information about things started by
|
||||||
* /sbin/init and other system-related events. Our purpose is to update
|
* /sbin/init and other system-related events. Our purpose is to update
|
||||||
@ -582,29 +592,22 @@ static void update_utmp(const char *line)
|
|||||||
* utmp file can be opened for update, and if we are able to find our
|
* utmp file can be opened for update, and if we are able to find our
|
||||||
* entry in the utmp file.
|
* entry in the utmp file.
|
||||||
*/
|
*/
|
||||||
if (access(_PATH_UTMP, R_OK|W_OK) == -1) {
|
touch(_PATH_UTMP);
|
||||||
close(creat(_PATH_UTMP, 0664));
|
|
||||||
}
|
|
||||||
utmpname(_PATH_UTMP);
|
utmpname(_PATH_UTMP);
|
||||||
setutent();
|
setutent();
|
||||||
while ((utp = getutent())
|
while ((utp = getutent()) != NULL) {
|
||||||
&& !(utp->ut_type == INIT_PROCESS && utp->ut_pid == mypid)
|
if (utp->ut_type == INIT_PROCESS && utp->ut_pid == mypid) {
|
||||||
) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* some inits don't initialize utmp... */
|
|
||||||
memset(&ut, 0, sizeof(ut));
|
|
||||||
safe_strncpy(ut.ut_id, line + 3, sizeof(ut.ut_id));
|
|
||||||
if (utp)
|
|
||||||
memcpy(&ut, utp, sizeof(ut));
|
memcpy(&ut, utp, sizeof(ut));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
strcpy(ut.ut_user, "LOGIN");
|
strcpy(ut.ut_user, "LOGIN");
|
||||||
safe_strncpy(ut.ut_line, line, sizeof(ut.ut_line));
|
safe_strncpy(ut.ut_line, line, sizeof(ut.ut_line));
|
||||||
if (fakehost)
|
if (fakehost)
|
||||||
safe_strncpy(ut.ut_host, fakehost, sizeof(ut.ut_host));
|
safe_strncpy(ut.ut_host, fakehost, sizeof(ut.ut_host));
|
||||||
time(&t);
|
ut.ut_time = time(NULL);
|
||||||
ut.ut_time = t;
|
|
||||||
ut.ut_type = LOGIN_PROCESS;
|
ut.ut_type = LOGIN_PROCESS;
|
||||||
ut.ut_pid = mypid;
|
ut.ut_pid = mypid;
|
||||||
|
|
||||||
@ -612,19 +615,17 @@ static void update_utmp(const char *line)
|
|||||||
endutent();
|
endutent();
|
||||||
|
|
||||||
#if ENABLE_FEATURE_WTMP
|
#if ENABLE_FEATURE_WTMP
|
||||||
if (access(bb_path_wtmp_file, R_OK|W_OK) == -1)
|
touch(bb_path_wtmp_file);
|
||||||
close(creat(bb_path_wtmp_file, 0664));
|
|
||||||
updwtmp(bb_path_wtmp_file, &ut);
|
updwtmp(bb_path_wtmp_file, &ut);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_FEATURE_UTMP */
|
#endif /* CONFIG_FEATURE_UTMP */
|
||||||
#endif /* SYSV_STYLE */
|
|
||||||
|
|
||||||
int getty_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
int getty_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
||||||
int getty_main(int argc, char **argv)
|
int getty_main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
int n;
|
int n;
|
||||||
|
char *fakehost = NULL; /* Fake hostname for ut_host */
|
||||||
char *logname; /* login name, given to /bin/login */
|
char *logname; /* login name, given to /bin/login */
|
||||||
/* Merging these into "struct local" may _seem_ to reduce
|
/* Merging these into "struct local" may _seem_ to reduce
|
||||||
* parameter passing, but today's gcc will inline
|
* parameter passing, but today's gcc will inline
|
||||||
@ -673,7 +674,7 @@ int getty_main(int argc, char **argv)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Parse command-line arguments. */
|
/* Parse command-line arguments. */
|
||||||
parse_args(argv, &options);
|
parse_args(argv, &options, &fakehost);
|
||||||
|
|
||||||
debug("calling open_tty\n");
|
debug("calling open_tty\n");
|
||||||
/* Open the tty as standard input, if it is not "-" */
|
/* Open the tty as standard input, if it is not "-" */
|
||||||
@ -694,11 +695,9 @@ int getty_main(int argc, char **argv)
|
|||||||
*/
|
*/
|
||||||
ioctl_or_perror_and_die(0, TCGETS, &termios, "%s: TCGETS", options.tty);
|
ioctl_or_perror_and_die(0, TCGETS, &termios, "%s: TCGETS", options.tty);
|
||||||
|
|
||||||
#ifdef SYSV_STYLE
|
|
||||||
#if ENABLE_FEATURE_UTMP
|
#if ENABLE_FEATURE_UTMP
|
||||||
/* Update the utmp file */
|
/* Update the utmp file */
|
||||||
update_utmp(options.tty);
|
update_utmp(options.tty, fakehost);
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
|
Loading…
Reference in New Issue
Block a user