2 * ===============================================================
3 * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
4 * ===============================================================
6 * This file is not open source and may not be copied without explicit
7 * written permission of AlliedModders LLC. This file may not be redistributed
8 * in whole or significant part.
9 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
17 #include <sm_platform.h>
18 #include "LibrarySys.h"
20 LibrarySystem g_LibSys;
26 #if defined PLATFORM_WINDOWS
28 #elif defined PLATFORM_POSIX
35 CLibrary::CLibrary(LibraryHandle me)
40 void CLibrary::CloseLibrary()
45 void *CLibrary::GetSymbolAddress(const char *symname)
47 #if defined PLATFORM_WINDOWS
48 return GetProcAddress(m_lib, symname);
49 #elif defined PLATFORM_POSIX
50 return dlsym(m_lib, symname);
60 CDirectory::CDirectory(const char *path)
62 #if defined PLATFORM_WINDOWS
63 char newpath[PLATFORM_MAX_PATH];
64 snprintf(newpath, sizeof(newpath), "%s\\*.*", path);
65 m_dir = FindFirstFileA(newpath, &m_fd);
68 m_fd.cFileName[0] = '\0';
70 #elif defined PLATFORM_POSIX
71 m_dir = opendir(path);
74 /* :TODO: we need to read past "." and ".."! */
76 snprintf(m_origpath, PLATFORM_MAX_PATH, "%s", path);
83 CDirectory::~CDirectory()
87 #if defined PLATFORM_WINDOWS
89 #elif defined PLATFORM_POSIX
95 void CDirectory::NextEntry()
97 #if defined PLATFORM_WINDOWS
98 if (FindNextFile(m_dir, &m_fd) == 0)
101 m_dir = INVALID_HANDLE_VALUE;
103 #elif defined PLATFORM_POSIX
104 if ((ep=readdir(m_dir)) == NULL)
112 bool CDirectory::IsEntryValid()
117 bool CDirectory::IsEntryDirectory()
119 #if defined PLATFORM_WINDOWS
120 return ((m_fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY);
121 #elif defined PLATFORM_LINUX
122 char temppath[PLATFORM_MAX_PATH];
123 snprintf(temppath, sizeof(temppath), "%s/%s", m_origpath, GetEntryName());
124 return g_LibSys.IsPathDirectory(temppath);
128 bool CDirectory::IsEntryFile()
130 #if defined PLATFORM_WINDOWS
131 return !(m_fd.dwFileAttributes & (FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_DEVICE));
132 #elif defined PLATFORM_POSIX
133 char temppath[PLATFORM_MAX_PATH];
134 snprintf(temppath, sizeof(temppath), "%s/%s", m_origpath, GetEntryName());
135 return g_LibSys.IsPathFile(temppath);
139 const char *CDirectory::GetEntryName()
141 #if defined PLATFORM_WINDOWS
142 return m_fd.cFileName;
143 #elif defined PLATFORM_LINUX
144 return ep ? ep->d_name : "";
148 bool CDirectory::MoreFiles()
153 bool CDirectory::IsValid()
155 #if defined PLATFORM_WINDOWS
156 return (m_dir != INVALID_HANDLE_VALUE);
157 #elif defined PLATFORM_LINUX
158 return (m_dir != NULL);
163 /*************************
164 ** Library System Code **
165 *************************/
168 bool LibrarySystem::PathExists(const char *path)
170 #if defined PLATFORM_WINDOWS
171 DWORD attr = GetFileAttributesA(path);
173 return (attr != INVALID_FILE_ATTRIBUTES);
174 #elif defined PLATFORM_POSIX
177 return (stat(path, &s) == 0);
181 bool LibrarySystem::IsPathFile(const char *path)
183 #if defined PLATFORM_WINDOWS
184 DWORD attr = GetFileAttributes(path);
186 if (attr == INVALID_FILE_ATTRIBUTES)
191 if (attr & (FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_DEVICE))
197 #elif defined PLATFORM_LINUX
200 if (stat(path, &s) != 0)
205 return S_ISREG(s.st_mode) ? true : false;
209 bool LibrarySystem::IsPathDirectory(const char *path)
211 #if defined PLATFORM_WINDOWS
212 DWORD attr = GetFileAttributes(path);
214 if (attr == INVALID_FILE_ATTRIBUTES)
219 if (attr & FILE_ATTRIBUTE_DIRECTORY)
224 #elif defined PLATFORM_LINUX
227 if (stat(path, &s) != 0)
232 if (S_ISDIR(s.st_mode))
241 IDirectory *LibrarySystem::OpenDirectory(const char *path)
243 CDirectory *dir = new CDirectory(path);
254 void LibrarySystem::GetPlatformError(char *error, size_t err_max)
256 if (error && err_max)
258 #if defined PLATFORM_WINDOWS
259 DWORD dw = GetLastError();
261 FORMAT_MESSAGE_FROM_SYSTEM,
264 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
268 #elif defined PLATFORM_POSIX
269 snprintf(error, err_max, "%s", strerror(errno));
274 void LibrarySystem::CloseDirectory(IDirectory *dir)
279 ILibrary *LibrarySystem::OpenLibrary(const char *path, char *error, size_t err_max)
282 #if defined PLATFORM_WINDOWS
283 lib = LoadLibraryA(path);
286 GetPlatformError(error, err_max);
289 #elif defined PLATFORM_POSIX
290 lib = dlopen(path, RTLD_NOW);
293 GetPlatformError(error, err_max);
298 return new CLibrary(lib);
301 size_t LibrarySystem::PathFormat(char *buffer, size_t len, const char *fmt, ...)
305 size_t mylen = vsnprintf(buffer, len, fmt, ap);
308 mylen = (mylen >= len) ? (len - 1) : mylen;
310 for (size_t i=0; i<mylen; i++)
312 if (buffer[i] == PLATFORM_SEP_ALTCHAR)
314 buffer[i] = PLATFORM_SEP_CHAR;