]>
git.ipfire.org Git - thirdparty/pdns.git/blob - pdns/dynmessenger.cc
2 * This file is part of PowerDNS or dnsdist.
3 * Copyright -- PowerDNS.COM B.V. and its contributors
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * In addition, for the avoidance of any doubt, permission is granted to
10 * link this program with OpenSSL and to (re)distribute the binaries
11 * produced as the result of such linking.
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.
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
25 #include "dynmessenger.hh"
31 #include <sys/types.h>
34 DynMessenger::DynMessenger(const string
&fname
,
38 d_s
=socket(AF_UNIX
,SOCK_STREAM
,0);
42 throw PDNSException(string("socket")+stringerror());
46 if(makeUNsockaddr(fname
, &d_remote
))
47 throw PDNSException("Unable to connect to remote '"+fname
+"': Path is not a valid UNIX socket path.");
49 struct timeval timeout
;
50 timeout
.tv_sec
= timeout_sec
;
51 timeout
.tv_usec
= timeout_usec
;
53 if (setsockopt (d_s
, SOL_SOCKET
, SO_RCVTIMEO
, (char *)&timeout
, sizeof(timeout
)) < 0)
54 throw PDNSException("Unable to set SO_RCVTIMEO option on socket: " + stringerror());
56 if (setsockopt (d_s
, SOL_SOCKET
, SO_SNDTIMEO
, (char *)&timeout
, sizeof(timeout
)) < 0)
57 throw PDNSException("Unable to set SO_SNDTIMEO option on socket: " + stringerror());
59 int ret
= Utility::timed_connect(d_s
,(sockaddr
*)&d_remote
,sizeof(d_remote
), timeout_sec
, timeout_usec
);
62 throw TimeoutException("Unable to connect to remote '"+fname
+"': "+stringerror());
64 throw PDNSException("Unable to connect to remote '"+fname
+"': "+stringerror());
73 DynMessenger::DynMessenger(const ComboAddress
& remote
,
78 d_s
=socket(AF_INET
, SOCK_STREAM
,0);
82 throw PDNSException(string("socket")+stringerror());
86 struct timeval timeout
;
87 timeout
.tv_sec
= timeout_sec
;
88 timeout
.tv_usec
= timeout_usec
;
90 if (setsockopt (d_s
, SOL_SOCKET
, SO_RCVTIMEO
, (char *)&timeout
, sizeof(timeout
)) < 0)
91 throw PDNSException("Unable to set SO_RCVTIMEO option on socket: " + stringerror());
93 if (setsockopt (d_s
, SOL_SOCKET
, SO_SNDTIMEO
, (char *)&timeout
, sizeof(timeout
)) < 0)
94 throw PDNSException("Unable to set SO_SNDTIMEO option on socket: " + stringerror());
96 int ret
= Utility::timed_connect(d_s
, (sockaddr
*)&remote
, remote
.getSocklen(), timeout_sec
, timeout_usec
);
99 throw TimeoutException("Unable to connect to remote '"+remote
.toStringWithPort()+"': "+stringerror());
101 throw PDNSException("Unable to connect to remote '"+remote
.toStringWithPort()+"': "+stringerror());
103 string login
=secret
+"\n";
112 DynMessenger::~DynMessenger()
118 int DynMessenger::send(const string
&msg
) const
121 writen2(d_s
, msg
+"\n");
123 } catch(std::runtime_error
& e
) {
125 throw TimeoutException("Error from remote in send(): " + string(e
.what()));
127 throw PDNSException("Error from remote in send(): " + string(e
.what()));
131 string
DynMessenger::receive() const
138 retlen
=recv(d_s
,buffer
,sizeof(buffer
),0);
141 throw TimeoutException("Error from remote in receive(): " + stringerror());
143 throw PDNSException("Error from remote in receive(): " + stringerror());
146 answer
.append(buffer
,retlen
);