Implement setres[ug]id() and getres[ug]id(). This has been sitting in
my tree for ages (~2 years) waiting for an excuse to commit it. Now Linux has implemented it and it seems that Staroffice (when using the linux_base6.1 port's libc) calls this in the linux emulator and dies in setup. The Linux emulator can call these now.
This commit is contained in:
parent
0a471babfd
commit
75fd4c5f10
@ -3,7 +3,7 @@
|
||||
*
|
||||
* DO NOT EDIT-- this file is automatically generated.
|
||||
* $FreeBSD$
|
||||
* created from FreeBSD: src/sys/kern/syscalls.master,v 1.69 1999/12/21 20:21:11 alfred Exp
|
||||
* created from FreeBSD: src/sys/kern/syscalls.master,v 1.71 2000/01/16 16:30:50 peter Exp
|
||||
*/
|
||||
|
||||
#include "opt_compat.h"
|
||||
@ -331,8 +331,8 @@ struct sysent sysent[] = {
|
||||
{ 2, (sy_call_t *)kldstat }, /* 308 = kldstat */
|
||||
{ 1, (sy_call_t *)kldfirstmod }, /* 309 = kldfirstmod */
|
||||
{ 1, (sy_call_t *)getsid }, /* 310 = getsid */
|
||||
{ 0, (sy_call_t *)nosys }, /* 311 = setresuid */
|
||||
{ 0, (sy_call_t *)nosys }, /* 312 = setresgid */
|
||||
{ 3, (sy_call_t *)setresuid }, /* 311 = setresuid */
|
||||
{ 3, (sy_call_t *)setresgid }, /* 312 = setresgid */
|
||||
{ 0, (sy_call_t *)nosys }, /* 313 = obsolete signanosleep */
|
||||
{ 1, (sy_call_t *)aio_return }, /* 314 = aio_return */
|
||||
{ 3, (sy_call_t *)aio_suspend }, /* 315 = aio_suspend */
|
||||
@ -380,4 +380,6 @@ struct sysent sysent[] = {
|
||||
{ 4, (sy_call_t *)extattr_get_file }, /* 357 = extattr_get_file */
|
||||
{ 2, (sy_call_t *)extattr_delete_file }, /* 358 = extattr_delete_file */
|
||||
{ 2, (sy_call_t *)aio_waitcomplete }, /* 359 = aio_waitcomplete */
|
||||
{ 3, (sy_call_t *)getresuid }, /* 360 = getresuid */
|
||||
{ 3, (sy_call_t *)getresgid }, /* 361 = getresgid */
|
||||
};
|
||||
|
@ -716,6 +716,164 @@ setregid(p, uap)
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* setresuid(ruid, euid, suid) is like setreuid except control over the
|
||||
* saved uid is explicit.
|
||||
*/
|
||||
|
||||
#ifndef _SYS_SYSPROTO_H_
|
||||
struct setresuid_args {
|
||||
uid_t ruid;
|
||||
uid_t euid;
|
||||
uid_t suid;
|
||||
};
|
||||
#endif
|
||||
/* ARGSUSED */
|
||||
int
|
||||
setresuid(p, uap)
|
||||
register struct proc *p;
|
||||
struct setresuid_args *uap;
|
||||
{
|
||||
register struct pcred *pc = p->p_cred;
|
||||
register uid_t ruid, euid, suid;
|
||||
int error;
|
||||
|
||||
ruid = uap->ruid;
|
||||
euid = uap->euid;
|
||||
suid = uap->suid;
|
||||
if (((ruid != (uid_t)-1 && ruid != pc->p_ruid && ruid != pc->p_svuid &&
|
||||
ruid != pc->pc_ucred->cr_uid) ||
|
||||
(euid != (uid_t)-1 && euid != pc->p_ruid && euid != pc->p_svuid &&
|
||||
euid != pc->pc_ucred->cr_uid) ||
|
||||
(suid != (uid_t)-1 && suid != pc->p_ruid && suid != pc->p_svuid &&
|
||||
suid != pc->pc_ucred->cr_uid)) &&
|
||||
(error = suser_xxx(0, p, PRISON_ROOT)) != 0)
|
||||
return (error);
|
||||
if (euid != (uid_t)-1 && pc->pc_ucred->cr_uid != euid) {
|
||||
pc->pc_ucred = crcopy(pc->pc_ucred);
|
||||
pc->pc_ucred->cr_uid = euid;
|
||||
setsugid(p);
|
||||
}
|
||||
if (ruid != (uid_t)-1 && pc->p_ruid != ruid) {
|
||||
(void)chgproccnt(pc->p_ruid, -1);
|
||||
(void)chgproccnt(ruid, 1);
|
||||
pc->p_ruid = ruid;
|
||||
setsugid(p);
|
||||
}
|
||||
if (suid != (uid_t)-1 && pc->p_svuid != suid) {
|
||||
pc->p_svuid = suid;
|
||||
setsugid(p);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* setresgid(rgid, egid, sgid) is like setregid except control over the
|
||||
* saved gid is explicit.
|
||||
*/
|
||||
|
||||
#ifndef _SYS_SYSPROTO_H_
|
||||
struct setresgid_args {
|
||||
gid_t rgid;
|
||||
gid_t egid;
|
||||
gid_t sgid;
|
||||
};
|
||||
#endif
|
||||
/* ARGSUSED */
|
||||
int
|
||||
setresgid(p, uap)
|
||||
register struct proc *p;
|
||||
struct setresgid_args *uap;
|
||||
{
|
||||
register struct pcred *pc = p->p_cred;
|
||||
register gid_t rgid, egid, sgid;
|
||||
int error;
|
||||
|
||||
rgid = uap->rgid;
|
||||
egid = uap->egid;
|
||||
sgid = uap->sgid;
|
||||
if (((rgid != (gid_t)-1 && rgid != pc->p_rgid && rgid != pc->p_svgid &&
|
||||
rgid != pc->pc_ucred->cr_groups[0]) ||
|
||||
(egid != (gid_t)-1 && egid != pc->p_rgid && egid != pc->p_svgid &&
|
||||
egid != pc->pc_ucred->cr_groups[0]) ||
|
||||
(sgid != (gid_t)-1 && sgid != pc->p_rgid && sgid != pc->p_svgid &&
|
||||
sgid != pc->pc_ucred->cr_groups[0])) &&
|
||||
(error = suser_xxx(0, p, PRISON_ROOT)) != 0)
|
||||
return (error);
|
||||
|
||||
if (egid != (gid_t)-1 && pc->pc_ucred->cr_groups[0] != egid) {
|
||||
pc->pc_ucred = crcopy(pc->pc_ucred);
|
||||
pc->pc_ucred->cr_groups[0] = egid;
|
||||
setsugid(p);
|
||||
}
|
||||
if (rgid != (gid_t)-1 && pc->p_rgid != rgid) {
|
||||
pc->p_rgid = rgid;
|
||||
setsugid(p);
|
||||
}
|
||||
if (sgid != (gid_t)-1 && pc->p_svgid != sgid) {
|
||||
pc->p_svgid = sgid;
|
||||
setsugid(p);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
#ifndef _SYS_SYSPROTO_H_
|
||||
struct getresuid_args {
|
||||
uid_t *ruid;
|
||||
uid_t *euid;
|
||||
uid_t *suid;
|
||||
};
|
||||
#endif
|
||||
/* ARGSUSED */
|
||||
int
|
||||
getresuid(p, uap)
|
||||
register struct proc *p;
|
||||
struct getresuid_args *uap;
|
||||
{
|
||||
struct pcred *pc = p->p_cred;
|
||||
int error1 = 0, error2 = 0, error3 = 0;
|
||||
|
||||
if (uap->ruid)
|
||||
error1 = copyout((caddr_t)&pc->p_ruid,
|
||||
(caddr_t)uap->ruid, sizeof(pc->p_ruid));
|
||||
if (uap->euid)
|
||||
error2 = copyout((caddr_t)&pc->pc_ucred->cr_uid,
|
||||
(caddr_t)uap->euid, sizeof(pc->pc_ucred->cr_uid));
|
||||
if (uap->suid)
|
||||
error3 = copyout((caddr_t)&pc->p_svuid,
|
||||
(caddr_t)uap->suid, sizeof(pc->p_svuid));
|
||||
return error1 ? error1 : (error2 ? error2 : error3);
|
||||
}
|
||||
|
||||
#ifndef _SYS_SYSPROTO_H_
|
||||
struct getresgid_args {
|
||||
gid_t *rgid;
|
||||
gid_t *egid;
|
||||
gid_t *sgid;
|
||||
};
|
||||
#endif
|
||||
/* ARGSUSED */
|
||||
int
|
||||
getresgid(p, uap)
|
||||
register struct proc *p;
|
||||
struct getresgid_args *uap;
|
||||
{
|
||||
struct pcred *pc = p->p_cred;
|
||||
int error1 = 0, error2 = 0, error3 = 0;
|
||||
|
||||
if (uap->rgid)
|
||||
error1 = copyout((caddr_t)&pc->p_rgid,
|
||||
(caddr_t)uap->rgid, sizeof(pc->p_rgid));
|
||||
if (uap->egid)
|
||||
error2 = copyout((caddr_t)&pc->pc_ucred->cr_groups[0],
|
||||
(caddr_t)uap->egid, sizeof(pc->pc_ucred->cr_groups[0]));
|
||||
if (uap->sgid)
|
||||
error3 = copyout((caddr_t)&pc->p_svgid,
|
||||
(caddr_t)uap->sgid, sizeof(pc->p_svgid));
|
||||
return error1 ? error1 : (error2 ? error2 : error3);
|
||||
}
|
||||
|
||||
|
||||
#ifndef _SYS_SYSPROTO_H_
|
||||
struct issetugid_args {
|
||||
int dummy;
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* DO NOT EDIT-- this file is automatically generated.
|
||||
* $FreeBSD$
|
||||
* created from FreeBSD: src/sys/kern/syscalls.master,v 1.69 1999/12/21 20:21:11 alfred Exp
|
||||
* created from FreeBSD: src/sys/kern/syscalls.master,v 1.71 2000/01/16 16:30:50 peter Exp
|
||||
*/
|
||||
|
||||
char *syscallnames[] = {
|
||||
@ -318,8 +318,8 @@ char *syscallnames[] = {
|
||||
"kldstat", /* 308 = kldstat */
|
||||
"kldfirstmod", /* 309 = kldfirstmod */
|
||||
"getsid", /* 310 = getsid */
|
||||
"#311", /* 311 = setresuid */
|
||||
"#312", /* 312 = setresgid */
|
||||
"setresuid", /* 311 = setresuid */
|
||||
"setresgid", /* 312 = setresgid */
|
||||
"obs_signanosleep", /* 313 = obsolete signanosleep */
|
||||
"aio_return", /* 314 = aio_return */
|
||||
"aio_suspend", /* 315 = aio_suspend */
|
||||
@ -367,4 +367,6 @@ char *syscallnames[] = {
|
||||
"extattr_get_file", /* 357 = extattr_get_file */
|
||||
"extattr_delete_file", /* 358 = extattr_delete_file */
|
||||
"aio_waitcomplete", /* 359 = aio_waitcomplete */
|
||||
"getresuid", /* 360 = getresuid */
|
||||
"getresgid", /* 361 = getresgid */
|
||||
};
|
||||
|
@ -443,8 +443,8 @@
|
||||
308 STD BSD { int kldstat(int fileid, struct kld_file_stat* stat); }
|
||||
309 STD BSD { int kldfirstmod(int fileid); }
|
||||
310 STD BSD { int getsid(pid_t pid); }
|
||||
311 UNIMPL NOHIDE setresuid
|
||||
312 UNIMPL NOHIDE setresgid
|
||||
311 STD BSD { int setresuid(uid_t ruid, uid_t euid, uid_t suid); }
|
||||
312 STD BSD { int setresgid(gid_t rgid, gid_t egid, gid_t sgid); }
|
||||
313 OBSOL NOHIDE signanosleep
|
||||
314 STD BSD { int aio_return(struct aiocb *aiocbp); }
|
||||
315 STD BSD { int aio_suspend(struct aiocb * const * aiocbp, int nent, const struct timespec *timeout); }
|
||||
@ -498,3 +498,5 @@
|
||||
357 STD BSD { int extattr_get_file(char *path, char *attrname, struct iovec *iovp, u_int iovcnt); }
|
||||
358 STD BSD { int extattr_delete_file(char *path, char *attrname); }
|
||||
359 STD BSD { int aio_waitcomplete(struct aiocb **aiocbp, struct timespec *timeout); }
|
||||
360 STD BSD { int getresuid(uid_t *ruid, uid_t *euid, uid_t *suid); }
|
||||
361 STD BSD { int getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid); }
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* DO NOT EDIT-- this file is automatically generated.
|
||||
* $FreeBSD$
|
||||
* created from FreeBSD: src/sys/kern/syscalls.master,v 1.69 1999/12/21 20:21:11 alfred Exp
|
||||
* created from FreeBSD: src/sys/kern/syscalls.master,v 1.71 2000/01/16 16:30:50 peter Exp
|
||||
*/
|
||||
|
||||
HIDE_POSIX(fork)
|
||||
@ -231,6 +231,8 @@ HIDE_BSD(kldnext)
|
||||
HIDE_BSD(kldstat)
|
||||
HIDE_BSD(kldfirstmod)
|
||||
HIDE_BSD(getsid)
|
||||
HIDE_BSD(setresuid)
|
||||
HIDE_BSD(setresgid)
|
||||
HIDE_BSD(aio_return)
|
||||
HIDE_BSD(aio_suspend)
|
||||
HIDE_BSD(aio_cancel)
|
||||
@ -275,3 +277,5 @@ HIDE_BSD(extattr_set_file)
|
||||
HIDE_BSD(extattr_get_file)
|
||||
HIDE_BSD(extattr_delete_file)
|
||||
HIDE_BSD(aio_waitcomplete)
|
||||
HIDE_BSD(getresuid)
|
||||
HIDE_BSD(getresgid)
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* DO NOT EDIT-- this file is automatically generated.
|
||||
* $FreeBSD$
|
||||
* created from FreeBSD: src/sys/kern/syscalls.master,v 1.69 1999/12/21 20:21:11 alfred Exp
|
||||
* created from FreeBSD: src/sys/kern/syscalls.master,v 1.71 2000/01/16 16:30:50 peter Exp
|
||||
*/
|
||||
|
||||
#define SYS_syscall 0
|
||||
@ -236,6 +236,8 @@
|
||||
#define SYS_kldstat 308
|
||||
#define SYS_kldfirstmod 309
|
||||
#define SYS_getsid 310
|
||||
#define SYS_setresuid 311
|
||||
#define SYS_setresgid 312
|
||||
/* 313 is obsolete signanosleep */
|
||||
#define SYS_aio_return 314
|
||||
#define SYS_aio_suspend 315
|
||||
@ -280,4 +282,6 @@
|
||||
#define SYS_extattr_get_file 357
|
||||
#define SYS_extattr_delete_file 358
|
||||
#define SYS_aio_waitcomplete 359
|
||||
#define SYS_MAXSYSCALL 360
|
||||
#define SYS_getresuid 360
|
||||
#define SYS_getresgid 361
|
||||
#define SYS_MAXSYSCALL 362
|
||||
|
@ -1,7 +1,7 @@
|
||||
# FreeBSD system call names.
|
||||
# DO NOT EDIT-- this file is automatically generated.
|
||||
# $FreeBSD$
|
||||
# created from FreeBSD: src/sys/kern/syscalls.master,v 1.69 1999/12/21 20:21:11 alfred Exp
|
||||
# created from FreeBSD: src/sys/kern/syscalls.master,v 1.71 2000/01/16 16:30:50 peter Exp
|
||||
MIASM = \
|
||||
syscall.o \
|
||||
exit.o \
|
||||
@ -188,6 +188,8 @@ MIASM = \
|
||||
kldstat.o \
|
||||
kldfirstmod.o \
|
||||
getsid.o \
|
||||
setresuid.o \
|
||||
setresgid.o \
|
||||
aio_return.o \
|
||||
aio_suspend.o \
|
||||
aio_cancel.o \
|
||||
@ -230,4 +232,6 @@ MIASM = \
|
||||
extattr_set_file.o \
|
||||
extattr_get_file.o \
|
||||
extattr_delete_file.o \
|
||||
aio_waitcomplete.o
|
||||
aio_waitcomplete.o \
|
||||
getresuid.o \
|
||||
getresgid.o
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* DO NOT EDIT-- this file is automatically generated.
|
||||
* $FreeBSD$
|
||||
* created from FreeBSD: src/sys/kern/syscalls.master,v 1.69 1999/12/21 20:21:11 alfred Exp
|
||||
* created from FreeBSD: src/sys/kern/syscalls.master,v 1.71 2000/01/16 16:30:50 peter Exp
|
||||
*/
|
||||
|
||||
#ifndef _SYS_SYSPROTO_H_
|
||||
@ -814,6 +814,16 @@ struct kldfirstmod_args {
|
||||
struct getsid_args {
|
||||
pid_t pid; char pid_[PAD_(pid_t)];
|
||||
};
|
||||
struct setresuid_args {
|
||||
uid_t ruid; char ruid_[PAD_(uid_t)];
|
||||
uid_t euid; char euid_[PAD_(uid_t)];
|
||||
uid_t suid; char suid_[PAD_(uid_t)];
|
||||
};
|
||||
struct setresgid_args {
|
||||
gid_t rgid; char rgid_[PAD_(gid_t)];
|
||||
gid_t egid; char egid_[PAD_(gid_t)];
|
||||
gid_t sgid; char sgid_[PAD_(gid_t)];
|
||||
};
|
||||
struct aio_return_args {
|
||||
struct aiocb * aiocbp; char aiocbp_[PAD_(struct aiocb *)];
|
||||
};
|
||||
@ -993,6 +1003,16 @@ struct aio_waitcomplete_args {
|
||||
struct aiocb ** aiocbp; char aiocbp_[PAD_(struct aiocb **)];
|
||||
struct timespec * timeout; char timeout_[PAD_(struct timespec *)];
|
||||
};
|
||||
struct getresuid_args {
|
||||
uid_t * ruid; char ruid_[PAD_(uid_t *)];
|
||||
uid_t * euid; char euid_[PAD_(uid_t *)];
|
||||
uid_t * suid; char suid_[PAD_(uid_t *)];
|
||||
};
|
||||
struct getresgid_args {
|
||||
gid_t * rgid; char rgid_[PAD_(gid_t *)];
|
||||
gid_t * egid; char egid_[PAD_(gid_t *)];
|
||||
gid_t * sgid; char sgid_[PAD_(gid_t *)];
|
||||
};
|
||||
int nosys __P((struct proc *, struct nosys_args *));
|
||||
void exit __P((struct proc *, struct rexit_args *)) __dead2;
|
||||
int fork __P((struct proc *, struct fork_args *));
|
||||
@ -1176,6 +1196,8 @@ int kldnext __P((struct proc *, struct kldnext_args *));
|
||||
int kldstat __P((struct proc *, struct kldstat_args *));
|
||||
int kldfirstmod __P((struct proc *, struct kldfirstmod_args *));
|
||||
int getsid __P((struct proc *, struct getsid_args *));
|
||||
int setresuid __P((struct proc *, struct setresuid_args *));
|
||||
int setresgid __P((struct proc *, struct setresgid_args *));
|
||||
int aio_return __P((struct proc *, struct aio_return_args *));
|
||||
int aio_suspend __P((struct proc *, struct aio_suspend_args *));
|
||||
int aio_cancel __P((struct proc *, struct aio_cancel_args *));
|
||||
@ -1219,6 +1241,8 @@ int extattr_set_file __P((struct proc *, struct extattr_set_file_args *));
|
||||
int extattr_get_file __P((struct proc *, struct extattr_get_file_args *));
|
||||
int extattr_delete_file __P((struct proc *, struct extattr_delete_file_args *));
|
||||
int aio_waitcomplete __P((struct proc *, struct aio_waitcomplete_args *));
|
||||
int getresuid __P((struct proc *, struct getresuid_args *));
|
||||
int getresgid __P((struct proc *, struct getresgid_args *));
|
||||
|
||||
#ifdef COMPAT_43
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user