home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / mysys / mf_tempfile.c < prev    next >
C/C++ Source or Header  |  2000-11-20  |  5KB  |  177 lines

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This library is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU Library General Public
  5.    License as published by the Free Software Foundation; either
  6.    version 2 of the License, or (at your option) any later version.
  7.    
  8.    This library is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.    Library General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU Library General Public
  14.    License along with this library; if not, write to the Free
  15.    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  16.    MA 02111-1307, USA */
  17.  
  18. #include "mysys_priv.h"
  19. #include <m_string.h>
  20. #include "my_static.h"
  21. #include "mysys_err.h"
  22. #include <errno.h>
  23. #ifdef HAVE_PATHS_H
  24. #include <paths.h>
  25. #endif
  26.  
  27. #ifdef HAVE_TEMPNAM
  28. #ifndef MSDOS
  29. extern char **environ;
  30. #endif
  31. #endif
  32.  
  33. /*
  34.   Create a temporary file in a given directory
  35.   This function should be used instead of my_tempnam() !
  36. */
  37.  
  38. File create_temp_file(char *to, const char *dir, const char *prefix,
  39.               int mode __attribute__((unused)),
  40.               myf MyFlags __attribute__((unused)))
  41. {
  42.   File file= -1;
  43.   DBUG_ENTER("open_temp_file");
  44. #if defined(_MSC_VER)
  45.   {
  46.     char temp[FN_REFLEN],*end,*res,**old_env,*temp_env[1];
  47.     old_env=environ;
  48.     if (dir)
  49.     {
  50.       end=strend(dir)-1;
  51.       if (!dir[0])
  52.       {                /* Change empty string to current dir */
  53.     to[0]= FN_CURLIB;
  54.     to[1]= 0;
  55.     dir=to;
  56.       }
  57.       else if (*end == FN_DEVCHAR)
  58.       {                /* Get current dir for drive */
  59.     _fullpath(temp,dir,FN_REFLEN);
  60.     dir=to;
  61.       }
  62.       else if (*end == FN_LIBCHAR && dir < end && end[-1] != FN_DEVCHAR)
  63.       {
  64.     strmake(to,dir,(uint) (end-dir));    /* Copy and remove last '\' */
  65.     dir=to;
  66.       }
  67.       environ=temp_env;        /* Force use of dir (dir not checked) */
  68.       temp_env[0]=0;
  69.     }
  70.     if ((res=tempnam((char*) dir,(char *) prefix)))
  71.     {
  72.       strnmov(to,res,FN_REFLEN);
  73.       (*free)(res);
  74.       file=my_create(to,0, mode, MyFlags);
  75.     }
  76.     environ=old_env;
  77.   }
  78. #elif defined(_ZTC__)
  79.   if (!dir)
  80.     dir=getenv("TMPDIR");
  81.   if ((res=tempnam((char*) dir,(char *) prefix)))
  82.   {
  83.     strnmov(to,res,FN_REFLEN);
  84.     (*free)(res);
  85.     file=my_create(to, 0, mode, MyFlags);
  86.   }
  87. #elif defined(HAVE_MKSTEMP)
  88.   {
  89.     char prefix_buff[30];
  90.     uint pfx_len;
  91.  
  92.     pfx_len=(strmov(strnmov(prefix_buff,
  93.                 prefix ? prefix : "tmp.",
  94.                 sizeof(prefix_buff)-7),"XXXXXX") - prefix_buff);
  95.     if (!dir && ! (dir =getenv("TMPDIR")))
  96.       dir=P_tmpdir;
  97.     if (strlen(dir)+ pfx_len > FN_REFLEN-2)
  98.     {
  99.       errno=my_errno= ENAMETOOLONG;
  100.       return 1;
  101.     }
  102.     strmov(to,dir);
  103.     strmov(convert_dirname(to),prefix_buff);
  104.     file=mkstemp(to);
  105.   }
  106. #elif defined(HAVE_TEMPNAM)
  107.   {
  108.     char *res,**old_env,*temp_env[1];
  109.     if (dir && !dir[0])
  110.     {                /* Change empty string to current dir */
  111.       to[0]= FN_CURLIB;
  112.       to[1]= 0;
  113.       dir=to;
  114.     }
  115.     old_env=environ;
  116.     if (dir)
  117.     {                /* Don't use TMPDIR if dir is given */
  118.       environ=temp_env;
  119.       temp_env[0]=0;
  120.     }
  121.     if ((res=tempnam((char*) dir, (char*) prefix)))
  122.     {    
  123.       strnmov(to,res,FN_REFLEN);
  124.       (*free)(res);
  125.       file=my_create(to,0,
  126.              (int) (O_RDWR | O_BINARY | O_TRUNC |
  127.                 O_TEMPORARY | O_SHORT_LIVED),
  128.              MYF(MY_WME));
  129.  
  130.     }
  131.     else
  132.     {
  133.       DBUG_PRINT("error",("Got error: %d from tempnam",errno));
  134.     }
  135.     environ=old_env;
  136.   }
  137. #else
  138.   {
  139.     register long uniq;
  140.     register int length;
  141.     my_string pos,end_pos;
  142.     /* Make an unique number */
  143.     pthread_mutex_lock(&THR_LOCK_open);
  144.     uniq= ((long) getpid() << 20) + (long) _my_tempnam_used++ ;
  145.     pthread_mutex_unlock(&THR_LOCK_open);
  146.     if (!dir && !(dir=getenv("TMPDIR")))    /* Use this if possibly */
  147.       dir=P_tmpdir;            /* Use system default */
  148.     length=strlen(dir)+strlen(pfx)+1;
  149.  
  150.     DBUG_PRINT("test",("mallocing %d byte",length+8+sizeof(TMP_EXT)+1));
  151.     if (length+8+sizeof(TMP_EXT)+1 > FN_REFLENGTH)
  152.       errno=my_errno= ENAMETOOLONG;
  153.     else
  154.     {
  155.       end_pos=strmov(to,dir);
  156.       if (end_pos != to && end_pos[-1] != FN_LIBCHAR)
  157.     *end_pos++=FN_LIBCHAR;
  158.       end_pos=strmov(end_pos,pfx);
  159.       
  160.       for (length=0 ; length < 8 && uniq ; length++)
  161.       {
  162.     *end_pos++= _dig_vec[(int) (uniq & 31)];
  163.     uniq >>= 5;
  164.       }
  165.       (void) strmov(end_pos,TMP_EXT);
  166.       file=my_create(to,0,
  167.              (int) (O_RDWR | O_BINARY | O_TRUNC |
  168.                 O_TEMPORARY | O_SHORT_LIVED),
  169.              MYF(MY_WME));
  170.     }
  171.   }
  172. #endif
  173.   if (file >= 0)
  174.     thread_safe_increment(my_tmp_file_created,&THR_LOCK_open);
  175.   DBUG_RETURN(file);
  176. }
  177.