~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to mysys/mf_tempfile.c

  • Committer: Monty Taylor
  • Date: 2008-10-10 23:04:21 UTC
  • mto: (509.1.1 codestyle)
  • mto: This revision was merged to the branch mainline in revision 511.
  • Revision ID: monty@inaugust.com-20081010230421-zohe1eppxievpw8d
Removed O_NOFOLLOW

Show diffs side-by-side

added added

removed removed

Lines of Context:
13
13
   along with this program; if not, write to the Free Software
14
14
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
15
15
 
16
 
#include "config.h"
17
 
 
18
 
#include "drizzled/internal/my_sys.h"
19
 
#include "drizzled/internal/m_string.h"
 
16
#include "mysys_priv.h"
 
17
#include <mystrings/m_string.h>
20
18
#include "my_static.h"
21
 
#include "drizzled/error.h"
22
 
#include <stdio.h>
 
19
#include "mysys_err.h"
23
20
#include <errno.h>
24
 
#include <string>
25
21
#ifdef HAVE_PATHS_H
26
22
#include <paths.h>
27
23
#endif
28
24
 
29
 
using namespace std;
30
 
namespace drizzled
31
 
{
32
 
namespace internal
33
 
{
 
25
 
34
26
 
35
27
/*
36
28
  @brief
41
33
    to             pointer to buffer where temporary filename will be stored
42
34
    dir            directory where to create the file
43
35
    prefix         prefix the filename with this
 
36
    mode           Flags to use for my_create/my_open
44
37
    MyFlags        Magic flags
45
38
 
46
39
  @return
58
51
 
59
52
*/
60
53
 
61
 
int create_temp_file(char *to, const char *dir, const char *prefix,
62
 
                     myf MyFlags)
 
54
File create_temp_file(char *to, const char *dir, const char *prefix,
 
55
                      int mode __attribute__((unused)),
 
56
                      myf MyFlags __attribute__((unused)))
63
57
{
64
 
  int file= -1;
65
 
 
66
 
  int org_file;
67
 
  string prefix_str;
68
 
 
69
 
  prefix_str= prefix ? prefix : "tmp.";
70
 
  prefix_str.append("XXXXXX");
71
 
 
72
 
  if (!dir && ! (dir =getenv("TMPDIR")))
73
 
    dir= P_tmpdir;
74
 
  if (strlen(dir)+prefix_str.length() > FN_REFLEN-2)
75
 
  {
76
 
    errno=errno= ENAMETOOLONG;
77
 
    return(file);
78
 
  }
79
 
  strcpy(convert_dirname(to,dir,NULL),prefix_str.c_str());
80
 
  org_file=mkstemp(to);
81
 
  /* TODO: This was old behavior, but really don't we want to
82
 
   * unlink files immediately under all circumstances?
83
 
   * if (mode & O_TEMPORARY)
84
 
    (void) my_delete(to, MYF(MY_WME | ME_NOINPUT));
85
 
  */
86
 
  file=my_register_filename(org_file, to, EE_CANTCREATEFILE, MyFlags);
87
 
 
88
 
  /* If we didn't manage to register the name, remove the temp file */
89
 
  if (org_file >= 0 && file < 0)
90
 
  {
91
 
    int tmp=errno;
92
 
    close(org_file);
93
 
    (void) my_delete(to, MYF(MY_WME | ME_NOINPUT));
94
 
    errno=tmp;
95
 
  }
96
 
 
 
58
  File file= -1;
 
59
 
 
60
#if defined(_ZTC__)
 
61
  if (!dir)
 
62
    dir=getenv("TMPDIR");
 
63
  if ((res=tempnam((char*) dir,(char *) prefix)))
 
64
  {
 
65
    strmake(to,res,FN_REFLEN-1);
 
66
    (*free)(res);
 
67
    file=my_create(to, 0, mode | O_EXCL, MyFlags);
 
68
  }
 
69
#elif defined(HAVE_MKSTEMP)
 
70
  {
 
71
    char prefix_buff[30];
 
72
    uint32_t pfx_len;
 
73
    File org_file;
 
74
 
 
75
    pfx_len= (uint) (my_stpcpy(my_stpncpy(prefix_buff,
 
76
                                    prefix ? prefix : "tmp.",
 
77
                                    sizeof(prefix_buff)-7),"XXXXXX") -
 
78
                     prefix_buff);
 
79
    if (!dir && ! (dir =getenv("TMPDIR")))
 
80
      dir=P_tmpdir;
 
81
    if (strlen(dir)+ pfx_len > FN_REFLEN-2)
 
82
    {
 
83
      errno=my_errno= ENAMETOOLONG;
 
84
      return(file);
 
85
    }
 
86
    my_stpcpy(convert_dirname(to,dir,NULL),prefix_buff);
 
87
    org_file=mkstemp(to);
 
88
    /* TODO: This was old behavior, but really don't we want to 
 
89
     * unlink files immediately under all circumstances?
 
90
     * if (mode & O_TEMPORARY)
 
91
      (void) my_delete(to, MYF(MY_WME | ME_NOINPUT));
 
92
     */
 
93
    file=my_register_filename(org_file, to, FILE_BY_MKSTEMP,
 
94
                              EE_CANTCREATEFILE, MyFlags);
 
95
    /* If we didn't manage to register the name, remove the temp file */
 
96
    if (org_file >= 0 && file < 0)
 
97
    {
 
98
      int tmp=my_errno;
 
99
      close(org_file);
 
100
      (void) my_delete(to, MYF(MY_WME | ME_NOINPUT));
 
101
      my_errno=tmp;
 
102
    }
 
103
  }
 
104
#elif defined(HAVE_TEMPNAM)
 
105
  {
 
106
    char *res,**old_env,*temp_env[1];
 
107
    if (dir && !dir[0])
 
108
    {                           /* Change empty string to current dir */
 
109
      to[0]= FN_CURLIB;
 
110
      to[1]= 0;
 
111
      dir=to;
 
112
    }
 
113
    old_env= (char**) environ;
 
114
    if (dir)
 
115
    {                           /* Don't use TMPDIR if dir is given */
 
116
      environ=(const char**) temp_env;
 
117
      temp_env[0]=0;
 
118
    }
 
119
    if ((res=tempnam((char*) dir, (char*) prefix)))
 
120
    {
 
121
      strmake(to,res,FN_REFLEN-1);
 
122
      (*free)(res);
 
123
      file=my_create(to,0,
 
124
                     (int) (O_RDWR | O_TRUNC | O_EXCL),
 
125
                     MYF(MY_WME));
 
126
 
 
127
    }
 
128
    environ=(const char**) old_env;
 
129
  }
 
130
#else
 
131
#error No implementation found for create_temp_file
 
132
#endif
 
133
  if (file >= 0)
 
134
    thread_safe_increment(my_tmp_file_created,&THR_LOCK_open);
97
135
  return(file);
98
136
}
99
 
 
100
 
} /* namespace internal */
101
 
} /* namespace drizzled */