home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume26 / maint / part01 / edit.c < prev    next >
C/C++ Source or Header  |  1992-05-13  |  5KB  |  161 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:    Call an editor for a file.  The EDITOR variable is first
  13.         examined; if it's not defined, DEFAULT_EDITOR is used.
  14.  
  15.    Arguments:    See individual routine(s).
  16.  
  17.    External variables:    None
  18.  
  19.    Maint external functions:
  20.  
  21.     Defined:    edit
  22.  
  23.     Called:        None
  24.  
  25.    Files accessed:    File to be edited, passed through parameter list
  26.  
  27.    Return codes:    See individual routine(s).
  28.  
  29.    Compiling instructions:    See Makefile
  30.  
  31.    Linking instructions:    See Makefile
  32.  
  33.    Other information:    (C) Copyright 1992, Leonard J. Peirce
  34.  
  35. ********************************************************************************
  36. *******************************************************************************/
  37.  
  38. /******************************************************************************/
  39. /*                                                                            */
  40. /*                        # I N C L U D E   F I L E S                         */
  41. /*                                                                            */
  42. /******************************************************************************/
  43.  
  44. #include <stdio.h>
  45. #include <string.h>
  46. #if !defined(SYSV) || defined(sun)
  47. #include <sys/wait.h>
  48. #endif
  49. #include "maint.h"
  50.  
  51. /******************************************************************************/
  52. /*                                                                            */
  53. /*                             # D E F I N E S                                */
  54. /*                                                                            */
  55. /******************************************************************************/
  56.  
  57. /******************************************************************************/
  58. /*                                                                            */
  59. /*          S T R U C T U R E S ,   U N I O N S ,   T Y P E D E F S           */
  60. /*                                                                            */
  61. /******************************************************************************/
  62.  
  63. /******************************************************************************/
  64. /*                                                                            */
  65. /*   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    */
  66. /*                                                                            */
  67. /******************************************************************************/
  68.  
  69. extern     char      *getenv();
  70.  
  71. extern     int      access(),
  72.           wait(),
  73.           fork(),
  74.           execlp();
  75.  
  76.      int      edit();
  77.  
  78. /******************************************************************************/
  79. /*                                                                            */
  80. /*     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      */
  81. /*                                                                            */
  82. /******************************************************************************/
  83.  
  84. /*******************************************************************************
  85. ********************************************************************************
  86.  
  87.   Function:    edit
  88.  
  89.   Purpose:    Call an editor for a file.  If the user has an EDITOR
  90.         environment variable, use it.  Otherwise, the default is
  91.         DEFAULT_EDITOR.
  92.  
  93.   Global variables:
  94.  
  95.     Name            Examine/Modify/Use/Read/Write
  96.     ----            -----------------------------
  97.     none
  98.  
  99.   Return Codes:
  100.  
  101.     Code            Reason
  102.     ----            ------
  103.     SUCCESS
  104.     FAILURE
  105.  
  106. ********************************************************************************
  107. *******************************************************************************/
  108.  
  109. int edit(filename)
  110.                     /*******   FORMAL  PARAMETERS   *******/
  111.      char      *filename;        /* name of file to be edited          */
  112.  
  113. {    /*** edit ***/
  114.                     /********   LOCAL  VARIABLES   ********/
  115.      char      *editor,        /* editor to use              */
  116.           *tptr;        /* pointer to last level of command   */
  117.      int      child,        /* pid of child process              */
  118.           i;            /* loop and return value          */
  119. #if !defined(SYSV) || defined(sun)
  120. union     wait      status;        /* exit status for child process      */
  121. #else
  122.      int      status;
  123. #endif
  124.  
  125.  
  126.    /* see if the user has an EDITOR */
  127.  
  128.    editor = getenv("EDITOR");
  129.  
  130.    if(editor == NULL || *editor == '\0')
  131.       editor = DEFAULT_EDITOR;        /* user doesn't have an EDITOR          */
  132.  
  133.    tptr = strrchr(editor,'/');        /* get last level to pass to execlp   */
  134.  
  135.    if(tptr == NULL)
  136.       tptr = editor;
  137.    else
  138.       tptr++;
  139.  
  140.    if((child = vfork()) == 0)
  141.    {
  142.       /* we're in the child */
  143.  
  144.       endwin();
  145.       execlp(editor,tptr,filename,NULL);
  146.       return(FAILURE);            /* execlp failed if we get here          */
  147.    }
  148.    else if(child > 0)
  149.    {
  150.       /* we're in the parent; wait for the child to finish */
  151.  
  152.       while(((i = wait(&status)) != child) && i > 0)
  153.      ;
  154.    }
  155.    else
  156.       return(FAILURE);
  157.  
  158.    return(SUCCESS);
  159.  
  160. }    /*** edit ***/
  161.