getty: a small code shrink
No binary (build failed)
—
(log yok)
| @@ -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; |
| + | while ((utp = getutent()) != NULL) { |
| + | if (utp->ut_type == INIT_PROCESS && utp->ut_pid == mypid) { |
| + | memcpy(&ut, utp, sizeof(ut)); |
| + | break; |
| + | } |
| } | |
| - | /* 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)); |
| - | |
| 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__ | |