Example #1
0
static void
FileTempNum(Bool createTempFile,  // IN:
            uint32 *var)          // IN/OUT:
{
   ASSERT(var);

   *var += (FileSimpleRandom() >> 8) & 0xFF;
   *var = (*var & ~0x1) | (createTempFile ? 1 : 0);
}
static char *
FileCreateSafeTmpDir(uid_t userId,            // IN:
                     const char *userName,    // IN:
                     const char *baseTmpDir)  // IN:
{
   static const int MAX_DIR_ITERS = 250;
   int curDirIter = 0;
   char *tmpDir = NULL;

   while (TRUE) {
      /*
       * We use a random number that makes it more likely that we will create
       * an unused name than if we had simply tried suffixes in numeric order.
       */

      tmpDir = Str_Asprintf(NULL, "%s%s%s-%s-%u", baseTmpDir, DIRSEPS,
                            PRODUCT_GENERIC_NAME_LOWER, userName,
                            FileSimpleRandom());

      if (!tmpDir) {
         Warning("%s: Out of memory error.\n", __FUNCTION__);
         break;
      }

      if (FileAcceptableSafeTmpDir(tmpDir, userId)) {
         break;
      }

      if (++curDirIter > MAX_DIR_ITERS) {
         Warning("%s: Failed to create a safe temporary directory, path "
                 "\"%s\". The maximum number of attempts was exceeded.\n",
                 __FUNCTION__, tmpDir);
         free(tmpDir);
         tmpDir = NULL;
         break;
      }

      free(tmpDir);
      tmpDir = NULL;
   }

   return tmpDir;
}