A few changes to improve readability. Remove lots of casts. Casting printf is
just noise. Casting signal() is also uncommon in our tree. I kept a casts for
functions like write() where we would normally expect to check the error. (For
that matter, why do we ignore failure to write failedlogin?)
Also returning after open() returns -1 instead of wrapping the entire function
in an if drops us down a level of indentation.
Bonus fact: main() declares 40 variables. Maybe something can be done about
that too.
Index: failedlogin.c
===================================================================
RCS file: /cvs/src/usr.bin/login/failedlogin.c,v
retrieving revision 1.17
diff -u -p -r1.17 failedlogin.c
--- failedlogin.c 16 Jan 2015 06:40:09 -0000 1.17
+++ failedlogin.c 24 Jun 2016 01:18:41 -0000
@@ -55,30 +55,30 @@ log_failedlogin(uid_t uid, char *host, c
int fd;
/* Add O_CREAT if you want to create failedlogin if it doesn't exist */
- if ((fd = open(_PATH_FAILEDLOGIN, O_RDWR, S_IRUSR|S_IWUSR)) >= 0) {
- (void)lseek(fd, (off_t)uid * sizeof(failedlogin), SEEK_SET);
-
- /* Read in last bad login so can get the count */
- if (read(fd, (char *)&failedlogin, sizeof(failedlogin)) !=
- sizeof(failedlogin) || failedlogin.bl_time == 0)
- memset((void *)&failedlogin, 0, sizeof(failedlogin));
-
- (void)lseek(fd, (off_t)uid * sizeof(failedlogin), SEEK_SET);
- /* Increment count of bad logins */
- ++failedlogin.count;
- (void)time(&failedlogin.bl_time);
- strncpy(failedlogin.bl_line, tty, sizeof(failedlogin.bl_line));
- if (host)
- strncpy(failedlogin.bl_host, host,
sizeof(failedlogin.bl_host));
- else
- *failedlogin.bl_host = '\0'; /* NULL host field */
- if (name)
- strncpy(failedlogin.bl_name, name,
sizeof(failedlogin.bl_name));
- else
- *failedlogin.bl_name = '\0'; /* NULL name field */
- (void)write(fd, (char *)&failedlogin, sizeof(failedlogin));
- (void)close(fd);
- }
+ if ((fd = open(_PATH_FAILEDLOGIN, O_RDWR, S_IRUSR|S_IWUSR)) == -1)
+ return;
+ (void)lseek(fd, uid * sizeof(failedlogin), SEEK_SET);
+
+ /* Read in last bad login so can get the count */
+ if (read(fd, &failedlogin, sizeof(failedlogin)) !=
+ sizeof(failedlogin) || failedlogin.bl_time == 0)
+ memset(&failedlogin, 0, sizeof(failedlogin));
+
+ (void)lseek(fd, uid * sizeof(failedlogin), SEEK_SET);
+ /* Increment count of bad logins */
+ ++failedlogin.count;
+ time(&failedlogin.bl_time);
+ strncpy(failedlogin.bl_line, tty, sizeof(failedlogin.bl_line));
+ if (host)
+ strncpy(failedlogin.bl_host, host, sizeof(failedlogin.bl_host));
+ else
+ *failedlogin.bl_host = '\0'; /* NULL host field */
+ if (name)
+ strncpy(failedlogin.bl_name, name, sizeof(failedlogin.bl_name));
+ else
+ *failedlogin.bl_name = '\0'; /* NULL name field */
+ (void)write(fd, &failedlogin, sizeof(failedlogin));
+ close(fd);
}
/*
@@ -93,45 +93,44 @@ check_failedlogin(uid_t uid)
struct badlogin failedlogin;
int fd, was_bad = 0;
- (void)memset((void *)&failedlogin, 0, sizeof(failedlogin));
+ memset(&failedlogin, 0, sizeof(failedlogin));
- if ((fd = open(_PATH_FAILEDLOGIN, O_RDWR, 0)) >= 0) {
- (void)lseek(fd, (off_t)uid * sizeof(failedlogin), SEEK_SET);
- if (read(fd, (char *)&failedlogin, sizeof(failedlogin)) ==
- sizeof(failedlogin) && failedlogin.count > 0 ) {
- /* There was a bad login */
- was_bad = 1;
- if (failedlogin.count > 1)
- (void)printf("There have been %lu unsuccessful "
- "login attempts to your account.\n",
- (u_long)failedlogin.count);
- (void)printf("Last unsuccessful login: %.*s", 24-5,
- (char *)ctime(&failedlogin.bl_time));
- (void)printf(" on %.*s",
- (int)sizeof(failedlogin.bl_line),
- failedlogin.bl_line);
- if (*failedlogin.bl_host != '\0') {
- if (*failedlogin.bl_name != '\0')
- (void)printf(" from %.*s@%.*s",
- (int)sizeof(failedlogin.bl_name),
- failedlogin.bl_name,
- (int)sizeof(failedlogin.bl_host),
- failedlogin.bl_host);
- else
- (void)printf(" from %.*s",
- (int)sizeof(failedlogin.bl_host),
- failedlogin.bl_host);
- }
- (void)putchar('\n');
-
- /* Reset since this is a good login and write record */
- failedlogin.count = 0;
- (void)lseek(fd, (off_t)uid * sizeof(failedlogin),
- SEEK_SET);
- (void)write(fd, (char *)&failedlogin,
- sizeof(failedlogin));
+ if ((fd = open(_PATH_FAILEDLOGIN, O_RDWR, 0)) == -1)
+ return was_bad;
+
+ (void)lseek(fd, uid * sizeof(failedlogin), SEEK_SET);
+ if (read(fd, &failedlogin, sizeof(failedlogin)) ==
+ sizeof(failedlogin) && failedlogin.count > 0 ) {
+ /* There was a bad login */
+ was_bad = 1;
+ if (failedlogin.count > 1)
+ printf("There have been %lu unsuccessful "
+ "login attempts to your account.\n",
+ (u_long)failedlogin.count);
+ printf("Last unsuccessful login: %.*s", 24-5,
+ ctime(&failedlogin.bl_time));
+ printf(" on %.*s",
+ (int)sizeof(failedlogin.bl_line),
+ failedlogin.bl_line);
+ if (*failedlogin.bl_host != '\0') {
+ if (*failedlogin.bl_name != '\0')
+ printf(" from %.*s@%.*s",
+ (int)sizeof(failedlogin.bl_name),
+ failedlogin.bl_name,
+ (int)sizeof(failedlogin.bl_host),
+ failedlogin.bl_host);
+ else
+ printf(" from %.*s",
+ (int)sizeof(failedlogin.bl_host),
+ failedlogin.bl_host);
}
- (void)close(fd);
+ putchar('\n');
+
+ /* Reset since this is a good login and write record */
+ failedlogin.count = 0;
+ (void)lseek(fd, uid * sizeof(failedlogin), SEEK_SET);
+ (void)write(fd, &failedlogin, sizeof(failedlogin));
}
+ close(fd);
return(was_bad);
}
Index: login.c
===================================================================
RCS file: /cvs/src/usr.bin/login/login.c,v
retrieving revision 1.67
diff -u -p -r1.67 login.c
--- login.c 26 Dec 2015 20:51:35 -0000 1.67
+++ login.c 24 Jun 2016 01:27:12 -0000
@@ -109,7 +109,6 @@ void sighup(int);
void sleepexit(int);
char *stypeof(char *);
void timedout(int);
-int main(int, char **);
extern int check_failedlogin(uid_t);
extern void log_failedlogin(uid_t, char *, char *, char *);
@@ -184,7 +183,7 @@ main(int argc, char *argv[])
*/
fflag = pflag = 0;
uid = getuid();
- while ((ch = getopt(argc, argv, "fh:pu:L:R:")) != -1)
+ while ((ch = getopt(argc, argv, "fh:pu:L:R:")) != -1) {
switch (ch) {
case 'f':
fflag = 1;
@@ -253,11 +252,12 @@ main(int argc, char *argv[])
default:
if (!uid)
syslog(LOG_ERR, "invalid flag %c", ch);
- (void)fprintf(stderr,
+ fprintf(stderr,
"usage: login [-fp] [-h hostname] [-L local-addr] "
"[-R remote-addr] [-u username]\n\t[user]\n");
quickexit(1);
}
+ }
argc -= optind;
argv += optind;
@@ -292,7 +292,7 @@ main(int argc, char *argv[])
ttyn = ttyname(STDIN_FILENO);
if (ttyn == NULL || *ttyn == '\0') {
- (void)snprintf(tname, sizeof(tname), "%s??", _PATH_TTY);
+ snprintf(tname, sizeof(tname), "%s??", _PATH_TTY);
ttyn = tname;
}
if ((tty = strrchr(ttyn, '/')))
@@ -313,16 +313,16 @@ main(int argc, char *argv[])
scds.rlim_cur = scds.rlim_max = QUAD_MIN;
}
- (void)signal(SIGALRM, timedout);
+ signal(SIGALRM, timedout);
if (argc > 1) {
needto = 0;
- (void)alarm(timeout);
+ alarm(timeout);
} else
needto = 1;
- (void)signal(SIGQUIT, SIG_IGN);
- (void)signal(SIGINT, SIG_IGN);
- (void)signal(SIGHUP, SIG_IGN);
- (void)setpriority(PRIO_PROCESS, 0, 0);
+ signal(SIGQUIT, SIG_IGN);
+ signal(SIGINT, SIG_IGN);
+ signal(SIGHUP, SIG_IGN);
+ setpriority(PRIO_PROCESS, 0, 0);
/* get the default login class */
if ((lc = login_getclass(0)) == NULL) { /* get the default class */
@@ -340,8 +340,8 @@ main(int argc, char *argv[])
}
shell = strrchr(script, '/') + 1;
auth_setstate(as, AUTH_OKAY);
- auth_call(as, script, shell,
- fflag ? "-f" : username, fflag ? username : 0, (char *)0);
+ auth_call(as, script, shell, fflag ? "-f" : username,
+ fflag ? username : 0, (char *)NULL);
if (!(auth_getstate(as) & AUTH_ALLOW))
quickexit(1);
auth_setenv(as);
@@ -422,7 +422,7 @@ main(int argc, char *argv[])
badlogin(tbuf);
failures = 0;
}
- (void)strlcpy(tbuf, username, sizeof(tbuf));
+ strlcpy(tbuf, username, sizeof(tbuf));
if ((pwd = getpwnam(username)) != NULL &&
auth_setpwd(as, pwd) < 0) {
@@ -526,7 +526,7 @@ failed:
} else {
if (!as || (p = auth_getvalue(as, "errormsg")) == NULL)
p = "Login incorrect";
- (void)printf("%s\n", p);
+ printf("%s\n", p);
}
failures++;
if (pwd)
@@ -545,7 +545,7 @@ failed:
}
/* committed to login -- turn off timeout */
- (void)alarm(0);
+ alarm(0);
endpwent();
@@ -581,8 +581,8 @@ failed:
quickexit(1);
}
if (term[0] == '\0')
- (void)strlcpy(term, stypeof(tty), sizeof(term));
- (void)snprintf(mail, sizeof(mail), "%s/%s", _PATH_MAILDIR,
+ strlcpy(term, stypeof(tty), sizeof(term));
+ snprintf(mail, sizeof(mail), "%s/%s", _PATH_MAILDIR,
pwd->pw_name);
if (setenv("TERM", term, 0) == -1 ||
setenv("LOGNAME", pwd->pw_name, 1) == -1 ||
@@ -620,7 +620,7 @@ failed:
homeless = chdir(pwd->pw_dir);
if (homeless) {
if (login_getcapbool(lc, "requirehome", 0)) {
- (void)printf("No home directory %s!\n", pwd->pw_dir);
+ printf("No home directory %s!\n", pwd->pw_dir);
quickexit(1);
}
if (chdir("/"))
@@ -635,11 +635,11 @@ failed:
setegid(0); /* XXX use a saved gid instead? */
if ((p = auth_getvalue(as, "warnmsg")) != NULL)
- (void)printf("WARNING: %s\n\n", p);
+ printf("WARNING: %s\n\n", p);
expire = auth_check_expire(as);
if (expire < 0) {
- (void)printf("Sorry -- your account has expired.\n");
+ printf("Sorry -- your account has expired.\n");
quickexit(1);
} else if (expire > 0 && !quietlog) {
warning = login_getcaptime(lc, "expire-warn",
@@ -650,13 +650,13 @@ failed:
}
/* Nothing else left to fail -- really log in. */
- (void)signal(SIGHUP, SIG_DFL);
+ signal(SIGHUP, SIG_DFL);
memset(&utmp, 0, sizeof(utmp));
- (void)time(&utmp.ut_time);
- (void)strncpy(utmp.ut_name, username, sizeof(utmp.ut_name));
+ time(&utmp.ut_time);
+ strncpy(utmp.ut_name, username, sizeof(utmp.ut_name));
if (hostname)
- (void)strncpy(utmp.ut_host, hostname, sizeof(utmp.ut_host));
- (void)strncpy(utmp.ut_line, tty, sizeof(utmp.ut_line));
+ strncpy(utmp.ut_host, hostname, sizeof(utmp.ut_host));
+ strncpy(utmp.ut_line, tty, sizeof(utmp.ut_line));
login(&utmp);
if (!quietlog)
@@ -684,26 +684,26 @@ failed:
auth_cat(copyright);
motd();
if (stat(mail, &st) == 0 && st.st_size != 0)
- (void)printf("You have %smail.\n",
+ printf("You have %smail.\n",
(st.st_mtime > st.st_atime) ? "new " : "");
}
- (void)signal(SIGALRM, SIG_DFL);
- (void)signal(SIGQUIT, SIG_DFL);
- (void)signal(SIGHUP, SIG_DFL);
- (void)signal(SIGINT, SIG_DFL);
- (void)signal(SIGTSTP, SIG_IGN);
+ signal(SIGALRM, SIG_DFL);
+ signal(SIGQUIT, SIG_DFL);
+ signal(SIGHUP, SIG_DFL);
+ signal(SIGINT, SIG_DFL);
+ signal(SIGTSTP, SIG_IGN);
tbuf[0] = '-';
- (void)strlcpy(tbuf + 1, (p = strrchr(shell, '/')) ?
- p + 1 : shell, sizeof(tbuf) - 1);
+ strlcpy(tbuf + 1, (p = strrchr(shell, '/')) ? p + 1 : shell,
+ sizeof(tbuf) - 1);
if ((scds.rlim_cur != QUAD_MIN || scds.rlim_max != QUAD_MIN) &&
setrlimit(RLIMIT_CORE, &scds) < 0)
syslog(LOG_ERR, "couldn't reset core dump size: %m");
if (lastchance)
- (void)printf("WARNING: Your password has expired."
+ printf("WARNING: Your password has expired."
" You must change your password, now!\n");
if (setusercontext(lc, pwd, rootlogin ? 0 : pwd->pw_uid,
@@ -713,16 +713,16 @@ failed:
}
if (homeless) {
- (void)printf("No home directory %s!\n", pwd->pw_dir);
- (void)printf("Logging in with home = \"/\".\n");
- (void)setenv("HOME", "/", 1);
+ printf("No home directory %s!\n", pwd->pw_dir);
+ printf("Logging in with home = \"/\".\n");
+ setenv("HOME", "/", 1);
}
if (auth_approval(as, lc, NULL, "login") == 0) {
if (auth_getstate(as) & AUTH_EXPIRED)
- (void)printf("Sorry -- your account has expired.\n");
+ printf("Sorry -- your account has expired.\n");
else
- (void)printf("approval failure\n");
+ printf("approval failure\n");
quickexit(1);
}
@@ -756,7 +756,7 @@ getloginname(void)
int ch;
for (;;) {
- (void)printf("login: ");
+ printf("login: ");
for (p = nbuf; (ch = getchar()) != '\n'; ) {
if (ch == EOF) {
badlogin(username);
@@ -767,7 +767,7 @@ getloginname(void)
}
if (p > nbuf) {
if (nbuf[0] == '-')
- (void)fprintf(stderr,
+ fprintf(stderr,
"login names may not start with '-'.\n");
else {
*p = '\0';
@@ -803,25 +803,23 @@ motd(void)
sa.sa_handler = sigint;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0; /* don't set SA_RESTART */
- (void)sigaction(SIGINT, &sa, &osa);
+ sigaction(SIGINT, &sa, &osa);
/* read and spew motd until EOF, error, or SIGINT */
while ((nchars = read(fd, tbuf, sizeof(tbuf))) > 0 &&
write(STDOUT_FILENO, tbuf, nchars) == nchars)
- ;
+ continue;
- (void)sigaction(SIGINT, &osa, NULL);
- (void)close(fd);
+ sigaction(SIGINT, &osa, NULL);
+ close(fd);
}
-/* ARGSUSED */
void
sigint(int signo)
{
return; /* just interrupt syscall */
}
-/* ARGSUSED */
void
timedout(int signo)
{
@@ -842,31 +840,31 @@ dolastlog(int quiet)
off_t pos;
int fd;
- if ((fd = open(_PATH_LASTLOG, O_RDWR, 0)) >= 0) {
- pos = (off_t)pwd->pw_uid * sizeof(ll);
- if (!quiet) {
- if (pread(fd, &ll, sizeof(ll), pos) == sizeof(ll) &&
- ll.ll_time != 0) {
- (void)printf("Last login: %.*s ",
- 24-5, (char *)ctime(&ll.ll_time));
- (void)printf("on %.*s",
- (int)sizeof(ll.ll_line),
- ll.ll_line);
- if (*ll.ll_host != '\0')
- (void)printf(" from %.*s",
- (int)sizeof(ll.ll_host),
- ll.ll_host);
- (void)putchar('\n');
- }
- }
- memset(&ll, 0, sizeof(ll));
- (void)time(&ll.ll_time);
- (void)strncpy(ll.ll_line, tty, sizeof(ll.ll_line));
- if (hostname)
- (void)strncpy(ll.ll_host, hostname, sizeof(ll.ll_host));
- (void)pwrite(fd, &ll, sizeof(ll), pos);
- (void)close(fd);
- }
+ if ((fd = open(_PATH_LASTLOG, O_RDWR, 0)) == -1)
+ return;
+ pos = pwd->pw_uid * sizeof(ll);
+ if (!quiet) {
+ if (pread(fd, &ll, sizeof(ll), pos) == sizeof(ll) &&
+ ll.ll_time != 0) {
+ printf("Last login: %.*s ",
+ 24-5, (char *)ctime(&ll.ll_time));
+ printf("on %.*s",
+ (int)sizeof(ll.ll_line),
+ ll.ll_line);
+ if (*ll.ll_host != '\0')
+ printf(" from %.*s",
+ (int)sizeof(ll.ll_host),
+ ll.ll_host);
+ putchar('\n');
+ }
+ }
+ memset(&ll, 0, sizeof(ll));
+ time(&ll.ll_time);
+ strncpy(ll.ll_line, tty, sizeof(ll.ll_line));
+ if (hostname)
+ strncpy(ll.ll_host, hostname, sizeof(ll.ll_host));
+ (void)pwrite(fd, &ll, sizeof(ll), pos);
+ close(fd);
}
void
@@ -912,7 +910,7 @@ void
sleepexit(int eval)
{
auth_close(as);
- (void)sleep(5);
+ sleep(5);
exit(eval);
}