diff -r -u --strip-trailing-cr gdbm-1.18.original/compat/dbmopen.c gdbm-1.18/compat/dbmopen.c --- gdbm-1.18.original/compat/dbmopen.c 2019-05-22 01:11:07.944611900 +0200 +++ gdbm-1.18/compat/dbmopen.c 2019-05-22 01:11:01.096240000 +0200 @@ -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,13 +80,40 @@ } /* 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. */ @@ -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 -r -u --strip-trailing-cr gdbm-1.18.original/compat/Makefile.am gdbm-1.18/compat/Makefile.am --- gdbm-1.18.original/compat/Makefile.am 2019-05-22 01:11:08.736597900 +0200 +++ gdbm-1.18/compat/Makefile.am 2019-05-22 01:11:01.189984100 +0200 @@ -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 -r -u --strip-trailing-cr gdbm-1.18.original/compat/Makefile.in gdbm-1.18/compat/Makefile.in --- gdbm-1.18.original/compat/Makefile.in 2019-05-22 01:11:08.852507400 +0200 +++ gdbm-1.18/compat/Makefile.in 2019-05-22 01:11:01.252482300 +0200 @@ -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 -r -u --strip-trailing-cr gdbm-1.18.original/configure gdbm-1.18/configure --- gdbm-1.18.original/configure 2019-05-22 01:11:09.310829800 +0200 +++ gdbm-1.18/configure 2019-05-22 01:11:01.471214100 +0200 @@ -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 -r -u --strip-trailing-cr gdbm-1.18.original/configure.ac gdbm-1.18/configure.ac --- gdbm-1.18.original/configure.ac 2019-05-22 01:11:09.418664200 +0200 +++ gdbm-1.18/configure.ac 2019-05-22 01:11:01.674324300 +0200 @@ -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 -r -u --strip-trailing-cr gdbm-1.18.original/src/fullio.c gdbm-1.18/src/fullio.c --- gdbm-1.18.original/src/fullio.c 2019-05-22 01:11:17.984838300 +0200 +++ gdbm-1.18/src/fullio.c 2019-05-22 01:11:01.721182300 +0200 @@ -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 -r -u --strip-trailing-cr gdbm-1.18.original/src/gdbm_load.c gdbm-1.18/src/gdbm_load.c --- gdbm-1.18.original/src/gdbm_load.c 2019-05-22 01:11:20.567532600 +0200 +++ gdbm-1.18/src/gdbm_load.c 2019-05-22 01:11:01.752427100 +0200 @@ -18,16 +18,12 @@ # include "gdbm.h" # include "gdbmapp.h" # include "gdbmdefs.h" -# include -# include 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 -r -u --strip-trailing-cr gdbm-1.18.original/src/gdbmdump.c gdbm-1.18/src/gdbmdump.c --- gdbm-1.18.original/src/gdbmdump.c 2019-05-22 01:11:18.909655800 +0200 +++ gdbm-1.18/src/gdbmdump.c 2019-05-22 01:11:01.846188200 +0200 @@ -17,8 +17,6 @@ # include "autoconf.h" # include "gdbmdefs.h" # include "gdbm.h" -# include -# include # include 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"); @@ -178,7 +168,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); @@ -186,7 +176,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 -r -u --strip-trailing-cr gdbm-1.18.original/src/gdbmexp.c gdbm-1.18/src/gdbmexp.c --- gdbm-1.18.original/src/gdbmexp.c 2019-05-22 01:11:19.192497100 +0200 +++ gdbm-1.18/src/gdbmexp.c 2019-05-22 01:11:01.893059600 +0200 @@ -19,7 +19,11 @@ /* Include system configuration before all else. */ # include "autoconf.h" +#ifdef _WIN32 +# include +#else # include +#endif #ifdef GDBM_EXPORT_18 # define GDBM_SET_ERRNO(dbf, ec, fatal) gdbm_errno = ec @@ -109,7 +113,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); @@ -117,7 +121,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); @@ -133,7 +137,7 @@ return -1; } - fp = fdopen (nfd, "w"); + fp = fdopen (nfd, "wb"); if (!fp) { close (nfd); diff -r -u --strip-trailing-cr gdbm-1.18.original/src/gdbmimp.c gdbm-1.18/src/gdbmimp.c --- gdbm-1.18.original/src/gdbmimp.c 2019-05-22 01:11:19.467826600 +0200 +++ gdbm-1.18/src/gdbmimp.c 2019-05-22 01:11:01.924307600 +0200 @@ -18,7 +18,11 @@ along with GDBM. If not, see . */ # include "autoconf.h" +#ifdef _WIN32 +# include +#else # include +#endif # include # include "gdbmdefs.h" diff -r -u --strip-trailing-cr gdbm-1.18.original/src/gdbmload.c gdbm-1.18/src/gdbmload.c --- gdbm-1.18.original/src/gdbmload.c 2019-05-22 01:11:19.542708400 +0200 +++ gdbm-1.18/src/gdbmload.c 2019-05-22 01:11:01.955555100 +0200 @@ -18,8 +18,6 @@ # include "gdbmdefs.h" # include "gdbm.h" # include -# include -# include 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 -r -u --strip-trailing-cr gdbm-1.18.original/src/gdbmopen.c gdbm-1.18/src/gdbmopen.c --- gdbm-1.18.original/src/gdbmopen.c 2019-05-22 01:11:19.642471400 +0200 +++ gdbm-1.18/src/gdbmopen.c 2019-05-22 01:11:01.986803800 +0200 @@ -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. */ @@ -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 @@ -658,6 +657,8 @@ } if (flags & GDBM_CLOEXEC) fbits |= O_CLOEXEC; + + fbits |= O_BINARY; fd = open (file, fbits, mode); if (fd < 0) @@ -688,7 +689,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 -r -u --strip-trailing-cr gdbm-1.18.original/src/gdbmtool.c gdbm-1.18/src/gdbmtool.c --- gdbm-1.18.original/src/gdbmtool.c 2019-05-22 01:11:20.259128800 +0200 +++ gdbm-1.18/src/gdbmtool.c 2019-05-22 01:11:02.033672700 +0200 @@ -22,8 +22,6 @@ #include #include #include -#include -#include #ifdef HAVE_SYS_TERMIOS_H # include #endif @@ -2001,6 +1999,7 @@ { istr = instream_file_create (GDBMTOOLRC); } +#if 0 else { char *fname; @@ -2029,6 +2028,7 @@ exit (EXIT_FATAL); yyparse (); } +#endif } #if GDBM_DEBUG_ENABLE @@ -2171,8 +2171,6 @@ } } - signal (SIGPIPE, SIG_IGN); - memset (¶m, 0, sizeof (param)); argmax = 0; diff -r -u --strip-trailing-cr gdbm-1.18.original/src/lock.c gdbm-1.18/src/lock.c --- gdbm-1.18.original/src/lock.c 2019-05-22 01:11:21.734449100 +0200 +++ gdbm-1.18/src/lock.c 2019-05-22 01:11:02.096167600 +0200 @@ -24,7 +24,7 @@ #include -#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 +#include + +/* + * 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 -r -u --strip-trailing-cr gdbm-1.18.original/src/Makefile.am gdbm-1.18/src/Makefile.am --- gdbm-1.18.original/src/Makefile.am 2019-05-22 01:11:21.834384000 +0200 +++ gdbm-1.18/src/Makefile.am 2019-05-22 01:11:02.111794800 +0200 @@ -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 -r -u --strip-trailing-cr gdbm-1.18.original/src/Makefile.in gdbm-1.18/src/Makefile.in --- gdbm-1.18.original/src/Makefile.in 2019-05-22 01:11:21.934228600 +0200 +++ gdbm-1.18/src/Makefile.in 2019-05-22 01:11:02.174290400 +0200 @@ -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 -r -u --strip-trailing-cr gdbm-1.18.original/src/mem.c gdbm-1.18/src/mem.c --- gdbm-1.18.original/src/mem.c 2019-05-22 01:11:22.083383900 +0200 +++ gdbm-1.18/src/mem.c 2019-05-22 01:11:02.268014800 +0200 @@ -14,7 +14,7 @@ You should have received a copy of the GNU General Public License along with GDBM. If not, see . */ -# include "autoconf.h" +# include "../autoconf.h" # include "gdbm.h" # include "gdbmapp.h" # include "gdbmdefs.h" diff -r -u --strip-trailing-cr gdbm-1.18.original/src/parseopt.c gdbm-1.18/src/parseopt.c --- gdbm-1.18.original/src/parseopt.c 2019-05-22 01:11:22.276117000 +0200 +++ gdbm-1.18/src/parseopt.c 2019-05-22 01:11:02.314886200 +0200 @@ -14,10 +14,11 @@ You should have received a copy of the GNU General Public License along with GDBM. If not, see . */ -# include "autoconf.h" +# include "../autoconf.h" # include "gdbm.h" # include "gdbmapp.h" # include "gdbmdefs.h" +#include "autoconf.h" # include # include # include diff -r -u --strip-trailing-cr gdbm-1.18.original/src/progname.c gdbm-1.18/src/progname.c --- gdbm-1.18.original/src/progname.c 2019-05-22 01:11:22.375774700 +0200 +++ gdbm-1.18/src/progname.c 2019-05-22 01:11:02.471144500 +0200 @@ -14,7 +14,7 @@ You should have received a copy of the GNU General Public License along with GDBM. If not, see . */ -# include "autoconf.h" +# include "../autoconf.h" # include "gdbm.h" # include "gdbmapp.h" # include diff -r -u --strip-trailing-cr gdbm-1.18.original/src/proto.h gdbm-1.18/src/proto.h --- gdbm-1.18.original/src/proto.h 2019-05-22 01:11:22.492771800 +0200 +++ gdbm-1.18/src/proto.h 2019-05-22 01:11:02.736751100 +0200 @@ -126,6 +126,8 @@ GDBM_SET_ERRNO (dbf, GDBM_FILE_SYNC_ERROR, TRUE); return 1; } +#elif _WIN32 + FlushFileBuffers(dbf); #else sync (); sync (); diff -r -u --strip-trailing-cr gdbm-1.18.original/src/recover.c gdbm-1.18/src/recover.c --- gdbm-1.18.original/src/recover.c 2019-05-22 01:11:22.601024900 +0200 +++ gdbm-1.18/src/recover.c 2019-05-22 01:11:03.017981700 +0200 @@ -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 +43,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 +148,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 -r -u --strip-trailing-cr gdbm-1.18.original/src/systems.h gdbm-1.18/src/systems.h --- gdbm-1.18.original/src/systems.h 2019-05-22 01:11:22.708421200 +0200 +++ gdbm-1.18/src/systems.h 2019-05-22 01:11:03.299218600 +0200 @@ -18,6 +18,11 @@ along with GDBM. If not, see . */ /* Include all system headers first. */ +#ifdef _WIN32 +# undef _WIN32_WINNT +# define _WIN32_WINNT 0x0601 +# include +#endif #include #include #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. */ @@ -63,4 +72,7 @@ # define STDERR_FILENO 2 #endif - +/* Windows port of flock */ +#ifdef _WIN32 +extern int flock(int fd, int oper); +#endif diff -r -u --strip-trailing-cr gdbm-1.18.original/src/util.c gdbm-1.18/src/util.c --- gdbm-1.18.original/src/util.c 2019-05-22 01:11:22.934208800 +0200 +++ gdbm-1.18/src/util.c 2019-05-22 01:11:03.408578800 +0200 @@ -16,7 +16,6 @@ along with GDBM. If not, see . */ #include "gdbmtool.h" -#include 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 -r -u --strip-trailing-cr gdbm-1.18.original/tests/blocksize02.at gdbm-1.18/tests/blocksize02.at --- gdbm-1.18.original/tests/blocksize02.at 2019-05-22 01:11:23.566722100 +0200 +++ gdbm-1.18/tests/blocksize02.at 2019-05-22 01:11:03.564819600 +0200 @@ -22,7 +22,6 @@ ], [1], [], -[gdbm_open failed: Block size error -]) +[gdbm_open failed: Block size error]) AT_CLEANUP diff -r -u --strip-trailing-cr gdbm-1.18.original/tests/dbmdel01.at gdbm-1.18/tests/dbmdel01.at --- gdbm-1.18.original/tests/dbmdel01.at 2019-05-22 01:11:24.759511600 +0200 +++ gdbm-1.18/tests/dbmdel01.at 2019-05-22 01:11:03.721057200 +0200 @@ -25,7 +25,7 @@ ], [2], [], -[dtdel: cannot delete 11: Item not found +[dtdel.exe: cannot delete 11: Item not found ]) AT_CLEANUP diff -r -u --strip-trailing-cr gdbm-1.18.original/tests/dbmfetch01.at gdbm-1.18/tests/dbmfetch01.at --- gdbm-1.18.original/tests/dbmfetch01.at 2019-05-22 01:11:25.042437900 +0200 +++ gdbm-1.18/tests/dbmfetch01.at 2019-05-22 01:11:04.049159100 +0200 @@ -24,7 +24,7 @@ ], [2], [], -[dtfetch: 0: not found +[dtfetch.exe: 0: not found ]) AT_CLEANUP diff -r -u --strip-trailing-cr gdbm-1.18.original/tests/delete01.at gdbm-1.18/tests/delete01.at --- gdbm-1.18.original/tests/delete01.at 2019-05-22 01:11:25.508838400 +0200 +++ gdbm-1.18/tests/delete01.at 2019-05-22 01:11:04.142903100 +0200 @@ -24,7 +24,7 @@ ], [2], [], -[gtdel: cannot delete 11: Item not found +[gtdel.exe: cannot delete 11: Item not found ]) AT_CLEANUP diff -r -u --strip-trailing-cr gdbm-1.18.original/tests/dtdel.c gdbm-1.18/tests/dtdel.c --- gdbm-1.18.original/tests/dtdel.c 2019-05-22 01:11:25.765994000 +0200 +++ gdbm-1.18/tests/dtdel.c 2019-05-22 01:11:04.221022100 +0200 @@ -16,6 +16,7 @@ */ #include "autoconf.h" #include +#include #include #include #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 -r -u --strip-trailing-cr gdbm-1.18.original/tests/dtdump.c gdbm-1.18/tests/dtdump.c --- gdbm-1.18.original/tests/dtdump.c 2019-05-22 01:11:25.859074800 +0200 +++ gdbm-1.18/tests/dtdump.c 2019-05-22 01:11:04.252270900 +0200 @@ -16,10 +16,13 @@ */ #include "autoconf.h" #include +#include #include #include #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 -r -u --strip-trailing-cr gdbm-1.18.original/tests/dtfetch.c gdbm-1.18/tests/dtfetch.c --- gdbm-1.18.original/tests/dtfetch.c 2019-05-22 01:11:25.958861900 +0200 +++ gdbm-1.18/tests/dtfetch.c 2019-05-22 01:11:04.283518100 +0200 @@ -16,6 +16,7 @@ */ #include "autoconf.h" #include +#include #include #include #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 -r -u --strip-trailing-cr gdbm-1.18.original/tests/dtload.c gdbm-1.18/tests/dtload.c --- gdbm-1.18.original/tests/dtload.c 2019-05-22 01:11:26.050234400 +0200 +++ gdbm-1.18/tests/dtload.c 2019-05-22 01:11:04.314765800 +0200 @@ -16,6 +16,7 @@ */ #include "autoconf.h" #include +#include #include #include #include @@ -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 -r -u --strip-trailing-cr gdbm-1.18.original/tests/fetch01.at gdbm-1.18/tests/fetch01.at --- gdbm-1.18.original/tests/fetch01.at 2019-05-22 01:11:26.409011800 +0200 +++ gdbm-1.18/tests/fetch01.at 2019-05-22 01:11:04.346033000 +0200 @@ -23,7 +23,7 @@ ], [2], [], -[gtfetch: 0: not found +[gtfetch.exe: 0: not found ]) AT_CLEANUP diff -r -u --strip-trailing-cr gdbm-1.18.original/tests/gdbmtool03.at gdbm-1.18/tests/gdbmtool03.at --- gdbm-1.18.original/tests/gdbmtool03.at 2019-05-22 01:11:26.833654100 +0200 +++ gdbm-1.18/tests/gdbmtool03.at 2019-05-22 01:11:04.377261400 +0200 @@ -17,12 +17,13 @@ AT_SETUP([Initialization file]) AT_KEYWORDS([gdbmtool]) AT_CHECK([ -AT_DATA([.gdbmtoolrc], -[open t.db -]) -gdbmtool < +#include #include #include #include @@ -32,7 +33,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 -r -u --strip-trailing-cr gdbm-1.18.original/tests/gtdump.c gdbm-1.18/tests/gtdump.c --- gdbm-1.18.original/tests/gtdump.c 2019-05-22 01:11:27.058833200 +0200 +++ gdbm-1.18/tests/gtdump.c 2019-05-22 01:11:04.424133900 +0200 @@ -17,6 +17,7 @@ #include "autoconf.h" #include #include +#include #include #include #include "gdbm.h" @@ -32,7 +33,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 -r -u --strip-trailing-cr gdbm-1.18.original/tests/gtfetch.c gdbm-1.18/tests/gtfetch.c --- gdbm-1.18.original/tests/gtfetch.c 2019-05-22 01:11:27.159192100 +0200 +++ gdbm-1.18/tests/gtfetch.c 2019-05-22 01:11:04.455389000 +0200 @@ -16,6 +16,7 @@ */ #include "autoconf.h" #include +#include #include #include #include @@ -47,7 +48,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 -r -u --strip-trailing-cr gdbm-1.18.original/tests/gtload.c gdbm-1.18/tests/gtload.c --- gdbm-1.18.original/tests/gtload.c 2019-05-22 01:11:27.241592900 +0200 +++ gdbm-1.18/tests/gtload.c 2019-05-22 01:11:04.486628900 +0200 @@ -16,6 +16,7 @@ */ #include "autoconf.h" #include +#include #include #include #include @@ -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 -r -u --strip-trailing-cr gdbm-1.18.original/tests/gtopt.c gdbm-1.18/tests/gtopt.c --- gdbm-1.18.original/tests/gtopt.c 2019-05-22 01:11:27.356954500 +0200 +++ gdbm-1.18/tests/gtopt.c 2019-05-22 01:11:04.517876900 +0200 @@ -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 -r -u --strip-trailing-cr gdbm-1.18.original/tests/gtver.c gdbm-1.18/tests/gtver.c --- gdbm-1.18.original/tests/gtver.c 2019-05-22 01:11:27.549783500 +0200 +++ gdbm-1.18/tests/gtver.c 2019-05-22 01:11:04.564749300 +0200 @@ -17,6 +17,7 @@ #include "autoconf.h" #include #include +#include #include #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 -r -u --strip-trailing-cr gdbm-1.18.original/tests/num2word.c gdbm-1.18/tests/num2word.c --- gdbm-1.18.original/tests/num2word.c 2019-05-22 01:11:27.999850300 +0200 +++ gdbm-1.18/tests/num2word.c 2019-05-22 01:11:04.595997000 +0200 @@ -17,6 +17,7 @@ #include "autoconf.h" #include #include +#include #include #include #include @@ -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 -r -u --strip-trailing-cr gdbm-1.18.original/tests/testsuite gdbm-1.18/tests/testsuite --- gdbm-1.18.original/tests/testsuite 2019-05-22 01:11:28.508383500 +0200 +++ gdbm-1.18/tests/testsuite 2019-05-22 01:11:04.627243200 +0200 @@ -2167,7 +2167,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=: @@ -2263,7 +2263,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=: @@ -2655,7 +2655,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=: @@ -2863,7 +2863,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=: