1
/* Copyright (C) 2000 MySQL AB
3
This program is free software; you can redistribute it and/or modify
4
it under the terms of the GNU General Public License as published by
5
the Free Software Foundation; version 2 of the License.
7
This program is distributed in the hope that it will be useful,
8
but WITHOUT ANY WARRANTY; without even the implied warranty of
9
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
GNU General Public License for more details.
12
You should have received a copy of the GNU General Public License
13
along with this program; if not, write to the Free Software
14
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
16
#include "mysys_priv.h"
17
#include "my_static.h"
19
#include "mysys_err.h"
21
static void make_ftype(char * to,int flag);
28
FileName Path-name of file
29
Flags Read | write | append | trunc (like for open())
30
MyFlags Flags for handling errors
37
FILE *my_fopen(const char *filename, int flags, myf MyFlags)
41
DBUG_ENTER("my_fopen");
42
DBUG_PRINT("my",("Name: '%s' flags: %d MyFlags: %d",
43
filename, flags, MyFlags));
45
if we are not creating, then we need to use my_access to make sure
46
the file exists since Windows doesn't handle files like "com1.sym"
50
make_ftype(type,flags);
51
fd = fopen(filename, type);
57
The test works if MY_NFILE < 128. The problem is that fileno() is char
58
on some OS (SUNOS). Actually the filename save isn't that important
59
so we can ignore if this doesn't work.
61
if ((uint) fileno(fd) >= my_file_limit)
63
thread_safe_increment(my_stream_opened,&THR_LOCK_open);
64
DBUG_RETURN(fd); /* safeguard */
66
pthread_mutex_lock(&THR_LOCK_open);
67
if ((my_file_info[fileno(fd)].name = (char*)
68
my_strdup(filename,MyFlags)))
71
my_file_total_opened++;
72
my_file_info[fileno(fd)].type = STREAM_BY_FOPEN;
73
pthread_mutex_unlock(&THR_LOCK_open);
74
DBUG_PRINT("exit",("stream: 0x%lx", (long) fd));
77
pthread_mutex_unlock(&THR_LOCK_open);
78
(void) my_fclose(fd,MyFlags);
83
DBUG_PRINT("error",("Got error %d on open",my_errno));
84
if (MyFlags & (MY_FFNF | MY_FAE | MY_WME))
85
my_error((flags & O_RDONLY) || (flags == O_RDONLY ) ? EE_FILENOTFOUND :
87
MYF(ME_BELL+ME_WAITTANG), filename, my_errno);
88
DBUG_RETURN((FILE*) 0);
94
int my_fclose(FILE *fd, myf MyFlags)
97
DBUG_ENTER("my_fclose");
98
DBUG_PRINT("my",("stream: 0x%lx MyFlags: %d", (long) fd, MyFlags));
100
pthread_mutex_lock(&THR_LOCK_open);
102
if ((err = fclose(fd)) < 0)
105
if (MyFlags & (MY_FAE | MY_WME))
106
my_error(EE_BADCLOSE, MYF(ME_BELL+ME_WAITTANG),
107
my_filename(file),errno);
111
if ((uint) file < my_file_limit && my_file_info[file].type != UNOPEN)
113
my_file_info[file].type = UNOPEN;
114
my_free(my_file_info[file].name, MYF(MY_ALLOW_ZERO_PTR));
116
pthread_mutex_unlock(&THR_LOCK_open);
121
/* Make a stream out of a file handle */
124
FILE *my_fdopen(File Filedes, const char *name, int Flags, myf MyFlags)
128
DBUG_ENTER("my_fdopen");
129
DBUG_PRINT("my",("Fd: %d Flags: %d MyFlags: %d",
130
Filedes, Flags, MyFlags));
132
make_ftype(type,Flags);
133
if ((fd = fdopen(Filedes, type)) == 0)
136
if (MyFlags & (MY_FAE | MY_WME))
137
my_error(EE_CANT_OPEN_STREAM, MYF(ME_BELL+ME_WAITTANG),errno);
141
pthread_mutex_lock(&THR_LOCK_open);
143
if ((uint) Filedes < (uint) my_file_limit)
145
if (my_file_info[Filedes].type != UNOPEN)
147
my_file_opened--; /* File is opened with my_open ! */
151
my_file_info[Filedes].name= my_strdup(name,MyFlags);
153
my_file_info[Filedes].type = STREAM_BY_FDOPEN;
155
pthread_mutex_unlock(&THR_LOCK_open);
158
DBUG_PRINT("exit",("stream: 0x%lx", (long) fd));
164
Make a fopen() typestring from a open() type bitmap
168
to String for fopen() is stored here
169
flag Flag used by open()
172
This routine attempts to find the best possible match
173
between a numeric option and a string option that could be
174
fed to fopen. There is not a 1 to 1 mapping between the two.
177
On Unix, O_RDONLY is usually 0
181
w == O_WRONLY|O_TRUNC|O_CREAT
182
a == O_WRONLY|O_APPEND|O_CREAT
184
w+ == O_RDWR|O_TRUNC|O_CREAT
185
a+ == O_RDWR|O_APPEND|O_CREAT
188
static void make_ftype(register char * to, register int flag)
190
/* check some possible invalid combinations */
191
DBUG_ASSERT((flag & (O_TRUNC | O_APPEND)) != (O_TRUNC | O_APPEND));
192
DBUG_ASSERT((flag & (O_WRONLY | O_RDWR)) != (O_WRONLY | O_RDWR));
194
if ((flag & (O_RDONLY|O_WRONLY)) == O_WRONLY)
195
*to++= (flag & O_APPEND) ? 'a' : 'w';
196
else if (flag & O_RDWR)
198
/* Add '+' after theese */
199
if (flag & (O_TRUNC | O_CREAT))
201
else if (flag & O_APPEND)
210
#if FILE_BINARY /* If we have binary-files */
211
if (flag & FILE_BINARY)