1c156e568583b911549c309bd7597b9056eff384
[AROS.git] / rom / dos / assignlock.c
blob1c156e568583b911549c309bd7597b9056eff384
1 /*
2 Copyright © 1995-2011, 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>
11 #include "dos_intern.h"
13 /*****************************************************************************
15 NAME */
16 #include <proto/dos.h>
18 AROS_LH2(LONG, 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;
59 if (lock != BNULL)
61 newdl = MakeDosEntry(name, DLT_DIRECTORY);
63 if (newdl == NULL)
64 return DOSFALSE;
65 else
67 struct FileLock *fl = BADDR(lock);
69 newdl->dol_Task = fl->fl_Task;
70 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 */