mySQL 5.0.11 sources for tomato
[tomato.git] / release / src / router / mysql / mysys / mf_tempfile.c
blob91b114b83a8dd15b2dbf760a6d5b105dfa7005ca
1 /* Copyright (c) 2000-2007 MySQL AB
3 This program is free software; you can redistribute it and/or modify
4 it under the terms of the GNU General Public License as published by
5 the Free Software Foundation; version 2 of the License.
7 This program is distributed in the hope that it will be useful,
8 but WITHOUT ANY WARRANTY; without even the implied warranty of
9 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 GNU General Public License for more details.
12 You should have received a copy of the GNU General Public License
13 along with this program; if not, write to the Free Software
14 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA */
16 #include "mysys_priv.h"
17 #include <m_string.h>
18 #include "my_static.h"
19 #include "mysys_err.h"
20 #include <errno.h>
21 #ifdef HAVE_PATHS_H
22 #include <paths.h>
23 #endif
28 @brief
29 Create a temporary file with unique name in a given directory
31 @details
32 create_temp_file
33 to pointer to buffer where temporary filename will be stored
34 dir directory where to create the file
35 prefix prefix the filename with this
36 mode Flags to use for my_create/my_open
37 MyFlags Magic flags
39 @return
40 File descriptor of opened file if success
41 -1 and sets errno if fails.
43 @note
44 The behaviour of this function differs a lot between
45 implementation, it's main use is to generate a file with
46 a name that does not already exist.
48 When passing O_TEMPORARY flag in "mode" the file should
49 be automatically deleted
51 The implementation using mkstemp should be considered the
52 reference implementation when adding a new or modifying an
53 existing one
57 File create_temp_file(char *to, const char *dir, const char *prefix,
58 int mode __attribute__((unused)),
59 myf MyFlags __attribute__((unused)))
61 File file= -1;
62 #ifdef __WIN__
63 TCHAR path_buf[MAX_PATH-14];
64 #endif
66 DBUG_ENTER("create_temp_file");
67 DBUG_PRINT("enter", ("dir: %s, prefix: %s", dir, prefix));
68 #if defined (__WIN__)
71 Use GetTempPath to determine path for temporary files.
72 This is because the documentation for GetTempFileName
73 has the following to say about this parameter:
74 "If this parameter is NULL, the function fails."
76 if (!dir)
78 if(GetTempPath(sizeof(path_buf), path_buf) > 0)
79 dir = path_buf;
82 Use GetTempFileName to generate a unique filename, create
83 the file and release it's handle
84 - uses up to the first three letters from prefix
86 if (GetTempFileName(dir, prefix, 0, to) == 0)
87 DBUG_RETURN(-1);
89 DBUG_PRINT("info", ("name: %s", to));
92 Open the file without the "open only if file doesn't already exist"
93 since the file has already been created by GetTempFileName
95 if ((file= my_open(to, (mode & ~O_EXCL), MyFlags)) < 0)
97 /* Open failed, remove the file created by GetTempFileName */
98 int tmp= my_errno;
99 (void) my_delete(to, MYF(0));
100 my_errno= tmp;
103 #elif defined(_ZTC__)
104 if (!dir)
105 dir=getenv("TMPDIR");
106 if ((res=tempnam((char*) dir,(char *) prefix)))
108 strmake(to,res,FN_REFLEN-1);
109 (*free)(res);
110 file=my_create(to, 0, mode | O_EXCL | O_NOFOLLOW, MyFlags);
112 #elif defined(HAVE_MKSTEMP) && !defined(__NETWARE__)
114 char prefix_buff[30];
115 uint pfx_len;
116 File org_file;
118 pfx_len= (uint) (strmov(strnmov(prefix_buff,
119 prefix ? prefix : "tmp.",
120 sizeof(prefix_buff)-7),"XXXXXX") -
121 prefix_buff);
122 if (!dir && ! (dir =getenv("TMPDIR")))
123 dir=P_tmpdir;
124 if (strlen(dir)+ pfx_len > FN_REFLEN-2)
126 errno=my_errno= ENAMETOOLONG;
127 DBUG_RETURN(file);
129 strmov(convert_dirname(to,dir,NullS),prefix_buff);
130 org_file=mkstemp(to);
131 if (mode & O_TEMPORARY)
132 (void) my_delete(to, MYF(MY_WME | ME_NOINPUT));
133 file=my_register_filename(org_file, to, FILE_BY_MKSTEMP,
134 EE_CANTCREATEFILE, MyFlags);
135 /* If we didn't manage to register the name, remove the temp file */
136 if (org_file >= 0 && file < 0)
138 int tmp=my_errno;
139 close(org_file);
140 (void) my_delete(to, MYF(MY_WME | ME_NOINPUT));
141 my_errno=tmp;
144 #elif defined(HAVE_TEMPNAM)
146 #if !defined(__NETWARE__)
147 extern char **environ;
148 #endif
150 char *res,**old_env,*temp_env[1];
151 if (dir && !dir[0])
152 { /* Change empty string to current dir */
153 to[0]= FN_CURLIB;
154 to[1]= 0;
155 dir=to;
157 #if !defined(__NETWARE__)
158 old_env= (char**) environ;
159 if (dir)
160 { /* Don't use TMPDIR if dir is given */
161 environ=(const char**) temp_env;
162 temp_env[0]=0;
164 #endif
165 if ((res=tempnam((char*) dir, (char*) prefix)))
167 strmake(to,res,FN_REFLEN-1);
168 (*free)(res);
169 file=my_create(to,0,
170 (int) (O_RDWR | O_BINARY | O_TRUNC | O_EXCL | O_NOFOLLOW |
171 O_TEMPORARY | O_SHORT_LIVED),
172 MYF(MY_WME));
175 else
177 DBUG_PRINT("error",("Got error: %d from tempnam",errno));
179 #if !defined(__NETWARE__)
180 environ=(const char**) old_env;
181 #endif
183 #else
184 #error No implementation found for create_temp_file
185 #endif
186 if (file >= 0)
187 thread_safe_increment(my_tmp_file_created,&THR_LOCK_open);
188 DBUG_RETURN(file);