2 * Copyright 2012 Haiku, Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
6 * Paweł Dziepak, pdziepak@quarnos.org
12 #include <AutoDeleter.h>
13 #include <FindDirectory.h>
15 #include <util/AutoLock.h>
17 #include "idmapper/IdMapper.h"
20 IdMap
* gIdMapper
= NULL
;
26 mutex_init(&fLock
, NULL
);
27 fInitStatus
= _Repair();
33 delete_port(fRequestPort
);
34 delete_port(fReplyPort
);
35 mutex_destroy(&fLock
);
40 IdMap::GetUserId(const char* owner
)
42 ASSERT(owner
!= NULL
);
43 return _GetValue
<uid_t
>(owner
, MsgNameToUID
);
48 IdMap::GetGroupId(const char* ownerGroup
)
50 ASSERT(ownerGroup
!= NULL
);
51 return _GetValue
<gid_t
>(ownerGroup
, MsgNameToGID
);
56 IdMap::GetOwner(uid_t user
)
58 return reinterpret_cast<char*>(_GetBuffer(user
, MsgUIDToName
));
63 IdMap::GetOwnerGroup(gid_t group
)
65 return reinterpret_cast<char*>(_GetBuffer(group
, MsgGIDToName
));
71 IdMap::_GetValue(const char* buffer
, int32 code
)
73 ASSERT(buffer
!= NULL
);
77 status_t result
= write_port(fRequestPort
, MsgNameToUID
, buffer
,
80 if (_Repair() != B_OK
)
87 result
= read_port(fReplyPort
, &code
, &value
, sizeof(T
));
89 if (_Repair() != B_OK
)
104 IdMap::_GetBuffer(T value
, int32 code
)
106 MutexLocker
_(fLock
);
108 status_t result
= write_port(fRequestPort
, code
, &value
, sizeof(value
));
109 if (result
!= B_OK
) {
110 if (_Repair() != B_OK
)
115 ssize_t size
= port_buffer_size(fReplyPort
);
117 if (_Repair() != B_OK
)
123 void* buffer
= malloc(size
);
126 MemoryDeleter
bufferDeleter(buffer
);
128 size
= read_port(fReplyPort
, &code
, buffer
, size
);
130 if (_Repair() != B_OK
)
135 if (code
!= MsgReply
)
138 bufferDeleter
.Detach();
147 status_t result
= B_OK
;
149 fRequestPort
= create_port(1, kRequestPortName
);
150 if (fRequestPort
< B_OK
)
153 fReplyPort
= create_port(1, kReplyPortName
);
154 if (fReplyPort
< B_OK
) {
155 delete_port(fRequestPort
);
160 if (find_directory(B_SYSTEM_SERVERS_DIRECTORY
, static_cast<dev_t
>(-1),
161 false, path
, sizeof(path
)) != B_OK
) {
162 delete_port(fReplyPort
);
163 delete_port(fRequestPort
);
164 return B_NAME_NOT_FOUND
;
166 strlcat(path
, "/nfs4_idmapper_server", sizeof(path
));
168 const char* args
[] = { path
, NULL
};
169 thread_id thread
= load_image_etc(1, args
, NULL
, B_NORMAL_PRIORITY
,
172 delete_port(fReplyPort
);
173 delete_port(fRequestPort
);
177 set_port_owner(fRequestPort
, thread
);
178 set_port_owner(fReplyPort
, thread
);
180 result
= resume_thread(thread
);
181 if (result
!= B_OK
) {
183 delete_port(fReplyPort
);
184 delete_port(fRequestPort
);