aboutsummaryrefslogtreecommitdiff
path: root/src/sg_dd.c
diff options
context:
space:
mode:
authorDouglas Gilbert <dgilbert@interlog.com>2013-10-14 19:29:37 +0000
committerDouglas Gilbert <dgilbert@interlog.com>2013-10-14 19:29:37 +0000
commit189211afbafc77fdc22b7ec2cfe75fa313f12049 (patch)
tree0075f06941a30a4296d51dd443e92a9e139dce1b /src/sg_dd.c
parente8a28a4bffdb40f9d19faae694b3cea794bb2dbb (diff)
downloadsg3_utils-189211afbafc77fdc22b7ec2cfe75fa313f12049.tar.gz
avoid getpagesize() with sysconf() and use posix_memalign()
git-svn-id: https://svn.bingwo.ca/repos/sg3_utils/trunk@521 6180dd3e-e324-4e3e-922d-17de1ae2f315
Diffstat (limited to 'src/sg_dd.c')
-rw-r--r--src/sg_dd.c25
1 files changed, 23 insertions, 2 deletions
diff --git a/src/sg_dd.c b/src/sg_dd.c
index 1bae8d92..5475a609 100644
--- a/src/sg_dd.c
+++ b/src/sg_dd.c
@@ -58,7 +58,8 @@
#include "sg_cmds_extra.h"
#include "sg_io_linux.h"
-static const char * version_str = "5.78 20130603";
+static const char * version_str = "5.79 20131014";
+
#define ME "sg_dd: "
@@ -1869,8 +1870,27 @@ main(int argc, char * argv[])
if (iflag.dio || iflag.direct || oflag.direct || (FT_RAW & in_type) ||
(FT_RAW & out_type)) {
- size_t psz = sysconf(_SC_PAGESIZE); /* was getpagesize() */
+ size_t psz;
+
+#if defined(HAVE_SYSCONF) && defined(_SC_PAGESIZE)
+ psz = sysconf(_SC_PAGESIZE); /* POSIX.1 (was getpagesize()) */
+#else
+ psz = 4096; /* give up, pick likely figure */
+#endif
+
+#ifdef HAVE_POSIX_MEMALIGN
+ {
+ int err;
+ err = posix_memalign((void **)&wrkBuff, psz, blk_sz * bpt);
+ if (err) {
+ fprintf(stderr, "posix_memalign: error [%d] out of memory?\n",
+ err);
+ return SG_LIB_CAT_OTHER;
+ }
+ wrkPos = wrkBuff;
+ }
+#else
wrkBuff = (unsigned char*)malloc(blk_sz * bpt + psz);
if (0 == wrkBuff) {
fprintf(stderr, "Not enough user memory for raw\n");
@@ -1878,6 +1898,7 @@ main(int argc, char * argv[])
}
wrkPos = (unsigned char *)(((unsigned long)wrkBuff + psz - 1) &
(~(psz - 1)));
+#endif
} else {
wrkBuff = (unsigned char*)malloc(blk_sz * bpt);
if (0 == wrkBuff) {