blob: b1525b9d0796f16d492bb6737140e15a7808e0fd [file] [log] [blame]
diff -urN gdbm-1.15_orig/compat/dbmopen.c gdbm-1.15/compat/dbmopen.c
--- gdbm-1.15_orig/compat/dbmopen.c 2018-02-10 08:05:11.000000000 +0200
+++ gdbm-1.15/compat/dbmopen.c 2018-06-17 20:55:43.784407600 +0300
@@ -58,13 +58,17 @@
/* FIXME: revise return codes */
static int
-ndbm_open_dir_file0 (const char *file_name, int pagfd, int mode)
+ndbm_open_dir_file0 (const char *file_name, struct gdbm_file_info *pag, int mode)
{
int fd = -1;
struct stat st, pagst;
unsigned char dirbuf[DEF_DIR_SIZE];
int flags = (mode & GDBM_OPENMASK) == GDBM_READER ?
O_RDONLY : O_RDWR;
+ int pagfd = pag->desc;
+#ifdef _WIN32
+ HANDLE hFile;
+#endif
if (mode & GDBM_CLOEXEC)
flags |= O_CLOEXEC;
@@ -76,22 +80,49 @@
}
/* Previous versions of GDBM linked pag to dir. Try to detect this: */
+#ifdef _WIN32
+ hFile = CreateFile(file_name, 0, FILE_SHARE_READ | FILE_SHARE_WRITE,
+ NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
+ NULL);
+
+ if (hFile != INVALID_HANDLE_VALUE)
+ {
+ BY_HANDLE_FILE_INFORMATION fileInfo;
+ GetFileInformationByHandle (hFile, &fileInfo);
+ CloseHandle (hFile);
+ st.st_size = (fileInfo.nFileSizeHigh * MAXDWORD) + fileInfo.nFileSizeLow;
+
+ if (fileInfo.nNumberOfLinks >= 2)
+ {
+ BY_HANDLE_FILE_INFORMATION pagInfo;
+ GetFileInformationByHandle ((HANDLE)_get_osfhandle (pagfd), &pagInfo);
+ if ((fileInfo.nFileIndexLow == pagInfo.nFileIndexLow) &&
+ (fileInfo.nFileIndexHigh == pagInfo.nFileIndexHigh))
+ {
+ /* Close pag because unlink dir file fails on Windows */
+ close (pagfd);
+#else
if (stat (file_name, &st) == 0)
{
if (st.st_nlink >= 2)
{
if (st.st_dev == pagst.st_dev && st.st_ino == pagst.st_ino)
{
- if (unlink (file_name))
+#endif
+ int ret = unlink (file_name);
+#ifdef _WIN32
+ pagfd = pag->desc = open(pag->name, flags | O_BINARY);
+#endif
+ if (ret)
{
if ((mode & GDBM_OPENMASK) == GDBM_READER)
/* Ok, try to cope with it. */
return pagfd;
else if (errno != ENOENT)
{
- gdbm_set_errno (NULL, GDBM_FILE_OPEN_ERROR, TRUE);
+ gdbm_set_errno (NULL, GDBM_FILE_OPEN_ERROR, TRUE);
return -1;
- }
+ }
}
}
else
@@ -109,7 +140,7 @@
}
else
{
- fd = open (file_name, flags);
+ fd = open (file_name, flags | O_BINARY);
if (fd == -1)
{
gdbm_set_errno (NULL, GDBM_FILE_OPEN_ERROR, FALSE);
@@ -141,7 +172,7 @@
}
/* File does not exist. Create it. */
- fd = open (file_name, flags | O_CREAT, pagst.st_mode & 0777);
+ fd = open (file_name, flags | O_CREAT | O_BINARY, pagst.st_mode & 0777);
if (fd >= 0)
{
putint (dirbuf, GDBM_DIR_MAGIC);
@@ -161,10 +192,11 @@
}
static int
-ndbm_open_dir_file (const char *base, int pagfd, int mode)
+ndbm_open_dir_file (const char *base, struct gdbm_file_info *pag, int mode)
{
char *file_name = malloc (strlen (base) + sizeof (DIRSUF));
int fd;
+ int pagfd = pag->desc;
if (!file_name)
{
@@ -172,7 +204,7 @@
return -1;
}
fd = ndbm_open_dir_file0 (strcat (strcpy (file_name, base), DIRSUF),
- pagfd, mode);
+ pag, mode);
free (file_name);
return fd;
}
@@ -265,7 +297,7 @@
}
else
{
- dbm->dirfd = ndbm_open_dir_file (file, dbm->file->desc, open_flags);
+ dbm->dirfd = ndbm_open_dir_file (file, dbm->file, open_flags);
if (dbm->dirfd == -1)
{
gdbm_close (dbm->file);
diff -urN gdbm-1.15_orig/compat/Makefile.am gdbm-1.15/compat/Makefile.am
--- gdbm-1.15_orig/compat/Makefile.am 2018-02-10 08:05:11.000000000 +0200
+++ gdbm-1.15/compat/Makefile.am 2018-06-17 20:55:43.786407700 +0300
@@ -52,5 +52,5 @@
libgdbm_compat_la_SOURCES = $(DBM_CF) $(NDBM_CF)
-libgdbm_compat_la_LDFLAGS = -version-info $(VI_CURRENT):$(VI_REVISION):$(VI_AGE)
+libgdbm_compat_la_LDFLAGS = -no-undefined -version-info $(VI_CURRENT):$(VI_REVISION):$(VI_AGE)
diff -urN gdbm-1.15_orig/compat/Makefile.in gdbm-1.15/compat/Makefile.in
--- gdbm-1.15_orig/compat/Makefile.in 2018-06-15 23:14:27.000000000 +0300
+++ gdbm-1.15/compat/Makefile.in 2018-06-17 22:30:53.220968700 +0300
@@ -417,7 +417,7 @@
dbmrdonly.c
libgdbm_compat_la_SOURCES = $(DBM_CF) $(NDBM_CF)
-libgdbm_compat_la_LDFLAGS = -version-info $(VI_CURRENT):$(VI_REVISION):$(VI_AGE)
+libgdbm_compat_la_LDFLAGS = -no-undefined -version-info $(VI_CURRENT):$(VI_REVISION):$(VI_AGE)
all: all-am
.SUFFIXES:
diff -urN gdbm-1.15_orig/configure gdbm-1.15/configure
--- gdbm-1.15_orig/configure 2018-06-15 23:14:27.000000000 +0300
+++ gdbm-1.15/configure 2018-06-17 21:24:30.141149600 +0300
@@ -639,6 +639,8 @@
LTLIBOBJS
LIBOBJS
AUTOM4TE
+WIN32_FALSE
+WIN32_TRUE
COND_GDBMTOOL_DEBUG_FALSE
COND_GDBMTOOL_DEBUG_TRUE
LFLAGS_DEBUG
@@ -15169,6 +15171,27 @@
fi
+if test x$host_os = xmingw32
+then
+ if true; then
+ WIN32_TRUE=
+ WIN32_FALSE='#'
+else
+ WIN32_TRUE='#'
+ WIN32_FALSE=
+fi
+
+else
+ if false; then
+ WIN32_TRUE=
+ WIN32_FALSE='#'
+else
+ WIN32_TRUE='#'
+ WIN32_FALSE=
+fi
+
+fi
+
# Initialize the test suite.
ac_config_commands="$ac_config_commands tests/atconfig"
@@ -15333,6 +15356,14 @@
as_fn_error $? "conditional \"COND_GDBMTOOL_DEBUG\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${WIN32_TRUE}" && test -z "${WIN32_FALSE}"; then
+ as_fn_error $? "conditional \"WIN32\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${WIN32_TRUE}" && test -z "${WIN32_FALSE}"; then
+ as_fn_error $? "conditional \"WIN32\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
: "${CONFIG_STATUS=./config.status}"
ac_write_fail=0
diff -urN gdbm-1.15_orig/configure.ac gdbm-1.15/configure.ac
--- gdbm-1.15_orig/configure.ac 2018-06-15 23:14:19.000000000 +0300
+++ gdbm-1.15/configure.ac 2018-06-17 20:55:43.812409200 +0300
@@ -192,6 +192,13 @@
AM_CONDITIONAL([COND_GDBMTOOL_DEBUG], [test "$want_gdbmtool_debug" = yes])
+if test x$host_os = xmingw32
+then
+ AM_CONDITIONAL(WIN32, true)
+else
+ AM_CONDITIONAL(WIN32, false)
+fi
+
# Initialize the test suite.
AC_CONFIG_TESTDIR(tests)
AC_CONFIG_FILES([tests/Makefile tests/atlocal po/Makefile.in])
diff -urN gdbm-1.15_orig/src/fullio.c gdbm-1.15/src/fullio.c
--- gdbm-1.15_orig/src/fullio.c 2018-05-30 14:04:21.000000000 +0300
+++ gdbm-1.15/src/fullio.c 2018-06-17 21:33:28.588947000 +0300
@@ -81,7 +81,13 @@
int
_gdbm_file_extend (GDBM_FILE dbf, off_t size)
{
+#ifdef _WIN32
+ SYSTEM_INFO si;
+ GetSystemInfo(&si);
+ size_t page_size = si.dwPageSize;
+#else
size_t page_size = sysconf (_SC_PAGESIZE);
+#endif
char *buf;
off_t file_end;
diff -urN gdbm-1.15_orig/src/gdbm_load.c gdbm-1.15/src/gdbm_load.c
--- gdbm-1.15_orig/src/gdbm_load.c 2018-05-30 12:39:15.000000000 +0300
+++ gdbm-1.15/src/gdbm_load.c 2018-06-17 20:55:43.821409700 +0300
@@ -18,16 +18,12 @@
# include "gdbm.h"
# include "gdbmapp.h"
# include "gdbmdefs.h"
-# include <pwd.h>
-# include <grp.h>
int replace = 0;
int meta_mask = 0;
int no_meta_option;
int mode;
-uid_t owner_uid;
-gid_t owner_gid;
char *parseopt_program_doc = "load a GDBM database from a file";
char *parseopt_program_args = "FILE [DB_FILE]";
@@ -45,6 +41,7 @@
static int
set_meta_info (GDBM_FILE dbf)
{
+#if 0
if (meta_mask)
{
int fd = gdbm_fdesc (dbf);
@@ -63,6 +60,7 @@
return 1;
}
}
+#endif
return 0;
}
@@ -139,6 +137,7 @@
}
break;
+#if 0
case 'u':
{
size_t len;
@@ -198,6 +197,7 @@
meta_mask |= GDBM_META_MASK_OWNER;
}
break;
+#endif
case 'r':
replace = 1;
diff -urN gdbm-1.15_orig/src/gdbmdump.c gdbm-1.15/src/gdbmdump.c
--- gdbm-1.15_orig/src/gdbmdump.c 2018-05-30 12:39:15.000000000 +0300
+++ gdbm-1.15/src/gdbmdump.c 2018-06-17 20:55:43.828410100 +0300
@@ -17,8 +17,6 @@
# include "autoconf.h"
# include "gdbmdefs.h"
# include "gdbm.h"
-# include <pwd.h>
-# include <grp.h>
# include <time.h>
static int
@@ -56,8 +54,6 @@
time_t t;
int fd;
struct stat st;
- struct passwd *pw;
- struct group *gr;
datum key;
size_t count = 0;
unsigned char *buffer = NULL;
@@ -76,13 +72,7 @@
fprintf (fp, "#:file=%s\n", dbf->name);
fprintf (fp, "#:uid=%lu,", (unsigned long) st.st_uid);
- pw = getpwuid (st.st_uid);
- if (pw)
- fprintf (fp, "user=%s,", pw->pw_name);
fprintf (fp, "gid=%lu,", (unsigned long) st.st_gid);
- gr = getgrgid (st.st_gid);
- if (gr)
- fprintf (fp, "group=%s,", gr->gr_name);
fprintf (fp, "mode=%03o\n", st.st_mode & 0777);
fprintf (fp, "# End of header\n");
@@ -172,7 +162,7 @@
switch (open_flags)
{
case GDBM_WRCREAT:
- nfd = open (filename, O_WRONLY | O_CREAT | O_EXCL, mode);
+ nfd = open (filename, O_WRONLY | O_BINARY | O_CREAT | O_EXCL, mode);
if (nfd == -1)
{
GDBM_SET_ERRNO (NULL, GDBM_FILE_OPEN_ERROR, FALSE);
@@ -180,7 +170,7 @@
}
break;
case GDBM_NEWDB:
- nfd = open (filename, O_WRONLY | O_CREAT | O_TRUNC, mode);
+ nfd = open (filename, O_WRONLY | O_BINARY | O_CREAT | O_TRUNC, mode);
if (nfd == -1)
{
GDBM_SET_ERRNO (NULL, GDBM_FILE_OPEN_ERROR, FALSE);
diff -urN gdbm-1.15_orig/src/gdbmexp.c gdbm-1.15/src/gdbmexp.c
--- gdbm-1.15_orig/src/gdbmexp.c 2018-05-30 12:39:15.000000000 +0300
+++ gdbm-1.15/src/gdbmexp.c 2018-06-17 20:55:43.832410400 +0300
@@ -19,7 +19,11 @@
/* Include system configuration before all else. */
# include "autoconf.h"
+#ifdef _WIN32
+# include <winsock2.h>
+#else
# include <arpa/inet.h>
+#endif
#ifdef GDBM_EXPORT_18
# define GDBM_SET_ERRNO(dbf, ec, fatal) gdbm_errno = ec
@@ -104,7 +108,7 @@
switch (flags)
{
case GDBM_WRCREAT:
- nfd = open (exportfile, O_WRONLY | O_CREAT | O_EXCL, mode);
+ nfd = open (exportfile, O_WRONLY | O_BINARY | O_CREAT | O_EXCL, mode);
if (nfd == -1)
{
GDBM_SET_ERRNO (NULL, GDBM_FILE_OPEN_ERROR, FALSE);
@@ -112,7 +116,7 @@
}
break;
case GDBM_NEWDB:
- nfd = open (exportfile, O_WRONLY | O_CREAT | O_TRUNC, mode);
+ nfd = open (exportfile, O_WRONLY | O_BINARY | O_CREAT | O_TRUNC, mode);
if (nfd == -1)
{
GDBM_SET_ERRNO (NULL, GDBM_FILE_OPEN_ERROR, FALSE);
@@ -128,7 +132,7 @@
return -1;
}
- fp = fdopen (nfd, "w");
+ fp = fdopen (nfd, "wb");
if (!fp)
{
close (nfd);
diff -urN gdbm-1.15_orig/src/gdbmimp.c gdbm-1.15/src/gdbmimp.c
--- gdbm-1.15_orig/src/gdbmimp.c 2018-05-30 12:39:15.000000000 +0300
+++ gdbm-1.15/src/gdbmimp.c 2018-06-17 20:55:43.834410500 +0300
@@ -18,7 +18,11 @@
along with GDBM. If not, see <http://www.gnu.org/licenses/>. */
# include "autoconf.h"
+#ifdef _WIN32
+# include <winsock2.h>
+#else
# include <arpa/inet.h>
+#endif
# include <limits.h>
# include "gdbmdefs.h"
diff -urN gdbm-1.15_orig/src/gdbmload.c gdbm-1.15/src/gdbmload.c
--- gdbm-1.15_orig/src/gdbmload.c 2018-05-30 12:39:15.000000000 +0300
+++ gdbm-1.15/src/gdbmload.c 2018-06-17 20:55:43.837410600 +0300
@@ -18,8 +18,6 @@
# include "gdbmdefs.h"
# include "gdbm.h"
# include <sys/types.h>
-# include <pwd.h>
-# include <grp.h>
struct datbuf
{
@@ -289,13 +287,12 @@
_set_gdbm_meta_info (GDBM_FILE dbf, char *param, int meta_mask)
{
unsigned long n;
- uid_t owner_uid;
- uid_t owner_gid;
mode_t mode;
int meta_flags = 0;
const char *p;
char *end;
+#if 0
if (!(meta_mask & GDBM_META_MASK_OWNER))
{
p = getparm (param, "user");
@@ -341,6 +338,7 @@
}
}
}
+#endif
if (!(meta_mask & GDBM_META_MASK_MODE))
{
@@ -357,6 +355,7 @@
}
}
+#if 0
if (meta_flags)
{
int fd = gdbm_fdesc (dbf);
@@ -387,6 +386,7 @@
return 1;
}
}
+#endif
return 0;
}
diff -urN gdbm-1.15_orig/src/gdbmopen.c gdbm-1.15/src/gdbmopen.c
--- gdbm-1.15_orig/src/gdbmopen.c 2018-05-30 16:55:36.000000000 +0300
+++ gdbm-1.15/src/gdbmopen.c 2018-06-17 21:11:42.126221600 +0300
@@ -33,7 +33,7 @@
#endif
static void
-compute_directory_size (blksize_t block_size,
+compute_directory_size (ssize_t block_size,
int *ret_dir_size, int *ret_dir_bits)
{
/* Create the initial hash table directory. */
@@ -224,7 +224,7 @@
return ftruncate (dbf->desc, 0);
#else
int fd;
- fd = open (dbf->name, O_RDWR|O_TRUNC, mode);
+ fd = open (dbf->name, O_RDWR|O_TRUNC|O_BINARY, mode);
if (fd == -1)
return -1;
return close (fd);
@@ -355,8 +355,7 @@
if (!(flags & GDBM_CLOERROR))
dbf->desc = -1;
gdbm_close (dbf);
- GDBM_SET_ERRNO2 (NULL, GDBM_BLOCK_SIZE_ERROR, FALSE,
- GDBM_DEBUG_OPEN);
+ GDBM_SET_ERRNO2 (NULL, GDBM_BLOCK_SIZE_ERROR, FALSE,GDBM_DEBUG_OPEN);
return NULL;
}
else
@@ -656,6 +657,8 @@
}
if (flags & GDBM_CLOEXEC)
fbits |= O_CLOEXEC;
+
+ fbits |= O_BINARY;
fd = open (file, fbits, mode);
if (fd < 0)
@@ -689,7 +690,7 @@
for (index = 0; index < size; index++)
{
(dbf->bucket_cache[index]).ca_bucket =
- malloc (dbf->header->bucket_size);
+ calloc (1, dbf->header->bucket_size);
if ((dbf->bucket_cache[index]).ca_bucket == NULL)
{
GDBM_SET_ERRNO (dbf, GDBM_MALLOC_ERROR, TRUE);
diff -urN gdbm-1.15_orig/src/gdbmtool.c gdbm-1.15/src/gdbmtool.c
--- gdbm-1.15_orig/src/gdbmtool.c 2018-06-14 14:53:35.000000000 +0300
+++ gdbm-1.15/src/gdbmtool.c 2018-06-17 20:55:52.053880600 +0300
@@ -22,9 +22,6 @@
#include <errno.h>
#include <ctype.h>
#include <signal.h>
-#include <pwd.h>
-#include <sys/ioctl.h>
-#include <termios.h>
#include <stdarg.h>
#ifdef HAVE_LOCALE_H
# include <locale.h>
@@ -1993,6 +1995,7 @@
{
istr = instream_file_create (GDBMTOOLRC);
}
+#if 0
else
{
char *fname;
@@ -2023,6 +2024,7 @@
exit (EXIT_FATAL);
yyparse ();
}
+#endif
}
#if GDBM_DEBUG_ENABLE
@@ -2167,8 +2167,6 @@
}
}
- signal (SIGPIPE, SIG_IGN);
-
memset (&param, 0, sizeof (param));
argmax = 0;
diff -urN gdbm-1.15_orig/src/lock.c gdbm-1.15/src/lock.c
--- gdbm-1.15_orig/src/lock.c 2018-05-30 12:39:15.000000000 +0300
+++ gdbm-1.15/src/lock.c 2018-06-17 20:55:52.058880900 +0300
@@ -24,7 +24,7 @@
#include <errno.h>
-#if HAVE_FLOCK
+#if HAVE_FLOCK || defined(_WIN32)
# ifndef LOCK_SH
# define LOCK_SH 1
# endif
@@ -42,6 +42,83 @@
# endif
#endif
+#ifdef _WIN32
+#include <errno.h>
+#include <limits.h>
+
+/*
+ * flock support code for windows
+ *
+ * This code is derived from ruby (http://www.ruby-lang.org/).
+ * Original copyright notice is below.
+ */
+/*
+ * Copyright (c) 1993, Intergraph Corporation
+ *
+ * You may distribute under the terms of either the GNU General Public
+ * License or the Artistic License, as specified in the perl README file.
+ *
+ * Various Unix compatibility functions and NT specific functions.
+ *
+ * Some of this code was derived from the MSDOS port(s) and the OS/2 port.
+ *
+ */
+
+#ifndef EWOULDBLOCK
+#define EWOULDBLOCK 10035 /* EBASEERR + 35 (winsock.h) */
+#endif
+
+#define LK_ERR(f,i) ((f) ? (i = 0) : (errno = GetLastError() == ERROR_LOCK_VIOLATION ? EWOULDBLOCK : EACCES))
+#define LK_LEN ULONG_MAX
+
+static int
+flock_winnt(HANDLE fh, int oper)
+{
+ OVERLAPPED o;
+ int i = -1;
+
+ memset(&o, 0, sizeof(o));
+
+ switch(oper) {
+ case LOCK_SH: /* shared lock */
+ LK_ERR(LockFileEx(fh, 0, 0, LK_LEN, LK_LEN, &o), i);
+ break;
+ case LOCK_EX: /* exclusive lock */
+ LK_ERR(LockFileEx(fh, LOCKFILE_EXCLUSIVE_LOCK, 0, LK_LEN, LK_LEN, &o), i);
+ break;
+ case LOCK_SH|LOCK_NB: /* non-blocking shared lock */
+ LK_ERR(LockFileEx(fh, LOCKFILE_FAIL_IMMEDIATELY, 0, LK_LEN, LK_LEN, &o), i);
+ break;
+ case LOCK_EX|LOCK_NB: /* non-blocking exclusive lock */
+ LK_ERR(LockFileEx(fh,
+ LOCKFILE_EXCLUSIVE_LOCK|LOCKFILE_FAIL_IMMEDIATELY,
+ 0, LK_LEN, LK_LEN, &o), i);
+ break;
+ case LOCK_UN: /* unlock lock */
+ LK_ERR(UnlockFileEx(fh, 0, LK_LEN, LK_LEN, &o), i);
+ break;
+ default: /* unknown */
+ errno = EINVAL;
+ break;
+ }
+ return i;
+}
+
+#undef LK_ERR
+
+int
+flock(int fd, int oper)
+{
+ static int (*locker)(HANDLE, int) = NULL;
+
+ if (!locker) {
+ locker = flock_winnt;
+ }
+
+ return locker((HANDLE)_get_osfhandle(fd), oper);
+}
+#endif /* _WIN32 */
+
#if defined(F_SETLK) && defined(F_RDLCK) && defined(F_WRLCK)
# define HAVE_FCNTL_LOCK 1
#else
@@ -66,7 +143,7 @@
switch (dbf->lock_type)
{
case LOCKING_FLOCK:
-#if HAVE_FLOCK
+#if HAVE_FLOCK || defined(_WIN32)
flock (dbf->desc, LOCK_UN);
#endif
break;
@@ -102,7 +179,7 @@
#endif
int lock_val = -1;
-#if HAVE_FLOCK
+#if HAVE_FLOCK || defined(_WIN32)
if (dbf->read_write == GDBM_READER)
lock_val = flock (dbf->desc, LOCK_SH + LOCK_NB);
else
diff -urN gdbm-1.15_orig/src/Makefile.am gdbm-1.15/src/Makefile.am
--- gdbm-1.15_orig/src/Makefile.am 2018-06-15 23:11:53.000000000 +0300
+++ gdbm-1.15/src/Makefile.am 2018-06-17 20:55:52.060881000 +0300
@@ -74,7 +74,7 @@
libgdbm_la_SOURCES += debug.c
endif
-libgdbm_la_LDFLAGS = -version-info $(VI_CURRENT):$(VI_REVISION):$(VI_AGE)
+libgdbm_la_LDFLAGS = -no-undefined -lws2_32 -version-info $(VI_CURRENT):$(VI_REVISION):$(VI_AGE)
noinst_LIBRARIES = libgdbmapp.a
diff -urN gdbm-1.15_orig/src/Makefile.in gdbm-1.15/src/Makefile.in
--- gdbm-1.15_orig/src/Makefile.in 2018-06-15 23:14:27.000000000 +0300
+++ gdbm-1.15/src/Makefile.in 2018-06-17 22:31:16.905323400 +0300
@@ -474,7 +474,7 @@
gdbmsetopt.c gdbmstore.c gdbmsync.c base64.c bucket.c falloc.c \
findkey.c fullio.c hash.c lock.c mmap.c recover.c update.c \
version.c $(am__append_1)
-libgdbm_la_LDFLAGS = -version-info $(VI_CURRENT):$(VI_REVISION):$(VI_AGE)
+libgdbm_la_LDFLAGS = -no-undefined -lws2_32 -version-info $(VI_CURRENT):$(VI_REVISION):$(VI_AGE)
noinst_LIBRARIES = libgdbmapp.a
libgdbmapp_a_SOURCES = \
err.c\
diff -urN gdbm-1.15_orig/src/mem.c gdbm-1.15/src/mem.c
--- gdbm-1.15_orig/src/mem.c 2018-05-30 12:39:15.000000000 +0300
+++ gdbm-1.15/src/mem.c 2018-06-17 20:55:52.066881300 +0300
@@ -14,7 +14,7 @@
You should have received a copy of the GNU General Public License
along with GDBM. If not, see <http://www.gnu.org/licenses/>. */
-# include "autoconf.h"
+# include "../autoconf.h"
# include "gdbm.h"
# include "gdbmapp.h"
# include "gdbmdefs.h"
diff -urN gdbm-1.15_orig/src/parseopt.c gdbm-1.15/src/parseopt.c
--- gdbm-1.15_orig/src/parseopt.c 2018-05-30 12:39:15.000000000 +0300
+++ gdbm-1.15/src/parseopt.c 2018-06-17 20:55:52.069881500 +0300
@@ -14,10 +14,11 @@
You should have received a copy of the GNU General Public License
along with GDBM. If not, see <http://www.gnu.org/licenses/>. */
-# include "autoconf.h"
+# include "../autoconf.h"
# include "gdbm.h"
# include "gdbmapp.h"
# include "gdbmdefs.h"
+#include "autoconf.h"
# include <stdio.h>
# include <stdarg.h>
# include <errno.h>
diff -urN gdbm-1.15_orig/src/progname.c gdbm-1.15/src/progname.c
--- gdbm-1.15_orig/src/progname.c 2018-05-30 12:39:15.000000000 +0300
+++ gdbm-1.15/src/progname.c 2018-06-17 20:55:52.071881600 +0300
@@ -14,7 +14,7 @@
You should have received a copy of the GNU General Public License
along with GDBM. If not, see <http://www.gnu.org/licenses/>. */
-# include "autoconf.h"
+# include "../autoconf.h"
# include "gdbm.h"
# include "gdbmapp.h"
# include <string.h>
diff -urN gdbm-1.15_orig/src/proto.h gdbm-1.15/src/proto.h
--- gdbm-1.15_orig/src/proto.h 2018-05-30 14:14:11.000000000 +0300
+++ gdbm-1.15/src/proto.h 2018-06-17 22:10:50.270163800 +0300
@@ -122,6 +122,8 @@
GDBM_SET_ERRNO (dbf, GDBM_FILE_SYNC_ERROR, TRUE);
return 1;
}
+#elif _WIN32
+ FlushFileBuffers(dbf);
#else
sync ();
sync ();
diff -urN gdbm-1.15_orig/src/recover.c gdbm-1.15/src/recover.c
--- gdbm-1.15_orig/src/recover.c 2018-05-30 12:39:15.000000000 +0300
+++ gdbm-1.15/src/recover.c 2018-06-17 20:55:52.074881800 +0300
@@ -19,6 +19,20 @@
#define TMPSUF ".XXXXXX"
+#if !HAVE_RENAME
+#if defined(_WIN32)
+static int
+_gdbm_rename (char *old_name, char *new_name)
+{
+ if (!MoveFileEx (old_name, new_name, MOVEFILE_REPLACE_EXISTING))
+ return -1;
+
+ return 0;
+}
+#define rename _gdbm_rename
+#endif
+#endif
+
int
gdbm_copy_meta (GDBM_FILE dst, GDBM_FILE src)
{
@@ -29,16 +29,20 @@
GDBM_SET_ERRNO (src, GDBM_FILE_STAT_ERROR, src->need_recovery);
return -1;
}
+#if HAVE_FCHOWN
if (fchown (dst->desc, st.st_uid, st.st_gid))
{
GDBM_SET_ERRNO (dst, GDBM_ERR_FILE_OWNER, dst->need_recovery);
return -1;
}
+#endif
+#if HAVE_FCHMOD
if (fchmod (dst->desc, st.st_mode & 0777))
{
GDBM_SET_ERRNO (dst, GDBM_ERR_FILE_MODE, dst->need_recovery);
return -1;
}
+#endif
return 0;
}
@@ -130,18 +134,34 @@
}
/* Move the new file to old name. */
+#ifdef _WIN32
+ close (new_dbf->desc);
+ if (dbf->file_locking)
+ {
+ _gdbm_unlock_file (dbf);
+ }
+ close (dbf->desc);
+#endif
if (rename (new_dbf->name, dbf->name) != 0)
{
GDBM_SET_ERRNO (NULL, GDBM_REORGANIZE_FAILED, FALSE);
+#ifdef _WIN32
+ dbf->desc = open (dbf->name, O_RDWR|O_BINARY, 0);
+ new_dbf->desc = open (new_dbf->name, O_RDWR|O_BINARY, 0);
+#endif
gdbm_close (new_dbf);
return -1;
}
/* Fix up DBF to have the correct information for the new file. */
+#ifdef _WIN32
+ new_dbf->desc = open (dbf->name, O_RDWR|O_BINARY, 0);
+#else
if (dbf->file_locking)
_gdbm_unlock_file (dbf);
close (dbf->desc);
+#endif
free (dbf->header);
free (dbf->dir);
diff -urN gdbm-1.15_orig/src/systems.h gdbm-1.15/src/systems.h
--- gdbm-1.15_orig/src/systems.h 2018-05-30 12:43:12.000000000 +0300
+++ gdbm-1.15/src/systems.h 2018-06-17 21:16:30.716728100 +0300
@@ -18,6 +18,11 @@
along with GDBM. If not, see <http://www.gnu.org/licenses/>. */
/* Include all system headers first. */
+#ifdef _WIN32
+# undef _WIN32_WINNT
+# define _WIN32_WINNT 0x0601
+# include <windows.h>
+#endif
#include <sys/types.h>
#include <stdio.h>
#if HAVE_SYS_FILE_H
@@ -43,6 +48,10 @@
# define O_CLOEXEC 0
#endif
+#ifndef O_BINARY
+# define O_BINARY 0
+#endif
+
/* Default block size. Some systems do not have blocksize in their
stat record. This code uses the BSD blocksize from stat. */
@@ -62,4 +62,7 @@
# define STDERR_FILENO 2
#endif
-
+/* Windows port of flock */
+#ifdef _WIN32
+extern int flock(int fd, int oper);
+#endif
diff -urN gdbm-1.15_orig/src/util.c gdbm-1.15/src/util.c
--- gdbm-1.15_orig/src/util.c 2018-05-30 12:39:15.000000000 +0300
+++ gdbm-1.15/src/util.c 2018-06-17 20:55:52.082882300 +0300
@@ -16,7 +16,6 @@
along with GDBM. If not, see <http://www.gnu.org/licenses/>. */
#include "gdbmtool.h"
-#include <pwd.h>
char *
mkfilename (const char *dir, const char *file, const char *suf)
@@ -45,6 +44,7 @@
char *
tildexpand (char *s)
{
+#if 0
if (s[0] == '~')
{
char *p = s + 1;
@@ -65,6 +65,7 @@
if (pw)
return mkfilename (pw->pw_dir, p + len + 1, NULL);
}
+#endif
return estrdup (s);
}
diff -urN gdbm-1.15_orig/tests/blocksize02.at gdbm-1.15/tests/blocksize02.at
--- gdbm-1.15_orig/tests/blocksize02.at 2018-02-10 08:05:11.000000000 +0200
+++ gdbm-1.15/tests/blocksize02.at 2018-06-18 10:58:25.793417500 +0300
@@ -22,7 +22,6 @@
],
[1],
[],
-[gdbm_open failed: Block size error
-])
+[gdbm_open failed: Block size error])
AT_CLEANUP
diff -urN gdbm-1.15_orig/tests/dbmdel01.at gdbm-1.15/tests/dbmdel01.at
--- gdbm-1.15_orig/tests/dbmdel01.at 2018-02-10 08:05:11.000000000 +0200
+++ gdbm-1.15/tests/dbmdel01.at 2018-06-17 20:55:52.085882400 +0300
@@ -25,7 +25,7 @@
],
[2],
[],
-[dtdel: cannot delete 11: Item not found
+[dtdel.exe: cannot delete 11: Item not found
])
AT_CLEANUP
diff -urN gdbm-1.15_orig/tests/dbmfetch01.at gdbm-1.15/tests/dbmfetch01.at
--- gdbm-1.15_orig/tests/dbmfetch01.at 2018-02-10 08:05:11.000000000 +0200
+++ gdbm-1.15/tests/dbmfetch01.at 2018-06-17 20:55:52.086882500 +0300
@@ -24,7 +24,7 @@
],
[2],
[],
-[dtfetch: 0: not found
+[dtfetch.exe: 0: not found
])
AT_CLEANUP
diff -urN gdbm-1.15_orig/tests/delete01.at gdbm-1.15/tests/delete01.at
--- gdbm-1.15_orig/tests/delete01.at 2018-02-10 08:05:11.000000000 +0200
+++ gdbm-1.15/tests/delete01.at 2018-06-17 20:55:52.088882600 +0300
@@ -24,7 +24,7 @@
],
[2],
[],
-[gtdel: cannot delete 11: Item not found
+[gtdel.exe: cannot delete 11: Item not found
])
AT_CLEANUP
diff -urN gdbm-1.15_orig/tests/dtdel.c gdbm-1.15/tests/dtdel.c
--- gdbm-1.15_orig/tests/dtdel.c 2018-02-10 08:05:11.000000000 +0200
+++ gdbm-1.15/tests/dtdel.c 2018-06-17 20:55:52.089882700 +0300
@@ -16,6 +16,7 @@
*/
#include "autoconf.h"
#include <stdio.h>
+#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include "dbm.h"
@@ -30,7 +31,12 @@
int flags = 0;
int data_z = 0;
int rc = 0;
-
+
+#ifdef _WIN32
+ _setmode(_fileno(stdout), O_BINARY);
+ _setmode(_fileno(stderr), O_BINARY);
+#endif
+
while (--argc)
{
char *arg = *++argv;
diff -urN gdbm-1.15_orig/tests/dtdump.c gdbm-1.15/tests/dtdump.c
--- gdbm-1.15_orig/tests/dtdump.c 2018-02-10 08:05:11.000000000 +0200
+++ gdbm-1.15/tests/dtdump.c 2018-06-17 20:55:52.091882800 +0300
@@ -16,10 +16,13 @@
*/
#include "autoconf.h"
#include <stdio.h>
+#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include "dbm.h"
#include "progname.h"
+#include "../src/gdbm.h"
+#include "../compat/dbm.h"
int
main (int argc, char **argv)
@@ -29,7 +32,12 @@
datum key;
datum data;
int delim = '\t';
-
+
+#ifdef _WIN32
+ _setmode(_fileno(stdout), O_BINARY);
+ _setmode(_fileno(stderr), O_BINARY);
+#endif
+
while (--argc)
{
char *arg = *++argv;
diff -urN gdbm-1.15_orig/tests/dtfetch.c gdbm-1.15/tests/dtfetch.c
--- gdbm-1.15_orig/tests/dtfetch.c 2018-02-10 08:05:11.000000000 +0200
+++ gdbm-1.15/tests/dtfetch.c 2018-06-17 20:55:52.092882800 +0300
@@ -16,6 +16,7 @@
*/
#include "autoconf.h"
#include <stdio.h>
+#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include "dbm.h"
@@ -44,7 +45,12 @@
int data_z = 0;
int delim = 0;
int rc = 0;
-
+
+#ifdef _WIN32
+ _setmode(_fileno(stdout), O_BINARY);
+ _setmode(_fileno(stderr), O_BINARY);
+#endif
+
while (--argc)
{
char *arg = *++argv;
diff -urN gdbm-1.15_orig/tests/dtload.c gdbm-1.15/tests/dtload.c
--- gdbm-1.15_orig/tests/dtload.c 2018-02-10 08:05:11.000000000 +0200
+++ gdbm-1.15/tests/dtload.c 2018-06-17 20:55:52.094882900 +0300
@@ -16,6 +16,7 @@
*/
#include "autoconf.h"
#include <stdio.h>
+#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
@@ -39,7 +40,13 @@
datum data;
int delim = '\t';
int data_z = 0;
-
+
+#ifdef _WIN32
+ _setmode(_fileno(stdin), O_BINARY);
+ _setmode(_fileno(stdout), O_BINARY);
+ _setmode(_fileno(stderr), O_BINARY);
+#endif
+
while (--argc)
{
char *arg = *++argv;
diff -urN gdbm-1.15_orig/tests/fetch01.at gdbm-1.15/tests/fetch01.at
--- gdbm-1.15_orig/tests/fetch01.at 2018-02-10 08:05:11.000000000 +0200
+++ gdbm-1.15/tests/fetch01.at 2018-06-17 20:55:52.095883000 +0300
@@ -23,7 +23,7 @@
],
[2],
[],
-[gtfetch: 0: not found
+[gtfetch.exe: 0: not found
])
AT_CLEANUP
diff -urN gdbm-1.15_orig/tests/gdbmtool03.at gdbm-1.15/tests/gdbmtool03.at
--- gdbm-1.15_orig/tests/gdbmtool03.at 2018-05-24 07:15:19.000000000 +0300
+++ gdbm-1.15/tests/gdbmtool03.at 2018-06-18 10:57:39.968796500 +0300
@@ -17,12 +17,13 @@
AT_SETUP([Initialization file])
AT_KEYWORDS([gdbmtool])
AT_CHECK([
-AT_DATA([.gdbmtoolrc],
-[open t.db
-])
-gdbmtool <<EOT
+AT_DATA([.gdbmtoolrc],[
+open t.db
status
+quit
EOT
+])
+gdbmtool < .gdbmtoolrc
],
[0],
[Database file: t.db
diff -urN gdbm-1.15_orig/tests/gtdel.c gdbm-1.15/tests/gtdel.c
--- gdbm-1.15_orig/tests/gtdel.c 2018-02-10 08:05:11.000000000 +0200
+++ gdbm-1.15/tests/gtdel.c 2018-06-17 20:55:52.097883100 +0300
@@ -16,6 +16,7 @@
*/
#include "autoconf.h"
#include <stdio.h>
+#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include "gdbm.h"
@@ -31,7 +32,12 @@
GDBM_FILE dbf;
int data_z = 0;
int rc = 0;
-
+
+#ifdef _WIN32
+ _setmode(_fileno(stdout), O_BINARY);
+ _setmode(_fileno(stderr), O_BINARY);
+#endif
+
while (--argc)
{
char *arg = *++argv;
diff -urN gdbm-1.15_orig/tests/gtdump.c gdbm-1.15/tests/gtdump.c
--- gdbm-1.15_orig/tests/gtdump.c 2018-02-10 08:05:11.000000000 +0200
+++ gdbm-1.15/tests/gtdump.c 2018-06-17 20:55:52.098883200 +0300
@@ -17,6 +17,7 @@
#include "autoconf.h"
#include <stdio.h>
#include <stdlib.h>
+#include <fcntl.h>
#include <string.h>
#include "gdbm.h"
#include "progname.h"
@@ -31,7 +32,12 @@
int flags = 0;
GDBM_FILE dbf;
int delim = '\t';
-
+
+#ifdef _WIN32
+ _setmode(_fileno(stdin), O_BINARY);
+ _setmode(_fileno(stdout), O_BINARY);
+#endif
+
while (--argc)
{
char *arg = *++argv;
diff -urN gdbm-1.15_orig/tests/gtfetch.c gdbm-1.15/tests/gtfetch.c
--- gdbm-1.15_orig/tests/gtfetch.c 2018-02-10 08:05:11.000000000 +0200
+++ gdbm-1.15/tests/gtfetch.c 2018-06-17 20:55:52.100883300 +0300
@@ -16,6 +16,7 @@
*/
#include "autoconf.h"
#include <stdio.h>
+#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include "gdbm.h"
@@ -46,7 +47,12 @@
int data_z = 0;
int delim = 0;
int rc = 0;
-
+
+#ifdef _WIN32
+ _setmode(_fileno(stdout), O_BINARY);
+ _setmode(_fileno(stderr), O_BINARY);
+#endif
+
while (--argc)
{
char *arg = *++argv;
diff -urN gdbm-1.15_orig/tests/gtload.c gdbm-1.15/tests/gtload.c
--- gdbm-1.15_orig/tests/gtload.c 2018-05-30 12:16:40.000000000 +0300
+++ gdbm-1.15/tests/gtload.c 2018-06-17 20:55:52.101883300 +0300
@@ -16,6 +16,7 @@
*/
#include "autoconf.h"
#include <stdio.h>
+#include <fcntl.h>
#include <stdlib.h>
#include <stdarg.h>
#include <string.h>
@@ -102,6 +103,11 @@
#ifdef GDBM_DEBUG_ENABLE
gdbm_debug_printer = debug_printer;
#endif
+
+#ifdef _WIN32
+ _setmode(_fileno(stdin), O_BINARY);
+ _setmode(_fileno(stdout), O_BINARY);
+#endif
while (--argc)
{
@@ -199,7 +205,7 @@
dbf = gdbm_open (dbname, block_size, mode|flags, 00664, NULL);
if (!dbf)
{
- fprintf (stderr, "gdbm_open failed: %s\n", gdbm_strerror (gdbm_errno));
+ fprintf (stderr, "gdbm_open failed: %s", gdbm_strerror (gdbm_errno));
exit (1);
}
diff -urN gdbm-1.15_orig/tests/gtopt.c gdbm-1.15/tests/gtopt.c
--- gdbm-1.15_orig/tests/gtopt.c 2018-02-10 08:05:11.000000000 +0200
+++ gdbm-1.15/tests/gtopt.c 2018-06-17 20:55:52.104883500 +0300
@@ -178,7 +178,11 @@
int
test_maxmapsize (void *valptr)
{
+#ifdef _SC_PAGESIZE
size_t page_size = sysconf (_SC_PAGESIZE);
+#else
+ size_t page_size = 4096;
+#endif
size_t expected_size = ((mapped_size_max + page_size - 1) / page_size) *
page_size;
return (*(size_t*) valptr == expected_size) ? RES_PASS : RES_FAIL;
@@ -308,7 +312,11 @@
{
GDBM_FILE dbf;
struct optest *op;
-
+
+#ifdef _WIN32
+ _setmode(_fileno(stdout), O_BINARY);
+#endif
+
progname = canonical_progname (argv[0]);
while (--argc)
{
diff -urN gdbm-1.15_orig/tests/gtver.c gdbm-1.15/tests/gtver.c
--- gdbm-1.15_orig/tests/gtver.c 2018-02-10 08:05:11.000000000 +0200
+++ gdbm-1.15/tests/gtver.c 2018-06-17 20:55:52.105883600 +0300
@@ -17,6 +17,7 @@
#include "autoconf.h"
#include <stdlib.h>
#include <stdio.h>
+#include <fcntl.h>
#include <string.h>
#include "gdbm.h"
#include "progname.h"
@@ -31,6 +32,10 @@
const char *progname = canonical_progname (argv[0]);
int library = 0;
+#ifdef _WIN32
+ _setmode(_fileno(stdout), O_BINARY);
+#endif
+
if (argc == 1)
{
printf ("%s\n", gdbm_version);
diff -urN gdbm-1.15_orig/tests/num2word.c gdbm-1.15/tests/num2word.c
--- gdbm-1.15_orig/tests/num2word.c 2018-05-29 10:11:50.000000000 +0300
+++ gdbm-1.15/tests/num2word.c 2018-06-17 22:06:14.980418200 +0300
@@ -17,6 +17,7 @@
#include "autoconf.h"
#include <stdlib.h>
#include <stdio.h>
+#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
@@ -328,6 +329,10 @@
int
main (int argc, char **argv)
{
+#ifdef _WIN32
+ _setmode(_fileno(stdout), O_BINARY);
+#endif
+
progname = *argv++;
--argc;
@@ -403,10 +408,10 @@
if (random_option)
{
- srandom (time (NULL));
+ srand (time (NULL));
while (range_total)
{
- numeral_t n = range_get (random () % range_total);
+ numeral_t n = range_get (rand () % range_total);
print_number (n);
}
}
diff -urN gdbm-1.15_orig/tests/testsuite gdbm-1.15/tests/testsuite
--- gdbm-1.15_orig/tests/testsuite 2018-06-15 23:14:42.000000000 +0300
+++ gdbm-1.15/tests/testsuite 2018-06-17 22:36:55.525691300 +0300
@@ -2166,7 +2166,7 @@
) >>"$at_stdout" 2>>"$at_stderr" 5>&-
at_status=$? at_failed=false
$at_check_filter
-echo >>"$at_stderr"; $as_echo "gtfetch: 0: not found
+echo >>"$at_stderr"; $as_echo "gtfetch.exe: 0: not found
" | \
$at_diff - "$at_stderr" || at_failed=:
at_fn_diff_devnull "$at_stdout" || at_failed=:
@@ -2262,7 +2262,7 @@
) >>"$at_stdout" 2>>"$at_stderr" 5>&-
at_status=$? at_failed=false
$at_check_filter
-echo >>"$at_stderr"; $as_echo "gtdel: cannot delete 11: Item not found
+echo >>"$at_stderr"; $as_echo "gtdel.exe: cannot delete 11: Item not found
" | \
$at_diff - "$at_stderr" || at_failed=:
at_fn_diff_devnull "$at_stdout" || at_failed=:
@@ -2627,7 +2627,7 @@
) >>"$at_stdout" 2>>"$at_stderr" 5>&-
at_status=$? at_failed=false
$at_check_filter
-echo >>"$at_stderr"; $as_echo "dtfetch: 0: not found
+echo >>"$at_stderr"; $as_echo "dtfetch.exe: 0: not found
" | \
$at_diff - "$at_stderr" || at_failed=:
at_fn_diff_devnull "$at_stdout" || at_failed=:
@@ -2835,7 +2835,7 @@
) >>"$at_stdout" 2>>"$at_stderr" 5>&-
at_status=$? at_failed=false
$at_check_filter
-echo >>"$at_stderr"; $as_echo "dtdel: cannot delete 11: Item not found
+echo >>"$at_stderr"; $as_echo "dtdel.exe: cannot delete 11: Item not found
" | \
$at_diff - "$at_stderr" || at_failed=:
at_fn_diff_devnull "$at_stdout" || at_failed=: