/* * Quit shl, killing all active layers. */ void quit(int status) { struct layer *l; for (l = l0; l; l = l->l_next) { kill(0 - l->l_pid, SIGHUP); doutmp(UTMP_DEL, l); } tcsetattr(0, TCSADRAIN, &otio); exit(status); }
void update_db(int quietlog, int rootlogin, int fflag) { struct sockaddr_storage ass; char assbuf[1024]; socklen_t alen; const char *hname; int remote; hname = (hostname == NULL) ? "?" : hostname; if (getpeername(STDIN_FILENO, (struct sockaddr *)&ass, &alen) != -1) { (void)sockaddr_snprintf(assbuf, sizeof(assbuf), "%A (%a)", (void *)&ass); if (have_ss) { char ssbuf[1024]; (void)sockaddr_snprintf(ssbuf, sizeof(ssbuf), "%A(%a)", (void *)&ss); if (memcmp(&ass, &ss, alen) != 0) syslog(LOG_NOTICE, "login %s on tty %s address mismatch " "passed %s != actual %s", username, tty, ssbuf, assbuf); } else ss = ass; remote = 1; } else if (have_ss) { (void)sockaddr_snprintf(assbuf, sizeof(assbuf), "%A(%a)", (void *)&ss); remote = 1; } else if (hostname) { (void)snprintf(assbuf, sizeof(assbuf), "? ?"); remote = 1; } else remote = 0; /* If fflag is on, assume caller/authenticator has logged root login. */ if (rootlogin && fflag == 0) { if (remote) syslog(LOG_NOTICE, "ROOT LOGIN (%s) on tty %s from %s /" " %s", username, tty, hname, assbuf); else syslog(LOG_NOTICE, "ROOT LOGIN (%s) on tty %s", username, tty); } else if (nested != NULL) { if (remote) syslog(LOG_NOTICE, "%s to %s on tty %s from %s / " "%s", nested, pwd->pw_name, tty, hname, assbuf); else syslog(LOG_NOTICE, "%s to %s on tty %s", nested, pwd->pw_name, tty); } else { if (remote) syslog(LOG_NOTICE, "%s on tty %s from %s / %s", pwd->pw_name, tty, hname, assbuf); else syslog(LOG_NOTICE, "%s on tty %s", pwd->pw_name, tty); } (void)gettimeofday(&now, NULL); #ifdef SUPPORT_UTMPX doutmpx(); dolastlogx(quietlog); quietlog = 1; #endif #ifdef SUPPORT_UTMP doutmp(); dolastlog(quietlog); #endif }