Print this page
3758 RFE: Would like "hostname -s"
3430 Support "hostname --fqdn"

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/hostname/hostname.c
          +++ new/usr/src/cmd/hostname/hostname.c
↓ open down ↓ 24 lines elided ↑ open up ↑
  25   25   * All Rights Reserved
  26   26   *
  27   27   * University Acknowledgment- Portions of this document are derived from
  28   28   * software developed by the University of California, Berkeley, and its
  29   29   * contributors.
  30   30   */
  31   31  
  32   32  /*
  33   33   * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  34   34   * Use is subject to license terms.
       35 + *
       36 + * Copyright 2016 RackTop Systems.
  35   37   */
  36   38  
  37   39  /* Portions Copyright 2007 Jeremy Teo */
  38   40  /* Portions Copyright 2006 Stephen P. Potter */
  39      -#pragma ident   "%Z%%M% %I%     %E% SMI"
  40   41  
  41   42  #include <unistd.h>
  42   43  #include <stdio.h>
  43   44  #include <string.h>
  44   45  #include <locale.h>
  45   46  #include <libgen.h>
  46   47  #include <stdlib.h>
  47   48  #include <errno.h>
  48   49  #include <netdb.h>
       50 +#include <getopt.h>
  49   51  
  50   52  #ifndef TEXT_DOMAIN             /* should be defined by cc -D */
  51   53  #define TEXT_DOMAIN "SYS_TEST"  /* use this only if it wasn't */
  52   54  #endif
  53   55  
  54   56  static char *progname;
  55   57  
  56   58  static void
  57   59  usage(void)
  58   60  {
  59      -        (void) fprintf(stderr, gettext("usage: %s [system_name]\n"),
       61 +        (void) fprintf(stderr, gettext("usage: %s [-fs|system_name]\n"),
  60   62                  basename(progname));
  61   63          exit(1);
  62   64  }
  63   65  
  64   66  int
  65   67  main(int argc, char *argv[])
  66   68  {
  67   69          char    *nodename = NULL;
  68   70          char    c_hostname[MAXHOSTNAMELEN];
  69      -        int     optlet;
  70      -        char    *optstring = "?";
       71 +        int     optlet, optindex = 0;
       72 +        char    *optstring = "fs";
       73 +        int     fflag = 0, sflag = 0;
       74 +        struct  option long_options[] = {
       75 +                {"fqdn",        no_argument,    0,      'f'     },
       76 +                {"long",        no_argument,    0,      'f'     },
       77 +                {"short",       no_argument,    0,      's'     },
       78 +                {NULL,          0,              0,      0       }
       79 +        };
  71   80  
  72   81          (void) setlocale(LC_ALL, "");
  73   82          (void) textdomain(TEXT_DOMAIN);
  74   83  
  75   84          progname = argv[0];
  76   85  
  77   86          opterr = 0;
  78      -        while ((optlet = getopt(argc, argv, optstring)) != -1) {
       87 +        while ((optlet = getopt_long(argc, argv, optstring, long_options,
       88 +            &optindex)) != -1) {
  79   89                  switch (optlet) {
       90 +                case 'f':
       91 +                        fflag++;
       92 +                        break;
       93 +                case 's':
       94 +                        sflag++;
       95 +                        break;
  80   96                  case '?':
  81   97                          usage();
  82   98                  }
  83   99          }
  84  100  
      101 +        /* No flag combinations allowed */
      102 +        if (fflag && sflag)
      103 +                usage();
      104 +
  85  105          /*
  86  106           * if called with no options, just print out the hostname/nodename
  87  107           */
  88  108          if (argc <= optind) {
  89  109                  if (gethostname(c_hostname, sizeof (c_hostname)) < 0) {
  90  110                          (void) fprintf(stderr,
  91  111                              gettext("%s: unable to obtain hostname\n"),
  92  112                              basename(progname));
  93  113                          exit(1);
      114 +                }
      115 +                if (fflag) {
      116 +                        struct addrinfo hints, *info;
      117 +                        memset(&hints, 0, sizeof (struct addrinfo));
      118 +                        hints.ai_socktype = SOCK_DGRAM;
      119 +                        hints.ai_flags = AI_CANONNAME;
      120 +                        if (getaddrinfo(c_hostname, NULL, &hints, &info) != 0) {
      121 +                                (void) fprintf(stderr,
      122 +                                    gettext("%s: unable to obtain fqdn\n"),
      123 +                                    basename(progname));
      124 +                                exit(1);
      125 +                        }
      126 +                        (void) fprintf(stdout, "%s\n", info->ai_canonname);
  94  127                  } else {
      128 +                        if (sflag) {
      129 +                                char *p = strchr(c_hostname, '.');
      130 +                                if (p != NULL)
      131 +                                        *p = '\0';
      132 +                        }
  95  133                          (void) fprintf(stdout, "%s\n", c_hostname);
  96  134                  }
  97  135          } else {
  98  136                  /*
  99  137                   * if called with an argument,
 100  138                   * we have to try to set the new hostname/nodename
 101  139                   */
 102  140                  if (argc > optind + 1)
 103  141                          usage();        /* too many arguments */
 104      -
      142 +                if (fflag)
      143 +                        usage();        /* can't set fqdn this way */
      144 +                if (sflag)
      145 +                        usage();        /* can't set short name */
 105  146                  nodename = argv[optind];
 106  147                  if (sethostname(nodename, strlen(nodename)) < 0) {
 107  148                          int err = errno;
 108  149                          (void) fprintf(stderr,
 109  150                              gettext("%s: error in setting name: %s\n"),
 110  151                              basename(progname), strerror(err));
 111  152                          exit(1);
 112  153                  }
 113  154          }
 114  155          return (0);
 115  156  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX