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,10 +20,11 @@
  */
 
 /*
  * 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,10 +145,11 @@
 
 /* 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,21 +1001,48 @@
 
         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;
-        size_t newsize = (*buf ? strlen(*buf) : 0) + CTID_COLUMN_BUFSIZE;
-        char *newbuf = safe_malloc(newsize);
+        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,22 +1058,18 @@
                         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;
+        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,12 +1117,10 @@
 
 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);

@@ -1118,21 +1141,11 @@
          */
         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;
+        sprint_str(buf, common_name_buf, DESC_COLUMN_WIDTH);
 }
 
 /* ARGSUSED */
 static void
 sortkey_desc(char *buf, int reverse, scf_walkinfo_t *wip)

@@ -1218,12 +1231,10 @@
 
 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));
 

@@ -1238,18 +1249,11 @@
                         (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;
+        sprint_str(buf, state_name, MAX_SCF_STATE_STRING_SZ);
 }
 
 static void
 sortkey_state(char *buf, int reverse, scf_walkinfo_t *wip)
 {

@@ -1257,38 +1261,31 @@
 }
 
 static void
 sprint_nstate(char **buf, scf_walkinfo_t *wip)
 {
-        char next_state_name[MAX_SCF_STATE_STRING_SZ];
+        char next_state_name[MAX_SCF_STATE_STRING_SZ + 1];
         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
+        } 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;
+        sprint_str(buf, next_state_name, MAX_SCF_STATE_STRING_SZ);
 }
 
 static void
 sortkey_nstate(char *buf, int reverse, scf_walkinfo_t *wip)
 {

@@ -1296,14 +1293,12 @@
 }
 
 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);
+        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,51 +1310,41 @@
         } else {
                 tmp[0] = 'L';
                 tmp[1] = ' ';
         }
         tmp[2] = ' ';
-        (void) snprintf(newbuf, newsize, "%s%-*s", *buf ? *buf : "",
-            3, tmp);
-        if (*buf)
-                free(*buf);
-        *buf = newbuf;
+
+        sprint_str(buf, tmp, 2);
 }
 
 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];
+        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
+        } else {
                 tmp[0] = '-';
+        }
 
-        (void) snprintf(newbuf, newsize, "%s%-*s ", *buf ? *buf : "",
-            2, tmp);
-        if (*buf)
-                free(*buf);
-        *buf = newbuf;
+        sprint_str(buf, tmp, 1);
 }
 
 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];
+        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,16 +1358,11 @@
         } else {
                 tmp[0] = 'L';
                 tmp[1] = '-';
         }
 
-        tmp[2] = ' ';
-        (void) snprintf(newbuf, newsize, "%s%-*s ", *buf ? *buf : "",
-            3, tmp);
-        if (*buf)
-                free(*buf);
-        *buf = newbuf;
+        sprint_str(buf, tmp, 2);
 }
 
 /* ARGSUSED */
 static void
 sortkey_sn(char *buf, int reverse, scf_walkinfo_t *wip)

@@ -1413,64 +1393,52 @@
 }
 
 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);
+        char state_name[MAX_SCF_STATE_STRING_SZ + 1];
+        char sta[5] = { 0 };
 
-        if (wip->pg == NULL)
+        if (wip->pg == NULL) {
                 get_restarter_string_prop(wip->inst, scf_property_state,
                     state_name, sizeof (state_name));
-        else
+        } 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;
+        sprint_str(buf, sta, 4);
 }
 
 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);
+        char state_name[MAX_SCF_STATE_STRING_SZ + 1];
 
-        if (wip->pg == NULL)
+        if (wip->pg == NULL) {
                 get_restarter_string_prop(wip->inst, scf_property_next_state,
                     state_name, sizeof (state_name));
-        else
+        } 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 : "",
-                    "-");
+                sprint_str(buf, "-", 4);
         else
-                (void) snprintf(newbuf, newsize, "%s%-4s ", *buf ? *buf : "",
-                    state_abbrev(state_name));
-        if (*buf)
-                free(*buf);
-        *buf = newbuf;
+                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);
-        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();

@@ -1482,21 +1450,12 @@
                     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);
+        sprint_str(buf, fmri_buf, FMRI_COLUMN_WIDTH);
         free(fmri_buf);
-        if (*buf)
-                free(*buf);
-        *buf = newbuf;
 }
 
 static void
 sortkey_fmri(char *buf, int reverse, scf_walkinfo_t *wip)
 {

@@ -1513,23 +1472,17 @@
 #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;
+        sprint_str(buf, scope_buf, COMPONENT_COLUMN_WIDTH);
         free(scope_buf);
 }
 
 static void
 sortkey_scope(char *buf, int reverse, scf_walkinfo_t *wip)

@@ -1545,12 +1498,10 @@
 
 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();

@@ -1558,23 +1509,12 @@
                 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);
+        sprint_str(buf, svc_buf, COMPONENT_COLUMN_WIDTH);
         free(svc_buf);
-        if (*buf)
-                free(*buf);
-        *buf = newbuf;
 }
 
 static void
 sortkey_service(char *buf, int reverse, scf_walkinfo_t *wip)
 {

@@ -1589,29 +1529,24 @@
 
 /* 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);
+        char *inst_buf = safe_malloc(max_scf_name_length + 1);
 
         if (wip->pg == NULL) {
-                if (scf_instance_get_name(wip->inst, tmp,
+                if (scf_instance_get_name(wip->inst, inst_buf,
                     max_scf_name_length + 1) < 0)
                         scfdie();
         } else {
-                tmp[0] = '-';
-                tmp[1] = '\0';
+                inst_buf[0] = '-';
+                inst_buf[1] = '\0';
         }
 
-        (void) snprintf(newbuf, newsize, "%s%-*s ", *buf ? *buf : "",
-            COMPONENT_COLUMN_WIDTH, tmp);
-        if (*buf)
-                free(*buf);
-        *buf = newbuf;
-        free(tmp);
+
+        sprint_str(buf, inst_buf, COMPONENT_COLUMN_WIDTH);
+        free(inst_buf);
 }
 
 static void
 sortkey_instance(char *buf, int reverse, scf_walkinfo_t *wip)
 {

@@ -1625,12 +1560,12 @@
 }
 
 /* STIME */
 #define STIME_COLUMN_WIDTH              8
 #define FORMAT_TIME                     "%k:%M:%S"
-#define FORMAT_DATE                     "%b_%d  "
-#define FORMAT_YEAR                     "%Y    "
+#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,12 +1576,10 @@
         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 {

@@ -1657,12 +1590,11 @@
         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, "-");
+                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,16 +1611,12 @@
                             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);
+                sprint_str(buf, st_buf, STIME_COLUMN_WIDTH);
         }
-        if (*buf)
-                free(*buf);
-        *buf = newbuf;
 }
 
 #define STIME_SORTKEY_WIDTH             (sizeof (uint64_t) + sizeof (uint32_t))
 
 /* ARGSUSED */

@@ -1729,12 +1657,11 @@
 #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];
+        char *zonename = g_zonename, b[ZONENAME_MAX];
 
         if (zonename == NULL) {
                 zoneid_t zoneid = getzoneid();
 
                 if (getzonenamebyid(zoneid, b, sizeof (b)) < 0)

@@ -1741,22 +1668,11 @@
                         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;
+        sprint_str(buf, zonename, ZONE_COLUMN_WIDTH);
 }
 
 static void
 sortkey_zone(char *buf, int reverse, scf_walkinfo_t *wip)
 {

@@ -1782,20 +1698,20 @@
                 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,
+        { "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 - 1 + 1, sprint_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,18 +1783,17 @@
 
 
 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);
+        (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,11 +3367,10 @@
         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, "");

@@ -3542,11 +3456,11 @@
                         break;
 
                 case 'H':
                         if (opt_mode == 'l' || opt_mode == 'x')
                                 argserr(progname);
-                        show_header = 0;
+                        opt_scripted = 1;
                         break;
 
                 case 'p':
                         if (opt_mode == 'x')
                                 argserr(progname);

@@ -3921,11 +3835,11 @@
                 exit_status = missing;
 
         if (opt_columns == NULL)
                 return (exit_status);
 
-        if (show_header)
+        if (!opt_scripted)
                 print_header();
 
         (void) uu_avl_walk(lines, print_line, NULL, 0);
 
         return (exit_status);