And applied the rest, thanks! Samuel
[email protected], le mer. 20 mai 2026 23:49:27 +0100, a ecrit: > From: Diego Nieto Cid <[email protected]> > > Check for task_max_priority RPC > > * config.h.in: add #undef for HAVE_MACH_TASK_MAX_PRIORITY. > * sysdeps/mach/configure.ac: use mach_RPC_CHECK to check for > task_max_priority RPC in mach_host.defs. > * sysdeps/mach/configure: regenerate file. > > Use task_max_priority when setpriority is called by root > > * sysdeps/mach/hurd/setpriority.c: clamp the prio argument > to the range [-NZERO, NZERO-1] and use task_max_priority > when called by root. > --- > config.h.in | 3 +++ > sysdeps/mach/configure | 30 ++++++++++++++++++++++++ > sysdeps/mach/configure.ac | 2 ++ > sysdeps/mach/hurd/setpriority.c | 41 +++++++++++++++++++++++++++++++-- > 4 files changed, 74 insertions(+), 2 deletions(-) > > diff --git a/config.h.in b/config.h.in > index b53731c393..87befaa9c6 100644 > --- a/config.h.in > +++ b/config.h.in > @@ -170,6 +170,9 @@ > /* Mach specific: define if the `vm_set_size_limit' RPC is available. */ > #undef HAVE_MACH_VM_SET_SIZE_LIMIT > > +/* Mach specific: define if the `task_max_priority' RPC is available. */ > +#undef HAVE_MACH_TASK_MAX_PRIORITY > + > /* Mach/i386 specific: define if the `i386_io_perm_*' RPCs are available. */ > #undef HAVE_I386_IO_PERM_MODIFY > > diff --git a/sysdeps/mach/configure b/sysdeps/mach/configure > index 0161937ab4..a725cd1c7d 100755 > --- a/sysdeps/mach/configure > +++ b/sysdeps/mach/configure > @@ -641,6 +641,36 @@ if test $libc_cv_mach_rpc_vm_get_size_limit = yes; then > > fi > > +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: checking for task_max_priority > in mach_host.defs" >&5 > +printf %s "checking for task_max_priority in mach_host.defs... " >&6; } > +if test ${libc_cv_mach_rpc_task_max_priority+y} > +then : > + printf %s "(cached) " >&6 > +else case e in #( > + e) cat confdefs.h - <<_ACEOF >conftest.$ac_ext > +/* end confdefs.h. */ > +#include <mach/mach_host.defs> > + > +_ACEOF > +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | > + $EGREP_TRADITIONAL "task_max_priority" >/dev/null 2>&1 > +then : > + libc_cv_mach_rpc_task_max_priority=yes > +else case e in #( > + e) libc_cv_mach_rpc_task_max_priority=no ;; > +esac > +fi > +rm -rf conftest* > + ;; > +esac > +fi > +{ printf "%s\n" "$as_me:${as_lineno-$LINENO}: result: > $libc_cv_mach_rpc_task_max_priority" >&5 > +printf "%s\n" "$libc_cv_mach_rpc_task_max_priority" >&6; } > +if test $libc_cv_mach_rpc_task_max_priority = yes; then > + printf "%s\n" "#define HAVE_MACH_TASK_MAX_PRIORITY 1" >>confdefs.h > + > +fi > + > > ac_fn_c_check_header_preproc "$LINENO" "mach/machine/ndr_def.h" > "ac_cv_header_mach_machine_ndr_def_h" > if test "x$ac_cv_header_mach_machine_ndr_def_h" = xyes > diff --git a/sysdeps/mach/configure.ac b/sysdeps/mach/configure.ac > index 237b8be937..b591e6fd9b 100644 > --- a/sysdeps/mach/configure.ac > +++ b/sysdeps/mach/configure.ac > @@ -104,6 +104,8 @@ mach_RPC_CHECK(gnumach.defs, vm_set_size_limit, > HAVE_MACH_VM_SET_SIZE_LIMIT) > mach_RPC_CHECK(gnumach.defs, vm_get_size_limit, > HAVE_MACH_VM_GET_SIZE_LIMIT) > +mach_RPC_CHECK(mach_host.defs, task_max_priority, > + HAVE_MACH_TASK_MAX_PRIORITY) > > AC_CHECK_HEADER(mach/machine/ndr_def.h, [dnl > DEFINES="$DEFINES -DNDR_DEF_HEADER='<mach/machine/ndr_def.h>'"], [dnl > diff --git a/sysdeps/mach/hurd/setpriority.c b/sysdeps/mach/hurd/setpriority.c > index 23d678bf40..bda13b0d7f 100644 > --- a/sysdeps/mach/hurd/setpriority.c > +++ b/sysdeps/mach/hurd/setpriority.c > @@ -28,7 +28,30 @@ __setpriority (enum __priority_which which, id_t who, int > prio) > error_t pidloser, priloser; > unsigned int npids, ntasks, nwin, nperm, nacces; > > - prio = MAX (0, MIN (2 * NZERO - 1, prio)); > + /* * man getpriority(2) (i.e. man7.org) > + * > + * << The prio argument is a value in the range -20 to 19. >> > + * > + * * man nice(2) (i.e. man7.org) > + * > + * << Attempts to set a nice value outside the range are > + * clamped to the range. >> > + * > + * * The Open Group Base Specifications Issue 8 > + * getpriority ( https://pubs.opengroup.org/onlinepubs/9799919799/ ) > + * > + * << The nice value is in the range [0,2*{NZERO} -1], while the > + * return value for getpriority() and the third parameter for > + * setpriority() are in the range [-{NZERO},{NZERO} -1]. >> > + * > + * So given that NZERO is defined to 20, we can use it to clamp to > + * the range specified by POSIX, in concordance with the Linux man pages. > + * > + * That range is then mapped to something similar to [0, 2*{NZERO}-1], as > + * specified by POSIX, through the usage of the macro > NICE_TO_MACH_PRIORITY > + * and MACK_PRIORITY_TO_NICE. (i.e. [5, 45] ) > + */ > + prio = MAX ((-NZERO), MIN ((NZERO - 1), prio)); > > error_t setonepriority (pid_t pid, struct procinfo *pi) > { > @@ -57,11 +80,25 @@ __setpriority (enum __priority_which which, id_t who, int > prio) > 0, 1); > } > #else > - prierr = __task_priority (task, NICE_TO_MACH_PRIORITY (prio), 1); > + do { > +#ifdef HAVE_MACH_TASK_MAX_PRIORITY > + mach_port_t host = MACH_PORT_NULL; > + error_t priverr = __get_privileged_ports (&host, NULL); > + if (!priverr) > + { > + prierr = __task_max_priority (host, task, NICE_TO_MACH_PRIORITY > (prio), 1, 1); > + __mach_port_deallocate (__mach_task_self (), host); > + if (prierr != MIG_BAD_ID) > + break; > + } > +#endif > + prierr = __task_priority (task, NICE_TO_MACH_PRIORITY (prio), 1); > + } while (0); > #endif > __mach_port_deallocate (__mach_task_self (), task); > switch (prierr) > { > + case KERN_NO_ACCESS: > case KERN_FAILURE: > ++nacces; > break; > -- > 2.53.0 > > -- Samuel <y> le y est un animal discret se logeant facilement dans un terminal *** c has changed the topic on channel #ens-mim to ne pas jeter de cacahuetes aux ys, svp -+- #ens-mim - n'oubliez pas le guide -+-
