aboutsummaryrefslogtreecommitdiff
path: root/src/systems.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/systems.h')
-rw-r--r--src/systems.h142
1 files changed, 142 insertions, 0 deletions
diff --git a/src/systems.h b/src/systems.h
new file mode 100644
index 0000000..dd8cfa7
--- /dev/null
+++ b/src/systems.h
@@ -0,0 +1,142 @@
+/* systems.h - Most of the system dependant code and defines are here. */
+
+/* This file is part of GDBM, the GNU data base manager.
+ Copyright (C) 1990, 1991, 1993, 2007 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software Foundation,
+ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
+
+/* Include all system headers first. */
+#if HAVE_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+#include <stdio.h>
+#if HAVE_SYS_FILE_H
+#include <sys/file.h>
+#endif
+#include <sys/stat.h>
+#if HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+#if HAVE_STRING_H
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+#if HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+#if HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#ifndef SEEK_SET
+#define SEEK_SET 0
+#endif
+
+#ifndef L_SET
+#define L_SET SEEK_SET
+#endif
+
+/* Do we have flock? (BSD...) */
+
+#if HAVE_FLOCK
+
+#ifndef LOCK_SH
+#define LOCK_SH 1
+#endif
+
+#ifndef LOCK_EX
+#define LOCK_EX 2
+#endif
+
+#ifndef LOCK_NB
+#define LOCK_NB 4
+#endif
+
+#ifndef LOCK_UN
+#define LOCK_UN 8
+#endif
+
+#define UNLOCK_FILE(dbf) flock (dbf->desc, LOCK_UN)
+#define READLOCK_FILE(dbf) lock_val = flock (dbf->desc, LOCK_SH + LOCK_NB)
+#define WRITELOCK_FILE(dbf) lock_val = flock (dbf->desc, LOCK_EX + LOCK_NB)
+
+#else
+
+/* Assume it is done like System V. */
+
+#define UNLOCK_FILE(dbf) \
+ { \
+ struct flock flock; \
+ flock.l_type = F_UNLCK; \
+ flock.l_whence = SEEK_SET; \
+ flock.l_start = flock.l_len = 0L; \
+ fcntl (dbf->desc, F_SETLK, &flock); \
+ }
+#define READLOCK_FILE(dbf) \
+ { \
+ struct flock flock; \
+ flock.l_type = F_RDLCK; \
+ flock.l_whence = SEEK_SET; \
+ flock.l_start = flock.l_len = 0L; \
+ lock_val = fcntl (dbf->desc, F_SETLK, &flock); \
+ }
+#define WRITELOCK_FILE(dbf) \
+ { \
+ struct flock flock; \
+ flock.l_type = F_WRLCK; \
+ flock.l_whence = SEEK_SET; \
+ flock.l_start = flock.l_len = 0L; \
+ lock_val = fcntl (dbf->desc, F_SETLK, &flock); \
+ }
+#endif
+
+/* Default block size. Some systems do not have blocksize in their
+ stat record. This code uses the BSD blocksize from stat. */
+
+#if HAVE_STRUCT_STAT_ST_BLKSIZE
+#define STATBLKSIZE file_stat.st_blksize
+#else
+#define STATBLKSIZE 1024
+#endif
+
+/* Do we have ftruncate? */
+#if HAVE_FTRUNCATE
+#define TRUNCATE(dbf) ftruncate (dbf->desc, 0)
+#else
+#define TRUNCATE(dbf) close( open (dbf->name, O_RDWR|O_TRUNC, mode));
+#endif
+
+#ifndef STDERR_FILENO
+#define STDERR_FILENO 2
+#endif
+
+/* I/O macros. */
+#if HAVE_MMAP
+#define __read(_dbf, _buf, _size) _gdbm_mapped_read(_dbf, _buf, _size)
+#define __write(_dbf, _buf, _size) _gdbm_mapped_write(_dbf, _buf, _size)
+#define __lseek(_dbf, _off, _whn) _gdbm_mapped_lseek(_dbf, _off, _whn)
+#define __fsync(_dbf) _gdbm_mapped_sync(_dbf)
+#else
+#define __read(_dbf, _buf, _size) read(_dbf->desc, _buf, _size)
+#define __write(_dbf, _buf, _size) write(_dbf->desc, _buf, _size)
+#define __lseek(_dbf, _off, _whn) lseek(_dbf->desc, _off, _whn)
+#if HAVE_FSYNC
+#define __fsync(_dbf) fsync(_dbf->desc)
+#else
+#define __fsync(_dbf) { sync(); sync(); }
+#endif
+#endif
+

Return to:

Send suggestions and report system problems to the System administrator.