> > > For win32 my current scheme is to just throw out all the configure and > > automake stuff and have a static makefile, so the build procedure is 'cd > > win32; make'. Do you think that's acceptable? > > I think that's a fine, certainly as a place to start. (I'm not sure there > is going to be a better solution that doesn't rely on mingw32 or cygwin or > something.) > > > I suppose the configure > > could be modified to work with a mingw32 cross compile under Linux, but > > it might be a bit of a stretch to make it work in mingw32 environment > > under Windows (or maybe it's easy... I've never used mingw32 under > > Windows). At this time the configure and Makefile stuff would need to be > > able to build only selective bits as a lot of stuff doesn't currently > > build under Windows, and some may never build... osd under windows > would > > be a pretty big project for something with very limited appeal (imho) > > Yep! > The patch is tacked onto the end of this email (unless it makes the email too big for this list...) I emailed previously about some of the changes I'd had to make (eg LOCK_EXCLUSIVE is already defined for something else under Window). What approach should I take to get this into wip-port? Some of the changes are pretty light and could probably go straight in, others stomp on things all over the place with messy #ifdefs, and some probably break the non-win32 build altogether (will test this soon). Hopefully the windows driver to allow mounting of a userspace-backed device (eg librbd) won't be too hard. James diff --git a/src/cls/lock/cls_lock.cc b/src/cls/lock/cls_lock.cc index 5e0dbc3..91b00f7 100644 --- a/src/cls/lock/cls_lock.cc +++ b/src/cls/lock/cls_lock.cc @@ -161,12 +161,12 @@ static int lock_obj(cls_method_context_t hctx, const string& cookie, const string& tag) { - bool exclusive = lock_type == LOCK_EXCLUSIVE; + bool exclusive = lock_type == xLOCK_EXCLUSIVE; lock_info_t linfo; bool fail_if_exists = (flags & LOCK_FLAG_RENEW) == 0; CLS_LOG(20, "requested lock_type=%s fail_if_exists=%d", cls_lock_type_str(lock_type), fail_if_exists); - if (lock_type != LOCK_EXCLUSIVE && + if (lock_type != xLOCK_EXCLUSIVE && lock_type != LOCK_SHARED) return -EINVAL; diff --git a/src/cls/lock/cls_lock_client.cc b/src/cls/lock/cls_lock_client.cc index 54af41c..17cb3b0 100644 --- a/src/cls/lock/cls_lock_client.cc +++ b/src/cls/lock/cls_lock_client.cc @@ -24,6 +24,8 @@ using namespace librados; #include <stdlib.h> #include <time.h> +#include "include/compat.h" + #include "cls/lock/cls_lock_types.h" #include "cls/lock/cls_lock_ops.h" #include "cls/lock/cls_lock_client.h" @@ -189,13 +191,13 @@ namespace rados { void Lock::lock_exclusive(ObjectWriteOperation *op) { - lock(op, name, LOCK_EXCLUSIVE, + lock(op, name, xLOCK_EXCLUSIVE, cookie, tag, description, duration, flags); } int Lock::lock_exclusive(IoCtx *ioctx, const string& oid) { - return lock(ioctx, oid, name, LOCK_EXCLUSIVE, + return lock(ioctx, oid, name, xLOCK_EXCLUSIVE, cookie, tag, description, duration, flags); } diff --git a/src/cls/lock/cls_lock_types.h b/src/cls/lock/cls_lock_types.h index aa60ed1..7d39b7b 100644 --- a/src/cls/lock/cls_lock_types.h +++ b/src/cls/lock/cls_lock_types.h @@ -11,7 +11,7 @@ enum ClsLockType { LOCK_NONE = 0, - LOCK_EXCLUSIVE = 1, + xLOCK_EXCLUSIVE = 1, LOCK_SHARED = 2, }; @@ -20,7 +20,7 @@ static inline const char *cls_lock_type_str(ClsLockType type) switch (type) { case LOCK_NONE: return "none"; - case LOCK_EXCLUSIVE: + case xLOCK_EXCLUSIVE: return "exclusive"; case LOCK_SHARED: return "shared"; diff --git a/src/cls/log/cls_log_client.cc b/src/cls/log/cls_log_client.cc index f9d9bd3..a9b9410 100644 --- a/src/cls/log/cls_log_client.cc +++ b/src/cls/log/cls_log_client.cc @@ -1,5 +1,5 @@ #include <errno.h> - +#include "include/compat.h" #include "include/types.h" #include "cls/log/cls_log_ops.h" #include "include/rados/librados.hpp" diff --git a/src/cls/rbd/cls_rbd_client.cc b/src/cls/rbd/cls_rbd_client.cc index ab42591..78acb03 100644 --- a/src/cls/rbd/cls_rbd_client.cc +++ b/src/cls/rbd/cls_rbd_client.cc @@ -9,6 +9,7 @@ #include "cls_rbd_client.h" #include <errno.h> +#include "include/compat.h" namespace librbd { namespace cls_client { @@ -109,7 +110,7 @@ namespace librbd { if (r < 0 && ((r != -EOPNOTSUPP) && (r != -EIO))) return r; - *exclusive_lock = (lock_type == LOCK_EXCLUSIVE); + *exclusive_lock = (lock_type == xLOCK_EXCLUSIVE); } catch (const buffer::error &err) { return -EBADMSG; } diff --git a/src/cls/rgw/cls_rgw_client.cc b/src/cls/rgw/cls_rgw_client.cc index dabad29..ccda004 100644 --- a/src/cls/rgw/cls_rgw_client.cc +++ b/src/cls/rgw/cls_rgw_client.cc @@ -1,5 +1,5 @@ #include <errno.h> - +#include "include/compat.h" #include "include/types.h" #include "cls/rgw/cls_rgw_ops.h" #include "cls/rgw/cls_rgw_client.h" diff --git a/src/common/BackTrace.h b/src/common/BackTrace.h index b5d1e1d..f41a8a6 100644 --- a/src/common/BackTrace.h +++ b/src/common/BackTrace.h @@ -2,7 +2,7 @@ #define CEPH_BACKTRACE_H #include <iosfwd> -#include <execinfo.h> +//#include <execinfo.h> #include <stdlib.h> namespace ceph { @@ -15,6 +15,16 @@ struct BackTrace { size_t size; char **strings; +#if defined(_WIN32) + BackTrace(int s) : skip(s) { + size = 0; + strings = new char *[1]; + strings[0] = NULL; + } + ~BackTrace() { + free(strings); + } +#else BackTrace(int s) : skip(s) { size = backtrace(array, max); strings = backtrace_symbols(array, size); @@ -22,6 +32,7 @@ struct BackTrace { ~BackTrace() { free(strings); } +#endif BackTrace(const BackTrace& other); const BackTrace& operator=(const BackTrace& other); diff --git a/src/common/ConfUtils.cc b/src/common/ConfUtils.cc index 5efde8d..d1d9efc 100644 --- a/src/common/ConfUtils.cc +++ b/src/common/ConfUtils.cc @@ -96,6 +96,7 @@ parse_file(const std::string &fname, std::deque<std::string> *errors, clear(); int ret = 0; + int i; size_t sz; char *buf = NULL; FILE *fp = fopen(fname.c_str(), "r"); @@ -147,6 +148,16 @@ parse_file(const std::string &fname, std::deque<std::string> *errors, goto done; } } + /* just strip out all dos newlines */ + i = 0; + while (i < sz) { + if (buf[i] == '\r') { + memmove(buf + i, buf + i + 1, sz - i - 1); + sz--; + } else { + i++; + } + } load_from_buffer(buf, sz, errors, warnings); ret = 0; diff --git a/src/common/HeartbeatMap.cc b/src/common/HeartbeatMap.cc index 9787f73..951d09d 100644 --- a/src/common/HeartbeatMap.cc +++ b/src/common/HeartbeatMap.cc @@ -17,6 +17,7 @@ #include <sys/stat.h> #include <fcntl.h> #include <errno.h> +#include <utime.h> #include "HeartbeatMap.h" #include "ceph_context.h" @@ -143,7 +144,11 @@ void HeartbeatMap::check_touch_file() if (path.length()) { int fd = ::open(path.c_str(), O_WRONLY|O_CREAT, 0644); if (fd >= 0) { +#if !defined(_WIN32) ::utimes(path.c_str(), NULL); +#else + ::utime(path.c_str(), NULL); +#endif ::close(fd); } else { ldout(m_cct, 0) << "unable to touch " << path << ": " diff --git a/src/common/LogClient.cc b/src/common/LogClient.cc index 1e290b1..7c966bd 100644 --- a/src/common/LogClient.cc +++ b/src/common/LogClient.cc @@ -26,7 +26,9 @@ #include <iostream> #include <errno.h> #include <sys/stat.h> -#include <syslog.h> +#if !defined(_WIN32) + #include <syslog.h> +#endif #ifdef DARWIN #include <sys/param.h> @@ -84,11 +86,13 @@ void LogClient::do_log(clog_type type, const std::string& s) e.type = type; e.msg = s; +#if !defined(_WIN32) // log to syslog? if (cct->_conf->clog_to_syslog) { e.log_to_syslog(cct->_conf->clog_to_syslog_level, cct->_conf->clog_to_syslog_facility); } +#endif // log to monitor? if (cct->_conf->clog_to_monitors) { diff --git a/src/common/LogEntry.cc b/src/common/LogEntry.cc index 97b173f..4c04ed5 100644 --- a/src/common/LogEntry.cc +++ b/src/common/LogEntry.cc @@ -1,5 +1,7 @@ +#if !defined(_WIN32) #include <syslog.h> +#endif #include <boost/algorithm/string.hpp> @@ -42,6 +44,7 @@ void LogEntryKey::generate_test_instances(list<LogEntryKey*>& o) // ---- +#if !defined(_WIN32) int clog_type_to_syslog_level(clog_type t) { switch (t) { @@ -139,7 +142,7 @@ void LogEntry::log_to_syslog(string level, string facility) syslog(l | f, "%s", stringify(*this).c_str()); } } - +#endif void LogEntry::encode(bufferlist& bl) const { ENCODE_START(2, 2, bl); diff --git a/src/common/OutputDataSocket.cc b/src/common/OutputDataSocket.cc index 3051ca0..8824dfd 100644 --- a/src/common/OutputDataSocket.cc +++ b/src/common/OutputDataSocket.cc @@ -28,15 +28,19 @@ #include <errno.h> #include <fcntl.h> #include <map> -#include <poll.h> #include <set> #include <sstream> #include <stdint.h> #include <string.h> #include <string> -#include <sys/socket.h> +#if defined(_WIN32) + #include <winsock2.h> +#else + #include <poll.h> + #include <sys/socket.h> + #include <sys/un.h> +#endif #include <sys/types.h> -#include <sys/un.h> #include <unistd.h> #include "include/compat.h" @@ -101,6 +105,7 @@ static void add_cleanup_file(const char *file) } +#if !defined(_WIN32) OutputDataSocket::OutputDataSocket(CephContext *cct, uint64_t _backlog) : m_cct(cct), data_max_backlog(_backlog), @@ -112,6 +117,17 @@ OutputDataSocket::OutputDataSocket(CephContext *cct, uint64_t _backlog) m_lock("OutputDataSocket::m_lock") { } +#else +OutputDataSocket::OutputDataSocket(CephContext *cct, uint64_t _backlog) + : m_cct(cct), + data_max_backlog(_backlog), + m_sock_handle(INVALID_HANDLE_VALUE), + going_down(false), + data_size(0), + m_lock("OutputDataSocket::m_lock") +{ +} +#endif OutputDataSocket::~OutputDataSocket() { @@ -131,6 +147,7 @@ OutputDataSocket::~OutputDataSocket() #define PFL_SUCCESS ((void*)(intptr_t)0) #define PFL_FAIL ((void*)(intptr_t)1) +#if !defined(_WIN32) std::string OutputDataSocket::create_shutdown_pipe(int *pipe_rd, int *pipe_wr) { int pipefd[2]; @@ -145,7 +162,9 @@ std::string OutputDataSocket::create_shutdown_pipe(int *pipe_rd, int *pipe_wr) *pipe_wr = pipefd[1]; return ""; } +#endif +#if !defined(_WIN32) std::string OutputDataSocket::bind_and_listen(const std::string &sock_path, int *fd) { ldout(m_cct, 5) << "bind_and_listen " << sock_path << dendl; @@ -215,7 +234,9 @@ std::string OutputDataSocket::bind_and_listen(const std::string &sock_path, int *fd = sock_fd; return ""; } +#endif +#if !defined(_WIN32) void* OutputDataSocket::entry() { ldout(m_cct, 5) << "entry start" << dendl; @@ -248,11 +269,28 @@ void* OutputDataSocket::entry() } } ldout(m_cct, 5) << "entry exit" << dendl; + return PFL_SUCCESS; // unreachable +} +#else +void* OutputDataSocket::entry() +{ + ldout(m_cct, 5) << "entry start" << dendl; + while (true) { + DWORD ret = WaitForSingleObject(m_sock_handle, INFINITE); + if (ret != WAIT_OBJECT_0) { + lderr(m_cct) << "OutputDataSocket: WaitForSingleObject error: " << dendl; + return PFL_FAIL; + } + do_accept(); + } + ldout(m_cct, 5) << "entry exit" << dendl; return PFL_SUCCESS; // unreachable } +#endif +#if !defined(_WIN32) bool OutputDataSocket::do_accept() { struct sockaddr_un address; @@ -270,10 +308,32 @@ bool OutputDataSocket::do_accept() handle_connection(connection_fd); close_connection(connection_fd); + return 0; +} +#else +bool OutputDataSocket::do_accept() +{ + CreateNamedPipeW + struct sockaddr_un address; + socklen_t address_length = sizeof(address); + ldout(m_cct, 30) << "OutputDataSocket: calling accept" << dendl; + int connection_fd = accept(m_sock_fd, (struct sockaddr*) &address, + &address_length); + ldout(m_cct, 30) << "OutputDataSocket: finished accept" << dendl; + if (connection_fd < 0) { + int err = errno; + lderr(m_cct) << "OutputDataSocket: do_accept error: '" + << cpp_strerror(err) << dendl; + return false; + } + handle_connection(connection_fd); + close_connection(connection_fd); return 0; } +#endif +#if !defined(_WIN32) void OutputDataSocket::handle_connection(int fd) { bufferlist bl; @@ -311,7 +371,48 @@ void OutputDataSocket::handle_connection(int fd) ret = dump_data(fd); } while (ret >= 0); } +#else +void OutputDataSocket::handle_connection(HANDLE handle) +{ + bufferlist bl; + + m_lock.Lock(); + init_connection(bl); + m_lock.Unlock(); + if (bl.length()) { + /* need to special case the connection init buffer output, as it needs + * to be dumped before any data, including older data that was sent + * before the connection was established, or before we identified + * older connection was broken + */ + DWORD bytes_written; + BOOL ret = WriteFile(handle, bl.c_str(), bl.length(), &bytes_written, NULL); + if (!ret) { + return; + } + } + + int ret = dump_data(handle); + if (ret < 0) + return; + + do { + m_lock.Lock(); + cond.Wait(m_lock); + + if (going_down) { + m_lock.Unlock(); + break; + } + m_lock.Unlock(); + + ret = dump_data(handle); + } while (ret >= 0); +} +#endif + +#if !defined(_WIN32) int OutputDataSocket::dump_data(int fd) { m_lock.Lock(); @@ -339,12 +440,50 @@ int OutputDataSocket::dump_data(int fd) return 0; } +#else +int OutputDataSocket::dump_data(HANDLE handle) +{ + m_lock.Lock(); + list<bufferlist> l; + l = data; + data.clear(); + data_size = 0; + m_lock.Unlock(); + for (list<bufferlist>::iterator iter = l.begin(); iter != l.end(); ++iter) { + bufferlist& bl = *iter; + DWORD bytes_written; + BOOL ret = WriteFile(handle, bl.c_str(), bl.length(), &bytes_written, NULL); + if (ret) { + BOOL ret = WriteFile(handle, delim.c_str(), delim.length(), &bytes_written, NULL); + } + if (!ret) { + for (; iter != l.end(); ++iter) { + bufferlist& bl = *iter; + data.push_back(bl); + data_size += bl.length(); + } + return ret; + } + } + + return 0; +} +#endif + +#if !defined(_WIN32) void OutputDataSocket::close_connection(int fd) { TEMP_FAILURE_RETRY(close(fd)); } +#else +void OutputDataSocket::close_connection(HANDLE handle) +{ + CloseHandle(handle); +} +#endif +#if !defined(_WIN32) bool OutputDataSocket::init(const std::string &path) { ldout(m_cct, 5) << "init " << path << dendl; @@ -375,7 +514,31 @@ bool OutputDataSocket::init(const std::string &path) add_cleanup_file(m_path.c_str()); return true; } +#else +bool OutputDataSocket::init(const std::string &path) +{ + ldout(m_cct, 5) << "init " << path << dendl; + + /* Set up things for the new thread */ + std::string err; + HANDLE handle; + err = bind_and_listen(path, &handle); + if (!err.empty()) { + lderr(m_cct) << "OutputDataSocketConfigObs::init: failed: " << err << dendl; + return false; + } + + /* Create new thread */ + m_sock_handle = handle; + m_path = path; + create(); + add_cleanup_file(m_path.c_str()); + return true; +} +#endif + +#if !defined(_WIN32) void OutputDataSocket::shutdown() { m_lock.Lock(); @@ -404,6 +567,22 @@ void OutputDataSocket::shutdown() remove_cleanup_file(m_path.c_str()); m_path.clear(); } +#else +void OutputDataSocket::shutdown() +{ + m_lock.Lock(); + going_down = true; + cond.Signal(); + m_lock.Unlock(); + + ldout(m_cct, 5) << "shutdown" << dendl; + + join(); + + remove_cleanup_file(m_path.c_str()); + m_path.clear(); +} +#endif void OutputDataSocket::append_output(bufferlist& bl) { diff --git a/src/common/OutputDataSocket.h b/src/common/OutputDataSocket.h index f581a56..5d9194f 100644 --- a/src/common/OutputDataSocket.h +++ b/src/common/OutputDataSocket.h @@ -40,23 +40,39 @@ protected: virtual void init_connection(bufferlist& bl) {} void shutdown(); +#if !defined(_WIN32) std::string create_shutdown_pipe(int *pipe_rd, int *pipe_wr); std::string bind_and_listen(const std::string &sock_path, int *fd); +#else + std::string bind_and_listen(const std::string &sock_path, HANDLE *handle); +#endif void *entry(); bool do_accept(); +#if !defined(_WIN32) void handle_connection(int fd); void close_connection(int fd); int dump_data(int fd); +#else + void handle_connection(HANDLE handle); + void close_connection(HANDLE handle); + + int dump_data(HANDLE handle); +#endif CephContext *m_cct; uint64_t data_max_backlog; std::string m_path; + +#if !defined(_WIN32) int m_sock_fd; int m_shutdown_rd_fd; int m_shutdown_wr_fd; +#else + HANDLE m_sock_handle; +#endif bool going_down; uint64_t data_size; diff --git a/src/common/Thread.cc b/src/common/Thread.cc index 0f4e322..565a3d0 100644 --- a/src/common/Thread.cc +++ b/src/common/Thread.cc @@ -83,6 +83,7 @@ int Thread::try_create(size_t stacksize) // the set of signals we want to block. (It's ok to block signals more // signals than usual for a little while-- they will just be delivered to // another thread or delieverd to this thread later.) +#if !defined(_WIN32) sigset_t old_sigset; if (g_code_env == CODE_ENVIRONMENT_LIBRARY) { block_signals(NULL, &old_sigset); @@ -91,8 +92,11 @@ int Thread::try_create(size_t stacksize) int to_block[] = { SIGPIPE , 0 }; block_signals(to_block, &old_sigset); } +#endif r = pthread_create(&thread_id, thread_attr, _entry_func, (void*)this); +#if !defined(_WIN32) restore_sigset(&old_sigset); +#endif if (thread_attr) free(thread_attr); diff --git a/src/common/addr_parsing.c b/src/common/addr_parsing.c index c01f817..bc1702c 100644 --- a/src/common/addr_parsing.c +++ b/src/common/addr_parsing.c @@ -20,7 +20,13 @@ #include <sys/socket.h> #include <netinet/in.h> #endif +#if !defined(_WIN32) #include <netdb.h> +#else +#include <winsock2.h> +#include <ws2tcpip.h> +#endif +#include "include/compat.h" #define BUF_SIZE 128 diff --git a/src/common/admin_socket.cc b/src/common/admin_socket.cc index 12e5868..fa7a069 100644 --- a/src/common/admin_socket.cc +++ b/src/common/admin_socket.cc @@ -29,15 +29,15 @@ #include <errno.h> #include <fcntl.h> #include <map> -#include <poll.h> +//#include <poll.h> #include <set> #include <sstream> #include <stdint.h> #include <string.h> #include <string> -#include <sys/socket.h> +//#include <sys/socket.h> #include <sys/types.h> -#include <sys/un.h> +//#include <sys/un.h> #include <unistd.h> #include "include/compat.h" @@ -147,10 +147,10 @@ std::string AdminSocket::create_shutdown_pipe(int *pipe_rd, int *pipe_wr) return ""; } +#if !defined(_WIN32) std::string AdminSocket::bind_and_listen(const std::string &sock_path, int *fd) { ldout(m_cct, 5) << "bind_and_listen " << sock_path << dendl; - struct sockaddr_un address; if (sock_path.size() > sizeof(address.sun_path) - 1) { ostringstream oss; @@ -216,7 +216,9 @@ std::string AdminSocket::bind_and_listen(const std::string &sock_path, int *fd) *fd = sock_fd; return ""; } +#endif +#if !defined(_WIN32) void* AdminSocket::entry() { ldout(m_cct, 5) << "entry start" << dendl; @@ -250,8 +252,10 @@ void* AdminSocket::entry() } ldout(m_cct, 5) << "entry exit" << dendl; } +#endif +#if !defined(_WIN32) bool AdminSocket::do_accept() { struct sockaddr_un address; @@ -379,6 +383,7 @@ bool AdminSocket::do_accept() TEMP_FAILURE_RETRY(close(connection_fd)); return rval; } +#endif int AdminSocket::register_command(std::string command, std::string cmddesc, AdminSocketHook *hook, std::string help) { diff --git a/src/common/admin_socket_client.cc b/src/common/admin_socket_client.cc index 335695f..908a2f5 100644 --- a/src/common/admin_socket_client.cc +++ b/src/common/admin_socket_client.cc @@ -20,26 +20,35 @@ #include "common/safe_io.h" #include "common/admin_socket_client.h" +#if !defined(_WIN32) #include <arpa/inet.h> +#endif #include <errno.h> #include <fcntl.h> #include <map> +#if !defined(_WIN32) #include <poll.h> +#endif #include <sstream> #include <stdint.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <string> +#if !defined(_WIN32) #include <sys/socket.h> +#endif #include <sys/types.h> +#if !defined(_WIN32) #include <sys/un.h> +#endif #include <time.h> #include <unistd.h> #include <vector> using std::ostringstream; +#if !defined(_WIN32) const char* get_rand_socket_path() { static char *g_socket_path = NULL; @@ -57,7 +66,9 @@ const char* get_rand_socket_path() } return g_socket_path; } +#endif +#if !defined(_WIN32) static std::string asok_connect(const std::string &path, int *fd) { int socket_fd = socket(PF_UNIX, SOCK_STREAM, 0); @@ -107,6 +118,7 @@ static std::string asok_connect(const std::string &path, int *fd) *fd = socket_fd; return ""; } +#endif static std::string asok_request(int socket_fd, std::string request) { @@ -127,6 +139,7 @@ AdminSocketClient(const std::string &path) { } +#if !defined(_WIN32) std::string AdminSocketClient::do_request(std::string request, std::string *result) { int socket_fd = 0, res; @@ -168,3 +181,4 @@ done: out: return err; } +#endif diff --git a/src/common/armor.c b/src/common/armor.c index 706e01e..a860552 100644 --- a/src/common/armor.c +++ b/src/common/armor.c @@ -2,7 +2,7 @@ #if defined(__linux__) #include <linux/errno.h> #else -#include <sys/errno.h> +#include <errno.h> #endif /* diff --git a/src/common/blkdev.cc b/src/common/blkdev.cc index 9c7240c..49028bc 100644 --- a/src/common/blkdev.cc +++ b/src/common/blkdev.cc @@ -51,6 +51,10 @@ int get_block_device_size(int fd, int64_t *psize) return ret; } +#elif defined(_WIN32) + +/* win32 currently doesn't use this */ + #else # error "Unable to query block device size: unsupported platform, please report." #endif diff --git a/src/common/buffer.cc b/src/common/buffer.cc index 95c7acd..fd303b3 100644 --- a/src/common/buffer.cc +++ b/src/common/buffer.cc @@ -26,7 +26,7 @@ #include <errno.h> #include <fstream> #include <sstream> -#include <sys/uio.h> +//#include <sys/uio.h> #include <limits.h> namespace ceph { @@ -101,7 +101,7 @@ static uint32_t simple_spinlock_t buffer_debug_lock = SIMPLE_SPINLOCK_INITIALIZE } bool is_page_aligned() { - return ((long)data & ~CEPH_PAGE_MASK) == 0; + return ((long)(intptr_t)data & ~CEPH_PAGE_MASK) == 0; } bool is_n_page_sized() { return (len & ~CEPH_PAGE_MASK) == 0; @@ -154,7 +154,7 @@ static uint32_t simple_spinlock_t buffer_debug_lock = SIMPLE_SPINLOCK_INITIALIZE } }; -#ifndef __CYGWIN__ +#if !defined(__CYGWIN__) && !defined(_WIN32) class buffer::raw_mmap_pages : public buffer::raw { public: raw_mmap_pages(unsigned l) : raw(l) { @@ -201,13 +201,13 @@ static uint32_t simple_spinlock_t buffer_debug_lock = SIMPLE_SPINLOCK_INITIALIZE }; #endif -#ifdef __CYGWIN__ +#if defined(__CYGWIN__) || defined(_WIN32) class buffer::raw_hack_aligned : public buffer::raw { char *realdata; public: raw_hack_aligned(unsigned l) : raw(l) { realdata = new char[len+CEPH_PAGE_SIZE-1]; - unsigned off = ((unsigned)realdata) & ~CEPH_PAGE_MASK; + unsigned off = ((unsigned)(intptr_t)realdata) & ~CEPH_PAGE_MASK; if (off) data = realdata + CEPH_PAGE_SIZE - off; else @@ -216,7 +216,7 @@ static uint32_t simple_spinlock_t buffer_debug_lock = SIMPLE_SPINLOCK_INITIALIZE //cout << "hack aligned " << (unsigned)data //<< " in raw " << (unsigned)realdata //<< " off " << off << std::endl; - assert(((unsigned)data & (CEPH_PAGE_SIZE-1)) == 0); + assert(((unsigned)(intptr_t)data & (CEPH_PAGE_SIZE-1)) == 0); } ~raw_hack_aligned() { delete[] realdata; @@ -285,7 +285,7 @@ static uint32_t simple_spinlock_t buffer_debug_lock = SIMPLE_SPINLOCK_INITIALIZE return new raw_static(buf, len); } buffer::raw* buffer::create_page_aligned(unsigned len) { -#ifndef __CYGWIN__ +#if !defined(__CYGWIN__) && !defined(_WIN32) //return new raw_mmap_pages(len); return new raw_posix_aligned(len); #else @@ -1269,6 +1269,30 @@ int buffer::list::write_file(const char *fn, int mode) return 0; } +struct iovec { + void *iov_base; + size_t iov_len; +}; + +#define IOV_MAX 16 + +static ssize_t writev(int fd, const struct iovec *iov, int iovcnt) { + int count; + int len; + int ret; + + for (count = 0; count < iovcnt; count++) { + ret = write(fd, iov[count].iov_base, iov[count].iov_len); + if (ret == -1) { + return ret; + } else if (ret == 0) { + return len; + } + len += ret; + } + return len; +} + int buffer::list::write_fd(int fd) const { // use writev! diff --git a/src/common/ceph_context.cc b/src/common/ceph_context.cc index e22afeb..96326ea 100644 --- a/src/common/ceph_context.cc +++ b/src/common/ceph_context.cc @@ -255,7 +255,9 @@ CephContext::CephContext(uint32_t module_type_) _module_type(module_type_), _service_thread(NULL), _log_obs(NULL), +#if !defined(_WIN32) _admin_socket(NULL), +#endif _perf_counters_collection(NULL), _perf_counters_conf_obs(NULL), _heartbeat_map(NULL), @@ -271,10 +273,13 @@ CephContext::CephContext(uint32_t module_type_) _conf->add_observer(_log_obs); _perf_counters_collection = new PerfCountersCollection(this); +#if !defined(_WIN32) _admin_socket = new AdminSocket(this); +#endif _heartbeat_map = new HeartbeatMap(this); _admin_hook = new CephContextHook(this); +#if !defined(_WIN32) _admin_socket->register_command("perfcounters_dump", "perfcounters_dump", _admin_hook, ""); _admin_socket->register_command("1", "1", _admin_hook, ""); _admin_socket->register_command("perf dump", "perf dump", _admin_hook, "dump perfcounters value"); @@ -287,6 +292,7 @@ CephContext::CephContext(uint32_t module_type_) _admin_socket->register_command("log flush", "log flush", _admin_hook, "flush log entries to log file"); _admin_socket->register_command("log dump", "log dump", _admin_hook, "dump recent log entries to log file"); _admin_socket->register_command("log reopen", "log reopen", _admin_hook, "reopen log file"); +#endif _crypto_none = new CryptoNone; _crypto_aes = new CryptoAES; @@ -300,6 +306,7 @@ CephContext::~CephContext() join_service_thread(); +#if !defined(_WIN32) _admin_socket->unregister_command("perfcounters_dump"); _admin_socket->unregister_command("perf dump"); _admin_socket->unregister_command("1"); @@ -312,8 +319,11 @@ CephContext::~CephContext() _admin_socket->unregister_command("log flush"); _admin_socket->unregister_command("log dump"); _admin_socket->unregister_command("log reopen"); +#endif delete _admin_hook; +#if !defined(_WIN32) delete _admin_socket; +#endif delete _heartbeat_map; @@ -349,18 +359,22 @@ void CephContext::start_service_thread() _service_thread->create(); ceph_spin_unlock(&_service_thread_lock); +#if !defined(_WIN32) // make logs flush on_exit() if (_conf->log_flush_on_exit) _log->set_flush_on_exit(); +#endif // Trigger callbacks on any config observers that were waiting for // it to become safe to start threads. _conf->set_val("internal_safe_to_start_threads", "true"); _conf->call_all_observers(); +#if !defined(_WIN32) // start admin socket if (_conf->admin_socket.length()) _admin_socket->init(_conf->admin_socket); +#endif } void CephContext::reopen_logs() diff --git a/src/common/ceph_context.h b/src/common/ceph_context.h index ba60620..ec3e7c0 100644 --- a/src/common/ceph_context.h +++ b/src/common/ceph_context.h @@ -23,6 +23,8 @@ #include "common/cmdparse.h" #include "include/Spinlock.h" +#include <pthread.h> + class AdminSocket; class CephContextServiceThread; class PerfCountersCollection; diff --git a/src/common/ceph_json.cc b/src/common/ceph_json.cc index a48e063..87da15b 100644 --- a/src/common/ceph_json.cc +++ b/src/common/ceph_json.cc @@ -438,6 +438,7 @@ void decode_json_obj(bufferlist& val, JSONObj *obj) } } +#if !defined(_WIN32) void decode_json_obj(utime_t& val, JSONObj *obj) { string s = obj->get_data(); @@ -450,6 +451,7 @@ void decode_json_obj(utime_t& val, JSONObj *obj) throw JSONDecoder::err("failed to decode utime_t"); } } +#endif void encode_json(const char *name, const string& val, Formatter *f) { diff --git a/src/common/errno.cc b/src/common/errno.cc index a981ab7..baee418 100644 --- a/src/common/errno.cc +++ b/src/common/errno.cc @@ -4,6 +4,8 @@ #include <string> #include <string.h> +#include "include/compat.h" + std::string cpp_strerror(int err) { char buf[128]; diff --git a/src/common/fd.cc b/src/common/fd.cc index 547e0f8..a57eba5 100644 --- a/src/common/fd.cc +++ b/src/common/fd.cc @@ -24,6 +24,7 @@ void dump_open_fds(CephContext *cct) { +#if !defined(_WIN32) const char *fn = "/proc/self/fd"; DIR *d = opendir(fn); if (!d) { @@ -54,4 +55,7 @@ void dump_open_fds(CephContext *cct) lderr(cct) << "dump_open_fds dumped " << n << " open files" << dendl; closedir(d); +#else + lderr(cct) << "dump_open_fds not supported under Windows" << dendl; +#endif } diff --git a/src/common/ipaddr.cc b/src/common/ipaddr.cc index f38f0cd..3fcac6b 100644 --- a/src/common/ipaddr.cc +++ b/src/common/ipaddr.cc @@ -1,9 +1,16 @@ #include "include/ipaddr.h" -#include <arpa/inet.h> +#if !defined(_WIN32) + #include <arpa/inet.h> +#else + #include <stdint.h> + #include <winsock2.h> + #include <ws2tcpip.h> +#endif #include <stdlib.h> #include <string.h> #include <sys/socket.h> +#include "include/compat.h" #include "acconfig.h" @@ -31,7 +38,7 @@ static void netmask_ipv4(const struct in_addr *addr, out->s_addr = addr->s_addr & mask; } - +#if !defined(_WIN32) const struct sockaddr *find_ipv4_in_subnet(const struct ifaddrs *addrs, const struct sockaddr_in *net, unsigned int prefix_len) { @@ -57,7 +64,7 @@ const struct sockaddr *find_ipv4_in_subnet(const struct ifaddrs *addrs, return NULL; } - +#endif static void netmask_ipv6(const struct in6_addr *addr, unsigned int prefix_len, @@ -72,7 +79,7 @@ static void netmask_ipv6(const struct in6_addr *addr, memset(out->s6_addr+prefix_len/8+1, 0, 16-prefix_len/8-1); } - +#if !defined(_WIN32) const struct sockaddr *find_ipv6_in_subnet(const struct ifaddrs *addrs, const struct sockaddr_in6 *net, unsigned int prefix_len) { @@ -97,8 +104,9 @@ const struct sockaddr *find_ipv6_in_subnet(const struct ifaddrs *addrs, return NULL; } +#endif - +#if !defined(_WIN32) const struct sockaddr *find_ip_in_subnet(const struct ifaddrs *addrs, const struct sockaddr *net, unsigned int prefix_len) { @@ -112,8 +120,9 @@ const struct sockaddr *find_ip_in_subnet(const struct ifaddrs *addrs, return NULL; } +#endif - +#if !defined(_WIN32) bool parse_network(const char *s, struct sockaddr *network, unsigned int *prefix_len) { char *slash = strchr((char*)s, '/'); if (!slash) { @@ -161,3 +170,4 @@ bool parse_network(const char *s, struct sockaddr *network, unsigned int *prefix return false; } +#endif diff --git a/src/common/page.cc b/src/common/page.cc index 6ba4215..5425742 100644 --- a/src/common/page.cc +++ b/src/common/page.cc @@ -12,7 +12,11 @@ namespace ceph { return n; } +#if !defined(_WIN32) unsigned _page_size = sysconf(_SC_PAGESIZE); +#else + unsigned _page_size = 4096; +#endif unsigned long _page_mask = ~(unsigned long)(_page_size - 1); unsigned _page_shift = _get_bits_of(_page_size); diff --git a/src/common/perf_counters.cc b/src/common/perf_counters.cc index 4fe1354..f2d5e4d 100644 --- a/src/common/perf_counters.cc +++ b/src/common/perf_counters.cc @@ -25,6 +25,7 @@ #include <stdint.h> #include <string.h> #include <string> +#include "include/compat.h" using std::ostringstream; diff --git a/src/common/pick_address.cc b/src/common/pick_address.cc index f685362..3ed73ed 100644 --- a/src/common/pick_address.cc +++ b/src/common/pick_address.cc @@ -14,7 +14,9 @@ #include "common/pick_address.h" +#if !defined(_WIN32) #include <netdb.h> +#endif #include <errno.h> #include "include/ipaddr.h" @@ -24,6 +26,7 @@ #define dout_subsys ceph_subsys_ +#if !defined(_WIN32) static const struct sockaddr *find_ip_in_subnet_list(CephContext *cct, const struct ifaddrs *ifa, const std::string &networks) @@ -47,6 +50,7 @@ static const struct sockaddr *find_ip_in_subnet_list(CephContext *cct, return NULL; } +#endif // observe this change struct Observer : public md_config_obs_t { @@ -65,6 +69,7 @@ struct Observer : public md_config_obs_t { } }; +#if !defined(_WIN32) static void fill_in_one_address(CephContext *cct, const struct ifaddrs *ifa, const string networks, @@ -101,7 +106,9 @@ static void fill_in_one_address(CephContext *cct, cct->_conf->remove_observer(&obs); } +#endif +#if !defined(_WIN32) void pick_addresses(CephContext *cct, int needs) { struct ifaddrs *ifa; @@ -126,7 +133,9 @@ void pick_addresses(CephContext *cct, int needs) freeifaddrs(ifa); } +#endif +#if !defined(_WIN32) bool have_local_addr(CephContext *cct, const list<entity_addr_t>& ls, entity_addr_t *match) { struct ifaddrs *ifa; @@ -155,3 +164,4 @@ bool have_local_addr(CephContext *cct, const list<entity_addr_t>& ls, entity_add freeifaddrs(ifa); return found; } +#endif diff --git a/src/common/pipe.c b/src/common/pipe.c index 8144558..b3874ce 100644 --- a/src/common/pipe.c +++ b/src/common/pipe.c @@ -20,6 +20,7 @@ #include <fcntl.h> #include <unistd.h> +#if !defined(_WIN32) int pipe_cloexec(int pipefd[2]) { int ret; @@ -59,3 +60,4 @@ out: return ret; #endif } +#endif diff --git a/src/common/run_cmd.cc b/src/common/run_cmd.cc index 5f5cc3c..41d7e49 100644 --- a/src/common/run_cmd.cc +++ b/src/common/run_cmd.cc @@ -19,12 +19,13 @@ #include <stdarg.h> #include <stdlib.h> #include <sys/types.h> -#include <sys/wait.h> +//#include <sys/wait.h> #include <unistd.h> #include <vector> using std::ostringstream; +#if !defined(_WIN32) std::string run_cmd(const char *cmd, ...) { std::vector <const char *> arr; @@ -78,3 +79,4 @@ std::string run_cmd(const char *cmd, ...) oss << "run_cmd(" << cmd << "): terminated by unknown mechanism"; return oss.str(); } +#endif diff --git a/src/common/secret.c b/src/common/secret.c index 8215093..d792ff9 100644 --- a/src/common/secret.c +++ b/src/common/secret.c @@ -18,7 +18,7 @@ #include <unistd.h> #include <errno.h> #include <fcntl.h> -#include <keyutils.h> +//#include <keyutils.h> #include <sys/types.h> #include "common/armor.h" diff --git a/src/common/signal.cc b/src/common/signal.cc index 406ff46..fe74807 100644 --- a/src/common/signal.cc +++ b/src/common/signal.cc @@ -25,6 +25,7 @@ #include <sys/stat.h> #include <sys/types.h> +#if !defined(_WIN32) std::string signal_mask_to_str() { sigset_t old_sigset; @@ -44,7 +45,9 @@ std::string signal_mask_to_str() oss << " }"; return oss.str(); } +#endif +#if !defined(_WIN32) /* Block the signals in 'siglist'. If siglist == NULL, block all signals. */ void block_signals(const int *siglist, sigset_t *old_sigset) { @@ -63,6 +66,7 @@ void block_signals(const int *siglist, sigset_t *old_sigset) int ret = pthread_sigmask(SIG_BLOCK, &sigset, old_sigset); assert(ret == 0); } +#endif void restore_sigset(const sigset_t *old_sigset) { @@ -70,6 +74,7 @@ void restore_sigset(const sigset_t *old_sigset) assert(ret == 0); } +#if !defined(_WIN32) void unblock_all_signals(sigset_t *old_sigset) { sigset_t sigset; @@ -78,3 +83,4 @@ void unblock_all_signals(sigset_t *old_sigset) int ret = pthread_sigmask(SIG_UNBLOCK, &sigset, old_sigset); assert(ret == 0); } +#endif diff --git a/src/common/xattr.c b/src/common/xattr.c index db1900d..b4c6a90 100644 --- a/src/common/xattr.c +++ b/src/common/xattr.c @@ -294,3 +294,4 @@ ceph_os_fremovexattr(int fd, const char *name) return (error); } +#endif diff --git a/src/crush/CrushCompiler.cc b/src/crush/CrushCompiler.cc index 5f92bf7..2665206 100644 --- a/src/crush/CrushCompiler.cc +++ b/src/crush/CrushCompiler.cc @@ -1,5 +1,6 @@ #include "CrushCompiler.h" +#include "include/compat.h" #ifndef EBADE #define EBADE EFTYPE diff --git a/src/crush/CrushTester.cc b/src/crush/CrushTester.cc index b38386d..adf1c76 100644 --- a/src/crush/CrushTester.cc +++ b/src/crush/CrushTester.cc @@ -144,6 +144,8 @@ void CrushTester::adjust_weights(vector<__u32>& weight) } } } +#if !defined(_WIN32) +#endif bool CrushTester::check_valid_placement(int ruleno, vector<int> in, const vector<__u32>& weight) { @@ -236,6 +238,7 @@ bool CrushTester::check_valid_placement(int ruleno, vector<int> in, const vector return valid_placement; } +#if !defined(_WIN32) int CrushTester::random_placement(int ruleno, vector<int>& out, int maxout, vector<__u32>& weight) { // get the total weight of the system @@ -282,6 +285,7 @@ int CrushTester::random_placement(int ruleno, vector<int>& out, int maxout, vect return 0; } +#endif void CrushTester::write_integer_indexed_vector_data_string(vector<string> &dst, int index, vector<int> vector_data) { diff --git a/src/crush/CrushWrapper.cc b/src/crush/CrushWrapper.cc index d17166b..2338824 100644 --- a/src/crush/CrushWrapper.cc +++ b/src/crush/CrushWrapper.cc @@ -1,4 +1,4 @@ - +#include "include/compat.h" #include "common/debug.h" #include "common/Formatter.h" diff --git a/src/crush/crush.h b/src/crush/crush.h index 4adabcb..f5e83c1 100644 --- a/src/crush/crush.h +++ b/src/crush/crush.h @@ -5,7 +5,7 @@ #if defined(__linux__) #include <linux/types.h> -#elif defined(__FreeBSD__) +#elif defined(__FreeBSD__) || defined(_WIN32) #include <sys/types.h> #endif diff --git a/src/crush/hash.c b/src/crush/hash.c index 8f1d31a..6d0035f 100644 --- a/src/crush/hash.c +++ b/src/crush/hash.c @@ -4,7 +4,7 @@ #if defined(__linux__) #include <linux/types.h> -#elif defined(__FreeBSD__) +#elif defined(__FreeBSD__) || defined(_WIN32) #include <sys/types.h> #endif diff --git a/src/global/global_init.cc b/src/global/global_init.cc index e96c317..c42b692 100644 --- a/src/global/global_init.cc +++ b/src/global/global_init.cc @@ -94,6 +94,7 @@ void global_init(std::vector < const char * > *alt_def_args, std::vector < const } else if (ret) { dout_emergency("global_init: error reading config file.\n"); + complain_about_parse_errors(cct, &parse_errors); _exit(1); } @@ -109,6 +110,7 @@ void global_init(std::vector < const char * > *alt_def_args, std::vector < const // Now we're ready to complain about config file parse errors complain_about_parse_errors(cct, &parse_errors); +#if !defined(_WIN32) // signal stuff int siglist[] = { SIGPIPE, 0 }; block_signals(siglist, NULL); @@ -118,11 +120,16 @@ void global_init(std::vector < const char * > *alt_def_args, std::vector < const if (g_conf->log_flush_on_exit) g_ceph_context->_log->set_flush_on_exit(); +#endif if (g_conf->run_dir.length() && code_env == CODE_ENVIRONMENT_DAEMON && !(flags & CINIT_FLAG_NO_DAEMON_ACTIONS)) { +#if !defined(_WIN32) int r = ::mkdir(g_conf->run_dir.c_str(), 0755); +#else + int r = ::mkdir(g_conf->run_dir.c_str()); +#endif if (r < 0 && errno != EEXIST) { r = -errno; derr << "warning: unable to create " << g_conf->run_dir << ": " << cpp_strerror(r) << dendl; @@ -172,6 +179,7 @@ void global_init_daemonize(CephContext *cct, int flags) if (global_init_prefork(cct, flags) < 0) return; +#if !defined(_WIN32) int ret = daemon(1, 1); if (ret) { ret = errno; @@ -179,6 +187,7 @@ void global_init_daemonize(CephContext *cct, int flags) << cpp_strerror(ret) << dendl; exit(1); } +#endif global_init_postfork(cct, flags); } diff --git a/src/global/signal_handler.cc b/src/global/signal_handler.cc index ffdc540..ded7b84 100644 --- a/src/global/signal_handler.cc +++ b/src/global/signal_handler.cc @@ -19,7 +19,9 @@ #include "global/pidfile.h" #include "global/signal_handler.h" +#if !defined(_WIN32) #include <poll.h> +#endif #include <signal.h> #include <sstream> #include <stdlib.h> diff --git a/src/include/assert.h b/src/include/assert.h index 5584b8f..84d4c94 100644 --- a/src/include/assert.h +++ b/src/include/assert.h @@ -6,6 +6,10 @@ #elif defined(__FreeBSD__) #include <sys/cdefs.h> #define __GNUC_PREREQ(minor, major) __GNUC_PREREQ__(minor, major) +#elif defined(_WIN32) +#include <sys/cdefs.h> +#define __GNUC_PREREQ(minor, major) __MINGW_GNUC_PREREQ(minor, major) +#define __STRING(x) #x #endif #ifdef __CEPH__ diff --git a/src/include/buffer.h b/src/include/buffer.h index 359a9ca..11e6253 100644 --- a/src/include/buffer.h +++ b/src/include/buffer.h @@ -17,7 +17,7 @@ #if defined(__linux__) #include <stdlib.h> #include <linux/types.h> -#elif defined(__FreeBSD__) +#elif defined(__FreeBSD__) || defined(_WIN32) #include <sys/types.h> #include <stdlib.h> #endif @@ -47,7 +47,7 @@ #include <stdint.h> #include <string.h> -#ifndef __CYGWIN__ +#if !defined(__CYGWIN__) && !defined(_WIN32) # include <sys/mman.h> #endif @@ -179,7 +179,7 @@ public: bool at_buffer_head() const { return _off == 0; } bool at_buffer_tail() const; - bool is_page_aligned() const { return ((long)c_str() & ~CEPH_PAGE_MASK) == 0; } + bool is_page_aligned() const { return ((long)(intptr_t)c_str() & ~CEPH_PAGE_MASK) == 0; } bool is_n_page_sized() const { return (length() & ~CEPH_PAGE_MASK) == 0; } // accessors diff --git a/src/include/compat.h b/src/include/compat.h index e766534..c38e92c 100644 --- a/src/include/compat.h +++ b/src/include/compat.h @@ -20,6 +20,60 @@ #define lseek64(fd, offset, whence) lseek(fd, offset, whence) #endif /* !__FreeBSD__ */ +#if defined(_WIN32) +#include <unistd.h> +/* winsock2.h needs to be included before windows.h */ +#include <winsock2.h> +#include <windows.h> +typedef long long loff_t; +//#define PRId64 "I64d" +//#define PRIx64 "I64x" +#ifndef EBADMSG + #define EBADMSG 74 +#endif +#ifndef EBADE + #define EBADE 52 +#endif + +#define strerror_r(errnum, buf, buflen) ({strerror_s(buf, buflen, errnum); buf;}) + +#define S_IFLNK 0120000 + +#define IFTODT(mode) (((mode) & 0170000) >> 12) + +#define POLLIN 0x01 +#define POLLPRI 0x02 +#define POLLOUT 0x04 +#define POLLERR 0x08 +#define POLLHUP 0x10 +#define POLLNVAL 0x20 + +static __inline ssize_t pread(int fd, void *buf, size_t count, off_t offset) { + off_t lseek_ret = lseek(fd, offset, SEEK_SET); + if (lseek_ret != offset) { + return -1; + } + return read(fd, buf, count); +} + +static __inline ssize_t pwrite(int fd, const void *buf, size_t count, off_t offset) { + off_t lseek_ret = lseek(fd, offset, SEEK_SET); + if (lseek_ret != offset) { + return -1; + } + return write(fd, buf, count); +} + +static __inline int fsync(int fd) { + return (FlushFileBuffers((HANDLE)_get_osfhandle(fd))) ? 0 : -1; +} + +/* windows strtok uses thread lock storage */ +#undef strtok_r +#define strtok_r(str, delim, saveptr) strtok_s(str, delim, saveptr); + +#endif + #ifndef TEMP_FAILURE_RETRY #define TEMP_FAILURE_RETRY(expression) ({ \ typeof(expression) __result; \ diff --git a/src/include/err.h b/src/include/err.h index ba4b32a..f5c89ab 100644 --- a/src/include/err.h +++ b/src/include/err.h @@ -18,12 +18,12 @@ static inline void *ERR_PTR(long error) static inline long PTR_ERR(const void *ptr) { - return (long) ptr; + return (long)(intptr_t) ptr; } static inline long IS_ERR(const void *ptr) { - return IS_ERR_VALUE((unsigned long)ptr); + return IS_ERR_VALUE((unsigned long)(uintptr_t)ptr); } #endif diff --git a/src/include/int_types.h b/src/include/int_types.h index 98220e9..9d9c5dc 100644 --- a/src/include/int_types.h +++ b/src/include/int_types.h @@ -33,12 +33,22 @@ #if !defined(PRIu64) # if defined(HAVE_INTTYPES_H) || defined(HAVE_GLIB) /* If we have inttypes or glib, assume we have 64-bit long long int */ -# define PRIu64 "llu" -# define PRIi64 "lli" -# define PRIx64 "llx" -# define PRIX64 "llX" -# define PRIo64 "llo" -# define PRId64 "lld" +# if !defined(_WIN32) +# define PRIu64 "llu" +# define PRIi64 "lli" +# define PRIx64 "llx" +# define PRIX64 "llX" +# define PRIo64 "llo" +# define PRId64 "lld" +# else +/* not sure how many of these actually work */ +# define PRIu64 "I64d" +# define PRIi64 "I64i" +# define PRIx64 "I64x" +# define PRIX64 "I64X" +# define PRIo64 "I64o" +# define PRId64 "I64d" +# endif # else /* Assume that we don't have long long, so use long int modifiers */ # define PRIu64 "lu" diff --git a/src/include/ipaddr.h b/src/include/ipaddr.h index cac13d6..14943df 100644 --- a/src/include/ipaddr.h +++ b/src/include/ipaddr.h @@ -1,9 +1,13 @@ #ifndef CEPH_IPADDR_H #define CEPH_IPADDR_H -#include <netinet/in.h> +#if !defined(_WIN32) + #include <netinet/in.h> + #include <ifaddrs.h> +#else + #include <winsock2.h> +#endif #include <sys/types.h> -#include <ifaddrs.h> /* Find an IP address that is in the wanted subnet. diff --git a/src/include/msgr.h b/src/include/msgr.h index 5854682..9a71252 100644 --- a/src/include/msgr.h +++ b/src/include/msgr.h @@ -2,7 +2,11 @@ #define CEPH_MSGR_H #ifdef __cplusplus -#include <sys/socket.h> // for struct sockaddr_storage +#if defined(_WIN32) + #include <winsock2.h> +#else + #include <sys/socket.h> // for struct sockaddr_storage +#endif #endif /* diff --git a/src/include/rados/librados.h b/src/include/rados/librados.h index a67b85e..77c181c 100644 --- a/src/include/rados/librados.h +++ b/src/include/rados/librados.h @@ -5,7 +5,11 @@ extern "C" { #endif -#include <netinet/in.h> +#if defined(_WIN32) + #include <winsock2.h> +#else + #include <netinet/in.h> +#endif #if defined(__linux__) #include <linux/types.h> #elif defined(__FreeBSD__) diff --git a/src/include/rbd/librbd.h b/src/include/rbd/librbd.h index 5be8203..0923668 100644 --- a/src/include/rbd/librbd.h +++ b/src/include/rbd/librbd.h @@ -19,10 +19,14 @@ extern "C" { #endif -#include <netinet/in.h> #if defined(__linux__) +#include <netinet/in.h> #include <linux/types.h> #elif defined(__FreeBSD__) +#include <netinet/in.h> +#include <sys/types.h> +#elif defined(_WIN32) +#include <winsock.h> #include <sys/types.h> #endif #include <string.h> diff --git a/src/include/statlite.h b/src/include/statlite.h index 2ab3a94..cb282b2 100644 --- a/src/include/statlite.h +++ b/src/include/statlite.h @@ -11,6 +11,14 @@ extern "C" { #include <unistd.h> #include <dirent.h> +#if defined(_WIN32) + typedef uint32_t nlink_t; + typedef uint16_t uid_t; + typedef uint16_t gid_t; + typedef uint64_t blksize_t; + typedef uint32_t blkcnt_t; +#endif + struct statlite { dev_t st_dev; /* device */ ino_t st_ino; /* inode */ diff --git a/src/include/types.h b/src/include/types.h index bc6e077..4ece87e 100644 --- a/src/include/types.h +++ b/src/include/types.h @@ -20,7 +20,12 @@ #include "uuid.h" -#include <netinet/in.h> +#if defined(_WIN32) + #include <winsock2.h> + #include <ws2ipdef.h> +#else + #include <netinet/in.h> +#endif #include <fcntl.h> #include <string.h> @@ -103,7 +108,7 @@ CEPH_HASH_NAMESPACE_START }; #endif -#if !defined(__LP64__) || defined(__APPLE__) +#if !defined(_WIN32) && (!defined(__LP64__) || defined(__APPLE__)) /* * FIXME: not sure how to test for this robustly yet, but on Mavericks with * C++11 these definitions are present. diff --git a/src/include/utime.h b/src/include/utime.h index 1a74a85..d36fb3f 100644 --- a/src/include/utime.h +++ b/src/include/utime.h @@ -107,6 +107,13 @@ public: tv.tv_nsec = t->tv_nsec; } +#if defined(_WIN32) + /* this is required because ::gmtime_r is a macro that calls gmtime, not ::gmtime */ + static struct tm *gmtime(const time_t *timep) { + return ::gmtime(timep); + } +#endif + utime_t round_to_minute() { struct tm bdt; time_t tt = sec(); @@ -172,6 +179,9 @@ public: return out; } + static char *asctime(const struct tm *tm) { + return ::asctime(tm); + } // output ostream& asctime(ostream& out) const { out.setf(std::ios::right); @@ -199,6 +209,10 @@ public: return out; } + static struct tm *localtime(const time_t *timep) { + return ::localtime(timep); + } + ostream& localtime(ostream& out) const { out.setf(std::ios::right); char oldfill = out.fill(); @@ -238,6 +252,7 @@ public: bdt.tm_hour, bdt.tm_min, bdt.tm_sec, usec()); } +#if 0 static time_t my_timegm (struct tm *tm) { time_t ret; char *tz; @@ -307,6 +322,7 @@ public: return 0; } +#endif }; WRITE_CLASS_ENCODER(utime_t) diff --git a/src/include/uuid.h b/src/include/uuid.h index 942b807..201ac76 100644 --- a/src/include/uuid.h +++ b/src/include/uuid.h @@ -8,6 +8,70 @@ #include "encoding.h" #include <ostream> +#if defined(_WIN32) + +#include <boost/lexical_cast.hpp> +#include <boost/uuid/uuid.hpp> +#include <boost/uuid/uuid_generators.hpp> +#include <boost/uuid/uuid_io.hpp> +#include <string> + +struct uuid_d { + boost::uuids::uuid uuid; + + uuid_d() { + uuid = boost::uuids::nil_uuid(); + } + + bool is_zero() const { + return uuid.is_nil(); + //return boost::uuids::uuid::is_nil(uuid); + } + + void generate_random() { + boost::uuids::random_generator gen; + uuid = gen(); + } + + bool parse(const char *s) { + boost::uuids::string_generator gen; + uuid = gen(s); + return true; + // what happens if parse fails? + } + void print(char *s) { + std::string str = boost::lexical_cast<std::string>(uuid); + memcpy(s, str.c_str(), 37); + } + + void encode(bufferlist& bl) const { + ::encode_raw(uuid, bl); + } + void decode(bufferlist::iterator& p) const { + ::decode_raw(uuid, p); + } + + uuid_d& operator=(const uuid_d& r) { + uuid = r.uuid; + return *this; + } +}; +WRITE_CLASS_ENCODER(uuid_d) + +inline std::ostream& operator<<(std::ostream& out, const uuid_d& u) { + //char b[37]; + //uuid_unparse(u.uuid, b); + return out << u.uuid; +} + +inline bool operator==(const uuid_d& l, const uuid_d& r) { + return l.uuid == r.uuid; +} + +inline bool operator!=(const uuid_d& l, const uuid_d& r) { + return l.uuid != r.uuid; +} +#else extern "C" { #include <uuid/uuid.h> #include <unistd.h> @@ -56,6 +120,6 @@ inline bool operator==(const uuid_d& l, const uuid_d& r) { inline bool operator!=(const uuid_d& l, const uuid_d& r) { return uuid_compare(l.uuid, r.uuid) != 0; } - +#endif #endif diff --git a/src/librados/librados.cc b/src/librados/librados.cc index 95abbc2..c4bbb6a 100644 --- a/src/librados/librados.cc +++ b/src/librados/librados.cc @@ -1054,7 +1054,7 @@ int librados::IoCtx::lock_exclusive(const std::string &oid, const std::string &n if (duration) dur.set_from_timeval(duration); - return rados::cls::lock::lock(this, oid, name, LOCK_EXCLUSIVE, cookie, "", + return rados::cls::lock::lock(this, oid, name, xLOCK_EXCLUSIVE, cookie, "", description, dur, flags); } @@ -1113,7 +1113,7 @@ int librados::IoCtx::list_lockers(const std::string &oid, const std::string &nam if (tag) *tag = tmp_tag; if (exclusive) { - if (tmp_type == LOCK_EXCLUSIVE) + if (tmp_type == xLOCK_EXCLUSIVE) *exclusive = 1; else *exclusive = 0; diff --git a/src/librbd/internal.cc b/src/librbd/internal.cc index 4185f36..0915c7b 100644 --- a/src/librbd/internal.cc +++ b/src/librbd/internal.cc @@ -3,6 +3,9 @@ #include "include/int_types.h" #include <errno.h> +#if defined(_WIN32) + #define ESTALE 116 /* Stale NFS file handle */ +#endif #include <limits.h> #include "common/ceph_context.h" @@ -1679,7 +1682,7 @@ reprotect_and_return_err: << dendl; return r; } - ictx->exclusive_locked = (lock_type == LOCK_EXCLUSIVE); + ictx->exclusive_locked = (lock_type == xLOCK_EXCLUSIVE); ictx->order = ictx->header.options.order; ictx->size = ictx->header.image_size; ictx->object_prefix = ictx->header.block_name; @@ -2257,7 +2260,7 @@ reprotect_and_return_err: */ RWLock::RLocker locker(ictx->md_lock); r = rados::cls::lock::lock(&ictx->md_ctx, ictx->header_oid, RBD_LOCK_NAME, - exclusive ? LOCK_EXCLUSIVE : LOCK_SHARED, + exclusive ? xLOCK_EXCLUSIVE : LOCK_SHARED, cookie, tag, "", utime_t(), 0); if (r < 0) return r; diff --git a/src/log/Log.cc b/src/log/Log.cc index b597b0e..b5ae1d6 100644 --- a/src/log/Log.cc +++ b/src/log/Log.cc @@ -4,7 +4,8 @@ #include "Log.h" #include <errno.h> -#include <syslog.h> +//#include <syslog.h> +#include "include/compat.h" #include <iostream> #include <sstream> @@ -82,6 +83,7 @@ Log::~Log() /// +#if !defined(_WIN32) void Log::set_flush_on_exit() { // Make sure we flush on shutdown. We do this by deliberately @@ -97,6 +99,7 @@ void Log::set_flush_on_exit() #endif } } +#endif void Log::set_max_new(int n) { @@ -221,10 +224,11 @@ void Log::_flush(EntryQueue *t, EntryQueue *requeue, bool crash) if (r < 0) cerr << "problem writing to " << m_log_file << ": " << cpp_strerror(r) << std::endl; } - +#if !defined(_WIN32) if (do_syslog) { syslog(LOG_USER, "%s%s", buf, s.c_str()); } +#endif if (do_stderr) { cerr << buf << s << std::endl; @@ -244,9 +248,11 @@ void Log::_log_message(const char *s, bool crash) if (r < 0) cerr << "problem writing to " << m_log_file << ": " << cpp_strerror(r) << std::endl; } +#if !defined(_WIN32) if ((crash ? m_syslog_crash : m_syslog_log) >= 0) { syslog(LOG_USER, "%s", s); } +#endif if ((crash ? m_stderr_crash : m_stderr_log) >= 0) { cerr << s << std::endl; diff --git a/src/mds/CDentry.h b/src/mds/CDentry.h index e40854a..3bf8c53 100644 --- a/src/mds/CDentry.h +++ b/src/mds/CDentry.h @@ -170,7 +170,7 @@ public: static LockType versionlock_type; SimpleLock lock; - LocalLock versionlock; + xLocalLock versionlock; public: // cons diff --git a/src/mds/CInode.h b/src/mds/CInode.h index 1c2a933..5523aca 100644 --- a/src/mds/CInode.h +++ b/src/mds/CInode.h @@ -616,7 +616,7 @@ public: static LockType flocklock_type; static LockType policylock_type; - LocalLock versionlock; + xLocalLock versionlock; SimpleLock authlock; SimpleLock linklock; ScatterLock dirfragtreelock; diff --git a/src/mds/LocalLock.h b/src/mds/LocalLock.h index c797ea7..33bbba0 100644 --- a/src/mds/LocalLock.h +++ b/src/mds/LocalLock.h @@ -18,11 +18,12 @@ #include "SimpleLock.h" -class LocalLock : public SimpleLock { +/* LocalLock is the name of a Win32 API */ +class xLocalLock : public SimpleLock { public: client_t last_wrlock_client; - LocalLock(MDSCacheObject *o, LockType *t) : + xLocalLock(MDSCacheObject *o, LockType *t) : SimpleLock(o, t) { set_state(LOCK_LOCK); // always. } diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index e11bbd8..e361c7f 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -1243,7 +1243,7 @@ void Locker::wrlock_force(SimpleLock *lock, Mutation *mut) { if (lock->get_type() == CEPH_LOCK_IVERSION || lock->get_type() == CEPH_LOCK_DVERSION) - return local_wrlock_grab(static_cast<LocalLock*>(lock), mut); + return local_wrlock_grab(static_cast<xLocalLock*>(lock), mut); dout(7) << "wrlock_force on " << *lock << " on " << *lock->get_parent() << dendl; @@ -1256,7 +1256,7 @@ bool Locker::wrlock_start(SimpleLock *lock, MDRequest *mut, bool nowait) { if (lock->get_type() == CEPH_LOCK_IVERSION || lock->get_type() == CEPH_LOCK_DVERSION) - return local_wrlock_start(static_cast<LocalLock*>(lock), mut); + return local_wrlock_start(static_cast<xLocalLock*>(lock), mut); dout(10) << "wrlock_start " << *lock << " on " << *lock->get_parent() << dendl; @@ -1319,7 +1319,7 @@ void Locker::wrlock_finish(SimpleLock *lock, Mutation *mut, bool *pneed_issue) { if (lock->get_type() == CEPH_LOCK_IVERSION || lock->get_type() == CEPH_LOCK_DVERSION) - return local_wrlock_finish(static_cast<LocalLock*>(lock), mut); + return local_wrlock_finish(static_cast<xLocalLock*>(lock), mut); dout(7) << "wrlock_finish on " << *lock << " on " << *lock->get_parent() << dendl; lock->put_wrlock(); @@ -1389,7 +1389,7 @@ bool Locker::xlock_start(SimpleLock *lock, MDRequest *mut) { if (lock->get_type() == CEPH_LOCK_IVERSION || lock->get_type() == CEPH_LOCK_DVERSION) - return local_xlock_start(static_cast<LocalLock*>(lock), mut); + return local_xlock_start(static_cast<xLocalLock*>(lock), mut); dout(7) << "xlock_start on " << *lock << " on " << *lock->get_parent() << dendl; client_t client = mut->get_client(); @@ -1488,7 +1488,7 @@ void Locker::xlock_finish(SimpleLock *lock, Mutation *mut, bool *pneed_issue) { if (lock->get_type() == CEPH_LOCK_IVERSION || lock->get_type() == CEPH_LOCK_DVERSION) - return local_xlock_finish(static_cast<LocalLock*>(lock), mut); + return local_xlock_finish(static_cast<xLocalLock*>(lock), mut); dout(10) << "xlock_finish on " << *lock << " " << *lock->get_parent() << dendl; @@ -4070,7 +4070,7 @@ void Locker::scatter_tempsync(ScatterLock *lock, bool *need_issue) // ========================================================================== // local lock -void Locker::local_wrlock_grab(LocalLock *lock, Mutation *mut) +void Locker::local_wrlock_grab(xLocalLock *lock, Mutation *mut) { dout(7) << "local_wrlock_grab on " << *lock << " on " << *lock->get_parent() << dendl; @@ -4083,7 +4083,7 @@ void Locker::local_wrlock_grab(LocalLock *lock, Mutation *mut) mut->locks.insert(lock); } -bool Locker::local_wrlock_start(LocalLock *lock, MDRequest *mut) +bool Locker::local_wrlock_start(xLocalLock *lock, MDRequest *mut) { dout(7) << "local_wrlock_start on " << *lock << " on " << *lock->get_parent() << dendl; @@ -4101,7 +4101,7 @@ bool Locker::local_wrlock_start(LocalLock *lock, MDRequest *mut) } } -void Locker::local_wrlock_finish(LocalLock *lock, Mutation *mut) +void Locker::local_wrlock_finish(xLocalLock *lock, Mutation *mut) { dout(7) << "local_wrlock_finish on " << *lock << " on " << *lock->get_parent() << dendl; @@ -4115,7 +4115,7 @@ void Locker::local_wrlock_finish(LocalLock *lock, Mutation *mut) } } -bool Locker::local_xlock_start(LocalLock *lock, MDRequest *mut) +bool Locker::local_xlock_start(xLocalLock *lock, MDRequest *mut) { dout(7) << "local_xlock_start on " << *lock << " on " << *lock->get_parent() << dendl; @@ -4132,7 +4132,7 @@ bool Locker::local_xlock_start(LocalLock *lock, MDRequest *mut) return true; } -void Locker::local_xlock_finish(LocalLock *lock, Mutation *mut) +void Locker::local_xlock_finish(xLocalLock *lock, Mutation *mut) { dout(7) << "local_xlock_finish on " << *lock << " on " << *lock->get_parent() << dendl; diff --git a/src/mds/Locker.h b/src/mds/Locker.h index 0c9931a..98f4f9e 100644 --- a/src/mds/Locker.h +++ b/src/mds/Locker.h @@ -51,7 +51,7 @@ class LogSegment; class SimpleLock; class ScatterLock; -class LocalLock; +class xLocalLock; class MDCache; #include "SimpleLock.h" @@ -230,12 +230,12 @@ public: // local public: - void local_wrlock_grab(LocalLock *lock, Mutation *mut); + void local_wrlock_grab(xLocalLock *lock, Mutation *mut); protected: - bool local_wrlock_start(LocalLock *lock, MDRequest *mut); - void local_wrlock_finish(LocalLock *lock, Mutation *mut); - bool local_xlock_start(LocalLock *lock, MDRequest *mut); - void local_xlock_finish(LocalLock *lock, Mutation *mut); + bool local_wrlock_start(xLocalLock *lock, MDRequest *mut); + void local_wrlock_finish(xLocalLock *lock, Mutation *mut); + bool local_xlock_start(xLocalLock *lock, MDRequest *mut); + void local_xlock_finish(xLocalLock *lock, Mutation *mut); // file diff --git a/src/mds/mdstypes.h b/src/mds/mdstypes.h index 53819de..cd4d86d 100644 --- a/src/mds/mdstypes.h +++ b/src/mds/mdstypes.h @@ -11,6 +11,8 @@ #include <map> using namespace std; +#include "include/compat.h" + #include "common/config.h" #include "common/Clock.h" #include "common/DecayCounter.h" diff --git a/src/messages/MAuthReply.h b/src/messages/MAuthReply.h index 76359a5..a3b10d5 100644 --- a/src/messages/MAuthReply.h +++ b/src/messages/MAuthReply.h @@ -16,6 +16,7 @@ #define CEPH_MAUTHREPLY_H #include "msg/Message.h" +#include "include/compat.h" struct MAuthReply : public Message { __u32 protocol; diff --git a/src/messages/MCommand.h b/src/messages/MCommand.h index e2fe075..a92a535 100644 --- a/src/messages/MCommand.h +++ b/src/messages/MCommand.h @@ -16,7 +16,7 @@ #define CEPH_MCOMMAND_H #include <vector> -#include <uuid/uuid.h> +//#include <uuid/uuid.h> #include "msg/Message.h" diff --git a/src/messages/MGetPoolStats.h b/src/messages/MGetPoolStats.h index acf9637..b407d66 100644 --- a/src/messages/MGetPoolStats.h +++ b/src/messages/MGetPoolStats.h @@ -16,7 +16,7 @@ #ifndef CEPH_MGETPOOLSTATS_H #define CEPH_MGETPOOLSTATS_H -#include <uuid/uuid.h> +//#include <uuid/uuid.h> #include "messages/PaxosServiceMessage.h" diff --git a/src/messages/MGetPoolStatsReply.h b/src/messages/MGetPoolStatsReply.h index 719d5b8..f312e80 100644 --- a/src/messages/MGetPoolStatsReply.h +++ b/src/messages/MGetPoolStatsReply.h @@ -16,7 +16,7 @@ #ifndef CEPH_MGETPOOLSTATSREPLY_H #define CEPH_MGETPOOLSTATSREPLY_H -#include <uuid/uuid.h> +//#include <uuid/uuid.h> class MGetPoolStatsReply : public PaxosServiceMessage { public: diff --git a/src/messages/MLog.h b/src/messages/MLog.h index c71f56b..5d35f8a 100644 --- a/src/messages/MLog.h +++ b/src/messages/MLog.h @@ -19,7 +19,7 @@ #include "messages/PaxosServiceMessage.h" #include <deque> -#include <uuid/uuid.h> +//#include <uuid/uuid.h> class MLog : public PaxosServiceMessage { public: diff --git a/src/messages/MLogAck.h b/src/messages/MLogAck.h index 8022e7c..c111052 100644 --- a/src/messages/MLogAck.h +++ b/src/messages/MLogAck.h @@ -15,8 +15,6 @@ #ifndef CEPH_MLOGACK_H #define CEPH_MLOGACK_H -#include <uuid/uuid.h> - class MLogAck : public Message { public: uuid_d fsid; diff --git a/src/messages/MMDSBeacon.h b/src/messages/MMDSBeacon.h index 64d442b..c4873ef 100644 --- a/src/messages/MMDSBeacon.h +++ b/src/messages/MMDSBeacon.h @@ -21,7 +21,7 @@ #include "mds/MDSMap.h" -#include <uuid/uuid.h> +//#include <uuid/uuid.h> class MMDSBeacon : public PaxosServiceMessage { diff --git a/src/messages/MMDSMap.h b/src/messages/MMDSMap.h index 66566d0..c7c6e5e 100644 --- a/src/messages/MMDSMap.h +++ b/src/messages/MMDSMap.h @@ -20,7 +20,7 @@ #include "mds/MDSMap.h" #include "include/ceph_features.h" -#include <uuid/uuid.h> +//#include <uuid/uuid.h> class MMDSMap : public Message { public: diff --git a/src/messages/MOSDOpReply.h b/src/messages/MOSDOpReply.h index c0e989f..75a4a35 100644 --- a/src/messages/MOSDOpReply.h +++ b/src/messages/MOSDOpReply.h @@ -21,6 +21,7 @@ #include "MOSDOp.h" #include "os/ObjectStore.h" +#include "include/compat.h" /* * OSD op reply * diff --git a/src/messages/MStatfs.h b/src/messages/MStatfs.h index 61370a9..f81bd37 100644 --- a/src/messages/MStatfs.h +++ b/src/messages/MStatfs.h @@ -16,7 +16,7 @@ #ifndef CEPH_MSTATFS_H #define CEPH_MSTATFS_H -#include <sys/statvfs.h> /* or <sys/statfs.h> */ +//#include <sys/statvfs.h> /* or <sys/statfs.h> */ #include "messages/PaxosServiceMessage.h" class MStatfs : public PaxosServiceMessage { diff --git a/src/messages/MStatfsReply.h b/src/messages/MStatfsReply.h index 8ceec9c..40a5bdd 100644 --- a/src/messages/MStatfsReply.h +++ b/src/messages/MStatfsReply.h @@ -22,7 +22,7 @@ public: MStatfsReply() : Message(CEPH_MSG_STATFS_REPLY) {} MStatfsReply(uuid_d &f, tid_t t, epoch_t epoch) : Message(CEPH_MSG_STATFS_REPLY) { - memcpy(&h.fsid, f.uuid, sizeof(h.fsid)); + memcpy(&h.fsid, &f.uuid, sizeof(h.fsid)); header.tid = t; h.version = epoch; } diff --git a/src/msg/Accepter.cc b/src/msg/Accepter.cc index d6e94d1..ab7c32d 100644 --- a/src/msg/Accepter.cc +++ b/src/msg/Accepter.cc @@ -12,11 +12,17 @@ * */ -#include <sys/socket.h> -#include <netinet/tcp.h> +#include "include/compat.h" +#if !defined(_WIN32) + #include <sys/socket.h> + #include <netinet/tcp.h> + #include <poll.h> #include <sys/uio.h> +#else + #include <winsock2.h> + #include <ws2tcpip.h> +#endif #include <limits.h> -#include <poll.h> #include "Accepter.h" #include "SimpleMessenger.h" @@ -75,7 +81,7 @@ int Accepter::bind(const entity_addr_t &bind_addr, const set<int>& avoid_ports) // reuse addr+port when possible int on = 1; - rc = ::setsockopt(listen_sd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); + rc = ::setsockopt(listen_sd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on)); if (rc < 0) { ldout(msgr->cct,0) << "accepter.bind unable to setsockopt: " << cpp_strerror(errno) << dendl; diff --git a/src/msg/Pipe.cc b/src/msg/Pipe.cc index ebf0cae..7ea2147 100644 --- a/src/msg/Pipe.cc +++ b/src/msg/Pipe.cc @@ -12,11 +12,16 @@ * */ -#include <sys/socket.h> -#include <netinet/tcp.h> -#include <sys/uio.h> -#include <limits.h> -#include <poll.h> +#if !defined(_WIN32) + #include <sys/socket.h> + #include <netinet/tcp.h> + #include <sys/uio.h> + #include <limits.h> + #include <poll.h> +#else + #include <winsock2.h> + #include "include/compat.h" +#endif #include "Message.h" #include "Pipe.h" @@ -52,16 +57,21 @@ ostream& Pipe::_pipe_prefix(std::ostream *_dout) { # define MSG_MORE 0 #endif -#ifndef MSG_NOSIGNAL -# ifdef SO_NOSIGPIPE -# define MSG_NOSIGNAL SO_NOSIGPIPE -# else -# error "Don't know how to block SIGPIPE +#if !defined(_WIN32) +# ifndef MSG_NOSIGNAL +# ifdef SO_NOSIGPIPE +# define MSG_NOSIGNAL SO_NOSIGPIPE +# else +# error "Don't know how to block SIGPIPE" +# endif # endif +#else +# define MSG_NOSIGNAL 1 #endif + /************************************** * Pipe */ @@ -760,7 +770,7 @@ void Pipe::set_socket_options() } if (msgr->cct->_conf->ms_tcp_rcvbuf) { int size = msgr->cct->_conf->ms_tcp_rcvbuf; - int r = ::setsockopt(sd, SOL_SOCKET, SO_RCVBUF, (void*)&size, sizeof(size)); + int r = ::setsockopt(sd, SOL_SOCKET, SO_RCVBUF, (char*)&size, sizeof(size)); if (r < 0) { r = -errno; ldout(msgr->cct,0) << "couldn't set SO_RCVBUF to " << size << ": " << cpp_strerror(r) << dendl; @@ -800,22 +810,37 @@ int Pipe::connect() ::close(sd); char buf[80]; + unsigned long nonblocking; // create socket? sd = ::socket(peer_addr.get_family(), SOCK_STREAM, 0); + //sd = ::socket(AF_INET, SOCK_STREAM, 0); if (sd < 0) { lderr(msgr->cct) << "connect couldn't created socket " << strerror_r(errno, buf, sizeof(buf)) << dendl; goto fail; } - // connect! ldout(msgr->cct,10) << "connecting to " << peer_addr << dendl; rc = ::connect(sd, (sockaddr*)&peer_addr.addr, peer_addr.addr_size()); +#if !defined(_WIN32) if (rc < 0) { ldout(msgr->cct,2) << "connect error " << peer_addr << ", " << errno << ": " << strerror_r(errno, buf, sizeof(buf)) << dendl; goto fail; } +#else + if (rc == SOCKET_ERROR) { + ldout(msgr->cct,2) << "connect error " << peer_addr + << ", " << WSAGetLastError() << ": <insert error text here)" << dendl; + goto fail; + } +#endif + +#if defined(_WIN32) + /* set to nonblocking after connect */ + nonblocking = 1; + ioctlsocket(sd, FIONBIO, &nonblocking); +#endif set_socket_options(); @@ -1929,6 +1954,35 @@ int Pipe::read_message(Message **pm) return ret; } +static ssize_t sendmsg(int sd, const struct msghdr *msg, int flags) +{ + int i; + ssize_t sent = 0; + int ret; + + for (i = 0; i < msg->msg_iovlen; i++) { + fd_set writefds; + FD_ZERO(&writefds); + FD_SET(sd, &writefds); + ret = select(0, NULL, &writefds, NULL, NULL); + if (ret != 1) { + /* check error and... */ + return -1; + } + if (send(sd, (char *)msg->msg_iov[i].iov_base, msg->msg_iov[i].iov_len, 0) == SOCKET_ERROR) { + if (sent > 0) { + return sent; + } else { + /* get error and set errno... later */ + return -1; + } + } else { + sent += msg->msg_iov[i].iov_len; + } + } + return sent; +} + int Pipe::do_sendmsg(struct msghdr *msg, int len, bool more) { char buf[80]; @@ -1940,7 +1994,6 @@ int Pipe::do_sendmsg(struct msghdr *msg, int len, bool more) l += msg->msg_iov[i].iov_len; assert(l == len); } - int r = ::sendmsg(sd, msg, MSG_NOSIGNAL | (more ? MSG_MORE : 0)); if (r == 0) ldout(msgr->cct,10) << "do_sendmsg hmm do_sendmsg got r==0!" << dendl; @@ -2021,7 +2074,6 @@ int Pipe::write_keepalive() return 0; } - int Pipe::write_message(ceph_msg_header& header, ceph_msg_footer& footer, bufferlist& blist) { int ret; @@ -2142,7 +2194,6 @@ int Pipe::write_message(ceph_msg_header& header, ceph_msg_footer& footer, buffer goto out; } - int Pipe::tcp_read(char *buf, int len) { if (sd < 0) @@ -2176,6 +2227,7 @@ int Pipe::tcp_read_wait() { if (sd < 0) return -1; +#if !defined(_WIN32) struct pollfd pfd; short evmask; pfd.fd = sd; @@ -2198,10 +2250,25 @@ int Pipe::tcp_read_wait() return -1; return 0; +#else + fd_set readfds; + int ret; + + FD_ZERO(&readfds); + FD_SET(sd, &readfds); + + ret = ::select(0, &readfds, NULL, NULL, NULL); + if (ret == 1) { + return 0; + } else { + return 1; /* does the actual error matter here? */ + } +#endif } int Pipe::tcp_read_nonblocking(char *buf, int len) { +#if !defined(_WIN32) again: int got = ::recv( sd, buf, len, MSG_DONTWAIT ); if (got < 0) { @@ -2220,12 +2287,23 @@ again: return -1; } return got; +#else + int got = ::recv(sd, buf, len, 0); + if (got == SOCKET_ERROR) { + /* check if this is an againable error */ + return -1; + } else if (got == 0) { + return -1; + } + return got; +#endif } int Pipe::tcp_write(const char *buf, int len) { if (sd < 0) return -1; +#if !defined(_WIN32) struct pollfd pfd; pfd.fd = sd; pfd.events = POLLOUT | POLLHUP | POLLNVAL | POLLERR; @@ -2239,12 +2317,14 @@ int Pipe::tcp_write(const char *buf, int len) ::shutdown(sd, SHUT_RDWR); } } - if (poll(&pfd, 1, -1) < 0) return -1; if (!(pfd.revents & POLLOUT)) return -1; +#else + /* checking is handled in our sendmsg */ +#endif //lgeneric_dout(cct, DBL) << "tcp_write writing " << len << dendl; assert(len > 0); diff --git a/src/msg/Pipe.h b/src/msg/Pipe.h index 6c91395..c2a5a90 100644 --- a/src/msg/Pipe.h +++ b/src/msg/Pipe.h @@ -19,6 +19,24 @@ #include "Messenger.h" #include "auth/AuthSessionHandler.h" +#if defined(_WIN32) + /* winsock has different names for the same things */ + #define SHUT_RD SD_RECEIVE + #define SHUT_WR SD_SEND + #define SHUT_RDWR SD_BOTH + +#endif + +#define IOV_MAX 16 +struct iovec { + void *iov_base; + size_t iov_len; +}; + +struct msghdr { + struct iovec *msg_iov; + size_t msg_iovlen; +}; class SimpleMessenger; class IncomingQueue; diff --git a/src/msg/SimpleMessenger.cc b/src/msg/SimpleMessenger.cc index cf1e6c6..5d728c9 100644 --- a/src/msg/SimpleMessenger.cc +++ b/src/msg/SimpleMessenger.cc @@ -40,7 +40,9 @@ static ostream& _prefix(std::ostream *_dout, SimpleMessenger *msgr) { SimpleMessenger::SimpleMessenger(CephContext *cct, entity_name_t name, string mname, uint64_t _nonce) : Messenger(cct, name), +#if !defined(_WIN32) accepter(this, _nonce), +#endif dispatch_queue(cct, this), reaper_thread(this), my_type(name.type()), @@ -74,10 +76,12 @@ void SimpleMessenger::ready() ldout(cct,10) << "ready " << get_myaddr() << dendl; dispatch_queue.start(); +#if !defined(_WIN32) lock.Lock(); if (did_bind) accepter.start(); lock.Unlock(); +#endif } @@ -266,21 +270,30 @@ int SimpleMessenger::bind(const entity_addr_t &bind_addr) ldout(cct,10) << "rank.bind " << bind_addr << dendl; lock.Unlock(); +#if !defined(_WIN32) // bind to a socket set<int> avoid_ports; int r = accepter.bind(bind_addr, avoid_ports); if (r >= 0) did_bind = true; return r; +#else + did_bind = false; + return 0; +#endif } int SimpleMessenger::rebind(const set<int>& avoid_ports) { +#if !defined(_WIN32) ldout(cct,1) << "rebind avoid " << avoid_ports << dendl; assert(did_bind); int r = accepter.rebind(avoid_ports); mark_down_all(); return r; +#else + return 0; +#endif } int SimpleMessenger::start() @@ -304,6 +317,7 @@ int SimpleMessenger::start() return 0; } +#if !defined(_WIN32) Pipe *SimpleMessenger::add_accept_pipe(int sd) { lock.Lock(); @@ -317,6 +331,7 @@ Pipe *SimpleMessenger::add_accept_pipe(int sd) lock.Unlock(); return p; } +#endif /* connect_rank * NOTE: assumes messenger.lock held. @@ -511,12 +526,14 @@ void SimpleMessenger::wait() ldout(cct,10) << "wait: dispatch queue is stopped" << dendl; // done! clean up. +#if !defined(_WIN32) if (did_bind) { ldout(cct,20) << "wait: stopping accepter thread" << dendl; accepter.stop(); did_bind = false; ldout(cct,20) << "wait: stopped accepter thread" << dendl; } +#endif if (reaper_started) { ldout(cct,20) << "wait: stopping reaper thread" << dendl; diff --git a/src/msg/SimpleMessenger.h b/src/msg/SimpleMessenger.h index e6e1fb1..2b0e446 100644 --- a/src/msg/SimpleMessenger.h +++ b/src/msg/SimpleMessenger.h @@ -200,9 +200,12 @@ private: */ public: +#if !defined(_WIN32) Accepter accepter; +#endif DispatchQueue dispatch_queue; +#if !defined(_WIN32) friend class Accepter; /** @@ -211,6 +214,7 @@ public: * @param sd socket */ Pipe *add_accept_pipe(int sd); +#endif private: diff --git a/src/msg/msg_types.cc b/src/msg/msg_types.cc index b02db76..8284ea6 100644 --- a/src/msg/msg_types.cc +++ b/src/msg/msg_types.cc @@ -1,10 +1,16 @@ #include "msg_types.h" -#include <arpa/inet.h> +#if !defined(_WIN32) + #include <arpa/inet.h> + #include <netdb.h> +#else + #include <winsock2.h> + #include <ws2tcpip.h> +#endif + #include <stdlib.h> #include <string.h> -#include <netdb.h> #include "common/Formatter.h" @@ -46,6 +52,33 @@ void entity_addr_t::generate_test_instances(list<entity_addr_t*>& o) o.push_back(b); } +#if defined(_WIN32) +/* windows doesn't have an inet_pton compatible function until Vista */ +int inet_pton(int af, const char *src, void *dst) { + + switch(af) { + case AF_INET: + { + struct in_addr *a4 = (struct in_addr *)dst; + int o1, o2, o3, o4; + char term; + int scanned = sscanf(src, "%u.%u.%u.%u%c", &o1, &o2, &o3, &o4, &term); + if (scanned != 4) { + return 0; + } + if ((o1|o2|o3|o4) & 0xffffff00) { + return 0; + } + a4->s_addr = htonl((o1 << 24) | (o2 << 16) | (o3 << 8) | (o4)); + return 1; + } + default: + errno = EAFNOSUPPORT; + return -1; + } +} +#endif + bool entity_addr_t::parse(const char *s, const char **end) { memset(this, 0, sizeof(*this)); @@ -129,7 +162,8 @@ bool entity_addr_t::parse(const char *s, const char **end) //cout << *this << std::endl; return true; } - +#if !defined(_WIN32) +#endif ostream& operator<<(ostream& out, const sockaddr_storage &ss) diff --git a/src/msg/msg_types.h b/src/msg/msg_types.h index ee79ff7..e6e98e0 100644 --- a/src/msg/msg_types.h +++ b/src/msg/msg_types.h @@ -15,7 +15,12 @@ #ifndef CEPH_MSG_TYPES_H #define CEPH_MSG_TYPES_H -#include <netinet/in.h> +#if defined(_WIN32) + #include <winsock2.h> + #include <ws2tcpip.h> +#else + #include <netinet/in.h> +#endif #include "include/types.h" #include "include/blobhash.h" diff --git a/src/os/ObjectStore.h b/src/os/ObjectStore.h index 6494290..3f3830a 100644 --- a/src/os/ObjectStore.h +++ b/src/os/ObjectStore.h @@ -27,7 +27,7 @@ #if defined(DARWIN) || defined(__FreeBSD__) #include <sys/statvfs.h> -#else +#elif !defined(_WIN32) #include <sys/vfs.h> /* or <sys/statfs.h> */ #endif /* DARWIN */ diff --git a/src/osd/PG.h b/src/osd/PG.h index d751916..3d42c07 100644 --- a/src/osd/PG.h +++ b/src/osd/PG.h @@ -50,6 +50,7 @@ #include "include/str_list.h" #include "PGBackend.h" +#include "include/compat.h" #include <list> #include <memory> #include <string> diff --git a/src/osd/osd_types.h b/src/osd/osd_types.h index e7cd231..61b741d 100644 --- a/src/osd/osd_types.h +++ b/src/osd/osd_types.h @@ -1489,6 +1489,7 @@ inline ostream& operator<<(ostream& out, const pg_query_t& q) { * pg_log_entry_t - single entry/event in pg log * */ +#undef DELETE struct pg_log_entry_t { enum { MODIFY = 1, diff --git a/src/osdc/ObjectCacher.h b/src/osdc/ObjectCacher.h index d7ba9d8..3247415 100644 --- a/src/osdc/ObjectCacher.h +++ b/src/osdc/ObjectCacher.h @@ -7,6 +7,7 @@ #include "include/lru.h" #include "include/Context.h" #include "include/xlist.h" +#include "include/compat.h" #include "common/Cond.h" #include "common/Finisher.h" diff --git a/src/osdc/Objecter.cc b/src/osdc/Objecter.cc index d2c574d..5a23126 100644 --- a/src/osdc/Objecter.cc +++ b/src/osdc/Objecter.cc @@ -212,6 +212,7 @@ void Objecter::init_unlocked() } m_request_state_hook = new RequestStateHook(this); +#if !defined(_WIN32) AdminSocket* admin_socket = cct->get_admin_socket(); int ret = admin_socket->register_command("objecter_requests", "objecter_requests", @@ -221,6 +222,7 @@ void Objecter::init_unlocked() lderr(cct) << "error registering admin socket command: " << cpp_strerror(-ret) << dendl; } +#endif } void Objecter::init_locked() @@ -256,8 +258,10 @@ void Objecter::shutdown_locked() void Objecter::shutdown_unlocked() { if (m_request_state_hook) { +#if !defined(_WIN32) AdminSocket* admin_socket = cct->get_admin_socket(); admin_socket->unregister_command("objecter_requests"); +#endif delete m_request_state_hook; m_request_state_hook = NULL; } diff --git a/src/rbd.cc b/src/rbd.cc index 082f9a9..a8d26bb 100644 --- a/src/rbd.cc +++ b/src/rbd.cc @@ -41,7 +41,9 @@ #include <sys/types.h> #include <time.h> #include "include/memory.h" +#if !defined(_WIN32) #include <sys/ioctl.h> +#endif #include "include/rbd_types.h" #include "common/TextTable.h" @@ -57,6 +59,10 @@ #include <sys/param.h> #endif +#if defined(_WIN32) +#include <winsock2.h> +#endif + #define MAX_SECRET_LEN 1000 #define MAX_POOL_NAME_SIZE 128 @@ -967,6 +973,7 @@ static int export_read_cb(uint64_t ofs, size_t len, const char *buf, void *arg) static char *localbuf = NULL; static size_t maplen = 0; +#if !defined(_WIN32) if (fd == 1) { if (!buf) { // can't seek stdout; need actual data to write @@ -994,6 +1001,7 @@ static int export_read_cb(uint64_t ofs, size_t len, const char *buf, void *arg) ret = write(fd, buf, len); } } else { // not stdout +#endif if (!buf || buf_is_zero(buf, len)) { /* a hole */ return 0; @@ -1004,7 +1012,9 @@ static int export_read_cb(uint64_t ofs, size_t len, const char *buf, void *arg) return -errno; ret = write(fd, buf, len); ec->pc.update_progress(ofs, ec->totalsize); +#if !defined(_WIN32) } +#endif if (ret < 0) return -errno; @@ -1265,6 +1275,7 @@ done_img: update_snap_name(*new_img, snap); } +#if !defined(_WIN32) static int do_import(librbd::RBD &rbd, librados::IoCtx& io_ctx, const char *imgname, int *order, const char *path, int format, uint64_t features, uint64_t size) @@ -1313,14 +1324,18 @@ static int do_import(librbd::RBD &rbd, librados::IoCtx& io_ctx, size = (uint64_t)stat_buf.st_size; if (!size) { +#if !defined(_WIN32) int64_t bdev_size = 0; r = get_block_device_size(fd, &bdev_size); if (r < 0) { +#endif cerr << "rbd: unable to get size of file/block device" << std::endl; goto done; +#if !defined(_WIN32) } assert(bdev_size >= 0); size = (uint64_t) bdev_size; +#endif } } r = do_create(rbd, io_ctx, imgname, size, order, format, features, 0, 0); @@ -1397,6 +1412,7 @@ static int do_import(librbd::RBD &rbd, librados::IoCtx& io_ctx, delete[] p; return r; } +#endif static int read_string(int fd, unsigned max, string *out) { @@ -1626,6 +1642,7 @@ static int do_watch(librados::IoCtx& pp, const char *imgname) return 0; } +#if !defined(_WIN32) static int do_kernel_add(const char *poolname, const char *imgname, const char *snapname) { @@ -1733,6 +1750,7 @@ static int do_kernel_add(const char *poolname, const char *imgname, return r; } +#endif static int read_file(const char *filename, char *buf, size_t bufsize) { @@ -1909,6 +1927,7 @@ static int get_rbd_seq(int major_num, string &seq) return -ENOENT; } +#if !defined(_WIN32) static int do_kernel_rm(const char *dev) { struct stat dev_stat; @@ -1971,6 +1990,7 @@ static int do_kernel_rm(const char *dev) r = -errno; return r; } +#endif enum { OPT_NO_CMD = 0, @@ -2114,6 +2134,11 @@ int main(int argc, const char **argv) librados::IoCtx io_ctx, dest_io_ctx; librbd::Image image; + #if defined(_WIN32) + /* make sure files are opened in binary mode otherwise they get dos linefeeds */ + _fmode = _O_BINARY; + #endif + vector<const char*> args; argv_to_vec(argc, argv, args); @@ -2232,6 +2257,9 @@ int main(int argc, const char **argv) } } + WSADATA wsadata; + WSAStartup(MAKEWORD(2, 0), &wsadata); + common_init_finish(g_ceph_context); i = args.begin(); @@ -2772,6 +2800,7 @@ if (!set_conf_param(v, p1, p2, p3)) { \ } break; +//#if !defined(_WIN32) case OPT_EXPORT: if (!path) { cerr << "rbd: export requires pathname" << std::endl; @@ -2804,6 +2833,7 @@ if (!set_conf_param(v, p1, p2, p3)) { \ } break; +#if !defined(_WIN32) case OPT_IMPORT: if (!path) { cerr << "rbd: import requires pathname" << std::endl; @@ -2825,6 +2855,7 @@ if (!set_conf_param(v, p1, p2, p3)) { \ return -r; } break; +#endif case OPT_COPY: r = do_copy(image, dest_io_ctx, destname); @@ -2842,6 +2873,7 @@ if (!set_conf_param(v, p1, p2, p3)) { \ } break; +#if !defined(_WIN32) case OPT_MAP: r = do_kernel_add(poolname, imgname, snapname); if (r < 0) { @@ -2857,6 +2889,7 @@ if (!set_conf_param(v, p1, p2, p3)) { \ return -r; } break; +#endif case OPT_SHOWMAPPED: r = do_kernel_showmapped(formatter.get()); diff --git a/win32/INSTALL b/win32/INSTALL new file mode 100644 index 0000000..8b04fac --- /dev/null +++ b/win32/INSTALL @@ -0,0 +1,16 @@ +Debian includes a lot of the required software in the mingw packages. + +Additional software required. All seems to build and install without issue: +. boost +. cryptopp +. libatomic-ops + +boost - tested with 1.49. newer is known to not work +. download and extract +. ./bootstrap.sh --with-python=$(which python2) --prefix=/usr/x86_64-w64-mingw32/ --without-icu --with-libraries=system,thread +. change toolset in project-config.jam to "using gcc : : x86_64-w64-mingw32-g++ ;" (space before ; is important) +. link libpthreadGC2.a to the actual pthread lib +. PTW32_INCLUDE=/usr/x86_64-w64-mingw32/include PTW32_LIB=/usr/x86_64-w64-mingw32/lib ./bjam --layout=system variant=release threading=multi link=shared runtime-link=shared toolset=gcc target-os=windows install + +cryptopp +. CXX=/usr/bin/x86_64-w64-mingw32-g++ AR=/usr/bin/x86_64-w64-mingw32-ar RANLIB=/usr/bin/x86_64-w64-mingw32-ranlib make diff --git a/win32/Makefile b/win32/Makefile new file mode 100644 index 0000000..9b965a8 --- /dev/null +++ b/win32/Makefile @@ -0,0 +1,249 @@ +CC=/usr/bin/x86_64-w64-mingw32-gcc +CXX=/usr/bin/x86_64-w64-mingw32-g++ +AR=/usr/bin/x86_64-w64-mingw32-ar +STRIP=/usr/bin/x86_64-w64-mingw32-strip +CFLAGS = -D_POSIX -DCEPH_LIBDIR="" + +DIRS = \ + arch \ + auth \ + auth/cephx \ + auth/unknown \ + auth/none \ + common \ + perfglue \ + crush \ + json_spirit \ + log \ + mon \ + os \ + msg \ + osd \ + mds \ + librbd \ + cls \ + cls/rbd \ + cls/lock \ + osdc \ + librados \ + global + +LIBCOMMON_SRC = \ + winmain.c \ + arch/intel.cc \ + arch/neon.c \ + arch/probe.c \ + auth/AuthClientHandler.cc \ + auth/AuthMethodList.cc \ + auth/AuthSessionHandler.cc \ + auth/Crypto.cc \ + auth/KeyRing.cc \ + auth/RotatingKeyRing.cc \ + auth/cephx/CephxClientHandler.cc \ + auth/cephx/CephxProtocol.cc \ + auth/cephx/CephxSessionHandler.cc \ + common/BackTrace.cc \ + common/Clock.cc \ + common/ConfUtils.cc \ + common/DecayCounter.cc \ + common/Finisher.cc \ + common/Formatter.cc \ + common/HeartbeatMap.cc \ + common/LogClient.cc \ + common/LogEntry.cc \ + common/Mutex.cc \ + common/PrebufferedStreambuf.cc \ + common/RefCountedObj.cc \ + common/Thread.cc \ + common/Throttle.cc \ + common/Timer.cc \ + common/addr_parsing.c \ + common/armor.c \ + common/assert.cc \ + common/buffer.cc \ + common/ceph_argparse.cc \ + common/ceph_context.cc \ + common/ceph_crypto.cc \ + common/ceph_hash.cc \ + common/ceph_strings.cc \ + common/cmdparse.cc \ + common/code_environment.cc \ + common/common_init.cc \ + common/config.cc \ + common/crc32c.cc \ + common/crc32c_intel_baseline.c \ + common/crc32c_intel_fast.c \ + common/dout.cc \ + common/entity_name.cc \ + common/environment.cc \ + common/errno.cc \ + common/escape.c \ + common/hex.cc \ + common/hobject.cc \ + common/lockdep.cc \ + common/page.cc \ + common/perf_counters.cc \ + common/safe_io.c \ + common/sctp_crc32.c \ + common/snap_types.cc \ + common/str_list.cc \ + common/strtol.cc \ + common/utf8.c \ + common/version.cc \ + crush/CrushWrapper.cc \ + crush/builder.c \ + crush/crush.c \ + crush/hash.c \ + crush/mapper.c \ + json_spirit/json_spirit_reader.cpp \ + log/Log.cc \ + log/SubsystemMap.cc \ + mds/MDSMap.cc \ + mds/inode_backtrace.cc \ + mds/mdstypes.cc \ + mon/MonCap.cc \ + mon/MonClient.cc \ + mon/MonMap.cc \ + msg/DispatchQueue.cc \ + msg/Message.cc \ + msg/SimpleMessenger.cc \ + msg/msg_types.cc \ + osd/OSDMap.cc \ + osd/osd_types.cc \ + msg/Pipe.cc + +unusedLIBCOMMON_SRC = \ + msg/Accepter.cc \ + common/fd.cc \ + common/admin_socket.cc \ + ceph_ver.c auth/AuthAuthorizeHandler.cc \ + auth/cephx/CephxAuthorizeHandler.cc \ + auth/none/AuthNoneAuthorizeHandler.cc \ + auth/unknown/AuthUnknownAuthorizeHandler.cc \ + common/BackTrace.cc \ + common/run_cmd.cc common/WorkQueue.cc \ + common/MemoryModel.cc \ + common/xattr.c \ + msg/Messenger.cc \ + common/blkdev.cc \ + common/pipe.c \ + common/signal.cc \ + common/simple_spin.cc \ + include/ceph_fs.cc \ + include/ceph_frag.cc \ + common/mime.c \ + common/ceph_crypto_cms.cc \ + common/ceph_json.cc \ + common/ipaddr.cc \ + common/pick_address.cc \ + json_spirit/json_spirit_writer.cpp \ + json_spirit/json_spirit_value.cpp \ + perfglue/disabled_stubs.cc \ + common/admin_socket_client.cc \ + perfglue/cpu_profiler.cc \ + common/OutputDataSocket.cc \ + crush/CrushCompiler.cc \ + crush/CrushTester.cc +LIBCOMMON_OBJS = $(subst .c,.o,$(subst .cc,.o,$(subst .cpp,.o,$(LIBCOMMON_SRC)))) +LIBCOMMON_LIB = libcommon.a + +LIBGLOBAL_SRC = \ + global/global_context.cc \ + global/global_init.cc \ + global/pidfile.cc +unusedLIBGLOBAL_SRC = \ + global/signal_handler.cc +LIBGLOBAL_OBJS = $(subst .c,.o,$(subst .cc,.o,$(subst .cpp,.o,$(LIBGLOBAL_SRC)))) +LIBGLOBAL_LIB = libglobal.a + +LIBRADOS_SRC = \ + librados/IoCtxImpl.cc \ + librados/RadosClient.cc \ + librados/librados.cc \ + librados/snap_set_diff.cc \ + osdc/Objecter.cc \ + osdc/Striper.cc \ + cls/lock/cls_lock_client.cc \ + cls/lock/cls_lock_types.cc \ + cls/lock/cls_lock_ops.cc +LIBRADOS_OBJS = $(subst .c,.o,$(subst .cc,.o,$(subst .cpp,.o,$(LIBRADOS_SRC)))) +LIBRADOS_DLL = librados.dll +LIBRADOS_LIB = librados.a + +LIBRBD_SRC = \ + cls/lock/cls_lock_client.cc \ + cls/lock/cls_lock_types.cc \ + cls/lock/cls_lock_ops.cc \ + cls/rbd/cls_rbd_client.cc \ + common/util.cc \ + librbd/librbd.cc \ + librbd/AioCompletion.cc \ + librbd/AioRequest.cc \ + librbd/ImageCtx.cc \ + librbd/internal.cc \ + librbd/LibrbdWriteback.cc \ + librbd/WatchCtx.cc \ + librados/snap_set_diff.cc \ + osdc/ObjectCacher.cc \ + osdc/Striper.cc +LIBRBD_OBJS = $(subst .c,.o,$(subst .cc,.o,$(subst .cpp,.o,$(LIBRBD_SRC)))) +LIBRBD_DLL = librbd.dll +LIBRBD_LIB = librbd.a + +RBD_SRC = rbd.cc common/TextTable.cc common/util.cc +#RBD_SRC = rbd.cc common/secret.c common/TextTable.cc common/util.cc +RBD_OBJS = $(subst .c,.o,$(subst .cc,.o,$(subst .cpp,.o,$(RBD_SRC)))) +RBD_EXE = rbd.exe + +INCLUDES = \ + -Iinclude \ + -I../src + #-I../src/include +LIBS = -lpthread -lcryptopp -lws2_32 -lboost_thread.dll -lboost_system.dll + +vpath %.c ../src/ +vpath %.cc ../src/ +vpath %.cpp ../src/ + +all: $(DIRS) $(LIBCOMMON_LIB) $(LIBGLOBAL_LIB) $(LIBRADOS_DLL) $(LIBRBD_DLL) $(RBD_EXE) + +distclean: clean + +clean: + find . -name '*.o' -type f -print0 | xargs -0 rm -f + find . -name '*.a' -type f -print0 | xargs -0 rm -f + find . -name '*.lib' -type f -print0 | xargs -0 rm -f + find . -name '*.dll' -type f -print0 | xargs -0 rm -f + find . -name '*.exe' -type f -print0 | xargs -0 rm -f + +%.o: %.c + $(CC) $(INCLUDES) $(CFLAGS) -c $< -o $@ + +%.o: %.cc + $(CXX) $(INCLUDES) $(CFLAGS) -c $< -o $@ + +%.o: %.cpp + $(CXX) $(INCLUDES) $(CFLAGS) -c $< -o $@ + +.PHONY: $(DIRS) +$(DIRS): + mkdir -p $@ + +$(LIBCOMMON_LIB): $(LIBCOMMON_OBJS) + $(AR) rcs $@ $^ + +$(LIBGLOBAL_LIB): $(LIBGLOBAL_OBJS) + $(AR) rcs $@ $^ + +$(LIBRADOS_DLL): $(LIBRADOS_OBJS) $(LIBCOMMON_LIB) + $(CXX) -shared -o $@ $(LIBRADOS_OBJS) -L. -lcommon $(LIBS) + $(STRIP) $@ + +$(LIBRBD_DLL): $(LIBRBD_OBJS) $(LIBCOMMON_LIB) + $(CXX) -shared -o $@ $(LIBRBD_OBJS) -L. -lrados -lcommon $(LIBS) + $(STRIP) $@ + +$(RBD_EXE): $(RBD_OBJS) $(LIBCOMMON_LIB) $(LIBGLOBAL_LIB) + $(CXX) -o $@ $(RBD_OBJS) -L. -lglobal -lrbd -lrados -lcommon $(LIBS) + $(STRIP) $@ + diff --git a/win32/include/acconfig.h b/win32/include/acconfig.h new file mode 100644 index 0000000..cf40bd4 --- /dev/null +++ b/win32/include/acconfig.h @@ -0,0 +1,6 @@ +#define USE_CRYPTOPP +#define HAVE_INTTYPES_H +/* Windows is always little endian */ +#define LITTLE_ENDIAN 1234 +#define BIG_ENDIAN 4321 +#define BYTE_ORDER LITTLE_ENDIAN diff --git a/win32/winmain.c b/win32/winmain.c new file mode 100644 index 0000000..a5efdb6 --- /dev/null +++ b/win32/winmain.c @@ -0,0 +1,2 @@ +int WinMain() { +} _______________________________________________ ceph-users mailing list ceph-users@xxxxxxxxxxxxxx http://lists.ceph.com/listinfo.cgi/ceph-users-ceph.com