aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sysutils/Makefile1
-rw-r--r--sysutils/parkverbot/Makefile24
-rw-r--r--sysutils/parkverbot/distinfo3
-rw-r--r--sysutils/parkverbot/files/patch-src_parkverbot.c89
-rw-r--r--sysutils/parkverbot/pkg-descr3
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, &sector_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/