applied windows patches from #3286

This commit is contained in:
Brian Gerkey 2011-01-31 16:19:50 +00:00
parent d353445182
commit 57590be362
3 changed files with 43 additions and 16 deletions

View File

@ -44,6 +44,7 @@ if(ROS_BUILD_SHARED_LIBS)
endif(ROS_BUILD_SHARED_LIBS) endif(ROS_BUILD_SHARED_LIBS)
if(ROS_BUILD_STATIC_LIBS) if(ROS_BUILD_STATIC_LIBS)
add_definitions("-DROS_STATIC")
# If we're only building static libs, then they get the default CMake # If we're only building static libs, then they get the default CMake
# target name. # target name.
if(NOT ROS_BUILD_SHARED_LIBS) if(NOT ROS_BUILD_SHARED_LIBS)

View File

@ -48,13 +48,16 @@
#include <sstream> #include <sstream>
#include <iterator> #include <iterator>
#if !defined(WIN32)
#if defined(_MSC_VER) // msvc only
#define F_OK 0x00
#else // non msvc only
#include <libgen.h> #include <libgen.h>
#endif #endif
#if defined(WIN32) #if defined(WIN32) //
#include <direct.h> #include <direct.h>
#include <Winsock2.h> // For struct timeval (that's awful) #include <winsock2.h> // For struct timeval (that's awful)
#include <time.h> #include <time.h>
#include <windows.h> #include <windows.h>
#include <io.h> #include <io.h>
@ -67,9 +70,9 @@
#define mkdir(a,b) _mkdir(a) #define mkdir(a,b) _mkdir(a)
#define fdopen _fdopen #define fdopen _fdopen
#define access _access #define access _access
#define F_OK 0x00
#endif #endif
#include "tinyxml-2.5.3/tinyxml.h" #include "tinyxml-2.5.3/tinyxml.h"
#include "rospack/rospack.h" #include "rospack/rospack.h"
using namespace std; using namespace std;
@ -1341,7 +1344,7 @@ int ROSPack::run(int argc, char **argv)
{ {
if(Package::is_package(".")) if(Package::is_package("."))
{ {
#if defined(WIN32) #if defined(_MSC_VER)
// No basename on Windows; use _splitpath_s instead // No basename on Windows; use _splitpath_s instead
char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT]; char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
_splitpath_s(buf, drive, _MAX_DRIVE, dir, _MAX_DIR, fname, _MAX_FNAME, _splitpath_s(buf, drive, _MAX_DRIVE, dir, _MAX_DIR, fname, _MAX_FNAME,
@ -1914,7 +1917,7 @@ void ROSPack::crawl_for_packages(bool force_crawl)
char tmp_cache_dir[PATH_MAX]; char tmp_cache_dir[PATH_MAX];
char tmp_cache_path[PATH_MAX]; char tmp_cache_path[PATH_MAX];
strncpy(tmp_cache_dir, cache_path.c_str(), sizeof(tmp_cache_dir)); strncpy(tmp_cache_dir, cache_path.c_str(), sizeof(tmp_cache_dir));
#if defined(WIN32) #if defined(_MSC_VER)
// No dirname on Windows; use _splitpath_s instead // No dirname on Windows; use _splitpath_s instead
char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT]; char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
_splitpath_s(tmp_cache_dir, drive, _MAX_DRIVE, dir, _MAX_DIR, fname, _MAX_FNAME, _splitpath_s(tmp_cache_dir, drive, _MAX_DRIVE, dir, _MAX_DIR, fname, _MAX_FNAME,
@ -1925,7 +1928,19 @@ void ROSPack::crawl_for_packages(bool force_crawl)
#else #else
snprintf(tmp_cache_path, sizeof(tmp_cache_path), "%s/.rospack_cache.XXXXXX", dirname(tmp_cache_dir)); snprintf(tmp_cache_path, sizeof(tmp_cache_path), "%s/.rospack_cache.XXXXXX", dirname(tmp_cache_dir));
#endif #endif
#if defined(WIN32) #if defined(__MINGW32__)
// There is no equivalent of mkstemp or _mktemp_s on mingw, so we resort to a slightly less secure
// method. Could use mktemp, but as we're just redirecting to FILE anyway, tmpfile() works
// for us.
FILE *cache = tmpfile();
if ( cache == NULL ) {
fprintf(stderr,
"[rospack] Unable to generate temporary cache file name: %u",
errno);
}
else
{
#elif defined(WIN32)
// This one is particularly nasty: on Windows, there is no equivalent of // This one is particularly nasty: on Windows, there is no equivalent of
// mkstemp, so we're stuck with the security risks of mktemp. Hopefully not a // mkstemp, so we're stuck with the security risks of mktemp. Hopefully not a
// problem in our use cases. // problem in our use cases.

View File

@ -50,11 +50,15 @@
#include <sstream> #include <sstream>
#include <iterator> #include <iterator>
#if !defined(WIN32) #if defined(_MSC_VER) // msvc only
#define F_OK 0x00
#define W_OK 0x02
#define R_OK 0x04
#else // non msvc only
#include <libgen.h> #include <libgen.h>
#endif #endif
#if defined(WIN32) #if defined(WIN32) // both msvc and mingw
#include <direct.h> #include <direct.h>
#include <time.h> #include <time.h>
#include <windows.h> #include <windows.h>
@ -65,9 +69,6 @@
#define getcwd _getcwd #define getcwd _getcwd
#define fdopen _fdopen #define fdopen _fdopen
#define access _access #define access _access
#define F_OK 0x00
#define W_OK 0x02
#define R_OK 0x04
#define mkdir(a,b) _mkdir(a) #define mkdir(a,b) _mkdir(a)
#endif #endif
@ -96,7 +97,7 @@ const string g_ros_os("osx");
#endif #endif
#endif #endif
#if defined(WIN32) #if defined(_MSVC_VER)
// The MS compiler complains bitterly about undefined symbols due to the // The MS compiler complains bitterly about undefined symbols due to the
// static members of the TiXmlBase class. They need to exist in every // static members of the TiXmlBase class. They need to exist in every
// compilation unit (i.e. DLL or EXE), but they don't get exported // compilation unit (i.e. DLL or EXE), but they don't get exported
@ -715,7 +716,7 @@ int ROSStack::run(int argc, char **argv)
char buf[1024]; char buf[1024];
if(!getcwd(buf,sizeof(buf))) if(!getcwd(buf,sizeof(buf)))
throw runtime_error(errmsg); throw runtime_error(errmsg);
#if defined(WIN32) #if defined(_MSC_VER)
// No basename on Windows; use _splitpath_s instead // No basename on Windows; use _splitpath_s instead
char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT]; char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
_splitpath_s(buf, drive, _MAX_DRIVE, dir, _MAX_DIR, fname, _MAX_FNAME, _splitpath_s(buf, drive, _MAX_DRIVE, dir, _MAX_DIR, fname, _MAX_FNAME,
@ -1192,7 +1193,7 @@ void ROSStack::crawl_for_stacks(bool force_crawl)
char tmp_cache_dir[PATH_MAX]; char tmp_cache_dir[PATH_MAX];
char tmp_cache_path[PATH_MAX]; char tmp_cache_path[PATH_MAX];
strncpy(tmp_cache_dir, cache_path.c_str(), sizeof(tmp_cache_dir)); strncpy(tmp_cache_dir, cache_path.c_str(), sizeof(tmp_cache_dir));
#if defined(WIN32) #if defined(_MSC_VER)
// No dirname on Windows; use _splitpath_s instead // No dirname on Windows; use _splitpath_s instead
char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT]; char drive[_MAX_DRIVE], dir[_MAX_DIR], fname[_MAX_FNAME], ext[_MAX_EXT];
_splitpath_s(tmp_cache_dir, drive, _MAX_DRIVE, dir, _MAX_DIR, fname, _MAX_FNAME, _splitpath_s(tmp_cache_dir, drive, _MAX_DRIVE, dir, _MAX_DIR, fname, _MAX_FNAME,
@ -1203,7 +1204,17 @@ void ROSStack::crawl_for_stacks(bool force_crawl)
#else #else
snprintf(tmp_cache_path, sizeof(tmp_cache_path), "%s/.rosstack_cache.XXXXXX", dirname(tmp_cache_dir)); snprintf(tmp_cache_path, sizeof(tmp_cache_path), "%s/.rosstack_cache.XXXXXX", dirname(tmp_cache_dir));
#endif #endif
#if defined(WIN32) #if defined(__MINGW32__)
// There is no equivalent of mkstemp or _mktemp_s on mingw, so we resort to a slightly less secure
// method. Could use mktemp, but as we're just redirecting to FILE anyway, tmpfile() works
// for us.
FILE *cache = tmpfile();
if ( cache == NULL ) {
fprintf(stderr,
"[rospack] Unable to generate temporary cache file name: %u",
errno);
}
#elif defined(WIN32)
// This one is particularly nasty: on Windows, there is no equivalent of // This one is particularly nasty: on Windows, there is no equivalent of
// mkstemp, so we're stuck with the security risks of mktemp. Hopefully not a // mkstemp, so we're stuck with the security risks of mktemp. Hopefully not a
// problem in our use cases. // problem in our use cases.