r4722@vps: verhaegs | 2007-05-06 13:11:19 -0400
[cake.git] / rom / dos / devname.c
blob0953356713a3f1b4f6a668a79e698fcc7ffdef99
1 /*
2 Copyright © 1995-2007, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: Get a device pointer from a filename.
6 Lang: english
7 */
8 #include <exec/memory.h>
9 #include <proto/exec.h>
10 #include <dos/dos.h>
11 #include <dos/dosextens.h>
12 #include <dos/filesystem.h>
13 #include <proto/dos.h>
14 #include <proto/utility.h>
15 #include <string.h>
16 #include "dos_intern.h"
20 LONG DevName(CONST_STRPTR name, struct Device **devptr,
21 struct DosLibrary *DOSBase)
23 LONG error = 0L;
24 STRPTR volname;
25 CONST_STRPTR s1 = NULL;
26 struct DosList *dl;
27 struct FileHandle *fh;
28 struct Process *me = (struct Process *)FindTask(NULL);
30 /* If file is "PROGDIR:" or relative to current directory, just return
31 device from pr_HomeDir or pr_CurrentDir. */
32 if(!Strnicmp(name, "PROGDIR:", 8))
34 struct FileHandle *fh = (struct FileHandle *)BADDR(me->pr_HomeDir);
36 if (!fh)
38 *devptr = (struct Device *)0xBADC0DE;
39 return ERROR_DEVICE_NOT_MOUNTED;
41 else
43 *devptr = fh->fh_Device;
44 return 0;
47 else if(*name == ':')
49 struct FileHandle *fh = (struct FileHandle *)BADDR(me->pr_CurrentDir);
51 if (!fh) fh = (struct FileHandle *)BADDR(DOSBase->dl_SYSLock);
53 if (fh)
55 *devptr = fh->fh_Device;
56 return 0;
58 else
60 *devptr = (struct Device *)0xBADC0DE;
61 return ERROR_DEVICE_NOT_MOUNTED;
65 /* Copy volume name */
66 s1 = name;
67 volname = NULL;
69 while(*s1)
71 if(*s1++ == ':')
73 volname = (STRPTR)AllocVec(s1 - name, MEMF_ANY);
75 if(volname == NULL)
77 SetIoErr(ERROR_NO_FREE_STORE);
78 return ERROR_NO_FREE_STORE;
81 CopyMem(name, volname, s1 - name - 1);
82 volname[s1 - name - 1] = '\0';
83 break;
87 /* If path is relative to current directory, get device from
88 pr_CurrentDir. */
89 if(volname == NULL)
91 struct FileHandle *fh = (struct FileHandle *)BADDR(me->pr_CurrentDir);
93 if (!fh) fh = (struct FileHandle *)BADDR(DOSBase->dl_SYSLock);
95 if (fh)
97 *devptr = fh->fh_Device;
98 return 0;
100 else
102 *devptr = (struct Device *)0xBADC0DE;
103 return ERROR_DEVICE_NOT_MOUNTED;
108 /* Get the device pointer from dos-list. */
109 dl = LockDosList(LDF_ALL | LDF_READ);
110 dl = FindDosEntry(dl, volname, LDF_ALL);
112 if(dl != NULL)
114 if(dl->dol_Type == DLT_LATE)
116 /* Late binding assign: mount first */
117 BPTR lock = Lock(dl->dol_misc.dol_assign.dol_AssignName,
118 SHARED_LOCK);
119 UnLockDosList(LDF_ALL | LDF_READ);
120 dl = NULL;
122 if(lock != NULL)
124 AssignLock(volname, lock);
125 dl = LockDosList(LDF_ALL | LDF_READ);
126 dl = FindDosEntry(dl, volname, LDF_ALL);
128 if(dl != NULL)
129 *devptr = dl->dol_Ext.dol_AROS.dol_Device;
130 else
131 error = ERROR_DEVICE_NOT_MOUNTED;
133 UnLockDosList(LDF_ALL | LDF_READ);
135 else
136 error = IoErr();
139 else if(dl->dol_Type == DLT_NONBINDING)
141 BPTR lock = Lock(dl->dol_misc.dol_assign.dol_AssignName,
142 SHARED_LOCK);
143 UnLockDosList(LDF_ALL | LDF_READ);
144 fh = (struct FileHandle *)BADDR(lock);
146 if(fh != NULL)
148 *devptr = fh->fh_Device;
149 UnLock(lock);
151 else
152 error = IoErr();
154 else
156 *devptr = dl->dol_Ext.dol_AROS.dol_Device;
157 UnLockDosList(LDF_ALL | LDF_READ);
160 else
162 UnLockDosList(LDF_ALL | LDF_READ);
163 error = ERROR_DEVICE_NOT_MOUNTED;
166 FreeVec(volname);
167 SetIoErr(error);
169 return error;
170 } /* DevName */