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

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. #include "mysys_priv.h"
  18. #include "my_static.h"
  19. #include <errno.h>
  20. #include "mysys_err.h"
  21. static void make_ftype(my_string to,int flag);
  22. /* Open a file as stream */
  23. FILE *my_fopen(const char *FileName, int Flags, myf MyFlags)
  24. /* Path-name of file */
  25. /* Read | write .. */
  26. /* Special flags */
  27. {
  28.   FILE *fd;
  29.   char type[5];
  30.   DBUG_ENTER("my_fopen");
  31.   DBUG_PRINT("my",("Name: '%s'  Flags: %d  MyFlags: %d",
  32.    FileName, Flags, MyFlags));
  33.   make_ftype(type,Flags);
  34.   if ((fd = fopen(FileName, type)) != 0)
  35.   {
  36.     /*
  37.       The test works if MY_NFILE < 128. The problem is that fileno() is char
  38.       on some OS (SUNOS). Actually the filename save isn't that important
  39.       so we can ignore if this doesn't work.
  40.     */
  41.     if ((uint) fileno(fd) >= MY_NFILE)
  42.     {
  43.       thread_safe_increment(my_stream_opened,&THR_LOCK_open);
  44.       DBUG_RETURN(fd); /* safeguard */
  45.     }
  46.     pthread_mutex_lock(&THR_LOCK_open);
  47.     if ((my_file_info[fileno(fd)].name = (char*)
  48.  my_strdup(FileName,MyFlags)))
  49.     {
  50.       my_stream_opened++;
  51.       my_file_info[fileno(fd)].type = STREAM_BY_FOPEN;
  52.       pthread_mutex_unlock(&THR_LOCK_open);
  53.       DBUG_PRINT("exit",("stream: %lx",fd));
  54.       DBUG_RETURN(fd);
  55.     }
  56.     pthread_mutex_unlock(&THR_LOCK_open);
  57.     (void) my_fclose(fd,MyFlags);
  58.     my_errno=ENOMEM;
  59.   }
  60.   else
  61.     my_errno=errno;
  62.   DBUG_PRINT("error",("Got error %d on open",my_errno));
  63.   if (MyFlags & (MY_FFNF | MY_FAE | MY_WME))
  64.     my_error((Flags & O_RDONLY) || (Flags == O_RDONLY ) ? EE_FILENOTFOUND :
  65.      EE_CANTCREATEFILE,
  66.      MYF(ME_BELL+ME_WAITTANG), FileName,my_errno);
  67.   DBUG_RETURN((FILE*) 0);
  68. } /* my_fopen */
  69. /* Close a stream */
  70. int my_fclose(FILE *fd, myf MyFlags)
  71. {
  72.   int err,file;
  73.   DBUG_ENTER("my_fclose");
  74.   DBUG_PRINT("my",("stream: %lx  MyFlags: %d",fd, MyFlags));
  75.   pthread_mutex_lock(&THR_LOCK_open);
  76.   file=fileno(fd);
  77.   if ((err = fclose(fd)) < 0)
  78.   {
  79.     my_errno=errno;
  80.     if (MyFlags & (MY_FAE | MY_WME))
  81.       my_error(EE_BADCLOSE, MYF(ME_BELL+ME_WAITTANG),
  82.        my_filename(file),errno);
  83.   }
  84.   else
  85.     my_stream_opened--;
  86.   if ((uint) file < MY_NFILE && my_file_info[file].type != UNOPEN)
  87.   {
  88.     my_file_info[file].type = UNOPEN;
  89.     my_free(my_file_info[file].name, MYF(MY_ALLOW_ZERO_PTR));
  90.   }
  91.   pthread_mutex_unlock(&THR_LOCK_open);
  92.   DBUG_RETURN(err);
  93. } /* my_fclose */
  94. /* Make a stream out of a file handle */
  95. /* Name may be 0 */
  96. FILE *my_fdopen(File Filedes, const char *name, int Flags, myf MyFlags)
  97. {
  98.   FILE *fd;
  99.   char type[5];
  100.   DBUG_ENTER("my_fdopen");
  101.   DBUG_PRINT("my",("Fd: %d  Flags: %d  MyFlags: %d",
  102.    Filedes, Flags, MyFlags));
  103.   make_ftype(type,Flags);
  104.   if ((fd = fdopen(Filedes, type)) == 0)
  105.   {
  106.     my_errno=errno;
  107.     if (MyFlags & (MY_FAE | MY_WME))
  108.       my_error(EE_CANT_OPEN_STREAM, MYF(ME_BELL+ME_WAITTANG),errno);
  109.   }
  110.   else
  111.   {
  112.     pthread_mutex_lock(&THR_LOCK_open);
  113.     my_stream_opened++;
  114.     if (Filedes < MY_NFILE)
  115.     {
  116.       if (my_file_info[Filedes].type != UNOPEN)
  117.       {
  118.         my_file_opened--; /* File is opened with my_open ! */
  119.       }
  120.       else
  121.       {
  122.         my_file_info[Filedes].name=  my_strdup(name,MyFlags);
  123.       }
  124.       my_file_info[Filedes].type = STREAM_BY_FDOPEN;
  125.     }
  126.     pthread_mutex_unlock(&THR_LOCK_open);
  127.   }
  128.   DBUG_PRINT("exit",("stream: %lx",fd));
  129.   DBUG_RETURN(fd);
  130. } /* my_fdopen */
  131. /* Make a filehandler-open-typestring from ordinary inputflags */
  132. static void make_ftype(register my_string to, register int flag)
  133. {
  134. #if FILE_BINARY /* If we have binary-files */
  135.   reg3 int org_flag=flag;
  136. #endif
  137.   flag&= ~FILE_BINARY; /* remove binary bit */
  138.   if (flag == O_RDONLY)
  139.     *to++= 'r';
  140.   else if (flag == O_WRONLY)
  141.     *to++= 'w';
  142.   else
  143.   { /* Add '+' after theese */
  144.     if (flag == O_RDWR)
  145.       *to++= 'r';
  146.     else if (flag & O_APPEND)
  147.       *to++= 'a';
  148.     else
  149.       *to++= 'w'; /* Create file */
  150.     *to++= '+';
  151.   }
  152. #if FILE_BINARY /* If we have binary-files */
  153.   if (org_flag & FILE_BINARY)
  154.     *to++='b';
  155. #endif
  156.   *to='';
  157. } /* make_ftype */