diff --git a/Makefile.am_client b/Makefile.am_client index 3f69ea37..a1b533cf 100644 --- a/Makefile.am_client +++ b/Makefile.am_client @@ -1,6 +1,6 @@ ACLOCAL_AMFLAGS = -I m4 bin_PROGRAMS = urbackup_client -urbackup_client_SOURCES = AcceptThread.cpp Client.cpp Database.cpp Query.cpp SelectThread.cpp Server.cpp ServerLinux.cpp ServiceAcceptor.cpp ServiceWorker.cpp SessionMgr.cpp StreamPipe.cpp Template.cpp WorkerThread.cpp main.cpp md5.cpp stringtools.cpp libfastcgi/fastcgi.cpp Mutex_lin.cpp LoadbalancerClient.cpp DBSettingsReader.cpp file_common.cpp file_fstream.cpp file_linux.cpp FileSettingsReader.cpp LookupService.cpp SettingsReader.cpp Table.cpp OutputStream.cpp ThreadPool.cpp MemoryPipe.cpp Condition_lin.cpp MemorySettingsReader.cpp sqlite/sqlite3.c sqlite/shell.c SQLiteFactory.cpp +urbackup_client_SOURCES = AcceptThread.cpp Client.cpp Database.cpp Query.cpp SelectThread.cpp Server.cpp ServerLinux.cpp ServiceAcceptor.cpp ServiceWorker.cpp SessionMgr.cpp StreamPipe.cpp Template.cpp WorkerThread.cpp main.cpp md5.cpp stringtools.cpp libfastcgi/fastcgi.cpp Mutex_lin.cpp LoadbalancerClient.cpp DBSettingsReader.cpp file_common.cpp file_fstream.cpp file_linux.cpp FileSettingsReader.cpp LookupService.cpp SettingsReader.cpp Table.cpp OutputStream.cpp ThreadPool.cpp MemoryPipe.cpp Condition_lin.cpp MemorySettingsReader.cpp sqlite/sqlite3.c sqlite/shell.c SQLiteFactory.cpp PipeThrottler.cpp urbackup_client_LDADD = -ldl bin_SCRIPTS = start_urbackup_client AM_CXXFLAGS = $(PTHREAD_CFLAGS) -DLINUX @@ -14,5 +14,5 @@ install-exec-local: defaults_client init.d_client mkdir -p "$(DESTDIR)$(localstatedir)/urbackup" mkdir -p "$(DESTDIR)$(localstatedir)/urbackup/data" -noinst_HEADERS=SessionMgr.h WorkerThread.h Helper_win32.h Database.h defaults.h ServiceAcceptor.h Query.h SettingsReader.h file.h Mutex_boost.h Condition_boost.h file_memory.h MemorySettingsReader.h Condition_lin.h LookupService.h Template.h types.h DBSettingsReader.h stringtools.h ThreadPool.h libs.h vld_.h ServiceWorker.h StreamPipe.h LoadbalancerClient.h socket_header.h FileSettingsReader.h SelectThread.h md5.h vld.h Table.h Client.h MemoryPipe.h Mutex_lin.h AcceptThread.h OutputStream.h Server.h Interface/SessionMgr.h Interface/Service.h Interface/PluginMgr.h Interface/Database.h Interface/Pipe.h Interface/CustomClient.h Interface/User.h Interface/Query.h Interface/SettingsReader.h Interface/Types.h Interface/Template.h Interface/ThreadPool.h Interface/Mutex.h Interface/File.h Interface/Condition.h Interface/Table.h Interface/Plugin.h Interface/Thread.h Interface/Action.h Interface/Object.h Interface/OutputStream.h Interface/Server.h libfastcgi/fastcgi.hpp sqlite/sqlite3.h sqlite/sqlite3ext.h utf8/utf8.h utf8/utf8/checked.h utf8/utf8/core.h utf8/utf8/unchecked.h cryptoplugin/ICryptoFactory.h cryptoplugin/IAESEncryption.h cryptoplugin/IAESDecryption.h Interface/DatabaseFactory.h Interface/DatabaseInt.h sqlite/shell.h SQLiteFactory.h +noinst_HEADERS=SessionMgr.h WorkerThread.h Helper_win32.h Database.h defaults.h ServiceAcceptor.h Query.h SettingsReader.h file.h Mutex_boost.h Condition_boost.h file_memory.h MemorySettingsReader.h Condition_lin.h LookupService.h Template.h types.h DBSettingsReader.h stringtools.h ThreadPool.h libs.h vld_.h ServiceWorker.h StreamPipe.h LoadbalancerClient.h socket_header.h FileSettingsReader.h SelectThread.h md5.h vld.h Table.h Client.h MemoryPipe.h Mutex_lin.h AcceptThread.h OutputStream.h Server.h Interface/SessionMgr.h Interface/Service.h Interface/PluginMgr.h Interface/Database.h Interface/Pipe.h Interface/CustomClient.h Interface/User.h Interface/Query.h Interface/SettingsReader.h Interface/Types.h Interface/Template.h Interface/ThreadPool.h Interface/Mutex.h Interface/File.h Interface/Condition.h Interface/Table.h Interface/Plugin.h Interface/Thread.h Interface/Action.h Interface/Object.h Interface/OutputStream.h Interface/Server.h libfastcgi/fastcgi.hpp sqlite/sqlite3.h sqlite/sqlite3ext.h utf8/utf8.h utf8/utf8/checked.h utf8/utf8/core.h utf8/utf8/unchecked.h cryptoplugin/ICryptoFactory.h cryptoplugin/IAESEncryption.h cryptoplugin/IAESDecryption.h Interface/DatabaseFactory.h Interface/DatabaseInt.h sqlite/shell.h SQLiteFactory.h PipeThrottler.h EXTRA_DIST=docs/start_urbackup_client.1 docs/urbackup_client.1 init.d_client defaults_client start_urbackup_client diff --git a/configure.ac_client b/configure.ac_client index c15826a0..36e2b941 100644 --- a/configure.ac_client +++ b/configure.ac_client @@ -2,7 +2,7 @@ # Process this file with autoconf to produce a configure script. AC_PREREQ(2.61) -AC_INIT([urbackup-client], [0.40.1], [martin@urbackup.org]) +AC_INIT([urbackup-client], [1.0], [martin@urbackup.org]) AC_CONFIG_SRCDIR([AcceptThread.cpp]) AC_CONFIG_HEADER([config.h]) AM_INIT_AUTOMAKE @@ -50,6 +50,6 @@ AC_FUNC_SELECT_ARGTYPES AC_FUNC_STRFTIME AC_CHECK_FUNCS([gettimeofday memset select socket strstr]) -AC_CONFIG_SUBDIRS([client fileservplugin fsimageplugin urbackup]) +AC_CONFIG_SUBDIRS([client cryptoplugin fileservplugin fsimageplugin urbackupclient]) AC_CONFIG_FILES([Makefile]) AC_OUTPUT diff --git a/cryptoplugin/m4/cryptopp.m4 b/cryptoplugin/m4/cryptopp.m4 new file mode 100644 index 00000000..0103944d --- /dev/null +++ b/cryptoplugin/m4/cryptopp.m4 @@ -0,0 +1,165 @@ +# -*- Autoconf -*- +# This file is part of the aMule Project. +# +# Copyright (c) 2003-2009 aMule Team ( admin@amule.org / http://www.amule.org ) +# +# Any parts of this program derived from the xMule, lMule or eMule project, +# or contributed by third-party developers are copyrighted by their +# respective authors. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA +# + +dnl -------------------------------------------------------------------------- +dnl MULE_CHECK_CRYPTOPP([VERSION = 5.1], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +dnl +dnl Check for cryptopp library +dnl -------------------------------------------------------------------------- +dnl +dnl This macro sets these variables: +dnl - CRYPTOPP_PREFIX +dnl This is the user or system directory where crypto++ is installed or sources +dnl - CRYPTOPP_VERSION_STRING +dnl Something like "5.5.2" +dnl - CRYPTOPP_VERSION_NUMBER +dnl Something like 5005002 +dnl - CRYPTOPP_STYLE +dnl "sources", "installed" or "gentoo_debian" +dnl - CRYPTOPP_LIB_NAME +dnl "cryptopp" or "crypto++" +dnl - CRYPTOPP_INCLUDE_PREFIX +dnl The string that goes here: #include <@CRYPTOPP_INCLUDE_PREFIX@/rsa.h> +dnl - CRYPTOPP_CPPFLAGS +dnl Flags to be added to CPPFLAGS +dnl - CRYPTOPP_LDFLAGS +dnl Flags to be added to LDFLAGS +dnl - CRYPTOPP_LIBS +dnl Library to be added to LIBS +dnl +dnl The CRYPTOPP_CPPFLAGS, CRYPTOPP_LDFLAGS and CRYPTOPP_LIBS variables are also substituted. +dnl +dnl Worth notice: +dnl - cryptopp_includedir +dnl The string that goes in -I on CPPFLAGS +dnl - cryptopp_libdir +dnl The string that goes in -L on LDFLAGS +dnl - cryptopp_header_path +dnl The file we use to discover the version of cryptopp +dnl +AC_DEFUN([MULE_CHECK_CRYPTOPP], +[dnl +AC_REQUIRE([AC_PROG_EGREP])dnl +m4_define([MIN_CRYPTO_VERSION], [m4_ifval([$1], [$1], [5.1])])dnl + + AC_ARG_WITH([crypto-prefix], + [AS_HELP_STRING([--with-crypto-prefix=PREFIX], [prefix where crypto++ is installed])]) + + AC_MSG_CHECKING([for crypto++ version >= MIN_CRYPTO_VERSION]) + + cryptopp_file_with_version="cryptlib.h" + + CRYPTOPP_STYLE="unknown" + CRYPTOPP_LIB_NAME="unknown" + cryptopp_includedir="unknown" + CRYPTOPP_INCLUDE_PREFIX="unknown" + cryptopp_libdir="unknown" + + AS_IF([test -n "$with_crypto_prefix"], [ + # Find the Cryptopp header in the user-provided location + AS_IF([test -f $with_crypto_prefix/$cryptopp_file_with_version], [ + CRYPTOPP_STYLE="sources" + CRYPTOPP_LIB_NAME="cryptopp" + cryptopp_includedir= + CRYPTOPP_INCLUDE_PREFIX="$with_crypto_prefix" + cryptopp_libdir= + ], AS_IF([test -f $with_crypto_prefix/include/cryptopp/$cryptopp_file_with_version], [ + CRYPTOPP_STYLE="installed" + CRYPTOPP_LIB_NAME="cryptopp" + cryptopp_includedir="$with_crypto_prefix/include" + CRYPTOPP_INCLUDE_PREFIX="$CRYPTOPP_LIB_NAME" + cryptopp_libdir="$with_crypto_prefix/lib" + ], AS_IF([test -f $with_crypto_prefix/include/crypto++/$cryptopp_file_with_version], [ + # Debian uses libcrypto++5.1 - it's not my fault, please soda patch the package + CRYPTOPP_STYLE="gentoo_debian" + CRYPTOPP_LIB_NAME="crypto++" + cryptopp_includedir="$with_crypto_prefix/include" + CRYPTOPP_INCLUDE_PREFIX="$CRYPTOPP_LIB_NAME" + cryptopp_libdir="$with_crypto_prefix/lib" + ]))) + ], [ + for CRYPTOPP_PREFIX in /usr /usr/local /opt /opt/local /usr/pkg /mingw ; do + # Find the Cryptopp header in system locations + AS_IF([test -f $CRYPTOPP_PREFIX/$cryptopp_file_with_version], [ + CRYPTOPP_STYLE="sources" + CRYPTOPP_LIB_NAME="cryptopp" + cryptopp_includedir= + CRYPTOPP_INCLUDE_PREFIX="$CRYPTOPP_PREFIX" + cryptopp_libdir= + break + ], AS_IF([test -f $CRYPTOPP_PREFIX/include/cryptopp/$cryptopp_file_with_version], [ + CRYPTOPP_STYLE="installed" + CRYPTOPP_LIB_NAME="cryptopp" + cryptopp_includedir="$CRYPTOPP_PREFIX/include" + CRYPTOPP_INCLUDE_PREFIX="$CRYPTOPP_LIB_NAME" + cryptopp_libdir="$CRYPTOPP_PREFIX/lib" + break + ], AS_IF([test -f $CRYPTOPP_PREFIX/include/crypto++/$cryptopp_file_with_version], [ + # Debian uses libcrypto++5.1 - it's not my fault, please soda patch the package + CRYPTOPP_STYLE="gentoo_debian" + CRYPTOPP_LIB_NAME="crypto++" + cryptopp_includedir="$CRYPTOPP_PREFIX/include" + CRYPTOPP_INCLUDE_PREFIX="$CRYPTOPP_LIB_NAME" + cryptopp_libdir="$CRYPTOPP_PREFIX/lib" + break + ]))) + done + ]) + + AS_IF([test $CRYPTOPP_STYLE = "unknown"], [result=no; resultstr=""], [ + # Find out the crypto++ version and check against the minimum required + cryptopp_header_path="${cryptopp_includedir+$cryptopp_includedir/}$CRYPTOPP_INCLUDE_PREFIX/$cryptopp_file_with_version" + CRYPTOPP_VERSION_STRING=`$EGREP "Reference Manual|API Reference" $cryptopp_header_path | sed -e ['s/[^0-9]*\([0-9.]*\).*/\1/']` + CRYPTOPP_VERSION_NUMBER=`echo $CRYPTOPP_VERSION_STRING | $AWK 'BEGIN { FS = "."; } { printf "%d", ([$]1 * 1000 + [$]2) * 1000 + [$]3;}'` + minvers=`echo MIN_CRYPTO_VERSION | $AWK 'BEGIN { FS = "."; } { printf "%d", ([$]1 * 1000 + [$]2) * 1000 + [$]3;}'` + + AS_IF([test -n "$CRYPTOPP_VERSION_NUMBER" && test "$CRYPTOPP_VERSION_NUMBER" -ge $minvers], [ + result=yes + resultstr=" (version $CRYPTOPP_VERSION_STRING, $CRYPTOPP_STYLE)" + AS_IF([test -n "$cryptopp_includedir"], [CRYPTOPP_CPPFLAGS="-I$cryptopp_includedir"], [CRYPTOPP_CPPFLAGS=]) + AS_IF([test -n "$cryptopp_libdir"], [ + CRYPTOPP_LDFLAGS="-L$cryptopp_libdir" + CRYPTOPP_LIBS="-l$CRYPTOPP_LIB_NAME" + ], [ + CRYPTOPP_LDFLAGS= + CRYPTOPP_LIBS="${CRYPTOPP_INCLUDE_PREFIX}/lib${CRYPTOPP_LIB_NAME}.a" + ]) + AH_TEMPLATE([CRYPTOPP_INCLUDE_PREFIX], [Define this to the include prefix of crypto++]) + AC_DEFINE_UNQUOTED([CRYPTOPP_INCLUDE_PREFIX], $CRYPTOPP_INCLUDE_PREFIX) + ], [ + result=no + resultstr=" (version $CRYPTOPP_VERSION_STRING is not new enough)" + ]) + ]) + + AC_MSG_RESULT([$result$resultstr]) + + AS_IF([test ${result:-no} = yes], [$2], [$3]) + +dnl Exported symbols +AC_SUBST([CRYPTOPP_CPPFLAGS])dnl +AC_SUBST([CRYPTOPP_LDFLAGS])dnl +AC_SUBST([CRYPTOPP_LIBS])dnl +m4_undefine([MIN_CRYPTO_VERSION])dnl +]) diff --git a/fileservplugin/CClientThread.cpp b/fileservplugin/CClientThread.cpp index d2d6df9a..701fada6 100644 --- a/fileservplugin/CClientThread.cpp +++ b/fileservplugin/CClientThread.cpp @@ -33,7 +33,7 @@ #include "ChunkSendThread.h" #include - +#include #define CLIENT_TIMEOUT 120 #define CHECK_BASE_PATH @@ -166,7 +166,7 @@ void CClientThread::EnableNagle(void) { once=false; int opt=1; - int err=setsockopt(mSocket, IPPROTO_TCP, TCP_CORK, (char*)&opt, sizeof(int) ); + int err=setsockopt(int_socket, IPPROTO_TCP, TCP_CORK, (char*)&opt, sizeof(int) ); if( err==SOCKET_ERROR ) { Log("Error: Setting TCP_CORK failed. errno: "+nconvert(errno), LL_WARNING); @@ -655,7 +655,7 @@ bool CClientThread::ProcessPacket(CRData *data) size_t count=(std::max)((size_t)s_bsize, (size_t)(filesize-foffset)); if( clientpipe==NULL && ( id==ID_GET_FILE || id==ID_GET_FILE_RESUME ) ) { - sendfile64(mSocket, hFile, &foffset, count); + sendfile64(int_socket, hFile, &foffset, count); } else { @@ -665,7 +665,7 @@ bool CClientThread::ProcessPacket(CRData *data) rc=SendInt(buf, rc); if(rc==SOCKET_ERROR) { - LOG("Error: Sending data failed"); + Log("Error: Sending data failed"); CloseHandle(hFile); return false; } @@ -1062,7 +1062,7 @@ bool CClientThread::GetFileBlockdiff(CRData *data) if(hFile == INVALID_HANDLE_VALUE) { - hFile=NULL; + hFile=(HANDLE)NULL; #ifdef CHECK_BASE_PATH std::wstring basePath=map_file(getuntil(L"/",o_filename)+L"/"); if(!isDirectory(basePath)) @@ -1094,10 +1094,17 @@ bool CClientThread::GetFileBlockdiff(CRData *data) sendfilepart=0; sent_bytes=0; +#ifdef _WIN32 LARGE_INTEGER filesize; GetFileSizeEx(hFile, &filesize); curr_filesize=filesize.QuadPart; +#else + struct stat64 stat_buf; + fstat64(hFile, &stat_buf); + + curr_filesize=stat_buf.st_size; +#endif next_checkpoint=start_offset+c_checkpoint_dist; if(next_checkpoint>curr_filesize) @@ -1106,7 +1113,7 @@ bool CClientThread::GetFileBlockdiff(CRData *data) CWData sdata; sdata.addUChar(ID_FILESIZE); - sdata.addUInt64(filesize.QuadPart); + sdata.addUInt64(curr_filesize); SendInt(sdata.getDataPtr(), sdata.getDataSize()); if(mutex==NULL) @@ -1119,7 +1126,7 @@ bool CClientThread::GetFileBlockdiff(CRData *data) if(chunk_send_thread_ticket==ILLEGAL_THREADPOOL_TICKET) { - IFile * tf=Server->openFileFromHandle(hFile); + IFile * tf=Server->openFileFromHandle((void*)hFile); if(tf==NULL) { Log("Could not open file from handle", LL_ERROR); @@ -1130,14 +1137,14 @@ bool CClientThread::GetFileBlockdiff(CRData *data) else { IScopedLock lock(mutex); - update_file=Server->openFileFromHandle(hFile); + update_file=Server->openFileFromHandle((void*)hFile); if(update_file==NULL) { Log("Could not open update file from handle", LL_ERROR); } cond->notify_all(); } - hFile=NULL; + hFile=(HANDLE)NULL; return true; } diff --git a/fileservplugin/CClientThread.h b/fileservplugin/CClientThread.h index 8e43e3c4..85e0efee 100644 --- a/fileservplugin/CClientThread.h +++ b/fileservplugin/CClientThread.h @@ -6,6 +6,8 @@ #include #include #define MSG_NOSIGNAL 0 +#else +#define HANDLE int #endif #include diff --git a/fileservplugin/Makefile.am b/fileservplugin/Makefile.am index c933e984..031fb04e 100644 --- a/fileservplugin/Makefile.am +++ b/fileservplugin/Makefile.am @@ -1,4 +1,4 @@ lib_LTLIBRARIES = liburbackupclient_fileservplugin.la -liburbackupclient_fileservplugin_la_SOURCES = dllmain.cpp ../stringtools.cpp bufmgr.cpp CampusThread.cpp CClientThread.cpp CriticalSection.cpp CTCPFileServ.cpp CUDPThread.cpp data.cpp download.cpp FileServ.cpp FileServFactory.cpp log.cpp main.cpp map_buffer.cpp pluginmgr.cpp tcpstack.cpp -noinst_HEADERS = bufmgr.h CUDPThread.h FileServFactory.h IFileServ.h packet_ids.h socket_header.h CampusThread.h CriticalSection.h data.h FileServ.h log.h pluginmgr.h tcpstack.h CClientThread.h CTCPFileServ.h download.h IFileServFactory.h map_buffer.h settings.h types.h +liburbackupclient_fileservplugin_la_SOURCES = dllmain.cpp ../stringtools.cpp bufmgr.cpp CampusThread.cpp CClientThread.cpp CriticalSection.cpp CTCPFileServ.cpp CUDPThread.cpp data.cpp download.cpp FileServ.cpp FileServFactory.cpp log.cpp main.cpp map_buffer.cpp pluginmgr.cpp ../urbackupcommon/fileclient/tcpstack.cpp +noinst_HEADERS = bufmgr.h CUDPThread.h FileServFactory.h IFileServ.h packet_ids.h socket_header.h CampusThread.h CriticalSection.h data.h FileServ.h log.h pluginmgr.h ../urbackupcommon/fileclient/tcpstack.h CClientThread.h CTCPFileServ.h download.h IFileServFactory.h map_buffer.h settings.h types.h AM_CXXFLAGS = -DLINUX \ No newline at end of file diff --git a/urbackupclient/client.cpp b/urbackupclient/client.cpp index 8b6a98f2..a33a5545 100644 --- a/urbackupclient/client.cpp +++ b/urbackupclient/client.cpp @@ -1421,6 +1421,7 @@ void IndexThread::execute_postbackup_hook(void) pid1 = fork(); if( pid1==0 ) { + setsid(); pid_t pid2; pid2 = fork(); if(pid2==0)