my_tempnam.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:5k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. /*
  14.   This function is only used by some old ISAM code.
  15.   When we remove ISAM support from MySQL, we should also delete this file
  16.   One should instead use the functions in mf_tempfile.c
  17. */
  18. #include "mysys_priv.h"
  19. #include <m_string.h>
  20. /* HPUX 11.0 doesn't allow us to change the environ pointer */
  21. #ifdef HPUX11
  22. #undef HAVE_TEMPNAM
  23. #endif
  24. #include "my_static.h"
  25. #include "mysys_err.h"
  26. #define TMP_EXT ".tmp" /* Extension of tempfile  */
  27. #if ! defined(P_tmpdir)
  28. #define P_tmpdir ""
  29. #endif
  30. #ifdef HAVE_TEMPNAM
  31. #if !defined( MSDOS) && !defined(OS2) && !defined(__NETWARE__)
  32. extern char **environ;
  33. #endif
  34. #endif
  35. /* Make a uniq temp file name by using dir and adding something after
  36.    pfx to make name uniq. Name is made by adding a uniq 8 length-string and
  37.    TMP_EXT after pfx.
  38.    Returns pointer to malloced area for filename. Should be freed by
  39.    free().
  40.    The name should be uniq, but it isn't checked if it file allready exists.
  41.    Uses tempnam() if function exist on system.
  42.    This function fixes that if dir is given it's used. For example
  43.    MSDOS tempnam() uses always TMP environment-variable if it exists.
  44. */
  45. /* ARGSUSED */
  46. my_string my_tempnam(const char *dir, const char *pfx,
  47.      myf MyFlags  __attribute__((unused)))
  48. {
  49. #ifdef _MSC_VER
  50.   char temp[FN_REFLEN],*end,*res,**old_env,*temp_env[1];
  51.   old_env=environ;
  52.   if (dir)
  53.   {
  54.     end=strend(dir)-1;
  55.     if (!dir[0])
  56.     { /* Change empty string to current dir */
  57.       temp[0]= FN_CURLIB;
  58.       temp[1]= 0;
  59.       dir=temp;
  60.     }
  61.     else if (*end == FN_DEVCHAR)
  62.     { /* Get current dir for drive */
  63.       _fullpath(temp,dir,FN_REFLEN);
  64.       dir=temp;
  65.     }
  66.     else if (*end == FN_LIBCHAR && dir < end && end[-1] != FN_DEVCHAR)
  67.     {
  68.       strmake(temp,dir,(uint) (end-dir)); /* Copy and remove last '' */
  69.       dir=temp;
  70.     }
  71.     environ=temp_env; /* Force use of dir (dir not checked) */
  72.     temp_env[0]=0;
  73.   }
  74.   res=tempnam((char*) dir,(my_string) pfx);
  75.   environ=old_env;
  76.   return res;
  77. #else
  78. #ifdef __ZTC__
  79.   if (!dir)
  80.   { /* If empty test first if TMP can be used */
  81.     dir=getenv("TMP");
  82.   }
  83.   return tempnam((char*) dir,(my_string) pfx); /* Use stand. dir with prefix */
  84. #else
  85. #ifdef HAVE_TEMPNAM
  86.   char temp[2],*res,**old_env,*temp_env[1];
  87.   if (dir && !dir[0])
  88.   { /* Change empty string to current dir */
  89.     temp[0]= FN_CURLIB;
  90.     temp[1]= 0;
  91.     dir=temp;
  92.   }
  93. #ifdef OS2
  94.   /* changing environ variable doesn't work with VACPP */
  95.   char  buffer[256], *end;
  96.   buffer[sizeof[buffer)-1]= 0;
  97.   end= strxnmov(buffer, sizeof(buffer)-1, (char*) "TMP=", dir, NullS);
  98.   /* remove ending backslash */
  99.   if (end[-1] == '\')
  100.     end[-1]= 0;
  101.   putenv(buffer);
  102. #elif !defined(__NETWARE__)
  103.   old_env=(char**)environ;
  104.   if (dir)
  105.   { /* Don't use TMPDIR if dir is given */
  106.     /*
  107.       The following strange cast is required because the IBM compiler on AIX
  108.       doesn't allow us to cast the value of environ.
  109.       The cast of environ is needed as some systems doesn't allow us to
  110.       update environ with a char ** pointer. (const mismatch)
  111.     */
  112.     (*(char***) &environ)=(char**) temp_env;
  113.     temp_env[0]=0;
  114.   }
  115. #endif
  116.   res=tempnam((char*) dir,(my_string) pfx); /* Use stand. dir with prefix */
  117. #if !defined(OS2) && !defined(__NETWARE__)
  118.   (*(char***) &environ)=(char**) old_env;
  119. #endif
  120.   if (!res)
  121.     DBUG_PRINT("error",("Got error: %d from tempnam",errno));
  122.   return res;
  123. #else
  124.   register long uniq;
  125.   register int length;
  126.   my_string pos,end_pos;
  127.   DBUG_ENTER("my_tempnam");
  128. /* Make a uniq nummber */
  129.   pthread_mutex_lock(&THR_LOCK_open);
  130.   uniq= ((long) getpid() << 20) + (long) _my_tempnam_used++ ;
  131.   pthread_mutex_unlock(&THR_LOCK_open);
  132.   if (!dir && !(dir=getenv("TMPDIR"))) /* Use this if possibly */
  133.     dir=P_tmpdir; /* Use system default */
  134.   length=strlen(dir)+strlen(pfx)+1;
  135.   DBUG_PRINT("test",("mallocing %d byte",length+8+sizeof(TMP_EXT)+1));
  136.   if (!(pos=(char*) malloc(length+8+sizeof(TMP_EXT)+1)))
  137.   {
  138.     if (MyFlags & MY_FAE+MY_WME)
  139.       my_error(EE_OUTOFMEMORY, MYF(ME_BELL+ME_WAITTANG),
  140.        length+8+sizeof(TMP_EXT)+1);
  141.     DBUG_RETURN(NullS);
  142.   }
  143.   end_pos=strmov(pos,dir);
  144.   if (end_pos != pos && end_pos[-1] != FN_LIBCHAR)
  145.     *end_pos++=FN_LIBCHAR;
  146.   end_pos=strmov(end_pos,pfx);
  147.   for (length=0 ; length < 8 && uniq ; length++)
  148.   {
  149.     *end_pos++= _dig_vec_upper[(int) (uniq & 31)];
  150.     uniq >>= 5;
  151.   }
  152.   VOID(strmov(end_pos,TMP_EXT));
  153.   DBUG_PRINT("exit",("tempnam: '%s'",pos));
  154.   DBUG_RETURN(pos);
  155. #endif /* HAVE_TEMPNAM */
  156. #endif /* __ZTC__ */
  157. #endif /* _MSC_VER */
  158. } /* my_tempnam */