git: 93885bb04182 - main - Better help message if locate database does not exists

From: Wolfram Schneider <wosch_at_FreeBSD.org>
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);
+}
+