Files
haiku-beta6/src/system/libroot/posix/user_group_common.h
T
Ingo Weinhold f8cb30712e * Replaced the dummy implementations of the <grp.h> and <pwd.h>
functions by ones reading /etc/{group,passwd}.
* Added quasi-standard getpwent_r() and getgrent_r().
* Added _SC_GETGR_R_SIZE_MAX and _SC_GETPW_R_SIZE_MAX sysconf()
  constants.
* Moved initgroups() and getgrouplist() definition to grp.cpp. They use
  the same backend as the <grp.h> functions.
* Set the permissions of files created by the build system to what they
  should be on the image (executables: 755, others: 644). Otherwise only
  root could do anything under Haiku.
* Added build system variables HAIKU_ROOT_USER_NAME and
  HAIKU_ROOT_USER_REAL_NAME to customize name and real name of Haiku's
  root user.
* Added build system rules AddUserToHaikuImage and AddGroupToHaikuImage
  for adding additional users and groups (by default only root user and
  group and a "users" group are created).
* Adjusted BIND port and coreutils config.h files according to what
  features have become available.
* Fixed HAIKU_DOCUMENTATION_OBJECT_DIR definition. Untested, but it used
  a wrong variable name before.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24750 a95241bf-73f2-0310-859d-f6bbb57e9c96
2008-04-02 14:02:52 +00:00

240 lines
4.5 KiB
C++

/*
* Copyright 2008, Ingo Weinhold, [email protected]. All rights reserved.
* Distributed under the terms of the MIT License.
*/
#ifndef _LIBROOT_USER_GROUP_COMMON_H
#define _LIBROOT_USER_GROUP_COMMON_H
#include <grp.h>
#include <pwd.h>
#include <SupportDefs.h>
#include <AutoLocker.h>
namespace BPrivate {
class FileLineReader;
class Tokenizer;
extern const char* kPasswdFile;
extern const char* kGroupFile;
// locking
status_t user_group_lock();
status_t user_group_unlock();
class UserGroupLocking {
public:
inline bool Lock(int*)
{
return user_group_lock() == B_OK;
}
inline void Unlock(int*)
{
user_group_unlock();
}
};
class UserGroupLocker : public AutoLocker<int, UserGroupLocking> {
public:
UserGroupLocker()
: AutoLocker<int, UserGroupLocking>((int*)1)
{
}
};
// #pragma mark - File DB Base Classes
class FileDBEntry {
public:
FileDBEntry();
virtual ~FileDBEntry();
const char* Name() const { return fName; }
int32 ID() const { return fID; }
FileDBEntry* Next() const { return fNext; }
void SetNext(FileDBEntry* next) { fNext = next; }
virtual int CopyToBuffer(void* entryBuffer, char* buffer,
size_t bufferSize) = 0;
protected:
char* fName;
int32 fID;
FileDBEntry* fNext;
};
class FileDBReader {
public:
FileDBReader();
virtual ~FileDBReader();
status_t Read(const char* path);
protected:
virtual status_t ParseEntryLine(Tokenizer& tokenizer) = 0;
};
class FileDB {
public:
FileDB();
virtual ~FileDB();
int GetNextEntry(void* entryBuffer, char* buffer, size_t bufferSize);
void RewindEntries();
FileDBEntry* FindEntry(const char* name) const;
FileDBEntry* FindEntry(int32 id) const;
int GetEntry(const char* name, void* entryBuffer, char* buffer,
size_t bufferSize) const;
int GetEntry(int32 id, void* entryBuffer, char* buffer,
size_t bufferSize) const;
protected:
void AddEntry(FileDBEntry* entry);
protected:
FileDBEntry* fEntries;
FileDBEntry* fLastEntry;
};
// #pragma mark - Passwd DB
status_t
copy_passwd_to_buffer(const char* name, const char* password, uid_t uid,
gid_t gid, const char* home, const char* shell, const char* realName,
passwd* entry, char* buffer, size_t bufferSize);
class PasswdDBEntry : public FileDBEntry {
public:
PasswdDBEntry();
virtual ~PasswdDBEntry();
bool Init(const char* name, const char* password, uid_t uid, gid_t gid,
const char* home, const char* shell, const char* realName);
virtual int CopyToBuffer(void* entryBuffer, char* buffer,
size_t bufferSize);
protected:
gid_t fGID;
char* fPassword;
char* fHome;
char* fShell;
char* fRealName;
};
class PasswdEntryHandler {
public:
virtual ~PasswdEntryHandler();
virtual status_t HandleEntry(const char* name, const char* password,
uid_t uid, gid_t gid, const char* home, const char* shell,
const char* realName) = 0;
};
class PasswdDBReader : public FileDBReader {
public:
PasswdDBReader(PasswdEntryHandler* handler);
protected:
virtual status_t ParseEntryLine(Tokenizer& tokenizer);
private:
PasswdEntryHandler* fHandler;
};
class PasswdDB : public FileDB, private PasswdEntryHandler {
public:
status_t Init();
private:
virtual status_t HandleEntry(const char* name, const char* password,
uid_t uid, gid_t gid, const char* home, const char* shell,
const char* realName);
};
// #pragma mark - Group DB
status_t
copy_group_to_buffer(const char* name, const char* password, gid_t gid,
const char* const* members, int memberCount, group* entry, char* buffer,
size_t bufferSize);
class GroupDBEntry : public FileDBEntry {
public:
GroupDBEntry();
virtual ~GroupDBEntry();
bool Init(const char* name, const char* password, gid_t gid,
const char* const* members, int memberCount);
virtual int CopyToBuffer(void* entryBuffer, char* buffer,
size_t bufferSize);
protected:
char* fPassword;
char** fMembers;
int fMemberCount;
};
class GroupEntryHandler {
public:
virtual ~GroupEntryHandler();
virtual status_t HandleEntry(const char* name, const char* password,
gid_t gid, const char* const* members, int memberCount) = 0;
};
class GroupDBReader : public FileDBReader {
public:
GroupDBReader(GroupEntryHandler* handler);
protected:
virtual status_t ParseEntryLine(Tokenizer& tokenizer);
private:
GroupEntryHandler* fHandler;
};
class GroupDB : public FileDB, private GroupEntryHandler {
public:
status_t Init();
private:
virtual status_t HandleEntry(const char* name, const char* password,
gid_t gid, const char* const* members, int memberCount);
};
} // namespace BPrivate
#endif // _LIBROOT_USER_GROUP_COMMON_H