home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume26 / maint / part02 / info.c next >
C/C++ Source or Header  |  1992-05-13  |  14KB  |  397 lines

  1. /******************************************************************************
  2. *******************************************************************************
  3.  
  4.    Site:    Western Michigan University Academic Computer Center
  5.  
  6.    System:    Directory/File System Maintenance
  7.   
  8.    Program:    maint
  9.  
  10.    Version=01    Level=00    01/24/92    Leonard J. Peirce
  11.  
  12.    Purpose:    Give full information about a file, including size, pro-
  13.         tection mode, inode, and file commands, among other info.
  14.  
  15.    Arguments:    See individual routine(s).
  16.  
  17.    External variables:    None
  18.  
  19.    Maint external functions:
  20.  
  21.     Defined:    info
  22.  
  23.     Called:        add_filetype, get_group, get_owner, prot_val_to_str,
  24.             put_line, readlink
  25.  
  26.    Files accessed:    File passed to info routine
  27.  
  28.    Return codes:    See individual routines
  29.  
  30.    Compiling instructions:    See Makefile
  31.  
  32.    Linking instructions:    See Makefile
  33.  
  34.    Other information:    (C) Copyright 1992, Leonard J. Peirce
  35.  
  36. ********************************************************************************
  37. *******************************************************************************/
  38.  
  39. /******************************************************************************/
  40. /*                                                                            */
  41. /*                        # I N C L U D E   F I L E S                         */
  42. /*                                                                            */
  43. /******************************************************************************/
  44.  
  45. #if !defined(SYSV) || defined(sun)
  46. #include <sys/types.h>
  47. #endif
  48. #ifdef ultrix
  49. #include <cursesX.h>
  50. #else
  51. #include <curses.h>
  52. #endif
  53. #include <stdio.h>
  54. #include <string.h>
  55. #include <errno.h>
  56. #include <time.h>
  57. #include "maint.h"
  58. #include <sys/stat.h>
  59.  
  60. /******************************************************************************/
  61. /*                                                                            */
  62. /*                             # D E F I N E S                                */
  63. /*                                                                            */
  64. /******************************************************************************/
  65.  
  66. /******************************************************************************/
  67. /*                                                                            */
  68. /*          S T R U C T U R E S ,   U N I O N S ,   T Y P E D E F S           */
  69. /*                                                                            */
  70. /******************************************************************************/
  71.  
  72. /******************************************************************************/
  73. /*                                                                            */
  74. /*   E X T E R N A L   D E F I N I T I O N S   &   D E C L A R A T I O N S    */
  75. /*                                                                            */
  76. /******************************************************************************/
  77.  
  78. extern     char      *prot_val_to_str(),
  79.           *get_owner(),
  80.           *get_group();
  81.  
  82. extern     int      readlink();
  83.  
  84. extern     u_short  add_filetype();
  85.  
  86. extern     short      put_line();
  87.  
  88.      short      info();
  89.  
  90. /******************************************************************************/
  91. /*                                                                            */
  92. /*     S T A T I C   D E F I N I T I O N S   &   D E C L A R A T I O N S      */
  93. /*                                                                            */
  94. /******************************************************************************/
  95.  
  96. /*******************************************************************************
  97. ********************************************************************************
  98.  
  99.   Function:    info
  100.  
  101.   Purpose:    Display all the information about the file that the user could
  102.         possibly want.  Basically, all of the information on the file
  103.         is displayed, along with any of the commands that might be
  104.         associated with the file.
  105.  
  106.   Global variables:
  107.  
  108.     Name            Examine/Modify/Use/Read/Write
  109.     ----            -----------------------------
  110.     none
  111.  
  112.   Return Codes:
  113.  
  114.     Code            Reason
  115.     ----            ------
  116.       0            completed successfully
  117.     CANT_DISPLAY        can't get file attributes to display
  118.  
  119. ********************************************************************************
  120. *******************************************************************************/
  121.  
  122. short info(ent,args)
  123.                     /*******   FORMAL  PARAMETERS   *******/
  124. register ENT_DEF  *ent;            /* file entry pointer              */
  125.      ARG_DEF  *args;        /* run-time arguments              */
  126.  
  127. {    /*** info ***/
  128.                     /********   LOCAL  VARIABLES   ********/
  129. register COM_DEF  *comm_ptr;        /* pointer to file commands for file  */
  130.      WINDOW      *window;        /* window to use              */
  131.      long      temp;            /* temporary time value              */
  132. struct     stat      statbuf;        /* for getting file information          */
  133.      int      row = 0,        /* what row is being written to          */
  134.           length,        /* length of string from readlink()   */
  135.           status,        /* return code status holder          */
  136.           max_row,        /* max. usable row for window          */
  137.           i, j ;        /* simple counters               */
  138.      char      buf[MAXNAMLEN*2],    /* formatting buffer              */
  139.           buf2[MAXNAMLEN+10],    /* for getting symbolic link info     */
  140.           time1[TIME_STR_MAX+2], /* time string formatting buffer     */
  141.           time2[TIME_STR_MAX+2], /* time string formatting buffer     */
  142.           time3[TIME_STR_MAX+2]; /* time string formatting buffer     */
  143. u_short        prot ;        /* protection word value          */
  144. static     char      indent_str[] = {"    "},
  145.           copy_str[] = {"Copy to: "},
  146.           rename_str[] = {"Rename to: "},
  147.           delete_str[] = {"Delete"},
  148.           protect_str[] = {"Protection: "},
  149.           text_str[] = {"Text descriptor: "},
  150.           owner_str[] = {"Owner: "},
  151.           group_str[] = {"Group: "},
  152.           link_str[] = {"Symbolic link to: "};
  153. static char      *who_perm[ 3 ] = {
  154.                     "Owner",
  155.                     "Group",
  156.                     "Others"
  157.                     } ;
  158. static char      *dir_permissions[] = {
  159.     "   %s can%s read (list) the directory",
  160.     "   %s can%s create, delete and rename files in the directory",
  161.     "   %s can%s pass through the directory to other files or dirs",
  162.     } ;
  163. static char      *file_permissions[] = {
  164.     "   %s can%s read the file",
  165.     "   %s can%s change the file",
  166.     "   %s can%s run the program or shell script in the file",
  167.     } ;
  168. char          **perm_details = file_permissions ;
  169.  
  170.     
  171.  
  172.    /* first create a window to use */
  173.  
  174.    window = newwin(LINES - SPEC_WINDOW_ROWS,COLS,SPEC_WINDOW_ROWS,0);
  175.    werase(window);
  176.    keypad(window,TRUE);
  177.    max_row = LINES - (SPEC_WINDOW_ROWS + 1);
  178.  
  179.    /* get the info for the file */
  180.  
  181. #if !defined(SYSV) || defined(sun)
  182.    status = lstat(ent->filename,&statbuf);
  183. #else
  184.    status = stat(ent->filename,&statbuf);
  185. #endif
  186.  
  187.    if(status != 0)
  188.       return(FAILURE);
  189.  
  190.    /* now write the stuff to the screen */
  191.  
  192.    strtcpy(buf,ent->filename);        /* make control chars printable first */
  193.    put_buf(window,buf,&row,max_row,0,A_BOLD,FALSE,' ',FALSE);
  194.    put_buf(window,"",&row,max_row,0,A_BOLD,FALSE,' ',FALSE);
  195.  
  196. #if !defined(SYSV) || defined(sun)
  197.    if(ent->type == LINK)
  198.    {
  199.       /* get what it's linked to */
  200.  
  201.       length = readlink(ent->filename,buf2,MAXNAMLEN+10);
  202.  
  203.       if(length > 0)
  204.       {
  205.      buf2[length] = '\0';        /* make it a string              */
  206.      cat(3,buf,link_str,buf2);
  207.          put_buf(window,buf,&row,max_row,sizeof(link_str),A_NORMAL,FALSE,' ',
  208.          FALSE);
  209.       }
  210.    }
  211. #endif
  212.  
  213.    prot = add_filetype(ent->type,ent->prot);
  214.    sprintf(buf,"Protection: %s    Owner: %s        Group: %s",
  215.        prot_val_to_str(prot), get_owner(ent->uid),get_group(ent->gid));
  216.  
  217.    put_buf(window,buf,&row,max_row,0,A_NORMAL,FALSE,' ',FALSE);
  218.  
  219.    /* first determine what type of file it is */
  220.  
  221.    switch(prot & S_IFMT)
  222.    {
  223.       case(S_IFREG):
  224.      put_buf(window,"This is a standard file.",&row,max_row,0,A_NORMAL,FALSE,' ',FALSE) ;
  225. #if !defined(SYSV) || defined(sun)
  226.          sprintf(buf,"Size in bytes: %d    Size in blocks: %d",statbuf.st_size,
  227.        statbuf.st_blocks);
  228. #else
  229.          sprintf(buf,"Size in bytes: %d",statbuf.st_size);
  230. #endif
  231.      put_buf(window,buf,&row,max_row,0,A_NORMAL,FALSE,' ',FALSE) ;
  232.      break;
  233.       case(S_IFDIR):
  234.      put_buf(window,"This file is a directory.",&row,max_row,0,A_NORMAL,FALSE,' ',FALSE) ;
  235.      perm_details = dir_permissions ;
  236. #if !defined(SYSV)
  237.          if(prot & S_ISGID)
  238.        put_buf(window,"  Files created in this directory will be of the same group as the directory.",&row,max_row,0,A_NORMAL,FALSE,' ',FALSE) ;
  239.      else
  240.        put_buf(window,"  Files created in this directory will be of the same group as your default.",&row,max_row,0,A_NORMAL,FALSE,' ',FALSE) ;
  241. #endif
  242.      break;
  243.       case(S_IFCHR):
  244.      put_buf(window,"This file represents a character device.",&row,max_row,0,A_NORMAL,FALSE,' ',FALSE) ;
  245.          sprintf(buf,"  The major device number is %d, minor number %d.",statbuf.st_size,
  246.        statbuf.st_blocks);
  247.      put_buf(window,buf,&row,max_row,0,A_NORMAL,FALSE,' ',FALSE) ;
  248.      break;
  249.       case(S_IFBLK):
  250.      put_buf(window,"This file represents a block device.",&row,max_row,0,A_NORMAL,FALSE,' ',FALSE) ;
  251.          sprintf(buf,"  The major device number is %d, minor number %d.",statbuf.st_size,
  252.        statbuf.st_blocks);
  253.      put_buf(window,buf,&row,max_row,0,A_NORMAL,FALSE,' ',FALSE) ;
  254.      break;
  255.       case(S_IFIFO):
  256.      put_buf(window,"This file is a named pipe.",&row,max_row,0,A_NORMAL,FALSE,' ',FALSE) ;
  257.          sprintf(buf,"  There are %d unread bytes in the pipe",statbuf.st_size);
  258.      put_buf(window,buf,&row,max_row,0,A_NORMAL,FALSE,' ',FALSE) ;
  259.      break;
  260. #if defined(S_IFLNK)
  261.       case(S_IFLNK):
  262.      put_buf(window,"This file is a symbolic link.",&row,max_row,0,A_NORMAL,FALSE,' ',FALSE) ;
  263.      break;
  264. #endif
  265.       default:
  266.      put_buf(window,"This file is an unknown type.",&row,max_row,0,A_NORMAL,FALSE,' ',FALSE) ;
  267.      break;
  268.    }
  269.  
  270.    /* create and print the detailed permission string */
  271.  
  272.    put_buf(window,"Details on permissions:",&row,max_row,0,A_NORMAL,FALSE,' ',FALSE);
  273.    for(i = j = 0 ; i < 3 ; i++, j+=3 )
  274.    {
  275.       sprintf( buf, perm_details[ 0 ], who_perm[ i ],
  276.      (prot & (S_IREAD >> j)) ? "" : "not" ) ;
  277.       put_buf(window,buf,&row,max_row,0,A_NORMAL,FALSE,' ',FALSE) ;
  278.       sprintf( buf, perm_details[ 1 ], who_perm[ i ],
  279.      (prot & (S_IWRITE >> j)) ? "" : "not" ) ;
  280.       put_buf(window,buf,&row,max_row,0,A_NORMAL,FALSE,' ',FALSE) ;
  281.       sprintf( buf, perm_details[ 2 ], who_perm[ i ],
  282.      (prot & (S_IEXEC >> j)) ? "" : "not" ) ;
  283.       put_buf(window,buf,&row,max_row,0,A_NORMAL,FALSE,' ',FALSE) ;
  284.    }
  285.  
  286.    if(prot & S_ISUID)
  287.       put_buf(window,"The setuid bit is set.",&row,max_row,0,A_NORMAL,FALSE,' ',FALSE) ;
  288.  
  289.    if(prot & S_ISGID)
  290.       put_buf(window,"The sgid bit is set.",&row,max_row,0,A_NORMAL,FALSE,' ',FALSE) ;
  291.  
  292.    if(prot & S_ISVTX)
  293.       put_buf(window,"The sticky bit is set.",&row,max_row,0,A_NORMAL,FALSE,' ',FALSE) ;
  294.  
  295.    sprintf(buf,"Inode #: %d        Number of links: %d",statbuf.st_ino,
  296.        statbuf.st_nlink);
  297.  
  298.    put_buf(window,buf,&row,max_row,0,A_NORMAL,FALSE,' ',FALSE);
  299.  
  300.    temp = (long) statbuf.st_atime;
  301.    strcpy(time1,ctime(&temp));
  302.    temp = (long) statbuf.st_mtime;
  303.    strcpy(time2,ctime(&temp));
  304.    temp = (long) statbuf.st_ctime;
  305.    strcpy(time3,ctime(&temp));
  306.  
  307.    time1[TIME_STR_MAX] = '\0';        /* lop off the \n's              */
  308.    time2[TIME_STR_MAX] = '\0';
  309.    time3[TIME_STR_MAX] = '\0';
  310.  
  311.    cat(3,buf,"Last access:        ",time1);
  312.    put_buf(window,buf,&row,max_row,0,A_NORMAL,FALSE,' ',FALSE);
  313.  
  314.    cat(3,buf,"Last modification:    ",time2);
  315.    put_buf(window,buf,&row,max_row,0,A_NORMAL,FALSE,' ',FALSE);
  316.  
  317.    cat(3,buf,"Last status change:    ",time3);
  318.    put_buf(window,buf,&row,max_row,0,A_NORMAL,FALSE,' ',FALSE);
  319.  
  320.    if(args->text)
  321.    {
  322.       if(ent->text == NULL)
  323.      strcpy(buf,"Text descriptor:    None");
  324.       else
  325.      cat(3,buf,"Text descriptor:    ",ent->text);
  326.  
  327.       put_buf(window,buf,&row,max_row,0,A_NORMAL,FALSE,' ',FALSE);
  328.    }
  329.    
  330.    if(ent->command)
  331.    {
  332.       put_buf(window,"",&row,max_row,0,A_NORMAL,FALSE,' ',FALSE);
  333.       put_buf(window,"File commands:",&row,max_row,0,A_BOLD,FALSE,' ',FALSE);
  334.  
  335.       comm_ptr = ent->command;
  336.  
  337.       if(comm_ptr->comm_copy)
  338.       {
  339.      cat(4,buf,indent_str,copy_str,comm_ptr->copy_name);
  340.      put_buf(window,buf,&row,max_row,sizeof(indent_str) + sizeof(copy_str),
  341.          A_NORMAL,FALSE,' ',FALSE);
  342.       }
  343.  
  344.       if(comm_ptr->comm_ren)
  345.       {
  346.      cat(4,buf,indent_str,rename_str,comm_ptr->ren_name);
  347.      put_buf(window,buf,&row,max_row,sizeof(indent_str) +
  348.          sizeof(rename_str),A_NORMAL,FALSE,' ',FALSE);
  349.       }
  350.  
  351.       if(comm_ptr->comm_prot)
  352.       {
  353.      cat(4,buf,indent_str,protect_str,
  354.          prot_val_to_str(add_filetype(ent->type,comm_ptr->prot)));
  355.      put_buf(window,buf,&row,max_row,sizeof(indent_str) +
  356.          sizeof(protect_str),A_NORMAL,FALSE,' ',FALSE);
  357.       }
  358.  
  359.       if(comm_ptr->comm_text)
  360.       {
  361.      cat(4,buf,indent_str,text_str,comm_ptr->text);
  362.      put_buf(window,buf,&row,max_row,sizeof(indent_str) + sizeof(text_str),
  363.          A_NORMAL,FALSE,' ',FALSE);
  364.       }
  365.  
  366.       if(comm_ptr->comm_own)
  367.       {
  368.      cat(4,buf,indent_str,owner_str,get_owner(comm_ptr->owner));
  369.      put_buf(window,buf,&row,max_row,sizeof(indent_str) + sizeof(owner_str),
  370.          A_NORMAL,FALSE,' ',FALSE);
  371.       }
  372.  
  373.       if(comm_ptr->comm_grp)
  374.       {
  375.      cat(4,buf,indent_str,group_str,get_group(comm_ptr->group));
  376.      put_buf(window,buf,&row,max_row,sizeof(indent_str) + sizeof(group_str),
  377.          A_NORMAL,FALSE,' ',FALSE);
  378.       }
  379.  
  380.       if(comm_ptr->comm_del)
  381.       {
  382.      cat(3,buf,indent_str,delete_str);
  383.      put_buf(window,buf,&row,max_row,sizeof(indent_str) +
  384.          sizeof(delete_str),A_NORMAL,FALSE,' ',FALSE);
  385.       }
  386.    }
  387.    else
  388.       put_buf(window,"File commands:        None",&row,max_row,0,A_NORMAL,
  389.            FALSE,' ',FALSE);
  390.  
  391.  
  392.    put_buf(window," ",&row,max_row,0,A_REVERSE,TRUE,' ',TRUE);
  393.    delwin(window);            /* get rid of the window          */
  394.    return(SUCCESS);
  395.  
  396. }    /*** info ***/
  397.