From d1ff1fe77ccb2c14496cd2c1f2939bc67dfa22d9 Mon Sep 17 00:00:00 2001 From: rakshasa Date: Mon, 26 Mar 2012 23:18:10 +0900 Subject: [PATCH] Solaris compatibility fixes. --- src/input/input_event.cc | 5 +++-- src/input/path_input.cc | 12 +++++++++++- src/rpc/scgi.cc | 5 +++++ src/signal_handler.cc | 5 +++++ src/utils/directory.cc | 14 ++++++++++++++ src/utils/directory.h | 2 +- 6 files changed, 39 insertions(+), 4 deletions(-) diff --git a/src/input/input_event.cc b/src/input/input_event.cc index 7444560e..69dfef05 100644 --- a/src/input/input_event.cc +++ b/src/input/input_event.cc @@ -36,10 +36,11 @@ #include "config.h" -#include - #include "input_event.h" +//ncurses.h must be included last since sys/mman.h on Solaris munges ERR. +#include + namespace input { void diff --git a/src/input/path_input.cc b/src/input/path_input.cc index d3ee45e5..2b951b28 100644 --- a/src/input/path_input.cc +++ b/src/input/path_input.cc @@ -42,7 +42,13 @@ #include #include -#include + +#ifdef __sun__ + #include + #include +#else + #include +#endif #include "path_input.h" @@ -72,7 +78,11 @@ PathInput::pressed(int key) { struct _transform_filename { void operator () (utils::directory_entry& entry) { +#ifdef __sun__ + if (entry.d_type & S_IFDIR) +#else if (entry.d_type == DT_DIR) +#endif entry.d_name += '/'; } }; diff --git a/src/rpc/scgi.cc b/src/rpc/scgi.cc index 3db40f00..3daa7e57 100644 --- a/src/rpc/scgi.cc +++ b/src/rpc/scgi.cc @@ -88,7 +88,12 @@ SCgi::open_named(const std::string& filename) { char buffer[sizeof(sockaddr_un) + filename.size()]; sockaddr_un* sa = reinterpret_cast(buffer); +#ifdef __sun__ + sa->sun_family = AF_UNIX; +#else sa->sun_family = AF_LOCAL; +#endif + std::memcpy(sa->sun_path, filename.c_str(), filename.size() + 1); if (!get_fd().open_local()) diff --git a/src/signal_handler.cc b/src/signal_handler.cc index c3fb380a..f7fd7ccb 100644 --- a/src/signal_handler.cc +++ b/src/signal_handler.cc @@ -41,6 +41,11 @@ #include "rak/error_number.h" #include "signal_handler.h" +#ifdef __sun__ +#include +//extern "C" void (*signal (int sig, void (*disp)(int)))(int); +#endif + SignalHandler::Slot SignalHandler::m_handlers[HIGHEST_SIGNAL]; void diff --git a/src/utils/directory.cc b/src/utils/directory.cc index 0484c846..f72d0f28 100644 --- a/src/utils/directory.cc +++ b/src/utils/directory.cc @@ -42,6 +42,10 @@ #include #include +#ifdef __sun__ +#include +#endif + #include "directory.h" namespace utils { @@ -69,6 +73,9 @@ Directory::update(int flags) { return false; struct dirent* entry; +#ifdef __sun__ + struct stat s; +#endif while ((entry = readdir(d)) != NULL) { if ((flags & update_hide_dot) && entry->d_name[0] == '.') @@ -76,9 +83,16 @@ Directory::update(int flags) { iterator itr = base_type::insert(end(), value_type()); +#ifdef __sun__ + stat(entry->d_name, &s); + itr->d_fileno = entry->d_ino; + itr->d_reclen = 0; + itr->d_type = s.st_mode; +#else itr->d_fileno = entry->d_fileno; itr->d_reclen = entry->d_reclen; itr->d_type = entry->d_type; +#endif #ifdef DIRENT_NAMLEN_EXISTS_FOOBAR itr->d_name = std::string(entry->d_name, entry->d_name + entry->d_namlen); diff --git a/src/utils/directory.h b/src/utils/directory.h index 364c6f13..ec8027b0 100644 --- a/src/utils/directory.h +++ b/src/utils/directory.h @@ -49,7 +49,7 @@ struct directory_entry { // The name and types should match POSIX. uint32_t d_fileno; - uint32_t d_reclen; + uint32_t d_reclen; //Not used. Messes with Solaris. uint8_t d_type; std::string d_name;