sbase

suckless unix tools
git clone git://git.suckless.org/sbase
Log | Files | Refs | README | LICENSE

commit 96ccf5172d21cb355144e936232d328ab9aa4f31
parent e8a3a3ec374c4321cb00c323749d29f7ad60ff91
Author: Mattias Andrée <maandree@kth.se>
Date:   Wed, 30 Mar 2016 03:04:45 +0200

find: check whether readdir failed, and properly check timestamps

Signed-off-by: Mattias Andrée <maandree@kth.se>

Diffstat:
Mfind.c | 22++++++++++++----------
1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/find.c b/find.c @@ -1,5 +1,6 @@ /* See LICENSE file for copyright and license details. */ #include <dirent.h> +#include <errno.h> #include <fnmatch.h> #include <grp.h> #include <libgen.h> @@ -322,24 +323,21 @@ static int pri_atime(struct arg *arg) { struct narg *n = arg->extra.p; - time_t time = (n->n - start.tv_sec) / 86400; - return n->cmp(time, n->n); + return n->cmp((start.tv_sec - arg->st->st_atime) / 86400, n->n); } static int pri_ctime(struct arg *arg) { struct narg *n = arg->extra.p; - time_t time = (n->n - start.tv_sec) / 86400; - return n->cmp(time, n->n); + return n->cmp((start.tv_sec - arg->st->st_ctime) / 86400, n->n); } static int pri_mtime(struct arg *arg) { struct narg *n = arg->extra.p; - time_t time = (n->n - start.tv_sec) / 86400; - return n->cmp(time, n->n); + return n->cmp((start.tv_sec - arg->st->st_mtime) / 86400, n->n); } static int @@ -397,7 +395,7 @@ pri_exec(struct arg *arg) weprintf("exec %s failed:", *e->argv); _exit(1); } - /* FIXME: propper course of action for all waitpid() on EINTR? */ + /* FIXME: proper course of action for all waitpid() on EINTR? */ waitpid(pid, &status, 0); return !!status; } @@ -969,8 +967,7 @@ find(char *path, struct findhist *hist) return; } - /* FIXME: check errno to see if we are done or encountered an error? */ - while ((de = readdir(dir))) { + while (errno = 0, (de = readdir(dir))) { size_t pathcap = len + strlen(de->d_name); char pathbuf[pathcap], *p; @@ -983,7 +980,12 @@ find(char *path, struct findhist *hist) estrlcat(pathbuf, de->d_name, pathcap); find(pathbuf, &cur); } - closedir(dir); /* check return value? */ + if (errno) { + weprintf("readdir %s:", path); + closedir(dir); + return; + } + closedir(dir); if (gflags.depth) eval(root, &arg);