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.
|
||||
*/
|
||||
#ifdef LOGIN_PROCESS /* defined in System V utmp.h */
|
||||
#define SYSV_STYLE /* select System V style getty */
|
||||
#include <sys/utsname.h>
|
||||
#include <time.h>
|
||||
#if ENABLE_FEATURE_WTMP
|
||||
extern void updwtmp(const char *filename, const struct utmp *ut);
|
||||
#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 */
|
||||
|
||||
/*
|
||||
@ -116,7 +120,7 @@ static const struct chardata init_chardata = {
|
||||
static const char opt_string[] ALIGN1 = "I:LH:f:hil:mt:wn";
|
||||
#define F_INITSTRING (1 << 0) /* -I initstring is set */
|
||||
#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_RTSCTS (1 << 4) /* -h enable RTS/CTS flow control */
|
||||
#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_TIMEOUT (1 << 8) /* -t time out */
|
||||
#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
|
||||
|
||||
/* 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 */
|
||||
static void parse_args(char **argv, struct options *op)
|
||||
static void parse_args(char **argv, struct options *op, char **fakehost_p)
|
||||
{
|
||||
char *ts;
|
||||
|
||||
opt_complementary = "-2"; /* at least 2 args */
|
||||
op->flags = getopt32(argv, opt_string,
|
||||
&(op->initstring), &fakehost, &(op->issue),
|
||||
&(op->initstring), fakehost_p, &(op->issue),
|
||||
&(op->login), &ts);
|
||||
argv += optind;
|
||||
if (op->flags & F_INITSTRING) {
|
||||
const char *p = op->initstring;
|
||||
char *q;
|
||||
|
||||
op->initstring = q = xstrdup(op->initstring);
|
||||
op->initstring = q = xstrdup(p);
|
||||
/* copy optarg into op->initstring decoding \ddd
|
||||
octal codes into chars */
|
||||
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);
|
||||
}
|
||||
|
||||
#ifdef SYSV_STYLE
|
||||
#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 */
|
||||
static void update_utmp(const char *line)
|
||||
static void update_utmp(const char *line, char *fakehost)
|
||||
{
|
||||
struct utmp ut;
|
||||
struct utmp *utp;
|
||||
time_t t;
|
||||
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
|
||||
* /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
|
||||
* entry in the utmp file.
|
||||
*/
|
||||
if (access(_PATH_UTMP, R_OK|W_OK) == -1) {
|
||||
close(creat(_PATH_UTMP, 0664));
|
||||
}
|
||||
touch(_PATH_UTMP);
|
||||
|
||||
utmpname(_PATH_UTMP);
|
||||
setutent();
|
||||
while ((utp = getutent())
|
||||
&& !(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)
|
||||
while ((utp = getutent()) != NULL) {
|
||||
if (utp->ut_type == INIT_PROCESS && utp->ut_pid == mypid) {
|
||||
memcpy(&ut, utp, sizeof(ut));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
strcpy(ut.ut_user, "LOGIN");
|
||||
safe_strncpy(ut.ut_line, line, sizeof(ut.ut_line));
|
||||
if (fakehost)
|
||||
safe_strncpy(ut.ut_host, fakehost, sizeof(ut.ut_host));
|
||||
time(&t);
|
||||
ut.ut_time = t;
|
||||
ut.ut_time = time(NULL);
|
||||
ut.ut_type = LOGIN_PROCESS;
|
||||
ut.ut_pid = mypid;
|
||||
|
||||
@ -612,19 +615,17 @@ static void update_utmp(const char *line)
|
||||
endutent();
|
||||
|
||||
#if ENABLE_FEATURE_WTMP
|
||||
if (access(bb_path_wtmp_file, R_OK|W_OK) == -1)
|
||||
close(creat(bb_path_wtmp_file, 0664));
|
||||
touch(bb_path_wtmp_file);
|
||||
updwtmp(bb_path_wtmp_file, &ut);
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif /* CONFIG_FEATURE_UTMP */
|
||||
#endif /* SYSV_STYLE */
|
||||
|
||||
int getty_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
|
||||
int getty_main(int argc, char **argv)
|
||||
{
|
||||
int n;
|
||||
char *fakehost = NULL; /* Fake hostname for ut_host */
|
||||
char *logname; /* login name, given to /bin/login */
|
||||
/* Merging these into "struct local" may _seem_ to reduce
|
||||
* parameter passing, but today's gcc will inline
|
||||
@ -673,7 +674,7 @@ int getty_main(int argc, char **argv)
|
||||
#endif
|
||||
|
||||
/* Parse command-line arguments. */
|
||||
parse_args(argv, &options);
|
||||
parse_args(argv, &options, &fakehost);
|
||||
|
||||
debug("calling open_tty\n");
|
||||
/* 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);
|
||||
|
||||
#ifdef SYSV_STYLE
|
||||
#if ENABLE_FEATURE_UTMP
|
||||
/* Update the utmp file */
|
||||
update_utmp(options.tty);
|
||||
#endif
|
||||
update_utmp(options.tty, fakehost);
|
||||
#endif
|
||||
|
||||
#ifdef __linux__
|
||||
|
Loading…
Reference in New Issue
Block a user