sys.c 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008
  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <fcntl.h>
  4. #include <unistd.h>
  5. #include <string.h>
  6. #include <limits.h>
  7. #include "elog.h"
  8. #include "sys.h"
  9. #include "upgrade.h"
  10. #include "paras.h"
  11. #include "cfg.h"
  12. #include "file.h"
  13. #include "thread.h"
  14. #include "sqlite_handle.h"
  15. #if 0
  16. #define LOGE log_e
  17. #define LOGW log_w
  18. #define LOGD log_d
  19. #else
  20. #define LOGD printf
  21. #define LOGW printf
  22. #define LOGE printf
  23. #endif
  24. //#define USE_BASH
  25. #define USE_FILE
  26. //#define USE_API
  27. #define DFLT_NIC "eth0"
  28. //#define FILE_NET "/root/interfaces"
  29. #define FILE_NET "/etc/network/interfaces"
  30. #define FILE_DNS "/etc/dnsmasq.conf"
  31. typedef struct {
  32. char *pbuf;
  33. int dlen;
  34. int blen;
  35. }node_t;
  36. static int set_net(NetworkInfo_t *para, int ipv);
  37. static int node_free(node_t *nd)
  38. {
  39. if(!nd) {
  40. return -1;
  41. }
  42. free(nd->pbuf);
  43. nd->pbuf = NULL;
  44. nd->dlen = 0;
  45. nd->blen = 0;
  46. return 0;
  47. }
  48. static int exe_cmd(char *cmd, node_t *nd)
  49. {
  50. int r=0;
  51. FILE *fp=NULL;
  52. char *pbuf=NULL;
  53. int onelen=1000;
  54. int dlen=0,blen=onelen;
  55. fp = popen(cmd, "r");
  56. if (fp == NULL) {
  57. return -1;
  58. }
  59. if(nd) {
  60. pbuf = malloc(onelen);
  61. while(pbuf) {
  62. r = fread(pbuf+dlen, sizeof(char), onelen, fp);
  63. if(r<=0) {
  64. LOGE("exe_cmd fread failed\n");
  65. break;
  66. }
  67. dlen += r;
  68. if(dlen+onelen>blen) {
  69. char* p = realloc(pbuf, dlen+onelen);
  70. if(!p) {
  71. LOGE("exe_cmd relloac %d failed\n", dlen+onelen);
  72. free(pbuf); pclose(fp);
  73. return -1;
  74. }
  75. pbuf = p;
  76. blen = dlen+onelen;
  77. }
  78. }
  79. nd->pbuf = pbuf;
  80. nd->dlen = dlen;
  81. nd->blen = blen;
  82. }
  83. pclose(fp);
  84. return 0;
  85. }
  86. ////////////////////////////////////////////////////////////////////
  87. int sys_reboot(void)
  88. {
  89. int r=0;
  90. r = system("reboot");
  91. if(r) {
  92. LOGE("sys_reboot failed!\n");
  93. return -1;
  94. }
  95. return r;
  96. }
  97. #include "upgrade.h"
  98. int sys_set_factory(void)
  99. {
  100. int r=0;
  101. #ifdef KEY_PARAS_IN_FILE
  102. r = paras_reset();
  103. #else
  104. char dir[100],src[200],dst[200];
  105. extern GlobalDeviceManager __globalDeviceManage;
  106. sqlite_deinit(__globalDeviceManage.db, &__globalDeviceManage.dbThreadlock);
  107. sys_get_path(dir, "");
  108. snprintf(src, sizeof(src), "%s/%s", dir, DATABASE_BAK_NAME);
  109. snprintf(dst, sizeof(dst), "%s/%s", dir, DATABASE_NAME);
  110. LOGD("___ file_copy from %s to %s\n", src, dst);
  111. r = file_copy(dst, src);
  112. if(r==0) {
  113. #if 0
  114. r = set_net(&DFLT_PARAS.dev._network_info, IP_V4);
  115. if(r) {
  116. LOGE("____ set_net failed\n");
  117. return -1;
  118. }
  119. #endif
  120. LOGD("____ exit smartPDU now ...\n");
  121. exit(0);
  122. }
  123. #endif
  124. return r;
  125. }
  126. int sys_get_path(char *path, char *name)
  127. {
  128. char tmp[500];
  129. pid_t pid = getpid();
  130. snprintf(tmp, sizeof(tmp), "/proc/%d/exe", pid);
  131. readlink(tmp, path, sizeof(tmp));
  132. char *p = strrchr(path, '/');
  133. if(p && strlen(path)>1) {
  134. *p = 0;
  135. if(p && strlen(name)>0) {
  136. strcat(path, "/");
  137. strcat(path, name);
  138. }
  139. }
  140. return 0;
  141. }
  142. ////////////////////////////////////////////////
  143. #include <net/if.h>
  144. #include <sys/socket.h>
  145. #include <net/route.h>
  146. #include <sys/ioctl.h>
  147. #include <netinet/in.h>
  148. #include <arpa/inet.h>
  149. #include <unistd.h>
  150. #include <net/if.h>
  151. #include <ifaddrs.h>
  152. #include <netinet/in.h>
  153. #include <linux/if.h>
  154. #include <linux/if_link.h>
  155. #include <linux/netlink.h>
  156. #include <linux/rtnetlink.h>
  157. void print_net(char*s, NetworkInfo_t *p)
  158. {
  159. LOGD("__%s__net.mode: %d\n", s, p->mode);
  160. LOGD("__%s__net.addr: %s\n", s, p->ip_address);
  161. LOGD("__%s__net.mask: %s\n", s, p->mask);
  162. LOGD("__%s__net.gateway: %s\n", s, p->gateway);
  163. LOGD("__%s__net.dns1: %s\n", s, p->dns1);
  164. LOGD("__%s__net.dns2: %s\n", s, p->dns2);
  165. }
  166. void print_modbus(char*s, ModbusInfo_t *p)
  167. {
  168. LOGD("__%s__mbus.mode: %d\n", s, p->product_modbus_type);
  169. LOGD("__%s__mbus.addr: %d\n", s, p->product_modbus_baud);
  170. LOGD("__%s__mbus.mask: %d\n", s, p->product_modbus_addr);
  171. LOGD("__%s__mbus.mask: %s\n", s, p->product_relay_ctrl_port);
  172. }
  173. static int set_ipaddr(int family, const char* iface, const char* addr, const char* netmask)
  174. {
  175. struct ifreq ifr;
  176. struct sockaddr_in *sin;
  177. struct sockaddr_in6 *sin6;
  178. int fd = socket(family, SOCK_DGRAM, 0);
  179. if (fd < 0) {
  180. LOGD("socket SOCK_DGRAM failed\n");
  181. return -1;
  182. }
  183. strcpy(ifr.ifr_name, iface);
  184. sin = (struct sockaddr_in*)&ifr.ifr_addr;
  185. sin6 = (struct sockaddr_in6*)&ifr.ifr_addr;
  186. if(family==AF_INET) {
  187. sin->sin_family = family;
  188. sin->sin_port = 0;
  189. inet_pton(family, addr, &sin->sin_addr);
  190. if (ioctl(fd, SIOCSIFADDR, &ifr) < 0) {
  191. LOGD("ioctl SIOCSIFADDR \n");
  192. close(fd);
  193. return -1;
  194. }
  195. sin->sin_family = family;
  196. inet_pton(family, netmask, &sin->sin_addr);
  197. if (ioctl(fd, SIOCSIFNETMASK, &ifr) < 0) {
  198. LOGD("ioctl SIOCSIFNETMASK \n");
  199. close(fd);
  200. return -1;
  201. }
  202. }
  203. else {
  204. sin6->sin6_family = family;
  205. sin6->sin6_port = 0;
  206. inet_pton(family, addr, &sin6->sin6_addr);
  207. if (ioctl(fd, SIOCSIFADDR, &ifr) < 0) {
  208. LOGD("ioctl SIOCSIFADDR \n");
  209. close(fd);
  210. return -1;
  211. }
  212. sin6->sin6_family = family;
  213. inet_pton(family, netmask, &sin6->sin6_addr);
  214. if (ioctl(fd, SIOCSIFNETMASK, &ifr) < 0) {
  215. LOGD("ioctl SIOCSIFNETMASK \n");
  216. close(fd);
  217. return -1;
  218. }
  219. }
  220. close(fd);
  221. return 0;
  222. }
  223. static int get_ipaddr(int family, char* iface, char* addr, char* netmask)
  224. {
  225. struct ifaddrs *ifap, *ifa;
  226. if (getifaddrs(&ifap) == -1) {
  227. LOGE("getifaddrs() error\n");
  228. return -1;
  229. }
  230. for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
  231. if (ifa->ifa_addr != NULL && ifa->ifa_addr->sa_family == family) {
  232. if(family==IP_V4) {
  233. struct sockaddr_in *sa,*msk;
  234. sa = (struct sockaddr_in *) ifa->ifa_addr;
  235. msk = (struct sockaddr_in *) ifa->ifa_netmask;
  236. inet_ntop(family, &sa->sin_addr, addr, INET6_ADDRSTRLEN);
  237. inet_ntop(family, &msk->sin_addr, netmask, INET6_ADDRSTRLEN);
  238. }
  239. else {
  240. struct sockaddr_in6 *sa,*msk;
  241. sa = (struct sockaddr_in6 *) ifa->ifa_addr;
  242. msk = (struct sockaddr_in6 *) ifa->ifa_netmask;
  243. inet_ntop(family, &sa->sin6_addr, addr, INET6_ADDRSTRLEN);
  244. inet_ntop(family, &msk->sin6_addr, netmask, INET6_ADDRSTRLEN);
  245. }
  246. }
  247. }
  248. freeifaddrs(ifap);
  249. return 0;
  250. }
  251. static int set_gateway(int family, const char* gateway)
  252. {
  253. struct rtentry rt;
  254. int fd;
  255. fd = socket(family, SOCK_DGRAM, 0);
  256. if (fd < 0) {
  257. LOGE("socket SOCK_DGRAM failed\n");
  258. return -1;
  259. }
  260. memset(&rt, 0, sizeof(rt));
  261. if(family==AF_INET) {
  262. struct sockaddr_in* sin;
  263. sin = (struct sockaddr_in*)&rt.rt_gateway;
  264. sin->sin_family = family;
  265. sin->sin_port = 0;
  266. inet_pton(family, gateway, &sin->sin_addr);
  267. sin = (struct sockaddr_in*)&rt.rt_dst;
  268. sin->sin_family = family;
  269. sin->sin_addr.s_addr = 0;
  270. }
  271. else {
  272. struct sockaddr_in6* sin;
  273. sin = (struct sockaddr_in6*)&rt.rt_gateway;
  274. sin->sin6_family = family;
  275. sin->sin6_port = 0;
  276. inet_pton(family, gateway, &sin->sin6_addr);
  277. sin = (struct sockaddr_in6*)&rt.rt_dst;
  278. sin->sin6_family = family;
  279. //sin->sin6_addr.s_addr[0] = 0;
  280. }
  281. rt.rt_flags = RTF_GATEWAY;
  282. if (ioctl(fd, SIOCADDRT, &rt) < 0) {
  283. LOGE("ioctl SIOCADDRT failed\n");
  284. close(fd);
  285. return -1;
  286. }
  287. close(fd);
  288. return 0;
  289. }
  290. static int get_gateway(int family, const char* gateway)
  291. {
  292. #if 0
  293. int sockfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
  294. if (sockfd == -1) {
  295. log_e("set_gateway, socket AF_NETLINK error\n");
  296. return -1;
  297. }
  298. struct sockaddr_nl sa;
  299. memset(&sa, 0, sizeof(sa));
  300. sa.nl_family = AF_NETLINK;
  301. if (bind(sockfd, (struct sockaddr *) &sa, sizeof(sa)) == -1) {
  302. log_e("set_gateway, bind error\n");
  303. return -1;
  304. }
  305. struct nlreq req;
  306. memset(&req, 0, sizeof(req));
  307. req.hdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
  308. req.hdr.nlmsg_type = RTM_GETROUTE;
  309. req.hdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP;
  310. req.msg.rtm_family = family;
  311. req.msg.rtm_table = RT_TABLE_MAIN;
  312. req.msg.rtm_protocol = RTPROT_UNSPEC;
  313. req.msg.rtm_scope = RT_SCOPE_UNIVERSE;
  314. req.msg.rtm_type = RTN_UNICAST;
  315. struct iovec iov;
  316. memset(&iov, 0, sizeof(iov));
  317. iov.iov_base = &req;
  318. iov.iov_len = req.hdr.nlmsg_len;
  319. struct msghdr msg;
  320. memset(&msg, 0, sizeof(msg));
  321. msg.msg_name = &sa;
  322. msg.msg_namelen = sizeof(sa);
  323. msg.msg_iov = &iov;
  324. msg.msg_iovlen = 1;
  325. char buf[BUFSIZE];
  326. memset(buf, 0, sizeof(buf));
  327. struct nlmsghdr *hdr;
  328. int len;
  329. if (sendmsg(sockfd, &msg, 0) == -1) {
  330. log_e("set_gateway, sendmsg error\n");
  331. return -1;
  332. }
  333. while ((len = recv(sockfd, buf, sizeof(buf), 0)) > 0) {
  334. for (hdr = (struct nlmsghdr *) buf; NLMSG_OK(hdr, len); hdr = NLMSG_NEXT(hdr, len)) {
  335. if (hdr->nlmsg_type == NLMSG_DONE) {
  336. goto finish;
  337. }
  338. if (hdr->nlmsg_type == NLMSG_ERROR) {
  339. log_e("set_gateway, NLMSG_ERROR\n");
  340. return -1;
  341. }
  342. struct rtmsg *rt = (struct rtmsg *) NLMSG_DATA(hdr);
  343. if (rt->rtm_family != family || rt->rtm_table != RT_TABLE_MAIN || rt->rtm_type != RTN_UNICAST) {
  344. continue;
  345. }
  346. struct rtattr *attr;
  347. int attrlen;
  348. for (attr = (struct rtattr *) RTM_RTA(rt), attrlen = RTM_PAYLOAD(hdr); RTA_OK(attr, attrlen); attr = RTA_NEXT(attr, attrlen)) {
  349. if (attr->rta_type == RTA_GATEWAY) {
  350. char gw_addr[INET_ADDRSTRLEN];
  351. struct in_addr addr;
  352. memcpy(&addr, RTA_DATA(attr), sizeof(addr));
  353. if (inet_ntop(family, &addr, gateway, INET6_ADDRSTRLEN) == NULL) {
  354. log_e("set_gateway, inet_ntop error\n");
  355. continue;
  356. }
  357. printf("Gateway address: %s\n", gw_addr);
  358. log_i("set_gateway, Gateway address: %s\n");
  359. goto finish;
  360. }
  361. }
  362. }
  363. }
  364. finish:
  365. close(sockfd);
  366. #endif
  367. return 0;
  368. }
  369. static int set_dhcp(int on)
  370. {
  371. if(on) {
  372. system("killall udhcpc && udhcpc –i eth0 –s /usr/share/udhcpc/default.script &");
  373. }
  374. else {
  375. system("killall udhcpc");
  376. }
  377. return 0;
  378. }
  379. static int is_number(char *str)
  380. {
  381. while (*str) {
  382. if (!isdigit(*str)) {
  383. return 0;
  384. }
  385. str++;
  386. }
  387. return 1;
  388. }
  389. static int ip_check(char* addr)
  390. {
  391. int flag=IP_ERR;
  392. struct in_addr addr4;
  393. struct in6_addr addr6;
  394. if (inet_pton(AF_INET, addr, &addr4) == 1) {
  395. flag = IP_V4;
  396. } else if (inet_pton(AF_INET6, addr, &addr6) == 1) {
  397. flag = IP_V6;
  398. }
  399. if(flag==IP_ERR) {
  400. LOGE("____ wrong ip addr: %s\n", addr);
  401. }
  402. return flag;
  403. }
  404. static int is_ipv6_prefix(char *ss)
  405. {
  406. if(is_number(ss)) {
  407. int val = atoi(ss);
  408. if(val>1 && val<128) {
  409. return 1;
  410. }
  411. }
  412. return 0;
  413. }
  414. ///////////////////////////////////////////////
  415. typedef struct {
  416. char lo[1000];
  417. char e0[1000];
  418. char e1[1000];
  419. }interface_t;
  420. typedef uint32_t u32;
  421. #define XLEN(a,b) ((u32)(a)-(u32)(b))
  422. typedef struct {
  423. char *ptr;
  424. int len;
  425. }nic_t;
  426. static int get_nic(char *nbuf, int nlen, char *nic, char *fbuf, int flen)
  427. {
  428. int r,xlen;
  429. char tmp[20];
  430. char *p1,*p2;
  431. char *fend=fbuf+flen-1;
  432. sprintf(tmp, "auto %s", nic);
  433. p1 = strstr(fbuf, tmp);
  434. if(!p1) {
  435. return -1;
  436. }
  437. p2 = strstr(p1+1, "auto");
  438. if(!p2 || p2>fend) {
  439. p2 = fend;
  440. }
  441. xlen = XLEN(p2,p1);
  442. memcpy(nbuf, p1, xlen);
  443. nbuf[xlen] = 0;
  444. return 0;
  445. }
  446. static int get_ip(char *nbuf, char *token, char *ipaddr, int ipv)
  447. {
  448. int cnt=0;
  449. char *p,*p1,*p2;
  450. char *pbuf=NULL;
  451. if(ipv==IP_V4) {
  452. pbuf = strstr(nbuf, "inet");
  453. }
  454. else {
  455. pbuf = strstr(nbuf, "inet6");
  456. }
  457. if(pbuf==NULL) {
  458. LOGE("___get_ip, not found inet or inet6\n");
  459. return -1;
  460. }
  461. p = strstr(pbuf, token);
  462. if(p) {
  463. p += strlen(token);
  464. while(isspace(*p)) p++;
  465. p1 = p;
  466. while(!isspace(*p)) p++;
  467. p2 = p;
  468. for(p=p1; p<p2; p++) {
  469. if(isgraph(*p)) {
  470. ipaddr[cnt++] = *p;
  471. }
  472. }
  473. ipaddr[cnt] = 0;
  474. return 0;
  475. }
  476. return -1;
  477. }
  478. static int get_dns(char *nbuf, char *dns1, char *dns2)
  479. {
  480. int cnt;
  481. char *p1,*p2;
  482. char *token="server=";
  483. p1 = strstr(nbuf, token);
  484. if(p1==NULL) {
  485. dns1[0] = 0;
  486. return -1;
  487. }
  488. p1 += strlen(token); cnt=0;
  489. while(!isspace(*p1)) {
  490. dns1[cnt++] = *p1;
  491. p1++;
  492. }
  493. dns1[cnt] = 0;
  494. p2 = strstr(p1, token);
  495. if(p2==NULL) {
  496. dns2[0] = 0;
  497. return -1;
  498. }
  499. p2 += strlen(token); cnt=0;
  500. while(!isspace(*p2)) {
  501. dns2[cnt++] = *p2;
  502. p2++;
  503. }
  504. dns2[cnt] = 0;
  505. return 0;
  506. }
  507. static int set_dns(NetworkInfo_t *para)
  508. {
  509. int r;
  510. char tmp[100];
  511. char buf[500];
  512. LOGD("_____ set_dns\n");
  513. int chk1=ip_check(para->dns1);
  514. int chk2=ip_check(para->dns2);
  515. if( chk1==IP_ERR && chk2==IP_ERR) {
  516. LOGE("___ dns1 and dns2 are all wrong!\n");
  517. return -1;
  518. }
  519. memset(buf, 0, sizeof(buf));
  520. strcpy(buf, "interface=eth0\n");
  521. if(chk1) {
  522. sprintf(tmp, "server=%s\n", para->dns1);
  523. strcat(buf, tmp);
  524. }
  525. if(chk2) {
  526. sprintf(tmp, "server=%s\n", para->dns2);
  527. strcat(buf, tmp);
  528. }
  529. r = file_save(FILE_DNS, buf, strlen(buf))+1;
  530. if(r==0) {
  531. system("killall dnsmasq; /usr/sbin/dnsmasq &");
  532. }
  533. return r;
  534. }
  535. static int get_net(NetworkInfo_t *para, int ipv)
  536. {
  537. int r;
  538. char *p=NULL;
  539. interface_t intf;
  540. buf_t fbuf;
  541. r = file_load(FILE_NET, &fbuf);
  542. if(r) {
  543. return -1;
  544. }
  545. memset(&intf, 0, sizeof(intf));
  546. get_nic(intf.lo, sizeof(intf.lo), "lo", fbuf.buf, fbuf.dlen);
  547. get_nic(intf.e0, sizeof(intf.e0), "eth0", fbuf.buf, fbuf.dlen);
  548. get_nic(intf.e1, sizeof(intf.e1), "eth1", fbuf.buf, fbuf.dlen);
  549. p = strstr(intf.e0, (ipv==IP_V4)?"inet":"inet6");
  550. if(p==NULL) {
  551. LOGE("___get_ipv%d, %s not found!\n", (ipv==IP_V4)?4:6, (ipv==IP_V4)?"inet":"inet6");
  552. free(fbuf.buf); return -1;
  553. }
  554. if(strstr(p, "dhcp")) {
  555. para->mode = 0;
  556. }
  557. else if(strstr(p, "static")) {
  558. para->mode = 1;
  559. } else {
  560. LOGE("___get_net, dhcp/static not found!\n");
  561. free(fbuf.buf); return -1;
  562. }
  563. get_ip(p, "address", para->ip_address, ipv);
  564. get_ip(p, "netmask", para->mask, ipv);
  565. get_ip(p, "gateway", para->gateway, ipv);
  566. free(fbuf.buf);
  567. r = file_load(FILE_DNS, &fbuf);
  568. if(r) {
  569. return -1;
  570. }
  571. get_dns(fbuf.buf, para->dns1, para->dns2);
  572. return 0;
  573. }
  574. static int nw_check(NetworkInfo_t *para, int ipv)
  575. {
  576. if(ipv==IP_V4) {
  577. if((ip_check(para->ip_address)!=IP_V4) || (ip_check(para->mask)!=IP_V4) || (ip_check(para->gateway)!=IP_V4)) {
  578. return -1;
  579. }
  580. }
  581. else {
  582. if((ip_check(para->ip_address)!=IP_V6) || (!is_ipv6_prefix(para->mask)) || (ip_check(para->gateway)!=IP_V6)) {
  583. return -1;
  584. }
  585. }
  586. return 0;
  587. }
  588. static int set_net(NetworkInfo_t *para, int ipv)
  589. {
  590. int r,ipv2;
  591. char *p1,*p2,*p3,*p4;
  592. int flen=100*1000;
  593. NetworkInfo_t info4,info6,*info;
  594. get_net(&info4, IP_V4);
  595. get_net(&info6, IP_V6);
  596. info = ((ipv==IP_V4)?&info4:&info6);
  597. if(para->mode<2 && para->mode!=info->mode) {
  598. info->mode = para->mode;
  599. }
  600. ipv2 = ip_check(para->ip_address);
  601. if((ipv==ipv2) && strcmp(para->ip_address, info->ip_address)) {
  602. strcpy(info->ip_address, para->ip_address);
  603. }
  604. if(ipv==IP_V4) {
  605. ipv2 = ip_check(para->mask);
  606. }
  607. else {
  608. ipv2=is_ipv6_prefix(para->mask)?IP_V6:IP_ERR;
  609. }
  610. if((ipv==ipv2) && strcmp(para->mask, info->mask)) {
  611. strcpy(info->mask, para->mask);
  612. }
  613. ipv2 = ip_check(para->gateway);
  614. if((ipv==ipv2) && strcmp(para->gateway, info->gateway)) {
  615. strcpy(info->gateway, para->gateway);
  616. }
  617. char *fbuf=malloc(flen);
  618. if(!fbuf) {
  619. LOGE("___ malloc %d failed\n", flen);
  620. return -1;
  621. }
  622. #if 0
  623. file_load(FILE_NET, fbuf);
  624. get_nic(pNet->lo, sizeof(pNet->lo), "lo", fbuf, flen);
  625. get_nic(pNet->e1, sizeof(pNet->e1), "eth1", fbuf, flen);
  626. snprintf(pNet->e0, sizeof(pNet->e0), "auto eth0\niface eth0 inet %s\n address %s\n netmask %s\n gateway %s\n\n",
  627. info4.mode?"static":"dhcp", info4.ip_address, info4.mask, info4.gateway);
  628. strcpy(fbuf, pNet->lo);
  629. strcat(fbuf, pNet->e0);
  630. strcat(fbuf, pNet->e1);
  631. #else
  632. char *lo="auto lo\niface lo inet loopback\n\n";
  633. char *eth1="auto eth1\niface eth1 inet dhcp\npre-up /etc/network/nfs_check\nwait-delay 5\nhostname $(hostname)\n";
  634. char eth0[1000];
  635. int chk4=nw_check(&info4, IP_V4);
  636. int chk6=nw_check(&info6, IP_V6);
  637. char temp[400];
  638. strcpy(eth0, "auto eth0\n");
  639. if(chk4==0) {
  640. sprintf(temp, "iface eth0 inet %s\n address %s\n netmask %s\n gateway %s\n\n", (info4.mode==IP_STATIC)?"static":"dhcp", info4.ip_address, info4.mask, info4.gateway);
  641. strcat(eth0, temp);
  642. }
  643. if(chk6==0) {
  644. sprintf(temp, "iface eth0 inet6 %s\n address %s\n netmask %s\n gateway %s\n\n", (info6.mode==IP_STATIC)?"static":"dhcp", info6.ip_address, info6.mask, info6.gateway);
  645. strcat(eth0, temp);
  646. }
  647. sprintf(fbuf, "%s%s%s", lo, eth0, eth1);
  648. #endif
  649. //LOGD("___interfaces___:\n%s", fbuf);
  650. r = file_save(FILE_NET, fbuf, strlen(fbuf)); free(fbuf);
  651. return r;
  652. }
  653. //////////////////////////////////////////////////////////////////////////////
  654. int sys_set_net(NetworkInfo_t *para, int ipVersion)
  655. {
  656. int r,ipv;
  657. #ifdef USE_BASH
  658. char cmd[200];
  659. snprintf(cmd, sizeof(cmd), "ip addr flush dev %s", DFLT_NIC);
  660. r = system(cmd);
  661. if(r) {
  662. LOGE("set ipaddr failed\n");
  663. return -1;
  664. }
  665. snprintf(cmd, sizeof(cmd), "ip addr add %s/%s dev %s", para->ip_address, para->mask, DFLT_NIC);
  666. r = system(cmd);
  667. if(r) {
  668. LOGE("set netmask %s failed\n", para->mask);
  669. return -1;
  670. }
  671. snprintf(cmd, sizeof(cmd), "ip route add default via %s dev %s", para->gateway, DFLT_NIC);
  672. r = system(cmd);
  673. if(r) {
  674. LOGE("set gateway %s failed\n", para->gateway);
  675. return -1;
  676. }
  677. snprintf(cmd, sizeof(cmd), "ip link set dev %s up", DFLT_NIC);
  678. r = system(cmd);
  679. if(r) {
  680. LOGE("restart %s failed\n", DFLT_NIC);
  681. return -1;
  682. }
  683. #elif defined USE_FILE
  684. NetworkInfo_t para2;
  685. r = get_net(&para2, ipVersion);
  686. if(r==0) {
  687. if(memcmp(para, &para2, sizeof(NetworkInfo_t))==0) {
  688. LOGW("%s NetworkInfo is same, no need to set\n", DFLT_NIC);
  689. return -1;
  690. }
  691. set_dns(para);
  692. r = set_net(para, ipVersion);
  693. if(r==0) {
  694. //system("ip addr flush dev eth0");
  695. //sprintf(eth0, "ip link set dev eth0 %s/%d && ip link set eth0 up && ip link set eth0 down", info->ip_address, info->netmask);
  696. //system(eth0);
  697. system("ifdown eth0 && ifup eth0");
  698. if(ipVersion==IP_V6) exit(0);
  699. }
  700. }
  701. else {
  702. LOGE("get_net failed\n");
  703. }
  704. #elif defined USE_API
  705. if(para->mode==IP_DHCP) {
  706. r = set_dhcp(1);
  707. }
  708. else {
  709. set_dhcp(0);
  710. int family=(ipv==IP_V4)?AF_INET:AF_INET6;
  711. r = set_ipaddr(family, "eth0", para->ip_address, para->mask);
  712. if(r) {
  713. LOGE("set_ipaddr failed\n");
  714. return r;
  715. }
  716. r = set_gateway(family, para->gateway);
  717. if(r) {
  718. LOGE("set_gateway failed\n");
  719. return r;
  720. }
  721. r = set_dns(family, "eth0", para->dns1, para->dns2);
  722. if(r) {
  723. LOGE("set_dns failed\n");
  724. return r;
  725. }
  726. }
  727. #endif
  728. return r;
  729. }
  730. int sys_get_net(NetworkInfo_t *para, int ipVersion)
  731. {
  732. int r;
  733. int family=AF_INET;
  734. #ifdef USE_BASH
  735. #elif defined USE_FILE
  736. r = get_net(para, ipVersion);
  737. #elif defined USE_API
  738. r = get_ipaddr(family, DFLT_NIC, para->ip_address, para->mask);
  739. if(r) {
  740. LOGE("set_ipaddr failed\n");
  741. return r;
  742. }
  743. r = get_gateway(family, para->gateway);
  744. if(r) {
  745. LOGE("set_gateway failed\n");
  746. return r;
  747. }
  748. r = get_dns(family, DFLT_NIC, para->dns1, para->dns2);
  749. if(r) {
  750. LOGE("set_dns failed\n");
  751. return r;
  752. }
  753. #endif
  754. return r;
  755. }
  756. #define MAX_BUFFER_SIZE 4096
  757. static void* plug_thread(void *arg)
  758. {
  759. int nlSock;
  760. struct sockaddr_nl srcAddr;
  761. struct nlmsghdr *nlMsg;
  762. char buffer[MAX_BUFFER_SIZE];
  763. int plug_in=0,plug_out=0;
  764. printf("___plug_thread start\n");
  765. nlSock = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
  766. if (nlSock < 0) {
  767. printf("Failed to create Netlink socket");
  768. goto quit;
  769. }
  770. memset(&srcAddr, 0, sizeof(srcAddr));
  771. srcAddr.nl_family = AF_NETLINK;
  772. srcAddr.nl_groups = RTMGRP_LINK | RTMGRP_NOTIFY;
  773. if (bind(nlSock, (struct sockaddr *)&srcAddr, sizeof(srcAddr)) < 0) {
  774. perror("Failed to bind Netlink socket");
  775. close(nlSock);
  776. goto quit;
  777. }
  778. int flags = fcntl(nlSock, F_GETFL, 0);
  779. fcntl(nlSock, F_SETFL, flags | O_NONBLOCK);
  780. while (1) {
  781. fd_set readSet;
  782. FD_ZERO(&readSet);
  783. FD_SET(nlSock, &readSet);
  784. // 设置超时时间为 1 秒
  785. struct timeval timeout;
  786. timeout.tv_sec = 1;
  787. timeout.tv_usec = 0;
  788. // 监视 Netlink Socket 的可读状态
  789. int result = select(nlSock + 1, &readSet, NULL, NULL, &timeout);
  790. if (result == -1) {
  791. perror("Failed to select");
  792. goto quit;
  793. } else if (result == 0) {
  794. // 超时,没有新数据到达
  795. //printf("Timeout\n");
  796. continue;
  797. }
  798. if (FD_ISSET(nlSock, &readSet)) {
  799. // 接收消息
  800. int bytesRead = recv(nlSock, buffer, MAX_BUFFER_SIZE, 0);
  801. if (bytesRead < 0) {
  802. perror("Failed to receive message from Netlink socket");
  803. close(nlSock);
  804. goto quit;
  805. }
  806. // 遍历接收到的消息,获取到Netlink的消息头。
  807. nlMsg = (struct nlmsghdr *)buffer;
  808. while (NLMSG_OK(nlMsg, bytesRead)) {
  809. if (nlMsg->nlmsg_type == NLMSG_DONE) {
  810. break;
  811. }
  812. if (nlMsg->nlmsg_type == RTM_NEWLINK || nlMsg->nlmsg_type == RTM_DELLINK) {
  813. //NLMSG_DATA()获取完整的ifinfomsg结构体的指针
  814. //根据消息头nlMsg获取到其后面的数据部分ifinfomsg结构体的指针
  815. struct ifinfomsg *ifInfo = (struct ifinfomsg *)NLMSG_DATA(nlMsg);
  816. if (ifInfo->ifi_family == AF_UNSPEC) {
  817. //获取路由信息的属性,以及消息负载的长度,通过这两个参数来判断本次的数据是否有效
  818. struct rtattr *attribute = IFLA_RTA(ifInfo);
  819. int attributeLen = IFLA_PAYLOAD(nlMsg);
  820. while (RTA_OK(attribute, attributeLen)) {
  821. char *ifaceName = (char *)RTA_DATA(attribute);
  822. if ((attribute->rta_type == IFLA_IFNAME) && (strcmp(ifaceName, "eth0")==0)) {
  823. //printf("____Interface: %s \n", ifaceName);
  824. if((ifInfo->ifi_flags & IFF_LOWER_UP)) {
  825. if(plug_in==0) {
  826. system("ifup eth0");
  827. printf("____eth0 plug in\n");
  828. plug_in = 1; plug_out = 0;
  829. }
  830. }
  831. else {
  832. if(plug_out==0) {
  833. system("ifdown eth0");
  834. printf("____eth0 plug out\n");
  835. plug_in = 0; plug_out = 1;
  836. }
  837. }
  838. }
  839. attribute = RTA_NEXT(attribute, attributeLen);
  840. }
  841. }
  842. }
  843. nlMsg = NLMSG_NEXT(nlMsg, bytesRead);
  844. }
  845. }
  846. }
  847. close(nlSock);
  848. quit:
  849. printf("___plug_thread exit\n");
  850. pthread_exit(NULL);
  851. }
  852. int sys_init(void)
  853. {
  854. //thread_start(THREAD_ID_PLUG, plug_thread, NULL, 4*MB, 0);
  855. return 0;
  856. }