blob: c26662b14ff7323cc44b1d50c696dd9b52335937 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef LIBHDFS3_WINDOWS_PLATFORM_H
#define LIBHDFS3_WINDOWS_PLATFORM_H
#include "build.h"
#define THREAD_LOCAL __declspec(thread)
#define ATTRIBUTE_NORETURN __attribute__ ((noreturn))
#define ATTRIBUTE_NOINLINE __attribute__ ((noinline))
#define STACK_LENGTH 64
/*
* Get rid of extra stuff.
*/
#define VC_EXTRALEAN
#define WIN32_LEAN_AND_MEAN
/*
* Windows does not understand __attribute__, which is gcc-specific.
* Hence make this key work invalid
*/
#define __attribute__(A) /* do nothing */
/*
* Include Windows specific headers in one place.
*/
#include <WinSock2.h>
#include <Windows.h>
#include <io.h>
#include <IPHlpApi.h>
#pragma comment(lib, "IPHLPAPI.lib")
#include <process.h>
#include <Rpc.h>
#include <RpcDce.h> /* for UidCreate */
#include <stdio.h>
#include <ws2ipdef.h>
#include <Ws2tcpip.h>
#pragma comment(lib, "ws2_32.lib")
/*
* Account for the lack of inttypes.h in Visual Studio 2010
*/
#define PRId32 "ld"
#define _PFX_64 "ll"
#define PRId64 _PFX_64 "d"
/*
* Define some macros for equivalent functions in Windows.
* Most of the time it is a rename. Sometimes, we have to redefine
* function signature as well.
*/
/*
* File access.
*/
#define R_OK 4 /* Read only */
#define STDERR_FILENO 2
#define access _access
#define lseek _lseek
/*
* Constants used for socket api.
*/
#define SHUT_RDWR SD_BOTH
/*
* Account for lack of poll syscall.
*/
int poll(struct pollfd *fds, unsigned long nfds, int timeout);
/*
* String related.
*/
#define snprintf(str, size, format, ...) \
_snprintf_s((str), (size), _TRUNCATE, (format), __VA_ARGS__)
#define strcasecmp _stricmp
#define strerror_r(errnum, buf, buflen) strerror_s((buf), (buflen), (errnum))
#define strtoll _strtoi64
#define strtok_r strtok_s
#define vsnprintf(str, size, format, ...) \
vsnprintf_s((str), (size), _TRUNCATE, (format), __VA_ARGS__)
// Others.
#define getpid _getpid
#define pthread_self GetCurrentThreadId
#define setenv(name, value, overwrite) _putenv_s((name), (value))
/*
* ERROR macro conflicts with ERROR def in some protobuf header.
* Thus, undef it here.
*/
#undef ERROR
/*
* Define path separator macro.
*/
#define PATH_SEPRATOR '\\'
/*
* gcc-style type-checked format arguments are not supported on Windows, so just
* stub this macro.
*/
#define TYPE_CHECKED_PRINTF_FORMAT(formatArg, varArgs)
/*
* Support for signals in Windows is limited.
*/
typedef unsigned long sigset_t;
/*
* Account for lack of dprint in Windows by using
* write syscall to write message to a file.
*/
#include<vector>
inline int dprintf(int fd, const char *fmt, ...) {
va_list ap;
std::vector<char> buffer;
//determine buffer size
va_start(ap, fmt);
int size = vsnprintf(&buffer[0], buffer.size(), fmt, ap);
va_end(ap);
va_start(ap, fmt);
buffer.resize(size);
vsnprintf(&buffer[0], buffer.size(), fmt, ap);
va_end(ap);
_write(fd, &buffer[0], buffer.size());
}
#endif // LIBHDFS3_WINDOWS_PLATFORM_H