111
|
1 ------------------------------------------------------------------------------
|
|
2 -- --
|
|
3 -- GNAT COMPILER COMPONENTS --
|
|
4 -- --
|
|
5 -- T E M P D I R --
|
|
6 -- --
|
|
7 -- B o d y --
|
|
8 -- --
|
145
|
9 -- Copyright (C) 2003-2019, Free Software Foundation, Inc. --
|
111
|
10 -- --
|
|
11 -- GNAT is free software; you can redistribute it and/or modify it under --
|
|
12 -- terms of the GNU General Public License as published by the Free Soft- --
|
|
13 -- ware Foundation; either version 3, or (at your option) any later ver- --
|
|
14 -- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
|
|
15 -- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
|
|
16 -- or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License --
|
|
17 -- for more details. You should have received a copy of the GNU General --
|
|
18 -- Public License distributed with GNAT; see file COPYING3. If not, go to --
|
|
19 -- http://www.gnu.org/licenses for a complete copy of the license. --
|
|
20 -- --
|
|
21 -- GNAT was originally developed by the GNAT team at New York University. --
|
|
22 -- Extensive contributions were provided by Ada Core Technologies Inc. --
|
|
23 -- --
|
|
24 ------------------------------------------------------------------------------
|
|
25
|
|
26 with GNAT.Directory_Operations; use GNAT.Directory_Operations;
|
|
27
|
|
28 with Opt; use Opt;
|
|
29 with Output; use Output;
|
|
30
|
|
31 package body Tempdir is
|
|
32
|
|
33 Tmpdir_Needs_To_Be_Displayed : Boolean := True;
|
|
34
|
|
35 Tmpdir : constant String := "TMPDIR";
|
|
36 Temp_Dir : String_Access := new String'("");
|
|
37
|
|
38 ----------------------
|
|
39 -- Create_Temp_File --
|
|
40 ----------------------
|
|
41
|
|
42 procedure Create_Temp_File
|
|
43 (FD : out File_Descriptor;
|
|
44 Name : out Path_Name_Type)
|
|
45 is
|
|
46 File_Name : String_Access;
|
|
47 Current_Dir : constant String := Get_Current_Dir;
|
|
48
|
|
49 function Directory return String;
|
|
50 -- Returns Temp_Dir.all if not empty, else return current directory
|
|
51
|
|
52 ---------------
|
|
53 -- Directory --
|
|
54 ---------------
|
|
55
|
|
56 function Directory return String is
|
|
57 begin
|
|
58 if Temp_Dir'Length /= 0 then
|
|
59 return Temp_Dir.all;
|
|
60 else
|
|
61 return Current_Dir;
|
|
62 end if;
|
|
63 end Directory;
|
|
64
|
|
65 -- Start of processing for Create_Temp_File
|
|
66
|
|
67 begin
|
|
68 if Temp_Dir'Length /= 0 then
|
|
69
|
|
70 -- In verbose mode, display once the value of TMPDIR, so that
|
|
71 -- if temp files cannot be created, it is easier to understand
|
|
72 -- where temp files are supposed to be created.
|
|
73
|
|
74 if Verbose_Mode and then Tmpdir_Needs_To_Be_Displayed then
|
|
75 Write_Str ("TMPDIR = """);
|
|
76 Write_Str (Temp_Dir.all);
|
|
77 Write_Line ("""");
|
|
78 Tmpdir_Needs_To_Be_Displayed := False;
|
|
79 end if;
|
|
80
|
|
81 -- Change directory to TMPDIR before creating the temp file,
|
|
82 -- then change back immediately to the previous directory.
|
|
83
|
|
84 Change_Dir (Temp_Dir.all);
|
|
85 Create_Temp_File (FD, File_Name);
|
|
86 Change_Dir (Current_Dir);
|
|
87
|
|
88 else
|
|
89 Create_Temp_File (FD, File_Name);
|
|
90 end if;
|
|
91
|
|
92 if FD = Invalid_FD then
|
|
93 Write_Line ("could not create temporary file in " & Directory);
|
|
94 Name := No_Path;
|
|
95
|
|
96 else
|
|
97 declare
|
|
98 Path_Name : constant String :=
|
|
99 Normalize_Pathname
|
|
100 (Directory & Directory_Separator & File_Name.all);
|
|
101 begin
|
|
102 Name_Len := Path_Name'Length;
|
|
103 Name_Buffer (1 .. Name_Len) := Path_Name;
|
|
104 Name := Name_Find;
|
|
105 Free (File_Name);
|
|
106 end;
|
|
107 end if;
|
|
108 end Create_Temp_File;
|
|
109
|
|
110 ------------------
|
|
111 -- Use_Temp_Dir --
|
|
112 ------------------
|
|
113
|
|
114 procedure Use_Temp_Dir (Status : Boolean) is
|
|
115 Dir : String_Access;
|
|
116
|
|
117 begin
|
|
118 if Status then
|
|
119 Dir := Getenv (Tmpdir);
|
|
120 end if;
|
|
121
|
|
122 Free (Temp_Dir);
|
|
123
|
|
124 if Dir /= null
|
|
125 and then Dir'Length > 0
|
|
126 and then Is_Absolute_Path (Dir.all)
|
|
127 and then Is_Directory (Dir.all)
|
|
128 then
|
|
129 Temp_Dir := new String'(Normalize_Pathname (Dir.all));
|
|
130 else
|
|
131 Temp_Dir := new String'("");
|
|
132 end if;
|
|
133
|
|
134 Free (Dir);
|
|
135 end Use_Temp_Dir;
|
|
136
|
|
137 -- Start of elaboration for package Tempdir
|
|
138
|
|
139 begin
|
|
140 Use_Temp_Dir (Status => True);
|
|
141 end Tempdir;
|