403Webshell
Server IP : 82.208.35.60  /  Your IP : 216.73.216.238
Web Server : Apache/2.4.55 (FreeBSD) OpenSSL/1.1.1q-freebsd PHP/7.3.31
System : FreeBSD server7.d2m.cz 12.4-RELEASE-p9 FreeBSD 12.4-RELEASE-p9 GENERIC amd64
User : studiokobylisy_cz ( 1008)
PHP Version : 7.3.31
Disable Function : NONE
MySQL : OFF  |  cURL : ON  |  WGET : OFF  |  Perl : OFF  |  Python : OFF  |  Sudo : OFF  |  Pkexec : OFF
Directory :  /usr/ports/multimedia/vdr/files/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Command :


[ Back ]     

Current File : /usr/ports/multimedia/vdr/files/patch-vdr-1.7.28_FreeBSD
Index: Make.config.template
@@ -8,6 +8,11 @@
 #
 # $Id: Make.config.template 2.8 2012/03/20 11:20:13 kls Exp $
 
+OSTYPE   ?= $(shell uname -s)
+ifeq ($(OSTYPE),FreeBSD)
+FREEBSD=1
+endif
+
 ### The C compiler and options:
 
 CC       = gcc
@@ -28,11 +33,22 @@ PREFIX   = $(DESTDIR)/usr/local
 MANDIR   = $(PREFIX)/man
 BINDIR   = $(PREFIX)/bin
 
+ifdef FREEBSD
+# you have to set DVBDIR to a valid path!!!
+# you will need extra patches for DVBDIR!!!
+#DVBDIR   = /usr/local/include
+LOCDIR       = $(PREFIX)/share/locale
+PLUGINDIR    = ./PLUGINS
+PLUGINLIBDIR = $(PREFIX)/lib/vdr
+VIDEODIR     = /video
+CONFDIR      = $(PREFIX)/etc/vdr
+else
 LOCDIR       = ./locale
 PLUGINDIR    = ./PLUGINS
 PLUGINLIBDIR = $(PLUGINDIR)/lib
 VIDEODIR     = /video
 CONFDIR      = $(VIDEODIR)
+endif
 
 ### The remote control:
 
@@ -46,3 +62,7 @@ LIRC_DEVICE = /var/run/lirc/lircd
 ifdef DVBDIR
 INCLUDES += -I$(DVBDIR)/include
 endif
+
+ifdef FREEBSD
+INCLUDES += -I$(VDRDIR)/include -I/usr/local/include
+endif
Index: Makefile
@@ -8,6 +8,11 @@
 
 .DELETE_ON_ERROR:
 
+OSTYPE   ?= $(shell uname -s)
+ifeq ($(OSTYPE),FreeBSD)
+FREEBSD=1
+endif
+
 CC       ?= gcc
 CFLAGS   ?= -g -O3 -Wall
 
@@ -21,7 +26,11 @@ MANDIR  ?= $(PREFIX)/share/man
 BINDIR  ?= $(PREFIX)/bin
 INCDIR  ?= $(PREFIX)/include
 LOCDIR  ?= ./locale
+ifdef FREEBSD
+LIBS     = -ljpeg -lpthread -lrt -lutil -lintl -liconv $(shell pkg-config --libs freetype2 fontconfig)
+else
 LIBS     = -ljpeg -lpthread -ldl -lcap -lrt $(shell pkg-config --libs freetype2 fontconfig)
+endif
 INCLUDES ?= $(shell pkg-config --cflags freetype2 fontconfig)
 
 PLUGINDIR= ./PLUGINS
@@ -150,7 +159,11 @@ i18n: $(I18Nmsgs)
 
 install-i18n:
 	@mkdir -p $(DESTDIR)$(LOCDIR)
+ifdef FREEBSD
+	@(cd $(LOCALEDIR); cp -R * $(DESTDIR)$(LOCDIR))
+else
 	@(cd $(LOCALEDIR); cp -r --parents * $(DESTDIR)$(LOCDIR))
+endif
 
 # The 'include' directory (for plugins):
 
@@ -189,7 +202,11 @@ install: install-bin install-conf instal
 
 install-bin: vdr
 	@mkdir -p $(DESTDIR)$(BINDIR)
+ifdef FREEBSD
+	@cp -f vdr svdrpsend $(DESTDIR)$(BINDIR)
+else
 	@cp --remove-destination vdr svdrpsend $(DESTDIR)$(BINDIR)
+endif
 
 # Configuration files:
 
@@ -212,13 +229,18 @@ install-doc:
 
 install-plugins: plugins
 	@mkdir -p $(DESTDIR)$(PLUGINLIBDIR)
+ifdef FREEBSD
+	@cp -f $(PLUGINDIR)/lib/lib*-*.so.$(APIVERSION) $(DESTDIR)$(PLUGINLIBDIR)
+else
 	@cp --remove-destination $(PLUGINDIR)/lib/lib*-*.so.$(APIVERSION) $(DESTDIR)$(PLUGINLIBDIR)
+endif
 
 # Includes:
 
 install-includes: include-dir
 	@mkdir -p $(DESTDIR)$(INCDIR)
 	@cp -pLR include/vdr include/libsi $(DESTDIR)$(INCDIR)
+	@cp Make.config Make.global $(DESTDIR)$(INCDIR)/vdr
 
 # pkg-config file:
 
Index: channels.c
@@ -29,7 +29,12 @@ tChannelID tChannelID::FromString(const 
   int tid;
   int sid;
   int rid = 0;
+#ifdef __FreeBSD__
+  sourcebuf = MALLOC(char, 10);
+  int fields = sscanf(s, "%9[^-]-%d-%d-%d-%d", sourcebuf, &nid, &tid, &sid, &rid);
+#else
   int fields = sscanf(s, "%a[^-]-%d-%d-%d-%d", &sourcebuf, &nid, &tid, &sid, &rid);
+#endif
   if (fields == 4 || fields == 5) {
      int source = cSource::FromString(sourcebuf);
      free(sourcebuf);
@@ -554,7 +559,18 @@ bool cChannel::Parse(const char *s)
      char *apidbuf = NULL;
      char *tpidbuf = NULL;
      char *caidbuf = NULL;
+#ifdef __FreeBSD__
+     namebuf = MALLOC(char, 256);
+     sourcebuf = MALLOC(char, 10);
+     parambuf = MALLOC(char, 256);
+     vpidbuf = MALLOC(char, 256);
+     apidbuf = MALLOC(char, 256);
+     tpidbuf = MALLOC(char, 256);
+     caidbuf = MALLOC(char, 256);
+     int fields = sscanf(s, "%255[^:]:%d :%255[^:]:%255[^:] :%d :%255[^:]:%255[^:]:%255[^:]:%255[^:]:%d :%d :%d :%d ", namebuf, &frequency, parambuf, sourcebuf, &srate, vpidbuf, apidbuf, tpidbuf, caidbuf, &sid, &nid, &tid, &rid);
+#else
      int fields = sscanf(s, "%a[^:]:%d :%a[^:]:%a[^:] :%d :%a[^:]:%a[^:]:%a[^:]:%a[^:]:%d :%d :%d :%d ", &namebuf, &frequency, &parambuf, &sourcebuf, &srate, &vpidbuf, &apidbuf, &tpidbuf, &caidbuf, &sid, &nid, &tid, &rid);
+#endif
      if (fields >= 9) {
         if (fields == 9) {
            // allow reading of old format
Index: ci.c
===================================================================
RCS file: /progs/network/ccvs/vdr/ci.c,v
retrieving revision 1.1.1.2
retrieving revision 1.3
diff -u -r1.1.1.2 -r1.3
--- ci.c	2010/02/17 10:14:44	1.1.1.2
+++ ci.c	2010/02/17 10:46:55	1.3
@@ -10,7 +10,11 @@
 #include "ci.h"
 #include <ctype.h>
 #include <linux/dvb/ca.h>
+#ifdef __FreeBSD__
+#include <stdlib.h>
+#else
 #include <malloc.h>
+#endif
 #include <netinet/in.h>
 #include <poll.h>
 #include <string.h>
Index: config.c
===================================================================
RCS file: /progs/network/ccvs/vdr/config.c,v
retrieving revision 1.1.1.4
retrieving revision 1.4
diff -u -r1.1.1.4 -r1.4
--- config.c	2010/06/07 09:07:28	1.1.1.4
+++ config.c	2010/06/07 09:12:57	1.4
@@ -10,6 +10,9 @@
 #include "config.h"
 #include <ctype.h>
 #include <stdlib.h>
+#ifdef __FreeBSD__
+#include <netinet/in.h>
+#endif
 #include "device.h"
 #include "i18n.h"
 #include "interface.h"
Index: diseqc.c
@@ -114,7 +114,14 @@ bool cDiseqc::Parse(const char *s)
      return true;
   bool result = false;
   char *sourcebuf = NULL;
+#ifdef __FreeBSD__
+  sourcebuf = MALLOC(char, 10);
+  if (commands == NULL)
+      commands = MALLOC(char, 256);
+  int fields = sscanf(s, "%9[^ ] %d %c %d %255[^\n]", sourcebuf, &slof, &polarization, &lof, commands);
+#else
   int fields = sscanf(s, "%a[^ ] %d %c %d %a[^\n]", &sourcebuf, &slof, &polarization, &lof, &commands);
+#endif
   if (fields == 4)
      commands = NULL; //XXX Apparently sscanf() doesn't work correctly if the last %a argument results in an empty string
   if (4 <= fields && fields <= 5) {
Index: eit.c
===================================================================
RCS file: /progs/network/ccvs/vdr/eit.c,v
retrieving revision 1.1.1.3
retrieving revision 1.5
diff -u -r1.1.1.3 -r1.5
--- eit.c	2010/06/07 09:07:27	1.1.1.3
+++ eit.c	2010/06/07 09:12:57	1.5
@@ -339,10 +339,15 @@
   if (diff > 2) {
      mutex.Lock();
      if (abs(diff - lastDiff) < 3) {
+#ifdef __FreeBSD__
+        isyslog("system time would have changed from %s (%ld) to %s (%ld)", *TimeToString(loctim), loctim, *TimeToString(sattim), sattim);
+        esyslog("stime() not available on FreeBSD, maybe use adjtime()?");
+#else
         if (stime(&sattim) == 0)
            isyslog("system time changed from %s (%ld) to %s (%ld)", *TimeToString(loctim), loctim, *TimeToString(sattim), sattim);
         else
            esyslog("ERROR while setting system time: %m");
+#endif
         }
      lastDiff = diff;
      mutex.Unlock();
Index: epg.c
===================================================================
RCS file: /progs/network/ccvs/vdr/epg.c,v
retrieving revision 1.1.1.3
retrieving revision 1.5
diff -u -r1.1.1.3 -r1.5
--- epg.c	2010/03/01 09:42:48	1.1.1.3
+++ epg.c	2010/03/01 09:58:06	1.5
@@ -31,7 +31,13 @@
 bool tComponent::FromString(const char *s)
 {
   unsigned int Stream, Type;
+#ifdef __FreeBSD__
+  if (description == NULL)
+	description = MALLOC(char, 256);
+  int n = sscanf(s, "%X %02X %7s %255[^\n]", &Stream, &Type, language, description); // 7 = MAXLANGCODE2 - 1
+#else
   int n = sscanf(s, "%X %02X %7s %a[^\n]", &Stream, &Type, language, &description); // 7 = MAXLANGCODE2 - 1
+#endif
   if (n != 4 || isempty(description)) {
      free(description);
      description = NULL;
Index: font.c
===================================================================
RCS file: /progs/network/ccvs/vdr/font.c,v
retrieving revision 1.1.1.3
retrieving revision 1.5
diff -u -r1.1.1.3 -r1.5
--- font.c	2010/10/19 20:28:48	1.1.1.3
+++ font.c	2010/10/19 20:32:58	1.5
@@ -383,7 +383,11 @@
 {
   if (!FontNames->Size()) {
      FcInit();
+#ifdef __FreeBSD__
+     FcObjectSet *os = FcObjectSetBuild(FC_FAMILY, FC_STYLE, (char *)NULL);
+#else
      FcObjectSet *os = FcObjectSetBuild(FC_FAMILY, FC_STYLE, NULL);
+#endif
      FcPattern *pat = FcPatternCreate();
      FcPatternAddBool(pat, FC_SCALABLE, FcTrue);
      if (Monospaced)
Index: i18n.h
===================================================================
RCS file: /progs/network/ccvs/vdr/i18n.h,v
retrieving revision 1.1.1.2
retrieving revision 1.3
diff -u -r1.1.1.2 -r1.3
--- i18n.h	2010/02/17 10:14:45	1.1.1.2
+++ i18n.h	2010/02/17 10:46:55	1.3
@@ -48,7 +48,11 @@
    ///< have an actual locale installed. The rest are just dummy entries
    ///< to allow having three letter language codes for other languages
    ///< that have no actual locale on this system.
+#ifdef __FreeBSD__
+const char *I18nTranslate(const char *s, const char *Plugin = NULL) __format_arg(1);
+#else
 const char *I18nTranslate(const char *s, const char *Plugin = NULL) __attribute_format_arg__(1);
+#endif
    ///< Translates the given string (with optional Plugin context) into
    ///< the current language. If no translation is available, the original
    ///< string will be returned.
Index: menu.c
===================================================================
RCS file: /progs/network/ccvs/vdr/menu.c,v
retrieving revision 1.1.1.6
retrieving revision 1.7
diff -u -r1.1.1.6 -r1.7
Index: menuitems.c
===================================================================
RCS file: /progs/network/ccvs/vdr/menuitems.c,v
retrieving revision 1.1.1.4
retrieving revision 1.5
diff -u -r1.1.1.4 -r1.5
--- menuitems.c	2010/06/07 09:07:27	1.1.1.4
+++ menuitems.c	2010/06/07 09:12:57	1.5
@@ -838,7 +838,11 @@
      struct tm tm_r;
      localtime_r(value, &tm_r);
      strftime(buf, DATEBUFFERSIZE, "%Y-%m-%d ", &tm_r);
+#ifdef __FreeBSD__
+     strcat(buf, WeekDayNameReal(tm_r.tm_wday));
+#else
      strcat(buf, WeekDayName(tm_r.tm_wday));
+#endif
      }
   else
      *buf = 0;
Index: pat.c
===================================================================
RCS file: /progs/network/ccvs/vdr/pat.c,v
retrieving revision 1.1.1.5
retrieving revision 1.6
diff -u -r1.1.1.5 -r1.6
--- pat.c	2010/10/19 20:28:48	1.1.1.5
+++ pat.c	2010/10/19 20:32:58	1.6
@@ -8,7 +8,11 @@
  */
 
 #include "pat.h"
+#ifdef __FreeBSD__
+#include <stdlib.h>
+#else
 #include <malloc.h>
+#endif
 #include "channels.h"
 #include "libsi/section.h"
 #include "libsi/descriptor.h"
Index: recording.c
===================================================================
RCS file: /progs/network/ccvs/vdr/recording.c,v
retrieving revision 1.1.1.3
retrieving revision 1.5
diff -u -r1.1.1.3 -r1.5
--- recording.c	2010/03/16 15:18:58	1.1.1.3
+++ recording.c	2010/03/16 15:21:05	1.5
@@ -1825,7 +1829,11 @@
          // Search for a PAT packet from the end of the file:
          cPatPmtParser PatPmtParser;
          sprintf(pFileNumber, RECORDFILESUFFIXTS, Number);
+#ifdef __FreeBSD__
+         int fd = open(fileName, O_RDONLY, DEFFILEMODE);
+#else
          int fd = open(fileName, O_RDONLY | O_LARGEFILE, DEFFILEMODE);
+#endif
          if (fd >= 0) {
             off_t pos = lseek(fd, -TS_SIZE, SEEK_END);
             while (pos >= 0) {
@@ -1866,14 +1874,22 @@
      int BlockingFlag = blocking ? 0 : O_NONBLOCK;
      if (record) {
         dsyslog("recording to '%s'", fileName);
+#ifdef __FreeBSD__
+        file = OpenVideoFile(fileName, O_RDWR | O_CREAT | BlockingFlag);
+#else
         file = OpenVideoFile(fileName, O_RDWR | O_CREAT | O_LARGEFILE | BlockingFlag);
+#endif
         if (!file)
            LOG_ERROR_STR(fileName);
         }
      else {
         if (access(fileName, R_OK) == 0) {
            dsyslog("playing '%s'", fileName);
+#ifdef __FreeBSD__
+           file = cUnbufferedFile::Create(fileName, O_RDONLY | BlockingFlag);
+#else
            file = cUnbufferedFile::Create(fileName, O_RDONLY | O_LARGEFILE | BlockingFlag);
+#endif
            if (!file)
               LOG_ERROR_STR(fileName);
            }
Index: skins.c
===================================================================
RCS file: /progs/network/ccvs/vdr/skins.c,v
retrieving revision 1.1.1.2
retrieving revision 1.3
diff -u -r1.1.1.2 -r1.3
--- skins.c	2010/02/17 10:14:45	1.1.1.2
+++ skins.c	2010/02/17 10:46:55	1.3
@@ -11,6 +11,20 @@
 #include "interface.h"
 #include "status.h"
 
+#if defined(__FreeBSD__) && __FreeBSD_version < 1000029
+/* XXX Implement strchrnul for FreeBSD. */
+static char *
+strchrnul (const char *s, int c_in)
+{
+  char c = c_in;
+  while (*s && (*s != c))
+    s++;
+
+  return (char *) s;
+}
+#endif
+
+
 // --- cSkinQueuedMessage ----------------------------------------------------
 
 class cSkinQueuedMessage : public cListObject {
Index: sources.c
===================================================================
RCS file: /progs/network/ccvs/vdr/sources.c,v
retrieving revision 1.1.1.4
retrieving revision 1.5
diff -u -r1.1.1.4 -r1.5
--- sources.c	2010/03/16 15:18:58	1.1.1.4
+++ sources.c	2010/03/16 15:21:05	1.5
@@ -31,7 +31,14 @@
 bool cSource::Parse(const char *s)
 {
   char *codeBuf = NULL;
+#ifdef __FreeBSD__
+  codeBuf = MALLOC(char, 10);
+  if (description == NULL)
+	description = MALLOC(char, 256);
+  if (2 == sscanf(s, "%9[^ ] %255[^\n]", codeBuf, description))
+#else
   if (2 == sscanf(s, "%a[^ ] %a[^\n]", &codeBuf, &description))
+#endif
      code = FromString(codeBuf);
   free(codeBuf);
   return code != stNone && description && *description;
Index: svdrp.c
@@ -40,6 +40,12 @@
 #include "tools.h"
 #include "videodir.h"
 
+/* FreeBSD has it's own version of isnumber(),
+   but VDR's version is incompatible */
+#ifdef __FreeBSD__
+#undef isnumber
+#endif
+
 // --- cSocket ---------------------------------------------------------------
 
 cSocket::cSocket(int Port, int Queue)
@@ -124,6 +130,23 @@ int cSocket::Accept(void)
         }
      else if (errno != EINTR && errno != EAGAIN)
         LOG_ERROR;
+#ifdef __FreeBSD__
+     // Linux' accept() doesn't inherit O_NONBLOCK... (this fixes
+     // cSVDRP::Send() failing due to EAGAIN when vdradmin-am downloads EPG.)
+     if (newsock >= 0) {
+        // make it blocking:
+        int oldflags = fcntl(newsock, F_GETFL, 0);
+        if (oldflags < 0) {
+           LOG_ERROR;
+           return -1;
+           }
+        oldflags &= ~O_NONBLOCK;
+        if (fcntl(newsock, F_SETFL, oldflags) < 0) {
+           LOG_ERROR;
+           return -1;
+           }
+        }
+#endif
      return newsock;
      }
   return -1;
Index: themes.c
===================================================================
RCS file: /progs/network/ccvs/vdr/themes.c,v
retrieving revision 1.1.1.2
retrieving revision 1.3
diff -u -r1.1.1.2 -r1.3
--- themes.c	2010/02/17 10:14:44	1.1.1.2
+++ themes.c	2010/02/17 10:46:55	1.3
@@ -47,7 +47,11 @@
                     // FileName is ok
                     if (SetName) {
                        free(name);
+#ifdef __FreeBSD__
+                       name = (char *)strndup(n, e - n);
+#else
                        name = strndup(n, e - n);
+#endif
                        }
                     }
                  else
Index: thread.c
===================================================================
RCS file: /progs/network/ccvs/vdr/thread.c,v
retrieving revision 1.1.1.2
retrieving revision 1.6
diff -u -r1.1.1.2 -r1.6
--- thread.c	2010/02/17 10:14:45	1.1.1.2
+++ thread.c	2010/02/24 08:41:13	1.6
@@ -9,15 +9,22 @@
 
 #include "thread.h"
 #include <errno.h>
+#ifdef __FreeBSD__
+#include <pthread_np.h>
+#include <stdlib.h>
+#else
 #include <linux/unistd.h>
 #include <malloc.h>
+#endif
 #include <stdarg.h>
 #include <stdlib.h>
 #include <sys/resource.h>
 #include <sys/syscall.h>
 #include <sys/time.h>
 #include <sys/wait.h>
+#ifndef __FreeBSD__
 #include <sys/prctl.h>
+#endif
 #include <unistd.h>
 #include "tools.h"
 
@@ -143,7 +150,9 @@
 {
   pthread_rwlockattr_t attr;
   pthread_rwlockattr_init(&attr);
+#ifndef __FreeBSD__
   pthread_rwlockattr_setkind_np(&attr, PreferWriter ? PTHREAD_RWLOCK_PREFER_WRITER_NP : PTHREAD_RWLOCK_PREFER_READER_NP);
+#endif
   pthread_rwlock_init(&rwlock, &attr);
 }
 
@@ -179,7 +188,11 @@
   locked = 0;
   pthread_mutexattr_t attr;
   pthread_mutexattr_init(&attr);
+#ifdef __FreeBSD__
+  pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
+#else
   pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK_NP);
+#endif
   pthread_mutex_init(&mutex, &attr);
 }
 
@@ -228,8 +241,12 @@
 
 void cThread::SetIOPriority(int Priority)
 {
+#ifdef __FreeBSD__
+  esyslog("ERROR: syscall(SYS_ioprio_set ...) unsupported on FreeBSD");
+#else
   if (syscall(SYS_ioprio_set, 1, 0, (Priority & 0xff) | (2 << 13)) < 0) // best effort class
      LOG_ERROR;
+#endif
 }
 
 void cThread::SetDescription(const char *Description, ...)
@@ -335,7 +352,11 @@
 
 tThreadId cThread::ThreadId(void)
 {
+#ifdef __FreeBSD__
+  return reinterpret_cast<long>(::pthread_self());
+#else
   return syscall(__NR_gettid);
+#endif
 }
 
 void cThread::SetMainThreadId(void)
@@ -461,7 +482,11 @@
         int MaxPossibleFileDescriptors = getdtablesize();
         for (int i = STDERR_FILENO + 1; i < MaxPossibleFileDescriptors; i++)
             close(i); //close all dup'ed filedescriptors
+#ifdef __FreeBSD__
+        if (execl("/bin/sh", "sh", "-c", Command, (char *)NULL) == -1) {
+#else
         if (execl("/bin/sh", "sh", "-c", Command, NULL) == -1) {
+#endif
            LOG_ERROR_STR(Command);
            close(fd[1 - iopipe]);
            _exit(-1);
@@ -544,7 +569,11 @@
      int MaxPossibleFileDescriptors = getdtablesize();
      for (int i = STDERR_FILENO + 1; i < MaxPossibleFileDescriptors; i++)
          close(i); //close all dup'ed filedescriptors
+#ifdef __FreeBSD__
+     if (execl("/bin/sh", "sh", "-c", Command, (char *)NULL) == -1) {
+#else
      if (execl("/bin/sh", "sh", "-c", Command, NULL) == -1) {
+#endif
         LOG_ERROR_STR(Command);
         _exit(-1);
         }
Index: thread.h
===================================================================
RCS file: /progs/network/ccvs/vdr/thread.h,v
retrieving revision 1.1.1.2
retrieving revision 1.3
diff -u -r1.1.1.2 -r1.3
--- thread.h	2010/02/17 10:14:44	1.1.1.2
+++ thread.h	2010/02/17 10:46:55	1.3
@@ -13,6 +13,9 @@
 #include <pthread.h>
 #include <stdio.h>
 #include <sys/types.h>
+#ifdef __FreeBSD__
+#include <signal.h>
+#endif
 
 class cCondWait {
 private:
Index: timers.c
===================================================================
RCS file: /progs/network/ccvs/vdr/timers.c,v
retrieving revision 1.1.1.2
retrieving revision 1.3
diff -u -r1.1.1.2 -r1.3
--- timers.c	2010/02/17 10:14:45	1.1.1.2
+++ timers.c	2010/02/17 10:46:55	1.3
@@ -23,6 +23,12 @@
 // format characters in order to allow any number of blanks after a numeric
 // value!
 
+/* FreeBSD has it's own version of isnumber(),
+   but VDR's version is incompatible */
+#ifdef __FreeBSD__
+#undef isnumber
+#endif
+
 // --- cTimer ----------------------------------------------------------------
 
 cTimer::cTimer(bool Instant, bool Pause, cChannel *Channel)
@@ -292,7 +298,15 @@
      s = s2;
      }
   bool result = false;
+#ifdef __FreeBSD__
+  channelbuffer = MALLOC(char, 256);
+  daybuffer = MALLOC(char, 256);
+  filebuffer = MALLOC(char, 256);
+  aux = MALLOC(char, 256);
+  if (8 <= sscanf(s, "%u :%255[^:]:%255[^:]:%d :%d :%d :%d :%255[^:\n]:%255[^\n]", &flags, channelbuffer, daybuffer, &start, &stop, &priority, &lifetime, filebuffer, aux)) {
+#else
   if (8 <= sscanf(s, "%u :%a[^:]:%a[^:]:%d :%d :%d :%d :%a[^:\n]:%a[^\n]", &flags, &channelbuffer, &daybuffer, &start, &stop, &priority, &lifetime, &filebuffer, &aux)) {
+#endif
      ClrFlags(tfRecording);
      if (aux && !*skipspace(aux)) {
         free(aux);
Index: tools.c
===================================================================
RCS file: /progs/network/ccvs/vdr/tools.c,v
retrieving revision 1.1.1.5
retrieving revision 1.8
diff -u -r1.1.1.5 -r1.8
--- tools.c	2010/10/19 20:28:48	1.1.1.5
+++ tools.c	2010/10/19 20:32:58	1.8
@@ -21,13 +21,24 @@
 #include <stdarg.h>
 #include <stdlib.h>
 #include <sys/time.h>
+#ifdef __FreeBSD__
+#include <sys/param.h>
+#include <sys/mount.h>
+#else
 #include <sys/vfs.h>
+#endif
 #include <time.h>
 #include <unistd.h>
 #include <utime.h>
 #include "i18n.h"
 #include "thread.h"
 
+/* FreeBSD has it's own version of isnumber(),
+   but VDR's version is incompatible */
+#ifdef __FreeBSD__
+#undef isnumber
+#endif
+
 int SysLogLevel = 3;
 
 #define MAXSYSLOGBUF 256
@@ -493,6 +504,18 @@
 {
   if (!FileName)
      return NULL;
+#ifdef __FreeBSD__
+  char *resolved_path = NULL;
+  resolved_path = MALLOC(char, PATH_MAX+1);
+  if (realpath(FileName, resolved_path) == NULL)
+  {
+        if (errno != ENOENT) // some other error occurred
+           LOG_ERROR_STR(FileName);
+        else // file doesn't exist
+           resolved_path = strdup(FileName);
+  }
+  return resolved_path;
+#else
   char *TargetName = canonicalize_file_name(FileName);
   if (!TargetName) {
      if (errno == ENOENT) // file doesn't exist
@@ -501,6 +524,7 @@
         LOG_ERROR_STR(FileName);
      }
   return TargetName;
+#endif
 }
 
 bool SpinUpDisk(const char *FileName)
@@ -517,7 +541,11 @@
          int f = open(buf, O_WRONLY | O_CREAT, DEFFILEMODE);
          // O_SYNC doesn't work on all file systems
          if (f >= 0) {
+#ifdef __FreeBSD__
+            if (fsync(f) < 0)
+#else
             if (fdatasync(f) < 0)
+#endif
                LOG_ERROR_STR(*buf);
             close(f);
             remove(buf);
@@ -920,7 +952,11 @@
   return cString(buffer, true);
 }
 
+#ifdef __FreeBSD__
+cString WeekDayNameReal(int WeekDay)
+#else
 cString WeekDayName(int WeekDay)
+#endif
 {
   char buffer[16];
   WeekDay = WeekDay == 0 ? 6 : WeekDay - 1; // we start with Monday==0!
@@ -938,10 +974,18 @@
 cString WeekDayName(time_t t)
 {
   struct tm tm_r;
+#ifdef __FreeBSD__
+  return WeekDayNameReal(localtime_r(&t, &tm_r)->tm_wday);
+#else
   return WeekDayName(localtime_r(&t, &tm_r)->tm_wday);
+#endif
 }
 
+#ifdef __FreeBSD__
+cString WeekDayNameFullReal(int WeekDay)
+#else
 cString WeekDayNameFull(int WeekDay)
+#endif
 {
   WeekDay = WeekDay == 0 ? 6 : WeekDay - 1; // we start with Monday==0!
   switch (WeekDay) {
@@ -959,7 +1003,11 @@
 cString WeekDayNameFull(time_t t)
 {
   struct tm tm_r;
+#ifdef __FreeBSD__
+  return WeekDayNameFullReal(localtime_r(&t, &tm_r)->tm_wday);
+#else
   return WeekDayNameFull(localtime_r(&t, &tm_r)->tm_wday);
+#endif
 }
 
 cString DayDateTime(time_t t)
@@ -969,7 +1017,11 @@
      time(&t);
   struct tm tm_r;
   tm *tm = localtime_r(&t, &tm_r);
+#ifdef __FreeBSD__
+  snprintf(buffer, sizeof(buffer), "%s %02d.%02d. %02d:%02d", *WeekDayNameReal(tm->tm_wday), tm->tm_mday, tm->tm_mon + 1, tm->tm_hour, tm->tm_min);
+#else
   snprintf(buffer, sizeof(buffer), "%s %02d.%02d. %02d:%02d", *WeekDayName(tm->tm_wday), tm->tm_mday, tm->tm_mon + 1, tm->tm_hour, tm->tm_min);
+#endif
   return buffer;
 }
 
@@ -988,7 +1040,11 @@
   char buf[32];
   struct tm tm_r;
   tm *tm = localtime_r(&t, &tm_r);
+#ifdef __FreeBSD__
+  char *p = stpcpy(buf, WeekDayNameReal(tm->tm_wday));
+#else
   char *p = stpcpy(buf, WeekDayName(tm->tm_wday));
+#endif
   *p++ = ' ';
   strftime(p, sizeof(buf) - (p - buf), "%d.%m.%Y", tm);
   return buf;
@@ -1315,7 +1371,11 @@
      if (!IsOpen()) {
         f = FileDes;
         if (f >= 0) {
+#ifdef __FreeBSD__
+           if ((uint)f < FD_SETSIZE) {
+#else
            if (f < FD_SETSIZE) {
+#endif
               if (f >= maxFiles)
                  maxFiles = f + 1;
               if (!files[f])
@@ -1356,7 +1416,11 @@
       if (files[i])
          FD_SET(i, &set);
       }
+#ifdef __FreeBSD__
+  if (0 <= FileDes && (uint)FileDes < FD_SETSIZE && !files[FileDes])
+#else
   if (0 <= FileDes && FileDes < FD_SETSIZE && !files[FileDes])
+#endif
      FD_SET(FileDes, &set); // in case we come in with an arbitrary descriptor
   if (TimeoutMs == 0)
      TimeoutMs = 10; // load gets too heavy with 0
@@ -1451,7 +1515,9 @@
 
 // --- cUnbufferedFile -------------------------------------------------------
 
+#ifndef __FreeBSD__
 #define USE_FADVISE
+#endif
 
 #define WRITE_BUFFER KILOBYTE(800)
 
@@ -1512,11 +1578,13 @@
   readahead = ra;
 }
 
+#ifdef USE_FADVISE
 int cUnbufferedFile::FadviseDrop(off_t Offset, off_t Len)
 {
   // rounding up the window to make sure that not PAGE_SIZE-aligned data gets freed.
   return posix_fadvise(fd, Offset - (FADVGRAN - 1), Len + (FADVGRAN - 1) * 2, POSIX_FADV_DONTNEED);
 }
+#endif
 
 off_t cUnbufferedFile::Seek(off_t Offset, int Whence)
 {
Index: tools.h
@@ -27,6 +27,12 @@
 #include <sys/stat.h>
 #include <sys/types.h>
 
+#ifdef __FreeBSD__
+#include <sys/param.h>
+typedef int (*__compar_fn_t) (__const void *, __const void *);
+#undef isnumber
+#endif
+
 typedef unsigned char uchar;
 
 extern int SysLogLevel;
@@ -227,12 +233,20 @@ bool SpinUpDisk(const char *FileName);
 void TouchFile(const char *FileName);
 time_t LastModifiedTime(const char *FileName);
 off_t FileSize(const char *FileName); ///< returns the size of the given file, or -1 in case of an error (e.g. if the file doesn't exist)
+#ifdef __FreeBSD__
+cString WeekDayNameReal(int WeekDay);
+#else
 cString WeekDayName(int WeekDay);
+#endif
     ///< Converts the given WeekDay (0=Sunday, 1=Monday, ...) to a three letter
     ///< day name.
 cString WeekDayName(time_t t);
     ///< Converts the week day of the given time to a three letter day name.
+#ifdef __FreeBSD__
+cString WeekDayNameFullReal(int WeekDay);
+#else
 cString WeekDayNameFull(int WeekDay);
+#endif
     ///< Converts the given WeekDay (0=Sunday, 1=Monday, ...) to a full
     ///< day name.
 cString WeekDayNameFull(time_t t);
Index: vdr.c
--- vdr.c
+++ vdr.c
@@ -32,8 +32,13 @@
 #include <pwd.h>
 #include <signal.h>
 #include <stdlib.h>
+#ifndef __FreeBSD__
 #include <sys/capability.h>
 #include <sys/prctl.h>
+#else
+#include <sys/types.h>
+#include <login_cap.h>
+#endif
 #include <termios.h>
 #include <unistd.h>
 #include "audio.h"
@@ -107,12 +112,15 @@ static bool SetUser(const char *UserName
         fprintf(stderr, "vdr: cannot set user id %u: %s\n", (unsigned int)user->pw_uid, strerror(errno));
         return false;
         }
+#ifndef __FreeBSD__
      if (UserDump && prctl(PR_SET_DUMPABLE, 1, 0, 0, 0) < 0)
         fprintf(stderr, "vdr: warning - cannot set dumpable: %s\n", strerror(errno));
+#endif
      }
   return true;
 }
 
+#ifndef __FreeBSD__
 static bool DropCaps(void)
 {
   // drop all capabilities except selected ones
@@ -139,6 +147,7 @@ static bool SetKeepCaps(bool On)
      }
   return true;
 }
+#endif
 
 static void SignalHandler(int signum)
 {
@@ -400,14 +409,18 @@ int main(int argc, char *argv[])
   if (VdrUser && geteuid() == 0) {
      StartedAsRoot = true;
      if (strcmp(VdrUser, "root")) {
+#ifndef __FreeBSD__
         if (!SetKeepCaps(true))
            return 2;
+#endif
         if (!SetUser(VdrUser, UserDump))
            return 2;
+#ifndef __FreeBSD__
         if (!SetKeepCaps(false))
            return 2;
         if (!DropCaps())
            return 2;
+#endif
         }
      }
 
@@ -556,6 +569,25 @@ int main(int argc, char *argv[])
            CodeSet++; // skip the dot
         }
      }
+#ifdef __FreeBSD__
+  // If we are started without a locale query login.conf(5) for
+  // a lang setting
+
+  if (!CodeSet || !strcmp(CodeSet, "US-ASCII")) {
+     struct passwd *User = getpwnam(VdrUser);
+     login_cap_t *Lc = login_getuserclass(User);
+     if (!Lc)
+        Lc = login_getpwclass(User);
+     if (Lc) {
+        const char *Lang = login_getcapstr(Lc, "lang", NULL, NULL);
+        if (Lang && setlocale(LC_CTYPE, Lang)) {
+           CodeSet = nl_langinfo(CODESET);
+           setenv("LANG", Lang, 1);
+           }
+        login_close(Lc);
+        }
+     }
+#endif
   if (CodeSet) {
      bool known = SI::SetSystemCharacterTable(CodeSet);
      isyslog("codeset is '%s' - %s", CodeSet, known ? "known" : "unknown");
Index: PLUGINS/src/svdrpdemo/svdrpdemo.c
===================================================================
RCS file: /progs/network/ccvs/vdr/PLUGINS/src/svdrpdemo/svdrpdemo.c,v
retrieving revision 1.1.1.2
retrieving revision 1.4
diff -u -r1.1.1.2 -r1.4
Index: libsi/headers.h
===================================================================
RCS file: /progs/network/ccvs/vdr/libsi/headers.h,v
retrieving revision 1.1.1.2
retrieving revision 1.3
diff -u -r1.1.1.2 -r1.3
--- libsi/headers.h	2010/02/17 10:14:45	1.1.1.2
+++ libsi/headers.h	2010/02/17 10:46:56	1.3
@@ -17,7 +17,11 @@
 #ifndef LIBSI_HEADERS_H
 #define LIBSI_HEADERS_H
 
+#ifdef __FreeBSD__
+#include <sys/endian.h>
+#else
 #include <endian.h>
+#endif
 
 namespace SI {
 
Index: libsi/si.c
===================================================================
RCS file: /progs/network/ccvs/vdr/libsi/si.c,v
retrieving revision 1.1.1.4
retrieving revision 1.7
diff -u -r1.1.1.4 -r1.7
--- libsi/si.c	2010/03/01 09:42:49	1.1.1.4
+++ libsi/si.c	2010/03/01 09:58:08	1.7
@@ -13,7 +13,9 @@
 #include "si.h"
 #include <errno.h>
 #include <iconv.h>
+#ifndef __FreeBSD__
 #include <malloc.h>
+#endif
 #include <stdlib.h> // for broadcaster stupidity workaround
 #include <string.h>
 #include "descriptor.h"
--- PLUGINS/src/dvbsddevice/Makefile.orig
+++ PLUGINS/src/dvbsddevice/Makefile
@@ -45,7 +45,7 @@ PACKAGE = vdr-$(ARCHIVE)
 
 ### Includes and Defines (add further entries here):
 
-INCLUDES += -I$(VDRDIR)/include
+INCLUDES = -I$(VDRDIR)/include -I${LOCALBASE}/include
 
 DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
 
@@ -100,7 +100,11 @@ i18n: $(I18Nmsgs) $(I18Npot)
 
 libvdr-$(PLUGIN).so: $(OBJS)
 	$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
-	@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
+ifdef FREEBSD
+	@cp -f $@ $(LIBDIR)/$@.$(APIVERSION)
+else
+ 	@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
+endif
 
 dist: $(I18Npo) clean
 	@-rm -rf $(TMPDIR)/$(ARCHIVE)
--- PLUGINS/src/hello/Makefile.orig
+++ PLUGINS/src/hello/Makefile
@@ -45,7 +45,7 @@ PACKAGE = vdr-$(ARCHIVE)
 
 ### Includes and Defines (add further entries here):
 
-INCLUDES += -I$(VDRDIR)/include
+INCLUDES = -I$(VDRDIR)/include -I${LOCALBASE}/include
 
 DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
 
@@ -100,7 +100,11 @@ i18n: $(I18Nmsgs)
 
 libvdr-$(PLUGIN).so: $(OBJS)
 	$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
-	@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
+ifdef FREEBSD
+	@cp -f $@ $(LIBDIR)/$@.$(APIVERSION)
+else
+ 	@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
+endif
 
 dist: $(I18Npo) clean
 	@-rm -rf $(TMPDIR)/$(ARCHIVE)
--- PLUGINS/src/osddemo/Makefile.orig
+++ PLUGINS/src/osddemo/Makefile
@@ -43,7 +43,7 @@ PACKAGE = vdr-$(ARCHIVE)
 
 ### Includes and Defines (add further entries here):
 
-INCLUDES += -I$(VDRDIR)/include
+INCLUDES = -I$(VDRDIR)/include -I${LOCALBASE}/include
 
 DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
 
@@ -73,7 +73,11 @@ $(DEPFILE): Makefile
 
 libvdr-$(PLUGIN).so: $(OBJS)
 	$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
-	@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
+ifdef FREEBSD
+	@cp -f $@ $(LIBDIR)/$@.$(APIVERSION)
+else
+ 	@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
+endif
 
 dist: clean
 	@-rm -rf $(TMPDIR)/$(ARCHIVE)
--- PLUGINS/src/pictures/Makefile.orig
+++ PLUGINS/src/pictures/Makefile
@@ -45,7 +45,7 @@ PACKAGE = vdr-$(ARCHIVE)
 
 ### Includes and Defines (add further entries here):
 
-INCLUDES += -I$(VDRDIR)/include
+INCLUDES = -I$(VDRDIR)/include -I${LOCALBASE}/include
 
 DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
 
@@ -100,7 +100,11 @@ i18n: $(I18Nmsgs) $(I18Npot)
 
 libvdr-$(PLUGIN).so: $(OBJS)
 	$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
-	@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
+ifdef FREEBSD
+	@cp -f $@ $(LIBDIR)/$@.$(APIVERSION)
+else
+ 	@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
+endif
 
 dist: $(I18Npo) clean
 	@-rm -rf $(TMPDIR)/$(ARCHIVE)
--- PLUGINS/src/servicedemo/Makefile.orig
+++ PLUGINS/src/servicedemo/Makefile
@@ -45,7 +45,7 @@ PACKAGE = vdr-$(ARCHIVE)
 
 ### Includes and Defines (add further entries here):
 
-INCLUDES += -I$(VDRDIR)/include
+INCLUDES = -I$(VDRDIR)/include -I${LOCALBASE}/include
 
 DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
 
@@ -75,11 +75,19 @@ $(DEPFILE): Makefile
 
 libvdr-$(PLUGIN1).so: $(PLUGIN1).o
 	$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN1).o -o $@
-	@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
+ifdef FREEBSD
+	@cp -f $@ $(LIBDIR)/$@.$(APIVERSION)
+else
+ 	@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
+endif
 
 libvdr-$(PLUGIN2).so: $(PLUGIN2).o
 	$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(PLUGIN2).o -o $@
-	@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
+ifdef FREEBSD
+	@cp -f $@ $(LIBDIR)/$@.$(APIVERSION)
+else
+ 	@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
+endif
 
 dist: clean
 	@-rm -rf $(TMPDIR)/$(ARCHIVE)
--- PLUGINS/src/skincurses/Makefile.orig
+++ PLUGINS/src/skincurses/Makefile
@@ -45,7 +45,7 @@ PACKAGE = vdr-$(ARCHIVE)
 
 ### Includes and Defines (add further entries here):
 
-INCLUDES += -I$(VDRDIR)/include
+INCLUDES = -I$(VDRDIR)/include -I${LOCALBASE}/include
 
 DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
 
@@ -100,7 +100,11 @@ i18n: $(I18Nmsgs) $(I18Npot)
 
 libvdr-$(PLUGIN).so: $(OBJS)
 	$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -lncursesw -o $@
-	@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
+ifdef FREEBSD
+	@cp -f $@ $(LIBDIR)/$@.$(APIVERSION)
+else
+ 	@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
+endif
 
 dist: $(I18Npo) clean
 	@-rm -rf $(TMPDIR)/$(ARCHIVE)
--- PLUGINS/src/status/Makefile.orig
+++ PLUGINS/src/status/Makefile
@@ -43,7 +43,7 @@ PACKAGE = vdr-$(ARCHIVE)
 
 ### Includes and Defines (add further entries here):
 
-INCLUDES += -I$(VDRDIR)/include
+INCLUDES = -I$(VDRDIR)/include -I${LOCALBASE}/include
 
 DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
 
@@ -73,7 +73,11 @@ $(DEPFILE): Makefile
 
 libvdr-$(PLUGIN).so: $(OBJS)
 	$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
-	@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
+ifdef FREEBSD
+	@cp -f $@ $(LIBDIR)/$@.$(APIVERSION)
+else
+ 	@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
+endif
 
 dist: clean
 	@-rm -rf $(TMPDIR)/$(ARCHIVE)
--- PLUGINS/src/svdrpdemo/Makefile.orig
+++ PLUGINS/src/svdrpdemo/Makefile
@@ -43,7 +43,7 @@ PACKAGE = vdr-$(ARCHIVE)
 
 ### Includes and Defines (add further entries here):
 
-INCLUDES += -I$(VDRDIR)/include
+INCLUDES = -I$(VDRDIR)/include -I${LOCALBASE}/include
 
 DEFINES += -D_GNU_SOURCE -DPLUGIN_NAME_I18N='"$(PLUGIN)"'
 
@@ -73,7 +73,11 @@ $(DEPFILE): Makefile
 
 libvdr-$(PLUGIN).so: $(OBJS)
 	$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
-	@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
+ifdef FREEBSD
+	@cp -f $@ $(LIBDIR)/$@.$(APIVERSION)
+else
+ 	@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
+endif
 
 dist: clean
 	@-rm -rf $(TMPDIR)/$(ARCHIVE)
--- PLUGINS/src/epgtableid0/Makefile.orig
+++ PLUGINS/src/epgtableid0/Makefile
@@ -100,7 +100,11 @@ i18n: $(I18Nmsgs) $(I18Npot)
 
 libvdr-$(PLUGIN).so: $(OBJS)
 	$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
+ifdef FREEBSD
+	@cp -f $@ $(LIBDIR)/$@.$(APIVERSION)
+else
 	@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
+endif
 
 dist: $(I18Npo) clean
 	@-rm -rf $(TMPDIR)/$(ARCHIVE)
--- PLUGINS/src/rcu/Makefile.orig
+++ PLUGINS/src/rcu/Makefile
@@ -100,7 +100,11 @@ i18n: $(I18Nmsgs) $(I18Npot)
 
 libvdr-$(PLUGIN).so: $(OBJS)
 	$(CXX) $(CXXFLAGS) $(LDFLAGS) -shared $(OBJS) -o $@
+ifdef FREEBSD
+	@cp -f $@ $(LIBDIR)/$@.$(APIVERSION)
+else
 	@cp --remove-destination $@ $(LIBDIR)/$@.$(APIVERSION)
+endif
 
 dist: $(I18Npo) clean
 	@-rm -rf $(TMPDIR)/$(ARCHIVE)

Youez - 2016 - github.com/yon3zu
LinuXploit