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 }