home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / octave-1.1.1p1-src.tgz / tar.out / fsf / octave / dld / find_exec.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  2KB  |  106 lines

  1. /* Given a filename, dld_find_executable searches the directories listed in the
  2.    environment variable PATH for a file with that filename.
  3.    A new copy of the complete path name of that file is returned.  This new
  4.    string may be disposed by free() later on.
  5. */
  6.  
  7. /* This file is part of DLD, a dynamic link/unlink editor for C.
  8.    
  9.    Copyright (C) 1990 by W. Wilson Ho.
  10.  
  11.    The author can be reached electronically by how@cs.ucdavis.edu or
  12.    through physical mail at:
  13.  
  14.    W. Wilson Ho
  15.    Division of Computer Science
  16.    University of California at Davis
  17.    Davis, CA 95616
  18.  */
  19.  
  20. /* This program is free software; you can redistribute it and/or modify it
  21.    under the terms of the GNU General Public License as published by the
  22.    Free Software Foundation; either version 1, or (at your option) any
  23.    later version. */
  24.  
  25. #include <sys/types.h>
  26. #include <sys/stat.h>
  27. #include <sys/file.h>
  28. #include <sys/param.h>
  29. #include <strings.h>
  30. #ifdef linux
  31. #include <unistd.h>
  32. #endif
  33.  
  34. #define DEFAULT_PATH ".:~/bin::/usr/local/bin:/usr/new:/usr/ucb:/usr/bin:/bin:/usr/hosts"
  35.  
  36. static char *
  37. copy_of (s)
  38. register char *s;
  39. {
  40.     register char *p = (char *) malloc (strlen(s)+1);
  41.  
  42.     if (!p) return 0;
  43.  
  44.     *p = 0;
  45.     strcpy (p, s);
  46.     return p;
  47. }
  48.  
  49. /* ABSOLUTE_FILENAME_P (fname): True if fname is an absolute or
  50.    relative filename */
  51. #ifdef atarist
  52. #define ABSOLUTE_FILENAME_P(fname)    ((fname[0] == '/') || \
  53.     (fname[0] && (fname[1] == ':')))
  54. #else
  55. #define ABSOLUTE_FILENAME_P(fname) \
  56.   ((fname[0] == '/') || (fname[0] == '.') || (strchr (fname, '/')))
  57. #endif /* atarist */
  58.  
  59. char *
  60. dld_find_executable (file)
  61. char *file;
  62. {
  63.     char *search;
  64.     register char *p;
  65.     
  66.     if (ABSOLUTE_FILENAME_P(file))
  67.     return copy_of (file);
  68.     
  69.     if (((search = (char *) getenv("DLDPATH")) == 0) &&
  70.     ((search = (char *) getenv("PATH")) == 0))
  71.     search = DEFAULT_PATH;
  72.     
  73.     p = search;
  74.     
  75.     while (*p) {
  76.     char  name[MAXPATHLEN];
  77.     register char *next;
  78.  
  79.     next = name;
  80.     
  81.     /* copy directory name into [name] */
  82.     while (*p && *p != ':') *next++ = *p++;
  83.     *next = 0;
  84.     if (*p) p++;
  85.  
  86.     if (name[0] == '.' && name[1] == 0)
  87.         getwd (name);
  88.     
  89.     strcat (name, "/");
  90.     strcat (name, file);
  91.  
  92. /* Don't be fooled by directories in the path, etc. */
  93.  
  94.     if (access (name, X_OK) == 0) {
  95.         struct stat stat_temp;
  96.         if (stat (name, &stat_temp))
  97.             continue;
  98.         if (S_IFREG != (S_IFMT & stat_temp.st_mode))
  99.             continue;
  100.         return copy_of (name);
  101.     }
  102.     }
  103.  
  104.     return 0;
  105. }
  106.