summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--makewhatis.83
-rw-r--r--mandocdb.c22
2 files changed, 25 insertions, 0 deletions
diff --git a/makewhatis.8 b/makewhatis.8
index 080a9b79..cf675e89 100644
--- a/makewhatis.8
+++ b/makewhatis.8
@@ -74,6 +74,8 @@ and
.Sm on
in that directory.
Existing databases are replaced.
+If a directory contains no manual pages, no database is created in that
+directory.
If
.Ar dir
is not provided,
@@ -130,6 +132,7 @@ Remove
.Ar
from the database in
.Ar dir .
+If that causes the database to become empty, also delete the database file.
.El
.Pp
If fatal parse errors are encountered while parsing, the offending file
diff --git a/mandocdb.c b/mandocdb.c
index 6990bbed..b74c31bd 100644
--- a/mandocdb.c
+++ b/mandocdb.c
@@ -2122,6 +2122,23 @@ dbwrite(struct dba *dba)
int status;
pid_t child;
+ /*
+ * Do not write empty databases, and delete existing ones
+ * when makewhatis -u causes them to become empty.
+ */
+
+ dba_array_start(dba->pages);
+ if (dba_array_next(dba->pages) == NULL) {
+ if (unlink(MANDOC_DB) == -1)
+ say(MANDOC_DB, "&unlink");
+ return;
+ }
+
+ /*
+ * Build the database in a temporary file,
+ * then atomically move it into place.
+ */
+
if (dba_write(MANDOC_DB "~", dba) != -1) {
if (rename(MANDOC_DB "~", MANDOC_DB) == -1) {
exitcode = (int)MANDOCLEVEL_SYSERR;
@@ -2131,6 +2148,11 @@ dbwrite(struct dba *dba)
return;
}
+ /*
+ * We lack write permission and cannot replace the database
+ * file, but let's at least check whether the data changed.
+ */
+
(void)strlcpy(tfn, "/tmp/mandocdb.XXXXXXXX", sizeof(tfn));
if (mkdtemp(tfn) == NULL) {
exitcode = (int)MANDOCLEVEL_SYSERR;