getty: a small code shrink

touch                                                  -      40     +40
fakehost                                               4       -      -4
getty_main                                          2546    2493     -53
This commit is contained in:
Denis Vlasenko 2007-12-04 18:46:01 +00:00
parent c689fcfdb0
commit f3fca91e9f

View File

@ -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__