4 // Fraunhofer Institute for Open Communication Systems (FOKUS)
6 // The contents of this file are subject to the Fraunhofer FOKUS Public License
7 // Version 1.0 (the "License"); you may not use this file except in compliance
8 // with the License. You may obtain a copy of the License at
9 // http://senf.berlios.de/license.html
11 // The Fraunhofer FOKUS Public License Version 1.0 is based on,
12 // but modifies the Mozilla Public License Version 1.1.
13 // See the full license text for the amendments.
15 // Software distributed under the License is distributed on an "AS IS" basis,
16 // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
17 // for the specific language governing rights and limitations under the License.
19 // The Original Code is Fraunhofer FOKUS code.
21 // The Initial Developer of the Original Code is Fraunhofer-Gesellschaft e.V.
22 // (registered association), Hansastraße 27 c, 80686 Munich, Germany.
23 // All Rights Reserved.
26 // Stefan Bund <g0dil@berlios.de>
29 \brief FileHandle non-inline non-template implementation
32 #include "FileHandle.hh"
33 //#include "FileHandle.ih"
41 #include <senf/Utils/Exception.hh>
44 //-/////////////////////////////////////////////////////////////////////////////////////////////////
46 //-/////////////////////////////////////////////////////////////////////////////////////////////////
49 prefix_ void senf::FileBody::close()
52 throw SystemException(EBADF SENF_EXC_DEBUGINFO);
57 prefix_ void senf::FileBody::terminate()
65 prefix_ void senf::FileBody::destroyClose()
76 prefix_ void senf::FileBody::v_close()
78 if (::close(fd_) != 0)
79 SENF_THROW_SYSTEM_EXCEPTION("could not ::close FileBody fd");
82 prefix_ void senf::FileBody::v_terminate()
87 prefix_ bool senf::FileBody::v_eof()
93 prefix_ bool senf::FileBody::v_valid()
99 prefix_ bool senf::FileBody::blocking()
102 int flags = ::fcntl(fd(),F_GETFL);
103 if (flags < 0) SENF_THROW_SYSTEM_EXCEPTION("::fcntl(F_GETFL)");
104 return ! (flags & O_NONBLOCK);
107 prefix_ void senf::FileBody::blocking(bool status)
109 int flags = ::fcntl(fd(),F_GETFL);
110 if (flags < 0) SENF_THROW_SYSTEM_EXCEPTION("::fcntl(F_GETFL)");
111 if (status) flags &= ~O_NONBLOCK;
112 else flags |= O_NONBLOCK;
113 if (::fcntl(fd(), F_SETFL, flags) < 0) SENF_THROW_SYSTEM_EXCEPTION("::fcntl(F_SETFL)");
116 /* We don't take POLLIN/POLLOUT as argument to avoid having to include
117 sys/poll.h in the .cci file (and therefore indirectly into the .hh
118 and then every file which uses FileHandle) */
119 prefix_ bool senf::FileBody::pollCheck(int fd, bool incoming, int timeout, bool oob)
123 ::memset(&pfd,0,sizeof(pfd));
125 pfd.events = incoming?(oob?POLLPRI:POLLIN):POLLOUT;
128 rv = ::poll(&pfd,1,timeout);
134 SENF_THROW_SYSTEM_EXCEPTION("could not check ::poll");
140 prefix_ senf::FileBody::~FileBody()
143 //-/////////////////////////////////////////////////////////////////////////////////////////////////
150 // c-file-style: "senf"
151 // indent-tabs-mode: nil
152 // ispell-local-dictionary: "american"
153 // compile-command: "scons -u test"
154 // comment-column: 40