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:
Olivier Certner 2023-05-29 19:09:36 +02:00 committed by Olivier Certner
parent aa96945e71
commit 7b94ec550e
No known key found for this signature in database
GPG key ID: 8CA13040971E2627

View file

@ -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) {