acb5a2ae9e0d752f1ea771acdacf958a1975201d
[scilab.git] / scilab / modules / core / src / c / tmpdir.c
1 /*
2  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
3  * Copyright (C) INRIA
4  * Copyright (C) DIGITEO - 2009 - Allan CORNET
5  * Copyright (C) DIGITEO - 2010 - Sylvestre LEDRU
6  *
7  * This file must be used under the terms of the CeCILL.
8  * This source file is licensed as described in the file COPYING, which
9  * you should have received as part of this distribution. The terms
10  * are also available at
11  * http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
12  *
13  */
14 #include <stdio.h>
15 #include <string.h>
16
17 #ifdef _MSC_VER
18 #include <windows.h>
19 #include <process.h>
20 #endif
21
22 #if defined(__STDC__) || defined(_MSC_VER)
23 #include <stdlib.h>
24 #ifndef _MSC_VER
25 #include <sys/types.h>
26 #include <unistd.h>
27 #endif
28 #else 
29 extern  char  *getenv();
30 #endif
31
32 #include <errno.h>
33
34 #ifdef _MSC_VER
35 #include <process.h>
36 #include "strdup_windows.h"
37 #endif
38 #include "MALLOC.h" /* MALLOC */
39 #include "tmpdir.h"
40 #include "localization.h"
41 #include "charEncoding.h"
42 #include "MALLOC.h"
43 #include "PATH_MAX.h"
44 #include "removedir.h"
45 #include "createdirectory.h"
46 /*--------------------------------------------------------------------------*/
47 static char tmp_dir[PATH_MAX+FILENAME_MAX+1];
48 static int alreadyCreated = 0;
49 /*--------------------------------------------------------------------------*/
50 #ifdef _MSC_VER
51 void createScilabTMPDIR(void)
52 {
53     wchar_t wcTmpDirDefault[PATH_MAX];
54     if (!GetTempPathW(PATH_MAX,wcTmpDirDefault))
55     {
56         MessageBox(NULL,_("Cannot find Windows temporary directory (1)."),_("Error"),MB_ICONERROR);
57         exit(1);
58     }
59     else
60     {
61         wchar_t wctmp_dir[PATH_MAX+FILENAME_MAX+1];
62         static wchar_t bufenv[PATH_MAX + 16];
63         char *TmpDir = NULL;
64         swprintf(wctmp_dir,PATH_MAX+FILENAME_MAX+1,L"%sSCI_TMP_%d_",wcTmpDirDefault,(int) _getpid());
65         if ( CreateDirectoryW(wctmp_dir,NULL) == FALSE)
66         {
67             DWORD attribs = GetFileAttributesW (wctmp_dir);
68             if (attribs & FILE_ATTRIBUTE_DIRECTORY)
69             {
70                 /* Repertoire existant */
71             }
72             else
73             {
74                 #ifdef _DEBUG
75                 {
76                     char MsgErr[1024];
77                     wsprintf(MsgErr,_("Impossible to create : %s"),tmp_dir);
78                     MessageBox(NULL,MsgErr,_("Error"),MB_ICONERROR);
79                     exit(1);
80                 }
81                 #else
82                 {
83                     GetTempPathW(PATH_MAX,wcTmpDirDefault);
84                     wcscpy(wctmp_dir,wcTmpDirDefault);
85                     wctmp_dir[wcslen(wctmp_dir)-1]='\0'; /* Remove last \ */
86                 }
87                 #endif
88             }
89         }
90
91         swprintf(bufenv,PATH_MAX + 16,L"TMPDIR=%s",wctmp_dir);
92         _wputenv(bufenv);
93
94         TmpDir = wide_string_to_UTF8(wctmp_dir);
95         if (TmpDir)
96         {
97             strcpy(tmp_dir, TmpDir);
98             FREE(TmpDir);
99         }
100         else
101         {
102             strcpy(tmp_dir, "");
103         }
104     }
105 }
106 #else
107
108 void createScilabTMPDIR(void)
109 {
110     char *tmpdir;
111
112     if ( alreadyCreated == 0 )
113     {
114         static char bufenv[PATH_MAX + 16];
115         alreadyCreated++;
116         /* If the env variable TMPDIR is set, honor this preference */
117         if ((tmpdir = getenv("TMPDIR")) != NULL &&
118             strlen(tmpdir) < (PATH_MAX) && strstr(tmpdir, "SCI_TMP_") == NULL)
119         {
120             /* TMPDIR does not contains SCI_TMP. Using TMPDIR */
121             strcpy(tmp_dir, tmpdir);
122         }
123         else
124         {
125             /* Two cases where we can be here:
126              *  - When TMPDIR is not set (all cases)
127              *  - If SCI_TMP_* is in the TMPDIR variable, switch to the default
128             */
129             strcpy(tmp_dir, "/tmp");
130         }
131
132         /* XXXXXX will be randomized by mkdtemp */
133         char *tmp_dir_strdup = strdup(tmp_dir); /* Copy to avoid to have the same buffer as input and output for sprintf */
134         sprintf(tmp_dir, "%s/SCI_TMP_%d_XXXXXX", tmp_dir_strdup, (int) getpid());
135         free(tmp_dir_strdup);
136
137         if(mkdtemp(tmp_dir) == NULL)
138         {
139                 fprintf(stderr,_("Error: Could not create %s: %s\n"), tmp_dir, strerror(errno));
140         }
141
142         sprintf(bufenv, "TMPDIR=%s", tmp_dir);
143         putenv(bufenv);
144     }
145 }
146 #endif
147 /*--------------------------------------------------------------------------*/
148 /**
149 * creates a tmp dir for a scilab session
150 * and fixes the TMPDIR env variable
151 */
152 void C2F(settmpdir)(void)
153 {
154     createScilabTMPDIR();
155 }
156 /*--------------------------------------------------------------------------*/
157 char *getTMPDIR(void)
158 {
159     return strdup(tmp_dir);
160 }
161 /*--------------------------------------------------------------------------*/
162 /**
163 * remove TMPDIR directory
164 */
165 void C2F(tmpdirc)(void)
166 {
167     removedir(tmp_dir);
168 }
169 /*--------------------------------------------------------------------------*/
170 wchar_t *getTMPDIRW(void)
171 {
172     return to_wide_string(tmp_dir);
173 }
174 /*--------------------------------------------------------------------------*/