added sethostname syscall with proper error checks
Change-Id: I4b4e0a7c4035e19d5843b86ee1f714096adcecd2
This commit is contained in:
		
							parent
							
								
									b6bd719869
								
							
						
					
					
						commit
						91c835edc2
					
				@ -1,7 +1,7 @@
 | 
				
			|||||||
#	$NetBSD: Makefile,v 1.22 2007/12/31 15:31:24 ad Exp $
 | 
					#	$NetBSD: Makefile,v 1.22 2007/12/31 15:31:24 ad Exp $
 | 
				
			||||||
#	@(#)Makefile	8.1 (Berkeley) 5/31/93
 | 
					#	@(#)Makefile	8.1 (Berkeley) 5/31/93
 | 
				
			||||||
 | 
					
 | 
				
			||||||
SUBDIR=	cat chmod date df echo ed expr \
 | 
					SUBDIR=	cat chmod date df echo ed expr hostname \
 | 
				
			||||||
	kill ksh ln ls mkdir pax pwd rm rmdir \
 | 
						kill ksh ln ls mkdir pax pwd rm rmdir \
 | 
				
			||||||
	sleep stty sync test
 | 
						sleep stty sync test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										6
									
								
								bin/hostname/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								bin/hostname/Makefile
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,6 @@
 | 
				
			|||||||
 | 
					#	$NetBSD: Makefile,v 1.8 1997/07/20 22:37:07 christos Exp $
 | 
				
			||||||
 | 
					#	@(#)Makefile	8.1 (Berkeley) 5/31/93
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					PROG=	hostname
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.include <bsd.prog.mk>
 | 
				
			||||||
							
								
								
									
										87
									
								
								bin/hostname/hostname.1
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								bin/hostname/hostname.1
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,87 @@
 | 
				
			|||||||
 | 
					.\"	$NetBSD: hostname.1,v 1.19 2013/07/19 11:19:23 wiz Exp $
 | 
				
			||||||
 | 
					.\"
 | 
				
			||||||
 | 
					.\" Copyright (c) 1983, 1988, 1990, 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.
 | 
				
			||||||
 | 
					.\" 3. 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.
 | 
				
			||||||
 | 
					.\"
 | 
				
			||||||
 | 
					.\"	@(#)hostname.1	8.2 (Berkeley) 4/28/95
 | 
				
			||||||
 | 
					.\"
 | 
				
			||||||
 | 
					.Dd July 19, 2013
 | 
				
			||||||
 | 
					.Dt HOSTNAME 1
 | 
				
			||||||
 | 
					.Os
 | 
				
			||||||
 | 
					.Sh NAME
 | 
				
			||||||
 | 
					.Nm hostname
 | 
				
			||||||
 | 
					.Nd set or print name of current host system
 | 
				
			||||||
 | 
					.Sh SYNOPSIS
 | 
				
			||||||
 | 
					.Nm
 | 
				
			||||||
 | 
					.Op Fl AadfIis
 | 
				
			||||||
 | 
					.Op Ar name-of-host
 | 
				
			||||||
 | 
					.Sh DESCRIPTION
 | 
				
			||||||
 | 
					.Nm
 | 
				
			||||||
 | 
					prints the name of the current host.
 | 
				
			||||||
 | 
					The super-user can set the host name by supplying an argument; this is
 | 
				
			||||||
 | 
					usually done in the network initialization script
 | 
				
			||||||
 | 
					.Pa /etc/rc.d/network ,
 | 
				
			||||||
 | 
					normally run at boot
 | 
				
			||||||
 | 
					time.
 | 
				
			||||||
 | 
					.Pp
 | 
				
			||||||
 | 
					Options:
 | 
				
			||||||
 | 
					.Bl -tag -width flag
 | 
				
			||||||
 | 
					.It Fl A
 | 
				
			||||||
 | 
					Display the FQDN of each address on all interfaces.
 | 
				
			||||||
 | 
					.It Fl a
 | 
				
			||||||
 | 
					Display alias name(s) of the host.
 | 
				
			||||||
 | 
					.It Fl d
 | 
				
			||||||
 | 
					Display the DNS domain.
 | 
				
			||||||
 | 
					.It Fl f
 | 
				
			||||||
 | 
					Display the FQDN for the hostname.
 | 
				
			||||||
 | 
					.It Fl I
 | 
				
			||||||
 | 
					Display each IP address on all interfaces.
 | 
				
			||||||
 | 
					.It Fl i
 | 
				
			||||||
 | 
					Display the IP address(es) for the hostname.
 | 
				
			||||||
 | 
					.It Fl s
 | 
				
			||||||
 | 
					Display the short hostname.
 | 
				
			||||||
 | 
					.El
 | 
				
			||||||
 | 
					.Sh NOTES
 | 
				
			||||||
 | 
					With the exception of
 | 
				
			||||||
 | 
					.Fl I
 | 
				
			||||||
 | 
					and
 | 
				
			||||||
 | 
					.Fl s ,
 | 
				
			||||||
 | 
					the other options will retrieve their results from the resolver.
 | 
				
			||||||
 | 
					.Sh SEE ALSO
 | 
				
			||||||
 | 
					.Xr domainname 1 ,
 | 
				
			||||||
 | 
					.Xr getaddrinfo 3 ,
 | 
				
			||||||
 | 
					.Xr gethostbyname 3 ,
 | 
				
			||||||
 | 
					.Xr gethostname 3 ,
 | 
				
			||||||
 | 
					.Xr getifaddrs 3 ,
 | 
				
			||||||
 | 
					.Xr getnameinfo 3 ,
 | 
				
			||||||
 | 
					.Xr sethostname 3 ,
 | 
				
			||||||
 | 
					.Xr hosts 5
 | 
				
			||||||
 | 
					.Sh HISTORY
 | 
				
			||||||
 | 
					The
 | 
				
			||||||
 | 
					.Nm
 | 
				
			||||||
 | 
					utility appeared in
 | 
				
			||||||
 | 
					.Bx 4.2 .
 | 
				
			||||||
							
								
								
									
										209
									
								
								bin/hostname/hostname.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										209
									
								
								bin/hostname/hostname.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,209 @@
 | 
				
			|||||||
 | 
					/* $NetBSD: hostname.c,v 1.20 2013/07/19 15:53:00 christos Exp $ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (c) 1988, 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.
 | 
				
			||||||
 | 
					 * 3. 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.
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <sys/cdefs.h>
 | 
				
			||||||
 | 
					#ifndef lint
 | 
				
			||||||
 | 
					__COPYRIGHT("@(#) Copyright (c) 1988, 1993\
 | 
				
			||||||
 | 
					 The Regents of the University of California.  All rights reserved.");
 | 
				
			||||||
 | 
					#endif /* not lint */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef lint
 | 
				
			||||||
 | 
					#if 0
 | 
				
			||||||
 | 
					static char sccsid[] = "@(#)hostname.c	8.2 (Berkeley) 4/28/95";
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					__RCSID("$NetBSD: hostname.c,v 1.20 2013/07/19 15:53:00 christos Exp $");
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					#endif /* not lint */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <sys/param.h>
 | 
				
			||||||
 | 
					#include <sys/socket.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <net/if.h>
 | 
				
			||||||
 | 
					#include <netinet/in.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <err.h>
 | 
				
			||||||
 | 
					#include <ifaddrs.h>
 | 
				
			||||||
 | 
					#include <netdb.h>
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__dead static void usage(void);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					main(int argc, char *argv[])
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int ch, Aflag, aflag, dflag, Iflag, iflag, fflag, sflag, i;
 | 
				
			||||||
 | 
						char *p, hostname[MAXHOSTNAMELEN + 1];
 | 
				
			||||||
 | 
						struct addrinfo hints, *ainfos, *ai;
 | 
				
			||||||
 | 
						struct hostent *hent;
 | 
				
			||||||
 | 
						struct ifaddrs *ifa, *ifp;
 | 
				
			||||||
 | 
						struct sockaddr_in6 *sin6;
 | 
				
			||||||
 | 
						char buf[MAX(MAXHOSTNAMELEN + 1, INET6_ADDRSTRLEN)];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						setprogname(argv[0]);
 | 
				
			||||||
 | 
						Aflag = aflag = dflag = Iflag = iflag = fflag = sflag = 0;
 | 
				
			||||||
 | 
						while ((ch = getopt(argc, argv, "AadIifs")) != -1)
 | 
				
			||||||
 | 
							switch (ch) {
 | 
				
			||||||
 | 
							case 'A':
 | 
				
			||||||
 | 
								Aflag = 1;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 'a':
 | 
				
			||||||
 | 
								aflag = 1;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 'd':
 | 
				
			||||||
 | 
								dflag = 1;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 'I':
 | 
				
			||||||
 | 
								Iflag = 1;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 'i':
 | 
				
			||||||
 | 
								iflag = 1;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 'f':
 | 
				
			||||||
 | 
								fflag = 1;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case 's':
 | 
				
			||||||
 | 
								sflag = 1;
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case '?':
 | 
				
			||||||
 | 
							default:
 | 
				
			||||||
 | 
								usage();
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						argc -= optind;
 | 
				
			||||||
 | 
						argv += optind;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (argc > 1)
 | 
				
			||||||
 | 
							usage();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (*argv) {
 | 
				
			||||||
 | 
							if (sethostname(*argv, strlen(*argv)))
 | 
				
			||||||
 | 
								err(1, "sethostname");
 | 
				
			||||||
 | 
						} else if (Aflag || Iflag) {
 | 
				
			||||||
 | 
							if (getifaddrs(&ifa) == -1)
 | 
				
			||||||
 | 
								err(1, "getifaddrs");
 | 
				
			||||||
 | 
							for (ifp = ifa; ifp; ifp = ifp->ifa_next) {
 | 
				
			||||||
 | 
								if (ifp->ifa_addr == NULL ||
 | 
				
			||||||
 | 
					#if !defined(__minix)
 | 
				
			||||||
 | 
								    ifp->ifa_flags & IFF_LOOPBACK ||
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
								    !(ifp->ifa_flags & IFF_UP))
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								switch(ifp->ifa_addr->sa_family) {
 | 
				
			||||||
 | 
								case AF_INET:
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								case AF_INET6:
 | 
				
			||||||
 | 
									/* Skip link local addresses */
 | 
				
			||||||
 | 
									sin6 = (struct sockaddr_in6 *)ifp->ifa_addr;
 | 
				
			||||||
 | 
									if (IN6_IS_ADDR_LINKLOCAL(&sin6->sin6_addr) ||
 | 
				
			||||||
 | 
									    IN6_IS_ADDR_MC_LINKLOCAL(&sin6->sin6_addr))
 | 
				
			||||||
 | 
										continue;
 | 
				
			||||||
 | 
									break;
 | 
				
			||||||
 | 
								default:
 | 
				
			||||||
 | 
									/* We only translate IPv4 or IPv6 addresses */
 | 
				
			||||||
 | 
									continue;
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
								i = getnameinfo(ifp->ifa_addr, ifp->ifa_addr->sa_len,
 | 
				
			||||||
 | 
								    buf, sizeof(buf), NULL, 0,
 | 
				
			||||||
 | 
								    Iflag ? NI_NUMERICHOST: NI_NAMEREQD);
 | 
				
			||||||
 | 
								if (i) {
 | 
				
			||||||
 | 
									if (Iflag && i != EAI_NONAME)
 | 
				
			||||||
 | 
										errx(1, "getnameinfo: %s",
 | 
				
			||||||
 | 
										    gai_strerror(i));
 | 
				
			||||||
 | 
								} else
 | 
				
			||||||
 | 
									printf("%s\n", buf);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							freeifaddrs(ifa);
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							if (gethostname(hostname, sizeof(hostname)))
 | 
				
			||||||
 | 
								err(1, "gethostname");
 | 
				
			||||||
 | 
							hostname[sizeof(hostname) - 1] = '\0';
 | 
				
			||||||
 | 
							if (aflag) {
 | 
				
			||||||
 | 
								if ((hent = gethostbyname(hostname)) == NULL)
 | 
				
			||||||
 | 
									errx(1, "gethostbyname: %s",
 | 
				
			||||||
 | 
									    hstrerror(h_errno));
 | 
				
			||||||
 | 
								for (i = 0; hent->h_aliases[i]; i++)
 | 
				
			||||||
 | 
									printf("%s\n", hent->h_aliases[i]);
 | 
				
			||||||
 | 
							} else if (dflag || iflag || fflag) {
 | 
				
			||||||
 | 
								memset(&hints, 0, sizeof(hints));
 | 
				
			||||||
 | 
								hints.ai_family = AF_UNSPEC;
 | 
				
			||||||
 | 
								hints.ai_socktype = SOCK_DGRAM;
 | 
				
			||||||
 | 
								hints.ai_flags = AI_CANONNAME;
 | 
				
			||||||
 | 
								i = getaddrinfo(hostname, NULL, &hints, &ainfos);
 | 
				
			||||||
 | 
								if (i)
 | 
				
			||||||
 | 
									errx(1, "getaddrinfo: %s", gai_strerror(i));
 | 
				
			||||||
 | 
								if (ainfos) {
 | 
				
			||||||
 | 
									if (dflag) {
 | 
				
			||||||
 | 
										if ((p = strchr(ainfos->ai_canonname,
 | 
				
			||||||
 | 
										    '.')))
 | 
				
			||||||
 | 
											printf("%s\n", p + 1);
 | 
				
			||||||
 | 
									} else if (iflag) {
 | 
				
			||||||
 | 
										for (ai = ainfos; ai; ai = ai->ai_next)
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											i = getnameinfo(ai->ai_addr,
 | 
				
			||||||
 | 
											    ai->ai_addrlen,
 | 
				
			||||||
 | 
											    buf, sizeof(buf), NULL, 0,
 | 
				
			||||||
 | 
											    NI_NUMERICHOST);
 | 
				
			||||||
 | 
											if (i)
 | 
				
			||||||
 | 
												errx(1,
 | 
				
			||||||
 | 
												    "getnameinfo: %s",
 | 
				
			||||||
 | 
												    gai_strerror(i));
 | 
				
			||||||
 | 
											printf("%s\n", buf);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									} else {
 | 
				
			||||||
 | 
										if (sflag &&
 | 
				
			||||||
 | 
										    (p = strchr(ainfos->ai_canonname,
 | 
				
			||||||
 | 
										    '.')))
 | 
				
			||||||
 | 
											*p = '\0';
 | 
				
			||||||
 | 
										printf("%s\n", ainfos->ai_canonname);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									freeaddrinfo(ainfos);
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							} else {
 | 
				
			||||||
 | 
								if (sflag && (p = strchr(hostname, '.')))
 | 
				
			||||||
 | 
									*p = '\0';
 | 
				
			||||||
 | 
								printf("%s\n", hostname);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						exit(0);
 | 
				
			||||||
 | 
						/* NOTREACHED */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void
 | 
				
			||||||
 | 
					usage(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						(void)fprintf(stderr, "usage: %s [-AadfIis] [name-of-host]\n",
 | 
				
			||||||
 | 
						    getprogname());
 | 
				
			||||||
 | 
						exit(1);
 | 
				
			||||||
 | 
						/* NOTREACHED */
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -24,6 +24,7 @@
 | 
				
			|||||||
./bin/ed				minix-sys
 | 
					./bin/ed				minix-sys
 | 
				
			||||||
./bin/expr				minix-sys
 | 
					./bin/expr				minix-sys
 | 
				
			||||||
./bin/getopts				minix-sys
 | 
					./bin/getopts				minix-sys
 | 
				
			||||||
 | 
					./bin/hostname				minix-sys
 | 
				
			||||||
./bin/intr				minix-sys
 | 
					./bin/intr				minix-sys
 | 
				
			||||||
./bin/kill				minix-sys
 | 
					./bin/kill				minix-sys
 | 
				
			||||||
./bin/ksh				minix-sys
 | 
					./bin/ksh				minix-sys
 | 
				
			||||||
@ -2087,6 +2088,7 @@
 | 
				
			|||||||
./usr/man/man1/hexdump.1		minix-sys
 | 
					./usr/man/man1/hexdump.1		minix-sys
 | 
				
			||||||
./usr/man/man1/host.1			minix-sys
 | 
					./usr/man/man1/host.1			minix-sys
 | 
				
			||||||
./usr/man/man1/hostaddr.1		minix-sys
 | 
					./usr/man/man1/hostaddr.1		minix-sys
 | 
				
			||||||
 | 
					./usr/man/man1/hostname.1		minix-sys
 | 
				
			||||||
./usr/man/man1/id.1			minix-sys
 | 
					./usr/man/man1/id.1			minix-sys
 | 
				
			||||||
./usr/man/man1/if.1			minix-sys
 | 
					./usr/man/man1/if.1			minix-sys
 | 
				
			||||||
./usr/man/man1/ifdef.1			minix-sys
 | 
					./usr/man/man1/ifdef.1			minix-sys
 | 
				
			||||||
 | 
				
			|||||||
@ -19,4 +19,6 @@
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
#define	_PATH_SERVACCES	"/etc/serv.access"
 | 
					#define	_PATH_SERVACCES	"/etc/serv.access"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define _PATH_HOSTNAME_FILE "/etc/hostname.file"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* _MINIX_PATHS_H_ */
 | 
					#endif /* _MINIX_PATHS_H_ */
 | 
				
			||||||
 | 
				
			|||||||
@ -10,7 +10,7 @@
 | 
				
			|||||||
.if defined(__MINIX)
 | 
					.if defined(__MINIX)
 | 
				
			||||||
# Unsupported by Minix.
 | 
					# Unsupported by Minix.
 | 
				
			||||||
# 	closefrom.c confstr.c extattr.c getdevmajor.c \
 | 
					# 	closefrom.c confstr.c extattr.c getdevmajor.c \
 | 
				
			||||||
#	pthread_atfork.c setdomainname.c sethostname.c setproctitle.c \
 | 
					#	pthread_atfork.c setdomainname.c setproctitle.c \
 | 
				
			||||||
#	sysctl.c sysctlbyname.c sysctlgetmibinfo.c sysctlnametomib.c \
 | 
					#	sysctl.c sysctlbyname.c sysctlgetmibinfo.c sysctlnametomib.c \
 | 
				
			||||||
#	wait3.c
 | 
					#	wait3.c
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -39,7 +39,7 @@ SRCS+= 	_errno.c alarm.c alphasort.c arc4random.c assert.c basename.c clock.c \
 | 
				
			|||||||
	psignal.c \
 | 
						psignal.c \
 | 
				
			||||||
	ptree.c pwcache.c pw_scan.c raise.c randomid.c rb.c readdir.c \
 | 
						ptree.c pwcache.c pw_scan.c raise.c randomid.c rb.c readdir.c \
 | 
				
			||||||
	rewinddir.c scandir.c seekdir.c \
 | 
						rewinddir.c scandir.c seekdir.c \
 | 
				
			||||||
	setjmperr.c setmode.c setprogname.c \
 | 
						sethostname.c setjmperr.c setmode.c setprogname.c \
 | 
				
			||||||
	shquote.c shquotev.c sighold.c sigignore.c siginterrupt.c \
 | 
						shquote.c shquotev.c sighold.c sigignore.c siginterrupt.c \
 | 
				
			||||||
	sysctl.c sysctlbyname.c sysctlgetmibinfo.c sysctlnametomib.c \
 | 
						sysctl.c sysctlbyname.c sysctlgetmibinfo.c sysctlnametomib.c \
 | 
				
			||||||
	siglist.c signal.c signame.c sigrelse.c \
 | 
						siglist.c signal.c signame.c sigrelse.c \
 | 
				
			||||||
 | 
				
			|||||||
@ -7,20 +7,19 @@
 | 
				
			|||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#include <unistd.h>
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					#include <minix/paths.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifdef __weak_alias
 | 
					#ifdef __weak_alias
 | 
				
			||||||
__weak_alias(gethostname, _gethostname)
 | 
					__weak_alias(gethostname, _gethostname)
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define HOSTNAME_FILE "/etc/hostname.file"
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
int gethostname(char *buf, size_t len)
 | 
					int gethostname(char *buf, size_t len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int fd;
 | 
						int fd;
 | 
				
			||||||
	int r;
 | 
						int r;
 | 
				
			||||||
	char *nl;
 | 
						char *nl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if ((fd= open(HOSTNAME_FILE, O_RDONLY)) < 0) return -1;
 | 
						if ((fd= open(_PATH_HOSTNAME_FILE, O_RDONLY)) < 0) return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	r= read(fd, buf, len);
 | 
						r= read(fd, buf, len);
 | 
				
			||||||
	close(fd);
 | 
						close(fd);
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										64
									
								
								lib/libc/gen/minix/sethostname.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								lib/libc/gen/minix/sethostname.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,64 @@
 | 
				
			|||||||
 | 
					/* gethostname(2) system call emulation */
 | 
				
			||||||
 | 
					#include <sys/cdefs.h>
 | 
				
			||||||
 | 
					#include "namespace.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					#include <fcntl.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <string.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					#include <errno.h>
 | 
				
			||||||
 | 
					#include <minix/paths.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __weak_alias
 | 
				
			||||||
 | 
					__weak_alias(sethostname, _sethostname)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int sethostname(const char *buf, size_t len)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int fd;
 | 
				
			||||||
 | 
						int r;
 | 
				
			||||||
 | 
						int tmperr;
 | 
				
			||||||
 | 
						char name[20];
 | 
				
			||||||
 | 
						strlcpy(name, "/tmp/hostname.XXXXX",sizeof(name));
 | 
				
			||||||
 | 
						fd = mkstemp(name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (fd == -1)
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						r = fchmod(fd, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (r == -1) {
 | 
				
			||||||
 | 
							tmperr = errno;
 | 
				
			||||||
 | 
							close(fd);
 | 
				
			||||||
 | 
							unlink(name);
 | 
				
			||||||
 | 
							errno = tmperr;
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						r = write(fd, buf, len);
 | 
				
			||||||
 | 
						tmperr = errno;
 | 
				
			||||||
 | 
						close(fd);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (r == -1) {
 | 
				
			||||||
 | 
							unlink(name);
 | 
				
			||||||
 | 
							errno = tmperr;
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (r < len) {
 | 
				
			||||||
 | 
							unlink(name);
 | 
				
			||||||
 | 
							errno = ENOSPC;
 | 
				
			||||||
 | 
							return -1;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						r = rename(name, _PATH_HOSTNAME_FILE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (r == -1) {
 | 
				
			||||||
 | 
							tmperr = errno;
 | 
				
			||||||
 | 
							unlink(name);
 | 
				
			||||||
 | 
							errno = tmperr;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user