[comp.os.vms] Disk Usage v1.2 Bug Fix!

manes@xanth.UUCP (11/20/87)

References:


Well for those folks who got my first VAX C program, well I had a minor
bug that just showed up.  It appears that when you ran the disk usage
program the temp file was not wiped.  Well this was traced to my
spawn routine.  I can't believe I left it that way.  O well, here
is the corrected version.

Please dont flame, Wesley Crusher is watching!

---cut here------
/* DU.C - By Mark D. Manes, System Programmer
   Norfolk State University
   November 18, 1987
 
   The report generated will give percentages, byte usage, and 
   overall system disk usage.  
 
   If you have bigger drives than the RA81 or smaller, you need to
   change the definition for RA81 to reflect the max space available
   to your disk.                                                    */
 
/*  Update #1 Nov 20, 1987 - A minor bug with the spawn routine 
    caused the temporary files not to be deleted.  This fix modified
    the spawn routine to allow it to either write to data file or not.
    There are now 3 parameters to the spawn function,  command, 
    output file, and the file switch.  The file switch if set to 1 will
    allow output to be redirected to a data file specified in param #2,
    if it is set to zero (file_switch) then the 2nd parameter is ignored
    and the command is processed with output directed at SYS$OUTPUT 
    
    A final note for this version the temporary file has been renamed
    to t_disk.dt.                                    */  
 
 
#include <stdio.h>                            
#include <descrip.h>
#include <ssdef.h>
#include <libdef.h> 
#include <string.h>
#include <math.h>
 
#define MAXLIN    90
#define RA81      891072  /* Max Free Blocks on a New RA81 */ 
#define BLOCK     512     /* Number of bytes in 1 block    */
    
char cmd_string[MAXLIN] = "show dev d";
char out_file[10] = "t_disk.dt";   /* must use ALL 11 bytes */
char in_data[MAXLIN], f_bytes[MAXLIN];
char *disk_ptr, *dspace_ptr, *command, *form_bytes, *out_file_ptr;
char disk[5], dspace[7];
int a, d_space, used_blocks, percent_free, percent_used, free_bytes,
    dummy, slen, width, blanks, file_switch; 
float total_blocks_free, total_available, total_used;  
float total_bytes_avail, total_bytes_used;       
int count, count_space = 0;
float system_wide_usage;
FILE *in;
main()
{                                                                   
 
/*  Set up disk file for analysis, execute the SHOW DEV D command */  
  file_switch = 1;
  a = spawn_it(cmd_string,out_file, file_switch);    
  if (a != SS$_NORMAL) {   
    printf("Command Failed %d\n",a);
    exit(a);   
  }                              
                                                                  
  in = fopen("t_disk.dt","r");   /* Open the disk file */
  if (in == NULL) {
    printf("File Open Failure %x\n",in);                            
    exit(in);
  }       
 
                              
  printf("                              DISK USAGE V1.2 \n");
  printf("                          (Individual Disk Usage)\n");
  printf("\n");
  printf("Disk             Free       Used           Free     Per     Per    Disk\n");
  printf("Drive:         Blocks     Blocks          Bytes    Free    Used    Status\n");   
  printf("=============================================================================\n");
 
/* The 3 read  lines below throw out the lines with no data */
  fgets (in_data, MAXLIN, in);
  fgets (in_data, MAXLIN, in);
  fgets (in_data, MAXLIN, in);                               
 
/* Now do the real thing! */
  while ( fgets (in_data,MAXLIN, in) != NULL)  {
         count++;            
         disk_ptr = mid(1,5,in_data);    /*  Get Disk Name */
         strcpy (disk, disk_ptr);     
         dspace_ptr = mid(65,7,in_data); /*  Get Free Blocks */
         d_space = atoi(dspace_ptr);      
                    
         /* Calculate detail line stuff */
 
         used_blocks = RA81 - d_space;
         free_bytes = d_space * BLOCK;
         percent_free = (100 * d_space) / RA81;
         percent_used = 100 - percent_free;                        
 
         /* Get Totals! */
 
         total_blocks_free = total_blocks_free + d_space; 
                                      
         /* String Formatting */
         a = itoa (free_bytes, f_bytes);  
         form_bytes = insert_comma(f_bytes);         
         /* Print Detail Line */
         printf("%s          ",disk);
         printf("%d     ",d_space);
         printf("%d    ",used_blocks);
         printf("%s     ",form_bytes);
         printf("%d%c     ",percent_free,'%');
         printf("%d%c   ",percent_used,'%');
         if (percent_free < 20) 
            printf(" -*ALERT*-\n");
         else                                                  
         if (percent_free < 40)
            printf(" -WARNING-\n");
         else
            printf(" -OK-\n");               
     }                
  printf("\n                         - DISK USAGE SUMMARY -\n\n");
 
  total_available = RA81 * count;
  total_used = total_available - total_blocks_free; 
  total_bytes_avail = total_available * BLOCK;
  total_bytes_used = total_used * BLOCK; 
  system_wide_usage = (total_used / total_available) * 100;
 
  /* Print Final Statistics */     
 
  /* Total Blocks Available */
 
  dummy = total_available;
  itoa (dummy, f_bytes);  
  form_bytes = insert_comma(f_bytes);         
  printf("Total Blocks Available: "); 
  slen = strlen(form_bytes);
  width = 13;
  blanks = width - slen;
  if (blanks > 0) 
     white_space (&blanks);
  printf("%s",form_bytes);   
 
  /* Total Blocks Used */
    
  dummy = total_used;
  itoa (dummy, f_bytes);
  form_bytes = insert_comma(f_bytes);
  slen = strlen(form_bytes);     
  printf("             Used: ");
  width = 13;
  blanks = width - slen;
  if (blanks > 0) {
      white_space (&blanks);                          
  }
  printf("%s\n",form_bytes);
 
  /* Total Bytes Available */
 
  dummy = total_bytes_avail;
  itoa (dummy, f_bytes);
  form_bytes = insert_comma(f_bytes);
  printf("Total Bytes Available:  ");
  slen = strlen(form_bytes);     
  width = 13;
  blanks = width - slen;
  if (blanks > 0) {
      white_space (&blanks);                          
  }
  printf("%s",form_bytes);
 
  /* Total Bytes Used */
 
  dummy = total_bytes_used;
  itoa (dummy, f_bytes);
  form_bytes = insert_comma(f_bytes);
  slen = strlen(form_bytes);     
  printf("             Used: ");
  width = 13;
  blanks = width - slen;
  if (blanks > 0) {
      white_space (&blanks);                          
  }
  printf("%s \n",form_bytes);
 
  /* Percentages, and Good bye */
  
  printf("\nSystem wide disk usage: %3.2f\n", system_wide_usage);
  printf("\nEnd of Report\n");
  printf("-------------\n");
  printf("Disk Usage v1.2\nBy Mark Manes, System Programmer\n");
  printf("Norfolk State University, November 13, 1987\n");
  printf("This Software is Public Domain\n");
 
  /*  Clean up and say bye bye */
 
  close(in);                         
 
  /* Delete the temp file */                     
  command = "delete t_disk.dt;*";
  strcpy (cmd_string, command); 
  file_switch = 0;  /* no out file */
  a = spawn_it(cmd_string, out_file, file_switch);
  if (a != SS$_NORMAL) { 
    printf("Command = %s\n",command);
    printf("Command Failed %d\n",a);
    exit(a);   
  }                
  exit(a);
}; 
 
/* End of Main Routine */
 
                                
 
itoa (n, s)            /* This routine is used to change a integer
                          into a string, page 60 - Kernighan / Ritchie */
 
char s[];
int n;
{
  int i, sign;
  
  if ((sign = n) < 0) 
     n = -n;
  i = 0;
  do {
     s[i++] = n % 10 + '0';
  } while ((n /= 10) > 0); 
  if (sign < 0)
     s[i++] = '-';
  s[i] = '\0';
  reverse(s);
}
 
reverse(s)                 /* reverse string s in place */
char s[];
{
   int c, i, j;
   
   for (i = 0, j = strlen(s)-1; i < j; i++, j--) {
       c = s[i];
       s[i] = s[j];
       s[j] = c;
    }
}
  
insert_comma (string)      /* This routine will take a string that is
                              passed to it and place comma's in every
                              third position, i.e. 1024 = 1,024.  
                              Capice?                                  */
#define COMMA ','
            
char string[];
 
{                                        
    int count, index, len, remainder  = 0;                
    static char string_out_array[MAXLIN] = NULL;  
    char hold_string[MAXLIN] = NULL;
    strcpy(hold_string, string);
    len = strlen(string);           
    remainder = len % 3;
    if (remainder != 0) 
       index = len + (len / 3);
    else
       index = len + (len / 3) - 1;
    string_out_array[index + 1] = '\0';
    count = 0;
    while (len != -1) {
       if (count > 3) {            
          string_out_array[index] = COMMA;
          index--;
          count = 1;
        };        
        string_out_array [index] = hold_string[len];
        len--;index--;count++;
     }
     return(string_out_array);
};
             
mid(beg,len,string)      /* Extracts a string from within a string
                            based on the first bytes, and length */          
          
int beg, len; 
char string[];
 
{        
   
   char *search_line_ptr, *start;
   int top = 0;
   static char string_out_array[MAXLIN] = NULL;
   search_line_ptr = string;                     
   top = search_line_ptr + strlen(string);
   start = (search_line_ptr + beg) -1;
   if (start > top) 
      return(NULL);                 
   strcpy(string_out_array, start);
   string_out_array[len] = '\0';
  
   return (string_out_array);
}                            
 
spawn_it(cmd,out,file)      
/*   Version 1.0 - By Mark Manes, System Programmer, Norfolk State   */
/*   Spawn Function calls LIB$SPAWN to execute the command passed to */
/*   the 'cmd' variable, status is returned to the main program.     */
/*   The following include files are required:                       */
/*           ssdef.h, libdef.h, string.h, descrip.h                  */
 
char *cmd;      
char *out;    
int file;  
 
{                           
char command_text[MAXLIN];     
$DESCRIPTOR (cmd_ptr, command_text);
char out_file[10];  /* total size of file name */
$DESCRIPTOR (out_file_ptr, out_file);
unsigned long int status = 0;
         
strcpy(command_text, cmd);
strcpy(out_file, out);
if (file != 0)     {    
    status = LIB$SPAWN(&cmd_ptr,NULL,&out_file_ptr);  
    }
else
    status = LIB$SPAWN(&cmd_ptr);  
 
     
return (status);
}    
 
white_space (x)        /* This routine is used for padding */
int *x;
 
{
  int count = 0;
  char *blank = " ";
  while (count++ != *x) {
    printf(" ");
  }           
 
}