diff --git a/trunk/configure b/trunk/configure index 285ff7381..1bd51abbc 100755 --- a/trunk/configure +++ b/trunk/configure @@ -299,10 +299,9 @@ END GDBDebug=" -g -O0" # the warning level. WarnLevel=" -Wall" -# the compile standard. -if [ "$MSYSTEM" != "MINGW32" -a "$MSYSTEM" != "MINGW64" ]; then - CppStd="-ansi" -fi +# the compile in c++ standard. +# @remark, donot specifies it for mingw. +CppStd="-ansi" && echo $MSYSTEM|grep "MINGW">/dev/null && CppStd="" # for library compile LibraryCompile=" -fPIC" # performance of gprof diff --git a/trunk/src/core/srs_core.hpp b/trunk/src/core/srs_core.hpp index 90802b2a0..9025d504c 100644 --- a/trunk/src/core/srs_core.hpp +++ b/trunk/src/core/srs_core.hpp @@ -85,7 +85,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. // generated by configure. #include -#include + // free the p and set to NULL. // p must be a T*. #define srs_freep(p) \ @@ -110,5 +110,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. className(const className&); \ className& operator= (const className&) +// for windows to compile srs-librtmp +// @see: https://github.com/winlinvip/simple-rtmp-server/issues/213 +#include + #endif diff --git a/trunk/src/core/srs_platform.cpp b/trunk/src/core/srs_platform.cpp index c3940f467..9e3f5fba9 100644 --- a/trunk/src/core/srs_platform.cpp +++ b/trunk/src/core/srs_platform.cpp @@ -1,11 +1,33 @@ +/* +The MIT License (MIT) + +Copyright (c) 2014 allspace + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#include + #include #include #include -#include "srs_platform.hpp" - #if defined(_WIN32) && !defined(__CYGWIN__) - int socket_setup() { WORD wVersionRequested; @@ -31,309 +53,309 @@ int socket_cleanup() return 0; } - int gettimeofday(struct timeval* tv, struct timezone* tz) - { - time_t clock; - struct tm tm; - SYSTEMTIME win_time; - - GetLocalTime(&win_time); - - tm.tm_year = win_time.wYear - 1900; - tm.tm_mon = win_time.wMonth - 1; - tm.tm_mday = win_time.wDay; - tm.tm_hour = win_time.wHour; - tm.tm_min = win_time.wMinute; - tm.tm_sec = win_time.wSecond; - tm.tm_isdst = -1; - - clock = mktime(&tm); - - tv->tv_sec = (long)clock; - tv->tv_usec = win_time.wMilliseconds * 1000; - - return 0; - } - - pid_t getpid(void) - { - return (pid_t)GetCurrentProcessId(); - } - - int usleep(useconds_t usec) - { - Sleep((DWORD)(usec / 1000)); - return 0; - } - - ssize_t writev(int fd, const struct iovec *iov, int iovcnt) - { - ssize_t nwrite = 0; - for (int i = 0; i < iovcnt; i++) { - const struct iovec* current = iov + i; - - int nsent = ::send(fd, (char*)current->iov_base, current->iov_len, 0); - if (nsent < 0) { - return nsent; - } - - nwrite += nsent; - if (nsent == 0) { - return nwrite; - } +int gettimeofday(struct timeval* tv, struct timezone* tz) +{ + time_t clock; + struct tm tm; + SYSTEMTIME win_time; + + GetLocalTime(&win_time); + + tm.tm_year = win_time.wYear - 1900; + tm.tm_mon = win_time.wMonth - 1; + tm.tm_mday = win_time.wDay; + tm.tm_hour = win_time.wHour; + tm.tm_min = win_time.wMinute; + tm.tm_sec = win_time.wSecond; + tm.tm_isdst = -1; + + clock = mktime(&tm); + + tv->tv_sec = (long)clock; + tv->tv_usec = win_time.wMilliseconds * 1000; + + return 0; +} + +pid_t getpid(void) +{ + return (pid_t)GetCurrentProcessId(); +} + +int usleep(useconds_t usec) +{ + Sleep((DWORD)(usec / 1000)); + return 0; +} + +ssize_t writev(int fd, const struct iovec *iov, int iovcnt) +{ + ssize_t nwrite = 0; + for (int i = 0; i < iovcnt; i++) { + const struct iovec* current = iov + i; + + int nsent = ::send(fd, (char*)current->iov_base, current->iov_len, 0); + if (nsent < 0) { + return nsent; + } + + nwrite += nsent; + if (nsent == 0) { + return nwrite; + } + } + return nwrite; +} + +//////////////////////// strlcpy.c (modified) ////////////////////////// + +/* $OpenBSD: strlcpy.c,v 1.11 2006/05/05 15:27:38 millert Exp $ */ + +/*- + * Copyright (c) 1998 Todd C. Miller + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +//#include // **** +//#include // **** +// __FBSDID("$FreeBSD: stable/9/sys/libkern/strlcpy.c 243811 2012-12-03 18:08:44Z delphij $"); // **** + +// #include // **** +// #include // **** + +/* + * Copy src to string dst of size siz. At most siz-1 characters + * will be copied. Always NUL terminates (unless siz == 0). + * Returns strlen(src); if retval >= siz, truncation occurred. + */ + +//#define __restrict // **** + +size_t strlcpy(char * __restrict dst, const char * __restrict src, size_t siz) +{ + char *d = dst; + const char *s = src; + size_t n = siz; + + /* Copy as many bytes as will fit */ + if (n != 0) { + while (--n != 0) { + if ((*d++ = *s++) == '\0') + break; } - return nwrite; } - //////////////////////// strlcpy.c (modified) ////////////////////////// - - /* $OpenBSD: strlcpy.c,v 1.11 2006/05/05 15:27:38 millert Exp $ */ - - /*- - * Copyright (c) 1998 Todd C. Miller - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - - //#include // **** - //#include // **** - // __FBSDID("$FreeBSD: stable/9/sys/libkern/strlcpy.c 243811 2012-12-03 18:08:44Z delphij $"); // **** - - // #include // **** - // #include // **** - + /* Not enough room in dst, add NUL and traverse rest of src */ + if (n == 0) { + if (siz != 0) + *d = '\0'; /* NUL-terminate dst */ + while (*s++) + ; + } + + return(s - src - 1); /* count does not include NUL */ +} + +// http://www.cplusplus.com/forum/general/141779///////////////////////// inet_ntop.c (modified) ////////////////////////// +/* + * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") + * Copyright (c) 1996-1999 by Internet Software Consortium. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT + * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +// #if defined(LIBC_SCCS) && !defined(lint) // **** +//static const char rcsid[] = "$Id: inet_ntop.c,v 1.3.18.2 2005/11/03 23:02:22 marka Exp $"; +// #endif /* LIBC_SCCS and not lint */ // **** +// #include // **** +// __FBSDID("$FreeBSD: stable/9/sys/libkern/inet_ntop.c 213103 2010-09-24 15:01:45Z attilio $"); // **** + +//#define _WIN32_WINNT _WIN32_WINNT_WIN8 // **** +//#include // **** +//#pragma comment(lib, "Ws2_32.lib") // **** +//#include // **** + +// #include // **** +// #include // **** +// #include // **** + +// #include // **** + +/*% + * WARNING: Don't even consider trying to compile this on a system where + * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX. + */ + +static char *inet_ntop4(const u_char *src, char *dst, socklen_t size); +static char *inet_ntop6(const u_char *src, char *dst, socklen_t size); + +/* char * + * inet_ntop(af, src, dst, size) + * convert a network format address to presentation format. + * return: + * pointer to presentation format address (`dst'), or NULL (see errno). + * author: + * Paul Vixie, 1996. + */ +const char* inet_ntop(int af, const void *src, char *dst, socklen_t size) +{ + switch (af) { + case AF_INET: + return (inet_ntop4( (unsigned char*)src, (char*)dst, size)); // **** +#ifdef AF_INET6 + //#error "IPv6 not supported" + //case AF_INET6: + // return (char*)(inet_ntop6( (unsigned char*)src, (char*)dst, size)); // **** +#endif + default: + // return (NULL); // **** + return 0 ; // **** + } + /* NOTREACHED */ +} + +/* const char * + * inet_ntop4(src, dst, size) + * format an IPv4 address + * return: + * `dst' (as a const) + * notes: + * (1) uses no statics + * (2) takes a u_char* not an in_addr as input + * author: + * Paul Vixie, 1996. + */ +static char * inet_ntop4(const u_char *src, char *dst, socklen_t size) +{ + static const char fmt[128] = "%u.%u.%u.%u"; + char tmp[sizeof "255.255.255.255"]; + int l; + + l = snprintf(tmp, sizeof(tmp), fmt, src[0], src[1], src[2], src[3]); // **** + if (l <= 0 || (socklen_t) l >= size) { + return (NULL); + } + strlcpy(dst, tmp, size); + return (dst); +} + +/* const char * + * inet_ntop6(src, dst, size) + * convert IPv6 binary address into presentation (printable) format + * author: + * Paul Vixie, 1996. + */ +static char * inet_ntop6(const u_char *src, char *dst, socklen_t size) +{ /* - * Copy src to string dst of size siz. At most siz-1 characters - * will be copied. Always NUL terminates (unless siz == 0). - * Returns strlen(src); if retval >= siz, truncation occurred. + * Note that int32_t and int16_t need only be "at least" large enough + * to contain a value of the specified size. On some systems, like + * Crays, there is no such thing as an integer variable with 16 bits. + * Keep this in mind if you think this function should have been coded + * to use pointer overlays. All the world's not a VAX. */ - - //#define __restrict // **** - - size_t strlcpy(char * __restrict dst, const char * __restrict src, size_t siz) - { - char *d = dst; - const char *s = src; - size_t n = siz; - - /* Copy as many bytes as will fit */ - if (n != 0) { - while (--n != 0) { - if ((*d++ = *s++) == '\0') - break; + char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp; + struct { int base, len; } best, cur; +#define NS_IN6ADDRSZ 16 +#define NS_INT16SZ 2 + u_int words[NS_IN6ADDRSZ / NS_INT16SZ]; + int i; + + /* + * Preprocess: + * Copy the input (bytewise) array into a wordwise array. + * Find the longest run of 0x00's in src[] for :: shorthanding. + */ + memset(words, '\0', sizeof words); + for (i = 0; i < NS_IN6ADDRSZ; i++) + words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3)); + best.base = -1; + best.len = 0; + cur.base = -1; + cur.len = 0; + for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { + if (words[i] == 0) { + if (cur.base == -1) + cur.base = i, cur.len = 1; + else + cur.len++; + } else { + if (cur.base != -1) { + if (best.base == -1 || cur.len > best.len) + best = cur; + cur.base = -1; } } - - /* Not enough room in dst, add NUL and traverse rest of src */ - if (n == 0) { - if (siz != 0) - *d = '\0'; /* NUL-terminate dst */ - while (*s++) - ; - } - - return(s - src - 1); /* count does not include NUL */ } - - // http://www.cplusplus.com/forum/general/141779///////////////////////// inet_ntop.c (modified) ////////////////////////// - /* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996-1999 by Internet Software Consortium. - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT - * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - - // #if defined(LIBC_SCCS) && !defined(lint) // **** - //static const char rcsid[] = "$Id: inet_ntop.c,v 1.3.18.2 2005/11/03 23:02:22 marka Exp $"; - // #endif /* LIBC_SCCS and not lint */ // **** - // #include // **** - // __FBSDID("$FreeBSD: stable/9/sys/libkern/inet_ntop.c 213103 2010-09-24 15:01:45Z attilio $"); // **** - - //#define _WIN32_WINNT _WIN32_WINNT_WIN8 // **** - //#include // **** - //#pragma comment(lib, "Ws2_32.lib") // **** - //#include // **** - - // #include // **** - // #include // **** - // #include // **** - - // #include // **** - - /*% - * WARNING: Don't even consider trying to compile this on a system where - * sizeof(int) < 4. sizeof(int) > 4 is fine; all the world's not a VAX. - */ - - static char *inet_ntop4(const u_char *src, char *dst, socklen_t size); - static char *inet_ntop6(const u_char *src, char *dst, socklen_t size); - - /* char * - * inet_ntop(af, src, dst, size) - * convert a network format address to presentation format. - * return: - * pointer to presentation format address (`dst'), or NULL (see errno). - * author: - * Paul Vixie, 1996. - */ - const char* inet_ntop(int af, const void *src, char *dst, socklen_t size) - { - switch (af) { - case AF_INET: - return (inet_ntop4( (unsigned char*)src, (char*)dst, size)); // **** - #ifdef AF_INET6 - //#error "IPv6 not supported" - //case AF_INET6: - // return (char*)(inet_ntop6( (unsigned char*)src, (char*)dst, size)); // **** - #endif - default: - // return (NULL); // **** - return 0 ; // **** - } - /* NOTREACHED */ + if (cur.base != -1) { + if (best.base == -1 || cur.len > best.len) + best = cur; } - - /* const char * - * inet_ntop4(src, dst, size) - * format an IPv4 address - * return: - * `dst' (as a const) - * notes: - * (1) uses no statics - * (2) takes a u_char* not an in_addr as input - * author: - * Paul Vixie, 1996. - */ - static char * inet_ntop4(const u_char *src, char *dst, socklen_t size) - { - static const char fmt[128] = "%u.%u.%u.%u"; - char tmp[sizeof "255.255.255.255"]; - int l; - - l = snprintf(tmp, sizeof(tmp), fmt, src[0], src[1], src[2], src[3]); // **** - if (l <= 0 || (socklen_t) l >= size) { - return (NULL); - } - strlcpy(dst, tmp, size); - return (dst); - } - - /* const char * - * inet_ntop6(src, dst, size) - * convert IPv6 binary address into presentation (printable) format - * author: - * Paul Vixie, 1996. - */ - static char * inet_ntop6(const u_char *src, char *dst, socklen_t size) - { - /* - * Note that int32_t and int16_t need only be "at least" large enough - * to contain a value of the specified size. On some systems, like - * Crays, there is no such thing as an integer variable with 16 bits. - * Keep this in mind if you think this function should have been coded - * to use pointer overlays. All the world's not a VAX. - */ - char tmp[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"], *tp; - struct { int base, len; } best, cur; - #define NS_IN6ADDRSZ 16 - #define NS_INT16SZ 2 - u_int words[NS_IN6ADDRSZ / NS_INT16SZ]; - int i; - - /* - * Preprocess: - * Copy the input (bytewise) array into a wordwise array. - * Find the longest run of 0x00's in src[] for :: shorthanding. - */ - memset(words, '\0', sizeof words); - for (i = 0; i < NS_IN6ADDRSZ; i++) - words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3)); + if (best.base != -1 && best.len < 2) best.base = -1; - best.len = 0; - cur.base = -1; - cur.len = 0; - for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { - if (words[i] == 0) { - if (cur.base == -1) - cur.base = i, cur.len = 1; - else - cur.len++; - } else { - if (cur.base != -1) { - if (best.base == -1 || cur.len > best.len) - best = cur; - cur.base = -1; - } - } - } - if (cur.base != -1) { - if (best.base == -1 || cur.len > best.len) - best = cur; - } - if (best.base != -1 && best.len < 2) - best.base = -1; - - /* - * Format the result. - */ - tp = tmp; - for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { - /* Are we inside the best run of 0x00's? */ - if (best.base != -1 && i >= best.base && - i < (best.base + best.len)) { - if (i == best.base) - *tp++ = ':'; - continue; - } - /* Are we following an initial run of 0x00s or any real hex? */ - if (i != 0) + + /* + * Format the result. + */ + tp = tmp; + for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) { + /* Are we inside the best run of 0x00's? */ + if (best.base != -1 && i >= best.base && + i < (best.base + best.len)) { + if (i == best.base) *tp++ = ':'; - /* Is this address an encapsulated IPv4? */ - if (i == 6 && best.base == 0 && (best.len == 6 || - (best.len == 7 && words[7] != 0x0001) || - (best.len == 5 && words[5] == 0xffff))) { - if (!inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp))) - return (NULL); - tp += strlen(tp); - break; - } - tp += sprintf(tp, "%x", words[i]); // **** + continue; } - /* Was it a trailing run of 0x00's? */ - if (best.base != -1 && (best.base + best.len) == - (NS_IN6ADDRSZ / NS_INT16SZ)) + /* Are we following an initial run of 0x00s or any real hex? */ + if (i != 0) *tp++ = ':'; - *tp++ = '\0'; - - /* - * Check for overflow, copy, and we're done. - */ - if ((socklen_t)(tp - tmp) > size) { - return (NULL); + /* Is this address an encapsulated IPv4? */ + if (i == 6 && best.base == 0 && (best.len == 6 || + (best.len == 7 && words[7] != 0x0001) || + (best.len == 5 && words[5] == 0xffff))) { + if (!inet_ntop4(src+12, tp, sizeof tmp - (tp - tmp))) + return (NULL); + tp += strlen(tp); + break; } - strcpy(dst, tmp); - return (dst); + tp += sprintf(tp, "%x", words[i]); // **** } + /* Was it a trailing run of 0x00's? */ + if (best.base != -1 && (best.base + best.len) == + (NS_IN6ADDRSZ / NS_INT16SZ)) + *tp++ = ':'; + *tp++ = '\0'; + + /* + * Check for overflow, copy, and we're done. + */ + if ((socklen_t)(tp - tmp) > size) { + return (NULL); + } + strcpy(dst, tmp); + return (dst); +} #define Set_errno(num) SetLastError((num)) @@ -347,61 +369,5 @@ int socket_cleanup() /* from public\sdk\inc\crt\errno.h */ #define ENOSPC 28 -/* - * - */ -/* -#ifndef INET_ADDRSTRLEN -#define INET_ADDRSTRLEN 16 -#endif - -static const char * -inet_ntop_v4 (const void *src, char *dst, size_t size) -{ - const char digits[] = "0123456789"; - int i; - struct in_addr *addr = (struct in_addr *)src; - u_long a = ntohl(addr->s_addr); - const char *orig_dst = dst; - - if (size < INET_ADDRSTRLEN) { - Set_errno(ENOSPC); - return NULL; - } - for (i = 0; i < 4; ++i) { - int n = (a >> (24 - i * 8)) & 0xFF; - int non_zerop = 0; - - if (non_zerop || n / 100 > 0) { - *dst++ = digits[n / 100]; - n %= 100; - non_zerop = 1; - } - if (non_zerop || n / 10 > 0) { - *dst++ = digits[n / 10]; - n %= 10; - non_zerop = 1; - } - *dst++ = digits[n]; - if (i != 3) - *dst++ = '.'; - } - *dst++ = '\0'; - return orig_dst; -} - -const char * -inet_ntop(int af, const void *src, char *dst, size_t size) -{ - switch (af) { - case AF_INET : - return inet_ntop_v4 (src, dst, size); - default : - Set_errno(EAFNOSUPPORT); - return NULL; - } -} - -*/ #endif diff --git a/trunk/src/core/srs_platform.hpp b/trunk/src/core/srs_platform.hpp index 2de405056..f1cf6479a 100644 --- a/trunk/src/core/srs_platform.hpp +++ b/trunk/src/core/srs_platform.hpp @@ -1,80 +1,92 @@ #ifndef SRS_WIN_PORTING_H #define SRS_WIN_PORTING_H -#if !defined(_WIN32) || defined(__CYGWIN__) /*not on windows or it's cygwin. _WIN32 includes both 32-bit and 64-bit*/ - -#define SOCKET_ETIME ETIME -#define SOCKET_ECONNRESET ECONNRESET - -#define SOCKET int -#define SOCKET_ERRNO() errno -#define SOCKET_RESET(x) x=-1 -#define SOCKET_CLOSE(x) if(x>=0){::close(x);x=-1;} -#define SOCKET_VALID(x) (x>=0) -#define SOCKET_SETUP() {} -#define SOCKET_CLEANUP() {} - -#else /*on windows, but not on cygwin*/ - -#include -#include -#include -#include - -#ifdef _MSC_VER //for VS2010 -#include -#include -#define S_IRUSR _S_IREAD -#define S_IWUSR _S_IWRITE -#define open _open -#define close _close -#define lseek _lseek -#define write _write -#define read _read - -typedef int ssize_t; -typedef int pid_t; -typedef int mode_t; -typedef int64_t useconds_t; +// for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213 +#if defined(_WIN32) + #include #endif -#define S_IRGRP 0 -#define S_IWGRP 0 -#define S_IXGRP 0 -#define S_IRWXG 0 -#define S_IROTH 0 -#define S_IWOTH 0 -#define S_IXOTH 0 -#define S_IRWXO 0 +/** +* for linux like, +* for example, not on windows or it's cygwin. +* while the _WIN32 includes both 32-bit and 64-bit +*/ +#if !defined(_WIN32) || defined(__CYGWIN__) + #define SOCKET_ETIME ETIME + #define SOCKET_ECONNRESET ECONNRESET -#define PRId64 "lld" + #define SOCKET int + #define SOCKET_ERRNO() errno + #define SOCKET_RESET(fd) fd = -1; (void)0 + #define SOCKET_CLOSE(fd) \ + if (fd > 0) {\ + ::close(fd); \ + fd = -1; \ + } \ + (void)0 + #define SOCKET_VALID(x) (x > 0) + #define SOCKET_SETUP() (void)0 + #define SOCKET_CLEANUP() (void)0 +#else /*on windows, but not on cygwin*/ + #include + #include + #include + #include -#define SOCKET_ETIME WSAETIMEDOUT -#define SOCKET_ECONNRESET WSAECONNRESET -#define SOCKET_ERRNO() WSAGetLastError() -#define SOCKET_RESET(x) x=INVALID_SOCKET -#define SOCKET_CLOSE(x) if(x!=INVALID_SOCKET){::closesocket(x);x=INVALID_SOCKET;} -#define SOCKET_VALID(x) (x!=INVALID_SOCKET) -#define SOCKET_BUFF(x) ((char*)x) -#define SOCKET_SETUP() socket_setup() -#define SOCKET_CLEANUP() socket_cleanup() + #ifdef _MSC_VER //for VS2010 + #include + #include + #define S_IRUSR _S_IREAD + #define S_IWUSR _S_IWRITE + #define open _open + #define close _close + #define lseek _lseek + #define write _write + #define read _read -typedef uint32_t u_int32_t; -typedef uint8_t u_int8_t; -typedef int socklen_t; -struct iovec { - void* iov_base; /* Starting address */ - size_t iov_len; /* Length in bytes */ -}; + typedef int ssize_t; + typedef int pid_t; + typedef int mode_t; + typedef int64_t useconds_t; + #endif -#define snprintf _snprintf -ssize_t writev(int fd, const struct iovec *iov, int iovcnt); -const char* inet_ntop(int af, const void *src, char *dst, socklen_t size); -int gettimeofday(struct timeval* tv, struct timezone* tz); -pid_t getpid(void); -int usleep(useconds_t usec); -int socket_setup(); -int socket_cleanup(); + #define S_IRGRP 0 + #define S_IWGRP 0 + #define S_IXGRP 0 + #define S_IRWXG 0 + #define S_IROTH 0 + #define S_IWOTH 0 + #define S_IXOTH 0 + #define S_IRWXO 0 + + #define PRId64 "lld" + + #define SOCKET_ETIME WSAETIMEDOUT + #define SOCKET_ECONNRESET WSAECONNRESET + #define SOCKET_ERRNO() WSAGetLastError() + #define SOCKET_RESET(x) x=INVALID_SOCKET + #define SOCKET_CLOSE(x) if(x!=INVALID_SOCKET){::closesocket(x);x=INVALID_SOCKET;} + #define SOCKET_VALID(x) (x!=INVALID_SOCKET) + #define SOCKET_BUFF(x) ((char*)x) + #define SOCKET_SETUP() socket_setup() + #define SOCKET_CLEANUP() socket_cleanup() + + typedef uint32_t u_int32_t; + typedef uint8_t u_int8_t; + typedef int socklen_t; + struct iovec { + void* iov_base; /* Starting address */ + size_t iov_len; /* Length in bytes */ + }; + + #define snprintf _snprintf + ssize_t writev(int fd, const struct iovec *iov, int iovcnt); + const char* inet_ntop(int af, const void *src, char *dst, socklen_t size); + int gettimeofday(struct timeval* tv, struct timezone* tz); + pid_t getpid(void); + int usleep(useconds_t usec); + int socket_setup(); + int socket_cleanup(); #endif #endif //SRS_WIN_PORTING_H diff --git a/trunk/src/kernel/srs_kernel_error.hpp b/trunk/src/kernel/srs_kernel_error.hpp index ed421b118..aa6aa4109 100644 --- a/trunk/src/kernel/srs_kernel_error.hpp +++ b/trunk/src/kernel/srs_kernel_error.hpp @@ -30,11 +30,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include -// success, ok -#if !defined(_WIN32) || defined(__CYGWIN__) //avoid redefine error on Windows +// for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213 +#ifndef _WIN32 #define ERROR_SUCCESS 0 -#else -#include #endif /////////////////////////////////////////////////////// diff --git a/trunk/src/libs/srs_lib_simple_socket.cpp b/trunk/src/libs/srs_lib_simple_socket.cpp index 9ee98e91d..08096e714 100644 --- a/trunk/src/libs/srs_lib_simple_socket.cpp +++ b/trunk/src/libs/srs_lib_simple_socket.cpp @@ -45,28 +45,22 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. SimpleSocketStream::SimpleSocketStream() { - //fd = -1; - SOCKET_RESET(fd); + SOCKET_RESET(fd); send_timeout = recv_timeout = ST_UTIME_NO_TIMEOUT; recv_bytes = send_bytes = 0; - SOCKET_SETUP(); + SOCKET_SETUP(); } SimpleSocketStream::~SimpleSocketStream() { - //if (fd != -1) { - // ::close(fd); - // fd = -1; - //} - SOCKET_CLOSE(fd); - SOCKET_CLEANUP(); + SOCKET_CLOSE(fd); + SOCKET_CLEANUP(); } int SimpleSocketStream::create_socket() { - //if((fd = ::socket(AF_INET, SOCK_STREAM, 0)) < 0){ - fd = ::socket(AF_INET, SOCK_STREAM, 0); - if(!SOCKET_VALID(fd)){ + fd = ::socket(AF_INET, SOCK_STREAM, 0); + if (!SOCKET_VALID(fd)) { return ERROR_SOCKET_CREATE; } diff --git a/trunk/src/libs/srs_librtmp.cpp b/trunk/src/libs/srs_librtmp.cpp index d212e1779..e2ca37a3b 100644 --- a/trunk/src/libs/srs_librtmp.cpp +++ b/trunk/src/libs/srs_librtmp.cpp @@ -22,7 +22,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include -#include + #include // for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213 @@ -34,6 +34,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include using namespace std; +#include #include #include #include @@ -107,56 +108,6 @@ struct Context } }; -// for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213 -#ifdef _WIN32 - -/* - int open(const char *pathname, int flags) - { - return open(pathname, flags, 0); - } - - int open(const char *pathname, int flags, mode_t mode) - { - FILE* file = NULL; - - if ((flags & O_RDONLY) == O_RDONLY) { - file = fopen(pathname, "r"); - } else { - file = fopen(pathname, "w+"); - } - - if (file == NULL) { - return -1; - } - - return (int)file; - } - - int close(int fd) - { - FILE* file = (FILE*)fd; - return fclose(file); - } - - off_t lseek(int fd, off_t offset, int whence) - { - return (off_t)fseek((FILE*)fd, offset, whence); - } - - ssize_t write(int fd, const void *buf, size_t count) - { - return (ssize_t)fwrite(buf, count, 1, (FILE*)fd); - } - - ssize_t read(int fd, void *buf, size_t count) - { - return (ssize_t)fread(buf, count, 1, (FILE*)fd); - } -*/ - -#endif - int srs_librtmp_context_parse_uri(Context* context) { int ret = ERROR_SUCCESS; diff --git a/trunk/src/libs/srs_librtmp.hpp b/trunk/src/libs/srs_librtmp.hpp index 0330b2da0..fb39ddd32 100644 --- a/trunk/src/libs/srs_librtmp.hpp +++ b/trunk/src/libs/srs_librtmp.hpp @@ -31,53 +31,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. #include -// for srs-librtmp, @see https://github.com/winlinvip/simple-rtmp-server/issues/213 -#if 0 - #define _CRT_SECURE_NO_WARNINGS - typedef unsigned long long u_int64_t; - typedef long long int64_t; - typedef unsigned int u_int32_t; - typedef int int32_t; - typedef unsigned char u_int8_t; - typedef char int8_t; - typedef unsigned short u_int16_t; - typedef short int16_t; - typedef int64_t ssize_t; - struct iovec { - void *iov_base; /* Starting address */ - size_t iov_len; /* Number of bytes to transfer */ - }; - #include - #include - int gettimeofday(struct timeval* tv, struct timezone* tz); - #define PRId64 "lld" - typedef int socklen_t; - const char *inet_ntop(int af, const void *src, char *dst, socklen_t size); - typedef int mode_t; - #define S_IRUSR 0 - #define S_IWUSR 0 - #define S_IRGRP 0 - #define S_IWGRP 0 - #define S_IROTH 0 - int open(const char *pathname, int flags); - int open(const char *pathname, int flags, mode_t mode); - int close(int fd); - off_t lseek(int fd, off_t offset, int whence); - ssize_t write(int fd, const void *buf, size_t count); - ssize_t read(int fd, void *buf, size_t count); - typedef int pid_t; - pid_t getpid(void); - #define snprintf _snprintf - ssize_t writev(int fd, const struct iovec *iov, int iovcnt); - typedef int64_t useconds_t; - int usleep(useconds_t usec); -#endif - -#if defined(_WIN32) && !defined(__CYGWIN__) -#include -typedef uint32_t u_int32_t; -#endif - /** * srs-librtmp is a librtmp like library, * used to play/publish rtmp stream from/to rtmp server. diff --git a/trunk/winbuild/srs_auto_headers.hpp b/trunk/winbuild/srs_auto_headers.hpp index c1845c939..4ebef350b 100644 --- a/trunk/winbuild/srs_auto_headers.hpp +++ b/trunk/winbuild/srs_auto_headers.hpp @@ -19,7 +19,7 @@ #undef SRS_AUTO_HTTP_CALLBACK #undef SRS_AUTO_SSL #undef SRS_AUTO_FFMPEG_TOOL -#define SRS_AUTO_FFMPEG_STUB +#undef SRS_AUTO_FFMPEG_STUB #undef SRS_AUTO_TRANSCODE #undef SRS_AUTO_INGEST #undef SRS_AUTO_STAT diff --git a/trunk/winbuild/srs_play.vcxproj b/trunk/winbuild/srs_play.vcxproj index 83c1b875b..0480153df 100644 --- a/trunk/winbuild/srs_play.vcxproj +++ b/trunk/winbuild/srs_play.vcxproj @@ -77,9 +77,9 @@ - + - \ No newline at end of file + diff --git a/trunk/winbuild/srs_play.vcxproj.filters b/trunk/winbuild/srs_play.vcxproj.filters index 53cbd3e87..f6123616d 100644 --- a/trunk/winbuild/srs_play.vcxproj.filters +++ b/trunk/winbuild/srs_play.vcxproj.filters @@ -15,8 +15,8 @@ - + Source Files - \ No newline at end of file +