mirror of
https://github.com/freebsd/freebsd-src
synced 2024-07-22 10:48:02 +00:00
setusercontext(): Move priority setting in new setclasspriority()
In preparation for setting priorities from '~/.login_conf' and to ease reading of setusercontext(). No functional change. Reviewed by: emaste Approved by: emaste (mentor) MFC after: 3 days Sponsored by: Kumacom SAS Differential Revision: https://reviews.freebsd.org/D40350
This commit is contained in:
parent
aa96945e71
commit
7b94ec550e
|
@ -455,6 +455,56 @@ setlogincontext(login_cap_t *lc, const struct passwd *pwd, unsigned long flags)
|
|||
}
|
||||
|
||||
|
||||
/*
|
||||
* Private function to set process priority.
|
||||
*/
|
||||
static void
|
||||
setclasspriority(login_cap_t * const lc, struct passwd const * const pwd)
|
||||
{
|
||||
const rlim_t def_val = LOGIN_DEFPRI, err_val = INT64_MIN;
|
||||
rlim_t p = login_getcapnum(lc, "priority", def_val, err_val);
|
||||
int rc;
|
||||
|
||||
if (p == err_val) {
|
||||
/* Invariant: 'lc' != NULL. */
|
||||
syslog(LOG_WARNING,
|
||||
"%s%s%sLogin class '%s': "
|
||||
"Invalid priority specification: '%s'",
|
||||
pwd ? "Login '" : "",
|
||||
pwd ? pwd->pw_name : "",
|
||||
pwd ? "': " : "",
|
||||
lc->lc_class,
|
||||
login_getcapstr(lc, "priority", "", ""));
|
||||
/* Reset the priority, as if the capability was not present. */
|
||||
p = def_val;
|
||||
}
|
||||
|
||||
if (p > PRIO_MAX) {
|
||||
struct rtprio rtp;
|
||||
|
||||
rtp.type = RTP_PRIO_IDLE;
|
||||
p += RTP_PRIO_MIN - (PRIO_MAX + 1);
|
||||
rtp.prio = p > RTP_PRIO_MAX ? RTP_PRIO_MAX : p;
|
||||
rc = rtprio(RTP_SET, 0, &rtp);
|
||||
} else if (p < PRIO_MIN) {
|
||||
struct rtprio rtp;
|
||||
|
||||
rtp.type = RTP_PRIO_REALTIME;
|
||||
p += RTP_PRIO_MAX - (PRIO_MIN - 1);
|
||||
rtp.prio = p < RTP_PRIO_MIN ? RTP_PRIO_MIN : p;
|
||||
rc = rtprio(RTP_SET, 0, &rtp);
|
||||
} else
|
||||
rc = setpriority(PRIO_PROCESS, 0, (int)p);
|
||||
|
||||
if (rc != 0)
|
||||
syslog(LOG_WARNING,
|
||||
"%s%s%sLogin class '%s': "
|
||||
"Setting priority failed: %m",
|
||||
pwd ? "Login '" : "",
|
||||
pwd ? pwd->pw_name : "",
|
||||
pwd ? "': " : "",
|
||||
lc ? lc->lc_class : "<none>");
|
||||
}
|
||||
|
||||
/*
|
||||
* setusercontext()
|
||||
|
@ -489,51 +539,8 @@ setusercontext(login_cap_t *lc, const struct passwd *pwd, uid_t uid, unsigned in
|
|||
flags &= ~(LOGIN_SETGROUP | LOGIN_SETLOGIN | LOGIN_SETMAC);
|
||||
|
||||
/* Set the process priority */
|
||||
if (flags & LOGIN_SETPRIORITY) {
|
||||
const rlim_t def_val = LOGIN_DEFPRI, err_val = INT64_MIN;
|
||||
rlim_t p = login_getcapnum(lc, "priority", def_val, err_val);
|
||||
int rc;
|
||||
|
||||
if (p == err_val) {
|
||||
/* Invariant: 'lc' != NULL. */
|
||||
syslog(LOG_WARNING,
|
||||
"%s%s%sLogin class '%s': "
|
||||
"Invalid priority specification: '%s'",
|
||||
pwd ? "Login '" : "",
|
||||
pwd ? pwd->pw_name : "",
|
||||
pwd ? "': " : "",
|
||||
lc->lc_class,
|
||||
login_getcapstr(lc, "priority", "", ""));
|
||||
/* Reset the priority, as if the capability was not present. */
|
||||
p = def_val;
|
||||
}
|
||||
|
||||
if (p > PRIO_MAX) {
|
||||
struct rtprio rtp;
|
||||
|
||||
rtp.type = RTP_PRIO_IDLE;
|
||||
p += RTP_PRIO_MIN - (PRIO_MAX + 1);
|
||||
rtp.prio = p > RTP_PRIO_MAX ? RTP_PRIO_MAX : p;
|
||||
rc = rtprio(RTP_SET, 0, &rtp);
|
||||
} else if (p < PRIO_MIN) {
|
||||
struct rtprio rtp;
|
||||
|
||||
rtp.type = RTP_PRIO_REALTIME;
|
||||
p += RTP_PRIO_MAX - (PRIO_MIN - 1);
|
||||
rtp.prio = p < RTP_PRIO_MIN ? RTP_PRIO_MIN : p;
|
||||
rc = rtprio(RTP_SET, 0, &rtp);
|
||||
} else
|
||||
rc = setpriority(PRIO_PROCESS, 0, (int)p);
|
||||
|
||||
if (rc != 0)
|
||||
syslog(LOG_WARNING,
|
||||
"%s%s%sLogin class '%s': "
|
||||
"Setting priority failed: %m",
|
||||
pwd ? "Login '" : "",
|
||||
pwd ? pwd->pw_name : "",
|
||||
pwd ? "': " : "",
|
||||
lc ? lc->lc_class : "<none>");
|
||||
}
|
||||
if (flags & LOGIN_SETPRIORITY)
|
||||
setclasspriority(lc, pwd);
|
||||
|
||||
/* Setup the user's group permissions */
|
||||
if (flags & LOGIN_SETGROUP) {
|
||||
|
|
Loading…
Reference in a new issue