1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
|
--- mbuffer.c.orig 2008-12-24 12:17:41.000000000 +0800
+++ mbuffer.c 2008-12-24 12:36:47.000000000 +0800
@@ -32,7 +32,6 @@
#include <fcntl.h>
#include <libgen.h>
#include <limits.h>
-#include <malloc.h>
#include <math.h>
#include <pthread.h>
#include <semaphore.h>
@@ -45,6 +44,8 @@
#include <sys/mman.h>
#include <sys/stat.h>
#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/sysctl.h>
#include <termios.h>
#include <unistd.h>
@@ -52,6 +53,9 @@
#ifdef HAVE_SENDFILE_H
#include <sys/sendfile.h>
#endif
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/uio.h>
/* if this sendfile implementation does not support sending from buffers,
disable sendfile support */
#ifndef SFV_FD_SELF
@@ -855,7 +859,7 @@
err = fsync(fd);
while ((err != 0) && (errno == EINTR));
if (err != 0) {
- if ((errno == EINVAL) || (errno == EBADRQC)) {
+ if ((errno == EINVAL)) {
infomsg("syncing unsupported on %s: omitted.\n",d->arg);
} else {
warningmsg("unable to sync %s: %s\n",d->arg,strerror(errno));
@@ -1126,7 +1130,7 @@
err = fsync(d->fd);
while ((err != 0) && (errno == EINTR));
if (err != 0) {
- if ((errno == EINVAL) || (errno == EBADRQC)) {
+ if ((errno == EINVAL)) {
infomsg("syncing unsupported on %s: omitted.\n",d->arg);
} else {
warningmsg("unable to sync %s: %s\n",d->arg,strerror(errno));
@@ -1608,12 +1612,22 @@
const char *outfile = 0;
struct sigaction sig;
dest_t *dest = 0;
-#if defined(_SC_AVPHYS_PAGES) && defined(_SC_PAGESIZE) && !defined(__CYGWIN__)
- long pgsz, nump;
+#if (defined(_SC_AVPHYS_PAGES) && defined(_SC_PAGESIZE) && !defined(__CYGWIN__)) || defined(__FreeBSD__)
+#if defined(__FreeBSD__)
+ unsigned long nump;
+ size_t nump_size = sizeof(nump_size);
+#else
+ long nump;
+#endif
+ long pgsz;
pgsz = sysconf(_SC_PAGESIZE);
assert(pgsz > 0);
+#if defined(__FreeBSD__)
+ sysctlbyname("hw.availpages", &nump, &nump_size, NULL, 0);
+#else
nump = sysconf(_SC_AVPHYS_PAGES);
+#endif
assert(nump > 0);
Blocksize = pgsz;
Numblocks = nump/50;
@@ -1664,6 +1678,8 @@
debugmsg("Verbose = %d\n",Verbose);
#if defined(_SC_AVPHYS_PAGES) && defined(_SC_PAGESIZE) && !defined(__CYGWIN__)
debugmsg("total # of phys pages: %li (pagesize %li)\n",nump,pgsz);
+#elif defined(__FreeBSD__)
+ debugmsg("total # of phys pages: %li (pagesize %li)\n",nump,pgsz);
#endif
debugmsg("default buffer set to %d blocks of %lld bytes\n",Numblocks,Blocksize);
} else if (!argcheck("-u",argv,&c,argc)) {
@@ -1760,7 +1776,7 @@
Status = 0;
} else if (!strcmp("-c",argv[c])) {
debugmsg("enabling full synchronous I/O\n");
- OptSync = O_DSYNC;
+ OptSync = O_FSYNC;
} else if (!argcheck("-a",argv,&c,argc)) {
Autoloader = 1;
Autoload_time = atoi(argv[c]);
@@ -1864,7 +1880,14 @@
/* SPW END */
/* check that we stay within system limits */
- mxnrsem = sysconf(_SC_SEM_VALUE_MAX);
+ {
+ int semvmx;
+ size_t semvmx_size = sizeof(semvmx);
+ if (sysctlbyname("kern.ipc.semvmx", &semvmx, &semvmx_size, NULL, 0) == -1)
+ mxnrsem = -1;
+ else
+ mxnrsem = semvmx;
+ }
if (-1 == mxnrsem) {
warningmsg("unable to determine maximum value of semaphores\n");
} else if (Numblocks > (unsigned long long) mxnrsem) {
@@ -1874,8 +1897,8 @@
if ((Blocksize * (long long)Numblocks) > (long long)SSIZE_MAX)
fatal("Cannot address so much memory (%lld*%d=%lld>%lld).\n",Blocksize,Numblocks,Blocksize*(long long)Numblocks,(long long)SSIZE_MAX);
/* create buffer */
- Buffer = (char **) memalign(sysconf(_SC_PAGESIZE),Numblocks * sizeof(char *));
- if (!Buffer)
+ err = posix_memalign(&Buffer,sysconf(_SC_PAGESIZE),Numblocks * sizeof(char *));
+ if (err || !Buffer)
fatal("Could not allocate enough memory (%d requested): %s\n",Numblocks * sizeof(char *),strerror(errno));
if (Memmap) {
infomsg("mapping temporary file to memory with %llu blocks with %llu byte (%llu kB total)...\n",(unsigned long long) Numblocks,(unsigned long long) Blocksize,(unsigned long long) ((Numblocks*Blocksize) >> 10));
|