Updated PCI IDs to latest snapshot.
[tangerine.git] / rom / dos / assignlock.c
blob8a22c46cd65004ef176a267e158f6005e8aa2ef4
1 /*
2 Copyright © 1995-2007, The AROS Development Team. All rights reserved.
3 $Id$
5 Desc: Create an assign.
6 Lang: English
7 */
8 #include <exec/memory.h>
9 #include <proto/exec.h>
10 #include <dos/filesystem.h>
11 #include "dos_intern.h"
13 /*****************************************************************************
15 NAME */
16 #include <proto/dos.h>
18 AROS_LH2(BOOL, AssignLock,
20 /* SYNOPSIS */
21 AROS_LHA(CONST_STRPTR, name, D1),
22 AROS_LHA(BPTR, lock, D2),
24 /* LOCATION */
25 struct DosLibrary *, DOSBase, 102, Dos)
27 /* FUNCTION
28 Create an assign from a given name to a lock. Replaces any older
29 assignments from that name, 0 cancels the assign completely. Do not
30 use or free the lock after calling this function - it becomes
31 the assign and will be freed by the system if the assign is removed.
33 INPUTS
34 name -- NUL terminated name of the assign.
35 lock -- Lock to assigned directory.
37 RESULT
38 != 0 success, 0 on failure. IoErr() gives additional information
39 in that case. The lock is not freed on failure.
41 NOTES
43 EXAMPLE
45 BUGS
47 SEE ALSO
49 INTERNALS
51 *****************************************************************************/
53 AROS_LIBFUNC_INIT
55 BOOL success = DOSTRUE;
57 struct DosList *dl, *newdl = NULL;
58 struct FileHandle *fh = (struct FileHandle *)BADDR(lock);
60 if (lock != NULL)
62 newdl = MakeDosEntry(name, DLT_DIRECTORY);
64 if (newdl == NULL)
66 return DOSFALSE;
69 newdl->dol_Ext.dol_AROS.dol_Unit = fh->fh_Unit;
70 newdl->dol_Ext.dol_AROS.dol_Device = fh->fh_Device;
71 newdl->dol_Lock = lock;
74 dl = LockDosList(LDF_ALL | LDF_WRITE);
75 dl = FindDosEntry(dl, name, LDF_ALL);
77 if (dl == NULL)
79 AddDosEntry(newdl);
81 else if (dl->dol_Type == DLT_DEVICE || dl->dol_Type == DLT_VOLUME)
83 dl = NULL;
84 FreeDosEntry(newdl);
85 SetIoErr(ERROR_OBJECT_EXISTS);
86 success = DOSFALSE;
88 else
90 RemDosEntry(dl);
92 AddDosEntry(newdl);
95 if (dl != NULL)
97 if (dl->dol_Lock)
99 UnLock(dl->dol_Lock);
102 if (dl->dol_misc.dol_assign.dol_List != NULL)
104 struct AssignList *al, *oal;
106 for (al = dl->dol_misc.dol_assign.dol_List; al; )
108 UnLock(al->al_Lock);
109 oal = al;
110 al = al->al_Next;
111 FreeVec(oal);
115 FreeVec(dl->dol_misc.dol_assign.dol_AssignName);
116 FreeDosEntry(dl);
119 UnLockDosList(LDF_ALL | LDF_WRITE);
121 return success;
123 AROS_LIBFUNC_EXIT
124 } /* AssignLock */