X-Git-Url: http://git.asbjorn.biz/?a=blobdiff_plain;f=lib%2Fos.c;h=3370d513782af1193804e6e74f7c6c5df0d9d5f2;hb=21f2e59a76b5493cfb9284945777d7c4ffe310a5;hp=eba887b646889459937bee2f5c3b8e15976c4ecf;hpb=c158a5eb99cc6d8b0511bd51760456ba71314009;p=swftools.git diff --git a/lib/os.c b/lib/os.c index eba887b..3370d51 100755 --- a/lib/os.c +++ b/lib/os.c @@ -45,18 +45,25 @@ char* getRegistryEntry(char*path) long size = 0; DWORD type; char*buf; - rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0, KEY_ALL_ACCESS/* KEY_READ*/, &key); + rc = RegOpenKeyEx(HKEY_CURRENT_USER, path, 0, KEY_ALL_ACCESS, &key); + if(rc != ERROR_SUCCESS) + rc = RegOpenKeyEx(HKEY_CURRENT_USER, path, 0, KEY_READ, &key); + if(rc != ERROR_SUCCESS) + rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0, KEY_ALL_ACCESS, &key); + if(rc != ERROR_SUCCESS) + rc = RegOpenKeyEx(HKEY_LOCAL_MACHINE, path, 0, KEY_READ, &key); + if (rc != ERROR_SUCCESS) { fprintf(stderr, "RegOpenKeyEx failed\n"); return 0; } - rc = RegQueryValueEx(key, NULL, 0, 0, 0, &size) ; + rc = RegQueryValueEx(key, NULL, 0, 0, 0, (LPDWORD)&size) ; if(rc != ERROR_SUCCESS) { fprintf(stderr, "RegQueryValueEx(1) failed: %d\n", rc); return 0; } - buf = malloc(size+1); - rc = RegQueryValueEx(key, NULL, 0, &type, (BYTE*)buf, &size); + buf = (char*)malloc(size+1); + rc = RegQueryValueEx(key, NULL, 0, &type, (BYTE*)buf, (LPDWORD)&size); if(rc != ERROR_SUCCESS) { fprintf(stderr, "RegQueryValueEx(2) failed: %d\n", rc); return 0; @@ -74,15 +81,20 @@ char* getRegistryEntry(char*path) int setRegistryEntry(char*key,char*value) { - HKEY hkey; - int ret = 0; - ret = RegCreateKey(HKEY_LOCAL_MACHINE, key, &hkey); - if(ret != ERROR_SUCCESS) { + HKEY hkey1; + HKEY hkey2; + int ret1 = 0, ret2=0; + ret1 = RegCreateKey(HKEY_CURRENT_USER, key, &hkey1); + ret2 = RegCreateKey(HKEY_LOCAL_MACHINE, key, &hkey2); + if(ret1 != ERROR_SUCCESS && ret2 != ERROR_SUCESS) { fprintf(stderr, "registry: CreateKey %s failed\n", key); return 0; } - ret = RegSetValue(hkey, NULL, REG_SZ, value, strlen(value)+1); - if(ret != ERROR_SUCCESS) { + if(ret1==ERROR_SUCCESS) + ret1 = RegSetValue(hkey1, NULL, REG_SZ, value, strlen(value)+1); + if(ret2==ERROR_SUCCESS) + ret2 = RegSetValue(hkey2, NULL, REG_SZ, value, strlen(value)+1); + if(ret1 != ERROR_SUCCESS && ret2 != ERROR_SUCCESS) { fprintf(stderr, "registry: SetValue %s failed\n", key); return 0; } @@ -101,7 +113,7 @@ char* getInstallationPath() if(path) return path; else - return "C:\\swftools"; + return 0; #elif defined(CYGWIN) return SWFTOOLS_DATADIR; #else @@ -109,7 +121,7 @@ char* getInstallationPath() #endif } -char* concatPaths(char*base, char*add) +char* concatPaths(const char*base, const char*add) { int l1 = strlen(base); int l2 = strlen(add); @@ -120,18 +132,18 @@ char* concatPaths(char*base, char*add) while(pos < l2 && add[pos] == seperator) pos++; - n = malloc(l1 + (l2-pos) + 2); + n = (char*)malloc(l1 + (l2-pos) + 2); memcpy(n,base,l1); n[l1]=seperator; strcpy(&n[l1+1],&add[pos]); return n; } -char* stripFilename(char*filename, char*newext) +char* stripFilename(const char*filename, const char*newext) { char*last1 = strrchr(filename, '/'); char*last2 = strrchr(filename, '\\'); - char*pos = filename; + const char*pos = filename; char*name; char*dot; if(last1>pos) pos = last1 + 1; @@ -147,3 +159,48 @@ char* stripFilename(char*filename, char*newext) return name; } +static char* getTempDir() +{ +#ifdef WIN32 + char*dir = getenv("TMP"); + if(!dir) dir = getenv("TEMP"); + if(!dir) dir = getenv("tmp"); + if(!dir) dir = getenv("temp"); + if(!dir) dir = "C:\\"; +#else + char* dir = "/tmp/"; +#endif + return dir; +} + +char* mktempname(char*ptr) { + static char tmpbuf[128]; + char*dir = getTempDir(); + int l = strlen(dir); + char*sep = ""; + if(!ptr) + ptr = tmpbuf; + if(l && dir[l-1]!='/' && dir[l-1]!='\\') { +#ifdef WIN32 + sep = "\\"; +#else + sep = "/"; +#endif + } + + // used to be mktemp. This does remove the warnings, but + // It's not exactly an improvement. +#ifdef HAVE_LRAND48 + sprintf(ptr, "%s%s%08x%08x",dir,sep,lrand48(),lrand48()); +#else +# ifdef HAVE_RAND + sprintf(ptr, "%s%s%08x%08x",dir,sep,rand(),rand()); +# else + static int count = 1; + sprintf(ptr, "%s%s%08x%04x%04x",dir,sep,time(0),(unsigned int)tmpbuf^((unsigned int)tmpbuf)>>16,count); + count ++; +# endif +#endif + return ptr; +} +