68 lines
2.2 KiB
C
68 lines
2.2 KiB
C
--- src/dc3dd.c.orig 2011-02-14 00:17:13.000000000 +0900
|
|
+++ src/dc3dd.c 2011-02-14 00:22:11.000000000 +0900
|
|
@@ -45,7 +45,7 @@
|
|
#include <linux/types.h>
|
|
#include "hdparm/hpa_dco.h"
|
|
#endif
|
|
-#elif defined (__APPLE__)
|
|
+#elif defined (__APPLE__) || defined (__FreeBSD__)
|
|
#include <sys/disk.h>
|
|
#include <sys/ioctl.h>
|
|
#elif defined (__CYGWIN__)
|
|
@@ -2325,6 +2325,56 @@
|
|
}
|
|
}
|
|
|
|
+#elif defined (__FreeBSD__)
|
|
+
|
|
+static void
|
|
+get_file_stats(file_t* file)
|
|
+{
|
|
+ file->probed = false;
|
|
+ file->is_device = false;
|
|
+ file->is_block_device = false;
|
|
+ file->probed_sector_size = 0;
|
|
+ file->probed_size_in_sectors= 0;
|
|
+ file->probed_size_in_bytes = 0;
|
|
+
|
|
+ struct stat file_info;
|
|
+ if (fstat(file->descriptor, &file_info) == 0)
|
|
+ {
|
|
+ if (file_info.st_mode & S_IFBLK)
|
|
+ {
|
|
+ // The file is a character device or a block device. It is necessary to
|
|
+ // use ioctl to query the OS to get the data to compute the size of the
|
|
+ // device.
|
|
+ file->is_device = true;
|
|
+ file->is_block_device = true;
|
|
+
|
|
+ uint32_t sector_size = 0;
|
|
+ uintmax_t size_in_sectors = 0;
|
|
+ off_t size_in_bytes = 0;
|
|
+ if (ioctl(file->descriptor, DIOCGSECTORSIZE, §or_size) >= 0 &&
|
|
+ ioctl(file->descriptor, DIOCGMEDIASIZE, &size_in_bytes) >= 0)
|
|
+ {
|
|
+ size_in_sectors = (uintmax_t)size_in_bytes / sector_size;
|
|
+ file->probed_size_in_sectors = (uintmax_t)size_in_sectors;
|
|
+ file->probed_sector_size = (uintmax_t)sector_size;
|
|
+ file->probed_size_in_bytes = file->probed_size_in_sectors * file->probed_sector_size;
|
|
+ file->probed = true;
|
|
+ }
|
|
+ }
|
|
+ else
|
|
+ {
|
|
+ // The file is a file (an image).
|
|
+ off_t start_of_file = lseek(file->descriptor, 0 , SEEK_CUR);
|
|
+ off_t end_of_file = lseek(file->descriptor, 0, SEEK_END);
|
|
+ if (lseek(file->descriptor, start_of_file, SEEK_SET) == 0)
|
|
+ {
|
|
+ file->probed_size_in_bytes = end_of_file - start_of_file;
|
|
+ file->probed = true;
|
|
+ }
|
|
+ }
|
|
+ }
|
|
+}
|
|
+
|
|
#endif // ifdef __LINUX__
|
|
|
|
// End code copied (and modified) from md5deep helpers.c
|