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>

Split Close
Expand all
Collapse all
          --- old/usr/src/cmd/svc/svcs/svcs.c
          +++ new/usr/src/cmd/svc/svcs/svcs.c
↓ open down ↓ 14 lines elided ↑ open up ↑
  15   15   * If applicable, add the following below this CDDL HEADER, with the
  16   16   * fields enclosed by brackets "[]" replaced with your own identifying
  17   17   * information: Portions Copyright [yyyy] [name of copyright owner]
  18   18   *
  19   19   * CDDL HEADER END
  20   20   */
  21   21  
  22   22  /*
  23   23   * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
  24   24   * Copyright (c) 2011, Joyent, Inc. All rights reserved.
       25 + * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
  25   26   * Copyright (c) 2015, 2016 by Delphix. All rights reserved.
  26   27   */
  27   28  
  28   29  /*
  29   30   * svcs - display attributes of service instances
  30   31   *
  31   32   * We have two output formats and six instance selection mechanisms.  The
  32   33   * primary output format is a line of attributes (selected by -o), possibly
  33   34   * followed by process description lines (if -p is specified), for each
  34   35   * instance selected.  The columns available to display are described by the
↓ open down ↓ 104 lines elided ↑ open up ↑
 139  140  /*
 140  141   * Pathname storage for path generated from the fmri.
 141  142   * Used for reading the ctid and (start) pid files for an inetd service.
 142  143   */
 143  144  static char genfmri_filename[MAXPATHLEN] = "";
 144  145  
 145  146  /* Options */
 146  147  static int *opt_columns = NULL;         /* Indices into columns to display. */
 147  148  static int opt_cnum = 0;
 148  149  static int opt_processes = 0;           /* Print processes? */
      150 +static int opt_scripted = 0;            /* No header, tabs as separators. */
 149  151  static int *opt_sort = NULL;            /* Indices into columns to sort. */
 150  152  static int opt_snum = 0;
 151  153  static int opt_nstate_shown = 0;        /* Will nstate be shown? */
 152  154  static int opt_verbose = 0;
 153  155  static char *opt_zone;                  /* zone selected, if any */
 154  156  
 155  157  /* Minimize string constants. */
 156  158  static const char * const scf_property_state = SCF_PROPERTY_STATE;
 157  159  static const char * const scf_property_next_state = SCF_PROPERTY_NEXT_STATE;
 158  160  static const char * const scf_property_contract = SCF_PROPERTY_CONTRACT;
↓ open down ↓ 835 lines elided ↑ open up ↑
 994  996  
 995  997  static void
 996  998  reverse_bytes(char *buf, size_t len)
 997  999  {
 998 1000          int i;
 999 1001  
1000 1002          for (i = 0; i < len; ++i)
1001 1003                  buf[i] = ~buf[i];
1002 1004  }
1003 1005  
     1006 +static void
     1007 +sprint_str(char **buf, const char *str, size_t width)
     1008 +{
     1009 +        char *newbuf;
     1010 +        size_t newsz = (*buf != NULL ? strlen(*buf) : 0) + 2;
     1011 +
     1012 +        if (opt_scripted)
     1013 +                newsz += strlen(str);
     1014 +        else
     1015 +                newsz += width;
     1016 +
     1017 +        newbuf = safe_malloc(newsz);
     1018 +
     1019 +        if (opt_scripted) {
     1020 +                (void) snprintf(newbuf, newsz, "%s%s%s",
     1021 +                    *buf != NULL ? *buf : "",
     1022 +                    *buf != NULL ? "\t" : "",
     1023 +                    str);
     1024 +        } else {
     1025 +                (void) snprintf(newbuf, newsz, "%s%-*s ",
     1026 +                    *buf != NULL ? *buf : "", width, str);
     1027 +        }
     1028 +
     1029 +        free(*buf);
     1030 +        *buf = newbuf;
     1031 +}
     1032 +
1004 1033  /* CTID */
1005 1034  #define CTID_COLUMN_WIDTH               6
1006 1035  #define CTID_COLUMN_BUFSIZE             20      /* max ctid_t + space + \0 */
1007 1036  
1008 1037  static void
1009 1038  sprint_ctid(char **buf, scf_walkinfo_t *wip)
1010 1039  {
1011 1040          int r;
1012 1041          uint64_t c;
1013      -        size_t newsize = (*buf ? strlen(*buf) : 0) + CTID_COLUMN_BUFSIZE;
1014      -        char *newbuf = safe_malloc(newsize);
     1042 +        char ctid_buf[CTID_COLUMN_BUFSIZE] = { 0 };
     1043 +        char *cstr;
1015 1044          int restarter_spec;
1016 1045  
1017 1046          /*
1018 1047           * Use the restarter specific get pids routine, if available.
1019 1048           * Only check for non-legacy services (wip->pg == 0).
1020 1049           */
1021 1050          if (wip->pg != NULL) {
1022 1051                  r = pg_get_single_val(wip->pg, scf_property_contract,
1023 1052                      SCF_TYPE_COUNT, &c, 0, EMPTY_OK | MULTI_OK);
1024 1053          } else {
1025 1054                  r = ctids_by_restarter(wip, &c, 0, MULTI_OK, &restarter_spec,
1026 1055                      NULL, NULL);
1027 1056                  if (restarter_spec == 0) {
1028 1057                          /* No restarter specific routine */
1029 1058                          r = get_restarter_count_prop(wip->inst,
1030 1059                              scf_property_contract, &c, EMPTY_OK | MULTI_OK);
1031 1060                  }
1032 1061          }
1033 1062  
1034      -        if (r == 0)
1035      -                (void) snprintf(newbuf, newsize, "%s%*lu ",
1036      -                    *buf ? *buf : "", CTID_COLUMN_WIDTH, (ctid_t)c);
1037      -        else if (r == E2BIG)
1038      -                (void) snprintf(newbuf, newsize, "%s%*lu* ",
1039      -                    *buf ? *buf : "", CTID_COLUMN_WIDTH - 1, (ctid_t)c);
1040      -        else
1041      -                (void) snprintf(newbuf, newsize, "%s%*s ",
1042      -                    *buf ? *buf : "", CTID_COLUMN_WIDTH, "-");
1043      -        if (*buf)
1044      -                free(*buf);
1045      -        *buf = newbuf;
     1063 +        if (r == 0 || r == E2BIG) {
     1064 +                if (r == E2BIG)
     1065 +                        ctid_buf[CTID_COLUMN_BUFSIZE - 2] = '*';
     1066 +                cstr = ulltostr(c, &ctid_buf[CTID_COLUMN_BUFSIZE - 2]);
     1067 +                sprint_str(buf, cstr, CTID_COLUMN_WIDTH);
     1068 +        } else {
     1069 +                sprint_str(buf, "-", CTID_COLUMN_WIDTH);
     1070 +        }
1046 1071  }
1047 1072  
1048 1073  #define CTID_SORTKEY_WIDTH              (sizeof (uint64_t))
1049 1074  
1050 1075  static void
1051 1076  sortkey_ctid(char *buf, int reverse, scf_walkinfo_t *wip)
1052 1077  {
1053 1078          int r;
1054 1079          uint64_t c;
1055 1080          int restarter_spec;
↓ open down ↓ 31 lines elided ↑ open up ↑
1087 1112                  reverse_bytes(buf, CTID_SORTKEY_WIDTH);
1088 1113  }
1089 1114  
1090 1115  /* DESC */
1091 1116  #define DESC_COLUMN_WIDTH       100
1092 1117  
1093 1118  static void
1094 1119  sprint_desc(char **buf, scf_walkinfo_t *wip)
1095 1120  {
1096 1121          char *x;
1097      -        size_t newsize;
1098      -        char *newbuf;
1099 1122  
1100 1123          if (common_name_buf == NULL)
1101 1124                  common_name_buf = safe_malloc(max_scf_value_length + 1);
1102 1125  
1103 1126          bzero(common_name_buf, max_scf_value_length + 1);
1104 1127  
1105 1128          if (wip->pg != NULL) {
1106 1129                  common_name_buf[0] = '-';
1107 1130          } else if (inst_get_single_val(wip->inst, SCF_PG_TM_COMMON_NAME, locale,
1108 1131              SCF_TYPE_USTRING, common_name_buf, max_scf_value_length, 0,
↓ open down ↓ 4 lines elided ↑ open up ↑
1113 1136                  common_name_buf[0] = '-';
1114 1137          }
1115 1138  
1116 1139          /*
1117 1140           * Collapse multi-line tm_common_name values into a single line.
1118 1141           */
1119 1142          for (x = common_name_buf; *x != '\0'; x++)
1120 1143                  if (*x == '\n')
1121 1144                          *x = ' ';
1122 1145  
1123      -        if (strlen(common_name_buf) > DESC_COLUMN_WIDTH)
1124      -                newsize = (*buf ? strlen(*buf) : 0) +
1125      -                    strlen(common_name_buf) + 1;
1126      -        else
1127      -                newsize = (*buf ? strlen(*buf) : 0) + DESC_COLUMN_WIDTH + 1;
1128      -        newbuf = safe_malloc(newsize);
1129      -        (void) snprintf(newbuf, newsize, "%s%-*s ", *buf ? *buf : "",
1130      -            DESC_COLUMN_WIDTH, common_name_buf);
1131      -        if (*buf)
1132      -                free(*buf);
1133      -        *buf = newbuf;
     1146 +        sprint_str(buf, common_name_buf, DESC_COLUMN_WIDTH);
1134 1147  }
1135 1148  
1136 1149  /* ARGSUSED */
1137 1150  static void
1138 1151  sortkey_desc(char *buf, int reverse, scf_walkinfo_t *wip)
1139 1152  {
1140 1153          bzero(buf, DESC_COLUMN_WIDTH);
1141 1154  }
1142 1155  
1143 1156  /* State columns (STATE, NSTATE, S, N, SN, STA, NSTA) */
↓ open down ↓ 69 lines elided ↑ open up ↑
1213 1226                  *buf = 0;
1214 1227  
1215 1228          if (reverse)
1216 1229                  *buf = 255 - *buf;
1217 1230  }
1218 1231  
1219 1232  static void
1220 1233  sprint_state(char **buf, scf_walkinfo_t *wip)
1221 1234  {
1222 1235          char state_name[MAX_SCF_STATE_STRING_SZ + 1];
1223      -        size_t newsize;
1224      -        char *newbuf;
1225 1236  
1226 1237          if (wip->pg == NULL) {
1227 1238                  get_restarter_string_prop(wip->inst, scf_property_state,
1228 1239                      state_name, sizeof (state_name));
1229 1240  
1230 1241                  /* Don't print blank fields, to ease parsing. */
1231 1242                  if (state_name[0] == '\0') {
1232 1243                          state_name[0] = '-';
1233 1244                          state_name[1] = '\0';
1234 1245                  }
1235 1246  
1236 1247                  if (!opt_nstate_shown && transitioning(wip->inst)) {
1237 1248                          /* Append an asterisk if nstate is valid. */
1238 1249                          (void) strcat(state_name, "*");
1239 1250                  }
1240 1251          } else
1241 1252                  (void) strcpy(state_name, SCF_STATE_STRING_LEGACY);
1242 1253  
1243      -        newsize = (*buf ? strlen(*buf) : 0) + MAX_SCF_STATE_STRING_SZ + 2;
1244      -        newbuf = safe_malloc(newsize);
1245      -        (void) snprintf(newbuf, newsize, "%s%-*s ", *buf ? *buf : "",
1246      -            MAX_SCF_STATE_STRING_SZ + 1, state_name);
1247      -
1248      -        if (*buf)
1249      -                free(*buf);
1250      -        *buf = newbuf;
     1254 +        sprint_str(buf, state_name, MAX_SCF_STATE_STRING_SZ);
1251 1255  }
1252 1256  
1253 1257  static void
1254 1258  sortkey_state(char *buf, int reverse, scf_walkinfo_t *wip)
1255 1259  {
1256 1260          sortkey_states(scf_property_state, buf, reverse, wip);
1257 1261  }
1258 1262  
1259 1263  static void
1260 1264  sprint_nstate(char **buf, scf_walkinfo_t *wip)
1261 1265  {
1262      -        char next_state_name[MAX_SCF_STATE_STRING_SZ];
     1266 +        char next_state_name[MAX_SCF_STATE_STRING_SZ + 1];
1263 1267          boolean_t blank = 0;
1264      -        size_t newsize;
1265      -        char *newbuf;
1266 1268  
1267 1269          if (wip->pg == NULL) {
1268 1270                  get_restarter_string_prop(wip->inst, scf_property_next_state,
1269 1271                      next_state_name, sizeof (next_state_name));
1270 1272  
1271 1273                  /* Don't print blank fields, to ease parsing. */
1272 1274                  if (next_state_name[0] == '\0' ||
1273 1275                      strcmp(next_state_name, SCF_STATE_STRING_NONE) == 0)
1274 1276                          blank = 1;
1275      -        } else
     1277 +        } else {
1276 1278                  blank = 1;
     1279 +        }
1277 1280  
1278 1281          if (blank) {
1279 1282                  next_state_name[0] = '-';
1280 1283                  next_state_name[1] = '\0';
1281 1284          }
1282 1285  
1283      -        newsize = (*buf ? strlen(*buf) : 0) + MAX_SCF_STATE_STRING_SZ + 1;
1284      -        newbuf = safe_malloc(newsize);
1285      -        (void) snprintf(newbuf, newsize, "%s%-*s ", *buf ? *buf : "",
1286      -            MAX_SCF_STATE_STRING_SZ - 1, next_state_name);
1287      -        if (*buf)
1288      -                free(*buf);
1289      -        *buf = newbuf;
     1286 +        sprint_str(buf, next_state_name, MAX_SCF_STATE_STRING_SZ);
1290 1287  }
1291 1288  
1292 1289  static void
1293 1290  sortkey_nstate(char *buf, int reverse, scf_walkinfo_t *wip)
1294 1291  {
1295 1292          sortkey_states(scf_property_next_state, buf, reverse, wip);
1296 1293  }
1297 1294  
1298 1295  static void
1299 1296  sprint_s(char **buf, scf_walkinfo_t *wip)
1300 1297  {
1301      -        char tmp[3];
1302      -        char state_name[MAX_SCF_STATE_STRING_SZ];
1303      -        size_t newsize = (*buf ? strlen(*buf) : 0) + 4;
1304      -        char *newbuf = safe_malloc(newsize);
     1298 +        char state_name[MAX_SCF_STATE_STRING_SZ + 1];
     1299 +        char tmp[3] = { 0 };
1305 1300  
1306 1301          if (wip->pg == NULL) {
1307 1302                  get_restarter_string_prop(wip->inst, scf_property_state,
1308 1303                      state_name, sizeof (state_name));
1309 1304                  tmp[0] = state_to_char(state_name);
1310 1305  
1311 1306                  if (!opt_nstate_shown && transitioning(wip->inst))
1312 1307                          tmp[1] = '*';
1313 1308                  else
1314 1309                          tmp[1] = ' ';
1315 1310          } else {
1316 1311                  tmp[0] = 'L';
1317 1312                  tmp[1] = ' ';
1318 1313          }
1319 1314          tmp[2] = ' ';
1320      -        (void) snprintf(newbuf, newsize, "%s%-*s", *buf ? *buf : "",
1321      -            3, tmp);
1322      -        if (*buf)
1323      -                free(*buf);
1324      -        *buf = newbuf;
     1315 +
     1316 +        sprint_str(buf, tmp, 2);
1325 1317  }
1326 1318  
1327 1319  static void
1328 1320  sprint_n(char **buf, scf_walkinfo_t *wip)
1329 1321  {
1330      -        char tmp[2];
1331      -        size_t newsize = (*buf ? strlen(*buf) : 0) + 3;
1332      -        char *newbuf = safe_malloc(newsize);
1333      -        char nstate_name[MAX_SCF_STATE_STRING_SZ];
     1322 +        char nstate_name[MAX_SCF_STATE_STRING_SZ + 1];
     1323 +        char tmp[2] = { 0 };
1334 1324  
1335 1325          if (wip->pg == NULL) {
1336 1326                  get_restarter_string_prop(wip->inst, scf_property_next_state,
1337 1327                      nstate_name, sizeof (nstate_name));
1338 1328  
1339 1329                  if (strcmp(nstate_name, SCF_STATE_STRING_NONE) == 0)
1340 1330                          tmp[0] = '-';
1341 1331                  else
1342 1332                          tmp[0] = state_to_char(nstate_name);
1343      -        } else
     1333 +        } else {
1344 1334                  tmp[0] = '-';
     1335 +        }
1345 1336  
1346      -        (void) snprintf(newbuf, newsize, "%s%-*s ", *buf ? *buf : "",
1347      -            2, tmp);
1348      -        if (*buf)
1349      -                free(*buf);
1350      -        *buf = newbuf;
     1337 +        sprint_str(buf, tmp, 1);
1351 1338  }
1352 1339  
1353 1340  static void
1354 1341  sprint_sn(char **buf, scf_walkinfo_t *wip)
1355 1342  {
1356      -        char tmp[3];
1357      -        size_t newsize = (*buf ? strlen(*buf) : 0) + 4;
1358      -        char *newbuf = safe_malloc(newsize);
1359      -        char nstate_name[MAX_SCF_STATE_STRING_SZ];
1360      -        char state_name[MAX_SCF_STATE_STRING_SZ];
     1343 +        char state_name[MAX_SCF_STATE_STRING_SZ + 1];
     1344 +        char nstate_name[MAX_SCF_STATE_STRING_SZ + 1];
     1345 +        char tmp[3] = { 0 };
1361 1346  
1362 1347          if (wip->pg == NULL) {
1363 1348                  get_restarter_string_prop(wip->inst, scf_property_state,
1364 1349                      state_name, sizeof (state_name));
1365 1350                  get_restarter_string_prop(wip->inst, scf_property_next_state,
1366 1351                      nstate_name, sizeof (nstate_name));
1367 1352                  tmp[0] = state_to_char(state_name);
1368 1353  
1369 1354                  if (strcmp(nstate_name, SCF_STATE_STRING_NONE) == 0)
1370 1355                          tmp[1] = '-';
1371 1356                  else
1372 1357                          tmp[1] = state_to_char(nstate_name);
1373 1358          } else {
1374 1359                  tmp[0] = 'L';
1375 1360                  tmp[1] = '-';
1376 1361          }
1377 1362  
1378      -        tmp[2] = ' ';
1379      -        (void) snprintf(newbuf, newsize, "%s%-*s ", *buf ? *buf : "",
1380      -            3, tmp);
1381      -        if (*buf)
1382      -                free(*buf);
1383      -        *buf = newbuf;
     1363 +        sprint_str(buf, tmp, 2);
1384 1364  }
1385 1365  
1386 1366  /* ARGSUSED */
1387 1367  static void
1388 1368  sortkey_sn(char *buf, int reverse, scf_walkinfo_t *wip)
1389 1369  {
1390 1370          sortkey_state(buf, reverse, wip);
1391 1371          sortkey_nstate(buf + 1, reverse, wip);
1392 1372  }
1393 1373  
↓ open down ↓ 14 lines elided ↑ open up ↑
1408 1388                  return ("DGD");
1409 1389          if (strcmp(state, SCF_STATE_STRING_LEGACY) == 0)
1410 1390                  return ("LRC");
1411 1391  
1412 1392          return ("?");
1413 1393  }
1414 1394  
1415 1395  static void
1416 1396  sprint_sta(char **buf, scf_walkinfo_t *wip)
1417 1397  {
1418      -        char state_name[MAX_SCF_STATE_STRING_SZ];
1419      -        char sta[5];
1420      -        size_t newsize = (*buf ? strlen(*buf) : 0) + 6;
1421      -        char *newbuf = safe_malloc(newsize);
     1398 +        char state_name[MAX_SCF_STATE_STRING_SZ + 1];
     1399 +        char sta[5] = { 0 };
1422 1400  
1423      -        if (wip->pg == NULL)
     1401 +        if (wip->pg == NULL) {
1424 1402                  get_restarter_string_prop(wip->inst, scf_property_state,
1425 1403                      state_name, sizeof (state_name));
1426      -        else
     1404 +        } else {
1427 1405                  (void) strcpy(state_name, SCF_STATE_STRING_LEGACY);
     1406 +        }
1428 1407  
1429 1408          (void) strcpy(sta, state_abbrev(state_name));
1430 1409  
1431 1410          if (wip->pg == NULL && !opt_nstate_shown && transitioning(wip->inst))
1432 1411                  (void) strcat(sta, "*");
1433 1412  
1434      -        (void) snprintf(newbuf, newsize, "%s%-4s ", *buf ? *buf : "", sta);
1435      -        if (*buf)
1436      -                free(*buf);
1437      -        *buf = newbuf;
     1413 +        sprint_str(buf, sta, 4);
1438 1414  }
1439 1415  
1440 1416  static void
1441 1417  sprint_nsta(char **buf, scf_walkinfo_t *wip)
1442 1418  {
1443      -        char state_name[MAX_SCF_STATE_STRING_SZ];
1444      -        size_t newsize = (*buf ? strlen(*buf) : 0) + 6;
1445      -        char *newbuf = safe_malloc(newsize);
     1419 +        char state_name[MAX_SCF_STATE_STRING_SZ + 1];
1446 1420  
1447      -        if (wip->pg == NULL)
     1421 +        if (wip->pg == NULL) {
1448 1422                  get_restarter_string_prop(wip->inst, scf_property_next_state,
1449 1423                      state_name, sizeof (state_name));
1450      -        else
     1424 +        } else {
1451 1425                  (void) strcpy(state_name, SCF_STATE_STRING_NONE);
     1426 +        }
1452 1427  
1453 1428          if (strcmp(state_name, SCF_STATE_STRING_NONE) == 0)
1454      -                (void) snprintf(newbuf, newsize, "%s%-4s ", *buf ? *buf : "",
1455      -                    "-");
     1429 +                sprint_str(buf, "-", 4);
1456 1430          else
1457      -                (void) snprintf(newbuf, newsize, "%s%-4s ", *buf ? *buf : "",
1458      -                    state_abbrev(state_name));
1459      -        if (*buf)
1460      -                free(*buf);
1461      -        *buf = newbuf;
     1431 +                sprint_str(buf, state_abbrev(state_name), 4);
1462 1432  }
1463 1433  
1464 1434  /* FMRI */
1465 1435  #define FMRI_COLUMN_WIDTH       50
1466 1436  static void
1467 1437  sprint_fmri(char **buf, scf_walkinfo_t *wip)
1468 1438  {
1469 1439          char *fmri_buf = safe_malloc(max_scf_fmri_length + 1);
1470      -        size_t newsize;
1471      -        char *newbuf;
1472 1440  
1473 1441          if (wip->pg == NULL) {
1474 1442                  if (scf_instance_to_fmri(wip->inst, fmri_buf,
1475 1443                      max_scf_fmri_length + 1) == -1)
1476 1444                          scfdie();
1477 1445          } else {
1478 1446                  (void) strcpy(fmri_buf, SCF_FMRI_LEGACY_PREFIX);
1479 1447                  if (pg_get_single_val(wip->pg, SCF_LEGACY_PROPERTY_NAME,
1480 1448                      SCF_TYPE_ASTRING, fmri_buf +
1481 1449                      sizeof (SCF_FMRI_LEGACY_PREFIX) - 1,
1482 1450                      max_scf_fmri_length + 1 -
1483 1451                      (sizeof (SCF_FMRI_LEGACY_PREFIX) - 1), 0) != 0)
1484 1452                          (void) strcat(fmri_buf, LEGACY_UNKNOWN);
1485 1453          }
1486 1454  
1487      -        if (strlen(fmri_buf) > FMRI_COLUMN_WIDTH)
1488      -                newsize = (*buf ? strlen(*buf) : 0) + strlen(fmri_buf) + 2;
1489      -        else
1490      -                newsize = (*buf ? strlen(*buf) : 0) + FMRI_COLUMN_WIDTH + 2;
1491      -        newbuf = safe_malloc(newsize);
1492      -        (void) snprintf(newbuf, newsize, "%s%-*s ", *buf ? *buf : "",
1493      -            FMRI_COLUMN_WIDTH, fmri_buf);
     1455 +        sprint_str(buf, fmri_buf, FMRI_COLUMN_WIDTH);
1494 1456          free(fmri_buf);
1495      -        if (*buf)
1496      -                free(*buf);
1497      -        *buf = newbuf;
1498 1457  }
1499 1458  
1500 1459  static void
1501 1460  sortkey_fmri(char *buf, int reverse, scf_walkinfo_t *wip)
1502 1461  {
1503 1462          char *tmp = NULL;
1504 1463  
1505 1464          sprint_fmri(&tmp, wip);
1506 1465          bcopy(tmp, buf, FMRI_COLUMN_WIDTH);
1507 1466          free(tmp);
1508 1467          if (reverse)
1509 1468                  reverse_bytes(buf, FMRI_COLUMN_WIDTH);
1510 1469  }
1511 1470  
1512 1471  /* Component columns */
1513 1472  #define COMPONENT_COLUMN_WIDTH  20
1514 1473  static void
1515 1474  sprint_scope(char **buf, scf_walkinfo_t *wip)
1516 1475  {
1517 1476          char *scope_buf = safe_malloc(max_scf_name_length + 1);
1518      -        size_t newsize = (*buf ? strlen(*buf) : 0) + COMPONENT_COLUMN_WIDTH + 2;
1519      -        char *newbuf = safe_malloc(newsize);
1520 1477  
1521 1478          assert(wip->scope != NULL);
1522 1479  
1523 1480          if (scf_scope_get_name(wip->scope, scope_buf, max_scf_name_length) < 0)
1524 1481                  scfdie();
1525 1482  
1526      -        (void) snprintf(newbuf, newsize, "%s%-*s ", *buf ? *buf : "",
1527      -            COMPONENT_COLUMN_WIDTH, scope_buf);
1528      -        if (*buf)
1529      -                free(*buf);
1530      -        *buf = newbuf;
     1483 +        sprint_str(buf, scope_buf, COMPONENT_COLUMN_WIDTH);
1531 1484          free(scope_buf);
1532 1485  }
1533 1486  
1534 1487  static void
1535 1488  sortkey_scope(char *buf, int reverse, scf_walkinfo_t *wip)
1536 1489  {
1537 1490          char *tmp = NULL;
1538 1491  
1539 1492          sprint_scope(&tmp, wip);
1540 1493          bcopy(tmp, buf, COMPONENT_COLUMN_WIDTH);
1541 1494          free(tmp);
1542 1495          if (reverse)
1543 1496                  reverse_bytes(buf, COMPONENT_COLUMN_WIDTH);
1544 1497  }
1545 1498  
1546 1499  static void
1547 1500  sprint_service(char **buf, scf_walkinfo_t *wip)
1548 1501  {
1549 1502          char *svc_buf = safe_malloc(max_scf_name_length + 1);
1550      -        char *newbuf;
1551      -        size_t newsize;
1552 1503  
1553 1504          if (wip->pg == NULL) {
1554 1505                  if (scf_service_get_name(wip->svc, svc_buf,
1555 1506                      max_scf_name_length + 1) < 0)
1556 1507                          scfdie();
1557 1508          } else {
1558 1509                  if (pg_get_single_val(wip->pg, "name", SCF_TYPE_ASTRING,
1559 1510                      svc_buf, max_scf_name_length + 1, EMPTY_OK) != 0)
1560 1511                          (void) strcpy(svc_buf, LEGACY_UNKNOWN);
1561 1512          }
1562 1513  
1563      -
1564      -        if (strlen(svc_buf) > COMPONENT_COLUMN_WIDTH)
1565      -                newsize = (*buf ? strlen(*buf) : 0) + strlen(svc_buf) + 2;
1566      -        else
1567      -                newsize = (*buf ? strlen(*buf) : 0) +
1568      -                    COMPONENT_COLUMN_WIDTH + 2;
1569      -        newbuf = safe_malloc(newsize);
1570      -        (void) snprintf(newbuf, newsize, "%s%-*s ", *buf ? *buf : "",
1571      -            COMPONENT_COLUMN_WIDTH, svc_buf);
     1514 +        sprint_str(buf, svc_buf, COMPONENT_COLUMN_WIDTH);
1572 1515          free(svc_buf);
1573      -        if (*buf)
1574      -                free(*buf);
1575      -        *buf = newbuf;
1576 1516  }
1577 1517  
1578 1518  static void
1579 1519  sortkey_service(char *buf, int reverse, scf_walkinfo_t *wip)
1580 1520  {
1581 1521          char *tmp = NULL;
1582 1522  
1583 1523          sprint_service(&tmp, wip);
1584 1524          bcopy(tmp, buf, COMPONENT_COLUMN_WIDTH);
1585 1525          free(tmp);
1586 1526          if (reverse)
1587 1527                  reverse_bytes(buf, COMPONENT_COLUMN_WIDTH);
1588 1528  }
1589 1529  
1590 1530  /* INST */
1591 1531  static void
1592 1532  sprint_instance(char **buf, scf_walkinfo_t *wip)
1593 1533  {
1594      -        char *tmp = safe_malloc(max_scf_name_length + 1);
1595      -        size_t newsize = (*buf ? strlen(*buf) : 0) + COMPONENT_COLUMN_WIDTH + 2;
1596      -        char *newbuf = safe_malloc(newsize);
     1534 +        char *inst_buf = safe_malloc(max_scf_name_length + 1);
1597 1535  
1598 1536          if (wip->pg == NULL) {
1599      -                if (scf_instance_get_name(wip->inst, tmp,
     1537 +                if (scf_instance_get_name(wip->inst, inst_buf,
1600 1538                      max_scf_name_length + 1) < 0)
1601 1539                          scfdie();
1602 1540          } else {
1603      -                tmp[0] = '-';
1604      -                tmp[1] = '\0';
     1541 +                inst_buf[0] = '-';
     1542 +                inst_buf[1] = '\0';
1605 1543          }
1606 1544  
1607      -        (void) snprintf(newbuf, newsize, "%s%-*s ", *buf ? *buf : "",
1608      -            COMPONENT_COLUMN_WIDTH, tmp);
1609      -        if (*buf)
1610      -                free(*buf);
1611      -        *buf = newbuf;
1612      -        free(tmp);
     1545 +
     1546 +        sprint_str(buf, inst_buf, COMPONENT_COLUMN_WIDTH);
     1547 +        free(inst_buf);
1613 1548  }
1614 1549  
1615 1550  static void
1616 1551  sortkey_instance(char *buf, int reverse, scf_walkinfo_t *wip)
1617 1552  {
1618 1553          char *tmp = NULL;
1619 1554  
1620 1555          sprint_instance(&tmp, wip);
1621 1556          bcopy(tmp, buf, COMPONENT_COLUMN_WIDTH);
1622 1557          free(tmp);
1623 1558          if (reverse)
1624 1559                  reverse_bytes(buf, COMPONENT_COLUMN_WIDTH);
1625 1560  }
1626 1561  
1627 1562  /* STIME */
1628 1563  #define STIME_COLUMN_WIDTH              8
1629 1564  #define FORMAT_TIME                     "%k:%M:%S"
1630      -#define FORMAT_DATE                     "%b_%d  "
1631      -#define FORMAT_YEAR                     "%Y    "
     1565 +#define FORMAT_DATE                     "%b_%d"
     1566 +#define FORMAT_YEAR                     "%Y"
1632 1567  
1633 1568  /*
1634 1569   * sprint_stime() will allocate a new buffer and snprintf the services's
1635 1570   * state timestamp.  If the timestamp is unavailable for some reason
1636 1571   * a '-' is given instead.
1637 1572   */
1638 1573  static void
1639 1574  sprint_stime(char **buf, scf_walkinfo_t *wip)
1640 1575  {
1641 1576          int r;
1642 1577          struct timeval tv;
1643 1578          time_t then;
1644 1579          struct tm *tm;
1645 1580          char st_buf[STIME_COLUMN_WIDTH + 1];
1646      -        size_t newsize = (*buf ? strlen(*buf) : 0) + STIME_COLUMN_WIDTH + 2;
1647      -        char *newbuf = safe_malloc(newsize);
1648 1581  
1649 1582          if (wip->pg == NULL) {
1650 1583                  r = get_restarter_time_prop(wip->inst,
1651 1584                      SCF_PROPERTY_STATE_TIMESTAMP, &tv, 0);
1652 1585          } else {
1653 1586                  r = pg_get_single_val(wip->pg, SCF_PROPERTY_STATE_TIMESTAMP,
1654 1587                      SCF_TYPE_TIME, &tv, NULL, 0);
1655 1588          }
1656 1589  
1657 1590          if (r != 0) {
1658 1591                  /*
1659 1592                   * There's something amiss with our service
1660 1593                   * so we'll print a '-' for STIME.
1661 1594                   */
1662      -                (void) snprintf(newbuf, newsize, "%s%-*s", *buf ? *buf : "",
1663      -                    STIME_COLUMN_WIDTH + 1, "-");
     1595 +                sprint_str(buf, "-", STIME_COLUMN_WIDTH);
1664 1596          } else {
1665 1597                  /* tv should be valid so we'll format it */
1666 1598                  then = (time_t)tv.tv_sec;
1667 1599  
1668 1600                  tm = localtime(&then);
1669 1601                  /*
1670 1602                   * Print time if started within the past 24 hours, print date
1671 1603                   * if within the past 12 months or, finally, print year if
1672 1604                   * started greater than 12 months ago.
1673 1605                   */
1674 1606                  if (now - then < 24 * 60 * 60) {
1675 1607                          (void) strftime(st_buf, sizeof (st_buf),
1676 1608                              gettext(FORMAT_TIME), tm);
1677 1609                  } else if (now - then < 12 * 30 * 24 * 60 * 60) {
1678 1610                          (void) strftime(st_buf, sizeof (st_buf),
1679 1611                              gettext(FORMAT_DATE), tm);
1680 1612                  } else {
1681 1613                          (void) strftime(st_buf, sizeof (st_buf),
1682 1614                              gettext(FORMAT_YEAR), tm);
1683 1615                  }
1684      -                (void) snprintf(newbuf, newsize, "%s%-*s ", *buf ? *buf : "",
1685      -                    STIME_COLUMN_WIDTH + 1, st_buf);
     1616 +                sprint_str(buf, st_buf, STIME_COLUMN_WIDTH);
1686 1617          }
1687      -        if (*buf)
1688      -                free(*buf);
1689      -        *buf = newbuf;
1690 1618  }
1691 1619  
1692 1620  #define STIME_SORTKEY_WIDTH             (sizeof (uint64_t) + sizeof (uint32_t))
1693 1621  
1694 1622  /* ARGSUSED */
1695 1623  static void
1696 1624  sortkey_stime(char *buf, int reverse, scf_walkinfo_t *wip)
1697 1625  {
1698 1626          struct timeval tv;
1699 1627          int r;
↓ open down ↓ 24 lines elided ↑ open up ↑
1724 1652          if (reverse)
1725 1653                  reverse_bytes(buf, STIME_SORTKEY_WIDTH);
1726 1654  }
1727 1655  
1728 1656  /* ZONE */
1729 1657  #define ZONE_COLUMN_WIDTH       16
1730 1658  /*ARGSUSED*/
1731 1659  static void
1732 1660  sprint_zone(char **buf, scf_walkinfo_t *wip)
1733 1661  {
1734      -        size_t newsize;
1735      -        char *newbuf, *zonename = g_zonename, b[ZONENAME_MAX];
     1662 +        char *zonename = g_zonename, b[ZONENAME_MAX];
1736 1663  
1737 1664          if (zonename == NULL) {
1738 1665                  zoneid_t zoneid = getzoneid();
1739 1666  
1740 1667                  if (getzonenamebyid(zoneid, b, sizeof (b)) < 0)
1741 1668                          uu_die(gettext("could not determine zone name"));
1742 1669  
1743 1670                  zonename = b;
1744 1671          }
1745 1672  
1746      -        if (strlen(zonename) > ZONE_COLUMN_WIDTH)
1747      -                newsize = (*buf ? strlen(*buf) : 0) + strlen(zonename) + 2;
1748      -        else
1749      -                newsize = (*buf ? strlen(*buf) : 0) + ZONE_COLUMN_WIDTH + 2;
1750      -
1751      -        newbuf = safe_malloc(newsize);
1752      -        (void) snprintf(newbuf, newsize, "%s%-*s ", *buf ? *buf : "",
1753      -            ZONE_COLUMN_WIDTH, zonename);
1754      -
1755      -        if (*buf)
1756      -                free(*buf);
1757      -        *buf = newbuf;
     1673 +        sprint_str(buf, zonename, ZONE_COLUMN_WIDTH);
1758 1674  }
1759 1675  
1760 1676  static void
1761 1677  sortkey_zone(char *buf, int reverse, scf_walkinfo_t *wip)
1762 1678  {
1763 1679          char *tmp = NULL;
1764 1680  
1765 1681          sprint_zone(&tmp, wip);
1766 1682          bcopy(tmp, buf, ZONE_COLUMN_WIDTH);
1767 1683          free(tmp);
↓ open down ↓ 9 lines elided ↑ open up ↑
1777 1693          { "CTID", CTID_COLUMN_WIDTH, sprint_ctid,
1778 1694                  CTID_SORTKEY_WIDTH, sortkey_ctid },
1779 1695          { "DESC", DESC_COLUMN_WIDTH, sprint_desc,
1780 1696                  DESC_COLUMN_WIDTH, sortkey_desc },
1781 1697          { "FMRI", FMRI_COLUMN_WIDTH, sprint_fmri,
1782 1698                  FMRI_COLUMN_WIDTH, sortkey_fmri },
1783 1699          { "INST", COMPONENT_COLUMN_WIDTH, sprint_instance,
1784 1700                  COMPONENT_COLUMN_WIDTH, sortkey_instance },
1785 1701          { "N", 1,  sprint_n, 1, sortkey_nstate },
1786 1702          { "NSTA", 4, sprint_nsta, 1, sortkey_nstate },
1787      -        { "NSTATE", MAX_SCF_STATE_STRING_SZ - 1, sprint_nstate,
     1703 +        { "NSTATE", MAX_SCF_STATE_STRING_SZ, sprint_nstate,
1788 1704                  1, sortkey_nstate },
1789 1705          { "S", 2, sprint_s, 1, sortkey_state },
1790 1706          { "SCOPE", COMPONENT_COLUMN_WIDTH, sprint_scope,
1791 1707                  COMPONENT_COLUMN_WIDTH, sortkey_scope },
1792 1708          { "SN", 2, sprint_sn, 2, sortkey_sn },
1793 1709          { "SVC", COMPONENT_COLUMN_WIDTH, sprint_service,
1794 1710                  COMPONENT_COLUMN_WIDTH, sortkey_service },
1795 1711          { "STA", 4, sprint_sta, 1, sortkey_state },
1796      -        { "STATE", MAX_SCF_STATE_STRING_SZ - 1 + 1, sprint_state,
     1712 +        { "STATE", MAX_SCF_STATE_STRING_SZ, sprint_state,
1797 1713                  1, sortkey_state },
1798 1714          { "STIME", STIME_COLUMN_WIDTH, sprint_stime,
1799 1715                  STIME_SORTKEY_WIDTH, sortkey_stime },
1800 1716          { "ZONE", ZONE_COLUMN_WIDTH, sprint_zone,
1801 1717                  ZONE_COLUMN_WIDTH, sortkey_zone },
1802 1718  };
1803 1719  
1804 1720  #define MAX_COLUMN_NAME_LENGTH_STR      "6"
1805 1721  
1806 1722  static const int ncolumns = sizeof (columns) / sizeof (columns[0]);
↓ open down ↓ 55 lines elided ↑ open up ↑
1862 1778          }
1863 1779  
1864 1780          assert(s != NULL);
1865 1781          return (s);
1866 1782  }
1867 1783  
1868 1784  
1869 1785  static void
1870 1786  print_usage(const char *progname, FILE *f, boolean_t do_exit)
1871 1787  {
1872      -        (void) fprintf(f, gettext(
1873      -            "Usage: %1$s [-aHpv] [-o col[,col ... ]] [-R restarter] "
1874      -            "[-sS col] [-Z | -z zone ]\n            [<service> ...]\n"
1875      -            "       %1$s -d | -D [-Hpv] [-o col[,col ... ]] [-sS col] "
1876      -            "[-Z | -z zone ]\n            [<service> ...]\n"
1877      -            "       %1$s [-l | -L] [-Z | -z zone] <service> ...\n"
1878      -            "       %1$s -x [-v] [-Z | -z zone] [<service> ...]\n"
1879      -            "       %1$s -?\n"), progname);
     1788 +        (void) fprintf(f, gettext("usage:\n"
     1789 +            "%1$s\t[-aHpv?] [-o col[,col]...] [-R FMRI-instance]... "
     1790 +            "[-sS col]...\n\t[-z zone|-Z] [FMRI|pattern]...\n"
     1791 +            "%1$s\t{-d|-D} -Hpv? [-o col[,col]...] [-sS col]... [-z zone|-Z]\n"
     1792 +            "\t[FMRI|pattern]...\n"
     1793 +            "%1$s\t{-l|-L} [-v] [-z zone|-Z] {FMRI|pattern}...\n"
     1794 +            "%1$s\t-x [-v] [-z zone|-Z] [FMRI]...\n"), progname);
1880 1795  
1881 1796          if (do_exit)
1882 1797                  exit(UU_EXIT_USAGE);
1883 1798  }
1884 1799  
1885 1800  #define argserr(progname)       print_usage(progname, stderr, B_TRUE)
1886 1801  
1887 1802  static void
1888 1803  print_help(const char *progname)
1889 1804  {
↓ open down ↓ 1557 lines elided ↑ open up ↑
3447 3362          char *columns_str = NULL;
3448 3363          char *cp;
3449 3364          const char *progname;
3450 3365          int err, missing = 1, ignored, *errarg;
3451 3366          uint_t nzents = 0, zent = 0;
3452 3367          zoneid_t *zids = NULL;
3453 3368          char zonename[ZONENAME_MAX];
3454 3369          void (*errfunc)(const char *, ...);
3455 3370  
3456 3371          int show_all = 0;
3457      -        int show_header = 1;
3458 3372          int show_zones = 0;
3459 3373  
3460 3374          const char * const options = "aHpvno:R:s:S:dDlL?xZz:";
3461 3375  
3462 3376          (void) setlocale(LC_ALL, "");
3463 3377  
3464 3378          locale = setlocale(LC_MESSAGES, NULL);
3465 3379          if (locale) {
3466 3380                  locale = safe_strdup(locale);
3467 3381                  _scf_sanitize_locale(locale);
↓ open down ↓ 69 lines elided ↑ open up ↑
3537 3451                  switch (opt) {
3538 3452                  case 'a':
3539 3453                          if (opt_mode != 0)
3540 3454                                  argserr(progname);
3541 3455                          show_all = 1;
3542 3456                          break;
3543 3457  
3544 3458                  case 'H':
3545 3459                          if (opt_mode == 'l' || opt_mode == 'x')
3546 3460                                  argserr(progname);
3547      -                        show_header = 0;
     3461 +                        opt_scripted = 1;
3548 3462                          break;
3549 3463  
3550 3464                  case 'p':
3551 3465                          if (opt_mode == 'x')
3552 3466                                  argserr(progname);
3553 3467                          opt_processes = 1;
3554 3468                          break;
3555 3469  
3556 3470                  case 'v':
3557 3471                          opt_verbose = 1;
↓ open down ↓ 358 lines elided ↑ open up ↑
3916 3830                  scf_handle_destroy(h);
3917 3831                  goto again;
3918 3832          }
3919 3833  
3920 3834          if (show_zones && exit_status == 0)
3921 3835                  exit_status = missing;
3922 3836  
3923 3837          if (opt_columns == NULL)
3924 3838                  return (exit_status);
3925 3839  
3926      -        if (show_header)
     3840 +        if (!opt_scripted)
3927 3841                  print_header();
3928 3842  
3929 3843          (void) uu_avl_walk(lines, print_line, NULL, 0);
3930 3844  
3931 3845          return (exit_status);
3932 3846  }
    
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX