login: eliminate forward decls and #ifdefs
This commit was genuinely broken at the time (not related to our build system): scripts/config/mkconfigs.c (2005-08-01 - 2006-10-05 arasi) uretilen bbconfigopts.h icine .config satirlarini kacissiz, ham newline'larla gömüyordu - gecerli C degildi, busybox'un kendi bb_mkdep araci bile parse edemiyordu (7d219aab7 ile duzeltildi, mkconfigs shell scripte cevrildi)
No binary (build failed)
—
(log yok)
| @@ -15,13 +15,6 @@ | |
| #include <errno.h> | |
| #endif | |
| - | /* import from utmp.c |
| - | * XXX: FIXME: provide empty bodies if ENABLE_FEATURE_UTMP == 0 |
| - | */ |
| - | static struct utmp utent; |
| - | static void read_or_build_utent(int); |
| - | static void write_utent(const char *); |
| - | |
| enum { | |
| TIMEOUT = 60, | |
| EMPTY_USERNAME_COUNT = 10, | |
| @@ -29,16 +22,176 @@ enum { | |
| TTYNAME_SIZE = 32, | |
| }; | |
| - | static void die_if_nologin_and_non_root(int amroot); |
| + | static char full_tty[TTYNAME_SIZE]; |
| + | static char* short_tty = full_tty; |
| + | |
| + | #if ENABLE_FEATURE_UTMP |
| + | /* vv Taken from tinylogin utmp.c vv */ |
| + | /* |
| + | * read_or_build_utent - see if utmp file is correct for this process |
| + | * |
| + | * System V is very picky about the contents of the utmp file |
| + | * and requires that a slot for the current process exist. |
| + | * The utmp file is scanned for an entry with the same process |
| + | * ID. If no entry exists the process exits with a message. |
| + | * |
| + | * The "picky" flag is for network and other logins that may |
| + | * use special flags. It allows the pid checks to be overridden. |
| + | * This means that getty should never invoke login with any |
| + | * command line flags. |
| + | */ |
| + | static struct utmp utent; |
| + | static void read_or_build_utent(int picky) |
| + | { |
| + | struct utmp *ut; |
| + | pid_t pid = getpid(); |
| + | |
| + | setutent(); |
| + | |
| + | /* First, try to find a valid utmp entry for this process. */ |
| + | while ((ut = getutent())) |
| + | if (ut->ut_pid == pid && ut->ut_line[0] && ut->ut_id[0] && |
| + | (ut->ut_type == LOGIN_PROCESS || ut->ut_type == USER_PROCESS)) |
| + | break; |
| + | |
| + | /* If there is one, just use it, otherwise create a new one. */ |
| + | if (ut) { |
| + | utent = *ut; |
| + | } else { |
| + | if (picky) |
| + | bb_error_msg_and_die("no utmp entry found"); |
| + | |
| + | memset(&utent, 0, sizeof(utent)); |
| + | utent.ut_type = LOGIN_PROCESS; |
| + | utent.ut_pid = pid; |
| + | strncpy(utent.ut_line, short_tty, sizeof(utent.ut_line)); |
| + | /* This one is only 4 chars wide. Try to fit something |
| + | * remotely meaningful by skipping "tty"... */ |
| + | strncpy(utent.ut_id, short_tty + 3, sizeof(utent.ut_id)); |
| + | strncpy(utent.ut_user, "LOGIN", sizeof(utent.ut_user)); |
| + | utent.ut_time = time(NULL); |
| + | } |
| + | if (!picky) /* root login */ |
| + | memset(utent.ut_host, 0, sizeof(utent.ut_host)); |
| + | } |
| + | |
| + | /* |
| + | * write_utent - put a USER_PROCESS entry in the utmp file |
| + | * |
| + | * write_utent changes the type of the current utmp entry to |
| + | * USER_PROCESS. the wtmp file will be updated as well. |
| + | */ |
| + | static void write_utent(const char *username) |
| + | { |
| + | utent.ut_type = USER_PROCESS; |
| + | strncpy(utent.ut_user, username, sizeof(utent.ut_user)); |
| + | utent.ut_time = time(NULL); |
| + | /* other fields already filled in by read_or_build_utent above */ |
| + | setutent(); |
| + | pututline(&utent); |
| + | endutent(); |
| + | #if ENABLE_FEATURE_WTMP |
| + | if (access(bb_path_wtmp_file, R_OK|W_OK) == -1) { |
| + | close(creat(bb_path_wtmp_file, 0664)); |
| + | } |
| + | updwtmp(bb_path_wtmp_file, &utent); |
| + | #endif |
| + | } |
| + | #else /* !CONFIG_FEATURE_UTMP */ |
| + | static inline void read_or_build_utent(int) {} |
| + | static inline void write_utent(const char *) {} |
| + | #endif /* !CONFIG_FEATURE_UTMP */ |
| + | |
| + | static void die_if_nologin_and_non_root(int amroot) |
| + | { |
| + | FILE *fp; |
| + | int c; |
| + | |
| + | if (access(bb_path_nologin_file, F_OK)) |
| + | return; |
| + | |
| + | fp = fopen(bb_path_nologin_file, "r"); |
| + | if (fp) { |
| + | while ((c = getc(fp)) != EOF) |
| + | putchar((c=='\n') ? '\r' : c); |
| + | fflush(stdout); |
| + | fclose(fp); |
| + | } else |
| + | puts("\r\nSystem closed for routine maintenance\r"); |
| + | if (!amroot) |
| + | exit(1); |
| + | puts("\r\n[Disconnect bypassed -- root login allowed.]\r"); |
| + | } |
| #if ENABLE_FEATURE_SECURETTY | |
| - | static int check_securetty(void); |
| + | static int check_securetty(void) |
| + | { |
| + | FILE *fp; |
| + | int i; |
| + | char buf[BUFSIZ]; |
| + | |
| + | fp = fopen(bb_path_securetty_file, "r"); |
| + | if (!fp) { |
| + | /* A missing securetty file is not an error. */ |
| + | return 1; |
| + | } |
| + | while (fgets(buf, sizeof(buf)-1, fp)) { |
| + | for(i = strlen(buf)-1; i>=0; --i) { |
| + | if (!isspace(buf[i])) |
| + | break; |
| + | } |
| + | buf[++i] = '\0'; |
| + | if ((buf[0]=='\0') || (buf[0]=='#')) |
| + | continue; |
| + | if (strcmp(buf, short_tty) == 0) { |
| + | fclose(fp); |
| + | return 1; |
| + | } |
| + | } |
| + | fclose(fp); |
| + | return 0; |
| + | } |
| #else | |
| static inline int check_securetty(void) { return 1; } | |
| #endif | |
| - | static void get_username_or_die(char *buf, int size_buf); |
| - | static void motd(void); |
| + | static void get_username_or_die(char *buf, int size_buf) |
| + | { |
| + | int c, cntdown; |
| + | cntdown = EMPTY_USERNAME_COUNT; |
| + | prompt: |
| + | /* skip whitespace */ |
| + | print_login_prompt(); |
| + | do { |
| + | c = getchar(); |
| + | if (c == EOF) exit(1); |
| + | if (c == '\n') { |
| + | if (!--cntdown) exit(1); |
| + | goto prompt; |
| + | } |
| + | } while (isspace(c)); |
| + | |
| + | *buf++ = c; |
| + | if (!fgets(buf, size_buf-2, stdin)) |
| + | exit(1); |
| + | if (!strchr(buf, '\n')) |
| + | exit(1); |
| + | while (isgraph(*buf)) buf++; |
| + | *buf = '\0'; |
| + | } |
| + | |
| + | static void motd(void) |
| + | { |
| + | FILE *fp; |
| + | int c; |
| + | |
| + | fp = fopen(bb_path_motd_file, "r"); |
| + | if (fp) { |
| + | while ((c = getc(fp)) != EOF) |
| + | putchar(c); |
| + | fclose(fp); |
| + | } |
| + | } |
| static void nonblock(int fd) | |
| { | |
| @@ -56,11 +209,6 @@ static void alarm_handler(int sig ATTRIBUTE_UNUSED) | |
| exit(EXIT_SUCCESS); | |
| } | |
| - | |
| - | static char full_tty[TTYNAME_SIZE]; |
| - | static char* short_tty = full_tty; |
| - | |
| - | |
| int login_main(int argc, char **argv) | |
| { | |
| char fromhost[512]; | |
| @@ -122,11 +270,7 @@ int login_main(int argc, char **argv) | |
| short_tty = full_tty + 5; | |
| } | |
| - | if (ENABLE_FEATURE_UTMP) { |
| - | read_or_build_utent(!amroot); |
| - | if (amroot) |
| - | memset(utent.ut_host, 0, sizeof(utent.ut_host)); |
| - | } |
| + | read_or_build_utent(!amroot); |
| if (opt_host) { | |
| if (ENABLE_FEATURE_UTMP) | |
| @@ -183,8 +327,7 @@ auth_failed: | |
| alarm(0); | |
| die_if_nologin_and_non_root(pw->pw_uid == 0); | |
| - | if (ENABLE_FEATURE_UTMP) |
| - | write_utent(username); |
| + | write_utent(username); |
| #ifdef CONFIG_SELINUX | |
| if (is_selinux_enabled()) { | |
| @@ -255,171 +398,3 @@ auth_failed: | |
| return EXIT_FAILURE; | |
| } | |
| - | |
| - | |
| - | static void get_username_or_die(char *buf, int size_buf) |
| - | { |
| - | int c, cntdown; |
| - | cntdown = EMPTY_USERNAME_COUNT; |
| - | prompt: |
| - | /* skip whitespace */ |
| - | print_login_prompt(); |
| - | do { |
| - | c = getchar(); |
| - | if (c == EOF) exit(1); |
| - | if (c == '\n') { |
| - | if (!--cntdown) exit(1); |
| - | goto prompt; |
| - | } |
| - | } while (isspace(c)); |
| - | |
| - | *buf++ = c; |
| - | if (!fgets(buf, size_buf-2, stdin)) |
| - | exit(1); |
| - | if (!strchr(buf, '\n')) |
| - | exit(1); |
| - | while (isgraph(*buf)) buf++; |
| - | *buf = '\0'; |
| - | } |
| - | |
| - | |
| - | static void die_if_nologin_and_non_root(int amroot) |
| - | { |
| - | FILE *fp; |
| - | int c; |
| - | |
| - | if (access(bb_path_nologin_file, F_OK)) |
| - | return; |
| - | |
| - | fp = fopen(bb_path_nologin_file, "r"); |
| - | if (fp) { |
| - | while ((c = getc(fp)) != EOF) |
| - | putchar((c=='\n') ? '\r' : c); |
| - | fflush(stdout); |
| - | fclose(fp); |
| - | } else |
| - | puts("\r\nSystem closed for routine maintenance\r"); |
| - | if (!amroot) |
| - | exit(1); |
| - | puts("\r\n[Disconnect bypassed -- root login allowed.]\r"); |
| - | } |
| - | |
| - | #if ENABLE_FEATURE_SECURETTY |
| - | |
| - | static int check_securetty(void) |
| - | { |
| - | FILE *fp; |
| - | int i; |
| - | char buf[BUFSIZ]; |
| - | |
| - | fp = fopen(bb_path_securetty_file, "r"); |
| - | if (!fp) { |
| - | /* A missing securetty file is not an error. */ |
| - | return 1; |
| - | } |
| - | while (fgets(buf, sizeof(buf)-1, fp)) { |
| - | for(i = strlen(buf)-1; i>=0; --i) { |
| - | if (!isspace(buf[i])) |
| - | break; |
| - | } |
| - | buf[++i] = '\0'; |
| - | if ((buf[0]=='\0') || (buf[0]=='#')) |
| - | continue; |
| - | if (strcmp(buf, short_tty) == 0) { |
| - | fclose(fp); |
| - | return 1; |
| - | } |
| - | } |
| - | fclose(fp); |
| - | return 0; |
| - | } |
| - | |
| - | #endif |
| - | |
| - | static void motd(void) |
| - | { |
| - | FILE *fp; |
| - | int c; |
| - | |
| - | fp = fopen(bb_path_motd_file, "r"); |
| - | if (fp) { |
| - | while ((c = getc(fp)) != EOF) |
| - | putchar(c); |
| - | fclose(fp); |
| - | } |
| - | } |
| - | |
| - | |
| - | #if ENABLE_FEATURE_UTMP |
| - | /* vv Taken from tinylogin utmp.c vv */ |
| - | |
| - | /* |
| - | * read_or_build_utent - see if utmp file is correct for this process |
| - | * |
| - | * System V is very picky about the contents of the utmp file |
| - | * and requires that a slot for the current process exist. |
| - | * The utmp file is scanned for an entry with the same process |
| - | * ID. If no entry exists the process exits with a message. |
| - | * |
| - | * The "picky" flag is for network and other logins that may |
| - | * use special flags. It allows the pid checks to be overridden. |
| - | * This means that getty should never invoke login with any |
| - | * command line flags. |
| - | */ |
| - | |
| - | static void read_or_build_utent(int picky) |
| - | { |
| - | struct utmp *ut; |
| - | pid_t pid = getpid(); |
| - | |
| - | setutent(); |
| - | |
| - | /* First, try to find a valid utmp entry for this process. */ |
| - | while ((ut = getutent())) |
| - | if (ut->ut_pid == pid && ut->ut_line[0] && ut->ut_id[0] && |
| - | (ut->ut_type == LOGIN_PROCESS || ut->ut_type == USER_PROCESS)) |
| - | break; |
| - | |
| - | /* If there is one, just use it, otherwise create a new one. */ |
| - | if (ut) { |
| - | utent = *ut; |
| - | } else { |
| - | if (picky) |
| - | bb_error_msg_and_die("no utmp entry found"); |
| - | |
| - | memset(&utent, 0, sizeof(utent)); |
| - | utent.ut_type = LOGIN_PROCESS; |
| - | utent.ut_pid = pid; |
| - | strncpy(utent.ut_line, short_tty, sizeof(utent.ut_line)); |
| - | /* This one is only 4 chars wide. Try to fit something |
| - | * remotely meaningful by skipping "tty"... */ |
| - | strncpy(utent.ut_id, short_tty + 3, sizeof(utent.ut_id)); |
| - | strncpy(utent.ut_user, "LOGIN", sizeof(utent.ut_user)); |
| - | utent.ut_time = time(NULL); |
| - | } |
| - | } |
| - | |
| - | /* |
| - | * write_utent - put a USER_PROCESS entry in the utmp file |
| - | * |
| - | * write_utent changes the type of the current utmp entry to |
| - | * USER_PROCESS. the wtmp file will be updated as well. |
| - | */ |
| - | |
| - | static void write_utent(const char *username) |
| - | { |
| - | utent.ut_type = USER_PROCESS; |
| - | strncpy(utent.ut_user, username, sizeof(utent.ut_user)); |
| - | utent.ut_time = time(NULL); |
| - | /* other fields already filled in by read_or_build_utent above */ |
| - | setutent(); |
| - | pututline(&utent); |
| - | endutent(); |
| - | #if ENABLE_FEATURE_WTMP |
| - | if (access(bb_path_wtmp_file, R_OK|W_OK) == -1) { |
| - | close(creat(bb_path_wtmp_file, 0664)); |
| - | } |
| - | updwtmp(bb_path_wtmp_file, &utent); |
| - | #endif |
| - | } |
| - | #endif /* CONFIG_FEATURE_UTMP */ |