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_create.c < prev    next >
C/C++ Source or Header  |  2000-09-12  |  3KB  |  98 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 <my_dir.h>
  21. #include "mysys_err.h"
  22. #include <errno.h>
  23. #if defined(MSDOS) || defined(__WIN__)
  24. #include <share.h>
  25. #endif
  26.  
  27.     /*
  28.     ** Create a new file
  29.     ** Arguments:
  30.     ** Path-name of file
  31.     ** Read | write on file (umask value)
  32.     ** Read & Write on open file
  33.     ** Special flags
  34.     */
  35.  
  36.  
  37. File my_create(const char *FileName, int CreateFlags, int access_flags,
  38.            myf MyFlags)
  39. {
  40.   int fd;
  41.   DBUG_ENTER("my_create");
  42.   DBUG_PRINT("my",("Name: '%s' CreateFlags: %d  AccessFlags: %d  MyFlags: %d",
  43.            FileName, CreateFlags, access_flags, MyFlags));
  44.  
  45. #if !defined(NO_OPEN_3)
  46.   fd = open((my_string) FileName, access_flags | O_CREAT,
  47.         CreateFlags ? CreateFlags : my_umask);
  48. #elif defined(VMS)
  49.   fd = open((my_string) FileName, access_flags | O_CREAT, 0,
  50.         "ctx=stm","ctx=bin");
  51. #elif defined(MSDOS) || defined(__WIN__)
  52.   if (access_flags & O_SHARE)
  53.     fd = sopen((my_string) FileName, access_flags | O_CREAT | O_BINARY,
  54.            SH_DENYNO, MY_S_IREAD | MY_S_IWRITE);
  55.   else
  56.     fd =  open((my_string) FileName, access_flags | O_CREAT | O_BINARY,
  57.            MY_S_IREAD | MY_S_IWRITE);
  58. #else
  59.   fd = open(FileName, access_flags);
  60. #endif
  61.  
  62.   if (fd >= 0)
  63.   {
  64.     if ((int) fd >= MY_NFILE)
  65.     {
  66. #if defined(THREAD) && !defined(HAVE_PREAD)
  67.       (void) my_close(fd,MyFlags);
  68.       my_errno=EMFILE;
  69.       if (MyFlags & (MY_FFNF | MY_FAE | MY_WME))
  70.     my_error(EE_OUT_OF_FILERESOURCES, MYF(ME_BELL+ME_WAITTANG),
  71.          FileName, my_errno);
  72.       DBUG_RETURN(-1);
  73. #else
  74.       thread_safe_increment(my_file_opened,&THR_LOCK_open);
  75.       DBUG_PRINT("exit",("fd: %d",fd));
  76.       DBUG_RETURN(fd);                /* safeguard */
  77. #endif
  78.     }
  79.     if ((my_file_info[fd].name = (char*) my_strdup(FileName,MyFlags)))
  80.     {
  81.       my_file_opened++;
  82.       my_file_info[fd].type = FILE_BY_CREATE;
  83. #if defined(THREAD) && !defined(HAVE_PREAD)
  84.       pthread_mutex_init(&my_file_info[fd].mutex,NULL);
  85. #endif
  86.       DBUG_PRINT("exit",("fd: %d",fd));
  87.       DBUG_RETURN(fd);
  88.     }
  89.     VOID(my_close(fd,MyFlags));
  90.     my_errno=ENOMEM;
  91.   }
  92.   else
  93.     my_errno=errno;
  94.   if (MyFlags & (MY_FFNF | MY_FAE | MY_WME))
  95.     my_error(EE_CANTCREATEFILE, MYF(ME_BELL+ME_WAITTANG), FileName,my_errno);
  96.   DBUG_RETURN(-1);
  97. } /* my_create */
  98.