mf_path.c
上传用户:romrleung
上传日期:2022-05-23
资源大小:18897k
文件大小:3k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB
  2.    This program is free software; you can redistribute it and/or modify
  3.    it under the terms of the GNU General Public License as published by
  4.    the Free Software Foundation; either version 2 of the License, or
  5.    (at your option) any later version.
  6.    This program is distributed in the hope that it will be useful,
  7.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  8.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  9.    GNU General Public License for more details.
  10.    You should have received a copy of the GNU General Public License
  11.    along with this program; if not, write to the Free Software
  12.    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA */
  13. #include "mysys_priv.h"
  14. #include <m_string.h>
  15. static char *find_file_in_path(char *to,const char *name);
  16. /* Finds where program can find it's files.
  17.    pre_pathname is found by first locking at progname (argv[0]).
  18.    if progname contains path the path is returned.
  19.    else if progname is found in path, return it
  20.    else if progname is given and POSIX environment variable "_" is set
  21.    then path is taken from "_".
  22.    If filename doesn't contain a path append MY_BASEDIR_VERSION or
  23.    MY_BASEDIR if defined, else append "/my/running".
  24.    own_path_name_part is concatinated to result.
  25.    my_path puts result in to and returns to */
  26. my_string my_path(my_string to, const char *progname,
  27.   const char *own_pathname_part)
  28. {
  29.   my_string start,end,prog;
  30.   DBUG_ENTER("my_path");
  31.   start=to; /* Return this */
  32.   if (progname && (dirname_part(to, progname) ||
  33.    find_file_in_path(to,progname) ||
  34.    ((prog=getenv("_")) != 0 && dirname_part(to,prog))))
  35.   {
  36.     VOID(intern_filename(to,to));
  37.     if (!test_if_hard_path(to))
  38.     {
  39.       if (!my_getwd(curr_dir,FN_REFLEN,MYF(0)))
  40. bchange(to,0,curr_dir, (uint) strlen(curr_dir), (uint) strlen(to)+1);
  41.     }
  42.   }
  43.   else
  44.   {
  45.     if ((end = getenv("MY_BASEDIR_VERSION")) == 0 &&
  46. (end = getenv("MY_BASEDIR")) == 0)
  47.     {
  48. #ifdef DEFAULT_BASEDIR
  49.       end= (char*) DEFAULT_BASEDIR;
  50. #else
  51.       end= (char*) "/my/";
  52. #endif
  53.     }
  54.     VOID(intern_filename(to,end));
  55.     to=strend(to);
  56.     if (to != start && to[-1] != FN_LIBCHAR)
  57.       *to++ = FN_LIBCHAR;
  58.     VOID(strmov(to,own_pathname_part));
  59.   }
  60.   DBUG_PRINT("exit",("to: '%s'",start));
  61.   DBUG_RETURN(start);
  62. } /* my_path */
  63. /* test if file without filename is found in path */
  64. /* Returns to if found and to has dirpart if found, else NullS */
  65. #if defined(MSDOS) || defined(__WIN__) || defined(__EMX__) || defined(OS2)
  66. #define F_OK 0
  67. #define PATH_SEP ';'
  68. #define PROGRAM_EXTENSION ".exe"
  69. #elif defined(__NETWARE__)
  70. #define PATH_SEP ';'
  71. #define PROGRAM_EXTENSION ".nlm"
  72. #else
  73. #define PATH_SEP ':'
  74. #endif
  75. static char *find_file_in_path(char *to, const char *name)
  76. {
  77.   char *path,*pos,dir[2];
  78.   const char *ext="";
  79.   if (!(path=getenv("PATH")))
  80.     return NullS;
  81.   dir[0]=FN_LIBCHAR; dir[1]=0;
  82. #ifdef PROGRAM_EXTENSION
  83.   if (!fn_ext(name)[0])
  84.     ext=PROGRAM_EXTENSION;
  85. #endif
  86.   for (pos=path ; (pos=strchr(pos,PATH_SEP)) ; path= ++pos)
  87.   {
  88.     if (path != pos)
  89.     {
  90.       strxmov(strnmov(to,path,(uint) (pos-path)),dir,name,ext,NullS);
  91.       if (!access(to,F_OK))
  92.       {
  93. to[(uint) (pos-path)+1]=0; /* Return path only */
  94. return to;
  95.       }
  96.     }
  97.   }
  98. #ifdef __WIN__
  99.   to[0]=FN_CURLIB;
  100.   strxmov(to+1,dir,name,ext,NullS);
  101.   if (!access(to,F_OK)) /* Test in current dir */
  102.   {
  103.     to[2]=0; /* Leave "." */
  104.     return to;
  105.   }
  106. #endif
  107.   return NullS; /* File not found */
  108. }