my_open.c
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:4k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. /* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
  2.    
  3.    This library is free software; you can redistribute it and/or
  4.    modify it under the terms of the GNU Library General Public
  5.    License as published by the Free Software Foundation; either
  6.    version 2 of the License, or (at your option) any later version.
  7.    
  8.    This library is distributed in the hope that it will be useful,
  9.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.    Library General Public License for more details.
  12.    
  13.    You should have received a copy of the GNU Library General Public
  14.    License along with this library; if not, write to the Free
  15.    Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
  16.    MA 02111-1307, USA */
  17. #define USES_TYPES
  18. #include "mysys_priv.h"
  19. #include "mysys_err.h"
  20. #include <my_dir.h>
  21. #include <errno.h>
  22. #if defined(MSDOS) || defined(__WIN__) || defined(__EMX__)
  23. #include <share.h>
  24. #endif
  25. /* Open a file */
  26. File my_open(const char *FileName, int Flags, myf MyFlags)
  27. /* Path-name of file */
  28. /* Read | write .. */
  29. /* Special flags */
  30. {
  31.   File fd;
  32.   DBUG_ENTER("my_open");
  33.   DBUG_PRINT("my",("Name: '%s'  Flags: %d  MyFlags: %d",
  34.    FileName, Flags, MyFlags));
  35. #if defined(MSDOS) || defined(__WIN__) || defined(__EMX__)
  36.   if (Flags & O_SHARE)
  37.     fd = sopen((my_string) FileName, (Flags & ~O_SHARE) | O_BINARY, SH_DENYNO,
  38.        MY_S_IREAD | MY_S_IWRITE);
  39.   else
  40.     fd = open((my_string) FileName, Flags | O_BINARY,
  41.       MY_S_IREAD | MY_S_IWRITE);
  42. #elif !defined(NO_OPEN_3)
  43.   fd = open(FileName, Flags, my_umask); /* Normal unix */
  44. #else
  45.   fd = open((my_string) FileName, Flags);
  46. #endif
  47.   DBUG_RETURN(my_register_filename(fd, FileName, FILE_BY_OPEN,
  48.    EE_FILENOTFOUND, MyFlags));
  49. } /* my_open */
  50. /* Close a file */
  51. int my_close(File fd, myf MyFlags)
  52. {
  53.   int err;
  54.   DBUG_ENTER("my_close");
  55.   DBUG_PRINT("my",("fd: %d  MyFlags: %d",fd, MyFlags));
  56.   pthread_mutex_lock(&THR_LOCK_open);
  57.   if ((err = close(fd)))
  58.   {
  59.     DBUG_PRINT("error",("Got error %d on close",err));
  60.     my_errno=errno;
  61.     if (MyFlags & (MY_FAE | MY_WME))
  62.       my_error(EE_BADCLOSE, MYF(ME_BELL+ME_WAITTANG),my_filename(fd),errno);
  63.   }
  64.   if ((uint) fd < MY_NFILE && my_file_info[fd].type != UNOPEN)
  65.   {
  66.     my_free(my_file_info[fd].name, MYF(0));
  67. #if defined(THREAD) && !defined(HAVE_PREAD)
  68.     pthread_mutex_destroy(&my_file_info[fd].mutex);
  69. #endif
  70.     my_file_info[fd].type = UNOPEN;
  71.     my_file_opened--;
  72.   }
  73.   pthread_mutex_unlock(&THR_LOCK_open);
  74.   DBUG_RETURN(err);
  75. } /* my_close */
  76. File my_register_filename(File fd, const char *FileName, enum file_type
  77.   type_of_file, uint error_message_number, myf MyFlags)
  78. {
  79.   if ((int) fd >= 0)
  80.   {
  81.     if ((int) fd >= MY_NFILE)
  82.     {
  83. #if defined(THREAD) && !defined(HAVE_PREAD)
  84.       (void) my_close(fd,MyFlags);
  85.       my_errno=EMFILE;
  86.       if (MyFlags & (MY_FFNF | MY_FAE | MY_WME))
  87. my_error(EE_OUT_OF_FILERESOURCES, MYF(ME_BELL+ME_WAITTANG),
  88.  FileName, my_errno);
  89.       return(-1);
  90. #else
  91.       thread_safe_increment(my_file_opened,&THR_LOCK_open);
  92. #endif
  93.       return(fd); /* safeguard */
  94.     }
  95.     pthread_mutex_lock(&THR_LOCK_open);
  96.     if ((my_file_info[fd].name = (char*) my_strdup(FileName,MyFlags)))
  97.     {
  98.       my_file_opened++;
  99.       my_file_info[fd].type = type_of_file;
  100. #if defined(THREAD) && !defined(HAVE_PREAD)
  101.       pthread_mutex_init(&my_file_info[fd].mutex,NULL);
  102. #endif
  103.       pthread_mutex_unlock(&THR_LOCK_open);
  104.       DBUG_PRINT("exit",("fd: %d",fd));
  105.       return(fd);
  106.     }
  107.     pthread_mutex_unlock(&THR_LOCK_open);
  108.     (void) my_close(fd, MyFlags);
  109.     my_errno=ENOMEM;
  110.   }
  111.   else
  112.     my_errno=errno;
  113.   DBUG_PRINT("error",("Got error %d on open",my_errno));
  114.   if (MyFlags & (MY_FFNF | MY_FAE | MY_WME))
  115.     my_error(error_message_number, MYF(ME_BELL+ME_WAITTANG),
  116.      FileName, my_errno);
  117.   return(fd);
  118. }