~ubuntu-branches/ubuntu/quantal/aria2/quantal

« back to all changes in this revision

Viewing changes to src/SocketCore.cc

  • Committer: Bazaar Package Importer
  • Author(s): Kartik Mistry
  • Date: 2010-11-24 12:26:31 UTC
  • mfrom: (1.6.1 upstream) (2.3.8 experimental)
  • Revision ID: james.westby@ubuntu.com-20101124122631-upujekj1ek94h3x2
Tags: 1.10.6-1
* New upstream release:
  + Fixed FTBFS on alpha arch (Closes: #590257)
  + Added IPv6 support (Closes: #448390)
* debian/patches/ftbfs_kfreebsd.diff:
  + Dropped, merged upstream

Show diffs side-by-side

added added

removed removed

Lines of Context:
54
54
#include "TimeA2.h"
55
55
#include "a2functional.h"
56
56
#include "LogFactory.h"
 
57
#include "A2STR.h"
57
58
#ifdef ENABLE_SSL
58
59
# include "TLSContext.h"
59
60
#endif // ENABLE_SSL
167
168
#endif // HAVE_LIBGNUTLS
168
169
}
169
170
 
170
 
template<typename T>
171
 
std::string uitos(T value)
172
 
{
173
 
  std::string str;
174
 
  if(value == 0) {
175
 
    str = "0";
176
 
    return str;
177
 
  }
178
 
  while(value) {
179
 
    char digit = value%10+'0';
180
 
    str.insert(str.begin(), digit);
181
 
    value /= 10;
182
 
  }
183
 
  return str;
184
 
}
185
 
 
186
171
void SocketCore::create(int family, int protocol)
187
172
{
188
173
  closeConnection();
215
200
    CLOSE(fd);
216
201
    return -1;
217
202
  }
 
203
#ifdef IPV6_V6ONLY
 
204
  if(family == AF_INET6) {
 
205
    int sockopt = 1;
 
206
    if(setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (a2_sockopt_t) &sockopt,
 
207
                  sizeof(sockopt)) < 0) {
 
208
      CLOSE(fd);
 
209
      return -1;
 
210
    }
 
211
  }
 
212
#endif // IPV6_V6ONLY
218
213
  if(::bind(fd, addr, addrlen) == -1) {
219
214
    error = errorMsg();
220
215
    CLOSE(fd);
228
223
 int getaddrinfoFlags, std::string& error)
229
224
{
230
225
  struct addrinfo* res;
231
 
  int s = callGetaddrinfo(&res, host, uitos(port).c_str(), family, sockType,
232
 
                          getaddrinfoFlags, 0);  
 
226
  int s = callGetaddrinfo(&res, host, util::uitos(port).c_str(),
 
227
                          family, sockType, getaddrinfoFlags, 0);  
233
228
  if(s) {
234
229
    error = gai_strerror(s);
235
230
    return -1;
258
253
  }
259
254
}
260
255
 
261
 
void SocketCore::bind(const std::string& addr, uint16_t port, int flags)
 
256
void SocketCore::bind
 
257
(const std::string& addr, uint16_t port, int family, int flags)
262
258
{
263
259
  closeConnection();
264
260
  std::string error;
265
 
  sock_t fd =
266
 
    bindTo(addr.c_str(), port, protocolFamily_, sockType_, flags, error);
267
 
  if(fd == (sock_t)-1) {
268
 
    throw DL_ABORT_EX(StringFormat(EX_SOCKET_BIND, error.c_str()).str());
 
261
  const char* addrp;
 
262
  if(addr.empty()) {
 
263
    addrp = 0;
269
264
  } else {
270
 
    sockfd_ = fd;
 
265
    addrp = addr.c_str();
271
266
  }
272
 
}
273
 
 
274
 
void SocketCore::bind(uint16_t port, int flags)
275
 
{
276
 
  closeConnection();
277
 
  std::string error;
278
267
  if(!(flags&AI_PASSIVE) || bindAddrs_.empty()) {
279
 
    sock_t fd = bindTo(0, port, protocolFamily_, sockType_, flags, error);
 
268
    sock_t fd = bindTo(addrp, port, family, sockType_, flags, error);
280
269
    if(fd != (sock_t) -1) {
281
270
      sockfd_ = fd;
282
271
    }
294
283
        error = gai_strerror(s);
295
284
        continue;
296
285
      }
297
 
      sock_t fd = bindTo(host, port, protocolFamily_, sockType_, flags, error);
 
286
      if(addrp && strcmp(host, addrp) != 0) {
 
287
        error = "Given address and resolved address do not match.";
 
288
        continue;
 
289
      }
 
290
      sock_t fd = bindTo(addrp, port, family, sockType_, flags, error);
298
291
      if(fd != (sock_t)-1) {
299
292
        sockfd_ = fd;
300
293
        break;
306
299
  }
307
300
}
308
301
 
 
302
void SocketCore::bind(uint16_t port, int flags)
 
303
{
 
304
  bind(A2STR::NIL, port, protocolFamily_, flags);
 
305
}
 
306
 
309
307
void SocketCore::bind(const struct sockaddr* addr, socklen_t addrlen)
310
308
{
311
309
  closeConnection();
341
339
{
342
340
  struct sockaddr_storage sockaddr;
343
341
  socklen_t len = sizeof(sockaddr);
 
342
  getAddrInfo(sockaddr, len);
 
343
  addrinfo = util::getNumericNameInfo
 
344
    (reinterpret_cast<const struct sockaddr*>(&sockaddr), len);
 
345
}
 
346
 
 
347
void SocketCore::getAddrInfo
 
348
(struct sockaddr_storage& sockaddr, socklen_t& len) const
 
349
{
344
350
  struct sockaddr* addrp = reinterpret_cast<struct sockaddr*>(&sockaddr);
345
351
  if(getsockname(sockfd_, addrp, &len) == -1) {
346
352
    throw DL_ABORT_EX(StringFormat(EX_SOCKET_GET_NAME, errorMsg()).str());
347
353
  }
348
 
  addrinfo = util::getNumericNameInfo(addrp, len);
 
354
}
 
355
 
 
356
int SocketCore::getAddressFamily() const
 
357
{
 
358
  struct sockaddr_storage sockaddr;
 
359
  socklen_t len = sizeof(sockaddr);
 
360
  getAddrInfo(sockaddr, len);
 
361
  return sockaddr.ss_family;
349
362
}
350
363
 
351
364
void SocketCore::getPeerInfo(std::pair<std::string, uint16_t>& peerinfo) const
365
378
  std::string error;
366
379
  struct addrinfo* res;
367
380
  int s;
368
 
  s = callGetaddrinfo(&res, host.c_str(), uitos(port).c_str(), protocolFamily_,
369
 
                      sockType_, 0, 0);
 
381
  s = callGetaddrinfo(&res, host.c_str(), util::uitos(port).c_str(),
 
382
                      protocolFamily_, sockType_, 0, 0);
370
383
  if(s) {
371
384
    throw DL_ABORT_EX(StringFormat(EX_RESOLVE_HOSTNAME,
372
385
                                   host.c_str(), gai_strerror(s)).str());
1112
1125
 
1113
1126
  struct addrinfo* res;
1114
1127
  int s;
1115
 
  s = callGetaddrinfo(&res, host.c_str(), uitos(port).c_str(), protocolFamily_,
1116
 
                      sockType_, 0, 0);
 
1128
  s = callGetaddrinfo(&res, host.c_str(), util::uitos(port).c_str(),
 
1129
                      protocolFamily_, sockType_, 0, 0);
1117
1130
  if(s) {
1118
1131
    throw DL_ABORT_EX(StringFormat(EX_SOCKET_SEND, gai_strerror(s)).str());
1119
1132
  }
1302
1315
  return defaultAIFlags;
1303
1316
}
1304
1317
 
1305
 
}
 
1318
} // namespace
1306
1319
 
1307
1320
void setDefaultAIFlags(int flags)
1308
1321
{