inet4s.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. #include "util.h"
  2. #include "inet4s.h"
  3. /////////////////////////////////////////////////////////////////////////////
  4. bool ParseIfaceInet4sParam(const std::vector<std::string> &v, IFACE_INET_STATIC &is)
  5. {
  6. auto vSize = v.size();
  7. if(vSize >= 2)
  8. {
  9. struct in_addr addr, mask;
  10. if(!v[0].compare("address"))
  11. {
  12. std::vector<std::string> va;
  13. SplitString(v[1], "[^\\/]+", va);
  14. if(va.size() == 1)
  15. {
  16. if(inet_aton(va[0].c_str(), &addr))
  17. {
  18. is.addr = addr;
  19. return true;
  20. }
  21. }
  22. else if(va.size() == 2)
  23. {
  24. if(inet_aton(va[0].c_str(), &addr))
  25. {
  26. if(IsDecimalInt(va[1].c_str()))
  27. {
  28. unsigned int nBits = (unsigned int)std::stoul(va[1], 0, 0);
  29. if(nBits <= 32)
  30. is.netprefix = nBits;
  31. }
  32. else if(inet_aton(va[1].c_str(), &mask) && IsValidNetmask(mask))
  33. is.netprefix = Mask2Prefix(mask);
  34. else
  35. return false;
  36. is.addr = addr;
  37. return true;
  38. }
  39. }
  40. }
  41. else if(!v[0].compare("gateway"))
  42. {
  43. if(inet_aton(v[1].c_str(), &addr))
  44. {
  45. is.gate = addr;
  46. return true;
  47. }
  48. }
  49. else if(!v[0].compare("broadcast"))
  50. {
  51. if(inet_aton(v[1].c_str(), &addr))
  52. {
  53. is.bcast = addr;
  54. return true;
  55. }
  56. else if(!v[1].compare("-"))
  57. {
  58. is.bcastOpt = -1;
  59. return true;
  60. }
  61. }
  62. else if(!v[0].compare("pointopoint"))
  63. {
  64. if(inet_aton(v[1].c_str(), &addr))
  65. {
  66. is.pointopoint = addr;
  67. return true;
  68. }
  69. }
  70. else if(!v[0].compare("netmask"))
  71. {
  72. if(IsDecimalInt(v[1].c_str()))
  73. {
  74. unsigned int nBits = (unsigned int)std::stoul(v[1], 0, 0);
  75. if(nBits <= 32)
  76. {
  77. is.netmask.s_addr = Prefix2Mask(nBits);
  78. return true;
  79. }
  80. }
  81. else if(inet_aton(v[1].c_str(), &mask))
  82. {
  83. if(IsValidNetmask(mask))
  84. {
  85. is.netmask = mask;
  86. return true;
  87. }
  88. }
  89. }
  90. else if(!v[0].compare("dns-nameservers"))
  91. {
  92. int bNs = 0;
  93. for(size_t i = 1, j = 0; i < vSize && j < _countof(is.namesvr); i++, j++)
  94. {
  95. if(inet_aton(v[i].c_str(), &addr))
  96. {
  97. is.namesvr[j] = addr;
  98. bNs++;
  99. }
  100. }
  101. return bNs > 0;
  102. }
  103. else if(!v[0].compare("dns-search"))
  104. {
  105. for(size_t i = 1; i < vSize; i++)
  106. {
  107. is.dnss.push_back(v[i]);
  108. }
  109. return true;
  110. }
  111. else if(!v[0].compare("hwaddress"))
  112. {
  113. is.hwaddr = v[1];
  114. strlcase(is.hwaddr);
  115. return true;
  116. }
  117. else if(!v[0].compare("metric") && IsDecimalInt(v[1].c_str()))
  118. {
  119. is.metric = (int)std::stol(v[1], 0, 0);
  120. return true;
  121. }
  122. else if(!v[0].compare("mtu") && IsDecimalInt(v[1].c_str()))
  123. {
  124. is.mtu = (int)std::stol(v[1], 0, 0);
  125. return true;
  126. }
  127. else if(!v[0].compare("scope"))
  128. {
  129. is.scope = v[1];
  130. return true;
  131. }
  132. }
  133. return false;
  134. }
  135. /////////////////////////////////////////////////////////////////////////////
  136. bool WriteIfaceInet4sParam(FILE *pf, const IFACE_INET_STATIC &is)
  137. {
  138. if(is.addr.s_addr != INADDR_ANY)
  139. {
  140. fprintf(pf, "\taddress %s", inet_ntoa(is.addr));
  141. if(is.netprefix)
  142. fprintf(pf, "/%u", is.netprefix);
  143. fputc('\n', pf);
  144. }
  145. #if 0
  146. if(!is.netprefix && is.netmask.s_addr != INADDR_ANY)
  147. {
  148. fprintf(pf, "\tnetmask %s\n", inet_ntoa(is.netmask));
  149. }
  150. #endif
  151. if(is.gate.s_addr != INADDR_ANY)
  152. {
  153. fprintf(pf, "\tgateway %s\n", inet_ntoa(is.gate));
  154. }
  155. if(is.bcastOpt == -1)
  156. {
  157. fprintf(pf, "\tbroadcast -\n");
  158. }
  159. else if(is.bcast.s_addr != INADDR_ANY)
  160. {
  161. fprintf(pf, "\tbroadcast %s\n", inet_ntoa(is.bcast));
  162. }
  163. if(is.pointopoint.s_addr != INADDR_ANY)
  164. {
  165. fprintf(pf, "\tpointopoint %s\n", inet_ntoa(is.pointopoint));
  166. }
  167. if(is.namesvr[0].s_addr != INADDR_ANY)
  168. {
  169. fputs("\tdns-nameservers", pf);
  170. for(size_t i = 0; i < _countof(is.namesvr); i++)
  171. {
  172. if(is.namesvr[i].s_addr != INADDR_ANY)
  173. {
  174. fputc(' ', pf);
  175. fputs(inet_ntoa(is.namesvr[i]), pf);
  176. }
  177. }
  178. fputc('\n', pf);
  179. }
  180. if(is.dnss.size() > 0)
  181. {
  182. fputs("\tdns-search", pf);
  183. for(auto it = is.dnss.begin(); it != is.dnss.end(); it++)
  184. {
  185. const std::string &ds = *it;
  186. fputc(' ', pf);
  187. fputs(ds.c_str(), pf);
  188. }
  189. fputc('\n', pf);
  190. }
  191. if(!is.hwaddr.empty())
  192. {
  193. fprintf(pf, "\thwaddress %s\n", is.hwaddr.c_str());
  194. }
  195. if(is.metric >= 0)
  196. {
  197. fprintf(pf, "\tmetric %d\n", is.metric);
  198. }
  199. if(is.mtu >= 0)
  200. {
  201. fprintf(pf, "\tmtu %d\n", is.mtu);
  202. }
  203. if(!is.scope.empty())
  204. {
  205. fprintf(pf, "\tscope %s\n", is.scope.c_str());
  206. }
  207. return true;
  208. }