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_fstream.c < prev    next >
C/C++ Source or Header  |  2000-09-29  |  5KB  |  172 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. /* USE_MY_STREAM isn't set because we can't thrust my_fclose! */
  19.  
  20. #include "mysys_priv.h"
  21. #include "mysys_err.h"
  22. #include <errno.h>
  23. #include <stdio.h>
  24.  
  25. #ifdef HAVE_FSEEKO
  26. #undef ftell
  27. #undef fseek
  28. #define ftell(A) ftello(A)
  29. #define fseek(A,B,C) fseeko((A),(B),(C))
  30. #endif
  31.  
  32.     /* Read a chunk of bytes from a file  */
  33.     /* Returns (uint) -1 if error as my_read() */
  34.  
  35. uint my_fread(FILE *stream, byte *Buffer, uint Count, myf MyFlags)
  36.             /* File descriptor */
  37.             /* Buffer must be at least count bytes */
  38.             /* Max number of bytes returnd */
  39.             /* Flags on what to do on error */
  40. {
  41.   uint readbytes;
  42.   DBUG_ENTER("my_fread");
  43.   DBUG_PRINT("my",("stream: %lx  Buffer: %lx  Count: %u  MyFlags: %d",
  44.            stream, Buffer, Count, MyFlags));
  45.  
  46.   if ((readbytes = (uint) fread(Buffer,sizeof(char),(size_t) Count,stream))
  47.       != Count)
  48.   {
  49.     DBUG_PRINT("error",("Read only %d bytes",readbytes));
  50.     if (MyFlags & (MY_WME | MY_FAE | MY_FNABP))
  51.     {
  52.       if (ferror(stream))
  53.     my_error(EE_READ, MYF(ME_BELL+ME_WAITTANG),
  54.          my_filename(fileno(stream)),errno);
  55.       else
  56.       if (MyFlags & (MY_NABP | MY_FNABP))
  57.     my_error(EE_EOFERR, MYF(ME_BELL+ME_WAITTANG),
  58.          my_filename(fileno(stream)),errno);
  59.     }
  60.     my_errno=errno ? errno : -1;
  61.     if (ferror(stream) || MyFlags & (MY_NABP | MY_FNABP))
  62.       DBUG_RETURN((uint) -1);            /* Return with error */
  63.   }
  64.   if (MyFlags & (MY_NABP | MY_FNABP))
  65.     DBUG_RETURN(0);                /* Read ok */
  66.   DBUG_RETURN(readbytes);
  67. } /* my_fread */
  68.  
  69.  
  70. /*
  71. ** Write a chunk of bytes to a stream
  72. ** Returns (uint) -1 if error as my_write()
  73. ** Does retries if interrupted
  74. */
  75.  
  76. uint my_fwrite(FILE *stream, const byte *Buffer, uint Count, myf MyFlags)
  77. {
  78.   uint writenbytes=0;
  79.   off_t seekptr;
  80. #if !defined(NO_BACKGROUND) && defined(USE_MY_STREAM)
  81.   uint errors;
  82. #endif
  83.   DBUG_ENTER("my_fwrite");
  84.   DBUG_PRINT("my",("stream: %lx  Buffer: %lx  Count: %u  MyFlags: %d",
  85.            stream, Buffer, Count, MyFlags));
  86.  
  87. #if !defined(NO_BACKGROUND) && defined(USE_MY_STREAM)
  88.   errors=0;
  89. #endif
  90.   seekptr=ftell(stream);
  91.   for (;;)
  92.   {
  93.     uint writen;
  94.     if ((writen = (uint) fwrite((char*) Buffer,sizeof(char),
  95.                 (size_t) Count, stream)) != Count)
  96.     {
  97.       DBUG_PRINT("error",("Write only %d bytes",writenbytes));
  98.       my_errno=errno;
  99.       if (writen != (uint) -1)
  100.       {
  101.     seekptr+=writen;
  102.     Buffer+=writen;
  103.     writenbytes+=writen;
  104.     Count-=writen;
  105.       }
  106. #ifdef EINTR
  107.       if (errno == EINTR)
  108.       {
  109.     VOID(my_fseek(stream,seekptr,MY_SEEK_SET,MYF(0)));
  110.     continue;
  111.       }
  112. #endif
  113. #if !defined(NO_BACKGROUND) && defined(USE_MY_STREAM)
  114. #ifdef THREAD
  115.       if (my_thread_var->abort)
  116.     MyFlags&= ~ MY_WAIT_IF_FULL;        /* End if aborted by user */
  117. #endif
  118.       if (errno == ENOSPC && (MyFlags & MY_WAIT_IF_FULL))
  119.       {
  120.     if (!(errors++ % MY_WAIT_GIVE_USER_A_MESSAGE))
  121.       my_error(EE_DISK_FULL,MYF(ME_BELL | ME_NOREFRESH));
  122.     sleep(MY_WAIT_FOR_USER_TO_FIX_PANIC);
  123.     VOID(my_fseek(stream,seekptr,MY_SEEK_SET,MYF(0)));
  124.     continue;
  125.       }
  126. #endif
  127.       if (ferror(stream) || (MyFlags & (MY_NABP | MY_FNABP)))
  128.       {
  129.     if (MyFlags & (MY_WME | MY_FAE | MY_FNABP))
  130.     {
  131.       my_error(EE_WRITE, MYF(ME_BELL+ME_WAITTANG),
  132.            my_filename(fileno(stream)),errno);
  133.     }
  134.     writenbytes=(uint) -1;            /* Return that we got error */
  135.     break;
  136.       }
  137.     }
  138.     if (MyFlags & (MY_NABP | MY_FNABP))
  139.       writenbytes=0;                /* Everything OK */
  140.     else
  141.       writenbytes+=writen;
  142.     break;
  143.   }
  144.   DBUG_RETURN(writenbytes);
  145. } /* my_fwrite */
  146.  
  147.     /* Seek to position in file */
  148.     /* ARGSUSED */
  149.  
  150. my_off_t my_fseek(FILE *stream, my_off_t pos, int whence, myf MyFlags)
  151. {
  152.   DBUG_ENTER("my_fseek");
  153.   DBUG_PRINT("my",("stream: %lx  pos: %lu  whence: %d  MyFlags: %d",
  154.            stream, pos, whence, MyFlags));
  155.   DBUG_RETURN(fseek(stream, (off_t) pos, whence) ?
  156.           MY_FILEPOS_ERROR : (my_off_t) ftell(stream));
  157. } /* my_seek */
  158.  
  159.  
  160.     /* Tell current position of file */
  161.     /* ARGSUSED */
  162.  
  163. my_off_t my_ftell(FILE *stream, myf MyFlags)
  164. {
  165.   off_t pos;
  166.   DBUG_ENTER("my_ftell");
  167.   DBUG_PRINT("my",("stream: %lx  MyFlags: %d",stream, MyFlags));
  168.   pos=ftell(stream);
  169.   DBUG_PRINT("exit",("ftell: %lu",(ulong) pos));
  170.   DBUG_RETURN((my_off_t) pos);
  171. } /* my_ftell */
  172.