my_access.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. #ifdef __WIN__
  16. /*
  17.   Check a file or path for accessability.
  18.  
  19.   SYNOPSIS
  20.     file_access()
  21.     path  Path to file
  22.     amode Access method
  23.  
  24.   DESCRIPTION
  25.     This function wraps the normal access method because the access 
  26.     available in MSVCRT> +reports that filenames such as LPT1 and 
  27.     COM1 are valid (they are but should not be so for us).
  28.  
  29.   RETURN VALUES
  30.   0    ok
  31.   -1   error  (We use -1 as my_access is mapped to access on other platforms)
  32. */
  33. int my_access(const char *path, int amode) 
  34.   WIN32_FILE_ATTRIBUTE_DATA fileinfo;
  35.   BOOL result;
  36.   result= GetFileAttributesEx(path, GetFileExInfoStandard, &fileinfo);
  37.   if (! result ||
  38.       (fileinfo.dwFileAttributes & FILE_ATTRIBUTE_READONLY) && (amode & F_OK))
  39.   {
  40.     my_errno= errno= EACCES;
  41.     return -1;
  42.   }
  43.   return 0;
  44. }
  45. #endif /* __WIN__ */
  46. #if defined(MSDOS) || defined(__WIN__) || defined(__EMX__)
  47. /*
  48.   List of file names that causes problem on windows
  49.   NOTE that one can also not have file names of type CON.TXT
  50. */
  51. static const char *reserved_names[]=
  52. {
  53.   "CON", "PRN", "AUX", "NUL", "COM1", "COM2", "COM3", "COM4", "COM5", "COM6",
  54.   "COM7", "COM8", "COM9", "LPT1", "LPT2", "LPT3", "LPT4", "LPT5", "LPT6",
  55.   "LPT7", "LPT8", "LPT9", "CLOCK$",
  56.   NullS
  57. };
  58. #define MAX_RESERVED_NAME_LENGTH 6
  59. /*
  60.   Check if a path will access a reserverd file name that may cause problems
  61.  
  62.   SYNOPSIS
  63.     check_if_legal_filename
  64.     path  Path to file
  65.   RETURN
  66.     0  ok
  67.     1  reserved file name
  68. */
  69. int check_if_legal_filename(const char *path)
  70. {
  71.   const char *end;
  72.   const char **reserved_name;
  73.   DBUG_ENTER("check_if_legal_filename");
  74.   path+= dirname_length(path);                  /* To start of filename */
  75.   if (!(end= strchr(path, FN_EXTCHAR)))
  76.     end= strend(path);
  77.   if (path == end || (uint) (end - path) > MAX_RESERVED_NAME_LENGTH)
  78.     DBUG_RETURN(0);                             /* Simplify inner loop */
  79.   for (reserved_name= reserved_names; *reserved_name; reserved_name++)
  80.   {
  81.     const char *reserved= *reserved_name;       /* never empty */
  82.     const char *name= path;
  83.     
  84.     do
  85.     {
  86.       if (*reserved != my_toupper(&my_charset_latin1, *name))
  87.         break;
  88.       if (++name == end && !reserved[1])
  89.         DBUG_RETURN(1);                         /* Found wrong path */
  90.     } while (*++reserved);
  91.   }
  92.   DBUG_RETURN(0);
  93. }
  94. #endif
  95. #ifdef OS2
  96. int check_if_legal_filename(const char *path)
  97. {
  98.   return 0;
  99. }
  100. #endif /* OS2 */