home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume17 / e2 / part01 / find_hist.c < prev    next >
C/C++ Source or Header  |  1989-02-08  |  2KB  |  83 lines

  1. #include "e.h"
  2.  
  3. /*
  4.  * find_hist()
  5.  *
  6.  * Find out where the history file is hiding. If E_HIST (currently this is
  7.  * "VIHIST") is defined, then use that. Otherwise use a default ($HOME/.e
  8.  * at the moment.)
  9.  *
  10.  * If E_HIST starts with a '/' then take it as an absolute path, otherwise
  11.  * take it relative to the home directory.
  12.  *
  13.  * Set up the name of the temporary file to be in the same directory as the
  14.  * history. This ensures 1) that we can write there and 2) that we can use
  15.  * rename(2) when we want to make it the new history. (I'd just use /tmp but 
  16.  * that stops me from using rename).
  17.  *
  18.  */
  19. void
  20. find_hist()
  21. {
  22.     char *efile;
  23.     struct passwd *pwd;
  24.  
  25.     uid = (int)getuid();
  26.     pwd = getpwuid(uid);
  27.  
  28.     if (!pwd){
  29.         e_error("Could not get password file entry for uid %d.", uid);
  30.     }
  31.  
  32.     home = pwd->pw_dir;
  33.     efile = getenv(E_HIST);
  34.  
  35.     if (!efile){
  36.         /*
  37.          * E_HIST is not set.
  38.          * Use the default location and name for the history file (that
  39.          * is name = DEFAULT_HIST in the home directory.)
  40.          *
  41.          */
  42.         ok_sprintf(ehist, "%s/%s", home, DEFAULT_HIST);
  43.         ok_sprintf(tmp_file, "%s/.e_tempXXXXXX", home);
  44.     }
  45.     else{
  46.         /*
  47.          * It was set.
  48.          *
  49.          */
  50.         if (*efile == '/'){
  51.             /*
  52.              * It's an absolute pathname. Copy it into ehist and tmp_file.
  53.              * Zero the last '/' in tmp_file it to get the basename, then
  54.              * strcat the .e_tempXXXXXX stuff. The call to rindex() cannot 
  55.              * fail to find a '/' since by this time we know that the first 
  56.              * character of efile (and hence ehist and tmp_file) is '/'.
  57.              *
  58.              */
  59.             strcpy(ehist, efile);
  60.             strcpy(tmp_file, efile);
  61.             *rindex(tmp_file, '/') = '\0';
  62.             strcat(tmp_file, "/.e_tempXXXXXX");
  63.         }
  64.         else{
  65.             /*
  66.              * Take it as being relative to the home directory.
  67.              *
  68.              */
  69.             ok_sprintf(ehist, "%s/%s", home, efile);
  70.             ok_sprintf(tmp_file, "%s/.e_tempXXXXXX", home);
  71.         }
  72.     }
  73.  
  74. #ifdef Sysv
  75.     if (!getcwd(cwd, sizeof(cwd))){
  76. #else
  77.     if (getwd(cwd) == (char *)0){
  78. #endif
  79.         e_error("Could not get working directory.");
  80.     }
  81.     return;
  82. }
  83.