From dbf4bcd6cf7e1f33c8bab82b42a8b60c69a5e6ab Mon Sep 17 00:00:00 2001 From: Jonas 'Sortie' Termansen Date: Sun, 19 Mar 2017 17:00:08 +0100 Subject: [PATCH] Add hostname(1). --- Makefile | 1 + hostname/.gitignore | 1 + hostname/Makefile | 28 ++++++++++ hostname/hostname.1 | 28 ++++++++++ hostname/hostname.c | 104 ++++++++++++++++++++++++++++++++++++++ share/man/man5/hostname.5 | 2 + 6 files changed, 164 insertions(+) create mode 100644 hostname/.gitignore create mode 100644 hostname/Makefile create mode 100644 hostname/hostname.1 create mode 100644 hostname/hostname.c diff --git a/Makefile b/Makefile index f901bb48..26f86e82 100644 --- a/Makefile +++ b/Makefile @@ -15,6 +15,7 @@ disked \ editor \ ext \ games \ +hostname \ init \ kblayout \ kblayout-compiler \ diff --git a/hostname/.gitignore b/hostname/.gitignore new file mode 100644 index 00000000..ecd88aee --- /dev/null +++ b/hostname/.gitignore @@ -0,0 +1 @@ +hostname diff --git a/hostname/Makefile b/hostname/Makefile new file mode 100644 index 00000000..b1032a0b --- /dev/null +++ b/hostname/Makefile @@ -0,0 +1,28 @@ +include ../build-aux/platform.mak +include ../build-aux/compiler.mak +include ../build-aux/version.mak +include ../build-aux/dirs.mak + +OPTLEVEL?=$(DEFAULT_OPTLEVEL) +CFLAGS?=$(OPTLEVEL) + +CFLAGS += -Wall -Wextra + +BINARIES = hostname +MANPAGES1 = hostname.1 + +all: $(BINARIES) + +.PHONY: all install clean + +install: all + mkdir -p $(DESTDIR)$(BINDIR) + install $(BINARIES) $(DESTDIR)$(BINDIR) + mkdir -p $(DESTDIR)$(MANDIR)/man1 + install $(MANPAGES1) $(DESTDIR)$(MANDIR)/man1 + +%: %.c + $(CC) -std=gnu11 $(CFLAGS) $(CPPFLAGS) $< -o $@ + +clean: + rm -f $(BINARIES) diff --git a/hostname/hostname.1 b/hostname/hostname.1 new file mode 100644 index 00000000..e7556092 --- /dev/null +++ b/hostname/hostname.1 @@ -0,0 +1,28 @@ +.Dd March 19, 2017 +.Dt HOSTNAME 1 +.Os +.Sh NAME +.Nm hostname +.Nd write or set system hostname +.Sh SYNOPSIS +.Nm hostname +.Op Fl s +.Op Ar hostname +.Sh DESCRIPTION +.Nm +writes the system hostname, or sets the system hostname to +.Ar hostname +if specified. +.Pp +The options are as follows: +.Bl -tag -width "12345678" +.It Fl s , Fl \-short +Write the hostname up to but not including the first period. +.El +.Sh EXIT STATUS +.Nm +will exit 0 on success and non-zero otherwise. +.Sh SEE ALSO +.Xr gethostname 2 , +.Xr sethostname 2 , +.Xr hostname 5 diff --git a/hostname/hostname.c b/hostname/hostname.c new file mode 100644 index 00000000..169dde01 --- /dev/null +++ b/hostname/hostname.c @@ -0,0 +1,104 @@ +/* + * Copyright (c) 2017 Jonas 'Sortie' Termansen. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + * + * hostname.c + * Write or set the system hostname. + */ + +#include +#include +#include +#include +#include +#include +#include + +// TODO: The Sortix doesn't expose this at the moment. +#if !defined(HOST_NAME_MAX) && defined(__sortix__) +#include +#endif + +static void compact_arguments(int* argc, char*** argv) +{ + for ( int i = 0; i < *argc; i++ ) + { + while ( i < *argc && !(*argv)[i] ) + { + for ( int n = i; n < *argc; n++ ) + (*argv)[n] = (*argv)[n+1]; + (*argc)--; + } + } +} + +int main(int argc, char* argv[]) +{ + bool short_hostname = false; + + const char* argv0 = argv[0]; + for ( int i = 1; i < argc; i++ ) + { + const char* arg = argv[i]; + if ( arg[0] != '-' || !arg[1] ) + continue; + argv[i] = NULL; + if ( !strcmp(arg, "--") ) + break; + if ( arg[1] != '-' ) + { + char c; + while ( (c = *++arg) ) switch ( c ) + { + case 's': short_hostname = true; break; + default: + fprintf(stderr, "%s: unknown option -- '%c'\n", argv0, c); + exit(1); + } + } + else if ( !strcmp(arg, "--short") ) + short_hostname = true; + else + { + fprintf(stderr, "%s: unknown option: %s\n", argv0, arg); + exit(1); + } + } + + compact_arguments(&argc, &argv); + + if ( 3 <= argc ) + errx(1, "unexpected extra operand"); + + if ( argc == 2 ) + { + if ( short_hostname ) + errx(1, "the -s option is incompatible with setting hostname"); + char* hostname = argv[1]; + if ( sethostname(hostname, strlen(hostname)) < 0 ) + err(1, "sethostname: %s", hostname); + return 0; + } + + char hostname[HOST_NAME_MAX + 1]; + if ( gethostname(hostname, sizeof(hostname)) < 0 ) + err(1, "gethostname"); + if ( short_hostname ) + hostname[strcspn(hostname, ".")] = '\0'; + puts(hostname); + + if ( ferror(stdout) || fflush(stdout) == EOF ) + err(1, "stdout"); + return 0; +} diff --git a/share/man/man5/hostname.5 b/share/man/man5/hostname.5 index 140eb2ca..21128fa3 100644 --- a/share/man/man5/hostname.5 +++ b/share/man/man5/hostname.5 @@ -26,5 +26,7 @@ System hostname. dragon .Ed .Sh SEE ALSO +.Xr hostname 1 , +.Xr gethostname 2 , .Xr sethostname 2 , .Xr init 8