MagickExport int AcquireUniqueFileResource(char *path) { #if !defined(O_NOFOLLOW) #define O_NOFOLLOW 0 #endif #if !defined(TMP_MAX) # define TMP_MAX 238328 #endif char *resource; int c, file; register char *p; register long i; static const char portable_filename[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._"; unsigned char key[8]; assert(path != (char *) NULL); (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); file=(-1); for (i=0; i < TMP_MAX; i++) { /* Get temporary pathname. */ (void) GetPathTemplate(path); #if defined(HAVE_MKSTEMP) file=mkstemp(path); if (file != -1) break; #endif GetRandomKey(key,8); p=path+strlen(path)-8; for (i=0; i < 8; i++) { c=(int) (key[i] & 0x3f); *p++=portable_filename[c]; } file=open(path,O_RDWR | O_CREAT | O_EXCL | O_BINARY | O_NOFOLLOW,S_MODE); if ((file > 0) || (errno != EEXIST)) break; } (void) LogMagickEvent(ResourceEvent,GetMagickModule(),"%s",path); if (file == -1) return(file); AcquireSemaphoreInfo(&resource_semaphore); if (temporary_resources == (SplayTreeInfo *) NULL) temporary_resources=NewSplayTree(CompareSplayTreeString, RelinquishMagickMemory,DestroyTemporaryResources); RelinquishSemaphoreInfo(resource_semaphore); resource=ConstantString(path); (void) AddValueToSplayTree(temporary_resources,resource,resource); return(file); }
MagickExport int AcquireUniqueFileResource(char *path) { #if !defined(O_NOFOLLOW) #define O_NOFOLLOW 0 #endif #if !defined(TMP_MAX) # define TMP_MAX 238328 #endif int c, file; register char *p; register ssize_t i; static const char portable_filename[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-"; StringInfo *key; unsigned char *datum; assert(path != (char *) NULL); (void) LogMagickEvent(ResourceEvent,GetMagickModule(),"%s",path); if (random_info == (RandomInfo *) NULL) random_info=AcquireRandomInfo(); file=(-1); for (i=0; i < (ssize_t) TMP_MAX; i++) { /* Get temporary pathname. */ (void) GetPathTemplate(path); key=GetRandomKey(random_info,2); p=path+strlen(path)-8; datum=GetStringInfoDatum(key); for (i=0; i < (ssize_t) GetStringInfoLength(key); i++) { c=(int) (datum[i] & 0x3f); *p++=portable_filename[c]; } key=DestroyStringInfo(key); #if defined(MAGICKCORE_HAVE_MKSTEMP) file=mkstemp(path); #if defined(__OS2__) setmode(file,O_BINARY); #endif if (file != -1) break; #endif key=GetRandomKey(random_info,6); p=path+strlen(path)-6; datum=GetStringInfoDatum(key); for (i=0; i < (ssize_t) GetStringInfoLength(key); i++) { c=(int) (datum[i] & 0x3f); *p++=portable_filename[c]; } key=DestroyStringInfo(key); file=open_utf8(path,O_RDWR | O_CREAT | O_EXCL | O_BINARY | O_NOFOLLOW,S_MODE); if ((file >= 0) || (errno != EEXIST)) break; } (void) LogMagickEvent(ResourceEvent,GetMagickModule(),"%s",path); if (file == -1) return(file); if (resource_semaphore == (SemaphoreInfo *) NULL) AcquireSemaphoreInfo(&resource_semaphore); LockSemaphoreInfo(resource_semaphore); if (temporary_resources == (SplayTreeInfo *) NULL) temporary_resources=NewSplayTree(CompareSplayTreeString, DestroyTemporaryResources,(void *(*)(void *)) NULL); UnlockSemaphoreInfo(resource_semaphore); (void) AddValueToSplayTree(temporary_resources,ConstantString(path), (const void *) NULL); return(file); }
MagickExport int AcquireUniqueFileResource(char *path) { #if !defined(O_NOFOLLOW) #define O_NOFOLLOW 0 #endif #if !defined(TMP_MAX) # define TMP_MAX 238328 #endif char *resource; int c, file; register char *p; register long i; unsigned char key[8]; assert(path != (char *) NULL); (void) LogMagickEvent(TraceEvent,GetMagickModule(),"..."); file=(-1); for (i=0; i < TMP_MAX; i++) { /* Get temporary pathname. */ (void) GetPathTemplate(path); #if defined(HAVE_MKSTEMP) file=mkstemp(path); if (file != -1) break; #endif GetRandomKey(key,8); p=path+strlen(path)-8; for (i=0; i < 8; i++) { c=(int) (key[i] & 0x1f); *p++=(char) (c > 9 ? c+(int) 'a'-10 : c+(int) '0'); } file=open(path,O_RDWR | O_CREAT | O_EXCL | O_BINARY | O_NOFOLLOW,S_MODE); if ((file > 0) || (errno != EEXIST)) break; } (void) LogMagickEvent(ResourceEvent,GetMagickModule(),"%s",path); if (file == -1) return(file); (void) AcquireMagickResource(FileResource,1); if (temporary_resources == (SplayTreeInfo *) NULL) temporary_resources=NewSplayTree(CompareSplayTreeString, RelinquishMagickMemory,DestroyTemporaryResources); resource=ConstantString(AcquireString(path)); (void) AddValueToSplayTree(temporary_resources,resource,resource); return(file); }