=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/file/file.c,v retrieving revision 1.53 retrieving revision 1.54 diff -u -r1.53 -r1.54 --- src/usr.bin/file/file.c 2015/10/17 04:41:37 1.53 +++ src/usr.bin/file/file.c 2015/11/13 08:30:18 1.54 @@ -1,4 +1,4 @@ -/* $OpenBSD: file.c,v 1.53 2015/10/17 04:41:37 deraadt Exp $ */ +/* $OpenBSD: file.c,v 1.54 2015/11/13 08:30:18 nicm Exp $ */ /* * Copyright (c) 2015 Nicholas Marriott @@ -116,7 +116,7 @@ int main(int argc, char **argv) { - int opt, pair[2], fd, idx, mode; + int opt, pair[2], fd, idx, mode, error; char *home; struct passwd *pw; struct imsgbuf ibuf; @@ -218,26 +218,33 @@ msg.error = errno; } else fd = STDIN_FILENO; - } else if (lstat(argv[idx], &msg.sb) == -1) { - fd = -1; - msg.error = errno; } else { - /* - * pledge(2) doesn't let us pass directory file - * descriptors around - but in fact we don't need them, - * so just don't open directories or symlinks (which - * could be to directories). - */ - mode = msg.sb.st_mode; - if (!S_ISDIR(mode) && !S_ISLNK(mode)) { - fd = open(argv[idx], O_RDONLY|O_NONBLOCK); - if (fd == -1 && - (errno == ENFILE || errno == EMFILE)) - err(1, "open"); - } else + if (Lflag) + error = stat(argv[idx], &msg.sb); + else + error = lstat(argv[idx], &msg.sb); + if (error == -1) { fd = -1; - if (S_ISLNK(mode)) - read_link(&msg, argv[idx]); + msg.error = errno; + } else { + /* + * pledge(2) doesn't let us pass directory file + * descriptors around - but in fact we don't + * need them, so just don't open directories or + * symlinks (which could be to directories). + */ + mode = msg.sb.st_mode; + if (!S_ISDIR(mode) && !S_ISLNK(mode)) { + fd = open(argv[idx], + O_RDONLY|O_NONBLOCK); + if (fd == -1 && (errno == ENFILE || + errno == EMFILE)) + err(1, "open"); + } else + fd = -1; + if (S_ISLNK(mode)) + read_link(&msg, argv[idx]); + } } send_message(&ibuf, &msg, sizeof msg, fd); @@ -329,13 +336,8 @@ free(copy); } - if (Lflag) { - if (stat(path, &msg->sb) == -1) - msg->error = errno; - } else { - if (stat(path, &sb) == -1) - msg->link_target = errno; - } + if (!Lflag && stat(path, &sb) == -1) + msg->link_target = errno; } static __dead void