Support sethostname() and gethostname()

This commit is contained in:
Sebastian Huber 2014-10-24 09:46:53 +02:00
parent feffbc2894
commit 54ed53794b
5 changed files with 96 additions and 0 deletions

View File

@ -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 $@

View File

@ -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',

View File

@ -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);
}

View File

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

View File

@ -1714,6 +1714,25 @@ test_syslog(void)
syslog(LOG_DEBUG, "debug");
}
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)
{
@ -1744,6 +1763,7 @@ test_main(void)
test_warn();
test_err();
test_syslog();
test_setgethostname();
exit(0);
}