~drizzle-trunk/drizzle/development

« back to all changes in this revision

Viewing changes to mysys/my_fstream.c

MergingĀ mainline

Show diffs side-by-side

added added

removed removed

Lines of Context:
27
27
#define fseek(A,B,C) fseeko((A),(B),(C))
28
28
#endif
29
29
 
 
30
/*
 
31
  Read a chunk of bytes from a FILE
 
32
 
 
33
  SYNOPSIS
 
34
   my_fread()
 
35
   stream       File descriptor
 
36
   Buffer       Buffer to read to
 
37
   Count        Number of bytes to read
 
38
   MyFlags      Flags on what to do on error
 
39
 
 
40
  RETURN
 
41
    (size_t) -1 Error
 
42
    #           Number of bytes read
 
43
 */
 
44
 
 
45
size_t my_fread(FILE *stream, uchar *Buffer, size_t Count, myf MyFlags)
 
46
{
 
47
  size_t readbytes;
 
48
  DBUG_ENTER("my_fread");
 
49
  DBUG_PRINT("my",("stream: 0x%lx  Buffer: 0x%lx  Count: %u  MyFlags: %d",
 
50
                   (long) stream, (long) Buffer, (uint) Count, MyFlags));
 
51
 
 
52
  if ((readbytes= fread(Buffer, sizeof(char), Count, stream)) != Count)
 
53
  {
 
54
    DBUG_PRINT("error",("Read only %d bytes", (int) readbytes));
 
55
    if (MyFlags & (MY_WME | MY_FAE | MY_FNABP))
 
56
    {
 
57
      if (ferror(stream))
 
58
        my_error(EE_READ, MYF(ME_BELL+ME_WAITTANG),
 
59
                 my_filename(fileno(stream)),errno);
 
60
      else
 
61
      if (MyFlags & (MY_NABP | MY_FNABP))
 
62
        my_error(EE_EOFERR, MYF(ME_BELL+ME_WAITTANG),
 
63
                 my_filename(fileno(stream)),errno);
 
64
    }
 
65
    my_errno=errno ? errno : -1;
 
66
    if (ferror(stream) || MyFlags & (MY_NABP | MY_FNABP))
 
67
      DBUG_RETURN((size_t) -1);                 /* Return with error */
 
68
  }
 
69
  if (MyFlags & (MY_NABP | MY_FNABP))
 
70
    DBUG_RETURN(0);                             /* Read ok */
 
71
  DBUG_RETURN(readbytes);
 
72
} /* my_fread */
 
73
 
30
74
 
31
75
/*
32
76
  Write a chunk of bytes to a stream
42
86
    #           Number of bytes written
43
87
*/
44
88
 
45
 
size_t my_fwrite(FILE *stream, const unsigned char *Buffer, size_t Count, myf MyFlags)
 
89
size_t my_fwrite(FILE *stream, const uchar *Buffer, size_t Count, myf MyFlags)
46
90
{
47
91
  size_t writtenbytes =0;
48
92
  my_off_t seekptr;
49
93
#if !defined(NO_BACKGROUND) && defined(USE_MY_STREAM)
50
 
  uint32_t errors;
 
94
  uint errors;
51
95
#endif
 
96
  DBUG_ENTER("my_fwrite");
 
97
  DBUG_PRINT("my",("stream: 0x%lx  Buffer: 0x%lx  Count: %u  MyFlags: %d",
 
98
                   (long) stream, (long) Buffer, (uint) Count, MyFlags));
52
99
 
53
100
#if !defined(NO_BACKGROUND) && defined(USE_MY_STREAM)
54
101
  errors=0;
60
107
    if ((written = (size_t) fwrite((char*) Buffer,sizeof(char),
61
108
                                   Count, stream)) != Count)
62
109
    {
 
110
      DBUG_PRINT("error",("Write only %d bytes", (int) writtenbytes));
63
111
      my_errno=errno;
64
112
      if (written != (size_t) -1)
65
113
      {
71
119
#ifdef EINTR
72
120
      if (errno == EINTR)
73
121
      {
74
 
        my_fseek(stream,seekptr,MY_SEEK_SET,MYF(0));
 
122
        VOID(my_fseek(stream,seekptr,MY_SEEK_SET,MYF(0)));
75
123
        continue;
76
124
      }
77
125
#endif
84
132
        if (!(errors++ % MY_WAIT_GIVE_USER_A_MESSAGE))
85
133
          my_error(EE_DISK_FULL,MYF(ME_BELL | ME_NOREFRESH),
86
134
                   "[stream]",my_errno,MY_WAIT_FOR_USER_TO_FIX_PANIC);
87
 
        sleep(MY_WAIT_FOR_USER_TO_FIX_PANIC);
88
 
        my_fseek(stream,seekptr,MY_SEEK_SET,MYF(0));
 
135
        VOID(sleep(MY_WAIT_FOR_USER_TO_FIX_PANIC));
 
136
        VOID(my_fseek(stream,seekptr,MY_SEEK_SET,MYF(0)));
89
137
        continue;
90
138
      }
91
139
#endif
106
154
      writtenbytes+= written;
107
155
    break;
108
156
  }
109
 
  return(writtenbytes);
 
157
  DBUG_RETURN(writtenbytes);
110
158
} /* my_fwrite */
111
159
 
112
160
 
115
163
my_off_t my_fseek(FILE *stream, my_off_t pos, int whence,
116
164
                  myf MyFlags __attribute__((unused)))
117
165
{
118
 
  return(fseek(stream, (off_t) pos, whence) ?
 
166
  DBUG_ENTER("my_fseek");
 
167
  DBUG_PRINT("my",("stream: 0x%lx  pos: %lu  whence: %d  MyFlags: %d",
 
168
                   (long) stream, (long) pos, whence, MyFlags));
 
169
  DBUG_RETURN(fseek(stream, (off_t) pos, whence) ?
119
170
              MY_FILEPOS_ERROR : (my_off_t) ftell(stream));
120
171
} /* my_seek */
 
172
 
 
173
 
 
174
/* Tell current position of file */
 
175
 
 
176
my_off_t my_ftell(FILE *stream, myf MyFlags __attribute__((unused)))
 
177
{
 
178
  off_t pos;
 
179
  DBUG_ENTER("my_ftell");
 
180
  DBUG_PRINT("my",("stream: 0x%lx  MyFlags: %d", (long) stream, MyFlags));
 
181
  pos=ftell(stream);
 
182
  DBUG_PRINT("exit",("ftell: %lu",(ulong) pos));
 
183
  DBUG_RETURN((my_off_t) pos);
 
184
} /* my_ftell */