diff options
-rw-r--r-- | sysutils/Makefile | 1 | ||||
-rw-r--r-- | sysutils/parkverbot/Makefile | 24 | ||||
-rw-r--r-- | sysutils/parkverbot/distinfo | 3 | ||||
-rw-r--r-- | sysutils/parkverbot/files/patch-src_parkverbot.c | 89 | ||||
-rw-r--r-- | sysutils/parkverbot/pkg-descr | 3 |
5 files changed, 120 insertions, 0 deletions
diff --git a/sysutils/Makefile b/sysutils/Makefile index 85dd5fe9e2fb..039c7a60b7d3 100644 --- a/sysutils/Makefile +++ b/sysutils/Makefile @@ -861,6 +861,7 @@ SUBDIR += panicmail SUBDIR += parafly SUBDIR += parallel + SUBDIR += parkverbot SUBDIR += pass-otp SUBDIR += pass-update SUBDIR += password-store diff --git a/sysutils/parkverbot/Makefile b/sysutils/parkverbot/Makefile new file mode 100644 index 000000000000..f1706b353d61 --- /dev/null +++ b/sysutils/parkverbot/Makefile @@ -0,0 +1,24 @@ +# Created by: Alexey Dokuchaev <danfe@FreeBSD.org> +# $FreeBSD$ + +PORTNAME= parkverbot +PORTVERSION= 1.2 +CATEGORIES= sysutils +MASTER_SITES= SF/${PORTNAME}/${PORTVERSION} + +MAINTAINER= danfe@FreeBSD.org +COMMENT= Hard disk head parking inhibitor + +LICENSE= GPLv2+ + +LIB_DEPENDS= libHX.so:lang/libhx + +USES= pkgconfig tar:xz +GNU_CONFIGURE= yes + +PLIST_FILES= man/man8/parkverbot.8.gz sbin/parkverbot + +post-install: + ${RM} -r ${STAGEDIR}/lib/systemd + +.include <bsd.port.mk> diff --git a/sysutils/parkverbot/distinfo b/sysutils/parkverbot/distinfo new file mode 100644 index 000000000000..48e8e76954f7 --- /dev/null +++ b/sysutils/parkverbot/distinfo @@ -0,0 +1,3 @@ +TIMESTAMP = 1418026245 +SHA256 (parkverbot-1.2.tar.xz) = 982ee8d75d951300b9c9ba65e8b34adca9a14a8090e1225fb33a35937e26e334 +SIZE (parkverbot-1.2.tar.xz) = 73960 diff --git a/sysutils/parkverbot/files/patch-src_parkverbot.c b/sysutils/parkverbot/files/patch-src_parkverbot.c new file mode 100644 index 000000000000..ddb394970412 --- /dev/null +++ b/sysutils/parkverbot/files/patch-src_parkverbot.c @@ -0,0 +1,89 @@ +--- src/parkverbot.c.orig 2013-01-28 15:01:56 UTC ++++ src/parkverbot.c +@@ -18,6 +18,7 @@ + #include <string.h> + #include <time.h> + #include <unistd.h> ++#include <sys/disk.h> + #include <sys/mount.h> + #include <libHX/init.h> + #include <libHX/list.h> +@@ -34,7 +35,8 @@ + struct pv_bdev_entry { + struct HXlist_head anchor; + const char *path; +- loff_t size, prev_pos; ++ off_t size, prev_pos; ++ unsigned sector_size; + int fd; + }; + +@@ -43,7 +45,7 @@ static struct timespec pv_req_interval = {4, 0}; + static unsigned long long pv_disk_window = 16384; + static unsigned long long pv_buffer_size = 64; + +-static const char *pv_readable_size(char *buf, size_t bufsize, loff_t size) ++static const char *pv_readable_size(char *buf, size_t bufsize, off_t size) + { + static const char unit_names[][2] = + {"", "K", "M", "G", "T", "P", "E", "Y", "Z"}; +@@ -73,7 +75,7 @@ static bool pv_in_window(size_t prev_pos, size_t new_p + static int pv_mainloop(void) + { + struct pv_bdev_entry *e; +- loff_t new_pos; ++ off_t new_pos; + ssize_t read_ret; + char *buffer; + +@@ -86,6 +88,12 @@ static int pv_mainloop(void) + while (true) { + HXlist_for_each_entry(e, &pv_bdev_list, anchor) { + new_pos = HX_drand(0, e->size); ++ /* ++ * read(2) and write(2) require the offset to be ++ * a multiple of the sector size, otherwise they ++ * will return EINVAL; see FreeBSD PR 91149. ++ */ ++ new_pos -= new_pos % e->sector_size; + if (pv_in_window(e->prev_pos, new_pos, e)) { + printf("%s: %llu (in guard window)\n", e->path, + static_cast(unsigned long long, new_pos)); +@@ -118,6 +126,7 @@ static bool pv_open_device(const char *path) + struct pv_bdev_entry *e; + char buf[32]; + uint64_t size; ++ unsigned sector_size; + int fd; + + fd = open(path, O_RDONLY | O_BINARY); +@@ -125,10 +134,14 @@ static bool pv_open_device(const char *path) + fprintf(stderr, "%s: %s\n", path, strerror(errno)); + return false; + } +- if (ioctl(fd, BLKGETSIZE64, &size) < 0) { +- fprintf(stderr, "%s: BLKGETSIZE64: %s\n", path, strerror(errno)); ++ if (ioctl(fd, DIOCGSECTORSIZE, §or_size) < 0) { ++ fprintf(stderr, "%s: DIOCGSECTORSIZE: %s\n", path, strerror(errno)); + return false; + } ++ if (ioctl(fd, DIOCGMEDIASIZE, &size) < 0) { ++ fprintf(stderr, "%s: DIOCGMEDIASIZE: %s\n", path, strerror(errno)); ++ return false; ++ } + e = malloc(sizeof(*e)); + if (e == NULL) { + fprintf(stderr, "%s: %s\n", __func__, strerror(errno)); +@@ -138,9 +151,10 @@ static bool pv_open_device(const char *path) + HXlist_init(&e->anchor); + e->path = path; + e->size = size; ++ e->sector_size = sector_size; + e->fd = fd; +- printf("Added %s (size %s)\n", e->path, +- pv_readable_size(buf, sizeof(buf), e->size)); ++ printf("Added %s (size %s, sector size %d bytes)\n", e->path, ++ pv_readable_size(buf, sizeof(buf), e->size), sector_size); + HXlist_add_tail(&pv_bdev_list, &e->anchor); + return true; + } diff --git a/sysutils/parkverbot/pkg-descr b/sysutils/parkverbot/pkg-descr new file mode 100644 index 000000000000..044bf8e7d055 --- /dev/null +++ b/sysutils/parkverbot/pkg-descr @@ -0,0 +1,3 @@ +Daemon to prevent hard disk head parking in rotational media. + +WWW: http://parkverbot.sourceforge.net/ |