home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume26 / maint / part01 / select.c < prev    next >
C/C++ Source or Header  |  1992-05-13  |  5KB  |  169 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:    Allow a user to browse a file using a "pager" of some sort.
  13.         If the user has a PAGER environment variable, use it.  The
  14.         default is DEFAULT_PAGER
  15.  
  16.    Arguments:    See individual routine(s)
  17.  
  18.    External variables:    See individual routine(s)
  19.  
  20.    Maint external functions:
  21.  
  22.           Defined:    file_select
  23.  
  24.           Called:    none
  25.  
  26.    Files accessed:    filename    file to be browsed
  27.  
  28.    Return codes:    See individual routine(s)
  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. #include "maint.h"
  46. #include <stdio.h>
  47. #ifdef ultrix
  48. #include <cursesX.h>
  49. #include <unistd.h>            /* recommended for access(2)          */
  50. #else
  51. #include <curses.h>
  52. #include <sys/file.h>
  53. #endif
  54. #include <string.h>
  55. #if !defined(SYSV) || defined(sun)
  56. #include <sys/wait.h>
  57. #endif
  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      *getenv();
  79.  
  80. extern     int      access(),
  81.           wait(),
  82.           fork(),
  83.           execlp();
  84.  
  85.      int      file_select();
  86.  
  87. /******************************************************************************/
  88. /*                                                                            */
  89. /*     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      */
  90. /*                                                                            */
  91. /******************************************************************************/
  92.  
  93. /*******************************************************************************
  94. ********************************************************************************
  95.  
  96.   Function:    file_select
  97.  
  98.   Purpose:    Process a file that has been selected.  If the user has a
  99.         PAGER environment variable, use the pager specified.  The
  100.         default pager is DEFAULT_PAGER.
  101.  
  102.   Global variables:
  103.  
  104.     Name            Examine/Modify/Use/Read/Write
  105.     ----            -----------------------------
  106.     none
  107.  
  108.   Return Codes:
  109.  
  110.     Code            Reason
  111.     ----            ------
  112.     SUCCESS
  113.     FAILURE
  114.  
  115. ********************************************************************************
  116. *******************************************************************************/
  117.  
  118. int file_select(filename)
  119.                     /*******   FORMAL  PARAMETERS   *******/
  120.      char      *filename;        /* name of file to be accessed          */
  121.  
  122. {    /*** file_select ***/
  123.                     /********   LOCAL  VARIABLES   ********/
  124.      char      *pager,        /* pager for looking at a file          */
  125.           *tptr;        /* pointer to last level of command   */
  126.      int      child,        /* pid of child process              */
  127.           i;            /* loop and return value          */
  128. #if !defined(SYSV) || defined(sun)
  129. union     wait      status;        /* exit status for child process      */
  130. #else
  131.      int      status;
  132. #endif
  133.  
  134.    /* see if the user has a PAGER */
  135.  
  136.    pager = getenv("PAGER");
  137.  
  138.    if(pager == NULL || *pager == '\0')
  139.       pager = DEFAULT_PAGER;        /* user doesn't have a PAGER          */
  140.  
  141.    tptr = strrchr(pager,'/');        /* get last level to pass to execlp   */
  142.  
  143.    if(tptr == NULL)
  144.       tptr = pager;
  145.    else
  146.       tptr++;
  147.  
  148.    if((child = vfork()) == 0)
  149.    {
  150.       /* we're in the child */
  151.  
  152.       endwin();
  153.       execlp(pager,tptr,filename,NULL);
  154.       return(FAILURE);            /* execlp failed if we get here          */
  155.    }
  156.    else if(child > 0)
  157.    {
  158.       /* we're in the parent; wait for the child to finish */
  159.  
  160.       while(((i = wait(&status)) != child) && i > 0)
  161.      ;
  162.    }
  163.    else
  164.       return(FAILURE);
  165.  
  166.    return(SUCCESS);
  167.  
  168. }    /*** file_select ***/
  169.