summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compat/dbmopen.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/compat/dbmopen.c b/compat/dbmopen.c
index b11af98..cb979b5 100644
--- a/compat/dbmopen.c
+++ b/compat/dbmopen.c
@@ -81,12 +81,21 @@ ndbm_open_dir_file0 (const char *file_name, int pagfd, int mode)
{
if (st.st_dev == pagst.st_dev && st.st_ino == pagst.st_ino)
{
- if (unlink (file_name))
+ if (flags == O_RDONLY)
{
- if ((mode & GDBM_OPENMASK) == GDBM_READER)
- /* Ok, try to cope with it. */
- return pagfd;
- else if (errno != ENOENT)
+ /*
+ * Don't touch the link if the database is opened read-only.
+ * Return a meaningful file descriptor for the sake
+ * of those programs that compare it with pagfd trying
+ * to detect old GDBM versions (as Sendmail does).
+ */
+ if ((fd = open ("/dev/null", flags)) == -1)
+ gdbm_set_errno (NULL, GDBM_FILE_OPEN_ERROR, TRUE);
+ return fd;
+ }
+ else if (unlink (file_name))
+ {
+ if (errno != ENOENT)
{
gdbm_set_errno (NULL, GDBM_FILE_OPEN_ERROR, TRUE);
return -1;
@@ -138,6 +147,13 @@ ndbm_open_dir_file0 (const char *file_name, int pagfd, int mode)
return -1;
}
}
+ else if (flags == O_RDONLY)
+ {
+ /* See the comment above. */
+ if ((fd = open ("/dev/null", flags)) == -1)
+ gdbm_set_errno (NULL, GDBM_FILE_OPEN_ERROR, TRUE);
+ return fd;
+ }
/* File does not exist. Create it. */
fd = open (file_name, flags | O_CREAT, pagst.st_mode & 0777);