libbb: Add xsetegid(), xseteuid(), xopen_as_uid_gid() functions
Signed-off-by: Ryan Mallon <rmallon@gmail.com> Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
932e233a49
commit
5906a5c26c
@ -461,6 +461,8 @@ void record_signo(int signo); /* not FAST_FUNC! */
|
|||||||
|
|
||||||
void xsetgid(gid_t gid) FAST_FUNC;
|
void xsetgid(gid_t gid) FAST_FUNC;
|
||||||
void xsetuid(uid_t uid) FAST_FUNC;
|
void xsetuid(uid_t uid) FAST_FUNC;
|
||||||
|
void xsetegid(gid_t egid) FAST_FUNC;
|
||||||
|
void xseteuid(uid_t euid) FAST_FUNC;
|
||||||
void xchdir(const char *path) FAST_FUNC;
|
void xchdir(const char *path) FAST_FUNC;
|
||||||
void xchroot(const char *path) FAST_FUNC;
|
void xchroot(const char *path) FAST_FUNC;
|
||||||
void xsetenv(const char *key, const char *value) FAST_FUNC;
|
void xsetenv(const char *key, const char *value) FAST_FUNC;
|
||||||
@ -469,11 +471,12 @@ void bb_unsetenv_and_free(char *key) FAST_FUNC;
|
|||||||
void xunlink(const char *pathname) FAST_FUNC;
|
void xunlink(const char *pathname) FAST_FUNC;
|
||||||
void xstat(const char *pathname, struct stat *buf) FAST_FUNC;
|
void xstat(const char *pathname, struct stat *buf) FAST_FUNC;
|
||||||
void xfstat(int fd, struct stat *buf, const char *errmsg) FAST_FUNC;
|
void xfstat(int fd, struct stat *buf, const char *errmsg) FAST_FUNC;
|
||||||
|
int open3_or_warn(const char *pathname, int flags, int mode) FAST_FUNC;
|
||||||
|
int open_or_warn(const char *pathname, int flags) FAST_FUNC;
|
||||||
|
int xopen3(const char *pathname, int flags, int mode) FAST_FUNC;
|
||||||
int xopen(const char *pathname, int flags) FAST_FUNC;
|
int xopen(const char *pathname, int flags) FAST_FUNC;
|
||||||
int xopen_nonblocking(const char *pathname) FAST_FUNC;
|
int xopen_nonblocking(const char *pathname) FAST_FUNC;
|
||||||
int xopen3(const char *pathname, int flags, int mode) FAST_FUNC;
|
int xopen_as_uid_gid(const char *pathname, int flags, uid_t u, gid_t g) FAST_FUNC;
|
||||||
int open_or_warn(const char *pathname, int flags) FAST_FUNC;
|
|
||||||
int open3_or_warn(const char *pathname, int flags, int mode) FAST_FUNC;
|
|
||||||
int open_or_warn_stdin(const char *pathname) FAST_FUNC;
|
int open_or_warn_stdin(const char *pathname) FAST_FUNC;
|
||||||
int xopen_stdin(const char *pathname) FAST_FUNC;
|
int xopen_stdin(const char *pathname) FAST_FUNC;
|
||||||
void xrename(const char *oldpath, const char *newpath) FAST_FUNC;
|
void xrename(const char *oldpath, const char *newpath) FAST_FUNC;
|
||||||
|
@ -140,15 +140,6 @@ int FAST_FUNC xopen(const char *pathname, int flags)
|
|||||||
return xopen3(pathname, flags, 0666);
|
return xopen3(pathname, flags, 0666);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Die if we can't open an existing file readonly with O_NONBLOCK
|
|
||||||
* and return the fd.
|
|
||||||
* Note that for ioctl O_RDONLY is sufficient.
|
|
||||||
*/
|
|
||||||
int FAST_FUNC xopen_nonblocking(const char *pathname)
|
|
||||||
{
|
|
||||||
return xopen(pathname, O_RDONLY | O_NONBLOCK);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Warn if we can't open a file and return a fd.
|
// Warn if we can't open a file and return a fd.
|
||||||
int FAST_FUNC open3_or_warn(const char *pathname, int flags, int mode)
|
int FAST_FUNC open3_or_warn(const char *pathname, int flags, int mode)
|
||||||
{
|
{
|
||||||
@ -167,6 +158,32 @@ int FAST_FUNC open_or_warn(const char *pathname, int flags)
|
|||||||
return open3_or_warn(pathname, flags, 0666);
|
return open3_or_warn(pathname, flags, 0666);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Die if we can't open an existing file readonly with O_NONBLOCK
|
||||||
|
* and return the fd.
|
||||||
|
* Note that for ioctl O_RDONLY is sufficient.
|
||||||
|
*/
|
||||||
|
int FAST_FUNC xopen_nonblocking(const char *pathname)
|
||||||
|
{
|
||||||
|
return xopen(pathname, O_RDONLY | O_NONBLOCK);
|
||||||
|
}
|
||||||
|
|
||||||
|
int FAST_FUNC xopen_as_uid_gid(const char *pathname, int flags, uid_t u, gid_t g)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
uid_t old_euid = geteuid();
|
||||||
|
gid_t old_egid = getegid();
|
||||||
|
|
||||||
|
xsetegid(g);
|
||||||
|
xseteuid(u);
|
||||||
|
|
||||||
|
fd = xopen(pathname, flags);
|
||||||
|
|
||||||
|
xseteuid(old_euid);
|
||||||
|
xsetegid(old_egid);
|
||||||
|
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
void FAST_FUNC xunlink(const char *pathname)
|
void FAST_FUNC xunlink(const char *pathname)
|
||||||
{
|
{
|
||||||
if (unlink(pathname))
|
if (unlink(pathname))
|
||||||
@ -351,6 +368,16 @@ void FAST_FUNC xsetuid(uid_t uid)
|
|||||||
if (setuid(uid)) bb_perror_msg_and_die("setuid");
|
if (setuid(uid)) bb_perror_msg_and_die("setuid");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void FAST_FUNC xsetegid(gid_t egid)
|
||||||
|
{
|
||||||
|
if (setegid(egid)) bb_perror_msg_and_die("setegid");
|
||||||
|
}
|
||||||
|
|
||||||
|
void FAST_FUNC xseteuid(uid_t euid)
|
||||||
|
{
|
||||||
|
if (seteuid(euid)) bb_perror_msg_and_die("seteuid");
|
||||||
|
}
|
||||||
|
|
||||||
// Die if we can't chdir to a new path.
|
// Die if we can't chdir to a new path.
|
||||||
void FAST_FUNC xchdir(const char *path)
|
void FAST_FUNC xchdir(const char *path)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user