diff options
author | Martin Ebourne <martin@ebourne.me.uk> | 2005-11-30 23:14:40 +0000 |
---|---|---|
committer | Martin Ebourne <martin@ebourne.me.uk> | 2005-11-30 23:14:40 +0000 |
commit | 01ca97865fa9d6ed1a967e970927265f1c348289 (patch) | |
tree | 5e7e1f70b38b156994c3802ba3e77fbf288fe937 | |
parent | 99f8ce096bc5569adbfea1911dbcda24c28d8d8b (diff) |
Merged martin/solaris at r9 to trunk
-rwxr-xr-x | bin/bbackupd/BackupDaemon.cpp | 49 | ||||
-rw-r--r-- | infrastructure/BoxPlatform.pm | 15 | ||||
-rwxr-xr-x | infrastructure/makebuildenv.pl | 8 | ||||
-rwxr-xr-x | infrastructure/makeparcels.pl | 4 | ||||
-rwxr-xr-x | lib/common/BoxPlatform.h | 49 | ||||
-rwxr-xr-x | lib/common/NamedLock.cpp | 30 | ||||
-rwxr-xr-x | lib/raidfile/RaidFileRead.cpp | 30 | ||||
-rwxr-xr-x | lib/raidfile/RaidFileUtil.cpp | 8 | ||||
-rwxr-xr-x | lib/raidfile/RaidFileWrite.cpp | 23 | ||||
-rwxr-xr-x | lib/server/Daemon.cpp | 14 | ||||
-rwxr-xr-x | lib/server/Protocol.cpp | 31 | ||||
-rwxr-xr-x | lib/server/SocketStreamTLS.cpp | 17 | ||||
-rwxr-xr-x | test/backupstore/testbackupstore.cpp | 24 | ||||
-rwxr-xr-x | test/common/testcommon.cpp | 2 | ||||
-rwxr-xr-x | test/raidfile/intercept.cpp | 10 | ||||
-rwxr-xr-x | test/raidfile/testraidfile.cpp | 2 |
16 files changed, 240 insertions, 76 deletions
diff --git a/bin/bbackupd/BackupDaemon.cpp b/bin/bbackupd/BackupDaemon.cpp index 7aa21a87..bc07ee21 100755 --- a/bin/bbackupd/BackupDaemon.cpp +++ b/bin/bbackupd/BackupDaemon.cpp @@ -15,7 +15,12 @@ #include <sys/mount.h> #include <signal.h> #ifdef PLATFORM_USES_MTAB_FILE_FOR_MOUNTS - #include <mntent.h> + #ifdef PLATFORM_SUNOS + #include <cstdio> + #include <sys/mnttab.h> + #else + #include <mntent.h> + #endif #endif #include <sys/wait.h> @@ -953,21 +958,53 @@ void BackupDaemon::SetupLocations(BackupClientContext &rClientContext, const Con int numIDMaps = 0; #ifdef PLATFORM_USES_MTAB_FILE_FOR_MOUNTS - // Linux can't tell you where a directory is mounted. So we have to - // read the mount entries from /etc/mtab! Bizarre that the OS itself - // can't tell you, but there you go. + // Linux and others can't tell you where a directory is mounted. So we + // have to read the mount entries from /etc/mtab! Bizarre that the OS + // itself can't tell you, but there you go. std::set<std::string, mntLenCompare> mountPoints; // BLOCK FILE *mountPointsFile = 0; +#ifdef PLATFORM_SUNOS + // Open mounts file + mountPointsFile = ::fopen("/etc/mnttab", "r"); + if(mountPointsFile == 0) + { + THROW_EXCEPTION(CommonException, OSFileError); + } + try { + + // Read all the entries, and put them in the set + struct mnttab entry; + while(getmntent(mountPointsFile, &entry) == 0) + { + TRACE1("Found mount point at %s\n", entry.mnt_mountp); + mountPoints.insert(std::string(entry.mnt_mountp)); + } + + // Close mounts file + ::fclose(mountPointsFile); + } + catch(...) + { + ::fclose(mountPointsFile); + throw; + } +#else // Open mounts file + mountPointsFile = ::setmntent("/proc/mounts", "r"); + if(mountPointsFile == 0) + { mountPointsFile = ::setmntent("/etc/mtab", "r"); + } if(mountPointsFile == 0) { THROW_EXCEPTION(CommonException, OSFileError); } + try + { // Read all the entries, and put them in the set struct mntent *entry = 0; while((entry = ::getmntent(mountPointsFile)) != 0) @@ -981,12 +1018,10 @@ void BackupDaemon::SetupLocations(BackupClientContext &rClientContext, const Con } catch(...) { - if(mountPointsFile != 0) - { ::endmntent(mountPointsFile); - } throw; } +#endif // Check sorting and that things are as we expect ASSERT(mountPoints.size() > 0); #ifndef NDEBUG diff --git a/infrastructure/BoxPlatform.pm b/infrastructure/BoxPlatform.pm index 4c8280a3..0549b39a 100644 --- a/infrastructure/BoxPlatform.pm +++ b/infrastructure/BoxPlatform.pm @@ -1,7 +1,7 @@ package BoxPlatform; use Exporter; @ISA = qw/Exporter/; -@EXPORT = qw/$build_os $make_command $bsd_make $platform_define $gcc_v3 $gcc_v4 $product_version $product_name $install_into_dir $sub_make_options $platform_compile_line_extra $platform_link_line_extra/; +@EXPORT = qw/$build_os $build_cpu $make_command $bsd_make $platform_define $platform_cpu $gcc_v3 $gcc_v4 $product_version $product_name $install_into_dir $sub_make_options $platform_compile_line_extra $platform_link_line_extra/; BEGIN { @@ -9,13 +9,17 @@ BEGIN # which OS are we building under? $build_os = `uname`; chomp $build_os; + $build_cpu = `uname -p`; + chomp $build_cpu; # Cygwin Builds usually something like CYGWIN_NT-5.0, CYGWIN_NT-5.1 # Box Backup tried on Win2000,XP only :) + $build_os = 'CYGWIN' if $build_os =~ m/CYGWIN/; - $make_command = ($build_os ne 'Darwin')?'make':'bsdmake'; - $bsd_make = ($build_os ne 'Linux' && $build_os ne 'CYGWIN'); + $make_command = ($build_os eq 'Darwin') ? 'bsdmake' : ($build_os eq 'SunOS') ? 'gmake' : 'make'; + $bsd_make = ($build_os ne 'Linux' && $build_os ne 'CYGWIN' && $build_os ne "SunOS"); $platform_define = 'PLATFORM_'.uc($build_os); + $platform_cpu = 'PLATFORM_'.uc($build_cpu); # blank extra flags by default $platform_compile_line_extra = ''; @@ -63,6 +67,11 @@ BEGIN $platform_link_line_extra = '-L/sw/lib '; } } + + if($build_os eq 'SunOS') + { + $platform_link_line_extra = '-lrt '; + } } sub make_flag diff --git a/infrastructure/makebuildenv.pl b/infrastructure/makebuildenv.pl index 99455cc2..ecac6939 100755 --- a/infrastructure/makebuildenv.pl +++ b/infrastructure/makebuildenv.pl @@ -758,13 +758,13 @@ CXX = g++ AR = ar RANLIB = ranlib .ifdef RELEASE -CXXFLAGS = -DNDEBUG -O2 -Wall $include_paths -D$platform_define$extra_platform_defines -DBOX_VERSION="\\"$product_version\\"" +CXXFLAGS = -DNDEBUG -O2 -Wall $include_paths -D$platform_define -D$platform_cpu$extra_platform_defines -DBOX_VERSION="\\"$product_version\\"" OUTBASE = ../../release OUTDIR = ../../release/$mod DEPENDMAKEFLAGS = -D RELEASE VARIENT = RELEASE .else -CXXFLAGS = -g -Wall $include_paths -D$platform_define$extra_platform_defines -DBOX_VERSION="\\"$product_version\\"" +CXXFLAGS = -g -Wall $include_paths -D$platform_define -D$platform_cpu$extra_platform_defines -DBOX_VERSION="\\"$product_version\\"" OUTBASE = ../../debug OUTDIR = ../../debug/$mod DEPENDMAKEFLAGS = @@ -886,7 +886,7 @@ __E # run make for things we require for my $dep (@all_deps_for_module) { - $deps_makeinfo .= "\t\t(cd ../../$dep; $make_command$sub_make_options \$(DEPENDMAKEFLAGS) -D NODEPS)\n"; + $deps_makeinfo .= "\t\t(cd ../../$dep; \$(MAKE)$sub_make_options \$(DEPENDMAKEFLAGS) -D NODEPS)\n"; } $deps_makeinfo .= ".\tendif\n.endif\n\n"; } @@ -960,7 +960,7 @@ __E print MAKE "clean:\n\t-rm -rf \$(OUTDIR)/*\n.\tifndef SUBCLEAN\n"; for my $dep (@all_deps_for_module) { - print MAKE "\t(cd ../../$dep; $make_command \$(DEPENDMAKEFLAGS) -D SUBCLEAN clean)\n"; + print MAKE "\t(cd ../../$dep; \$(MAKE) \$(DEPENDMAKEFLAGS) -D SUBCLEAN clean)\n"; } print MAKE ".\tendif\n"; diff --git a/infrastructure/makeparcels.pl b/infrastructure/makeparcels.pl index 6cd3e8f2..29694326 100755 --- a/infrastructure/makeparcels.pl +++ b/infrastructure/makeparcels.pl @@ -99,7 +99,7 @@ for my $parcel (@parcels) if($type eq 'bin') { my $exeext = ($build_os eq 'CYGWIN')?'.exe':''; - print MAKE "\t(cd bin/$name; $make_command $release_flag)\n"; + print MAKE "\t(cd bin/$name; \$(MAKE) $release_flag)\n"; print MAKE "\tcp release/bin/$name/$name$exeext $dir\n"; } elsif ($type eq 'script') @@ -144,7 +144,7 @@ __E for(@parcels) { - print INSTALLMSG " make install-".$_."\n"; + print INSTALLMSG " $make_command install-".$_."\n"; } print INSTALLMSG "\n"; diff --git a/lib/common/BoxPlatform.h b/lib/common/BoxPlatform.h index 716366d2..3b75f992 100755 --- a/lib/common/BoxPlatform.h +++ b/lib/common/BoxPlatform.h @@ -133,7 +133,7 @@ #define PLATFORM_stat_SHORT_mtime #define PLATFORM_stat_NO_st_flags #define PLATFORM_USES_MTAB_FILE_FOR_MOUNTS - #define PLATFORM_open_NO_O_EXLOCK + #define PLATFORM_open_USE_flock #define PLATFORM_sockaddr_NO_len #define PLATFORM_RANDOM_DEVICE "/dev/urandom" @@ -145,6 +145,41 @@ #endif // PLATFORM_LINUX +#ifdef PLATFORM_SUNOS + + #include <sys/types.h> + + // for ntohl etc... + #include <netinet/in.h> + + // types 'missing' + typedef uint8_t u_int8_t; +// typedef signed char int8_t; + typedef uint32_t u_int32_t; + typedef uint16_t u_int16_t; + typedef uint64_t u_int64_t; + + // not defined in Solaris, a BSD thing + #define INFTIM -1 + + //#define LLONG_MAX 9223372036854775807LL + //#define LLONG_MIN (-LLONG_MAX - 1LL) + + #define PLATFORM_STATIC_TEMP_DIRECTORY_NAME "/tmp" + + #define PLATFORM_BERKELEY_DB_NOT_SUPPORTED + #define PLATFORM_KQUEUE_NOT_SUPPORTED // This may be in Solaris 10 + #define PLATFORM_dirent_BROKEN_d_type // Well, no d_type at all actually + #define PLATFORM_stat_SHORT_mtime + #define PLATFORM_stat_NO_st_flags + #define PLATFORM_USES_MTAB_FILE_FOR_MOUNTS + #define PLATFORM_open_USE_fcntl + #define PLATFORM_sockaddr_NO_len + + #define PLATFORM_RANDOM_DEVICE "/dev/urandom" + +#endif // PLATFORM_SUNOS + #ifdef PLATFORM_CYGWIN #define PLATFORM_BERKELEY_DB_NOT_SUPPORTED @@ -154,7 +189,7 @@ #define PLATFORM_stat_SHORT_mtime #define PLATFORM_stat_NO_st_flags #define PLATFORM_USES_MTAB_FILE_FOR_MOUNTS - #define PLATFORM_open_NO_O_EXLOCK + #define PLATFORM_open_USE_flock #define PLATFORM_sockaddr_NO_len #define PLATFORM_NO_BUILT_IN_SWAP64 @@ -192,6 +227,16 @@ #endif // PLATFORM_CYGWIN +// Check the processor type +#ifdef PLATFORM_SPARC + #define PLATFORM_ALIGN_INT +#endif + +#ifdef PLATFORM_ARM + #define PLATFORM_ALIGN_INT +#endif + + // Find out if credentials on UNIX sockets can be obtained #ifndef PLATFORM_HAVE_getpeereid #ifndef PLATFORM_HAVE_getsockopt_SO_PEERCRED diff --git a/lib/common/NamedLock.cpp b/lib/common/NamedLock.cpp index 1f6e038a..8953db89 100755 --- a/lib/common/NamedLock.cpp +++ b/lib/common/NamedLock.cpp @@ -12,12 +12,9 @@ #include <fcntl.h> #include <errno.h> #include <unistd.h> -#ifdef PLATFORM_LINUX +#ifdef PLATFORM_open_USE_flock #include <sys/file.h> -#endif // PLATFORM_LINUX -#ifdef PLATFORM_CYGWIN - #include <sys/file.h> -#endif // PLATFORM_CYGWIN +#endif // PLATFORM_open_USE_flock #include "NamedLock.h" #include "CommonException.h" @@ -71,12 +68,14 @@ bool NamedLock::TryAndGetLock(const char *Filename, int mode) } // See if the lock can be got -#ifdef PLATFORM_open_NO_O_EXLOCK +#if defined(PLATFORM_open_USE_flock) || defined(PLATFORM_open_USE_fcntl) int fd = ::open(Filename, O_WRONLY | O_CREAT | O_TRUNC, mode); if(fd == -1) { THROW_EXCEPTION(CommonException, OSFileError) } + +#ifdef PLATFORM_open_USE_flock if(::flock(fd, LOCK_EX | LOCK_NB) != 0) { ::close(fd); @@ -89,6 +88,25 @@ bool NamedLock::TryAndGetLock(const char *Filename, int mode) THROW_EXCEPTION(CommonException, OSFileError) } } +#else + struct flock desc; + desc.l_type = F_WRLCK; + desc.l_whence = SEEK_SET; + desc.l_start = 0; + desc.l_len = 0; + if(::fcntl(fd, F_SETLK, &desc) != 0) + { + ::close(fd); + if(errno == EAGAIN) + { + return false; + } + else + { + THROW_EXCEPTION(CommonException, OSFileError) + } + } +#endif // Success mFileDescriptor = fd; diff --git a/lib/raidfile/RaidFileRead.cpp b/lib/raidfile/RaidFileRead.cpp index fed22ac0..6314ba90 100755 --- a/lib/raidfile/RaidFileRead.cpp +++ b/lib/raidfile/RaidFileRead.cpp @@ -317,11 +317,7 @@ RaidFileRead_Raid::RaidFileRead_Raid(int SetNumber, const std::string &Filename, mEOF(false) { // Make sure size of the IOStream::pos_type matches the pos_type used -#ifdef PLATFORM_LINUX ASSERT(sizeof(pos_type) >= sizeof(off_t)); -#else - ASSERT(sizeof(pos_type) == sizeof(off_t)); -#endif // Sanity check handles if(mStripe1Handle != -1 && mStripe2Handle != -1) @@ -1546,18 +1542,22 @@ bool RaidFileRead::ReadDirectoryContents(int SetNumber, const std::string &rDirN continue; } + // Entry... + std::string name; + unsigned int countToAdd = 1; + // stat the file to find out what type it is -/* struct stat st; +#ifdef PLATFORM_SUNOS + struct stat st; std::string fullName(dn + DIRECTORY_SEPARATOR + en->d_name); - if(::stat(fullName.c_str(), &st) != 0) + if(::lstat(fullName.c_str(), &st) != 0) { THROW_EXCEPTION(RaidFileException, OSError) - }*/ - - // Entry... - std::string name; - unsigned int countToAdd = 1; - if(DirReadType == DirReadType_FilesOnly && en->d_type == DT_REG) // (st.st_mode & S_IFDIR) == 0) + } + if(DirReadType == DirReadType_FilesOnly && (st.st_mode & S_IFDIR) == 0) +#else + if(DirReadType == DirReadType_FilesOnly && en->d_type == DT_REG) +#endif { // File. Complex, need to check the extension int dot = -1; @@ -1585,7 +1585,11 @@ bool RaidFileRead::ReadDirectoryContents(int SetNumber, const std::string &rDirN } } } - if(DirReadType == DirReadType_DirsOnly && en->d_type == DT_DIR) // (st.st_mode & S_IFDIR)) +#ifdef PLATFORM_SUNOS + if(DirReadType == DirReadType_DirsOnly && (st.st_mode & S_IFDIR)) +#else + if(DirReadType == DirReadType_DirsOnly && en->d_type == DT_DIR) +#endif { // Directory, and we want directories name = en->d_name; diff --git a/lib/raidfile/RaidFileUtil.cpp b/lib/raidfile/RaidFileUtil.cpp index 9177c8ba..c71bb2df 100755 --- a/lib/raidfile/RaidFileUtil.cpp +++ b/lib/raidfile/RaidFileUtil.cpp @@ -54,7 +54,7 @@ RaidFileUtil::ExistType RaidFileUtil::RaidFileExists(RaidFileDiscSet &rDiscSet, if(pRevisionID != 0) { (*pRevisionID) = FileModificationTime(st); -#ifdef PLATFORM_LINUX +#ifdef PLATFORM_stat_SHORT_mtime // On linux, the time resolution is very low for modification times. // So add the size to it to give a bit more chance of it changing. // TODO: Make this better. @@ -71,7 +71,7 @@ RaidFileUtil::ExistType RaidFileUtil::RaidFileExists(RaidFileDiscSet &rDiscSet, int64_t revisionID = 0; int setSize = rDiscSet.size(); int rfCount = 0; -#ifdef PLATFORM_LINUX +#ifdef PLATFORM_stat_SHORT_mtime // TODO: replace this with better linux revision ID detection int64_t revisionIDplus = 0; #endif @@ -92,7 +92,7 @@ RaidFileUtil::ExistType RaidFileUtil::RaidFileExists(RaidFileDiscSet &rDiscSet, { int64_t rid = FileModificationTime(st); if(rid > revisionID) revisionID = rid; -#ifdef PLATFORM_LINUX +#ifdef PLATFORM_stat_SHORT_mtime revisionIDplus += st.st_size; #endif } @@ -101,7 +101,7 @@ RaidFileUtil::ExistType RaidFileUtil::RaidFileExists(RaidFileDiscSet &rDiscSet, if(pRevisionID != 0) { (*pRevisionID) = revisionID; -#ifdef PLATFORM_LINUX +#ifdef PLATFORM_stat_SHORT_mtime (*pRevisionID) += revisionIDplus; #endif } diff --git a/lib/raidfile/RaidFileWrite.cpp b/lib/raidfile/RaidFileWrite.cpp index 414f24e6..987aa22c 100755 --- a/lib/raidfile/RaidFileWrite.cpp +++ b/lib/raidfile/RaidFileWrite.cpp @@ -112,10 +112,21 @@ void RaidFileWrite::Open(bool AllowOverwrite) } // Get a lock on the write file +#ifdef PLATFORM_open_USE_fcntl + int errnoBlock = EAGAIN; + struct flock desc; + desc.l_type = F_WRLCK; + desc.l_whence = SEEK_SET; + desc.l_start = 0; + desc.l_len = 0; + if(::fcntl(mOSFileHandle, F_SETLK, &desc) != 0) +#else + int errnoBlock = EWOULDBLOCK; if(::flock(mOSFileHandle, LOCK_EX | LOCK_NB) != 0) +#endif { // Lock was not obtained. - bool wasLocked = (errno == EWOULDBLOCK); + bool wasLocked = (errno == errnoBlock); // Close the file ::close(mOSFileHandle); mOSFileHandle = -1; @@ -376,7 +387,7 @@ void RaidFileWrite::TransformToRaidStorage() // Then open them all for writing (in strict order) try { -#ifdef PLATFORM_LINUX +#if defined(PLATFORM_open_USE_flock) || defined(PLATFORM_open_USE_fcntl) FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL)> stripe1(stripe1FilenameW.c_str()); FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL)> stripe2(stripe2FilenameW.c_str()); FileHandleGuard<(O_WRONLY | O_CREAT | O_EXCL)> parity(parityFilenameW.c_str()); @@ -448,11 +459,7 @@ void RaidFileWrite::TransformToRaidStorage() { // XOR in the size at the end of the parity block ASSERT(sizeof(RaidFileRead::FileSizeType) == (2*sizeof(unsigned int))); -#ifdef PLATFORM_LINUX ASSERT(sizeof(RaidFileRead::FileSizeType) >= sizeof(off_t)); -#else - ASSERT(sizeof(RaidFileRead::FileSizeType) == sizeof(off_t)); -#endif int sizePos = (blockSize/sizeof(unsigned int)) - 2; RaidFileRead::FileSizeType sw = hton64(writeFileStat.st_size); unsigned int *psize = (unsigned int *)(&sw); @@ -509,11 +516,7 @@ void RaidFileWrite::TransformToRaidStorage() // if it can't be worked out some other means -- size is required to rebuild the file if one of the stripe files is missing if(sizeRecordRequired) { -#ifdef PLATFORM_LINUX ASSERT(sizeof(writeFileStat.st_size) <= sizeof(RaidFileRead::FileSizeType)); -#else - ASSERT(sizeof(writeFileStat.st_size) == sizeof(RaidFileRead::FileSizeType)); -#endif RaidFileRead::FileSizeType sw = hton64(writeFileStat.st_size); ASSERT((::lseek(parity, 0, SEEK_CUR) % blockSize) == 0); if(::write(parity, &sw, sizeof(sw)) != sizeof(sw)) diff --git a/lib/server/Daemon.cpp b/lib/server/Daemon.cpp index 31997fb6..1885c6c8 100755 --- a/lib/server/Daemon.cpp +++ b/lib/server/Daemon.cpp @@ -141,7 +141,11 @@ int Daemon::Main(const char *DefaultConfigFile, int argc, const char *argv[]) SetupInInitialProcess(); // Set signal handler - if(::signal(SIGHUP, SignalHandler) == SIG_ERR || ::signal(SIGTERM, SignalHandler) == SIG_ERR) + struct sigaction sa; + sa.sa_handler = SignalHandler; + sa.sa_flags = 0; + ::sigemptyset(&sa.sa_mask); + if(::sigaction(SIGHUP, &sa, NULL) != 0 || ::sigaction(SIGTERM, &sa, NULL) != 0) { THROW_EXCEPTION(ServerException, DaemoniseFailed) } @@ -354,8 +358,12 @@ int Daemon::Main(const char *DefaultConfigFile, int argc, const char *argv[]) void Daemon::EnterChild() { // Unset signal handlers - ::signal(SIGHUP, SIG_DFL); - ::signal(SIGTERM, SIG_DFL); + struct sigaction sa; + sa.sa_handler = SIG_DFL; + sa.sa_flags = 0; + ::sigemptyset(&sa.sa_mask); + ::sigaction(SIGHUP, &sa, NULL); + ::sigaction(SIGTERM, &sa, NULL); } diff --git a/lib/server/Protocol.cpp b/lib/server/Protocol.cpp index ca89bdf1..690c2ec0 100755 --- a/lib/server/Protocol.cpp +++ b/lib/server/Protocol.cpp @@ -423,7 +423,14 @@ void Protocol::Read(int64_t &rOut) READ_START_CHECK READ_CHECK_BYTES_AVAILABLE(sizeof(int64_t)) - rOut = ntoh64(*((int64_t*)(mpBuffer + mReadOffset))); +#ifdef PLATFORM_ALIGN_INT + int64_t nvalue; + memcpy(&nvalue, mpBuffer + mReadOffset, sizeof(int64_t)); +#else + int64_t nvalue = *((int64_t*)(mpBuffer + mReadOffset)); +#endif + rOut = ntoh64(nvalue); + mReadOffset += sizeof(int64_t); } @@ -440,7 +447,13 @@ void Protocol::Read(int32_t &rOut) READ_START_CHECK READ_CHECK_BYTES_AVAILABLE(sizeof(int32_t)) - rOut = ntohl(*((int32_t*)(mpBuffer + mReadOffset))); +#ifdef PLATFORM_ALIGN_INT + int32_t nvalue; + memcpy(&nvalue, mpBuffer + mReadOffset, sizeof(int32_t)); +#else + int32_t nvalue = *((int32_t*)(mpBuffer + mReadOffset)); +#endif + rOut = ntohl(nvalue); mReadOffset += sizeof(int32_t); } @@ -545,7 +558,12 @@ void Protocol::Write(int64_t Value) WRITE_START_CHECK WRITE_ENSURE_BYTES_AVAILABLE(sizeof(int64_t)) - *((int64_t*)(mpBuffer + mWriteOffset)) = hton64(Value); + int64_t nvalue = hton64(Value); +#ifdef PLATFORM_ALIGN_INT + memcpy(mpBuffer + mWriteOffset, &nvalue, sizeof(int64_t)); +#else + *((int64_t*)(mpBuffer + mWriteOffset)) = nvalue; +#endif mWriteOffset += sizeof(int64_t); } @@ -563,7 +581,12 @@ void Protocol::Write(int32_t Value) WRITE_START_CHECK WRITE_ENSURE_BYTES_AVAILABLE(sizeof(int32_t)) - *((int32_t*)(mpBuffer + mWriteOffset)) = htonl(Value); + int32_t nvalue = htonl(Value); +#ifdef PLATFORM_ALIGN_INT + memcpy(mpBuffer + mWriteOffset, &nvalue, sizeof(int32_t)); +#else + *((int32_t*)(mpBuffer + mWriteOffset)) = nvalue; +#endif mWriteOffset += sizeof(int32_t); } diff --git a/lib/server/SocketStreamTLS.cpp b/lib/server/SocketStreamTLS.cpp index 63ac7bb5..7d82f82c 100755 --- a/lib/server/SocketStreamTLS.cpp +++ b/lib/server/SocketStreamTLS.cpp @@ -14,7 +14,7 @@ #include <openssl/bio.h> #include <poll.h> #include <errno.h> -#include <sys/ioctl.h> +#include <fcntl.h> #include "SocketStreamTLS.h" #include "SSLLib.h" @@ -132,12 +132,23 @@ void SocketStreamTLS::Handshake(const TLSContext &rContext, bool IsServer) } // Make the socket non-blocking so timeouts on Read work - int nonblocking = true; - if(::ioctl(socket, FIONBIO, &nonblocking) == -1) + // This is more portable than using ioctl with FIONBIO + int statusFlags = 0; + if(::fcntl(socket, F_GETFL, &statusFlags) < 0 + || ::fcntl(socket, F_SETFL, statusFlags | O_NONBLOCK) == -1) { THROW_EXCEPTION(ServerException, SocketSetNonBlockingFailed) } + // FIXME: This is less portable than the above. However, it MAY be needed + // for cygwin, which has/had bugs with fcntl + // + // int nonblocking = true; + // if(::ioctl(socket, FIONBIO, &nonblocking) == -1) + // { + // THROW_EXCEPTION(ServerException, SocketSetNonBlockingFailed) + // } + // Set the two to know about each other ::SSL_set_bio(mpSSL, mpBIO, mpBIO); diff --git a/test/backupstore/testbackupstore.cpp b/test/backupstore/testbackupstore.cpp index 3757bc60..1d297f16 100755 --- a/test/backupstore/testbackupstore.cpp +++ b/test/backupstore/testbackupstore.cpp @@ -584,9 +584,9 @@ typedef struct int objectsNotDel; int deleted; int old; -} recusive_count_objects_results; +} recursive_count_objects_results; -void recusive_count_objects_r(BackupProtocolClient &protocol, int64_t id, recusive_count_objects_results &results) +void recursive_count_objects_r(BackupProtocolClient &protocol, int64_t id, recursive_count_objects_results &results) { // Command std::auto_ptr<BackupProtocolClientSuccess> dirreply(protocol.QueryListDirectory( @@ -611,12 +611,12 @@ void recusive_count_objects_r(BackupProtocolClient &protocol, int64_t id, recusi if(en->GetFlags() & BackupStoreDirectory::Entry::Flags_Dir) { - recusive_count_objects_r(protocol, en->GetObjectID(), results); + recursive_count_objects_r(protocol, en->GetObjectID(), results); } } } -void recusive_count_objects(const char *hostname, int64_t id, recusive_count_objects_results &results) +void recursive_count_objects(const char *hostname, int64_t id, recursive_count_objects_results &results) { // Context TLSContext context; @@ -637,7 +637,7 @@ void recusive_count_objects(const char *hostname, int64_t id, recusive_count_obj } // Count objects - recusive_count_objects_r(protocolReadOnly, id, results); + recursive_count_objects_r(protocolReadOnly, id, results); // Close it protocolReadOnly.QueryFinished(); @@ -1706,9 +1706,9 @@ int test3(int argc, const char *argv[]) // Test the deletion of objects by the housekeeping system // First, things as they are now. - recusive_count_objects_results before = {0,0,0}; + recursive_count_objects_results before = {0,0,0}; - recusive_count_objects("localhost", BackupProtocolClientListDirectory::RootDirectory, before); + recursive_count_objects("localhost", BackupProtocolClientListDirectory::RootDirectory, before); TEST_THAT(before.objectsNotDel != 0); TEST_THAT(before.deleted != 0); @@ -1732,7 +1732,7 @@ int test3(int argc, const char *argv[]) // wait for housekeeping to happen printf("waiting for housekeeping:\n"); - for(int l = 0; l < 12; ++l) + for(int l = 0; l < 30; ++l) { ::sleep(1); printf("."); @@ -1741,9 +1741,11 @@ int test3(int argc, const char *argv[]) printf("\n"); // Count the objects again - recusive_count_objects_results after = {0,0,0}; - recusive_count_objects("localhost", BackupProtocolClientListDirectory::RootDirectory, after); - + recursive_count_objects_results after = {0,0,0}; + recursive_count_objects("localhost", BackupProtocolClientListDirectory::RootDirectory, after); +printf("after.objectsNotDel=%i, deleted=%i, old=%i\n",after.objectsNotDel, after.deleted, after.old); + + // If these tests fail then try increasing the timeout above TEST_THAT(after.objectsNotDel == before.objectsNotDel); TEST_THAT(after.deleted == 0); TEST_THAT(after.old == 0); diff --git a/test/common/testcommon.cpp b/test/common/testcommon.cpp index c6d0e52f..b00ee281 100755 --- a/test/common/testcommon.cpp +++ b/test/common/testcommon.cpp @@ -397,9 +397,11 @@ int test(int argc, const char *argv[]) TEST_THAT(lock1.TryAndGetLock("testfiles/lock1") == true); // Try to lock something using the same lock TEST_CHECK_THROWS(lock1.TryAndGetLock("testfiles/non-exist/lock2"), CommonException, NamedLockAlreadyLockingSomething); +#ifndef PLATFORM_open_USE_fcntl // And again on that name NamedLock lock2; TEST_THAT(lock2.TryAndGetLock("testfiles/lock1") == false); +#endif } { // Check that it unlocked when it went out of scope diff --git a/test/raidfile/intercept.cpp b/test/raidfile/intercept.cpp index 4f20ba0a..60c0ca1e 100755 --- a/test/raidfile/intercept.cpp +++ b/test/raidfile/intercept.cpp @@ -34,7 +34,7 @@ extern "C" off_t TEST_lseek(int fildes, off_t offset, int whence); #else - #ifdef PLATFORM_LINUX + #if defined(PLATFORM_LINUX) || defined(PLATFORM_SUNOS) #undef __syscall #define __syscall syscall #else @@ -51,7 +51,7 @@ bool intercept_enabled = false; const char *intercept_filename = 0; int intercept_filedes = -1; -unsigned int intercept_errorafter = 0; +off_t intercept_errorafter = 0; int intercept_errno = 0; int intercept_syscall = 0; off_t intercept_filepos = 0; @@ -97,7 +97,7 @@ bool intercept_errornow(int d, int size, int syscallnum) return true; } // where are we in the file? - if(intercept_filepos >= intercept_errorafter || intercept_filepos >= ((int)intercept_errorafter - size)) + if(intercept_filepos >= intercept_errorafter || intercept_filepos >= ((off_t)intercept_errorafter - size)) { TRACE3("Returning error %d for syscall %d, file pos %d\n", intercept_errno, syscallnum, (int)intercept_filepos); return true; @@ -236,9 +236,11 @@ lseek(int fildes, off_t offset, int whence) #ifdef PLATFORM_DARWIN int r = TEST_lseek(fildes, offset, whence); #else - #ifdef PLATFORM_LINUX + #if defined(PLATFORM_LINUX) || defined(PLATFORM_SUNOS) off_t r = __syscall(SYS_lseek, fildes, offset, whence); #else + // Should swap this condition round. No reason to assume that most OS + // do this syscall wierdness, default should be the sensible way off_t r = __syscall(SYS_lseek, fildes, 0 /* extra 0 required here! */, offset, whence); #endif #endif diff --git a/test/raidfile/testraidfile.cpp b/test/raidfile/testraidfile.cpp index 13ae9083..9803d44d 100755 --- a/test/raidfile/testraidfile.cpp +++ b/test/raidfile/testraidfile.cpp @@ -525,8 +525,10 @@ void test_overwrites() writeA.Write("TESTTEST", 8); { +#ifndef PLATFORM_open_USE_fcntl RaidFileWrite writeA2(0, "overwrite_A"); TEST_CHECK_THROWS(writeA2.Open(), RaidFileException, FileIsCurrentlyOpenForWriting); +#endif } } |