Added a bunch of new file natives.
Fixed possible corruption in snprintf when input buffer was bigger than output buffer and relaying on its retval.
Fixed all cases when the above situation happened.
Fixed _PrintToHL2Log not taking va_list in.
2 #include "LibrarySys.h"
4 LibrarySystem g_LibSys;
10 #if defined PLATFORM_WINDOWS
12 #else if defined PLATFORM_POSIX
19 CLibrary::CLibrary(LibraryHandle me)
24 void CLibrary::CloseLibrary()
29 void *CLibrary::GetSymbolAddress(const char *symname)
31 #if defined PLATFORM_WINDOWS
32 return GetProcAddress(m_lib, symname);
33 #else if defined PLATFORM_POSIX
34 return dlsym(m_lib, symname);
44 CDirectory::CDirectory(const char *path)
46 #if defined PLATFORM_WINDOWS
47 char newpath[PLATFORM_MAX_PATH];
48 snprintf(newpath, sizeof(newpath), "%s\\*.*", path);
49 m_dir = FindFirstFileA(newpath, &m_fd);
52 m_fd.cFileName[0] = '\0';
54 #else if defined PLATFORM_POSIX
55 m_dir = opendir(path);
58 /* :TODO: we need to read past "." and ".."! */
60 snprintf(m_origpath, PLATFORM_MAX_PATH, "%s", path);
67 CDirectory::~CDirectory()
71 #if defined PLATFORM_WINDOWS
73 #else if defined PLATFORM_POSIX
79 void CDirectory::NextEntry()
81 #if defined PLATFORM_WINDOWS
82 if (FindNextFile(m_dir, &m_fd) == 0)
85 m_dir = INVALID_HANDLE_VALUE;
87 #else if defined PLATFORM_POSIX
88 if ((ep=readdir(m_dir) == NULL)
96 bool CDirectory::IsEntryValid()
101 bool CDirectory::IsEntryDirectory()
103 #if defined PLATFORM_WINDOWS
104 return ((m_fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY);
105 #else if defined PLATFORM_LINUX
106 char temppath[PLATFORM_MAX_PATH];
107 snprintf(temppath, sizeof(temppath), "%s/%s", m_origpath, GetEntryName());
108 return g_LibrarySys.IsPathDirectory(temppath);
112 bool CDirectory::IsEntryFile()
114 #if defined PLATFORM_WINDOWS
115 return !(m_fd.dwFileAttributes & (FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_DEVICE));
116 #else if defined PLATFORM_POSIX
117 char temppath[PLATFORM_MAX_PATH];
118 snprintf(temppath, sizeof(temppath), "%s/%s", m_origpath, GetEntryName());
119 return g_LibrarySys.IsPathFile(temppath);
123 const char *CDirectory::GetEntryName()
125 #if defined PLATFORM_WINDOWS
126 return m_fd.cFileName;
127 #else if defined PLATFORM_LINUX
128 return ep ? ep->d_name : "";
132 bool CDirectory::MoreFiles()
137 bool CDirectory::IsValid()
139 #if defined PLATFORM_WINDOWS
140 return (m_dir != INVALID_HANDLE_VALUE);
141 #else if defined PLATFORM_LINUX
142 return (m_dir != NULL);
147 /*************************
148 ** Library System Code **
149 *************************/
152 bool LibrarySystem::PathExists(const char *path)
154 #if defined PLATFORM_WINDOWS
155 DWORD attr = GetFileAttributesA(path);
157 return (attr != INVALID_FILE_ATTRIBUTES);
158 #else if defined PLATFORM_POSIX
161 return (stat(path, &s) == 0);
165 bool LibrarySystem::IsPathFile(const char *path)
167 #if defined PLATFORM_WINDOWS
168 DWORD attr = GetFileAttributes(path);
170 if (attr == INVALID_FILE_ATTRIBUTES)
175 if (attr & (FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_DEVICE))
181 #else if defined PLATFORM_LINUX
184 if (stat(path, &s) != 0)
189 return S_ISREG(s.st_mode) ? true : false;
193 bool LibrarySystem::IsPathDirectory(const char *path)
195 #if defined PLATFORM_WINDOWS
196 DWORD attr = GetFileAttributes(path);
198 if (attr == INVALID_FILE_ATTRIBUTES)
203 if (attr & FILE_ATTRIBUTE_DIRECTORY)
208 #else if defined PLATFORM_LINUX
211 if (stat(path, &s) != 0)
216 if (S_ISDIR(s.st_mode))
225 IDirectory *LibrarySystem::OpenDirectory(const char *path)
227 CDirectory *dir = new CDirectory(path);
238 void LibrarySystem::GetPlatformError(char *error, size_t err_max)
240 if (error && err_max)
242 #if defined PLATFORM_WINDOWS
243 DWORD dw = GetLastError();
245 FORMAT_MESSAGE_FROM_SYSTEM,
248 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
252 #else if defined PLATFORM_POSIX
253 snprintf(error, err_max, "%s", strerror(errno));
258 void LibrarySystem::CloseDirectory(IDirectory *dir)
263 ILibrary *LibrarySystem::OpenLibrary(const char *path, char *error, size_t err_max)
266 #if defined PLATFORM_WINDOWS
267 lib = LoadLibraryA(path);
270 GetPlatformError(error, err_max);
273 #else if defined PLATFORM_POSIX
274 lib = dlopen(path, RTLD_NOW);
277 GetPlatformError(error, err_max);
282 return new CLibrary(lib);
285 void LibrarySystem::PathFormat(char *buffer, size_t len, const char *fmt, ...)
289 size_t mylen = vsnprintf(buffer, len, fmt, ap);
292 mylen = (mylen >= len) ? (len - 1) : mylen;
294 for (size_t i=0; i<mylen; i++)
296 if (buffer[i] == PLATFORM_SEP_ALTCHAR)
298 buffer[i] = PLATFORM_SEP_CHAR;