Index: head/sysutils/Makefile =================================================================== --- head/sysutils/Makefile +++ head/sysutils/Makefile @@ -1010,6 +1010,7 @@ SUBDIR += s6-rc SUBDIR += safe-rm SUBDIR += safecat + SUBDIR += safecopy SUBDIR += samefile SUBDIR += samesame SUBDIR += sample Index: head/sysutils/safecopy/Makefile =================================================================== --- head/sysutils/safecopy/Makefile +++ head/sysutils/safecopy/Makefile @@ -0,0 +1,20 @@ +# $FreeBSD$ + +PORTNAME= safecopy +PORTVERSION= 1.7 +CATEGORIES= sysutils +MASTER_SITES= SF/${PORTNAME}/${PORTNAME}/${PORTNAME}-${PORTVERSION}/ + +MAINTAINER= anastasios@mageirias.com +COMMENT= Safe copying of files and partition + +LICENSE= GPLv2 +LICENSE_FILE= ${WRKSRC}/COPYING + +USES= gmake +GNU_CONFIGURE= yes + +PLIST_FILES= bin/safecopy \ + man/man1/safecopy.1.gz + +.include Index: head/sysutils/safecopy/distinfo =================================================================== --- head/sysutils/safecopy/distinfo +++ head/sysutils/safecopy/distinfo @@ -0,0 +1,3 @@ +TIMESTAMP = 1486492944 +SHA256 (safecopy-1.7.tar.gz) = 42fbed5d4764020eb0f34d95e97a0e14e62d801c3ef80f89bd497d94d39cc4fd +SIZE (safecopy-1.7.tar.gz) = 398465 Index: head/sysutils/safecopy/files/patch-src_safecopy.c =================================================================== --- head/sysutils/safecopy/files/patch-src_safecopy.c +++ head/sysutils/safecopy/files/patch-src_safecopy.c @@ -0,0 +1,29 @@ +--- src/safecopy.c.orig 2017-02-07 19:49:05 UTC ++++ src/safecopy.c +@@ -900,7 +900,7 @@ int main(int argc, char ** argv) { + fprintf(stdout, "File size: %llu\n", (long long) statusvars->filesize ); + } else { + fprintf(stderr, "Filesize not reported by stat(), trying seek().\n"); +- statusvars->source = open(configvars->sourcefile, O_RDONLY | O_RSYNC); ++ statusvars->source = open(configvars->sourcefile, O_RDONLY | O_SYNC); + if (statusvars->source) { + statusvars->filesize = lseek(statusvars->source, 0, SEEK_END); + close(statusvars->source); +@@ -1691,7 +1691,7 @@ int main(int argc, char ** argv) { + for ( statusvars->cseeks = 0; statusvars->cseeks < statusvars->seeks ; statusvars->cseeks ++) { + debug(DEBUG_SEEK, "debug: forced head realignment\n"); + // note. must use O_RSYNC since with O_DIRECT / raw devices, lseek to end of file might not work +- statusvars->source = open(configvars->sourcefile, O_RDONLY | O_NONBLOCK | O_RSYNC ); ++ statusvars->source = open(configvars->sourcefile, O_RDONLY | O_NONBLOCK | O_SYNC ); + if (statusvars->source) { + lseek(statusvars->source, 0, SEEK_SET); + select_for_reading(statusvars->source, configvars, statusvars); +@@ -1699,7 +1699,7 @@ int main(int argc, char ** argv) { + read(statusvars->source, statusvars->databuffer , statusvars->blocksize ); + close(statusvars->source); + } +- statusvars->source = open(configvars->sourcefile, O_RDONLY | O_NONBLOCK | O_RSYNC ); ++ statusvars->source = open(configvars->sourcefile, O_RDONLY | O_NONBLOCK | O_SYNC ); + if (statusvars->source) { + lseek(statusvars->source,- statusvars->blocksize , SEEK_END); + select_for_reading(statusvars->source, configvars, statusvars); Index: head/sysutils/safecopy/pkg-descr =================================================================== --- head/sysutils/safecopy/pkg-descr +++ head/sysutils/safecopy/pkg-descr @@ -0,0 +1,11 @@ +Safecopy is a data recovery tool which tries to extract as much data as +possible from a problematic (i.e. damaged sectors) source - like floppy drives, +hard disk partitions, CDs, tape devices etc, ... , where other tools like dd +would fail due to I/O errors. +Safecopy includes a low level IO layer to read CDROM disks in raw mode, and +issue device resets and other helpful low level operations on a number of other +device classes. +The project also includes a device simulator which can be used to simulate bad +media for testing and benchmarking safecopy as well as other data rescue tools. + +WWW: http://safecopy.sourceforge.net/