/* Web Polygraph http://www.web-polygraph.org/
* (C) 2003-2006 The Measurement Factory
* Licensed under the Apache License, Version 2.0 */
#include "xstd/xstd.h"
#include "xstd/Assert.h"
#include "xstd/String.h"
#include "xstd/Socket.h"
#include "xstd/h/sys/ioctl.h"
#include "xstd/InetIfReq.h"
Inet6IfAliasReq::Inet6IfAliasReq(const String &name, const InAddress &addr, const InAddress &mask) {
memset(this, 0, sizeof(*this));
#if HAVE_TYPE_IN6_ALIASREQ
strncpy(ifra_name, name.cstr(), IFNAMSIZ);
sockaddr_storage ss = addr.sockAddr(-1);
memcpy(&ifra_addr, &ss, ss.ss_len);
ss = mask.sockAddr(-1);
memcpy(&ifra_prefixmask, &ss, ss.ss_len);
ifra_lifetime.ia6t_expire = 0xffffffff;
ifra_lifetime.ia6t_preferred = 0xffffffff;
ifra_lifetime.ia6t_vltime = 0xffffffff;
ifra_lifetime.ia6t_pltime = 0xffffffff;
#elif HAVE_TYPE_IN6_IFREQ
#elif HAVE_TYPE_LINUX_IN6_IFREQ
ifreq ifr;
memset(&ifr, 0, sizeof(ifr));
//
// this could be done by the parent, which has
// its own FD open anyway?
//
Socket s;
Assert(s.create(PF_INET6, SOCK_DGRAM, 0));
strncpy(ifr.ifr_name, name.cstr(), IFNAMSIZ);
Must (ioctl(s.fd(), SIOCGIFINDEX, &ifr) < 0);
s.close();
ifr6_ifindex = ifr.ifr_ifindex;
sockaddr_storage ss = addr.sockAddr(-1);
memcpy(&ifr6_addr, &ss, sizeof(ifr6_addr));
ifr6_prefixlen = mask.prefixlen();
#endif
};
syntax highlighted by Code2HTML, v. 0.9.1