summaryrefslogtreecommitdiff
path: root/misc/mbuffer/files/patch-mbuffer.c
blob: c74f0794c56b0a0ad503775cfd201dbe2a82ab94 (plain) (blame)
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));