On Fri, 6 Dec 2013, James Harper wrote: > > > > > 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). A github pull request is the simplest; just make the target branch wip-port. > Hopefully the windows driver to allow mounting of a userspace-backed > device (eg librbd) won't be too hard. Yeah! The last conversation I had about this suggested there are a few userland options for block devices. Something like "Userspace driver framework". (Not so for file systems, unfortunately--at least not upstream.) > 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; Let's use a prefix like RADOS_ here instead of x. Hopefully it's private to this module and not part of the public interface? > 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; > +} I wonder if we should make a compat/ directory and put stuff like this in there. sage > + > 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() { > +} > > -- To unsubscribe from this list: send the line "unsubscribe ceph-devel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html