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-stable-12 mailing list