From: Denys Vlasenko Date: Sun, 23 Oct 2011 21:58:59 +0000 (+0200) Subject: getty: fix a minor problem of Ctrl-D not printing '\n' X-Git-Tag: 1_20_0~180 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=e9dc354df86e9a3026de406520f6cd03a3519495;p=oweals%2Fbusybox.git getty: fix a minor problem of Ctrl-D not printing '\n' Also removed defines for control chars which are never changed, and added login/getty README. Signed-off-by: Denys Vlasenko --- diff --git a/loginutils/README b/loginutils/README new file mode 100644 index 000000000..ce8851097 --- /dev/null +++ b/loginutils/README @@ -0,0 +1,70 @@ + Getty + +??? Should getty open tty with or without O_NONBLOCK? +For serial lines, it means "should getty wait for Carrier Detect pin?" +I checked other getties: + +- agetty always uses O_NONBLOCK +- mgetty uses O_NONBLOCK unless run with -b, or as "getty" + +??? If we decided to use O_NONBLOCK (perhaps optionally with -b), +when getty should send -I INITSTR data to tty? After open succeeds? +What if we also want to initialize *modem* with some AT commands? + +??? Should we check/create /var/lock/LCK..ttyPFX lockfiles? + +??? mgetty opens tty but does NOT lock it, then waits for input via +select/poll, and when input is available, it checks lock file. +If it exists, mgetty exits (it assumes someone else uses the line). +If no, it creates the file (lock the tty). Sounds like a good algorithm +to use if we are called with -w... + +Getty should establish a new session and process group, and ensure +that tty is a ctty. + +??? Should getty ensure that other processes which might have opened +fds to this tty be dusconnected? agetty has a -R option which makes +agetty call vhangup() after tty is opened. (Then agetty opens it again, +since it probably vhangup'ed its own fd too). + +Getty should leave the tty in approximately the same state as "stty sane" +before it execs login program. Minor things we do conditionally are: + c_iflag |= ICRNL; // if '\r' was used to end username + +??? mgetty uses per-tty file to ignore connects, /etc/nologin.ttyxx - +is it useful? + +It should be possible to run "getty 0 -" from a shell prompt. +[This currently doesn't work from interactive shell since setsid() +fails in process group leader. The workaround is to run it as a child +of something. sh -c 'getty - 0; true' usually works. Should we fix this?] +It should leave tty in a sane state when it exits (Ctrl-D, -t SEC timeout): +echo should be on, speed, control chars properly set, etc. +(However, it can't restore ctty. The symptom is that " 1) - return NULL; - - /* Do erase, kill and end-of-line processing */ switch (c) { case '\r': case '\n': *bp = '\0'; G.eol = c; goto got_logname; - case BS: - case DEL: + case CTL('H'): + case 0x7f: G.tty_attrs.c_cc[VERASE] = c; if (bp > G.line_buf) { full_write(STDOUT_FILENO, "\010 \010", 3); @@ -497,9 +482,16 @@ static char *get_logname(void) bp--; } break; + case CTL('C'): case CTL('D'): finalize_tty_attrs(); exit(EXIT_SUCCESS); + case '\0': + /* BREAK. If we have speeds to try, + * return NULL (will switch speeds and return here) */ + if (G.numspeed > 1) + return NULL; + /* fall through and ignore it */ default: if ((unsigned char)c < ' ') { /* ignore garbage characters */ @@ -512,7 +504,7 @@ static char *get_logname(void) } } /* end of get char loop */ got_logname: ; - } /* while logname is empty */ + } while (G.line_buf[0] == '\0'); /* while logname is empty */ return G.line_buf; } @@ -682,9 +674,6 @@ int getty_main(int argc UNUSED_PARAM, char **argv) finalize_tty_attrs(); - /* Now the newline character should be properly written */ - full_write(STDOUT_FILENO, "\n", 1); - /* Let the login program take care of password validation */ /* We use PATH because we trust that root doesn't set "bad" PATH, * and getty is not suid-root applet */ diff --git a/loginutils/login.c b/loginutils/login.c index b54beef6e..73db8fa63 100644 --- a/loginutils/login.c +++ b/loginutils/login.c @@ -443,7 +443,6 @@ int login_main(int argc UNUSED_PARAM, char **argv) if (pw->pw_uid != 0) die_if_nologin(); - #if ENABLE_LOGIN_SESSION_AS_CHILD child_pid = vfork(); if (child_pid != 0) {