login: re-enable Ctrl-^C before execing shell.
This commit is contained in:
@@ -28,14 +28,6 @@
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <syslog.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include "libbb.h"
|
||||
|
||||
|
||||
@@ -44,8 +36,7 @@ const char *change_identity_e2str(const struct passwd *pw)
|
||||
{
|
||||
if (initgroups(pw->pw_name, pw->pw_gid) == -1)
|
||||
return "cannot set groups";
|
||||
endgrent();
|
||||
|
||||
endgrent(); /* ?? */
|
||||
xsetgid(pw->pw_gid);
|
||||
xsetuid(pw->pw_uid);
|
||||
return NULL;
|
||||
@@ -55,6 +46,6 @@ void change_identity(const struct passwd *pw)
|
||||
{
|
||||
const char *err_msg = change_identity_e2str(pw);
|
||||
|
||||
if(err_msg)
|
||||
if (err_msg)
|
||||
bb_perror_msg_and_die("%s", err_msg);
|
||||
}
|
||||
|
121
libbb/login.c
121
libbb/login.c
@@ -36,83 +36,70 @@ void print_login_issue(const char *issue_file, const char *tty)
|
||||
|
||||
puts("\r"); /* start a new line */
|
||||
|
||||
if ((fd = fopen(issue_file, "r"))) {
|
||||
while ((c = fgetc(fd)) != EOF) {
|
||||
outbuf = buf;
|
||||
buf[0] = c;
|
||||
if(c == '\n') {
|
||||
buf[1] = '\r';
|
||||
buf[2] = 0;
|
||||
} else {
|
||||
buf[1] = 0;
|
||||
}
|
||||
if (c == '\\' || c == '%') {
|
||||
c = fgetc(fd);
|
||||
switch (c) {
|
||||
case 's':
|
||||
outbuf = uts.sysname;
|
||||
break;
|
||||
|
||||
case 'n':
|
||||
outbuf = uts.nodename;
|
||||
break;
|
||||
|
||||
case 'r':
|
||||
outbuf = uts.release;
|
||||
break;
|
||||
|
||||
case 'v':
|
||||
outbuf = uts.version;
|
||||
break;
|
||||
|
||||
case 'm':
|
||||
outbuf = uts.machine;
|
||||
break;
|
||||
|
||||
case 'D':
|
||||
case 'o':
|
||||
c = getdomainname(buf, sizeof(buf) - 1);
|
||||
buf[c >= 0 ? c : 0] = '\0';
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
strftime(buf, sizeof(buf), fmtstr_d, localtime(&t));
|
||||
break;
|
||||
|
||||
case 't':
|
||||
strftime(buf, sizeof(buf), fmtstr_t, localtime(&t));
|
||||
break;
|
||||
|
||||
case 'h':
|
||||
gethostname(buf, sizeof(buf) - 1);
|
||||
buf[sizeof(buf) - 1] = '\0';
|
||||
break;
|
||||
|
||||
case 'l':
|
||||
outbuf = tty;
|
||||
break;
|
||||
|
||||
default:
|
||||
buf[0] = c;
|
||||
}
|
||||
}
|
||||
fputs(outbuf, stdout);
|
||||
fd = fopen(issue_file, "r");
|
||||
if (!fd)
|
||||
return;
|
||||
while ((c = fgetc(fd)) != EOF) {
|
||||
outbuf = buf;
|
||||
buf[0] = c;
|
||||
buf[1] = '\0';
|
||||
if(c == '\n') {
|
||||
buf[1] = '\r';
|
||||
buf[2] = '\0';
|
||||
}
|
||||
|
||||
fclose(fd);
|
||||
|
||||
fflush(stdout);
|
||||
if (c == '\\' || c == '%') {
|
||||
c = fgetc(fd);
|
||||
switch (c) {
|
||||
case 's':
|
||||
outbuf = uts.sysname;
|
||||
break;
|
||||
case 'n':
|
||||
outbuf = uts.nodename;
|
||||
break;
|
||||
case 'r':
|
||||
outbuf = uts.release;
|
||||
break;
|
||||
case 'v':
|
||||
outbuf = uts.version;
|
||||
break;
|
||||
case 'm':
|
||||
outbuf = uts.machine;
|
||||
break;
|
||||
case 'D':
|
||||
case 'o':
|
||||
c = getdomainname(buf, sizeof(buf) - 1);
|
||||
buf[c >= 0 ? c : 0] = '\0';
|
||||
break;
|
||||
case 'd':
|
||||
strftime(buf, sizeof(buf), fmtstr_d, localtime(&t));
|
||||
break;
|
||||
case 't':
|
||||
strftime(buf, sizeof(buf), fmtstr_t, localtime(&t));
|
||||
break;
|
||||
case 'h':
|
||||
gethostname(buf, sizeof(buf) - 1);
|
||||
buf[sizeof(buf) - 1] = '\0';
|
||||
break;
|
||||
case 'l':
|
||||
outbuf = tty;
|
||||
break;
|
||||
default:
|
||||
buf[0] = c;
|
||||
}
|
||||
}
|
||||
fputs(outbuf, stdout);
|
||||
}
|
||||
fclose(fd);
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
void print_login_prompt(void)
|
||||
{
|
||||
char buf[MAXHOSTNAMELEN+1];
|
||||
|
||||
if(gethostname(buf, MAXHOSTNAMELEN) == 0)
|
||||
if (gethostname(buf, MAXHOSTNAMELEN) == 0)
|
||||
fputs(buf, stdout);
|
||||
|
||||
fputs(LOGIN, stdout);
|
||||
fflush(stdout);
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user