diff --git a/anet.c b/anet.c index 8f8a904fe..c827b7de6 100644 --- a/anet.c +++ b/anet.c @@ -29,19 +29,52 @@ */ #include -#include #include +#include +#include +#include +#include +#include + +#ifndef _MSC_VER + +#include #include #include #include #include #include -#include -#include #include -#include -#include -#include + +#define CONCAT(A, B) A ## B + +#define anetError() errno +#define anetErrorIs(A) (errno == CONCAT(E, A)) + +#define ERROR_DATA_FORMAT "%s" +#define anetErrorData() strerror(errno) + +#else + +#include +#include +#include + +#define CONCAT(A, B) A ## B + +#define close(S) do { shutdown(S, SD_SEND); closesocket(S); } while (0) +#define inet_aton(A, B) inet_pton(AF_INET, A, B) +#define setsockopt(A, B, C, D, E) setsockopt(A, B, C, (const char *)(D), E) + +#define anetError() WSAGetLastError() +#define anetErrorIs(A) (WSAGetLastError() == CONCAT(WSAE, A)) + +#define ERROR_DATA_FORMAT "%i" +#define anetErrorData() WSAGetLastError() + +typedef int socklen_t; + +#endif #include "anet.h" @@ -55,21 +88,46 @@ static void anetSetError(char *err, const char *fmt, ...) va_end(ap); } +int anetInit(char *err) +{ +#ifdef _MSC_VER + // Initialize Winsock + WSADATA data; + + if (WSAStartup(MAKEWORD(2, 2), &data) != 0) { + anetSetError(err, "WSAStartup failed: " ERROR_DATA_FORMAT, anetErrorData()); + return ANET_ERR; + } +#endif + + return ANET_OK; +} + int anetNonBlock(char *err, int fd) { +#ifndef _MSC_VER int flags; /* Set the socket nonblocking. * Note that fcntl(2) for F_GETFL and F_SETFL can't be * interrupted by a signal. */ if ((flags = fcntl(fd, F_GETFL)) == -1) { - anetSetError(err, "fcntl(F_GETFL): %s", strerror(errno)); + anetSetError(err, "fcntl(F_GETFL): " ERROR_DATA_FORMAT, anetErrorData()); return ANET_ERR; } if (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1) { - anetSetError(err, "fcntl(F_SETFL,O_NONBLOCK): %s", strerror(errno)); + anetSetError(err, "fcntl(F_SETFL,O_NONBLOCK): " ERROR_DATA_FORMAT, anetErrorData()); + return ANET_ERR; + } +#else + u_long iMode = 1; + + if (ioctlsocket(fd, FIONBIO, &iMode) != 0) { + anetSetError(err, "ioctlsocket(FIONBIO, 0): " ERROR_DATA_FORMAT, anetErrorData()); return ANET_ERR; } +#endif + return ANET_OK; } @@ -78,7 +136,7 @@ int anetTcpNoDelay(char *err, int fd) int yes = 1; if (setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &yes, sizeof(yes)) == -1) { - anetSetError(err, "setsockopt TCP_NODELAY: %s", strerror(errno)); + anetSetError(err, "setsockopt TCP_NODELAY: " ERROR_DATA_FORMAT, anetErrorData()); return ANET_ERR; } return ANET_OK; @@ -88,7 +146,7 @@ int anetSetSendBuffer(char *err, int fd, int buffsize) { if (setsockopt(fd, SOL_SOCKET, SO_SNDBUF, &buffsize, sizeof(buffsize)) == -1) { - anetSetError(err, "setsockopt SO_SNDBUF: %s", strerror(errno)); + anetSetError(err, "setsockopt SO_SNDBUF: " ERROR_DATA_FORMAT, anetErrorData()); return ANET_ERR; } return ANET_OK; @@ -98,7 +156,7 @@ int anetTcpKeepAlive(char *err, int fd) { int yes = 1; if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &yes, sizeof(yes)) == -1) { - anetSetError(err, "setsockopt SO_KEEPALIVE: %s", strerror(errno)); + anetSetError(err, "setsockopt SO_KEEPALIVE: " ERROR_DATA_FORMAT, anetErrorData()); return ANET_ERR; } return ANET_OK; @@ -126,14 +184,14 @@ int anetResolve(char *err, char *host, char *ipbuf) static int anetCreateSocket(char *err, int domain) { int s, on = 1; if ((s = socket(domain, SOCK_STREAM, 0)) == -1) { - anetSetError(err, "creating socket: %s", strerror(errno)); + anetSetError(err, "creating socket: " ERROR_DATA_FORMAT, anetErrorData()); return ANET_ERR; } /* Make sure connection-intensive things like the redis benckmark * will be able to close/open sockets a zillion of times */ if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) == -1) { - anetSetError(err, "setsockopt SO_REUSEADDR: %s", strerror(errno)); + anetSetError(err, "setsockopt SO_REUSEADDR: " ERROR_DATA_FORMAT, anetErrorData()); return ANET_ERR; } return s; @@ -167,11 +225,11 @@ static int anetTcpGenericConnect(char *err, char *addr, int port, int flags) return ANET_ERR; } if (connect(s, (struct sockaddr*)&sa, sizeof(sa)) == -1) { - if (errno == EINPROGRESS && + if ((anetErrorIs(INPROGRESS) || anetErrorIs(WOULDBLOCK)) && flags & ANET_CONNECT_NONBLOCK) return s; - anetSetError(err, "connect: %s", strerror(errno)); + anetSetError(err, "connect: " ERROR_DATA_FORMAT, anetErrorData()); close(s); return ANET_ERR; } @@ -188,42 +246,6 @@ int anetTcpNonBlockConnect(char *err, char *addr, int port) return anetTcpGenericConnect(err,addr,port,ANET_CONNECT_NONBLOCK); } -int anetUnixGenericConnect(char *err, char *path, int flags) -{ - int s; - struct sockaddr_un sa; - - if ((s = anetCreateSocket(err,AF_LOCAL)) == ANET_ERR) - return ANET_ERR; - - sa.sun_family = AF_LOCAL; - strncpy(sa.sun_path,path,sizeof(sa.sun_path)-1); - if (flags & ANET_CONNECT_NONBLOCK) { - if (anetNonBlock(err,s) != ANET_OK) - return ANET_ERR; - } - if (connect(s,(struct sockaddr*)&sa,sizeof(sa)) == -1) { - if (errno == EINPROGRESS && - flags & ANET_CONNECT_NONBLOCK) - return s; - - anetSetError(err, "connect: %s", strerror(errno)); - close(s); - return ANET_ERR; - } - return s; -} - -int anetUnixConnect(char *err, char *path) -{ - return anetUnixGenericConnect(err,path,ANET_CONNECT_NONE); -} - -int anetUnixNonBlockConnect(char *err, char *path) -{ - return anetUnixGenericConnect(err,path,ANET_CONNECT_NONBLOCK); -} - /* Like read(2) but make sure 'count' is read before to return * (unless error or EOF condition is encountered) */ int anetRead(int fd, char *buf, int count) @@ -256,7 +278,7 @@ int anetWrite(int fd, char *buf, int count) static int anetListen(char *err, int s, struct sockaddr *sa, socklen_t len) { if (bind(s,sa,len) == -1) { - anetSetError(err, "bind: %s", strerror(errno)); + anetSetError(err, "bind: " ERROR_DATA_FORMAT, anetErrorData()); close(s); return ANET_ERR; } @@ -265,7 +287,7 @@ static int anetListen(char *err, int s, struct sockaddr *sa, socklen_t len) { * the kernel does: backlogsize = roundup_pow_of_two(backlogsize + 1); * which will thus give us a backlog of 512 entries */ if (listen(s, 511) == -1) { - anetSetError(err, "listen: %s", strerror(errno)); + anetSetError(err, "listen: " ERROR_DATA_FORMAT, anetErrorData()); close(s); return ANET_ERR; } @@ -294,33 +316,15 @@ int anetTcpServer(char *err, int port, char *bindaddr) return s; } -int anetUnixServer(char *err, char *path, mode_t perm) -{ - int s; - struct sockaddr_un sa; - - if ((s = anetCreateSocket(err,AF_LOCAL)) == ANET_ERR) - return ANET_ERR; - - memset(&sa,0,sizeof(sa)); - sa.sun_family = AF_LOCAL; - strncpy(sa.sun_path,path,sizeof(sa.sun_path)-1); - if (anetListen(err,s,(struct sockaddr*)&sa,sizeof(sa)) == ANET_ERR) - return ANET_ERR; - if (perm) - chmod(sa.sun_path, perm); - return s; -} - static int anetGenericAccept(char *err, int s, struct sockaddr *sa, socklen_t *len) { int fd; while(1) { fd = accept(s,sa,len); if (fd == -1) { - if (errno == EINTR) + if (anetErrorIs(INTR)) continue; else { - anetSetError(err, "accept: %s", strerror(errno)); + anetSetError(err, "accept: " ERROR_DATA_FORMAT, anetErrorData()); return ANET_ERR; } } @@ -341,6 +345,61 @@ int anetTcpAccept(char *err, int s, char *ip, int *port) { return fd; } +#ifndef _MSC_VER +int anetUnixGenericConnect(char *err, char *path, int flags) +{ + int s; + struct sockaddr_un sa; + + if ((s = anetCreateSocket(err, AF_LOCAL)) == ANET_ERR) + return ANET_ERR; + + sa.sun_family = AF_LOCAL; + strncpy(sa.sun_path, path, sizeof(sa.sun_path) - 1); + if (flags & ANET_CONNECT_NONBLOCK) { + if (anetNonBlock(err, s) != ANET_OK) + return ANET_ERR; + } + if (connect(s, (struct sockaddr*)&sa, sizeof(sa)) == -1) { + if (anetErrorIs(INPROGRESS) && + flags & ANET_CONNECT_NONBLOCK) + return s; + + anetSetError(err, "connect: " ERROR_DATA_FORMAT, anetErrorData()); + close(s); + return ANET_ERR; + } + return s; +} + +int anetUnixConnect(char *err, char *path) +{ + return anetUnixGenericConnect(err, path, ANET_CONNECT_NONE); +} + +int anetUnixNonBlockConnect(char *err, char *path) +{ + return anetUnixGenericConnect(err, path, ANET_CONNECT_NONBLOCK); +} + +int anetUnixServer(char *err, char *path, mode_t perm) +{ + int s; + struct sockaddr_un sa; + + if ((s = anetCreateSocket(err, AF_LOCAL)) == ANET_ERR) + return ANET_ERR; + + memset(&sa, 0, sizeof(sa)); + sa.sun_family = AF_LOCAL; + strncpy(sa.sun_path, path, sizeof(sa.sun_path) - 1); + if (anetListen(err, s, (struct sockaddr*)&sa, sizeof(sa)) == ANET_ERR) + return ANET_ERR; + if (perm) + chmod(sa.sun_path, perm); + return s; +} + int anetUnixAccept(char *err, int s) { int fd; struct sockaddr_un sa; @@ -350,6 +409,7 @@ int anetUnixAccept(char *err, int s) { return fd; } +#endif int anetPeerToString(int fd, char *ip, int *port) { struct sockaddr_in sa; diff --git a/anet.h b/anet.h index 6d74af577..90935df15 100644 --- a/anet.h +++ b/anet.h @@ -39,16 +39,19 @@ #define AF_LOCAL AF_UNIX #endif +int anetInit(char *err); int anetTcpConnect(char *err, char *addr, int port); int anetTcpNonBlockConnect(char *err, char *addr, int port); -int anetUnixConnect(char *err, char *path); -int anetUnixNonBlockConnect(char *err, char *path); int anetRead(int fd, char *buf, int count); int anetResolve(char *err, char *host, char *ipbuf); int anetTcpServer(char *err, int port, char *bindaddr); -int anetUnixServer(char *err, char *path, mode_t perm); int anetTcpAccept(char *err, int serversock, char *ip, int *port); +#ifndef _MSC_VER +int anetUnixConnect(char *err, char *path); +int anetUnixNonBlockConnect(char *err, char *path); +int anetUnixServer(char *err, char *path, mode_t perm); int anetUnixAccept(char *err, int serversock); +#endif int anetWrite(int fd, char *buf, int count); int anetNonBlock(char *err, int fd); int anetTcpNoDelay(char *err, int fd); diff --git a/dump1090.c b/dump1090.c index 7fa5327a3..aec4e2e0b 100644 --- a/dump1090.c +++ b/dump1090.c @@ -34,15 +34,47 @@ #include #include #include -#include #include -#include #include #include #include #include + +#ifndef _MSC_VER + +#include +#include #include #include +#include + +#define OPEN_FILE_MODE O_RDONLY + +#define CONCAT(A, B) A ## B + +#define sockError() errno +#define sockErrorIs(A) (errno == CONCAT(E, A)) + +#else + +#include +#include + +typedef intptr_t ssize_t; + +#define M_PI 3.14159265358979323846264338327950288 +#define STDIN_FILENO 0 +#define OPEN_FILE_MODE (O_RDONLY | O_BINARY) + +#define CONCAT(A, B) A ## B + +#define sockError() WSAGetLastError() +#define sockErrorIs(A) (WSAGetLastError() == CONCAT(WSAE, A)) + +#define WSAEAGAIN WSAEWOULDBLOCK + +#endif + #include "rtl-sdr.h" #include "anet.h" @@ -245,6 +277,7 @@ int getTermRows(); /* ============================= Utility functions ========================== */ static long long mstime(void) { +#ifndef _MSC_VER struct timeval tv; long long mst; @@ -252,6 +285,12 @@ static long long mstime(void) { mst = ((long long)tv.tv_sec)*1000; mst += tv.tv_usec/1000; return mst; +#else + FILETIME ft; + + GetSystemTimeAsFileTime(&ft); + return (ft.dwHighDateTime * 0x100000000LL + ft.dwLowDateTime) / 10000 - 11644473600000LL; +#endif } /* =============================== Initialization =========================== */ @@ -422,7 +461,11 @@ void readDataFromFile(void) { /* When --ifile and --interactive are used together, slow down * playing at the natural rate of the RTLSDR received. */ pthread_mutex_unlock(&Modes.data_mutex); +#ifndef _MSC_VER usleep(5000); +#else + Sleep(5); +#endif pthread_mutex_lock(&Modes.data_mutex); } @@ -889,10 +932,6 @@ char *fs_str[8] = { /* 7 */ "Value 7 is not assigned" }; -/* ME message type to description table. */ -char *me_str[] = { -}; - char *getMEDescription(int metype, int mesub) { char *mename = "Unknown"; @@ -1805,7 +1844,12 @@ void interactiveShowData(void) { progress[time(NULL)%3] = '.'; progress[3] = '\0'; +#ifdef _MSC_VER + system("cls"); +#else printf("\x1b[H\x1b[2J"); /* Clear the screen */ +#endif + printf( "Hex Flight Altitude Speed Lat Lon Track Messages Seen %s\n" "--------------------------------------------------------------------------------\n", @@ -1909,20 +1953,29 @@ void modesInitNet(void) { memset(Modes.clients,0,sizeof(Modes.clients)); Modes.maxfd = -1; + if (anetInit(Modes.aneterr) != ANET_OK) + { + fprintf(stderr, "Error starting anet: %s\n", + Modes.aneterr); + exit(1); + } + for (j = 0; j < MODES_NET_SERVICES_NUM; j++) { int s = anetTcpServer(Modes.aneterr, modesNetServices[j].port, NULL); if (s == -1) { fprintf(stderr, "Error opening the listening port %d (%s): %s\n", modesNetServices[j].port, modesNetServices[j].descr, - strerror(errno)); + Modes.aneterr); exit(1); } anetNonBlock(Modes.aneterr, s); *modesNetServices[j].socket = s; } +#ifndef _MSC_VER signal(SIGPIPE, SIG_IGN); +#endif } /* This function gets called from time to time when the decoding thread is @@ -1937,9 +1990,9 @@ void modesAcceptClients(void) { fd = anetTcpAccept(Modes.aneterr, *modesNetServices[j].socket, NULL, &port); if (fd == -1) { - if (Modes.debug & MODES_DEBUG_NET && errno != EAGAIN) + if (Modes.debug & MODES_DEBUG_NET && !sockErrorIs(AGAIN) && !sockErrorIs(WOULDBLOCK)) printf("Accept %d: %s\n", *modesNetServices[j].socket, - strerror(errno)); + Modes.aneterr); continue; } @@ -1969,7 +2022,13 @@ void modesAcceptClients(void) { /* On error free the client, collect the structure, adjust maxfd if needed. */ void modesFreeClient(int fd) { +#ifdef _MSC_VER + shutdown(fd, SD_SEND); + closesocket(fd); +#else close(fd); +#endif + free(Modes.clients[fd]); Modes.clients[fd] = NULL; @@ -2000,7 +2059,7 @@ void modesSendAllClients(int service, void *msg, int len) { for (j = 0; j <= Modes.maxfd; j++) { c = Modes.clients[j]; if (c && c->service == service) { - int nwritten = write(j, msg, len); + int nwritten = send(j, msg, len, 0); if (nwritten != len) { modesFreeClient(j); } @@ -2234,7 +2293,7 @@ int handleHTTPRequest(struct client *c) { int fd = -1; if (stat("gmap.html",&sbuf) != -1 && - (fd = open("gmap.html",O_RDONLY)) != -1) + (fd = open("gmap.html", OPEN_FILE_MODE)) != -1) { content = malloc(sbuf.st_size); if (read(fd,content,sbuf.st_size) == -1) { @@ -2270,8 +2329,8 @@ int handleHTTPRequest(struct client *c) { printf("HTTP Reply header:\n%s", hdr); /* Send header and content. */ - if (write(c->fd, hdr, hdrlen) != hdrlen || - write(c->fd, content, clen) != clen) + if (send(c->fd, hdr, hdrlen, 0) != hdrlen || + send(c->fd, content, clen, 0) != clen) { free(content); return 1; @@ -2298,13 +2357,13 @@ void modesReadFromClient(struct client *c, char *sep, { while(1) { int left = MODES_CLIENT_BUF_SIZE - c->buflen; - int nread = read(c->fd, c->buf+c->buflen, left); + int nread = recv(c->fd, c->buf+c->buflen, left, 0); int fullmsg = 0; int i; char *p; if (nread <= 0) { - if (nread == 0 || errno != EAGAIN) { + if (nread == 0 || (!sockErrorIs(AGAIN) && !sockErrorIs(WOULDBLOCK))) { /* Error, or end of file. */ modesFreeClient(c->fd); } @@ -2399,6 +2458,7 @@ void modesWaitReadableClients(int timeout_ms) { /* ============================ Terminal handling ========================== */ +#ifndef _MSC_VER /* Handle resizing terminal. */ void sigWinchCallback() { signal(SIGWINCH, SIG_IGN); @@ -2406,12 +2466,20 @@ void sigWinchCallback() { interactiveShowData(); signal(SIGWINCH, sigWinchCallback); } +#endif /* Get the number of rows after the terminal changes size. */ int getTermRows() { +#ifndef _MSC_VER struct winsize w; ioctl(STDOUT_FILENO, TIOCGWINSZ, &w); return w.ws_row; +#else + CONSOLE_SCREEN_BUFFER_INFO w; + HANDLE hStdout = GetStdHandle(STD_OUTPUT_HANDLE); + GetConsoleScreenBufferInfo(hStdout, &w); + return (int)w.dwSize.Y; +#endif } /* ================================ Main ==================================== */ @@ -2560,8 +2628,10 @@ int main(int argc, char **argv) { } } +#ifndef _MSC_VER /* Setup for SIGWINCH for handling lines */ if (Modes.interactive == 1) signal(SIGWINCH, sigWinchCallback); +#endif /* Initialization */ modesInit(); @@ -2572,7 +2642,7 @@ int main(int argc, char **argv) { } else { if (Modes.filename[0] == '-' && Modes.filename[1] == '\0') { Modes.fd = STDIN_FILENO; - } else if ((Modes.fd = open(Modes.filename,O_RDONLY)) == -1) { + } else if ((Modes.fd = open(Modes.filename, OPEN_FILE_MODE)) == -1) { perror("Opening data file"); exit(1); } @@ -2632,5 +2702,3 @@ int main(int argc, char **argv) { rtlsdr_close(Modes.dev); return 0; } - - diff --git a/vs-2015/.gitignore b/vs-2015/.gitignore new file mode 100644 index 000000000..4f4dd1ea0 --- /dev/null +++ b/vs-2015/.gitignore @@ -0,0 +1,5 @@ +* + +!.gitignore +!*.sln +!*.vcxproj diff --git a/vs-2015/dump1090.sln b/vs-2015/dump1090.sln new file mode 100644 index 000000000..5b4ba7e03 --- /dev/null +++ b/vs-2015/dump1090.sln @@ -0,0 +1,28 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "dump1090", "dump1090.vcxproj", "{16CF687B-1555-471F-BDAC-27BB21BDB260}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {16CF687B-1555-471F-BDAC-27BB21BDB260}.Debug|x64.ActiveCfg = Debug|x64 + {16CF687B-1555-471F-BDAC-27BB21BDB260}.Debug|x64.Build.0 = Debug|x64 + {16CF687B-1555-471F-BDAC-27BB21BDB260}.Debug|x86.ActiveCfg = Debug|Win32 + {16CF687B-1555-471F-BDAC-27BB21BDB260}.Debug|x86.Build.0 = Debug|Win32 + {16CF687B-1555-471F-BDAC-27BB21BDB260}.Release|x64.ActiveCfg = Release|x64 + {16CF687B-1555-471F-BDAC-27BB21BDB260}.Release|x64.Build.0 = Release|x64 + {16CF687B-1555-471F-BDAC-27BB21BDB260}.Release|x86.ActiveCfg = Release|Win32 + {16CF687B-1555-471F-BDAC-27BB21BDB260}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/vs-2015/dump1090.vcxproj b/vs-2015/dump1090.vcxproj new file mode 100644 index 000000000..23e6a4243 --- /dev/null +++ b/vs-2015/dump1090.vcxproj @@ -0,0 +1,142 @@ + + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + {16CF687B-1555-471F-BDAC-27BB21BDB260} + Win32Proj + + + + Application + true + v140 + + + Application + false + v140 + + + Application + true + v140 + + + Application + false + v140 + + + + + + + + + + + + + + + + + + + + + true + + + true + + + + _TIMESPEC_DEFINED;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + Level3 + ProgramDatabase + Disabled + $(ProjectDir)..\..\librtlsdr\include;$(ProjectDir)..\..\pthreads-win32\include;%(AdditionalIncludeDirectories) + + + MachineX86 + true + Console + Ws2_32.lib;rtlsdr.lib;pthreadVC2.lib;%(AdditionalDependencies) + $(ProjectDir)..\..\librtlsdr\src\Debug;$(ProjectDir)..\..\pthreads-win32\lib\x86;%(AdditionalLibraryDirectories) + + + + + _TIMESPEC_DEFINED;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) + MultiThreadedDLL + Level3 + ProgramDatabase + $(ProjectDir)..\..\librtlsdr\include;$(ProjectDir)..\..\pthreads-win32\include;%(AdditionalIncludeDirectories) + + + MachineX86 + true + Console + true + true + Ws2_32.lib;rtlsdr.lib;pthreadVC2.lib;%(AdditionalDependencies) + $(ProjectDir)..\..\librtlsdr\src\Release;$(ProjectDir)..\..\pthreads-win32\lib\x86;%(AdditionalLibraryDirectories) + + + + + _TIMESPEC_DEFINED; + $(ProjectDir)..\..\librtlsdr\include;$(ProjectDir)..\..\pthreads-win32\include;%(AdditionalIncludeDirectories) + Level3 + + + Ws2_32.lib;rtlsdr.lib;pthreadVC2.lib;%(AdditionalDependencies) + $(ProjectDir)..\..\librtlsdr\src\Debug;$(ProjectDir)..\..\pthreads-win32\lib\x64;%(AdditionalLibraryDirectories) + + + + + _TIMESPEC_DEFINED; + $(ProjectDir)..\..\librtlsdr\include;$(ProjectDir)..\..\pthreads-win32\include;%(AdditionalIncludeDirectories) + Level3 + + + Ws2_32.lib;rtlsdr.lib;pthreadVC2.lib;%(AdditionalDependencies) + $(ProjectDir)..\..\librtlsdr\src\Release;$(ProjectDir)..\..\pthreads-win32\lib\x64;%(AdditionalLibraryDirectories) + + + + + + + + + + + + + + + + + + \ No newline at end of file