e1c31718310ee63260a1c9d94f44743538e54de9
[senf.git] / Socket / BufferingPolicy.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 "BufferingPolicy.hh"
26 //#include "BufferingPolicy.ih"
27
28 // Custom includes
29 #include <sys/types.h>
30 #include <sys/socket.h>
31 #include <errno.h>
32 #include "Utils/Exception.hh"
33
34 //#include "BufferingPolicy.mpp"
35 #define prefix_
36 ///////////////////////////////cc.p////////////////////////////////////////
37
38 prefix_ unsigned satcom::lib::SocketBufferingPolicy::rcvbuf(FileHandle handle)
39 {
40     unsigned size;
41     socklen_t len (sizeof(size));
42     if (::getsockopt(handle.fd(),SOL_SOCKET,SO_RCVBUF,&size,&len) < 0)
43         throw SystemException(errno);
44     // Linux doubles the bufer size on setting the RCVBUF to cater for internal
45     // headers. We fix this up here .. (see lkml FAQ)
46     return size/2;
47 }
48
49 prefix_ void satcom::lib::SocketBufferingPolicy::rcvbuf(FileHandle handle, unsigned size)
50 {
51     if (::setsockopt(handle.fd(),SOL_SOCKET,SO_RCVBUF,&size,sizeof(size)) < 0)
52         throw SystemException(errno);
53 }
54
55 prefix_ unsigned satcom::lib::SocketBufferingPolicy::sndbuf(FileHandle handle)
56 {
57     unsigned size;
58     socklen_t len (sizeof(size));
59     if (::getsockopt(handle.fd(),SOL_SOCKET,SO_SNDBUF,&size,&len) < 0)
60         throw SystemException(errno);
61     // Linux doubles the bufer size on setting the SNDBUF to cater for internal
62     // headers. We fix this up here .. (see lkml FAQ)
63     return size/2;
64     
65 }
66
67 prefix_ void satcom::lib::SocketBufferingPolicy::sndbuf(FileHandle handle, unsigned size)
68 {
69     if (::setsockopt(handle.fd(),SOL_SOCKET,SO_SNDBUF,&size,sizeof(size)) < 0)
70         throw SystemException(errno);
71 }
72
73 ///////////////////////////////cc.e////////////////////////////////////////
74 #undef prefix_
75 //#include "BufferingPolicy.mpp"
76
77 \f
78 // Local Variables:
79 // mode: c++
80 // c-file-style: "satcom"
81 // End: