[rtems-libbsd commit] Support sethostname() and gethostname()

Sebastian Huber sebh at rtems.org
Fri Oct 24 07:38:59 UTC 2014


Module:    rtems-libbsd
Branch:    master
Commit:    54ed53794b648f1452d1b80d9f01b444dac2ce8c
Changeset: http://git.rtems.org/rtems-libbsd/commit/?id=54ed53794b648f1452d1b80d9f01b444dac2ce8c

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Fri Oct 24 09:46:53 2014 +0200

Support sethostname() and gethostname()

---

 Makefile                           |    3 ++
 freebsd-to-rtems.py                |    1 +
 freebsd/lib/libc/gen/sethostname.c |   57 ++++++++++++++++++++++++++++++++++++
 freebsd/sys/kern/kern_mib.c        |   15 +++++++++
 testsuite/syscalls01/test_main.c   |   20 ++++++++++++
 5 files changed, 96 insertions(+), 0 deletions(-)

diff --git a/Makefile b/Makefile
index dbf9613..658973e 100644
--- a/Makefile
+++ b/Makefile
@@ -682,6 +682,9 @@ freebsd/lib/libc/gen/feature_present.o: freebsd/lib/libc/gen/feature_present.c
 LIB_C_FILES += freebsd/lib/libc/gen/gethostname.c
 freebsd/lib/libc/gen/gethostname.o: freebsd/lib/libc/gen/gethostname.c
 	$(CC) $(CPPFLAGS) $(CFLAGS) -DINET6 -c $< -o $@
+LIB_C_FILES += freebsd/lib/libc/gen/sethostname.c
+freebsd/lib/libc/gen/sethostname.o: freebsd/lib/libc/gen/sethostname.c
+	$(CC) $(CPPFLAGS) $(CFLAGS) -DINET6 -c $< -o $@
 LIB_C_FILES += freebsd/lib/libc/inet/inet_addr.c
 freebsd/lib/libc/inet/inet_addr.o: freebsd/lib/libc/inet/inet_addr.c
 	$(CC) $(CPPFLAGS) $(CFLAGS) -DINET6 -c $< -o $@
diff --git a/freebsd-to-rtems.py b/freebsd-to-rtems.py
index 1ec10a8..a6618a7 100755
--- a/freebsd-to-rtems.py
+++ b/freebsd-to-rtems.py
@@ -2272,6 +2272,7 @@ userSpace.addUserSpaceSourceFiles(
 		'lib/libc/gen/err.c',
 		'lib/libc/gen/feature_present.c',
 		'lib/libc/gen/gethostname.c',
+		'lib/libc/gen/sethostname.c',
 		'lib/libc/inet/inet_addr.c',
 		'lib/libc/inet/inet_cidr_ntop.c',
 		'lib/libc/inet/inet_cidr_pton.c',
diff --git a/freebsd/lib/libc/gen/sethostname.c b/freebsd/lib/libc/gen/sethostname.c
new file mode 100644
index 0000000..96c0773
--- /dev/null
+++ b/freebsd/lib/libc/gen/sethostname.c
@@ -0,0 +1,57 @@
+#include <machine/rtems-bsd-user-space.h>
+
+/*
+ * Copyright (c) 1989, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(LIBC_SCCS) && !defined(lint)
+static char sccsid[] = "@(#)sethostname.c	8.1 (Berkeley) 6/4/93";
+#endif /* LIBC_SCCS and not lint */
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <rtems/bsd/sys/param.h>
+#include <sys/sysctl.h>
+
+#include <unistd.h>
+
+int
+#ifndef __rtems__
+sethostname(const char *name, int namelen)
+#else /* __rtems__ */
+sethostname(const char *name, size_t namelen)
+#endif /* __rtems__ */
+{
+	int mib[2];
+
+	mib[0] = CTL_KERN;
+	mib[1] = KERN_HOSTNAME;
+	if (sysctl(mib, 2, NULL, NULL, (void *)name, namelen) == -1)
+		return (-1);
+	return (0);
+}
diff --git a/freebsd/sys/kern/kern_mib.c b/freebsd/sys/kern/kern_mib.c
index 1450f61..8d19a3b 100644
--- a/freebsd/sys/kern/kern_mib.c
+++ b/freebsd/sys/kern/kern_mib.c
@@ -269,6 +269,7 @@ sysctl_hw_machine_arch(SYSCTL_HANDLER_ARGS)
 }
 SYSCTL_PROC(_hw, HW_MACHINE_ARCH, machine_arch, CTLTYPE_STRING | CTLFLAG_RD,
     NULL, 0, sysctl_hw_machine_arch, "A", "System architecture");
+#endif /* __rtems__ */
 
 static int
 sysctl_hostname(SYSCTL_HANDLER_ARGS)
@@ -287,7 +288,11 @@ sysctl_hostname(SYSCTL_HANDLER_ARGS)
 	KASSERT(len <= sizeof(tmpname),
 	    ("length %d too long for %s", len, __func__));
 
+#ifndef __rtems__
 	pr = req->td->td_ucred->cr_prison;
+#else /* __rtems__ */
+	pr = &prison0;
+#endif /* __rtems__ */
 	if (!(pr->pr_allow & PR_ALLOW_SET_HOSTNAME) && req->newptr)
 		return (EPERM);
 	/*
@@ -305,18 +310,27 @@ sysctl_hostname(SYSCTL_HANDLER_ARGS)
 		 * Copy the locally set hostname to all jails that share
 		 * this host info.
 		 */
+#ifndef __rtems__
 		sx_slock(&allprison_lock);
 		while (!(pr->pr_flags & PR_HOST))
 			pr = pr->pr_parent;
+#endif /* __rtems__ */
 		mtx_lock(&pr->pr_mtx);
 		bcopy(tmpname, (char *)pr + pr_offset, len);
+#ifndef __rtems__
 		FOREACH_PRISON_DESCENDANT_LOCKED(pr, cpr, descend)
 			if (cpr->pr_flags & PR_HOST)
 				descend = 0;
 			else
 				bcopy(tmpname, (char *)cpr + pr_offset, len);
+#else /* __rtems__ */
+		(void) cpr;
+		(void) descend;
+#endif /* __rtems__ */
 		mtx_unlock(&pr->pr_mtx);
+#ifndef __rtems__
 		sx_sunlock(&allprison_lock);
+#endif /* __rtems__ */
 	}
 	return (error);
 }
@@ -334,6 +348,7 @@ SYSCTL_PROC(_kern, KERN_HOSTUUID, hostuuid,
     (void *)(offsetof(struct prison, pr_hostuuid)), HOSTUUIDLEN,
     sysctl_hostname, "A", "Host UUID");
 
+#ifndef __rtems__
 static int	regression_securelevel_nonmonotonic = 0;
 
 #ifdef REGRESSION
diff --git a/testsuite/syscalls01/test_main.c b/testsuite/syscalls01/test_main.c
index 75691d3..e11c833 100644
--- a/testsuite/syscalls01/test_main.c
+++ b/testsuite/syscalls01/test_main.c
@@ -1715,6 +1715,25 @@ test_syslog(void)
 }
 
 static void
+test_setgethostname(void)
+{
+	int rv;
+	char out[] = { 'f', 'o', 'o', 'b', 'a', 'r' };
+	char in[] = { '?', '?', '?', '?', '?', '?', '?' };
+
+	puts("test set/get hostname");
+
+	rv = sethostname(&out[0], sizeof(out));
+	assert(rv == 0);
+
+	rv = gethostname(&in[0], sizeof(in));
+	assert(rv == 0);
+
+	assert(memcmp(&in[0], &out[0], sizeof(in) - 1) == 0);
+	assert(in[sizeof(in) - 1] == '\0');
+}
+
+static void
 test_main(void)
 {
 	/* Must be first test to ensure resource checks work */
@@ -1744,6 +1763,7 @@ test_main(void)
 	test_warn();
 	test_err();
 	test_syslog();
+	test_setgethostname();
 
 	exit(0);
 }



More information about the vc mailing list