00001 #include <stdio.h>
00002 #include <direct.h>
00003 #include <errno.h>
00004 #include <time.h>
00005 #include <io.h>
00006 #include <sys/types.h>
00007 #include <sys/stat.h>
00008 #include "OSDependent/OS.h"
00009 #include "Utilities/Resolver.h"
00010
00011 const char OS::DirectorySeparator = '\\';
00012 const char *OS::TemporaryDirectory = "C:\\Temp";
00013 const char *OS::LineSeparator = "\r\n";
00014
00015
00016
00017
00018
00019
00020
00021
00022 const char *
00023 OS::getMyHostName()
00024 {
00025 static char namebuf[64];
00026 static char *name = NULL;
00027
00028 if (name == NULL) {
00029 struct hostent *ent;
00030 int length = sizeof(namebuf);
00031
00032 if (::GetComputerNameA(namebuf, (LPDWORD)&length) == 0)
00033 return NULL;
00034 ent = ::gethostbyname(namebuf);
00035
00036 if (ent == NULL)
00037 return NULL;
00038 OS::strcpy(namebuf, ent->h_name);
00039
00040 name = namebuf;
00041 }
00042 return name;
00043 }
00044
00045
00046 const char *
00047 OS::getMyHostIPAddr()
00048 {
00049 char name[128];
00050
00051 if(gethostname (name,128)!=0)
00052 return NULL;
00053
00054 struct hostent * heptr;
00055 heptr = gethostbyname (name);
00056
00057
00058 if (heptr == NULL)
00059 return NULL;
00060
00061 return OS::strdup(inet_ntoa( *((struct in_addr*)heptr->h_addr)));
00062 }
00063
00064
00065
00066
00067
00068 char *
00069 OS::strtok_r(char *s, const char *tokens, char **lasts)
00070 {
00071 if (s == NULL)
00072 s = *lasts;
00073 else
00074 *lasts = s;
00075 if (*s == '\0')
00076 return NULL;
00077 char *end = s + strlen(s);
00078 s = ::strtok(s, tokens);
00079 if (s == NULL)
00080 return NULL;
00081 int l_sub = strlen(s);
00082 *lasts = s + l_sub;
00083 if (end != s + l_sub)
00084 *lasts += 1;
00085 return s;
00086 }
00087
00088 int
00089 OS::stat(const char *name, stat_t *stat)
00090 {
00091 return ::_stat(name, stat);
00092 }
00093
00094
00095 int
00096 OS::remove(const char *name)
00097 {
00098 if (::DeleteFile(__TEXT(name)) == FALSE)
00099 return -1;
00100 return 0;
00101 }
00102
00103 int
00104 OS::chdir(const char *name)
00105 {
00106 return ::_chdir(name);
00107 }
00108
00109 bool
00110 OS::isDirectory(const char *name)
00111 {
00112 DWORD attributes = ::GetFileAttributes(__TEXT(name));
00113 if (attributes == -1)
00114 return false;
00115 return (attributes & FILE_ATTRIBUTE_DIRECTORY) == 0 ? false : true;
00116 }
00117
00118 int
00119 OS::mkdir(const char *name)
00120 {
00121
00122 if (isDirectory(name))
00123 return 0;
00124 if (::CreateDirectory(__TEXT(name), NULL) == FALSE)
00125 return -1;
00126 return 0;
00127 }
00128
00129 int
00130 OS::rmdir(const char *name)
00131 {
00132 if (::RemoveDirectory(__TEXT(name)) == FALSE)
00133 return -1;
00134 return 0;
00135 }
00136
00137 int
00138 OS::rename(const char *src, const char *dst)
00139 {
00140 if (::MoveFileEx(__TEXT(src), __TEXT(dst), MOVEFILE_REPLACE_EXISTING) == FALSE)
00141 return -1;
00142 return 0;
00143 }
00144
00145 char *
00146 OS::getProcessorName ()
00147 {
00148 static char buf[512];
00149 OSVERSIONINFO osvi;
00150 osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
00151
00152 ::GetVersionEx (&osvi);
00153
00154 switch(osvi.dwPlatformId) {
00155 case VER_PLATFORM_WIN32s:
00156 case VER_PLATFORM_WIN32_WINDOWS:
00157 OS::strcpy(buf,"windows");
00158 break;
00159 case VER_PLATFORM_WIN32_NT:
00160 OS::strcpy(buf,"windows-nt");
00161 break;
00162 default:
00163 OS::strcpy(buf,"windows-unknown");
00164 break;
00165 }
00166
00167 return(buf);
00168 }
00169
00170 const char *
00171 OS::getUserName()
00172 {
00173 static char username[64];
00174 unsigned long size = sizeof(username);
00175 ::GetUserName(username, &size);
00176 return username;
00177 }
00178
00179 char *
00180 OS::getOSName()
00181 {
00182 static char buf[512];
00183 SYSTEM_INFO si;
00184
00185 ::GetSystemInfo(&si);
00186
00187 if (OS::strcmp(getProcessorName(), "windows-nt") == 0) {
00188 if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL) {
00189 switch (si.wProcessorLevel) {
00190 case 3:
00191 OS::strcpy(buf,"i386");
00192 break;
00193 case 4:
00194 OS::strcpy(buf,"i486");
00195 break;
00196 case 5:
00197 OS::strcpy(buf, "i586");
00198 break;
00199 default:
00200 OS::strcpy(buf,"intel");
00201 break;
00202 }
00203 } else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_MIPS) {
00204 OS::strcpy(buf,"mips");
00205 } else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_ALPHA) {
00206 OS::sprintf(buf, "Alpha%d", si.wProcessorLevel);
00207 } else if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_PPC) {
00208 OS::sprintf(buf, "PPC 6%02d", si.wProcessorLevel);
00209 }
00210 } else {
00211 if (si.dwProcessorType == PROCESSOR_INTEL_386) {
00212 OS::strcpy(buf,"i386");
00213 } else if (si.dwProcessorType == PROCESSOR_INTEL_486) {
00214 OS::strcpy(buf,"i486");
00215 } else if (si.dwProcessorType == PROCESSOR_INTEL_PENTIUM) {
00216 OS::strcpy(buf,"i586");
00217 } else OS::strcpy(buf,"intel");
00218 }
00219
00220 return (buf);
00221 }
00222
00223
00224
00225
00226 int
00227 OS::getErrno()
00228 {
00229 int val = 0;
00230 switch (GetLastError()) {
00231 case ERROR_INVALID_HANDLE:
00232 val = EISDIR;
00233 break;
00234 case ERROR_ACCESS_DENIED:
00235 val = EROFS;
00236 break;
00237 case ERROR_NOT_ENOUGH_MEMORY:
00238 val = ENOSPC;
00239 break;
00240 case ERROR_TOO_MANY_OPEN_FILES:
00241 val = EMFILE;
00242 break;
00243 case ERROR_BUFFER_OVERFLOW:
00244 val = ENAMETOOLONG;
00245 break;
00246 case ERROR_OUTOFMEMORY:
00247 val = ENOMEM;
00248 break;
00249 case ERROR_FILE_NOT_FOUND:
00250 val = ENOENT;
00251 break;
00252 case ERROR_PATH_NOT_FOUND:
00253 val = ENOTDIR;
00254 break;
00255 case ERROR_INVALID_FUNCTION:
00256 default:
00257 val = EINVAL;
00258 break;
00259 }
00260 return val;
00261 }
00262
00263
00264
00265
00266 char *
00267 OS::getenv(const char *str)
00268 {
00269 return ::getenv(str);
00270 }
00271
00272
00273
00274
00275 int
00276 OS::system(const char *fmt, ...)
00277 {
00278 BOOL res;
00279
00280 char cmd[512];
00281 va_list ap;
00282 va_start(ap, fmt);
00283
00284 if (::vsprintf(cmd, fmt, ap) < 0) {
00285 va_end(ap);
00286 return -1;
00287 }
00288
00289 STARTUPINFO si;
00290 PROCESS_INFORMATION pi;
00291
00292 ZeroMemory(&si, sizeof(si));
00293 si.cb = sizeof(si);
00294 si.dwFlags = STARTF_USESHOWWINDOW;
00295 si.wShowWindow = SW_MINIMIZE;
00296
00297
00298
00299
00300 res = CreateProcess( 0, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
00301 if (res == 0) {
00302 va_end(ap);
00303 return -1;
00304 }
00305
00306 va_end(ap);
00307 return 0;
00308 }
00309
00310
00311 char OS::setValue (char *key, char *subKey, char* value)
00312 {
00313
00314
00315
00316
00317
00318
00319
00320
00321
00322
00323
00324
00325
00326
00327 FILE *fp;
00328 char text[512];
00329 OS::sprintf(text,"c:\\%s", subKey);
00330 fp=fopen(text,"w");
00331
00332 if (fp==0)
00333 return -1;
00334
00335 fwrite( value, OS::strlen(value), 1, fp);
00336 fclose(fp);
00337
00338 return 1;
00339 }
00340
00341
00342 char *OS::getValue (char *key, char *subkey)
00343 {
00344
00345
00346
00347
00348
00349
00350
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360
00361
00362 FILE *fp;
00363 char text[512];
00364 OS::sprintf(text,"c:\\%s", subkey);
00365 fp=fopen(text,"r");
00366
00367 if (fp==0)
00368 return 0;
00369
00370 if ( fgets( text, 512, fp) == NULL )
00371 {
00372 fclose(fp);
00373 return 0;
00374 }
00375
00376 fclose(fp);
00377
00378 return OS::strdup(text);
00379 }
00380
00381
00382 char *OS::strdup(const char *str)
00383 {
00384 return ::strdup(str);
00385 }
00386
00387
00388 void *OS::malloc(size_t t)
00389 {
00390 return ::malloc(t);
00391 }
00392
00393
00394 void OS::free(void *p)
00395 {
00396 ::free(p);
00397 }
00398
00399
00400 void *OS::memcpy(void *d, const void *s, int len)
00401 {
00402 return ::memcpy(d, s, len);
00403 }
00404
00405 int OS::access(const char *path, int mode)
00406 {
00407 return ::_access(path, mode);
00408 }