* 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:
Ingo Weinhold
2008-03-11 17:12:02 +00:00
parent 1149e982f0
commit 4eb3560949
12 changed files with 479 additions and 95 deletions
+3 -1
View File
@@ -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);
+9
View File
@@ -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,
+7
View File
@@ -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 *);
+39
View File
@@ -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