win32/fdimpl.cpp

Go to the documentation of this file.
00001 /*
00002  * Copyright (C) Sergey P. Derevyago, 2008-2009.
00003  *
00004  * Permission to copy, use, modify, sell and distribute this software is granted
00005  * provided this copyright notice appears in all copies.
00006  * This software is provided "as is" without express or implied warranty, and
00007  * with no claim as to its suitability for any purpose.
00008  *
00009  */
00010 
00015 #include <ders/file.hpp>
00016 #include <errno.h>
00017 #include <fcntl.h>
00018 #include <io.h>
00019 #include <stdio.h>
00020 #include <sys/stat.h>
00021 
00022 namespace {
00023 
00024 using namespace ders;
00025 
00026 inline int setErr(int rc, error& err)
00027 {
00028  err=(rc==-1) ? convert_errno(errno) : ezero;
00029  return rc;
00030 }
00031 
00032 }  // unnamed
00033 
00034 namespace ders {  // ::ders
00035 
00036 int fd::open(const char* path, file::mode md, int fls, error& err)
00037 {
00038  int m=0;
00039  switch (md) {
00040         case file::rdo:  m=O_RDONLY; break;
00041         case file::wro:  m=O_WRONLY; break;
00042         case file::rdwr: m=O_RDWR;   break;
00043         default:         assert(false);
00044  }
00045 
00046  if (fls&file::app)  m|=O_APPEND;
00047  if (fls&file::crt)  m|=O_CREAT;
00048  if (fls&file::excl) m|=O_EXCL;
00049  if (fls&file::trnc) m|=O_TRUNC;
00050 
00051  return setErr(::open(path, m|O_BINARY, S_IREAD|S_IWRITE), err);
00052 }
00053 
00054 bool fd::close(int fd, error& err)
00055 {
00056  return setErr(::close(fd), err)==0;
00057 }
00058 
00059 int fd::read(int fd, void* buf, int n, error& err)
00060 {
00061  assert(n>0);
00062  int rc=::read(fd, buf, n);
00063  assert(rc<=n);
00064 
00065  return setErr(rc, err);
00066 }
00067 
00068 int fd::write(int fd, const void* buf, int n, error& err)
00069 {
00070  assert(n>0);
00071  int rc=::write(fd, buf, n);
00072  assert(rc<=n);
00073 
00074  return setErr(rc, err);
00075 }
00076 
00077 int fd::seek(int fd, int off, file::whence wh, error& err)
00078 {
00079  int w=0;
00080  switch (wh) {
00081         case file::set: w=SEEK_SET; break;
00082         case file::cur: w=SEEK_CUR; break;
00083         case file::end: w=SEEK_END; break;
00084         default:        assert(false);
00085  }
00086 
00087  return setErr(::lseek(fd, off, w), err);
00088 }
00089 
00090 }  // namespace ::ders
00091 

Generated on Tue Dec 8 11:35:32 2009 for derslib by  doxygen 1.5.5