Main Page   Class Hierarchy   Alphabetical List   Compound List   File List   Compound Members   File Members  

OS.cpp

Go to the documentation of this file.
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  * Get the hostname of this machine.
00016  * The returned value is statically allocated, so the user does 
00017  * not need to deallocate.  This value will not change, so we
00018  * are safe to use static memory.
00019  *
00020  * Returns name on success, NULL on failure.
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  * Reentrant version of strtok.
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   // Check if directory already exists.  If not try to create it.
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  * Convert the last error to errno.
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  * Get an environment variable.
00265  */
00266 char *
00267 OS::getenv(const char *str)
00268 {
00269         return ::getenv(str);
00270 }
00271 
00272 /*
00273  * Start a new process.
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   // Use the following to create a new console.
00298   // si.wShowWindow = SW_MINIMIZE;
00299   //res = CreateProcess( 0, cmd, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi);
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 /*    LONG lResult;
00314     HKEY   hkey; 
00315     DWORD dwSize;
00316 
00317     lResult = RegCreateKeyEx( HKEY_LOCAL_MACHINE, key, 0, 0, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hkey, &dwSize );
00318 
00319     if ( ERROR_SUCCESS != lResult )
00320     {
00321         return -1;
00322     }
00323 
00324     RegSetValueEx( hkey, subKey, 0, REG_SZ, (const unsigned char*)value, strlen(value)+1);
00325     RegCloseKey( hkey );*/
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 /*    LONG lResult;
00345     HKEY   hkey; 
00346     char value[256];
00347     DWORD dwSize = 256;
00348     
00349     lResult = RegOpenKeyEx( HKEY_LOCAL_MACHINE, key, 0, KEY_ALL_ACCESS, &hkey);
00350 
00351     if ( ERROR_SUCCESS != lResult )
00352     {
00353         return 0;
00354     }
00355 
00356     if ( RegQueryValueEx( hkey, subkey, 0, NULL, (LPBYTE)value, &dwSize) != ERROR_SUCCESS )
00357         return 0;
00358 
00359     RegCloseKey( hkey );
00360 
00361     return OS::strdup(value);*/
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 }

Generated on Mon Oct 7 09:33:30 2002 for Gaia by doxygen1.2.13.1 written by Dimitri van Heesch, © 1997-2001