libbb: introduce and use xmalloc_ttyname (-32 in bss). ash: small code shrink
No binary (build failed)
—
(log yok)
| @@ -23,7 +23,7 @@ Rob Landley suggested these: | |
| lash is phased out. hush can be configured down to be nearly as small, | |
| but less buggy :) | |
| init | |
| - | General cleanup (should use ENABLE_FEATURE_INIT_SYSLOG and ENABLE_FEATURE_INIT_DEBUG). |
| + | General cleanup (should use ENABLE_FEATURE_INIT_SYSLOG). |
| Do a SUSv3 audit | |
| Look at the full Single Unix Specification version 3 (available online at | |
| "http://www.opengroup.org/onlinepubs/009695399/nfindex.html") and | |
| @@ -30,7 +30,7 @@ int tty_main(int argc, char **argv SKIP_INCLUDE_SUSv2(UNUSED_PARAM)) | |
| retval = 0; | |
| - | s = ttyname(0); |
| + | s = xmalloc_ttyname(0); |
| if (s == NULL) { | |
| /* According to SUSv3, ttyname can fail with EBADF or ENOTTY. | |
| * We know the file descriptor is good, so failure means not a tty. */ | |
| @@ -1144,6 +1144,7 @@ const char *nth_string(const char *strings, int n) FAST_FUNC; | |
| extern void print_login_issue(const char *issue_file, const char *tty) FAST_FUNC; | |
| extern void print_login_prompt(void) FAST_FUNC; | |
| + | char *xmalloc_ttyname(int fd) FAST_FUNC; |
| /* NB: typically you want to pass fd 0, not 1. Think 'applet | grep something' */ | |
| int get_terminal_width_height(int fd, unsigned *width, unsigned *height) FAST_FUNC; | |
| @@ -25,7 +25,7 @@ int mesg_main(int argc, char **argv) | |
| if (--argc == 0 | |
| || (argc == 1 && ((c = **++argv) == 'y' || c == 'n')) | |
| ) { | |
| - | tty = ttyname(STDERR_FILENO); |
| + | tty = xmalloc_ttyname(STDERR_FILENO); |
| if (tty == NULL) { | |
| tty = "ttyname"; | |
| } else if (stat(tty, &sb) == 0) { | |
| @@ -268,6 +268,17 @@ off_t FAST_FUNC fdlength(int fd) | |
| } | |
| #endif | |
| + | char* FAST_FUNC xmalloc_ttyname(int fd) |
| + | { |
| + | char *buf = xzalloc(128); |
| + | int r = ttyname_r(fd, buf, 127); |
| + | if (r) { |
| + | free(buf); |
| + | buf = NULL; |
| + | } |
| + | return buf; |
| + | } |
| + | |
| /* It is perfectly ok to pass in a NULL for either width or for | |
| * height, in which case that value will not be set. */ | |
| int FAST_FUNC get_terminal_width_height(int fd, unsigned *width, unsigned *height) | |
| @@ -275,7 +275,7 @@ int login_main(int argc UNUSED_PARAM, char **argv) | |
| if (!isatty(0) || !isatty(1) || !isatty(2)) | |
| return EXIT_FAILURE; /* Must be a terminal */ | |
| safe_strncpy(full_tty, "UNKNOWN", sizeof(full_tty)); | |
| - | tmp = ttyname(0); |
| + | tmp = xmalloc_ttyname(STDIN_FILENO); |
| if (tmp) { | |
| safe_strncpy(full_tty, tmp, sizeof(full_tty)); | |
| if (strncmp(full_tty, "/dev/", 5) == 0) | |
| @@ -285,12 +285,12 @@ int login_main(int argc UNUSED_PARAM, char **argv) | |
| read_or_build_utent(&utent, run_by_root); | |
| if (opt & LOGIN_OPT_h) { | |
| - | USE_FEATURE_UTMP( |
| + | if (ENABLE_FEATURE_UTMP) |
| safe_strncpy(utent.ut_host, opt_host, sizeof(utent.ut_host)); | |
| - | ) |
| fromhost = xasprintf(" on '%s' from '%s'", short_tty, opt_host); | |
| - | } else |
| + | } else { |
| fromhost = xasprintf(" on '%s'", short_tty); | |
| + | } |
| /* Was breaking "login <username>" from shell command line: */ | |
| /*bb_setpgrp();*/ | |
| @@ -44,7 +44,7 @@ int su_main(int argc UNUSED_PARAM, char **argv) | |
| But getlogin can fail -- usually due to lack of utmp entry. | |
| in this case resort to getpwuid. */ | |
| old_user = xstrdup(USE_FEATURE_UTMP(getlogin() ? : ) (pw = getpwuid(cur_uid)) ? pw->pw_name : ""); | |
| - | tty = ttyname(2) ? : "none"; |
| + | tty = xmalloc_ttyname(2) ? : "none"; |
| openlog(applet_name, 0, LOG_AUTH); | |
| } | |
| @@ -114,7 +114,8 @@ static void display_verbose(void) | |
| /* files contexts */ | |
| puts("\nFile contexts:"); | |
| - | cterm = ttyname(0); |
| + | cterm = xmalloc_ttyname(0); |
| + | //FIXME: if cterm == NULL, we segfault!?? |
| puts(cterm); | |
| if (cterm && lgetfilecon(cterm, &con) >= 0) { | |
| printf(COL_FMT "%s\n", "Controlling term:", con); | |
| @@ -122,7 +123,7 @@ static void display_verbose(void) | |
| freecon(con); | |
| } | |
| - | for (i=0; fc[i] != NULL; i++) { |
| + | for (i = 0; fc[i] != NULL; i++) { |
| struct stat stbuf; | |
| if (lgetfilecon(fc[i], &con) < 0) | |
| @@ -13691,7 +13691,7 @@ int ash_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; | |
| int ash_main(int argc UNUSED_PARAM, char **argv) | |
| { | |
| char *shinit; | |
| - | volatile int state; |
| + | volatile smallint state; |
| struct jmploc jmploc; | |
| struct stackmark smark; | |
| @@ -13714,7 +13714,7 @@ int ash_main(int argc UNUSED_PARAM, char **argv) | |
| state = 0; | |
| if (setjmp(jmploc.loc)) { | |
| int e; | |
| - | int s; |
| + | smallint s; |
| reset(); | |
| @@ -13769,7 +13769,7 @@ int ash_main(int argc UNUSED_PARAM, char **argv) | |
| } | |
| } | |
| #endif | |
| - | if (argv[0] && argv[0][0] == '-') |
| + | if (/* argv[0] && */ argv[0][0] == '-') |
| isloginsh = 1; | |
| if (isloginsh) { | |
| state = 1; | |