/*
* Copyright 2000, International Business Machines Corporation and others.
* All Rights Reserved.
- *
+ *
* This software has been released under the terms of the IBM Public
* License. For details, see the LICENSE file in the top-level source
* directory or online at http://www.openafs.org/dl/license10.html
#endif
#include <string.h>
#undef IN
-#include <gtxwindows.h> /*Generic window package */
-#include <gtxobjects.h> /*Object definitions */
-#include <gtxtextobj.h> /*Text object interface */
-#include <gtxlightobj.h> /*Light object interface */
-#include <gtxcurseswin.h> /*Curses window package */
-#include <gtxdumbwin.h> /*Dumb terminal window package */
-#include <gtxX11win.h> /*X11 window package */
-#include <gtxframe.h> /*Frame package */
-#include <gtxinput.h>
+#include <afs/gtxwindows.h> /*Generic window package */
+#include <afs/gtxobjects.h> /*Object definitions */
+#include <afs/gtxtextobj.h> /*Text object interface */
+#include <afs/gtxlightobj.h> /*Light object interface */
+#include <afs/gtxcurseswin.h> /*Curses window package */
+#include <afs/gtxdumbwin.h> /*Dumb terminal window package */
+#include <afs/gtxX11win.h> /*X11 window package */
+#include <afs/gtxframe.h> /*Frame package */
+#include <afs/gtxinput.h>
#include <stdio.h> /*Standard I/O stuff */
-#include <cmd.h> /*Command interpretation library */
-#include <fsprobe.h> /*Interface for fsprobe module */
+#include <afs/cmd.h> /*Command interpretation library */
+#include <afs/fsprobe.h> /*Interface for fsprobe module */
#include <errno.h>
#include <afs/afsutil.h>
#include <netdb.h>
+#ifdef HAVE_STDINT_H
+# include <stdint.h>
+#endif
/*
* Command line parameter indicies.
#define P_HOST 3
#define P_ATTENTION 4
#define P_DEBUG 5
+#define P_WIDTHS 6
/*
- * Define the width in chars for each light object on the mini-line.
+ * Define the default width in chars for each light object on the mini-line.
*/
#define LIGHTOBJ_CONN_WIDTH 5
#define LIGHTOBJ_FETCH_WIDTH 10
#define LIGHTOBJ_DISK_WIDTH 12
/*
+ * Define column width indices.
+ */
+#define COL_CONN 0
+#define COL_FETCH 1
+#define COL_STORE 2
+#define COL_WK 3
+#define COL_SRVNAME 4
+#define COL_DISK 5
+
+/*
* Define the types of justification we can perform.
*/
#define SCOUT_RIGHT_JUSTIFY 0
static int scout_DiskLightLeftCol = 0; /*Column for leftmost disk light */
static struct gwin_sizeparams scout_frameDims; /*Frame dimensions */
+static int scout_col_width[] = { LIGHTOBJ_CONN_WIDTH,
+ LIGHTOBJ_FETCH_WIDTH,
+ LIGHTOBJ_STORE_WIDTH,
+ LIGHTOBJ_WK_WIDTH,
+ LIGHTOBJ_SRVNAME_WIDTH,
+ LIGHTOBJ_DISK_WIDTH
+};
+
/*
* Attention thresholds & modes.
*/
* Some strings we'll be using over and over again.
*/
static char scout_Banner[256];
-static char scout_LightLabels[] =
- "Conn Fetch Store Ws Disk attn:";
-static char scout_LightLabelUnd[] =
- "---- -------- -------- ----- ----------";
+static const char *scout_label[] =
+ { "Conn", "Fetch", "Store", "Ws", "", "Disk attn" };
+static const char *scout_underline[] =
+ { "----", "--------", "--------", "-----", "", "----------" };
/*------------------------------------------------------------------------
* Void.
*
* Environment:
- * Actions depend on scout_gtx_initialized.
+ * Actions depend on scout_gtx_initialized.
*
* Side Effects:
* This routine will always exit Scout.
if ((curr_disk->disk_lp = mini_initLightObject("Disk", /*Object name */
0, /*X value */
0, /*Y value */
- LIGHTOBJ_DISK_WIDTH, /*Width */
+ scout_col_width[COL_DISK], /*Width */
a_win)) /*Window */
== NULL) {
fprintf(stderr, "[%s:%s] Can't create disk %d light object\n", pn,
*------------------------------------------------------------------------*/
int
-mini_justify(char *a_srcbuff, char *a_dstbuff, int a_dstwidth,
+mini_justify(char *a_srcbuff, char *a_dstbuff, int a_dstwidth,
int a_justification, int a_rightTrunc,
int a_isLabeledDisk)
{ /*mini_justify */
* If we haven't yet computed the column for the leftmost disk light,
* do it now.
*/
- if (scout_DiskLightLeftCol == 0)
- scout_DiskLightLeftCol =
- LIGHTOBJ_CONN_WIDTH + LIGHTOBJ_FETCH_WIDTH +
- LIGHTOBJ_STORE_WIDTH + LIGHTOBJ_WK_WIDTH +
- LIGHTOBJ_SRVNAME_WIDTH + 5;
+ if (scout_DiskLightLeftCol == 0) {
+ int i;
+ int num_cols = sizeof(scout_col_width) / sizeof(*scout_col_width);
+ scout_DiskLightLeftCol = 0;
+ for (i = 0; i < (num_cols - 1); i++) {
+ scout_DiskLightLeftCol += scout_col_width[i] + 1;
+ }
+ }
/*
* Calculate how many disk light objects can fit in one line.
*/
lights_per_line =
(scout_frameDims.maxx -
- scout_DiskLightLeftCol) / (LIGHTOBJ_DISK_WIDTH + 1);
+ scout_DiskLightLeftCol) / (scout_col_width[COL_DISK] + 1);
if (scout_debug) {
fprintf(scout_debugfd, "[%s] %d lights per line\n", rn,
lights_per_line);
* light, if any.
*/
lights_this_line++;
- curr_x += LIGHTOBJ_DISK_WIDTH + 1;
+ curr_x += scout_col_width[COL_DISK] + 1;
curr_idx = sc_disk[curr_idx].next;
} /*Update each used disk light */
*------------------------------------------------------------------------*/
static int
-mini_PrintDiskStats(struct mini_line *a_srvline,
- struct ProbeViceStatistics *a_stats,
+mini_PrintDiskStats(struct mini_line *a_srvline,
+ struct ProbeViceStatistics *a_stats,
int a_probeOK, int a_width_changed,
int a_fix_line_num, int a_delta_line_num)
{ /*mini_PrintDiskStats */
}
code = mini_justify(" ", /*Src buffer */
diskdata->label, /*Dest buffer */
- LIGHTOBJ_DISK_WIDTH, /*Dest's width */
+ scout_col_width[COL_DISK], /*Dest's width */
SCOUT_RIGHT_JUSTIFY, /*Right-justify */
SCOUT_LEFT_TRUNC, /*Left-truncate */
SCOUT_ISNT_LDISK); /*Not a labeled disk */
}
code = mini_justify(s, /*Src buffer */
diskdata->label, /*Dest buffer */
- LIGHTOBJ_DISK_WIDTH, /*Dest's width */
+ scout_col_width[COL_DISK], /*Dest's width */
SCOUT_LEFT_JUSTIFY, /*Left-justify */
SCOUT_LEFT_TRUNC, /*Left-truncate */
SCOUT_IS_LDISK); /*Labeled disk */
sp = sblank;
code = mini_justify(sp, /*Src buffer */
lightdata->label, /*Dest buffer */
- LIGHTOBJ_CONN_WIDTH, /*Dest's width */
+ scout_col_width[COL_CONN], /*Dest's width */
SCOUT_RIGHT_JUSTIFY, /*Right-justify */
SCOUT_LEFT_TRUNC, /*Left-truncate */
SCOUT_ISNT_LDISK); /*Not a labeled disk */
lightdata = (struct gator_lightobj *)(curr_line->fetches_lp->o_data);
if (*curr_probeOK == 0) {
sp = s;
- sprintf(sp, "%d", curr_stats->TotalFetchs);
+ sprintf(sp, "%u", curr_stats->TotalFetchs);
} else
sp = sblank;
code = mini_justify(sp, /*Src buffer */
lightdata->label, /*Dest buffer */
- LIGHTOBJ_FETCH_WIDTH, /*Dest's width */
+ scout_col_width[COL_FETCH], /*Dest's width */
SCOUT_RIGHT_JUSTIFY, /*Right-justify */
SCOUT_LEFT_TRUNC, /*Left-truncate */
SCOUT_ISNT_LDISK); /*Not a labeled disk */
lightdata = (struct gator_lightobj *)(curr_line->stores_lp->o_data);
if (*curr_probeOK == 0) {
sp = s;
- sprintf(sp, "%d", curr_stats->TotalStores);
+ sprintf(sp, "%u", curr_stats->TotalStores);
} else
sp = sblank;
code = mini_justify(sp, /*Src buffer */
lightdata->label, /*Dest buffer */
- LIGHTOBJ_STORE_WIDTH, /*Dest's width */
+ scout_col_width[COL_STORE], /*Dest's width */
SCOUT_RIGHT_JUSTIFY, /*Right-justify */
SCOUT_LEFT_TRUNC, /*Left-truncate */
SCOUT_ISNT_LDISK); /*Not a labeled disk */
sp = sblank;
code = mini_justify(sp, /*Src buffer */
lightdata->label, /*Dest buffer */
- LIGHTOBJ_WK_WIDTH, /*Dest's width */
+ scout_col_width[COL_WK], /*Dest's width */
SCOUT_RIGHT_JUSTIFY, /*Right-justify */
SCOUT_LEFT_TRUNC, /*Left-truncate */
SCOUT_ISNT_LDISK); /*Not a labeled disk */
*------------------------------------------------------------------------*/
static int
-init_mini_line(struct sockaddr_in *a_skt, int a_lineNum,
+init_mini_line(struct sockaddr_in *a_skt, int a_lineNum,
struct mini_line *a_line, char *a_srvname)
{ /*init_mini_line */
a_line->base_line = a_lineNum + scout_screen.base_line_num;
a_line->num_lines = 1;
- curr_x = 0;
+ curr_x = 1;
curr_y = a_line->base_line;
if ((a_line->currConns_lp =
- mini_initLightObject("Conns", curr_x, curr_y, LIGHTOBJ_CONN_WIDTH,
+ mini_initLightObject("Conns", curr_x, curr_y, scout_col_width[COL_CONN],
scout_gwin))
== NULL) {
fprintf(stderr, "[%s:%s] Can't create currConns light object\n", pn,
rn);
return (-1);
}
- curr_x += LIGHTOBJ_CONN_WIDTH + 1;
+ curr_x += scout_col_width[COL_CONN] + 1;
if ((a_line->fetches_lp =
- mini_initLightObject("Fetches", curr_x, curr_y, LIGHTOBJ_FETCH_WIDTH,
+ mini_initLightObject("Fetches", curr_x, curr_y, scout_col_width[COL_FETCH],
scout_frame->window))
== NULL) {
fprintf(stderr, "[%s:%s] Can't create fetches light object\n", pn,
rn);
return (-1);
}
- curr_x += LIGHTOBJ_FETCH_WIDTH + 1;
+ curr_x += scout_col_width[COL_FETCH] + 1;
if ((a_line->stores_lp =
- mini_initLightObject("Stores", curr_x, curr_y, LIGHTOBJ_STORE_WIDTH,
+ mini_initLightObject("Stores", curr_x, curr_y, scout_col_width[COL_STORE],
scout_frame->window))
== NULL) {
fprintf(stderr, "[%s:%s] Can't create stores light object\n", pn, rn);
return (-1);
}
- curr_x += LIGHTOBJ_STORE_WIDTH + 1;
+ curr_x += scout_col_width[COL_STORE] + 1;
if ((a_line->workstations_lp =
- mini_initLightObject("WrkStn", curr_x, curr_y, LIGHTOBJ_WK_WIDTH,
+ mini_initLightObject("WrkStn", curr_x, curr_y, scout_col_width[COL_WK],
scout_frame->window))
== NULL) {
fprintf(stderr, "[%s:%s] Can't create workstations light object\n",
pn, rn);
return (-1);
}
- curr_x += LIGHTOBJ_WK_WIDTH + 1;
+ curr_x += scout_col_width[COL_WK] + 1;
if ((a_line->srvName_lp =
mini_initLightObject(a_srvname, curr_x, curr_y,
- LIGHTOBJ_SRVNAME_WIDTH, scout_frame->window))
+ scout_col_width[COL_SRVNAME], scout_frame->window))
== NULL) {
fprintf(stderr, "[%s:%s] Can't create server name light object\n", pn,
rn);
lightdata = (struct gator_lightobj *)(a_line->srvName_lp->o_data);
code = mini_justify(s, /*Src buffer */
lightdata->label, /*Dest buffer */
- LIGHTOBJ_SRVNAME_WIDTH, /*Dest's width */
+ scout_col_width[COL_SRVNAME], /*Dest's width */
SCOUT_CENTER, /*Centered */
SCOUT_RIGHT_TRUNC, /*Right-truncate */
SCOUT_ISNT_LDISK); /*Not a labeled disk */
"[%s] Can't center server name inside of light object\n", rn);
return (code);
}
- curr_x += LIGHTOBJ_SRVNAME_WIDTH + 1;
+ curr_x += scout_col_width[COL_SRVNAME] + 1;
if (scout_initDiskLightObjects(a_line, scout_frame->window)) {
fprintf(stderr, "[%s:%s] Can't create disk light objects\n", pn, rn);
static char rn[] = "execute_scout"; /*Routine name */
static char fullsrvname[128]; /*Full server name */
- register int code; /*Return code */
+ int code; /*Return code */
struct sockaddr_in *FSSktArray; /*Server socket array */
int sktbytes; /*Num bytes in above */
struct sockaddr_in *curr_skt; /*Ptr to current socket */
return (-1);
}
memcpy(&(curr_skt->sin_addr.s_addr), he->h_addr, 4);
-#if defined(AFS_DARWIN_ENV) || defined(AFS_FBSD_ENV)
- curr_skt->sin_family = AF_INET; /*Internet family */
-#else
- curr_skt->sin_family = htons(AF_INET); /*Internet family */
-#endif
- curr_skt->sin_port = htons(7000); /*FileServer port */
+ curr_skt->sin_family = AF_INET;
+ curr_skt->sin_port = htons(7000); /* FileServer port */
/*
* Bump our pointers.
/*Debugging */
if (scout_debug)
- fprintf(scout_debugfd, "[%s] Scout label is '%s', %lu chars\n", rn,
+ fprintf(scout_debugfd, "[%s] Scout label is '%s', %" AFS_SIZET_FMT " chars\n", rn,
lightdata->label, strlen(lightdata->label));
}
0, /*X*/ 2, /*Y*/ scout_frameDims.maxx, /*Width */
scout_gwin); /*Window */
if (scout_banner1_lp != NULL) {
+ char attn_label[256];
if (scout_attn_disk_mode == SCOUT_DISKM_PCUSED) {
- sprintf(scout_Banner, "%s > %s%% used", scout_LightLabels,
- scout_attn_disk_pcusedstr);
+ snprintf(attn_label, sizeof(attn_label), "%s: > %s%% used",
+ scout_label[5], scout_attn_disk_pcusedstr);
} else {
- sprintf(scout_Banner, "%s < %d blocks free", scout_LightLabels,
- scout_attn_disk_minfree);
+ snprintf(attn_label, sizeof(attn_label), "%s: < %d blocks free",
+ scout_label[5], scout_attn_disk_minfree);
}
+ snprintf(scout_Banner, sizeof(scout_Banner),
+ "%*s %*s %*s %*s %*s %s",
+ scout_col_width[0], scout_label[0],
+ scout_col_width[1], scout_label[1],
+ scout_col_width[2], scout_label[2],
+ scout_col_width[3], scout_label[3],
+ scout_col_width[4], scout_label[4],
+ attn_label);
+
lightdata = (struct gator_lightobj *)(scout_banner1_lp->o_data);
code =
mini_justify(scout_Banner, lightdata->label, scout_frameDims.maxx,
0, /*X*/ 3, /*Y*/ scout_frameDims.maxx, /*Width */
scout_gwin); /*Window */
if (scout_banner2_lp != NULL) {
+ snprintf(scout_Banner, sizeof(scout_Banner),
+ "%*s %*s %*s %*s %*s %s",
+ scout_col_width[0], scout_underline[0],
+ scout_col_width[1], scout_underline[1],
+ scout_col_width[2], scout_underline[2],
+ scout_col_width[3], scout_underline[3],
+ scout_col_width[4], scout_underline[4],
+ scout_underline[5]);
+
lightdata = (struct gator_lightobj *)(scout_banner2_lp->o_data);
code =
- mini_justify(scout_LightLabelUnd, lightdata->label,
+ mini_justify(scout_Banner, lightdata->label,
scout_frameDims.maxx, SCOUT_LEFT_JUSTIFY,
SCOUT_RIGHT_TRUNC, SCOUT_ISNT_LDISK);
code = gtxframe_AddToList(scout_frame, scout_banner2_lp);
&gxlistener_ID); /*Returned LWP process ID */
#endif /* 0 */
- code = (int) gtx_InputServer(scout_gwin);
+ code = (int)(intptr_t)gtx_InputServer(scout_gwin);
if (code) {
fprintf(stderr,
"[%s] Error exit from gtx_InputServer(), error is %d\n", rn,
} /*scout_AdoptThresholds */
+/**
+ * Setup the user specified column widths.
+ *
+ * The column widths specifies the number of digits which
+ * will be displayed without truncation. The column widths
+ * are given in the same order in which they are displayed,
+ * from left to right. Not all columns need to be specified
+ * on the command line. The default column widths for those
+ * columns not specified. Column widths can not be set smaller
+ * than the heading underline.
+ *
+ * @param[in] a_width_item command line width item list
+ */
+void
+scout_SetColumnWidths(struct cmd_item *a_width_item)
+{
+ int i;
+ int width;
+ int num_cols = sizeof(scout_col_width) / sizeof(*scout_col_width);
+
+ for (i = 0; a_width_item && i < num_cols; i++) {
+ width = atoi(a_width_item->data);
+ if (width > 0) {
+ int min_width = strlen(scout_underline[i]);
+ if (min_width) {
+ width = max(width, min_width);
+ }
+ scout_col_width[i] = width + 1;
+ }
+ a_width_item = a_width_item->next;
+ }
+ if (a_width_item) {
+ fprintf(stderr, "Too many values given for -columnwidths\n");
+ scout_CleanExit(1);
+ }
+}
+
/*------------------------------------------------------------------------
* scoutInit
*
if (as->parms[P_ATTENTION].items != 0)
scout_AdoptThresholds(as->parms[P_ATTENTION].items);
+ if (as->parms[P_WIDTHS].items != 0) {
+ scout_SetColumnWidths(as->parms[P_WIDTHS].items);
+ }
+
/*
* Now, drive the sucker.
*/
main(int argc, char **argv)
{ /*main */
- register afs_int32 code; /*Return code */
- register struct cmd_syndesc *ts; /*Ptr to cmd line syntax descriptor */
+ afs_int32 code; /*Return code */
+ struct cmd_syndesc *ts; /*Ptr to cmd line syntax descriptor */
#ifdef AFS_AIX32_ENV
/*
- * The following signal action for AIX is necessary so that in case of a
- * crash (i.e. core is generated) we can include the user's data section
+ * The following signal action for AIX is necessary so that in case of a
+ * crash (i.e. core is generated) we can include the user's data section
* in the core dump. Unfortunately, by default, only a partial core is
* generated which, in many cases, isn't too useful.
*/
"specify attention (highlighting) level");
cmd_AddParm(ts, "-debug", CMD_SINGLE, CMD_OPTIONAL,
"turn debugging output on to the named file");
+ cmd_AddParm(ts, "-columnwidths", CMD_LIST, CMD_OPTIONAL,
+ "specify column widths");
/*
* Parse command-line switches & execute the test, then get the heck