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

From: Jessica Clarke <jrtc27_at_freebsd.org>
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