Re: git: 93885bb04182 - main - Better help message if locate database does not exists
Date: Sun, 13 Feb 2022 17:26:33 UTC
On 13 Feb 2022, at 17:05, Wolfram Schneider <wosch@FreeBSD.org> wrote: > The branch main has been updated by wosch: > > URL: https://cgit.FreeBSD.org/src/commit/?id=93885bb04182c104be1ec410a5ccb105f1ec5ff2 > > commit 93885bb04182c104be1ec410a5ccb105f1ec5ff2 > Author: Wolfram Schneider <wosch@FreeBSD.org> > AuthorDate: 2022-02-13 17:00:22 +0000 > Commit: Wolfram Schneider <wosch@FreeBSD.org> > CommitDate: 2022-02-13 17:00:22 +0000 > > Better help message if locate database does not exists > > PR: 211501 > Reported by: Oliver Peter > Reviewed by: Pau Amma > Differential Revision: https://reviews.freebsd.org/D34243 > --- > usr.bin/locate/locate/locate.c | 36 ++++++++++++++++++++++++++---------- > usr.bin/locate/locate/util.c | 36 ++++++++++++++++++++++++++++++++++++ > 2 files changed, 62 insertions(+), 10 deletions(-) > > diff --git a/usr.bin/locate/locate/locate.c b/usr.bin/locate/locate/locate.c > index 0bbd95ac696d..014fa7bcc301 100644 > --- a/usr.bin/locate/locate/locate.c > +++ b/usr.bin/locate/locate/locate.c > @@ -124,6 +124,8 @@ extern int getwf(FILE *); > extern u_char *tolower_word(u_char *); > extern int check_bigram_char(int); > extern char *patprep(char *); > +extern void rebuild_message(char *db); > +extern int check_size(char *db); > > int > main(int argc, char **argv) > @@ -216,7 +218,6 @@ main(int argc, char **argv) > exit(0); > } > > - > /* > * Arguments: > * db database > @@ -235,8 +236,16 @@ search_fopen(char *db, char **s) > *(s+1) = NULL; > } > } > - else if ((fp = fopen(db, "r")) == NULL) > - err(1, "`%s'", db); > + else { > + if (!check_size(db)) > + exit(1); > + > + if ((fp = fopen(db, "r")) == NULL) { > + warn("`%s'", db); > + rebuild_message(db); > + exit(1); > + } > + } > > /* count only chars or lines */ > if (f_statistic) { > @@ -261,6 +270,7 @@ search_fopen(char *db, char **s) > } > > #ifdef MMAP > + Stray blank line; closing #endif is flush with }. > /* > * Arguments: > * db database > @@ -273,14 +283,20 @@ search_mmap(char *db, char **s) > int fd; > caddr_t p; > off_t len; > - if ((fd = open(db, O_RDONLY)) == -1 || > - fstat(fd, &sb) == -1) > - err(1, "`%s'", db); > + > + if (!check_size(db)) > + exit(1); > + > + if (stat(db, &sb) == -1) > + err(1, "stat"); > + > len = sb.st_size; > - if (len < (2*NBG)) > - errx(1, > - "database too small: %s\nRun /usr/libexec/locate.updatedb", > - db); > + > + if ((fd = open(db, O_RDONLY)) == -1) { > + warn("%s", db); > + rebuild_message(db); > + exit(1); > + } > > if ((p = mmap((caddr_t)0, (size_t)len, > PROT_READ, MAP_SHARED, > diff --git a/usr.bin/locate/locate/util.c b/usr.bin/locate/locate/util.c > index 1d15f83b6826..aba90b1deda7 100644 > --- a/usr.bin/locate/locate/util.c > +++ b/usr.bin/locate/locate/util.c > @@ -41,8 +41,10 @@ > #include <err.h> > #include <arpa/inet.h> > #include <stdio.h> > +#include <sys/stat.h> > > #include "locate.h" > +#include "pathnames.h" > > char **colon(char **, char*, char*); > char *patprep(char *); > @@ -268,3 +270,37 @@ getwf(fp) > } > return(word); > } > + > + Stray blank line. > +void > +rebuild_message(char *db) > +{ > + /* only for the default locate database */ > + if (strcmp(_PATH_FCODES, db) == 0) { > + fprintf(stderr, "\nTo create a new database, please run the following command as root:\n\n"); > + fprintf(stderr, " /etc/periodic/weekly/310.locate\n\n"); > + } > +} > + > +int > +check_size(char *db) > +{ > + struct stat sb; > + off_t len; > + > + if (stat(db, &sb) == -1) { > + warnx("the locate database '%s' does not exists.", db); stat(2) can fail for other reasons. But also s/exists/exist/. > + rebuild_message(db); > + return(0); return (0); > + } > + len = sb.st_size; > + > + if (len < (2 * NBG)) { > + warnx("the locate database '%s' is less than %d bytes large.", db, (2 * NBG)); Sounds clumsy; "... is smaller than %d bytes."? > + rebuild_message(db); > + return(0); return (0); > + } > + > + return(1); return (1); > +} > + Stray blank line? Jess