netinterfaces.cpp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. #include "netinterfaces.h"
  2. #ifndef _countof
  3. #define _countof(a) (sizeof(a) / sizeof(*a))
  4. #endif // _countof
  5. #define _IS_VALID_BYTE_VALUE(b) (((b) >= 0) && ((b) <= 255))
  6. /////////////////////////////////////////////////////////////////////////////
  7. /////////////////////////////////////////////////////////////////////////////
  8. NetInterfaces::NetInterfaces(QObject *pParent) : QObject(pParent)
  9. {
  10. setObjectName("NetInterfaces");
  11. }
  12. NetInterfaces::~NetInterfaces(void)
  13. {
  14. reset();
  15. }
  16. void NetInterfaces::classBegin()
  17. {
  18. }
  19. void NetInterfaces::componentComplete()
  20. {
  21. }
  22. void NetInterfaces::reset(void)
  23. {
  24. for(auto it = m_itfList.begin(); it != m_itfList.end(); it++)
  25. {
  26. Interface *pi = *it;
  27. delete pi;
  28. }
  29. m_itfList.clear();
  30. m_eni._reset();
  31. }
  32. bool NetInterfaces::initialize(void)
  33. {
  34. bool bRet = false;
  35. reset();
  36. if((bRet = ::ParseEtcNetworkInterfaces(m_eni)))
  37. {
  38. for(auto it = m_eni.ibl.begin(); it != m_eni.ibl.end(); it++)
  39. {
  40. ITF_IFACE_BLOCK &ibl = *it;
  41. m_itfList.push_back(new Interface(ibl, static_cast<const Emitter&>(*this), this));
  42. }
  43. }
  44. return bRet;
  45. }
  46. bool NetInterfaces::save(void)
  47. {
  48. return ::WriteEtcNetworkInterfaces(m_eni, NULL);
  49. }
  50. bool NetInterfaces::save(QString path)
  51. {
  52. std::string p;
  53. const char *pszPath = NULL;
  54. if(path.length() > 0)
  55. {
  56. p = path.toStdString();
  57. pszPath = p.c_str();
  58. }
  59. return ::WriteEtcNetworkInterfaces(m_eni, pszPath);
  60. }
  61. void NetInterfaces::emitError(const char *pszFormatStr, ...) const
  62. {
  63. va_list args;
  64. va_start(args, pszFormatStr);
  65. QString qs = QString::vasprintf(pszFormatStr, args);
  66. va_end (args);
  67. emit sigError(qs);
  68. }
  69. QVariantList NetInterfaces::getInterface(const QString &itfName)
  70. {
  71. QVariantList list;
  72. list.clear();
  73. if(m_eni.ibl.size() > 0)
  74. {
  75. for(auto it = m_itfList.begin(); it != m_itfList.end(); it++)
  76. {
  77. Interface *pi = *it;
  78. const ITF_IFACE_BLOCK &ibl = pi->getIface();
  79. if( itfName == ibl.cfgName.c_str() &&
  80. ibl.proto == IFP_Inet &&
  81. (ibl.method == IFM_Static || ibl.method == IFM_Dhcp))
  82. {
  83. QVariant var = QVariant::fromValue(pi);
  84. list.append(var);
  85. }
  86. }
  87. }
  88. return list;
  89. }
  90. /////////////////////////////////////////////////////////////////////////////
  91. Interface::Interface(ITF_IFACE_BLOCK &ifb, const Emitter &errHandler, QObject *pParent) : QObject(pParent),
  92. m_ifb(ifb),
  93. m_ipAddr(ifb.inet4s.addr, errHandler, this),
  94. m_netmask(ifb.inet4s.netmask, errHandler, this),
  95. m_gateway(ifb.inet4s.gate, errHandler, this),
  96. m_bcastAddr(ifb.inet4s.bcast, errHandler, this),
  97. m_ptpAddr(ifb.inet4s.pointopoint, errHandler, this),
  98. m_errHandler(errHandler)
  99. /*, m_dnsSvr(ifb.inet4s.namesvr)*/
  100. {
  101. setObjectName("Interface");
  102. for(size_t i = 0; i < _countof(m_ifb.inet4s.namesvr); i++)
  103. {
  104. IPv4Address *addr = new IPv4Address(m_ifb.inet4s.namesvr[i], errHandler, this);
  105. m_dnsList.append(addr);
  106. }
  107. #if 0
  108. for(size_t i = 0; i < _countof(m_ifb.inet4s.namesvr); i++)
  109. {
  110. if(m_ifb.inet4s.namesvr[i].s_addr)
  111. {
  112. QString qs(inet_ntoa(m_ifb.inet4s.namesvr[i]));
  113. m_dnsList.append(qs);
  114. }
  115. else
  116. {
  117. QString qs("");
  118. m_dnsList.append(qs);
  119. }
  120. }
  121. #endif
  122. }
  123. Interface::~Interface(void)
  124. {
  125. IPv4Address *addr;
  126. for(int i = 0; i < m_dnsList.count(); i++)
  127. {
  128. if((addr = m_dnsList.at(i)))
  129. delete addr;
  130. }
  131. }
  132. QString Interface::name(void) const
  133. {
  134. return QString::fromStdString(m_ifb.cfgName);
  135. }
  136. QString Interface::family(void) const
  137. {
  138. return ::GetIfaceProtoStr(m_ifb.proto);
  139. }
  140. QString Interface::method(void) const
  141. {
  142. return ::GetIfaceMethodStr(m_ifb.method);
  143. }
  144. IPv4Address* Interface::ipAddress(void)
  145. {
  146. return &m_ipAddr;
  147. // if(m_ifb.proto == IFP_Inet && m_ifb.method == IFM_Static)
  148. // return inet_ntoa(m_ifb.inet4s.addr);
  149. // else
  150. // return "";
  151. }
  152. IPv4Address* Interface::netMask(void)
  153. {
  154. return &m_netmask;
  155. }
  156. IPv4Address* Interface::gateway(void)
  157. {
  158. return &m_gateway;
  159. }
  160. IPv4Address* Interface::bcastAddress(void)
  161. {
  162. return &m_bcastAddr;
  163. }
  164. IPv4Address* Interface::ptpAddress(void)
  165. {
  166. return &m_ptpAddr;
  167. }
  168. #if 0
  169. QStringList Interface::dnsServers(void) const
  170. {
  171. return m_dnsList;
  172. }
  173. #endif
  174. QQmlListProperty<IPv4Address> Interface::dnsServer(void)
  175. {
  176. return QQmlListProperty<IPv4Address>(this, m_dnsList);
  177. }
  178. /*QString Interface::dns1(void) const
  179. {
  180. return inet_ntoa(m_ifb.inet4s.namesvr[0]);
  181. }
  182. QString Interface::dns2(void) const
  183. {
  184. return inet_ntoa(m_ifb.inet4s.namesvr[1]);
  185. }
  186. QString Interface::dns3(void) const
  187. {
  188. return inet_ntoa(m_ifb.inet4s.namesvr[2]);
  189. }*/
  190. /////////////////////////////////////////////////////////////////////////////
  191. IPv4Address::IPv4Address(struct in_addr &addr, const Emitter &errHandler, QObject *pParent) : QObject(pParent), m_addr(addr), m_errHandler(errHandler)
  192. {
  193. }
  194. IPv4Address::~IPv4Address(void)
  195. {
  196. }
  197. QString IPv4Address::address(void) const
  198. {
  199. return inet_ntoa(m_addr);
  200. }
  201. int IPv4Address::b0(void) const
  202. {
  203. unsigned char *pb = (unsigned char*)&m_addr.s_addr;
  204. return (int)pb[0];
  205. }
  206. int IPv4Address::b1(void) const
  207. {
  208. unsigned char *pb = (unsigned char*)&m_addr.s_addr;
  209. return (int)pb[1];
  210. }
  211. int IPv4Address::b2(void) const
  212. {
  213. unsigned char *pb = (unsigned char*)&m_addr.s_addr;
  214. return (int)pb[2];
  215. }
  216. int IPv4Address::b3(void) const
  217. {
  218. unsigned char *pb = (unsigned char*)&m_addr.s_addr;
  219. return (int)pb[3];
  220. }
  221. void IPv4Address::set_address(const QString &addr)
  222. {
  223. struct in_addr newAddr, oldAddr;
  224. std::string sa = addr.toStdString();
  225. if(!inet_aton(sa.c_str(), &newAddr))
  226. {
  227. m_errHandler.emitError("Invalid IP address: '%s'!", sa.c_str());
  228. return;
  229. }
  230. if(m_addr.s_addr != newAddr.s_addr)
  231. {
  232. oldAddr.s_addr = m_addr.s_addr;
  233. m_addr.s_addr = newAddr.s_addr;
  234. unsigned char *pb1 = (unsigned char*)&oldAddr.s_addr;
  235. unsigned char *pb2 = (unsigned char*)&newAddr.s_addr;
  236. if(pb1[0] != pb2[0])
  237. emit b0_Changed(pb2[0]);
  238. if(pb1[1] != pb2[1])
  239. emit b1_Changed(pb2[1]);
  240. if(pb1[2] != pb2[2])
  241. emit b2_Changed(pb2[2]);
  242. if(pb1[3] != pb2[3])
  243. emit b3_Changed(pb2[3]);
  244. emit address_Changed(address());
  245. }
  246. }
  247. void IPv4Address::set_b0(int b)
  248. {
  249. unsigned char *pb = (unsigned char*)&m_addr.s_addr;
  250. if(!_IS_VALID_BYTE_VALUE(b))
  251. {
  252. m_errHandler.emitError("Invalid IP address byte 0: '%d'!", b);
  253. return;
  254. }
  255. if(b == (int)pb[0])
  256. return;
  257. pb[0] = (unsigned char)b;
  258. emit b0_Changed(b);
  259. emit address_Changed(address());
  260. }
  261. void IPv4Address::set_b1(int b)
  262. {
  263. unsigned char *pb = (unsigned char*)&m_addr.s_addr;
  264. if(!_IS_VALID_BYTE_VALUE(b))
  265. {
  266. m_errHandler.emitError("Invalid IP address byte 1: '%d'!", b);
  267. return;
  268. }
  269. if(b == (int)pb[1])
  270. return;
  271. pb[1] = (unsigned char)b;
  272. emit b1_Changed(b);
  273. emit address_Changed(address());
  274. }
  275. void IPv4Address::set_b2(int b)
  276. {
  277. unsigned char *pb = (unsigned char*)&m_addr.s_addr;
  278. if(!_IS_VALID_BYTE_VALUE(b))
  279. {
  280. m_errHandler.emitError("Invalid IP address byte 2: '%d'!", b);
  281. return;
  282. }
  283. if(b == (int)pb[2])
  284. return;
  285. pb[2] = (unsigned char)b;
  286. emit b2_Changed(b);
  287. emit address_Changed(address());
  288. }
  289. void IPv4Address::set_b3(int b)
  290. {
  291. unsigned char *pb = (unsigned char*)&m_addr.s_addr;
  292. if(!_IS_VALID_BYTE_VALUE(b))
  293. {
  294. m_errHandler.emitError("Invalid IP address byte 3: '%d'!", b);
  295. return;
  296. }
  297. if(b == (int)pb[3])
  298. return;
  299. pb[3] = (unsigned char)b;
  300. emit b3_Changed(b);
  301. emit address_Changed(address());
  302. }
  303. /////////////////////////////////////////////////////////////////////////////
  304. #if 0
  305. Nameservers::Nameservers(struct in_addr (&namesvr)[3], QObject *pParent) : QObject(pParent), m_dnsSvr(namesvr)
  306. {
  307. }
  308. Nameservers::~Nameservers(void)
  309. {
  310. }
  311. #endif