aboutsummaryrefslogtreecommitdiff
path: root/drivers/unix
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/unix')
-rw-r--r--drivers/unix/dir_access_unix.cpp20
-rw-r--r--drivers/unix/dir_access_unix.h4
-rw-r--r--drivers/unix/file_access_unix.cpp2
-rw-r--r--drivers/unix/ip_unix.cpp126
-rw-r--r--drivers/unix/ip_unix.h2
-rw-r--r--drivers/unix/tcp_server_posix.cpp3
6 files changed, 151 insertions, 6 deletions
diff --git a/drivers/unix/dir_access_unix.cpp b/drivers/unix/dir_access_unix.cpp
index fff86c5a7..452d791d9 100644
--- a/drivers/unix/dir_access_unix.cpp
+++ b/drivers/unix/dir_access_unix.cpp
@@ -81,6 +81,26 @@ bool DirAccessUnix::file_exists(String p_file) {
}
+bool DirAccessUnix::dir_exists(String p_dir) {
+
+ GLOBAL_LOCK_FUNCTION
+
+
+ if (p_dir.is_rel_path())
+ p_dir=current_dir+"/"+p_dir;
+ else
+ p_dir=fix_path(p_dir);
+
+ struct stat flags;
+ bool success = (stat(p_dir.utf8().get_data(),&flags)==0);
+
+ if (success && S_ISDIR(flags.st_mode))
+ return true;
+
+ return false;
+
+}
+
uint64_t DirAccessUnix::get_modified_time(String p_file) {
if (p_file.is_rel_path())
diff --git a/drivers/unix/dir_access_unix.h b/drivers/unix/dir_access_unix.h
index 7ede4fc31..119cb5c3f 100644
--- a/drivers/unix/dir_access_unix.h
+++ b/drivers/unix/dir_access_unix.h
@@ -66,7 +66,9 @@ public:
virtual String get_current_dir(); ///< return current dir location
virtual Error make_dir(String p_dir);
- virtual bool file_exists(String p_file);
+ virtual bool file_exists(String p_file);
+ virtual bool dir_exists(String p_dir);
+
virtual uint64_t get_modified_time(String p_file);
diff --git a/drivers/unix/file_access_unix.cpp b/drivers/unix/file_access_unix.cpp
index 239e41be4..7f8552685 100644
--- a/drivers/unix/file_access_unix.cpp
+++ b/drivers/unix/file_access_unix.cpp
@@ -64,7 +64,7 @@ Error FileAccessUnix::_open(const String& p_path, int p_mode_flags) {
f=NULL;
String path=fix_path(p_path);
- //printf("opening %ls\n", path.c_str());
+ //printf("opening %ls, %i\n", path.c_str(), Memory::get_static_mem_usage());
ERR_FAIL_COND_V(f,ERR_ALREADY_IN_USE);
const char* mode_string;
diff --git a/drivers/unix/ip_unix.cpp b/drivers/unix/ip_unix.cpp
index c11426d35..c22174345 100644
--- a/drivers/unix/ip_unix.cpp
+++ b/drivers/unix/ip_unix.cpp
@@ -30,13 +30,33 @@
#if defined(UNIX_ENABLED) || defined(WINDOWS_ENABLED)
+
#ifdef WINDOWS_ENABLED
-#include <ws2tcpip.h>
-#include <winsock2.h>
-#include <windows.h>
+ #ifdef WINRT_ENABLED
+ #include <ws2tcpip.h>
+ #include <winsock2.h>
+ #include <windows.h>
+ #include <stdio.h>
+ #else
+ #define WINVER 0x0600
+ #include <ws2tcpip.h>
+ #include <winsock2.h>
+ #include <windows.h>
+ #include <stdio.h>
+ #include <iphlpapi.h>
+ #endif
#else
-#include <netdb.h>
+ #include <netdb.h>
+ #ifdef ANDROID_ENABLED
+ #include "platform/android/ifaddrs_android.h"
+ #else
+ #include <ifaddrs.h>
+ #endif
+ #include <arpa/inet.h>
+ #include <sys/socket.h>
+
#endif
+
IP_Address IP_Unix::_resolve_hostname(const String& p_hostname) {
struct hostent *he;
@@ -52,6 +72,104 @@ IP_Address IP_Unix::_resolve_hostname(const String& p_hostname) {
}
+#if defined(WINDOWS_ENABLED)
+
+#if defined(WINRT_ENABLED)
+
+void IP_Unix::get_local_addresses(List<IP_Address> *r_addresses) const {
+
+
+};
+#else
+
+void IP_Unix::get_local_addresses(List<IP_Address> *r_addresses) const {
+
+ ULONG buf_size = 1024;
+ IP_ADAPTER_ADDRESSES* addrs;
+
+ while (true) {
+
+ addrs = (IP_ADAPTER_ADDRESSES*)memalloc(buf_size);
+ int err = GetAdaptersAddresses(AF_INET, GAA_FLAG_SKIP_ANYCAST |
+ GAA_FLAG_SKIP_MULTICAST |
+ GAA_FLAG_SKIP_DNS_SERVER |
+ GAA_FLAG_SKIP_FRIENDLY_NAME,
+ NULL, addrs, &buf_size);
+ if (err == NO_ERROR) {
+ break;
+ };
+ memfree(addrs);
+ if (err == ERROR_BUFFER_OVERFLOW) {
+ continue; // will go back and alloc the right size
+ };
+
+ ERR_EXPLAIN("Call to GetAdaptersAddresses failed with error " + itos(err));
+ ERR_FAIL();
+ return;
+ };
+
+
+ IP_ADAPTER_ADDRESSES* adapter = addrs;
+
+ while (adapter != NULL) {
+
+ IP_ADAPTER_UNICAST_ADDRESS* address = adapter->FirstUnicastAddress;
+ while (address != NULL) {
+
+ char addr_chr[INET_ADDRSTRLEN];
+ SOCKADDR_IN* ipv4 = reinterpret_cast<SOCKADDR_IN*>(address->Address.lpSockaddr);
+
+ IP_Address ip;
+ ip.host= *((unsigned long*)&ipv4->sin_addr);
+
+
+ //inet_ntop(AF_INET, &ipv4->sin_addr, addr_chr, INET_ADDRSTRLEN);
+
+ r_addresses->push_back(ip);
+
+ address = address->Next;
+ };
+ adapter = adapter->Next;
+ };
+
+ memfree(addrs);
+};
+
+#endif
+
+#else
+
+void IP_Unix::get_local_addresses(List<IP_Address> *r_addresses) const {
+
+ struct ifaddrs * ifAddrStruct=NULL;
+ struct ifaddrs * ifa=NULL;
+
+ getifaddrs(&ifAddrStruct);
+
+ for (ifa = ifAddrStruct; ifa != NULL; ifa = ifa->ifa_next) {
+ if (!ifa->ifa_addr)
+ continue;
+ if (ifa ->ifa_addr->sa_family==AF_INET) { // check it is IP4
+ // is a valid IP4 Address
+
+ IP_Address ip;
+ ip.host= *((unsigned long*)&((struct sockaddr_in *)ifa->ifa_addr)->sin_addr);
+
+ r_addresses->push_back(ip);
+ }/* else if (ifa->ifa_addr->sa_family==AF_INET6) { // check it is IP6
+ // is a valid IP6 Address
+ tmpAddrPtr=&((struct sockaddr_in6 *)ifa->ifa_addr)->sin6_addr;
+ char addressBuffer[INET6_ADDRSTRLEN];
+ inet_ntop(AF_INET6, tmpAddrPtr, addressBuffer, INET6_ADDRSTRLEN);
+ printf("%s IP Address %s\n", ifa->ifa_name, addressBuffer);
+ } */
+ }
+
+ if (ifAddrStruct!=NULL) freeifaddrs(ifAddrStruct);
+
+}
+#endif
+
void IP_Unix::make_default() {
_create=_create_unix;
diff --git a/drivers/unix/ip_unix.h b/drivers/unix/ip_unix.h
index ec2d42c83..2fd5cf964 100644
--- a/drivers/unix/ip_unix.h
+++ b/drivers/unix/ip_unix.h
@@ -41,6 +41,8 @@ class IP_Unix : public IP {
static IP* _create_unix();
public:
+ virtual void get_local_addresses(List<IP_Address> *r_addresses) const;
+
static void make_default();
IP_Unix();
};
diff --git a/drivers/unix/tcp_server_posix.cpp b/drivers/unix/tcp_server_posix.cpp
index f91ad36ef..dfcf479fc 100644
--- a/drivers/unix/tcp_server_posix.cpp
+++ b/drivers/unix/tcp_server_posix.cpp
@@ -93,6 +93,9 @@ Error TCPServerPosix::listen(uint16_t p_port,const List<String> *p_accepted_host
close(sockfd);
ERR_FAIL_V(FAILED);
};
+ }
+ else {
+ return ERR_ALREADY_IN_USE;
};
if (listen_sockfd != -1) {