git: 93885bb04182 - main - Better help message if locate database does not exists
Date: Sun, 13 Feb 2022 17:05:33 UTC
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 + /* * 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); } + + +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); + rebuild_message(db); + return(0); + } + len = sb.st_size; + + if (len < (2 * NBG)) { + warnx("the locate database '%s' is less than %d bytes large.", db, (2 * NBG)); + rebuild_message(db); + return(0); + } + + return(1); +} +