Renamed namespaces satcom::lib and satcom::pkf to senf
[senf.git] / Socket / FileHandle.cc
1 // $Id$
2 //
3 // Copyright (C) 2006 
4 // Fraunhofer Institut fuer offene Kommunikationssysteme (FOKUS)
5 // Kompetenzzentrum fuer Satelitenkommunikation (SatCom)
6 //     Stefan Bund <stefan.bund@fokus.fraunhofer.de>
7 //
8 // This program is free software; you can redistribute it and/or modify
9 // it under the terms of the GNU General Public License as published by
10 // the Free Software Foundation; either version 2 of the License, or
11 // (at your option) any later version.
12 //
13 // This program is distributed in the hope that it will be useful,
14 // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 // GNU General Public License for more details.
17 //
18 // You should have received a copy of the GNU General Public License
19 // along with this program; if not, write to the
20 // Free Software Foundation, Inc.,
21 // 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22
23 // Definition of non-inline non-template functions
24
25 #include "FileHandle.hh"
26 //#include "FileHandle.ih"
27
28 // Custom includes
29 #include <unistd.h>
30 #include <sys/poll.h>
31 #include <string.h>
32 #include <errno.h>
33 #include <fcntl.h>
34 #include "Utils/Exception.hh"
35
36 #define prefix_
37 ///////////////////////////////cc.p////////////////////////////////////////
38
39 prefix_ void senf::FileBody::v_close()
40 {
41     if (::close(fd_) != 0)
42         throw SystemException(errno);
43 }
44
45 prefix_ void senf::FileBody::v_terminate()
46 {
47     ::close(fd_);
48 }
49
50 prefix_ bool senf::FileBody::v_eof()
51     const
52 {
53     return false;
54 }
55
56 prefix_ bool senf::FileBody::v_valid()
57     const
58 {
59     return true;
60 }
61
62 prefix_ bool senf::FileBody::blocking()
63     const
64 {
65     int flags = ::fcntl(fd(),F_GETFL);
66     if (flags < 0) throw SystemException(errno);
67     return ! (flags & O_NONBLOCK);
68 }
69
70 prefix_ void senf::FileBody::blocking(bool status)
71 {
72     int flags = ::fcntl(fd(),F_GETFL);
73     if (flags < 0) throw SystemException(errno);
74     if (status) flags &= ~O_NONBLOCK;
75     else        flags |= O_NONBLOCK;
76     if (::fcntl(fd(), F_SETFL, flags) < 0) throw SystemException(errno);
77 }
78
79 prefix_ bool senf::FileBody::pollCheck(int fd, bool incoming, bool block)
80     const
81 {
82     struct ::pollfd pfd;
83     ::memset(&pfd,0,sizeof(pfd));
84     pfd.fd = fd;
85     pfd.events = incoming?POLLIN:POLLOUT;
86     int rv = -1;
87     do {
88         rv = ::poll(&pfd,1,block?-1:0);
89         if (rv<0)
90             switch (errno) {
91             case EINTR:
92                 break;
93             default:
94                 throw SystemException(errno);
95             }
96     } while (rv<0);
97     return rv>0;
98 }
99
100 ///////////////////////////////cc.e////////////////////////////////////////
101 #undef prefix_
102
103 \f
104 // Local Variables:
105 // mode: c++
106 // c-file-style: "senf"
107 // End: