svn commit: r363832 - in stable/12/sys: compat/freebsd32 kern sys
Pawel Biernacki
kaktus at FreeBSD.org
Tue Aug 4 12:42:57 UTC 2020
Author: kaktus
Date: Tue Aug 4 12:42:55 2020
New Revision: 363832
URL: https://svnweb.freebsd.org/changeset/base/363832
Log:
MFC kernel part of r351729
Add sysctlbyname system call
The two syscalls that exists in head but not in stable/12 are marked as
UNIMPL to keep the __sysctlbyname syscall number the same (570).
Userland part to be commited in about a week time.
Requested by: mjg
Discussed with: kib
Modified:
stable/12/sys/compat/freebsd32/freebsd32_misc.c
stable/12/sys/compat/freebsd32/syscalls.master
stable/12/sys/kern/capabilities.conf
stable/12/sys/kern/kern_sysctl.c
stable/12/sys/kern/syscalls.master
stable/12/sys/sys/param.h
stable/12/sys/sys/syscall.mk
stable/12/sys/sys/sysctl.h
Modified: stable/12/sys/compat/freebsd32/freebsd32_misc.c
==============================================================================
--- stable/12/sys/compat/freebsd32/freebsd32_misc.c Tue Aug 4 12:04:47 2020 (r363831)
+++ stable/12/sys/compat/freebsd32/freebsd32_misc.c Tue Aug 4 12:42:55 2020 (r363832)
@@ -2279,6 +2279,32 @@ freebsd32___sysctl(struct thread *td, struct freebsd32
}
int
+freebsd32___sysctlbyname(struct thread *td,
+ struct freebsd32___sysctlbyname_args *uap)
+{
+ size_t oldlen, rv;
+ int error;
+ uint32_t tmp;
+
+ if (uap->oldlenp != NULL) {
+ error = fueword32(uap->oldlenp, &tmp);
+ oldlen = tmp;
+ } else {
+ error = oldlen = 0;
+ }
+ if (error != 0)
+ return (EFAULT);
+ error = kern___sysctlbyname(td, uap->name, uap->namelen, uap->old,
+ &oldlen, uap->new, uap->newlen, &rv, SCTL_MASK32, 1);
+ if (error != 0)
+ return (error);
+ if (uap->oldlenp != NULL)
+ error = suword32(uap->oldlenp, rv);
+
+ return (error);
+}
+
+int
freebsd32_jail(struct thread *td, struct freebsd32_jail_args *uap)
{
uint32_t version;
Modified: stable/12/sys/compat/freebsd32/syscalls.master
==============================================================================
--- stable/12/sys/compat/freebsd32/syscalls.master Tue Aug 4 12:04:47 2020 (r363831)
+++ stable/12/sys/compat/freebsd32/syscalls.master Tue Aug 4 12:42:55 2020 (r363832)
@@ -1127,5 +1127,10 @@
const char *to); }
567 AUE_NULL NOPROTO { int fhreadlink( struct fhandle *fhp, char *buf, \
size_t bufsize); }
+568 AUE_NULL UNIMPL funlinkat
+569 AUE_NULL UNIMPL copy_file_range
+570 AUE_SYSCTL STD { int freebsd32___sysctlbyname(const char *name, \
+ size_t namelen, void *old, uint32_t *oldlenp, \
+ void *new, size_t newlen); }
; vim: syntax=off
Modified: stable/12/sys/kern/capabilities.conf
==============================================================================
--- stable/12/sys/kern/capabilities.conf Tue Aug 4 12:04:47 2020 (r363831)
+++ stable/12/sys/kern/capabilities.conf Tue Aug 4 12:42:55 2020 (r363832)
@@ -63,6 +63,7 @@ __mac_set_proc
## proxying daemon in userspace.
##
__sysctl
+__sysctlbyname
##
## Allow umtx operations as these are scoped by address space.
Modified: stable/12/sys/kern/kern_sysctl.c
==============================================================================
--- stable/12/sys/kern/kern_sysctl.c Tue Aug 4 12:04:47 2020 (r363831)
+++ stable/12/sys/kern/kern_sysctl.c Tue Aug 4 12:42:55 2020 (r363832)
@@ -2102,6 +2102,68 @@ sys___sysctl(struct thread *td, struct sysctl_args *ua
return (error);
}
+int
+kern___sysctlbyname(struct thread *td, const char *oname, size_t namelen,
+ void *old, size_t *oldlenp, void *new, size_t newlen, size_t *retval,
+ int flags, bool inkernel)
+{
+ int oid[CTL_MAXNAME];
+ char namebuf[16];
+ char *name;
+ size_t oidlen;
+ int error;
+
+ if (namelen > MAXPATHLEN || namelen == 0)
+ return (EINVAL);
+ name = namebuf;
+ if (namelen > sizeof(namebuf))
+ name = malloc(namelen, M_SYSCTL, M_WAITOK);
+ error = copyin(oname, name, namelen);
+ if (error != 0)
+ goto out;
+
+ oid[0] = CTL_SYSCTL;
+ oid[1] = CTL_SYSCTL_NAME2OID;
+ oidlen = sizeof(oid);
+ error = kernel_sysctl(td, oid, 2, oid, &oidlen, (void *)name, namelen,
+ retval, flags);
+ if (error != 0)
+ goto out;
+ error = userland_sysctl(td, oid, *retval / sizeof(int), old, oldlenp,
+ inkernel, new, newlen, retval, flags);
+
+out:
+ if (namelen > sizeof(namebuf))
+ free(name, M_SYSCTL);
+ return (error);
+}
+
+#ifndef _SYS_SYSPROTO_H_
+struct __sysctlbyname_args {
+ const char *name;
+ size_t namelen;
+ void *old;
+ size_t *oldlenp;
+ void *new;
+ size_t newlen;
+};
+#endif
+int
+sys___sysctlbyname(struct thread *td, struct __sysctlbyname_args *uap)
+{
+ size_t rv;
+ int error;
+
+ error = kern___sysctlbyname(td, uap->name, uap->namelen, uap->old,
+ uap->oldlenp, uap->new, uap->newlen, &rv, 0, 0);
+ if (error != 0)
+ return (error);
+ if (uap->oldlenp != NULL)
+ error = copyout(&rv, uap->oldlenp, sizeof(rv));
+
+ return (error);
+}
+
/*
* This is used from various compatibility syscalls too. That's why name
* must be in kernel space.
Modified: stable/12/sys/kern/syscalls.master
==============================================================================
--- stable/12/sys/kern/syscalls.master Tue Aug 4 12:04:47 2020 (r363831)
+++ stable/12/sys/kern/syscalls.master Tue Aug 4 12:42:55 2020 (r363832)
@@ -1368,6 +1368,19 @@
size_t bufsize \
); \
}
+568 AUE_NULL UNIMPL funlinkat
+569 AUE_NULL UNIMPL copy_file_range
+570 AUE_SYSCTL STD { \
+ int __sysctlbyname( \
+ _In_reads_(namelen) const char *name, \
+ size_t namelen, \
+ _Out_writes_bytes_opt_(*oldlenp) void *old, \
+ _Inout_opt_ size_t *oldlenp, \
+ _In_reads_bytes_opt_(newlen) void *new, \
+ size_t newlen \
+ ); \
+ }
+
; Please copy any additions and changes to the following compatability tables:
; sys/compat/freebsd32/syscalls.master
Modified: stable/12/sys/sys/param.h
==============================================================================
--- stable/12/sys/sys/param.h Tue Aug 4 12:04:47 2020 (r363831)
+++ stable/12/sys/sys/param.h Tue Aug 4 12:42:55 2020 (r363832)
@@ -60,7 +60,7 @@
* in the range 5 to 9.
*/
#undef __FreeBSD_version
-#define __FreeBSD_version 1201521 /* Master, propagated to newvers */
+#define __FreeBSD_version 1201522 /* Master, propagated to newvers */
/*
* __FreeBSD_kernel__ indicates that this system uses the kernel of FreeBSD,
Modified: stable/12/sys/sys/syscall.mk
==============================================================================
--- stable/12/sys/sys/syscall.mk Tue Aug 4 12:04:47 2020 (r363831)
+++ stable/12/sys/sys/syscall.mk Tue Aug 4 12:42:55 2020 (r363832)
@@ -408,4 +408,5 @@ MIASM = \
getfhat.o \
fhlink.o \
fhlinkat.o \
- fhreadlink.o
+ fhreadlink.o \
+ __sysctlbyname.o
Modified: stable/12/sys/sys/sysctl.h
==============================================================================
--- stable/12/sys/sys/sysctl.h Tue Aug 4 12:04:47 2020 (r363831)
+++ stable/12/sys/sys/sysctl.h Tue Aug 4 12:42:55 2020 (r363832)
@@ -1102,6 +1102,9 @@ int sysctl_find_oid(int *name, u_int namelen, struct s
void sysctl_wlock(void);
void sysctl_wunlock(void);
int sysctl_wire_old_buffer(struct sysctl_req *req, size_t len);
+int kern___sysctlbyname(struct thread *td, const char *name,
+ size_t namelen, void *old, size_t *oldlenp, void *new,
+ size_t newlen, size_t *retval, int flags, bool inkernel);
struct sbuf;
struct sbuf *sbuf_new_for_sysctl(struct sbuf *, char *, int,
More information about the svn-src-all
mailing list