1 /* Copyright 2007-2012 Fredrik Wikstrom. All rights reserved.
3 ** Redistribution and use in source and binary forms, with or without
4 ** modification, are permitted provided that the following conditions
7 ** 1. Redistributions of source code must retain the above copyright
8 ** notice, this list of conditions and the following disclaimer.
10 ** 2. Redistributions in binary form must reproduce the above copyright
11 ** notice, this list of conditions and the following disclaimer in the
12 ** documentation and/or other materials provided with the distribution.
14 ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS `AS IS'
15 ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
18 ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
19 ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
20 ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
21 ** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
22 ** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
23 ** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
24 ** POSSIBILITY OF SUCH DAMAGE.
27 #include "diskimage_device.h"
29 LONG
CreateTempFile (APTR Self
, struct DiskImageUnit
*unit
, CONST_STRPTR ext
,
30 BPTR
*tmpdir
, CONST_STRPTR
*tmpname
)
32 struct DiskImageBase
*libBase
= unit
->LibBase
;
33 struct Library
*SysBase
= libBase
->SysBase
;
34 struct Library
*DOSBase
= libBase
->DOSBase
;
42 if (unit
->TempDir
) return ERROR_OBJECT_IN_USE
;
45 if (GetVar(TEMPDIR_VAR
, buf
, 4, LV_VAR
|GVF_GLOBAL_ONLY
) != -1) {
48 path
= AllocVec(size
+2, 0);
50 if (GetVar(TEMPDIR_VAR
, path
, size
+1, LV_VAR
|GVF_GLOBAL_ONLY
) == -1) {
57 unit
->TempDir
= Lock(path
, ACCESS_READ
);
63 unit
->TempDir
= Lock("T:", ACCESS_READ
);
66 if (!ext
) ext
= "img";
67 unit
->TempName
= ASPrintf("unit_%ld.%s", unit
->UnitNum
, ext
);
69 *tmpdir
= unit
->TempDir
;
70 *tmpname
= unit
->TempName
;
73 error
= ERROR_NO_FREE_STORE
;
80 BPTR
OpenTempFile (APTR Self
, struct DiskImageUnit
*unit
, ULONG mode
) {
81 struct Library
*DOSBase
= unit
->LibBase
->DOSBase
;
83 old
= CurrentDir(unit
->TempDir
);
84 file
= Open(unit
->TempName
, mode
);
89 void RemoveTempFile (APTR Self
, struct DiskImageUnit
*unit
) {
90 struct DiskImageBase
*libBase
= unit
->LibBase
;
91 struct Library
*SysBase
= libBase
->SysBase
;
92 struct Library
*DOSBase
= libBase
->DOSBase
;
93 if (unit
->TempDir
&& unit
->TempName
) {
95 old
= CurrentDir(unit
->TempDir
);
96 DeleteFile(unit
->TempName
);
99 UnLock(unit
->TempDir
);
100 FreeVec(unit
->TempName
);
102 unit
->TempName
= NULL
;