1/* hostname.c - Get/Set the hostname 2 * 3 * Copyright 2012 Andre Renaud <andre@bluewatersys.com> 4 * 5 * http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/hostname.html 6 7USE_HOSTNAME(NEWTOY(hostname, ">1bdsfF:[!bdsf]", TOYFLAG_BIN)) 8USE_DNSDOMAINNAME(NEWTOY(dnsdomainname, ">0", TOYFLAG_BIN)) 9 10config HOSTNAME 11 bool "hostname" 12 default y 13 help 14 usage: hostname [-bdsf] [-F FILENAME] [newname] 15 16 Get/set the current hostname. 17 18 -b Set hostname to 'localhost' if otherwise unset 19 -d Show DNS domain name (no host) 20 -f Show fully-qualified name (host+domain, FQDN) 21 -F Set hostname to contents of FILENAME 22 -s Show short host name (no domain) 23 24config DNSDOMAINNAME 25 bool "dnsdomainname" 26 default y 27 help 28 usage: dnsdomainname 29 30 Show domain this system belongs to (same as hostname -d). 31*/ 32 33#define FOR_hostname 34#define FORCE_FLAGS 35#include "toys.h" 36 37GLOBALS( 38 char *F; 39) 40 41void hostname_main(void) 42{ 43 char *hostname = toybuf, *dot; 44 struct hostent *h; 45 46 gethostname(toybuf, sizeof(toybuf)-1); 47 if (TT.F && (hostname = xreadfile(TT.F, 0, 0))) { 48 if (!*chomp(hostname)) { 49 if (CFG_TOYBOX_FREE) free(hostname); 50 if (!FLAG(b)) error_exit("empty '%s'", TT.F); 51 hostname = 0; 52 } 53 } else hostname = (FLAG(b) && !*toybuf) ? "localhost" : *toys.optargs; 54 55 // Setting? 56 if (hostname) { 57 if (sethostname(hostname, strlen(hostname))) 58 perror_exit("set '%s'", hostname); 59 return; 60 } 61 62 // We only do the DNS lookup for -d and -f. 63 if (FLAG(d) || FLAG(f)) { 64 if (!(h = gethostbyname(toybuf))) 65 error_exit("gethostbyname: %s", hstrerror(h_errno)); 66 snprintf(toybuf, sizeof(toybuf), "%s", h->h_name); 67 } 68 dot = toybuf+strcspn(toybuf, "."); 69 if (FLAG(s)) *dot = '\0'; 70 xputs(FLAG(d) ? dot+1 : toybuf); 71} 72 73void dnsdomainname_main(void) 74{ 75 toys.optflags = FLAG_d; 76 hostname_main(); 77} 78