00001
00002
00003
00004
00005
00006
00007
#include "wvfile.h"
00008
00009
#ifdef _WIN32
00010
#include <io.h>
00011
#define O_NONBLOCK 0
00012
#define O_LARGEFILE 0
00013
#define fcntl(a,b,c)
00014
#endif
00015
00016
#ifndef _WIN32 // meaningless to do this on win32
00017
00018
00019
00020
00021 WvFile::WvFile(
int rwfd) :
WvFDStream(rwfd)
00022 {
00023
if (rwfd > -1)
00024 {
00025
00026
00027 mode_t xmode = fcntl(rwfd, F_GETFL);
00028 xmode = xmode & (O_RDONLY | O_WRONLY | O_RDWR);
00029
readable = (xmode == O_RDONLY) || (xmode == O_RDWR);
00030
writable = (xmode == O_WRONLY) || (xmode == O_RDWR);
00031 }
00032
else
00033 {
00034
readable =
writable =
false;
00035 }
00036 }
00037
#endif
00038
00039 bool WvFile::open(
WvStringParm filename,
int mode,
int create_mode)
00040 {
00041 errnum = 0;
00042
00043
00044
00045
int xmode = (mode & (O_RDONLY | O_WRONLY | O_RDWR));
00046
readable = (xmode == O_RDONLY) || (xmode == O_RDWR);
00047
writable = (xmode == O_WRONLY) || (xmode == O_RDWR);
00048
00049
skip_select =
false;
00050
00051
00052
if (!
readable)
00053 undo_force_select(
true,
false,
false);
00054
00055
close();
00056
#ifndef _WIN32
00057
int rwfd = ::open(filename, mode | O_NONBLOCK, create_mode);
00058
#else
00059
int rwfd = ::_open(filename, mode | O_NONBLOCK, create_mode);
00060
#endif
00061
if (rwfd < 0)
00062 {
00063 seterr(errno);
00064
return false;
00065 }
00066 setfd(rwfd);
00067 fcntl(rwfd, F_SETFD, 1);
00068
return true;
00069 }
00070
00071
00072
00073
00074 bool WvFile::pre_select(SelectInfo &si)
00075 {
00076
bool ret;
00077
00078 SelectRequest oldwant = si.wants;
00079
00080
if (!
readable) si.wants.readable =
false;
00081
if (!
writable) si.wants.writable =
false;
00082 ret = WvFDStream::pre_select(si);
00083
00084 si.wants = oldwant;
00085
00086
00087
00088
if (
skip_select)
00089 {
00090 si.msec_timeout = 0;
00091 ret =
true;
00092 }
00093
return ret;
00094 }