home *** CD-ROM | disk | FTP | other *** search
/ Chip 2001 January / Chip_2001-01_cd1.bin / tema / mysql / mysql-3.23.28g-win-source.exe / mysys / my_open.c < prev    next >
C/C++ Source or Header  |  2000-11-16  |  4KB  |  117 lines

  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.  
  18. #define USES_TYPES
  19. #include "mysys_priv.h"
  20. #include "mysys_err.h"
  21. #include <errno.h>
  22. #if defined(MSDOS) || defined(__WIN__)
  23. #include <share.h>
  24. #endif
  25.  
  26.     /* Open a file */
  27.  
  28. File my_open(const char *FileName, int Flags, myf MyFlags)
  29.                 /* Path-name of file */
  30.                 /* Read | write .. */
  31.                 /* Special flags */
  32. {
  33.   File fd;
  34.   DBUG_ENTER("my_open");
  35.   DBUG_PRINT("my",("Name: '%s'  Flags: %d  MyFlags: %d",
  36.            FileName, Flags, MyFlags));
  37. #if defined(MSDOS) || defined(__WIN__)
  38.   if (Flags & O_SHARE)
  39.     fd = sopen((my_string) FileName, (Flags & ~O_SHARE) | O_BINARY, SH_DENYNO);
  40.   else
  41.     fd = open((my_string) FileName, Flags | O_BINARY);
  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.  
  48.   if ((int) fd >= 0)
  49.   {
  50.     if ((int) fd >= MY_NFILE)
  51.     {
  52. #if defined(THREAD) && !defined(HAVE_PREAD)
  53.       (void) my_close(fd,MyFlags);
  54.       my_errno=EMFILE;
  55.       if (MyFlags & (MY_FFNF | MY_FAE | MY_WME))
  56.     my_error(EE_OUT_OF_FILERESOURCES, MYF(ME_BELL+ME_WAITTANG),
  57.          FileName, my_errno);
  58.       DBUG_RETURN(-1);
  59. #else
  60.       thread_safe_increment(my_file_opened,&THR_LOCK_open);
  61. #endif
  62.       DBUG_RETURN(fd);                /* safeguard */
  63.     }
  64.     pthread_mutex_lock(&THR_LOCK_open);
  65.     if ((my_file_info[fd].name = (char*) my_strdup(FileName,MyFlags)))
  66.     {
  67.       my_file_opened++;
  68.       my_file_info[fd].type = FILE_BY_OPEN;
  69. #if defined(THREAD) && !defined(HAVE_PREAD)
  70.       pthread_mutex_init(&my_file_info[fd].mutex,NULL);
  71. #endif
  72.       pthread_mutex_unlock(&THR_LOCK_open);
  73.       DBUG_PRINT("exit",("fd: %d",fd));
  74.       DBUG_RETURN(fd);
  75.     }
  76.     pthread_mutex_unlock(&THR_LOCK_open);
  77.     (void) my_close(fd,MyFlags);
  78.     my_errno=ENOMEM;
  79.   }
  80.   else
  81.     my_errno=errno;
  82.   DBUG_PRINT("error",("Got error %d on open",my_errno));
  83.   if (MyFlags & (MY_FFNF | MY_FAE | MY_WME))
  84.     my_error(EE_FILENOTFOUND, MYF(ME_BELL+ME_WAITTANG), FileName,my_errno);
  85.   DBUG_RETURN(fd);
  86. } /* my_open */
  87.  
  88.  
  89.     /* Close a file */
  90.  
  91. int my_close(File fd, myf MyFlags)
  92. {
  93.   int err;
  94.   DBUG_ENTER("my_close");
  95.   DBUG_PRINT("my",("fd: %d  MyFlags: %d",fd, MyFlags));
  96.  
  97.   pthread_mutex_lock(&THR_LOCK_open);
  98.   if ((err = close(fd)))
  99.   {
  100.     DBUG_PRINT("error",("Got error %d on close",err));
  101.     my_errno=errno;
  102.     if (MyFlags & (MY_FAE | MY_WME))
  103.       my_error(EE_BADCLOSE, MYF(ME_BELL+ME_WAITTANG),my_filename(fd),errno);
  104.   }
  105.   if ((uint) fd < MY_NFILE && my_file_info[fd].type != UNOPEN)
  106.   {
  107.     my_free(my_file_info[fd].name, MYF(0));
  108. #if defined(THREAD) && !defined(HAVE_PREAD)
  109.     pthread_mutex_destroy(&my_file_info[fd].mutex);
  110. #endif
  111.     my_file_info[fd].type = UNOPEN;
  112.     my_file_opened--;
  113.   }
  114.   pthread_mutex_unlock(&THR_LOCK_open);
  115.   DBUG_RETURN(err);
  116. } /* my_close */
  117.