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

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 "mysys_err.h"
  15. #include <m_string.h>
  16. #include <errno.h>
  17. #ifdef HAVE_REALPATH
  18. #include <sys/param.h>
  19. #include <sys/stat.h>
  20. #endif
  21. /*
  22.   Reads the content of a symbolic link
  23.   If the file is not a symbolic link, return the original file name in to.
  24.   RETURN
  25.     0  If filename was a symlink,    (to will be set to value of symlink)
  26.     1  If filename was a normal file (to will be set to filename)
  27.    -1  on error.
  28. */
  29. int my_readlink(char *to, const char *filename, myf MyFlags)
  30. {
  31. #ifndef HAVE_READLINK
  32.   strmov(to,filename);
  33.   return 1;
  34. #else
  35.   int result=0;
  36.   int length;
  37.   DBUG_ENTER("my_readlink");
  38.   if ((length=readlink(filename, to, FN_REFLEN-1)) < 0)
  39.   {
  40.     /* Don't give an error if this wasn't a symlink */
  41.     if ((my_errno=errno) == EINVAL)
  42.     {
  43.       result= 1;
  44.       strmov(to,filename);
  45.     }
  46.     else
  47.     {
  48.       if (MyFlags & MY_WME)
  49. my_error(EE_CANT_READLINK, MYF(0), filename, errno);
  50.       result= -1;
  51.     }
  52.   }
  53.   else
  54.     to[length]=0;
  55.   DBUG_PRINT("exit" ,("result: %d", result));
  56.   DBUG_RETURN(result);
  57. #endif /* HAVE_READLINK */
  58. }
  59. /* Create a symbolic link */
  60. int my_symlink(const char *content, const char *linkname, myf MyFlags)
  61. {
  62. #ifndef HAVE_READLINK
  63.   return 0;
  64. #else
  65.   int result;
  66.   DBUG_ENTER("my_symlink");
  67.   DBUG_PRINT("enter",("content: %s  linkname: %s", content, linkname));
  68.   result= 0;
  69.   if (symlink(content, linkname))
  70.   {
  71.     result= -1;
  72.     my_errno=errno;
  73.     if (MyFlags & MY_WME)
  74.       my_error(EE_CANT_SYMLINK, MYF(0), linkname, content, errno);
  75.   }
  76.   DBUG_RETURN(result);
  77. #endif /* HAVE_READLINK */
  78. }
  79. /*
  80.   Resolve all symbolic links in path
  81.   'to' may be equal to 'filename'
  82.   Because purify gives a lot of UMR errors when using realpath(),
  83.   this code is disabled when using purify.
  84.   If MY_RESOLVE_LINK is given, only do realpath if the file is a link.
  85. */
  86. #if defined(SCO)
  87. #define BUFF_LEN 4097
  88. #elif defined(MAXPATHLEN)
  89. #define BUFF_LEN MAXPATHLEN
  90. #else
  91. #define BUFF_LEN FN_LEN
  92. #endif
  93. int my_realpath(char *to, const char *filename,
  94. myf MyFlags __attribute__((unused)))
  95. {
  96. #if defined(HAVE_REALPATH) && !defined(HAVE_purify) && !defined(HAVE_BROKEN_REALPATH)
  97.   int result=0;
  98.   char buff[BUFF_LEN];
  99.   struct stat stat_buff;
  100.   DBUG_ENTER("my_realpath");
  101.   if (!(MyFlags & MY_RESOLVE_LINK) ||
  102.       (!lstat(filename,&stat_buff) && S_ISLNK(stat_buff.st_mode)))
  103.   {
  104.     char *ptr;
  105.     DBUG_PRINT("info",("executing realpath"));
  106.     if ((ptr=realpath(filename,buff)))
  107.     {
  108.       strmake(to,ptr,FN_REFLEN-1);
  109.     }
  110.     else
  111.     {
  112.       /*
  113. Realpath didn't work;  Use my_load_path() which is a poor substitute
  114. original name but will at least be able to resolve paths that starts
  115. with '.'.
  116.       */
  117.       DBUG_PRINT("error",("realpath failed with errno: %d", errno));
  118.       my_errno=errno;
  119.       if (MyFlags & MY_WME)
  120. my_error(EE_REALPATH, MYF(0), filename, my_errno);
  121.       my_load_path(to, filename, NullS);
  122.       result= -1;
  123.     }
  124.   }
  125.   DBUG_RETURN(result);
  126. #else
  127.   my_load_path(to, filename, NullS);
  128.   return 0;
  129. #endif
  130. }