////////////////////////////////////////////////////////////////////// // // Pixie // // Copyright © 1999 - 2003, Okan Arikan // // Contact: okan@cs.berkeley.edu // // This library is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public // License as published by the Free Software Foundation; either // version 2 of the License, or (at your option) any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU // General Public License for more details. // // You should have received a copy of the GNU General Public // License along with this library; if not, write to the Free Software // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA // /////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////// // // File : os.cpp // Classes : - // Description : OS dependent functions // //////////////////////////////////////////////////////////////////////// #include "os.h" #include #include #include #include #include #include // Needed for OSX 10.2.x fix #ifdef __APPLE__ #include #include #endif // Environment seperators #ifdef WIN32 // >> Win32 #include #include #include #include #define OS_DIR_SEPERATOR '\\' #define OS_DIR_SEPERATOR_STRING "\\" // << Win32 #else // >> Unix #include #include #include #define OS_DIR_SEPERATOR '/' #define OS_DIR_SEPERATOR_STRING "/" // << Unix #endif /////////////////////////////////////////////////////////////////////// // Funvtion : osLoadModule // Description : Load / attach a dll/so file // Return Value : The module handle // Comments : // Date last edited : 11/28/2001 void *osLoadModule(const char *name) { void *cModule = NULL; #ifdef WIN32 // Win32 stuff here cModule = LoadLibrary(name); #else // Unix stuff here cModule = dlopen(name,RTLD_NOW); // Unix dlopen expects an absolute path or the shared object to be in LD_LIBRARY_PATH // Convert the name to an absolute file name if (cModule == NULL) { char absoluteName[MAXPATHLEN]; char *absolute = realpath(name,absoluteName); if (absolute != NULL) { cModule = dlopen(absolute,RTLD_NOW); } } #endif return cModule; } /////////////////////////////////////////////////////////////////////// // Funvtion : osModuleError // Description : Get the latest error // Return Value : The error string // Comments : // Date last edited : 11/28/2001 const char *osModuleError() { #ifdef WIN32 return NULL; #else return dlerror(); #endif } /////////////////////////////////////////////////////////////////////// // Function : osUnloadModule // Description : Unload / detach a dll/so file // Return Value : The module handle // Comments : // Date last edited : 11/28/2001 void osUnloadModule(void *cModule) { #ifdef WIN32 if (cModule != NULL) FreeLibrary((HMODULE) cModule); #else if (cModule != NULL) dlclose((void *) cModule); #endif } /////////////////////////////////////////////////////////////////////// // Function : osResolve // Description : Resolve a symbol in a dll/so file // Return Value : The module handle // Comments : // Date last edited : 11/28/2001 void *osResolve(void *cModule,const char *name) { void *result = NULL; if (cModule != NULL) { #ifdef WIN32 result = GetProcAddress((HMODULE) cModule,name); #else result = dlsym((void *) cModule,name); // OSX 10.2.x fix #ifdef __APPLE__ if(result == NULL){ char new_name[strlen(name)+2]; sprintf(new_name,"_%s",name); result = dlsym((void *) cModule,new_name); } #endif #endif } return result; } /////////////////////////////////////////////////////////////////////// // Function : osEnvironment // Description : Get an environment variable // Return Value : The variable value if found // Comments : // Date last edited : 11/28/2001 char *osEnvironment(const char *name) { return getenv(name); } /////////////////////////////////////////////////////////////////////// // Function : osFileExists // Description : Check if a file exists // Return Value : TRUE if it does // Comments : // Date last edited : 11/28/2001 int osFileExists(const char *name) { #ifdef WIN32 if (_access(name,0) == 0) return TRUE; #else if (access(name,0) == 0) return TRUE; #endif return FALSE; } /////////////////////////////////////////////////////////////////////// // Function : osFixSlashes // Description : Make sure the slashes are right // Return Value : - // Comments : // Date last edited : 11/28/2001 void osFixSlashes(char *st) { for (;*st!='\0';st++) { if ((*st == '\\') || (*st == '/')) *st = OS_DIR_SEPERATOR; } } /////////////////////////////////////////////////////////////////////// // Function : osTempname // Description : Create a temporary file // Return Value : - // Comments : // Date last edited : 11/28/2001 void osTempname(const char *directory,const char *prefix,char *result) { #ifdef WIN32 // avoid some windows shortcomings by extending count when we // start to get clashes static int i = 0; sprintf(result,"%s\\%s-%4xXXXXXXXX",directory,prefix,i); osFixSlashes(result); while(_mktemp(result) == NULL) { sprintf(result,"%s\\%s-%4xXXXXXXXX",directory,prefix,i++); osFixSlashes(result); } #else sprintf(result,"%s\\%s-XXXXXXXX",directory,prefix); osFixSlashes(result); mktemp(result); #endif } /////////////////////////////////////////////////////////////////////// // Function : osCreateDir // Description : Create a directory // Return Value : - // Comments : // Date last edited : 11/28/2001 void osCreateDir(const char *n) { #ifdef WIN32 _mkdir(n); #else mkdir(n,S_IRWXU); #endif } /////////////////////////////////////////////////////////////////////// // Function : osDeleteDir // Description : Remove a directory // Return Value : - // Comments : // Date last edited : 11/28/2001 void osDeleteDir(const char *n) { #ifdef WIN32 _rmdir(n); #else rmdir(n); #endif } /////////////////////////////////////////////////////////////////////// // Function : osDeleteFile // Description : Delete a file // Return Value : - // Comments : // Date last edited : 11/28/2001 void osDeleteFile(const char *n) { #ifdef WIN32 _unlink(n); #else unlink(n); #endif } /////////////////////////////////////////////////////////////////////// // Function : enumerate // Description : Enumerate the files matching a criteria // Return Value : // Comments : // Date last edited : 11/28/2001 void osEnumerate(const char *name,int (*callback)(const char *,void *),void *userData) { #ifdef WIN32 _finddata_t c_file; long hFile; char tmp[OS_MAX_PATH_LENGTH]; char *tmpp; strcpy(tmp,name); osFixSlashes(tmp); tmpp = strrchr(tmp,OS_DIR_SEPERATOR); if (tmpp == NULL) { tmpp = tmp; } else { tmpp++; } if( (hFile = _findfirst(name, &c_file )) == -1L ) { } else { strcpy(tmpp,c_file.name); if (callback(tmp,userData) == TRUE) { while( _findnext( hFile, &c_file ) == 0 ) { strcpy(tmpp,c_file.name); if (callback(tmp,userData) == FALSE) break; } } _findclose( hFile ); } #else glob_t globbuf; int i; globbuf.gl_offs = 0; glob(name,GLOB_DOOFFS,NULL,&globbuf); for (i=0;i