/* hostname.c - Get/Set the hostname
 *
 * Copyright 2012 Andre Renaud <andre@bluewatersys.com>
 *
 * http://refspecs.linuxfoundation.org/LSB_4.1.0/LSB-Core-generic/LSB-Core-generic/hostname.html

USE_HOSTNAME(NEWTOY(hostname, ">1bdsfF:[!bdsf]", TOYFLAG_BIN))
USE_DNSDOMAINNAME(NEWTOY(dnsdomainname, ">0", TOYFLAG_BIN))

config HOSTNAME
  bool "hostname"
  default y
  help
    usage: hostname [-bdsf] [-F FILENAME] [newname]

    Get/set the current hostname.

    -b	Set hostname to 'localhost' if otherwise unset
    -d	Show DNS domain name (no host)
    -f	Show fully-qualified name (host+domain, FQDN)
    -F	Set hostname to contents of FILENAME
    -s	Show short host name (no domain)

config DNSDOMAINNAME
  bool "dnsdomainname"
  default y
  help
    usage: dnsdomainname

    Show domain this system belongs to (same as hostname -d).
*/

#define FOR_hostname
#define FORCE_FLAGS
#include "toys.h"

GLOBALS(
  char *F;
)

void hostname_main(void)
{
  char *hostname = toybuf, *dot;
  struct hostent *h;

  gethostname(toybuf, sizeof(toybuf)-1);
  if (TT.F && (hostname = xreadfile(TT.F, 0, 0))) {
    if (!*chomp(hostname)) {
      if (CFG_TOYBOX_FREE) free(hostname);
      if (!FLAG(b)) error_exit("empty '%s'", TT.F);
      hostname = 0;
    }
  } else hostname  = (FLAG(b) && !*toybuf) ? "localhost" : *toys.optargs;

  // Setting?
  if (hostname) {
    if (sethostname(hostname, strlen(hostname)))
      perror_exit("set '%s'", hostname);
    return;
  }

  // We only do the DNS lookup for -d and -f.
  if (FLAG(d) || FLAG(f)) {
    if (!(h = gethostbyname(toybuf)))
      error_exit("gethostbyname: %s", hstrerror(h_errno));
    snprintf(toybuf, sizeof(toybuf), "%s", h->h_name);
  }
  dot = toybuf+strcspn(toybuf, ".");
  if (FLAG(s)) *dot = '\0';
  xputs(FLAG(d) ? dot+1 : toybuf);
}

void dnsdomainname_main(void)
{
  toys.optflags = FLAG_d;
  hostname_main();
}
