Print this page
NEX-3510 Want "scripted" mode for svcs(1) (fix trailing tab)
NEX-3510 Want "scripted" mode for svcs(1)
Reviewed by: Dan Fields <dan.fields@nexenta.com>
Reviewed by: Hans Rosenfeld <hans.rosenfeld@nexenta.com>
        
*** 20,29 ****
--- 20,30 ----
   */
  
  /*
   * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
   * Copyright (c) 2011, Joyent, Inc. All rights reserved.
+  * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
   * Copyright (c) 2015, 2016 by Delphix. All rights reserved.
   */
  
  /*
   * svcs - display attributes of service instances
*** 144,153 ****
--- 145,155 ----
  
  /* Options */
  static int *opt_columns = NULL;         /* Indices into columns to display. */
  static int opt_cnum = 0;
  static int opt_processes = 0;           /* Print processes? */
+ static int opt_scripted = 0;            /* No header, tabs as separators. */
  static int *opt_sort = NULL;            /* Indices into columns to sort. */
  static int opt_snum = 0;
  static int opt_nstate_shown = 0;        /* Will nstate be shown? */
  static int opt_verbose = 0;
  static char *opt_zone;                  /* zone selected, if any */
*** 999,1019 ****
  
          for (i = 0; i < len; ++i)
                  buf[i] = ~buf[i];
  }
  
  /* CTID */
  #define CTID_COLUMN_WIDTH               6
  #define CTID_COLUMN_BUFSIZE             20      /* max ctid_t + space + \0 */
  
  static void
  sprint_ctid(char **buf, scf_walkinfo_t *wip)
  {
          int r;
          uint64_t c;
!         size_t newsize = (*buf ? strlen(*buf) : 0) + CTID_COLUMN_BUFSIZE;
!         char *newbuf = safe_malloc(newsize);
          int restarter_spec;
  
          /*
           * Use the restarter specific get pids routine, if available.
           * Only check for non-legacy services (wip->pg == 0).
--- 1001,1048 ----
  
          for (i = 0; i < len; ++i)
                  buf[i] = ~buf[i];
  }
  
+ static void
+ sprint_str(char **buf, const char *str, size_t width)
+ {
+         char *newbuf;
+         size_t newsz = (*buf != NULL ? strlen(*buf) : 0) + 2;
+ 
+         if (opt_scripted)
+                 newsz += strlen(str);
+         else
+                 newsz += width;
+ 
+         newbuf = safe_malloc(newsz);
+ 
+         if (opt_scripted) {
+                 (void) snprintf(newbuf, newsz, "%s%s%s",
+                     *buf != NULL ? *buf : "",
+                     *buf != NULL ? "\t" : "",
+                     str);
+         } else {
+                 (void) snprintf(newbuf, newsz, "%s%-*s ",
+                     *buf != NULL ? *buf : "", width, str);
+         }
+ 
+         free(*buf);
+         *buf = newbuf;
+ }
+ 
  /* CTID */
  #define CTID_COLUMN_WIDTH               6
  #define CTID_COLUMN_BUFSIZE             20      /* max ctid_t + space + \0 */
  
  static void
  sprint_ctid(char **buf, scf_walkinfo_t *wip)
  {
          int r;
          uint64_t c;
!         char ctid_buf[CTID_COLUMN_BUFSIZE] = { 0 };
!         char *cstr;
          int restarter_spec;
  
          /*
           * Use the restarter specific get pids routine, if available.
           * Only check for non-legacy services (wip->pg == 0).
*** 1029,1050 ****
                          r = get_restarter_count_prop(wip->inst,
                              scf_property_contract, &c, EMPTY_OK | MULTI_OK);
                  }
          }
  
!         if (r == 0)
!                 (void) snprintf(newbuf, newsize, "%s%*lu ",
!                     *buf ? *buf : "", CTID_COLUMN_WIDTH, (ctid_t)c);
!         else if (r == E2BIG)
!                 (void) snprintf(newbuf, newsize, "%s%*lu* ",
!                     *buf ? *buf : "", CTID_COLUMN_WIDTH - 1, (ctid_t)c);
!         else
!                 (void) snprintf(newbuf, newsize, "%s%*s ",
!                     *buf ? *buf : "", CTID_COLUMN_WIDTH, "-");
!         if (*buf)
!                 free(*buf);
!         *buf = newbuf;
  }
  
  #define CTID_SORTKEY_WIDTH              (sizeof (uint64_t))
  
  static void
--- 1058,1075 ----
                          r = get_restarter_count_prop(wip->inst,
                              scf_property_contract, &c, EMPTY_OK | MULTI_OK);
                  }
          }
  
!         if (r == 0 || r == E2BIG) {
!                 if (r == E2BIG)
!                         ctid_buf[CTID_COLUMN_BUFSIZE - 2] = '*';
!                 cstr = ulltostr(c, &ctid_buf[CTID_COLUMN_BUFSIZE - 2]);
!                 sprint_str(buf, cstr, CTID_COLUMN_WIDTH);
!         } else {
!                 sprint_str(buf, "-", CTID_COLUMN_WIDTH);
!         }
  }
  
  #define CTID_SORTKEY_WIDTH              (sizeof (uint64_t))
  
  static void
*** 1092,1103 ****
  
  static void
  sprint_desc(char **buf, scf_walkinfo_t *wip)
  {
          char *x;
-         size_t newsize;
-         char *newbuf;
  
          if (common_name_buf == NULL)
                  common_name_buf = safe_malloc(max_scf_value_length + 1);
  
          bzero(common_name_buf, max_scf_value_length + 1);
--- 1117,1126 ----
*** 1118,1138 ****
           */
          for (x = common_name_buf; *x != '\0'; x++)
                  if (*x == '\n')
                          *x = ' ';
  
!         if (strlen(common_name_buf) > DESC_COLUMN_WIDTH)
!                 newsize = (*buf ? strlen(*buf) : 0) +
!                     strlen(common_name_buf) + 1;
!         else
!                 newsize = (*buf ? strlen(*buf) : 0) + DESC_COLUMN_WIDTH + 1;
!         newbuf = safe_malloc(newsize);
!         (void) snprintf(newbuf, newsize, "%s%-*s ", *buf ? *buf : "",
!             DESC_COLUMN_WIDTH, common_name_buf);
!         if (*buf)
!                 free(*buf);
!         *buf = newbuf;
  }
  
  /* ARGSUSED */
  static void
  sortkey_desc(char *buf, int reverse, scf_walkinfo_t *wip)
--- 1141,1151 ----
           */
          for (x = common_name_buf; *x != '\0'; x++)
                  if (*x == '\n')
                          *x = ' ';
  
!         sprint_str(buf, common_name_buf, DESC_COLUMN_WIDTH);
  }
  
  /* ARGSUSED */
  static void
  sortkey_desc(char *buf, int reverse, scf_walkinfo_t *wip)
*** 1218,1229 ****
  
  static void
  sprint_state(char **buf, scf_walkinfo_t *wip)
  {
          char state_name[MAX_SCF_STATE_STRING_SZ + 1];
-         size_t newsize;
-         char *newbuf;
  
          if (wip->pg == NULL) {
                  get_restarter_string_prop(wip->inst, scf_property_state,
                      state_name, sizeof (state_name));
  
--- 1231,1240 ----
*** 1238,1255 ****
                          (void) strcat(state_name, "*");
                  }
          } else
                  (void) strcpy(state_name, SCF_STATE_STRING_LEGACY);
  
!         newsize = (*buf ? strlen(*buf) : 0) + MAX_SCF_STATE_STRING_SZ + 2;
!         newbuf = safe_malloc(newsize);
!         (void) snprintf(newbuf, newsize, "%s%-*s ", *buf ? *buf : "",
!             MAX_SCF_STATE_STRING_SZ + 1, state_name);
! 
!         if (*buf)
!                 free(*buf);
!         *buf = newbuf;
  }
  
  static void
  sortkey_state(char *buf, int reverse, scf_walkinfo_t *wip)
  {
--- 1249,1259 ----
                          (void) strcat(state_name, "*");
                  }
          } else
                  (void) strcpy(state_name, SCF_STATE_STRING_LEGACY);
  
!         sprint_str(buf, state_name, MAX_SCF_STATE_STRING_SZ);
  }
  
  static void
  sortkey_state(char *buf, int reverse, scf_walkinfo_t *wip)
  {
*** 1257,1294 ****
  }
  
  static void
  sprint_nstate(char **buf, scf_walkinfo_t *wip)
  {
!         char next_state_name[MAX_SCF_STATE_STRING_SZ];
          boolean_t blank = 0;
-         size_t newsize;
-         char *newbuf;
  
          if (wip->pg == NULL) {
                  get_restarter_string_prop(wip->inst, scf_property_next_state,
                      next_state_name, sizeof (next_state_name));
  
                  /* Don't print blank fields, to ease parsing. */
                  if (next_state_name[0] == '\0' ||
                      strcmp(next_state_name, SCF_STATE_STRING_NONE) == 0)
                          blank = 1;
!         } else
                  blank = 1;
  
          if (blank) {
                  next_state_name[0] = '-';
                  next_state_name[1] = '\0';
          }
  
!         newsize = (*buf ? strlen(*buf) : 0) + MAX_SCF_STATE_STRING_SZ + 1;
!         newbuf = safe_malloc(newsize);
!         (void) snprintf(newbuf, newsize, "%s%-*s ", *buf ? *buf : "",
!             MAX_SCF_STATE_STRING_SZ - 1, next_state_name);
!         if (*buf)
!                 free(*buf);
!         *buf = newbuf;
  }
  
  static void
  sortkey_nstate(char *buf, int reverse, scf_walkinfo_t *wip)
  {
--- 1261,1291 ----
  }
  
  static void
  sprint_nstate(char **buf, scf_walkinfo_t *wip)
  {
!         char next_state_name[MAX_SCF_STATE_STRING_SZ + 1];
          boolean_t blank = 0;
  
          if (wip->pg == NULL) {
                  get_restarter_string_prop(wip->inst, scf_property_next_state,
                      next_state_name, sizeof (next_state_name));
  
                  /* Don't print blank fields, to ease parsing. */
                  if (next_state_name[0] == '\0' ||
                      strcmp(next_state_name, SCF_STATE_STRING_NONE) == 0)
                          blank = 1;
!         } else {
                  blank = 1;
+         }
  
          if (blank) {
                  next_state_name[0] = '-';
                  next_state_name[1] = '\0';
          }
  
!         sprint_str(buf, next_state_name, MAX_SCF_STATE_STRING_SZ);
  }
  
  static void
  sortkey_nstate(char *buf, int reverse, scf_walkinfo_t *wip)
  {
*** 1296,1309 ****
  }
  
  static void
  sprint_s(char **buf, scf_walkinfo_t *wip)
  {
!         char tmp[3];
!         char state_name[MAX_SCF_STATE_STRING_SZ];
!         size_t newsize = (*buf ? strlen(*buf) : 0) + 4;
!         char *newbuf = safe_malloc(newsize);
  
          if (wip->pg == NULL) {
                  get_restarter_string_prop(wip->inst, scf_property_state,
                      state_name, sizeof (state_name));
                  tmp[0] = state_to_char(state_name);
--- 1293,1304 ----
  }
  
  static void
  sprint_s(char **buf, scf_walkinfo_t *wip)
  {
!         char state_name[MAX_SCF_STATE_STRING_SZ + 1];
!         char tmp[3] = { 0 };
  
          if (wip->pg == NULL) {
                  get_restarter_string_prop(wip->inst, scf_property_state,
                      state_name, sizeof (state_name));
                  tmp[0] = state_to_char(state_name);
*** 1315,1365 ****
          } else {
                  tmp[0] = 'L';
                  tmp[1] = ' ';
          }
          tmp[2] = ' ';
!         (void) snprintf(newbuf, newsize, "%s%-*s", *buf ? *buf : "",
!             3, tmp);
!         if (*buf)
!                 free(*buf);
!         *buf = newbuf;
  }
  
  static void
  sprint_n(char **buf, scf_walkinfo_t *wip)
  {
!         char tmp[2];
!         size_t newsize = (*buf ? strlen(*buf) : 0) + 3;
!         char *newbuf = safe_malloc(newsize);
!         char nstate_name[MAX_SCF_STATE_STRING_SZ];
  
          if (wip->pg == NULL) {
                  get_restarter_string_prop(wip->inst, scf_property_next_state,
                      nstate_name, sizeof (nstate_name));
  
                  if (strcmp(nstate_name, SCF_STATE_STRING_NONE) == 0)
                          tmp[0] = '-';
                  else
                          tmp[0] = state_to_char(nstate_name);
!         } else
                  tmp[0] = '-';
  
!         (void) snprintf(newbuf, newsize, "%s%-*s ", *buf ? *buf : "",
!             2, tmp);
!         if (*buf)
!                 free(*buf);
!         *buf = newbuf;
  }
  
  static void
  sprint_sn(char **buf, scf_walkinfo_t *wip)
  {
!         char tmp[3];
!         size_t newsize = (*buf ? strlen(*buf) : 0) + 4;
!         char *newbuf = safe_malloc(newsize);
!         char nstate_name[MAX_SCF_STATE_STRING_SZ];
!         char state_name[MAX_SCF_STATE_STRING_SZ];
  
          if (wip->pg == NULL) {
                  get_restarter_string_prop(wip->inst, scf_property_state,
                      state_name, sizeof (state_name));
                  get_restarter_string_prop(wip->inst, scf_property_next_state,
--- 1310,1350 ----
          } else {
                  tmp[0] = 'L';
                  tmp[1] = ' ';
          }
          tmp[2] = ' ';
! 
!         sprint_str(buf, tmp, 2);
  }
  
  static void
  sprint_n(char **buf, scf_walkinfo_t *wip)
  {
!         char nstate_name[MAX_SCF_STATE_STRING_SZ + 1];
!         char tmp[2] = { 0 };
  
          if (wip->pg == NULL) {
                  get_restarter_string_prop(wip->inst, scf_property_next_state,
                      nstate_name, sizeof (nstate_name));
  
                  if (strcmp(nstate_name, SCF_STATE_STRING_NONE) == 0)
                          tmp[0] = '-';
                  else
                          tmp[0] = state_to_char(nstate_name);
!         } else {
                  tmp[0] = '-';
+         }
  
!         sprint_str(buf, tmp, 1);
  }
  
  static void
  sprint_sn(char **buf, scf_walkinfo_t *wip)
  {
!         char state_name[MAX_SCF_STATE_STRING_SZ + 1];
!         char nstate_name[MAX_SCF_STATE_STRING_SZ + 1];
!         char tmp[3] = { 0 };
  
          if (wip->pg == NULL) {
                  get_restarter_string_prop(wip->inst, scf_property_state,
                      state_name, sizeof (state_name));
                  get_restarter_string_prop(wip->inst, scf_property_next_state,
*** 1373,1388 ****
          } else {
                  tmp[0] = 'L';
                  tmp[1] = '-';
          }
  
!         tmp[2] = ' ';
!         (void) snprintf(newbuf, newsize, "%s%-*s ", *buf ? *buf : "",
!             3, tmp);
!         if (*buf)
!                 free(*buf);
!         *buf = newbuf;
  }
  
  /* ARGSUSED */
  static void
  sortkey_sn(char *buf, int reverse, scf_walkinfo_t *wip)
--- 1358,1368 ----
          } else {
                  tmp[0] = 'L';
                  tmp[1] = '-';
          }
  
!         sprint_str(buf, tmp, 2);
  }
  
  /* ARGSUSED */
  static void
  sortkey_sn(char *buf, int reverse, scf_walkinfo_t *wip)
*** 1413,1476 ****
  }
  
  static void
  sprint_sta(char **buf, scf_walkinfo_t *wip)
  {
!         char state_name[MAX_SCF_STATE_STRING_SZ];
!         char sta[5];
!         size_t newsize = (*buf ? strlen(*buf) : 0) + 6;
!         char *newbuf = safe_malloc(newsize);
  
!         if (wip->pg == NULL)
                  get_restarter_string_prop(wip->inst, scf_property_state,
                      state_name, sizeof (state_name));
!         else
                  (void) strcpy(state_name, SCF_STATE_STRING_LEGACY);
  
          (void) strcpy(sta, state_abbrev(state_name));
  
          if (wip->pg == NULL && !opt_nstate_shown && transitioning(wip->inst))
                  (void) strcat(sta, "*");
  
!         (void) snprintf(newbuf, newsize, "%s%-4s ", *buf ? *buf : "", sta);
!         if (*buf)
!                 free(*buf);
!         *buf = newbuf;
  }
  
  static void
  sprint_nsta(char **buf, scf_walkinfo_t *wip)
  {
!         char state_name[MAX_SCF_STATE_STRING_SZ];
!         size_t newsize = (*buf ? strlen(*buf) : 0) + 6;
!         char *newbuf = safe_malloc(newsize);
  
!         if (wip->pg == NULL)
                  get_restarter_string_prop(wip->inst, scf_property_next_state,
                      state_name, sizeof (state_name));
!         else
                  (void) strcpy(state_name, SCF_STATE_STRING_NONE);
  
          if (strcmp(state_name, SCF_STATE_STRING_NONE) == 0)
!                 (void) snprintf(newbuf, newsize, "%s%-4s ", *buf ? *buf : "",
!                     "-");
          else
!                 (void) snprintf(newbuf, newsize, "%s%-4s ", *buf ? *buf : "",
!                     state_abbrev(state_name));
!         if (*buf)
!                 free(*buf);
!         *buf = newbuf;
  }
  
  /* FMRI */
  #define FMRI_COLUMN_WIDTH       50
  static void
  sprint_fmri(char **buf, scf_walkinfo_t *wip)
  {
          char *fmri_buf = safe_malloc(max_scf_fmri_length + 1);
-         size_t newsize;
-         char *newbuf;
  
          if (wip->pg == NULL) {
                  if (scf_instance_to_fmri(wip->inst, fmri_buf,
                      max_scf_fmri_length + 1) == -1)
                          scfdie();
--- 1393,1444 ----
  }
  
  static void
  sprint_sta(char **buf, scf_walkinfo_t *wip)
  {
!         char state_name[MAX_SCF_STATE_STRING_SZ + 1];
!         char sta[5] = { 0 };
  
!         if (wip->pg == NULL) {
                  get_restarter_string_prop(wip->inst, scf_property_state,
                      state_name, sizeof (state_name));
!         } else {
                  (void) strcpy(state_name, SCF_STATE_STRING_LEGACY);
+         }
  
          (void) strcpy(sta, state_abbrev(state_name));
  
          if (wip->pg == NULL && !opt_nstate_shown && transitioning(wip->inst))
                  (void) strcat(sta, "*");
  
!         sprint_str(buf, sta, 4);
  }
  
  static void
  sprint_nsta(char **buf, scf_walkinfo_t *wip)
  {
!         char state_name[MAX_SCF_STATE_STRING_SZ + 1];
  
!         if (wip->pg == NULL) {
                  get_restarter_string_prop(wip->inst, scf_property_next_state,
                      state_name, sizeof (state_name));
!         } else {
                  (void) strcpy(state_name, SCF_STATE_STRING_NONE);
+         }
  
          if (strcmp(state_name, SCF_STATE_STRING_NONE) == 0)
!                 sprint_str(buf, "-", 4);
          else
!                 sprint_str(buf, state_abbrev(state_name), 4);
  }
  
  /* FMRI */
  #define FMRI_COLUMN_WIDTH       50
  static void
  sprint_fmri(char **buf, scf_walkinfo_t *wip)
  {
          char *fmri_buf = safe_malloc(max_scf_fmri_length + 1);
  
          if (wip->pg == NULL) {
                  if (scf_instance_to_fmri(wip->inst, fmri_buf,
                      max_scf_fmri_length + 1) == -1)
                          scfdie();
*** 1482,1502 ****
                      max_scf_fmri_length + 1 -
                      (sizeof (SCF_FMRI_LEGACY_PREFIX) - 1), 0) != 0)
                          (void) strcat(fmri_buf, LEGACY_UNKNOWN);
          }
  
!         if (strlen(fmri_buf) > FMRI_COLUMN_WIDTH)
!                 newsize = (*buf ? strlen(*buf) : 0) + strlen(fmri_buf) + 2;
!         else
!                 newsize = (*buf ? strlen(*buf) : 0) + FMRI_COLUMN_WIDTH + 2;
!         newbuf = safe_malloc(newsize);
!         (void) snprintf(newbuf, newsize, "%s%-*s ", *buf ? *buf : "",
!             FMRI_COLUMN_WIDTH, fmri_buf);
          free(fmri_buf);
-         if (*buf)
-                 free(*buf);
-         *buf = newbuf;
  }
  
  static void
  sortkey_fmri(char *buf, int reverse, scf_walkinfo_t *wip)
  {
--- 1450,1461 ----
                      max_scf_fmri_length + 1 -
                      (sizeof (SCF_FMRI_LEGACY_PREFIX) - 1), 0) != 0)
                          (void) strcat(fmri_buf, LEGACY_UNKNOWN);
          }
  
!         sprint_str(buf, fmri_buf, FMRI_COLUMN_WIDTH);
          free(fmri_buf);
  }
  
  static void
  sortkey_fmri(char *buf, int reverse, scf_walkinfo_t *wip)
  {
*** 1513,1535 ****
  #define COMPONENT_COLUMN_WIDTH  20
  static void
  sprint_scope(char **buf, scf_walkinfo_t *wip)
  {
          char *scope_buf = safe_malloc(max_scf_name_length + 1);
-         size_t newsize = (*buf ? strlen(*buf) : 0) + COMPONENT_COLUMN_WIDTH + 2;
-         char *newbuf = safe_malloc(newsize);
  
          assert(wip->scope != NULL);
  
          if (scf_scope_get_name(wip->scope, scope_buf, max_scf_name_length) < 0)
                  scfdie();
  
!         (void) snprintf(newbuf, newsize, "%s%-*s ", *buf ? *buf : "",
!             COMPONENT_COLUMN_WIDTH, scope_buf);
!         if (*buf)
!                 free(*buf);
!         *buf = newbuf;
          free(scope_buf);
  }
  
  static void
  sortkey_scope(char *buf, int reverse, scf_walkinfo_t *wip)
--- 1472,1488 ----
  #define COMPONENT_COLUMN_WIDTH  20
  static void
  sprint_scope(char **buf, scf_walkinfo_t *wip)
  {
          char *scope_buf = safe_malloc(max_scf_name_length + 1);
  
          assert(wip->scope != NULL);
  
          if (scf_scope_get_name(wip->scope, scope_buf, max_scf_name_length) < 0)
                  scfdie();
  
!         sprint_str(buf, scope_buf, COMPONENT_COLUMN_WIDTH);
          free(scope_buf);
  }
  
  static void
  sortkey_scope(char *buf, int reverse, scf_walkinfo_t *wip)
*** 1545,1556 ****
  
  static void
  sprint_service(char **buf, scf_walkinfo_t *wip)
  {
          char *svc_buf = safe_malloc(max_scf_name_length + 1);
-         char *newbuf;
-         size_t newsize;
  
          if (wip->pg == NULL) {
                  if (scf_service_get_name(wip->svc, svc_buf,
                      max_scf_name_length + 1) < 0)
                          scfdie();
--- 1498,1507 ----
*** 1558,1580 ****
                  if (pg_get_single_val(wip->pg, "name", SCF_TYPE_ASTRING,
                      svc_buf, max_scf_name_length + 1, EMPTY_OK) != 0)
                          (void) strcpy(svc_buf, LEGACY_UNKNOWN);
          }
  
! 
!         if (strlen(svc_buf) > COMPONENT_COLUMN_WIDTH)
!                 newsize = (*buf ? strlen(*buf) : 0) + strlen(svc_buf) + 2;
!         else
!                 newsize = (*buf ? strlen(*buf) : 0) +
!                     COMPONENT_COLUMN_WIDTH + 2;
!         newbuf = safe_malloc(newsize);
!         (void) snprintf(newbuf, newsize, "%s%-*s ", *buf ? *buf : "",
!             COMPONENT_COLUMN_WIDTH, svc_buf);
          free(svc_buf);
-         if (*buf)
-                 free(*buf);
-         *buf = newbuf;
  }
  
  static void
  sortkey_service(char *buf, int reverse, scf_walkinfo_t *wip)
  {
--- 1509,1520 ----
                  if (pg_get_single_val(wip->pg, "name", SCF_TYPE_ASTRING,
                      svc_buf, max_scf_name_length + 1, EMPTY_OK) != 0)
                          (void) strcpy(svc_buf, LEGACY_UNKNOWN);
          }
  
!         sprint_str(buf, svc_buf, COMPONENT_COLUMN_WIDTH);
          free(svc_buf);
  }
  
  static void
  sortkey_service(char *buf, int reverse, scf_walkinfo_t *wip)
  {
*** 1589,1617 ****
  
  /* INST */
  static void
  sprint_instance(char **buf, scf_walkinfo_t *wip)
  {
!         char *tmp = safe_malloc(max_scf_name_length + 1);
!         size_t newsize = (*buf ? strlen(*buf) : 0) + COMPONENT_COLUMN_WIDTH + 2;
!         char *newbuf = safe_malloc(newsize);
  
          if (wip->pg == NULL) {
!                 if (scf_instance_get_name(wip->inst, tmp,
                      max_scf_name_length + 1) < 0)
                          scfdie();
          } else {
!                 tmp[0] = '-';
!                 tmp[1] = '\0';
          }
  
!         (void) snprintf(newbuf, newsize, "%s%-*s ", *buf ? *buf : "",
!             COMPONENT_COLUMN_WIDTH, tmp);
!         if (*buf)
!                 free(*buf);
!         *buf = newbuf;
!         free(tmp);
  }
  
  static void
  sortkey_instance(char *buf, int reverse, scf_walkinfo_t *wip)
  {
--- 1529,1552 ----
  
  /* INST */
  static void
  sprint_instance(char **buf, scf_walkinfo_t *wip)
  {
!         char *inst_buf = safe_malloc(max_scf_name_length + 1);
  
          if (wip->pg == NULL) {
!                 if (scf_instance_get_name(wip->inst, inst_buf,
                      max_scf_name_length + 1) < 0)
                          scfdie();
          } else {
!                 inst_buf[0] = '-';
!                 inst_buf[1] = '\0';
          }
  
! 
!         sprint_str(buf, inst_buf, COMPONENT_COLUMN_WIDTH);
!         free(inst_buf);
  }
  
  static void
  sortkey_instance(char *buf, int reverse, scf_walkinfo_t *wip)
  {
*** 1625,1636 ****
  }
  
  /* STIME */
  #define STIME_COLUMN_WIDTH              8
  #define FORMAT_TIME                     "%k:%M:%S"
! #define FORMAT_DATE                     "%b_%d  "
! #define FORMAT_YEAR                     "%Y    "
  
  /*
   * sprint_stime() will allocate a new buffer and snprintf the services's
   * state timestamp.  If the timestamp is unavailable for some reason
   * a '-' is given instead.
--- 1560,1571 ----
  }
  
  /* STIME */
  #define STIME_COLUMN_WIDTH              8
  #define FORMAT_TIME                     "%k:%M:%S"
! #define FORMAT_DATE                     "%b_%d"
! #define FORMAT_YEAR                     "%Y"
  
  /*
   * sprint_stime() will allocate a new buffer and snprintf the services's
   * state timestamp.  If the timestamp is unavailable for some reason
   * a '-' is given instead.
*** 1641,1652 ****
          int r;
          struct timeval tv;
          time_t then;
          struct tm *tm;
          char st_buf[STIME_COLUMN_WIDTH + 1];
-         size_t newsize = (*buf ? strlen(*buf) : 0) + STIME_COLUMN_WIDTH + 2;
-         char *newbuf = safe_malloc(newsize);
  
          if (wip->pg == NULL) {
                  r = get_restarter_time_prop(wip->inst,
                      SCF_PROPERTY_STATE_TIMESTAMP, &tv, 0);
          } else {
--- 1576,1585 ----
*** 1657,1668 ****
          if (r != 0) {
                  /*
                   * There's something amiss with our service
                   * so we'll print a '-' for STIME.
                   */
!                 (void) snprintf(newbuf, newsize, "%s%-*s", *buf ? *buf : "",
!                     STIME_COLUMN_WIDTH + 1, "-");
          } else {
                  /* tv should be valid so we'll format it */
                  then = (time_t)tv.tv_sec;
  
                  tm = localtime(&then);
--- 1590,1600 ----
          if (r != 0) {
                  /*
                   * There's something amiss with our service
                   * so we'll print a '-' for STIME.
                   */
!                 sprint_str(buf, "-", STIME_COLUMN_WIDTH);
          } else {
                  /* tv should be valid so we'll format it */
                  then = (time_t)tv.tv_sec;
  
                  tm = localtime(&then);
*** 1679,1694 ****
                              gettext(FORMAT_DATE), tm);
                  } else {
                          (void) strftime(st_buf, sizeof (st_buf),
                              gettext(FORMAT_YEAR), tm);
                  }
!                 (void) snprintf(newbuf, newsize, "%s%-*s ", *buf ? *buf : "",
!                     STIME_COLUMN_WIDTH + 1, st_buf);
          }
-         if (*buf)
-                 free(*buf);
-         *buf = newbuf;
  }
  
  #define STIME_SORTKEY_WIDTH             (sizeof (uint64_t) + sizeof (uint32_t))
  
  /* ARGSUSED */
--- 1611,1622 ----
                              gettext(FORMAT_DATE), tm);
                  } else {
                          (void) strftime(st_buf, sizeof (st_buf),
                              gettext(FORMAT_YEAR), tm);
                  }
!                 sprint_str(buf, st_buf, STIME_COLUMN_WIDTH);
          }
  }
  
  #define STIME_SORTKEY_WIDTH             (sizeof (uint64_t) + sizeof (uint32_t))
  
  /* ARGSUSED */
*** 1729,1740 ****
  #define ZONE_COLUMN_WIDTH       16
  /*ARGSUSED*/
  static void
  sprint_zone(char **buf, scf_walkinfo_t *wip)
  {
!         size_t newsize;
!         char *newbuf, *zonename = g_zonename, b[ZONENAME_MAX];
  
          if (zonename == NULL) {
                  zoneid_t zoneid = getzoneid();
  
                  if (getzonenamebyid(zoneid, b, sizeof (b)) < 0)
--- 1657,1667 ----
  #define ZONE_COLUMN_WIDTH       16
  /*ARGSUSED*/
  static void
  sprint_zone(char **buf, scf_walkinfo_t *wip)
  {
!         char *zonename = g_zonename, b[ZONENAME_MAX];
  
          if (zonename == NULL) {
                  zoneid_t zoneid = getzoneid();
  
                  if (getzonenamebyid(zoneid, b, sizeof (b)) < 0)
*** 1741,1762 ****
                          uu_die(gettext("could not determine zone name"));
  
                  zonename = b;
          }
  
!         if (strlen(zonename) > ZONE_COLUMN_WIDTH)
!                 newsize = (*buf ? strlen(*buf) : 0) + strlen(zonename) + 2;
!         else
!                 newsize = (*buf ? strlen(*buf) : 0) + ZONE_COLUMN_WIDTH + 2;
! 
!         newbuf = safe_malloc(newsize);
!         (void) snprintf(newbuf, newsize, "%s%-*s ", *buf ? *buf : "",
!             ZONE_COLUMN_WIDTH, zonename);
! 
!         if (*buf)
!                 free(*buf);
!         *buf = newbuf;
  }
  
  static void
  sortkey_zone(char *buf, int reverse, scf_walkinfo_t *wip)
  {
--- 1668,1678 ----
                          uu_die(gettext("could not determine zone name"));
  
                  zonename = b;
          }
  
!         sprint_str(buf, zonename, ZONE_COLUMN_WIDTH);
  }
  
  static void
  sortkey_zone(char *buf, int reverse, scf_walkinfo_t *wip)
  {
*** 1782,1801 ****
                  FMRI_COLUMN_WIDTH, sortkey_fmri },
          { "INST", COMPONENT_COLUMN_WIDTH, sprint_instance,
                  COMPONENT_COLUMN_WIDTH, sortkey_instance },
          { "N", 1,  sprint_n, 1, sortkey_nstate },
          { "NSTA", 4, sprint_nsta, 1, sortkey_nstate },
!         { "NSTATE", MAX_SCF_STATE_STRING_SZ - 1, sprint_nstate,
                  1, sortkey_nstate },
          { "S", 2, sprint_s, 1, sortkey_state },
          { "SCOPE", COMPONENT_COLUMN_WIDTH, sprint_scope,
                  COMPONENT_COLUMN_WIDTH, sortkey_scope },
          { "SN", 2, sprint_sn, 2, sortkey_sn },
          { "SVC", COMPONENT_COLUMN_WIDTH, sprint_service,
                  COMPONENT_COLUMN_WIDTH, sortkey_service },
          { "STA", 4, sprint_sta, 1, sortkey_state },
!         { "STATE", MAX_SCF_STATE_STRING_SZ - 1 + 1, sprint_state,
                  1, sortkey_state },
          { "STIME", STIME_COLUMN_WIDTH, sprint_stime,
                  STIME_SORTKEY_WIDTH, sortkey_stime },
          { "ZONE", ZONE_COLUMN_WIDTH, sprint_zone,
                  ZONE_COLUMN_WIDTH, sortkey_zone },
--- 1698,1717 ----
                  FMRI_COLUMN_WIDTH, sortkey_fmri },
          { "INST", COMPONENT_COLUMN_WIDTH, sprint_instance,
                  COMPONENT_COLUMN_WIDTH, sortkey_instance },
          { "N", 1,  sprint_n, 1, sortkey_nstate },
          { "NSTA", 4, sprint_nsta, 1, sortkey_nstate },
!         { "NSTATE", MAX_SCF_STATE_STRING_SZ, sprint_nstate,
                  1, sortkey_nstate },
          { "S", 2, sprint_s, 1, sortkey_state },
          { "SCOPE", COMPONENT_COLUMN_WIDTH, sprint_scope,
                  COMPONENT_COLUMN_WIDTH, sortkey_scope },
          { "SN", 2, sprint_sn, 2, sortkey_sn },
          { "SVC", COMPONENT_COLUMN_WIDTH, sprint_service,
                  COMPONENT_COLUMN_WIDTH, sortkey_service },
          { "STA", 4, sprint_sta, 1, sortkey_state },
!         { "STATE", MAX_SCF_STATE_STRING_SZ, sprint_state,
                  1, sortkey_state },
          { "STIME", STIME_COLUMN_WIDTH, sprint_stime,
                  STIME_SORTKEY_WIDTH, sortkey_stime },
          { "ZONE", ZONE_COLUMN_WIDTH, sprint_zone,
                  ZONE_COLUMN_WIDTH, sortkey_zone },
*** 1867,1884 ****
  
  
  static void
  print_usage(const char *progname, FILE *f, boolean_t do_exit)
  {
!         (void) fprintf(f, gettext(
!             "Usage: %1$s [-aHpv] [-o col[,col ... ]] [-R restarter] "
!             "[-sS col] [-Z | -z zone ]\n            [<service> ...]\n"
!             "       %1$s -d | -D [-Hpv] [-o col[,col ... ]] [-sS col] "
!             "[-Z | -z zone ]\n            [<service> ...]\n"
!             "       %1$s [-l | -L] [-Z | -z zone] <service> ...\n"
!             "       %1$s -x [-v] [-Z | -z zone] [<service> ...]\n"
!             "       %1$s -?\n"), progname);
  
          if (do_exit)
                  exit(UU_EXIT_USAGE);
  }
  
--- 1783,1799 ----
  
  
  static void
  print_usage(const char *progname, FILE *f, boolean_t do_exit)
  {
!         (void) fprintf(f, gettext("usage:\n"
!             "%1$s\t[-aHpv?] [-o col[,col]...] [-R FMRI-instance]... "
!             "[-sS col]...\n\t[-z zone|-Z] [FMRI|pattern]...\n"
!             "%1$s\t{-d|-D} -Hpv? [-o col[,col]...] [-sS col]... [-z zone|-Z]\n"
!             "\t[FMRI|pattern]...\n"
!             "%1$s\t{-l|-L} [-v] [-z zone|-Z] {FMRI|pattern}...\n"
!             "%1$s\t-x [-v] [-z zone|-Z] [FMRI]...\n"), progname);
  
          if (do_exit)
                  exit(UU_EXIT_USAGE);
  }
  
*** 3452,3462 ****
          zoneid_t *zids = NULL;
          char zonename[ZONENAME_MAX];
          void (*errfunc)(const char *, ...);
  
          int show_all = 0;
-         int show_header = 1;
          int show_zones = 0;
  
          const char * const options = "aHpvno:R:s:S:dDlL?xZz:";
  
          (void) setlocale(LC_ALL, "");
--- 3367,3376 ----
*** 3542,3552 ****
                          break;
  
                  case 'H':
                          if (opt_mode == 'l' || opt_mode == 'x')
                                  argserr(progname);
!                         show_header = 0;
                          break;
  
                  case 'p':
                          if (opt_mode == 'x')
                                  argserr(progname);
--- 3456,3466 ----
                          break;
  
                  case 'H':
                          if (opt_mode == 'l' || opt_mode == 'x')
                                  argserr(progname);
!                         opt_scripted = 1;
                          break;
  
                  case 'p':
                          if (opt_mode == 'x')
                                  argserr(progname);
*** 3921,3931 ****
                  exit_status = missing;
  
          if (opt_columns == NULL)
                  return (exit_status);
  
!         if (show_header)
                  print_header();
  
          (void) uu_avl_walk(lines, print_line, NULL, 0);
  
          return (exit_status);
--- 3835,3845 ----
                  exit_status = missing;
  
          if (opt_columns == NULL)
                  return (exit_status);
  
!         if (!opt_scripted)
                  print_header();
  
          (void) uu_avl_walk(lines, print_line, NULL, 0);
  
          return (exit_status);