Check for SYS/GL during library init. Reason is that
[AROS.git] / workbench / devs / diskimage / device / tempfile.c
blobea082aeafa7a40a68313a05456fd8ae81fa5162c
1 /* Copyright 2007-2012 Fredrik Wikstrom. All rights reserved.
2 **
3 ** Redistribution and use in source and binary forms, with or without
4 ** modification, are permitted provided that the following conditions
5 ** are met:
6 **
7 ** 1. Redistributions of source code must retain the above copyright
8 ** notice, this list of conditions and the following disclaimer.
9 **
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;
35 TEXT buf[4];
36 STRPTR path;
37 LONG error;
39 *tmpdir = ZERO;
40 *tmpname = "";
42 if (unit->TempDir) return ERROR_OBJECT_IN_USE;
44 path = NULL;
45 if (GetVar(TEMPDIR_VAR, buf, 4, LV_VAR|GVF_GLOBAL_ONLY) != -1) {
46 LONG size;
47 size = IoErr();
48 path = AllocVec(size+2, 0);
49 if (path) {
50 if (GetVar(TEMPDIR_VAR, path, size+1, LV_VAR|GVF_GLOBAL_ONLY) == -1) {
51 path[0] = '\0';
56 if (path && path[0])
57 unit->TempDir = Lock(path, ACCESS_READ);
58 else
59 unit->TempDir = 0;
60 FreeVec(path);
62 if (!unit->TempDir)
63 unit->TempDir = Lock("T:", ACCESS_READ);
65 if (unit->TempDir) {
66 if (!ext) ext = "img";
67 unit->TempName = ASPrintf("unit_%ld.%s", unit->UnitNum, ext);
68 if (unit->TempName) {
69 *tmpdir = unit->TempDir;
70 *tmpname = unit->TempName;
71 error = NO_ERROR;
72 } else
73 error = ERROR_NO_FREE_STORE;
74 } else
75 error = IoErr();
77 return error;
80 BPTR OpenTempFile (APTR Self, struct DiskImageUnit *unit, ULONG mode) {
81 struct Library *DOSBase = unit->LibBase->DOSBase;
82 BPTR old, file;
83 old = CurrentDir(unit->TempDir);
84 file = Open(unit->TempName, mode);
85 CurrentDir(old);
86 return file;
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) {
94 BPTR old;
95 old = CurrentDir(unit->TempDir);
96 DeleteFile(unit->TempName);
97 CurrentDir(old);
99 UnLock(unit->TempDir);
100 FreeVec(unit->TempName);
101 unit->TempDir = 0;
102 unit->TempName = NULL;