static uint32 SimpleRandomNumber(const char *machineID, // IN: const char *executionID) // IN: { static Atomic_Ptr atomic; /* Implicitly initialized to NULL. --mbellon */ char *context; context = Atomic_ReadPtr(&atomic); if (context == NULL) { void *p; uint32 value = 0; /* * Use the machineID and executionID to hopefully start each machine * and process/thread at a different place in the answer stream. */ while (*machineID) { value += *machineID++; } while (*executionID) { value += *executionID++; } p = Random_QuickSeed(value); if (Atomic_ReadIfEqualWritePtr(&atomic, NULL, p)) { free(p); } context = Atomic_ReadPtr(&atomic); ASSERT(context); } return (Random_Quick(context) >> 8) & 0xFFFF; }
char * DnD_CreateStagingDirectory(void) { const char *root; char **stagingDirList; int numStagingDirs; int i; char *ret = NULL; Bool found = FALSE; /* * Make sure the root staging directory is created with the correct * permissions. */ root = DnDCreateRootStagingDirectory(); if (!root) { return NULL; } /* Look for an existing, empty staging directory */ numStagingDirs = File_ListDirectory(root, &stagingDirList); if (numStagingDirs < 0) { goto exit; } for (i = 0; i < numStagingDirs; i++) { if (!found) { char *stagingDir; stagingDir = Unicode_Append(root, stagingDirList[i]); if (File_IsEmptyDirectory(stagingDir) && DnDStagingDirectoryUsable(stagingDir)) { ret = Unicode_Append(stagingDir, DIRSEPS); /* * We can use this directory. Make sure to continue to loop * so we don't leak the remaining stagindDirList[i]s. */ found = TRUE; } free(stagingDir); } } Util_FreeStringList(stagingDirList, numStagingDirs); /* Only create a directory if we didn't find one above. */ if (!found) { rqContext *context; context = Random_QuickSeed((unsigned)time(NULL)); for (i = 0; i < 10; i++) { char *temp; /* Each staging directory is given a random name. */ free(ret); temp = Unicode_Format("%08x%c", Random_Quick(context), DIRSEPC); VERIFY(temp); ret = Unicode_Append(root, temp); free(temp); if (File_CreateDirectory(ret) && DnDSetPermissionsOnStagingDir(ret)) { found = TRUE; break; } } free(context); } exit: if (!found && ret != NULL) { free(ret); ret = NULL; } return ret; }