babb4e384b161d1752f460ff9dc03d46024af137
[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 && strlen(tmpdir) < (PATH_MAX))
118         {
119             strcpy(tmp_dir, tmpdir);
120         }
121         else
122         {
123             strcpy(tmp_dir, "/tmp");
124         }
125
126         /* XXXXXX will be randomized by mkdtemp */
127         sprintf(tmp_dir, "%s/SCI_TMP_%d_XXXXXX", tmp_dir, (int) getpid());
128
129         if(mkdtemp(tmp_dir) < 0)
130         {
131                 fprintf(stderr,_("Error: Could not create %s: %s\n"), tmp_dir, strerror(errno));
132         }
133
134         sprintf(bufenv, "TMPDIR=%s", tmp_dir);
135         putenv(bufenv);
136     }
137 }
138 #endif
139 /*--------------------------------------------------------------------------*/
140 /**
141 * creates a tmp dir for a scilab session
142 * and fixes the TMPDIR env variable
143 */
144 void C2F(settmpdir)(void)
145 {
146     createScilabTMPDIR();
147 }
148 /*--------------------------------------------------------------------------*/
149 char *getTMPDIR(void)
150 {
151     return strdup(tmp_dir);
152 }
153 /*--------------------------------------------------------------------------*/
154 /**
155 * remove TMPDIR directory
156 */
157 void C2F(tmpdirc)(void)
158 {
159     removedir(tmp_dir);
160 }
161 /*--------------------------------------------------------------------------*/
162 wchar_t *getTMPDIRW(void)
163 {
164     return to_wide_string(tmp_dir);
165 }
166 /*--------------------------------------------------------------------------*/