4f772e454237004cb21fdf0e0cb115f7023968fb
[senf.git] / Socket / ReadWritePolicy.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 "ReadWritePolicy.hh"
26 //#include "ReadWritePolicy.ih"
27
28 // Custom includes
29 #include <sys/types.h>
30 #include <sys/socket.h>
31 #include <unistd.h>
32 #include <errno.h>
33
34
35 //#include "ReadWritePolicy.mpp"
36 #define prefix_
37 ///////////////////////////////cc.p////////////////////////////////////////
38
39 prefix_ unsigned satcom::lib::ReadablePolicy::read(FileHandle handle, char * buffer,
40                                                    unsigned size)
41 {
42     int rv = -1;
43     do {
44         rv = ::read(handle.fd(), buffer, size);
45         if (rv < 0)
46             switch(errno) {
47             case EINTR:
48                 break;
49             case EAGAIN:
50                 // This means, the socket is non-blocking an no data was available
51                 rv = 0;
52                 break;
53             default:
54                 throw SystemException(errno);
55             }
56     } while (rv<0);
57     return rv;
58 }
59
60 prefix_ unsigned satcom::lib::ReadablePolicy::do_readfrom(FileHandle handle, char * buffer,
61                                                           unsigned size,
62                                                           struct ::sockaddr * addr, socklen_t len)
63 {
64     int rv = -1;
65     do {
66         rv = ::recvfrom(handle.fd(),buffer, size, 0, addr, &len);
67         if (rv < 0)
68             switch (errno) {
69             case EINTR:
70                 break;
71             case EAGAIN:
72                 rv = 0;
73                 break;
74             default:
75                 throw SystemException(errno);
76             }
77     } while (rv<0);
78     return rv;
79 }
80
81 prefix_ unsigned satcom::lib::WriteablePolicy::do_write(FileHandle handle, char const * buffer,
82                                                         unsigned size)
83 {
84     int rv = -1;
85     do {
86         rv = ::write(handle.fd(), buffer, size);
87         if (rv < 0)
88             switch (errno) {
89             case EINTR:
90                 break;
91             case EAGAIN:
92                 rv = 0;
93                 break;
94             default:
95                 throw SystemException(errno);
96             }
97     } while (rv<0);
98     return rv;
99 }
100
101 prefix_ unsigned satcom::lib::WriteablePolicy::do_writeto(FileHandle handle,
102                                                           char const * buffer, unsigned size,
103                                                           struct sockaddr * addr, socklen_t len)
104 {
105     int rv = -1;
106     do {
107         rv = ::sendto(handle.fd(), buffer, size, 0, addr, len);
108         if (rv < 0)
109             switch (errno) {
110             case EINTR:
111                 break;
112             case EAGAIN:
113                 rv = 0;
114                 break;
115             default:
116                 throw SystemException(errno);
117             }
118     } while (rv<0);
119     return rv;
120 }
121     
122 ///////////////////////////////cc.e////////////////////////////////////////
123 #undef prefix_
124 //#include "ReadWritePolicy.mpp"
125
126 \f
127 // Local Variables:
128 // mode: c++
129 // c-file-style: "satcom"
130 // End: