1 /*
2 * Copyright 2013 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 * Paweł Dziepak, pdziepak@quarnos.org
7 */
8
9
10 #include "InodeIdMap.h"
11
12
13 status_t
AddName(FileInfo & fileInfo,InodeNames * parent,const char * name,ino_t id)14 InodeIdMap::AddName(FileInfo& fileInfo, InodeNames* parent,
15 const char* name, ino_t id)
16 {
17 MutexLocker _(fLock);
18 AVLTreeMap<ino_t, FileInfo>::Iterator iterator = fMap.Find(id);
19 if (iterator.HasCurrent()) {
20 if (fileInfo.fHandle == iterator.Current().fHandle) {
21 return iterator.CurrentValuePointer()->fNames->AddName(parent,
22 name);
23 }
24 }
25
26 fMap.Remove(id);
27 fileInfo.fNames = new InodeNames;
28 if (fileInfo.fNames == NULL)
29 return B_NO_MEMORY;
30
31 fileInfo.fNames->fHandle = fileInfo.fHandle;
32 status_t result = fileInfo.fNames->AddName(parent, name);
33 if (result != B_OK) {
34 delete fileInfo.fNames;
35 return result;
36 }
37
38 return fMap.Insert(id, fileInfo);
39 }
40
41
42 bool
RemoveName(ino_t id,InodeNames * parent,const char * name)43 InodeIdMap::RemoveName(ino_t id, InodeNames* parent, const char* name)
44 {
45 ASSERT(name != NULL);
46
47 MutexLocker _(fLock);
48 AVLTreeMap<ino_t, FileInfo>::Iterator iterator = fMap.Find(id);
49 if (!iterator.HasCurrent())
50 return true;
51
52 FileInfo* fileInfo = iterator.CurrentValuePointer();
53
54 return fileInfo->fNames->RemoveName(parent, name);
55 }
56
57
58 status_t
RemoveEntry(ino_t id)59 InodeIdMap::RemoveEntry(ino_t id)
60 {
61 MutexLocker _(fLock);
62 return fMap.Remove(id);
63 }
64
65
66 status_t
GetFileInfo(FileInfo * fileInfo,ino_t id)67 InodeIdMap::GetFileInfo(FileInfo* fileInfo, ino_t id)
68 {
69 ASSERT(fileInfo != NULL);
70
71 MutexLocker _(fLock);
72 AVLTreeMap<ino_t, FileInfo>::Iterator iterator = fMap.Find(id);
73 if (!iterator.HasCurrent())
74 return B_ENTRY_NOT_FOUND;
75
76 *fileInfo = iterator.Current();
77 if (fileInfo->fNames->fNames.IsEmpty())
78 return B_ENTRY_NOT_FOUND;
79 return B_OK;
80 }
81
82