* Added real, effective and saved set- user and group IDs to the team
structure. They are properly inherited and updated on
fork(), load_image(), and exec().
* Implemented the get[e]{u,g}id(), set[[r]e]{u,g}id() family for real.
* getgroups() also calls the kernel now, but only returns the effective
group ID. Supplementary groups support is still missing.
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@24359 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -159,13 +159,15 @@ extern pid_t setpgrp(void);
|
||||
extern gid_t getegid(void);
|
||||
extern uid_t geteuid(void);
|
||||
extern gid_t getgid(void);
|
||||
extern int getgroups(int groupSize, gid_t groupList[]);
|
||||
extern uid_t getuid(void);
|
||||
extern int getgroups(int groupSize, gid_t groupList[]);
|
||||
|
||||
extern int setgid(gid_t gid);
|
||||
extern int setuid(uid_t uid);
|
||||
extern int setegid(gid_t gid);
|
||||
extern int seteuid(uid_t uid);
|
||||
extern int setregid(gid_t rgid, gid_t egid);
|
||||
extern int setreuid(uid_t ruid, uid_t euid);
|
||||
|
||||
extern char *getlogin(void);
|
||||
extern int getlogin_r(char *name, size_t nameSize);
|
||||
|
||||
@@ -113,6 +113,15 @@ extern status_t _kern_get_team_info(team_id id, team_info *info);
|
||||
extern status_t _kern_get_next_team_info(int32 *cookie, team_info *info);
|
||||
extern status_t _kern_get_team_usage_info(team_id team, int32 who, team_usage_info *info, size_t size);
|
||||
|
||||
// user/group functions
|
||||
extern gid_t _kern_getgid(bool effective);
|
||||
extern uid_t _kern_getuid(bool effective);
|
||||
extern ssize_t _kern_getgroups(int groupSize, gid_t* groupList);
|
||||
extern status_t _kern_setregid(gid_t rgid, gid_t egid,
|
||||
bool setAllIfPrivileged);
|
||||
extern status_t _kern_setreuid(uid_t ruid, uid_t euid,
|
||||
bool setAllIfPrivileged);
|
||||
|
||||
// signal functions
|
||||
extern status_t _kern_send_signal(pid_t tid, uint sig);
|
||||
extern status_t _kern_sigprocmask(int how, const sigset_t *set,
|
||||
|
||||
@@ -189,6 +189,13 @@ struct team {
|
||||
|
||||
bigtime_t dead_threads_kernel_time;
|
||||
bigtime_t dead_threads_user_time;
|
||||
|
||||
uid_t saved_set_uid;
|
||||
uid_t real_uid;
|
||||
uid_t effective_uid;
|
||||
gid_t saved_set_gid;
|
||||
gid_t real_gid;
|
||||
gid_t effective_gid;
|
||||
};
|
||||
|
||||
typedef int32 (*thread_entry_func)(thread_func, void *);
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
/*
|
||||
* Copyright 2008, Ingo Weinhold, ingo_weinhold@gmx.de.
|
||||
* Distributed under the terms of the MIT License.
|
||||
*/
|
||||
#ifndef _KERNEL_USERGROUP_H
|
||||
#define _KERNEL_USERGROUP_H
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
#include <SupportDefs.h>
|
||||
|
||||
|
||||
struct team;
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// kernel private functions
|
||||
|
||||
void inherit_parent_user_and_group(struct team* team,
|
||||
struct team* parent);
|
||||
status_t update_set_id_user_and_group(struct team* team, const char* file);
|
||||
|
||||
// syscalls
|
||||
|
||||
gid_t _user_getgid(bool effective);
|
||||
uid_t _user_getuid(bool effective);
|
||||
ssize_t _user_getgroups(int groupSize, gid_t* groupList);
|
||||
status_t _user_setregid(gid_t rgid, gid_t egid, bool setAllIfPrivileged);
|
||||
status_t _user_setreuid(uid_t ruid, uid_t euid, bool setAllIfPrivileged);
|
||||
|
||||
#ifdef __cplusplus
|
||||
} // extern "C"
|
||||
#endif
|
||||
|
||||
|
||||
#endif // _KERNEL_USERGROUP_H
|
||||
Reference in New Issue
Block a user