fsprobe: add fsprobe_Wait function
[openafs.git] / src / scout / scout.c
index af977f8..4a38b47 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * 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
 #include <afsconfig.h>
 #include <afs/param.h>
 
-RCSID
-    ("$Header$");
+#include <roken.h>
 
 #undef IN
-#ifdef AFS_AIX32_ENV
-#include <signal.h>
-#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 <stdio.h>             /*Standard I/O stuff */
-#include <cmd.h>               /*Command interpretation library */
-#include <fsprobe.h>           /*Interface for fsprobe module */
-#include <errno.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 <afs/cmd.h>           /*Command interpretation library */
+#include <afs/fsprobe.h>               /*Interface for fsprobe module */
 #include <afs/afsutil.h>
-#include <netdb.h>
 
 /*
  * Command line parameter indicies.
@@ -51,9 +42,10 @@ RCSID
 #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
@@ -63,6 +55,16 @@ RCSID
 #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
@@ -157,6 +159,14 @@ static struct onode *scout_banner2_lp;     /*Banner light, line 2 */
 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.
   */
@@ -177,10 +187,10 @@ static char scout_attn_disk_pcusedstr[8] = "95";
   * 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[] =
+    { "----", "--------", "--------", "-----", "", "----------" };
 
 
 /*------------------------------------------------------------------------
@@ -200,7 +210,7 @@ static char scout_LightLabelUnd[] =
  *     Void.
  *
  * Environment:
- *     Actions depend on scout_gtx_initialized.  
+ *     Actions depend on scout_gtx_initialized.
  *
  * Side Effects:
  *     This routine will always exit Scout.
@@ -219,7 +229,7 @@ scout_CleanExit(int a_exitval)
 
     if (scout_gtx_initialized) {
        gtxframe_exitValue = a_exitval;
-       gtxframe_ExitCmd((char *)(&gtxframe_exitValue));
+       gtxframe_ExitCmd((void *)(&gtxframe_exitValue), NULL);
     } else
        exit(a_exitval);
 
@@ -371,7 +381,7 @@ scout_initDiskLightObjects(struct mini_line *a_line, struct gwin *a_win)
        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,
@@ -387,7 +397,7 @@ scout_initDiskLightObjects(struct mini_line *a_line, struct gwin *a_win)
        curr_disk->prev = i - 1;
        curr_disk->next = i + 1;
        curr_disk->active = 0;
-       curr_disk->name = '\0';
+       curr_disk->name = "";
 
        /*
         * Bump up to the next disk structure.
@@ -441,7 +451,7 @@ scout_initDiskLightObjects(struct mini_line *a_line, struct gwin *a_win)
  *------------------------------------------------------------------------*/
 
 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 */
@@ -665,18 +675,21 @@ scout_RecomputeLightLocs(struct mini_line *a_srvline)
      * 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);
@@ -729,7 +742,7 @@ scout_RecomputeLightLocs(struct mini_line *a_srvline)
         * 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 */
@@ -1001,14 +1014,13 @@ scout_RemoveInactiveDisk(struct mini_line *a_srvline, int a_used_idx)
  *------------------------------------------------------------------------*/
 
 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 */
 
     static char rn[] = "mini_PrintDiskStats";  /*Routine name */
-    int code;                  /*Return code */
     char s[128];               /*String buffer */
     struct onode *curr_disklight;      /*Ptr to current disk light */
     struct onode *srvname_light;       /*Ptr to server name light */
@@ -1064,13 +1076,13 @@ mini_PrintDiskStats(struct mini_line *a_srvline,
                        used_disk_idx, diskdata->label);
                fflush(scout_debugfd);
            }
-           code = mini_justify(" ",    /*Src buffer */
-                               diskdata->label,        /*Dest buffer */
-                               LIGHTOBJ_DISK_WIDTH,    /*Dest's width */
-                               SCOUT_RIGHT_JUSTIFY,    /*Right-justify */
-                               SCOUT_LEFT_TRUNC,       /*Left-truncate */
-                               SCOUT_ISNT_LDISK);      /*Not a labeled disk */
-           code = gator_light_set(curr_disklight, 0);
+           mini_justify(" ",   /*Src buffer */
+                        diskdata->label,       /*Dest buffer */
+                        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 */
+           gator_light_set(curr_disklight, 0);
            if (a_fix_line_num) {
                curr_disklight->o_y += a_delta_line_num;
                disk_strparams = (struct gwin_strparams *)(diskdata->llrock);
@@ -1103,7 +1115,6 @@ mini_PrintDiskStats(struct mini_line *a_srvline,
      * mark all used disk objects for this server as inactive and fix
      * their line numbers if needed.
      */
-    sc_disk = a_srvline->disks;
     used_disk_idx = a_srvline->used_head;
     while (used_disk_idx != SCOUT_NIL) {
        if (scout_debug) {
@@ -1176,14 +1187,14 @@ mini_PrintDiskStats(struct mini_line *a_srvline,
                            rn, s, found_idx, diskdata->label);
                    fflush(scout_debugfd);
                }
-               code = mini_justify(s,  /*Src buffer */
-                                   diskdata->label,    /*Dest buffer */
-                                   LIGHTOBJ_DISK_WIDTH,        /*Dest's width */
-                                   SCOUT_LEFT_JUSTIFY, /*Left-justify */
-                                   SCOUT_LEFT_TRUNC,   /*Left-truncate */
-                                   SCOUT_IS_LDISK);    /*Labeled disk */
+               mini_justify(s, /*Src buffer */
+                            diskdata->label,   /*Dest buffer */
+                            scout_col_width[COL_DISK], /*Dest's width */
+                            SCOUT_LEFT_JUSTIFY,        /*Left-justify */
+                            SCOUT_LEFT_TRUNC,  /*Left-truncate */
+                            SCOUT_IS_LDISK);   /*Labeled disk */
 
-               code = gator_light_set(sc_disk->disk_lp, pastthreshold);
+               gator_light_set(sc_disk->disk_lp, pastthreshold);
 
            }                   /*Found disk record */
        }
@@ -1315,7 +1326,6 @@ FS_Handler(void)
     curr_probeOK = fsprobe_Results.probeOK;
     curr_line_num = curr_line->base_line;
 
-    setting = 0;
     for (curr_srvidx = 0; curr_srvidx < scout_screen.numServers;
         curr_srvidx++) {
        /*
@@ -1340,56 +1350,56 @@ FS_Handler(void)
            sprintf(sp, "%d", curr_stats->CurrentConnections);
        } else
            sp = sblank;
-       code = mini_justify(sp, /*Src buffer */
-                           lightdata->label,   /*Dest buffer */
-                           LIGHTOBJ_CONN_WIDTH,        /*Dest's width */
-                           SCOUT_RIGHT_JUSTIFY,        /*Right-justify */
-                           SCOUT_LEFT_TRUNC,   /*Left-truncate */
-                           SCOUT_ISNT_LDISK);  /*Not a labeled disk */
+       mini_justify(sp,        /*Src buffer */
+                    lightdata->label,  /*Dest buffer */
+                    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 */
        if (scout_attn_conn != SCOUT_ATTN_NOTUSED
            && curr_stats->CurrentConnections >= scout_attn_conn)
            setting = 1;
        else
            setting = 0;
-       code = gator_light_set(curr_line->currConns_lp, setting);
+       gator_light_set(curr_line->currConns_lp, setting);
 
        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_RIGHT_JUSTIFY,        /*Right-justify */
-                           SCOUT_LEFT_TRUNC,   /*Left-truncate */
-                           SCOUT_ISNT_LDISK);  /*Not a labeled disk */
+       mini_justify(sp,        /*Src buffer */
+                    lightdata->label,  /*Dest buffer */
+                    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 */
        if (scout_attn_fetch != SCOUT_ATTN_NOTUSED
            && curr_stats->TotalFetchs >= scout_attn_fetch)
            setting = 1;
        else
            setting = 0;
-       code = gator_light_set(curr_line->fetches_lp, setting);
+       gator_light_set(curr_line->fetches_lp, setting);
 
        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_RIGHT_JUSTIFY,        /*Right-justify */
-                           SCOUT_LEFT_TRUNC,   /*Left-truncate */
-                           SCOUT_ISNT_LDISK);  /*Not a labeled disk */
+       mini_justify(sp,        /*Src buffer */
+                    lightdata->label,  /*Dest buffer */
+                    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 */
        if (scout_attn_store != SCOUT_ATTN_NOTUSED
            && curr_stats->TotalStores >= scout_attn_store)
            setting = 1;
        else
            setting = 0;
-       code = gator_light_set(curr_line->stores_lp, setting);
+       gator_light_set(curr_line->stores_lp, setting);
 
        lightdata =
            (struct gator_lightobj *)(curr_line->workstations_lp->o_data);
@@ -1398,18 +1408,18 @@ FS_Handler(void)
            sprintf(sp, "%d", curr_stats->WorkStations);
        } else
            sp = sblank;
-       code = mini_justify(sp, /*Src buffer */
-                           lightdata->label,   /*Dest buffer */
-                           LIGHTOBJ_WK_WIDTH,  /*Dest's width */
-                           SCOUT_RIGHT_JUSTIFY,        /*Right-justify */
-                           SCOUT_LEFT_TRUNC,   /*Left-truncate */
-                           SCOUT_ISNT_LDISK);  /*Not a labeled disk */
+       mini_justify(sp,        /*Src buffer */
+                    lightdata->label,  /*Dest buffer */
+                    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 */
        if (scout_attn_workstations != SCOUT_ATTN_NOTUSED
            && curr_stats->WorkStations >= scout_attn_workstations)
            setting = 1;
        else
            setting = 0;
-       code = gator_light_set(curr_line->workstations_lp, setting);
+       gator_light_set(curr_line->workstations_lp, setting);
 
        /*
         * We turn the server light on if there was an error in the
@@ -1417,7 +1427,7 @@ FS_Handler(void)
         * (Don't forget to fix the light's line if it needs it).
         */
        setting = (*curr_probeOK) ? 1 : 0;
-       code = gator_light_set(curr_line->srvName_lp, setting);
+       gator_light_set(curr_line->srvName_lp, setting);
 
        /*
         * Print out the disk statistics.  The value returned is the
@@ -1485,7 +1495,7 @@ FS_Handler(void)
  *------------------------------------------------------------------------*/
 
 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 */
 
@@ -1511,50 +1521,50 @@ init_mini_line(struct sockaddr_in *a_skt, int a_lineNum,
     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);
@@ -1564,7 +1574,7 @@ init_mini_line(struct sockaddr_in *a_skt, int a_lineNum,
     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 */
@@ -1573,7 +1583,6 @@ init_mini_line(struct sockaddr_in *a_skt, int a_lineNum,
                "[%s] Can't center server name inside of light object\n", rn);
        return (code);
     }
-    curr_x += LIGHTOBJ_SRVNAME_WIDTH + 1;
 
     if (scout_initDiskLightObjects(a_line, scout_frame->window)) {
        fprintf(stderr, "[%s:%s] Can't create disk light objects\n", pn, rn);
@@ -1616,7 +1625,7 @@ execute_scout(int a_numservers, struct cmd_item *a_srvname, int a_pkg)
 
     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 */
@@ -1626,7 +1635,6 @@ execute_scout(int a_numservers, struct cmd_item *a_srvname, int a_pkg)
     struct mini_line *curr_line;       /*Ptr to current line */
     int i;                     /*Generic loop variable */
     int mini_line_bytes;       /*Num bytes in mini_lines */
-    struct timeval tv;         /*Time structure */
     int linenum;               /*Current mini-line number */
 #if 0
     PROCESS pid;               /*Main LWP process ID */
@@ -1687,14 +1695,13 @@ execute_scout(int a_numservers, struct cmd_item *a_srvname, int a_pkg)
      * watching.
      */
     sktbytes = a_numservers * sizeof(struct sockaddr_in);
-    FSSktArray = (struct sockaddr_in *)malloc(sktbytes);
+    FSSktArray = calloc(1, sktbytes);
     if (FSSktArray == (struct sockaddr_in *)0) {
        fprintf(stderr,
                "[%s] Can't malloc() %d sockaddrs (%d bytes) for the given servers\n",
                rn, a_numservers, sktbytes);
        scout_CleanExit(-1);
     }
-    memset(FSSktArray, 0, sktbytes);
 
     /*
      * Sweep through the server names provided, filling in the socket
@@ -1715,12 +1722,8 @@ execute_scout(int a_numservers, struct cmd_item *a_srvname, int a_pkg)
            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.
@@ -1734,13 +1737,12 @@ execute_scout(int a_numservers, struct cmd_item *a_srvname, int a_pkg)
      * Create the set of mini-lines, one per server.
      */
     mini_line_bytes = a_numservers * sizeof(struct mini_line);
-    mini_lines = (struct mini_line *)malloc(mini_line_bytes);
+    mini_lines = calloc(1, mini_line_bytes);
     if (mini_lines == (struct mini_line *)0) {
        fprintf(stderr, "[%s] Can't malloc() %d bytes for %d screen lines\n",
                rn, mini_line_bytes, a_numservers);
        return (-1);
     }
-    memset(mini_lines, 0, mini_line_bytes);
 
     /*
      * Set up each line in the mini_lines, creating and initializing
@@ -1775,15 +1777,14 @@ execute_scout(int a_numservers, struct cmd_item *a_srvname, int a_pkg)
                                            scout_gwin);        /*Window */
     if (scout_banner0_lp != NULL) {
        lightdata = (struct gator_lightobj *)(scout_banner0_lp->o_data);
-       code =
-           mini_justify(scout_Banner, lightdata->label, scout_frameDims.maxx,
-                        SCOUT_CENTER, SCOUT_RIGHT_TRUNC, SCOUT_ISNT_LDISK);
-       code = gator_light_set(scout_banner0_lp, 1);
-       code = gtxframe_AddToList(scout_frame, scout_banner0_lp);
+       mini_justify(scout_Banner, lightdata->label, scout_frameDims.maxx,
+                    SCOUT_CENTER, SCOUT_RIGHT_TRUNC, SCOUT_ISNT_LDISK);
+       gator_light_set(scout_banner0_lp, 1);
+       gtxframe_AddToList(scout_frame, scout_banner0_lp);
 
        /*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));
     }
 
@@ -1791,32 +1792,49 @@ execute_scout(int a_numservers, struct cmd_item *a_srvname, int a_pkg)
                                            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,
-                        SCOUT_LEFT_JUSTIFY, SCOUT_RIGHT_TRUNC,
-                        SCOUT_ISNT_LDISK);
+       mini_justify(scout_Banner, lightdata->label, scout_frameDims.maxx,
+                    SCOUT_LEFT_JUSTIFY, SCOUT_RIGHT_TRUNC,
+                    SCOUT_ISNT_LDISK);
 
-       code = gtxframe_AddToList(scout_frame, scout_banner1_lp);
+       gtxframe_AddToList(scout_frame, scout_banner1_lp);
     }
 
     scout_banner2_lp = mini_initLightObject("Banner 2",        /*Light name */
                                            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,
-                        scout_frameDims.maxx, SCOUT_LEFT_JUSTIFY,
-                        SCOUT_RIGHT_TRUNC, SCOUT_ISNT_LDISK);
-       code = gtxframe_AddToList(scout_frame, scout_banner2_lp);
+       mini_justify(scout_Banner, lightdata->label,
+                    scout_frameDims.maxx, SCOUT_LEFT_JUSTIFY,
+                    SCOUT_RIGHT_TRUNC, SCOUT_ISNT_LDISK);
+       gtxframe_AddToList(scout_frame, scout_banner2_lp);
     }
 
     for (i = 0; i < a_numservers; i++) {
@@ -1939,7 +1957,7 @@ execute_scout(int a_numservers, struct cmd_item *a_srvname, int a_pkg)
                             &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,
@@ -1947,18 +1965,7 @@ execute_scout(int a_numservers, struct cmd_item *a_srvname, int a_pkg)
        scout_CleanExit(code);
     }
 
-    /*
-     * We fall into a loop, sleeping forever.
-     */
-    while (1) {
-       tv.tv_sec = 60 * 60;    /*Sleep for an hour at a time */
-       tv.tv_usec = 0;
-       code = select(0,        /*Num fds */
-                     0,        /*Descriptors ready for reading */
-                     0,        /*Descriptors ready for writing */
-                     0,        /*Descriptors with exceptional conditions */
-                     &tv);     /*Timeout structure */
-    }                          /*Sleep forever */
+    fsprobe_Wait(0); /* sleep forever */
 
 #if 0
     /*
@@ -1969,6 +1976,7 @@ execute_scout(int a_numservers, struct cmd_item *a_srvname, int a_pkg)
     return (0);
 #endif /* 0 */
 
+    return 0;
 }                              /*execute_scout */
 
 /*------------------------------------------------------------------------
@@ -2140,6 +2148,43 @@ static void scout_AdoptThresholds(struct cmd_item *a_thresh_item)
 
 }                              /*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
  *
@@ -2252,6 +2297,10 @@ static int scoutInit(struct cmd_syndesc *as, void *arock)
     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.
      */
@@ -2276,13 +2325,13 @@ int
 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.
      */
@@ -2296,7 +2345,7 @@ main(int argc, char **argv)
     /*
      * Set up the commands we understand.
      */
-    ts = cmd_CreateSyntax("initcmd", scoutInit, NULL, "initialize the program");
+    ts = cmd_CreateSyntax("initcmd", scoutInit, NULL, 0, "initialize the program");
     cmd_AddParm(ts, "-server", CMD_LIST, CMD_REQUIRED,
                "FileServer name(s) to monitor");
     cmd_AddParm(ts, "-basename", CMD_SINGLE, CMD_OPTIONAL,
@@ -2313,6 +2362,8 @@ main(int argc, char **argv)
                "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