mf_tempfile.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. #include "mysys_priv.h"
  14. #include <m_string.h>
  15. #include "my_static.h"
  16. #include "mysys_err.h"
  17. #include <errno.h>
  18. #ifdef HAVE_PATHS_H
  19. #include <paths.h>
  20. #endif
  21. #ifdef HAVE_TEMPNAM
  22. #if !defined(MSDOS) && !defined(OS2) && !defined(__NETWARE__)
  23. extern char **environ;
  24. #endif
  25. #endif
  26. /*
  27.   Create a temporary file in a given directory
  28.   This function should be used instead of my_tempnam() !
  29. */
  30. File create_temp_file(char *to, const char *dir, const char *prefix,
  31.       int mode __attribute__((unused)),
  32.       myf MyFlags __attribute__((unused)))
  33. {
  34.   File file= -1;
  35.   DBUG_ENTER("create_temp_file");
  36. #if defined(_MSC_VER)
  37.   {
  38.     char temp[FN_REFLEN],*end,*res,**old_env,*temp_env[1];
  39.     old_env=environ;
  40.     if (dir)
  41.     {
  42.       end=strend(dir)-1;
  43.       if (!dir[0])
  44.       { /* Change empty string to current dir */
  45. to[0]= FN_CURLIB;
  46. to[1]= 0;
  47. dir=to;
  48.       }
  49.       else if (*end == FN_DEVCHAR)
  50.       { /* Get current dir for drive */
  51. _fullpath(temp,dir,FN_REFLEN);
  52. dir=to;
  53.       }
  54.       else if (*end == FN_LIBCHAR && dir < end && end[-1] != FN_DEVCHAR)
  55.       {
  56. strmake(to,dir,(uint) (end-dir)); /* Copy and remove last '' */
  57. dir=to;
  58.       }
  59.       environ=temp_env; /* Force use of dir (dir not checked) */
  60.       temp_env[0]=0;
  61.     }
  62.     if ((res=tempnam((char*) dir,(char *) prefix)))
  63.     {
  64.       strmake(to,res,FN_REFLEN-1);
  65.       (*free)(res);
  66.       file=my_create(to,0, mode | O_EXCL | O_NOFOLLOW, MyFlags);
  67.     }
  68.     environ=old_env;
  69.   }
  70. #elif defined(_ZTC__)
  71.   if (!dir)
  72.     dir=getenv("TMPDIR");
  73.   if ((res=tempnam((char*) dir,(char *) prefix)))
  74.   {
  75.     strmake(to,res,FN_REFLEN-1);
  76.     (*free)(res);
  77.     file=my_create(to, 0, mode | O_EXCL | O_NOFOLLOW, MyFlags);
  78.   }
  79. #elif defined(HAVE_MKSTEMP) && !defined(__NETWARE__)
  80.   {
  81.     char prefix_buff[30];
  82.     uint pfx_len;
  83.     File org_file;
  84.     pfx_len= (uint) (strmov(strnmov(prefix_buff,
  85.     prefix ? prefix : "tmp.",
  86.     sizeof(prefix_buff)-7),"XXXXXX") -
  87.      prefix_buff);
  88.     if (!dir && ! (dir =getenv("TMPDIR")))
  89.       dir=P_tmpdir;
  90.     if (strlen(dir)+ pfx_len > FN_REFLEN-2)
  91.     {
  92.       errno=my_errno= ENAMETOOLONG;
  93.       DBUG_RETURN(file);
  94.     }
  95.     strmov(convert_dirname(to,dir,NullS),prefix_buff);
  96.     org_file=mkstemp(to);
  97.     file=my_register_filename(org_file, to, FILE_BY_MKSTEMP,
  98.       EE_CANTCREATEFILE, MyFlags);
  99.     /* If we didn't manage to register the name, remove the temp file */
  100.     if (org_file >= 0 && file < 0)
  101.     {
  102.       int tmp=my_errno;
  103.       (void) my_delete(to, MYF(MY_WME | ME_NOINPUT));
  104.       my_errno=tmp;
  105.     }
  106.   }
  107. #elif defined(HAVE_TEMPNAM)
  108.   {
  109.     char *res,**old_env,*temp_env[1];
  110.     if (dir && !dir[0])
  111.     { /* Change empty string to current dir */
  112.       to[0]= FN_CURLIB;
  113.       to[1]= 0;
  114.       dir=to;
  115.     }
  116. #ifdef OS2
  117.     /* changing environ variable doesn't work with VACPP */
  118.     char  buffer[256], *end;
  119.     buffer[sizeof(buffer)-1]= 0;
  120.     end= strxnmov(buffer, sizeof(buffer)-1, (char*) "TMP=", dir, NullS);
  121.     /* remove ending backslash */
  122.     if (end[-1] == '\')
  123.       end[-1]= 0;
  124.     putenv(buffer);
  125. #elif !defined(__NETWARE__)
  126.     old_env= (char**) environ;
  127.     if (dir)
  128.     { /* Don't use TMPDIR if dir is given */
  129.       environ=(const char**) temp_env;
  130.       temp_env[0]=0;
  131.     }
  132. #endif
  133.     if ((res=tempnam((char*) dir, (char*) prefix)))
  134.     {
  135.       strmake(to,res,FN_REFLEN-1);
  136.       (*free)(res);
  137.       file=my_create(to,0,
  138.      (int) (O_RDWR | O_BINARY | O_TRUNC | O_EXCL | O_NOFOLLOW |
  139.     O_TEMPORARY | O_SHORT_LIVED),
  140.      MYF(MY_WME));
  141.     }
  142.     else
  143.     {
  144.       DBUG_PRINT("error",("Got error: %d from tempnam",errno));
  145.     }
  146. #if !defined(OS2) && !defined(__NETWARE__)
  147.     environ=(const char**) old_env;
  148. #endif
  149.   }
  150. #else
  151.   {
  152.     register long uniq;
  153.     register int length;
  154.     my_string pos,end_pos;
  155.     /* Make an unique number */
  156.     pthread_mutex_lock(&THR_LOCK_open);
  157.     uniq= ((long) getpid() << 20) + (long) _my_tempnam_used++ ;
  158.     pthread_mutex_unlock(&THR_LOCK_open);
  159.     if (!dir && !(dir=getenv("TMPDIR"))) /* Use this if possibly */
  160.       dir=P_tmpdir; /* Use system default */
  161.     length=strlen(dir)+strlen(pfx)+1;
  162.     DBUG_PRINT("test",("mallocing %d byte",length+8+sizeof(TMP_EXT)+1));
  163.     if (length+8+sizeof(TMP_EXT)+1 > FN_REFLENGTH)
  164.       errno=my_errno= ENAMETOOLONG;
  165.     else
  166.     {
  167.       end_pos=strmov(to,dir);
  168.       if (end_pos != to && end_pos[-1] != FN_LIBCHAR)
  169. *end_pos++=FN_LIBCHAR;
  170.       end_pos=strmov(end_pos,pfx);
  171.       for (length=0 ; length < 8 && uniq ; length++)
  172.       {
  173. *end_pos++= _dig_vec_upper[(int) (uniq & 31)];
  174. uniq >>= 5;
  175.       }
  176.       (void) strmov(end_pos,TMP_EXT);
  177.       file=my_create(to,0,
  178.      (int) (O_RDWR | O_BINARY | O_TRUNC | O_EXCL | O_NOFOLLOW |
  179.     O_TEMPORARY | O_SHORT_LIVED),
  180.      MYF(MY_WME));
  181.     }
  182.   }
  183. #endif
  184.   if (file >= 0)
  185.     thread_safe_increment(my_tmp_file_created,&THR_LOCK_open);
  186.   DBUG_RETURN(file);
  187. }