sys.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>
  6. #include <unistd.h>
  7. #include <string.h>
  8. #include <limits.h>
  9. #include "elog.h"
  10. #include "sys.h"
  11. #include "upgrade.h"
  12. #include "paras.h"
  13. #include "cfg.h"
  14. #if 0
  15. //#define LOGE log_e
  16. //#define LOGD log_d
  17. #else
  18. #define LOGD printf
  19. #define LOGE printf
  20. #endif
  21. //#define USE_BASH
  22. #define USE_FILE
  23. //#define USE_API
  24. #define DFLT_NIC "eth0"
  25. //#define FILE_INTERFACE "/root/interfaces"
  26. #define FILE_INTERFACE "/etc/network/interfaces"
  27. typedef struct {
  28. char *pbuf;
  29. int dlen;
  30. int blen;
  31. }node_t;
  32. static int set_net(NetworkInfo_t *para);
  33. static int node_free(node_t *nd)
  34. {
  35. if(!nd) {
  36. return -1;
  37. }
  38. free(nd->pbuf);
  39. nd->pbuf = NULL;
  40. nd->dlen = 0;
  41. nd->blen = 0;
  42. }
  43. static int exe_cmd(char *cmd, node_t *nd)
  44. {
  45. int r=0;
  46. FILE *fp=NULL;
  47. char *pbuf=NULL;
  48. int onelen=1000;
  49. int dlen=0,blen=onelen;
  50. pbuf = malloc(onelen);
  51. if(!pbuf) {
  52. return -1;
  53. }
  54. fp = popen(cmd, "r");
  55. if (fp == NULL) {
  56. return -1;
  57. }
  58. while(1) {
  59. r = fread(pbuf+dlen, sizeof(char), onelen, fp);
  60. if(r<=0) {
  61. LOGE("exe_cmd fread failed\n");
  62. break;
  63. }
  64. dlen += r;
  65. if(dlen+onelen>blen) {
  66. char* p = realloc(pbuf, dlen+onelen);
  67. if(!p) {
  68. LOGE("exe_cmd relloac %d failed\n", dlen+onelen);
  69. free(pbuf); pclose(fp);
  70. return -1;
  71. }
  72. pbuf = p;
  73. blen = dlen+onelen;
  74. }
  75. }
  76. pclose(fp);
  77. nd->pbuf = pbuf;
  78. nd->dlen = dlen;
  79. nd->blen = blen;
  80. return 0;
  81. }
  82. ////////////////////////////////////////////////////////////////////
  83. int sys_reboot(void)
  84. {
  85. int r=0;
  86. r = system("reboot -f");
  87. if(r) {
  88. LOGE("sys_reboot failed!\n");
  89. return -1;
  90. }
  91. return r;
  92. }
  93. #include "upgrade.h"
  94. int sys_set_factory(void)
  95. {
  96. int r=0;
  97. #ifdef KEY_PARAS_IN_FILE
  98. r = paras_reset();
  99. #else
  100. char dir[100],tmp[200];
  101. extern GlobalDeviceManager __globalDeviceManage;
  102. sqlite_deinit(&__globalDeviceManage.db);
  103. sys_get_path(dir, "");
  104. snprintf(tmp, "cp -f %s/%s %s/%s", dir, DATABASE_BAK_NAME, dir, DATABASE_NAME);
  105. LOGD("___ %s\n", tmp);
  106. r = system(tmp);
  107. if(r==0) {
  108. r = set_net(&DFLT_PARAS.dev._network_info);
  109. if(r==0) {
  110. exit(0);
  111. }
  112. }
  113. #endif
  114. return r;
  115. }
  116. int sys_get_path(char *path, char *name)
  117. {
  118. char tmp[500];
  119. pid_t pid = getpid();
  120. snprintf(tmp, sizeof(tmp), "/proc/%d/exe", pid);
  121. readlink(tmp, path, sizeof(tmp));
  122. char *p = strrchr(path, '/');
  123. if(p && strlen(path)>1) {
  124. *p = 0;
  125. if(p && strlen(name)>0) {
  126. strcat(path, "/");
  127. strcat(path, name);
  128. }
  129. }
  130. return 0;
  131. }
  132. ////////////////////////////////////////////////
  133. #include <net/if.h>
  134. #include <sys/socket.h>
  135. #include <net/route.h>
  136. #include <sys/ioctl.h>
  137. #include <netinet/in.h>
  138. #include <arpa/inet.h>
  139. #include <unistd.h>
  140. #include <net/if.h>
  141. #include <ifaddrs.h>
  142. #include <netinet/in.h>
  143. #include <linux/if_link.h>
  144. #include <linux/netlink.h>
  145. #include <linux/rtnetlink.h>
  146. void print_net(char*s, NetworkInfo_t *p)
  147. {
  148. LOGD("__%s__net.mode: %d\n", s, p->mode);
  149. LOGD("__%s__net.addr: %s\n", s, p->ip_address);
  150. LOGD("__%s__net.mask: %s\n", s, p->mask);
  151. LOGD("__%s__net.gateway: %s\n", s, p->gateway);
  152. LOGD("__%s__net.dns1: %s\n", s, p->dns1);
  153. LOGD("__%s__net.dns2: %s\n", s, p->dns2);
  154. }
  155. void print_modbus(char*s, ModbusInfo_t *p)
  156. {
  157. LOGD("__%s__mbus.mode: %d\n", s, p->product_modbus_type);
  158. LOGD("__%s__mbus.addr: %d\n", s, p->product_modbus_baud);
  159. LOGD("__%s__mbus.mask: %d\n", s, p->product_modbus_addr);
  160. LOGD("__%s__mbus.mask: %s\n", s, p->product_relay_ctrl_port);
  161. }
  162. static int set_ipaddr(int family, const char* iface, const char* addr, const char* netmask)
  163. {
  164. struct ifreq ifr;
  165. struct sockaddr_in *sin;
  166. struct sockaddr_in6 *sin6;
  167. int fd = socket(family, SOCK_DGRAM, 0);
  168. if (fd < 0) {
  169. LOGD("socket SOCK_DGRAM failed\n");
  170. return -1;
  171. }
  172. strcpy(ifr.ifr_name, iface);
  173. sin = (struct sockaddr_in*)&ifr.ifr_addr;
  174. sin6 = (struct sockaddr_in6*)&ifr.ifr_addr;
  175. if(family==AF_INET) {
  176. sin->sin_family = family;
  177. sin->sin_port = 0;
  178. inet_pton(family, addr, &sin->sin_addr);
  179. if (ioctl(fd, SIOCSIFADDR, &ifr) < 0) {
  180. LOGD("ioctl SIOCSIFADDR \n");
  181. close(fd);
  182. return -1;
  183. }
  184. sin->sin_family = family;
  185. inet_pton(family, netmask, &sin->sin_addr);
  186. if (ioctl(fd, SIOCSIFNETMASK, &ifr) < 0) {
  187. LOGD("ioctl SIOCSIFNETMASK \n");
  188. close(fd);
  189. return -1;
  190. }
  191. }
  192. else {
  193. sin6->sin6_family = family;
  194. sin6->sin6_port = 0;
  195. inet_pton(family, addr, &sin6->sin6_addr);
  196. if (ioctl(fd, SIOCSIFADDR, &ifr) < 0) {
  197. LOGD("ioctl SIOCSIFADDR \n");
  198. close(fd);
  199. return -1;
  200. }
  201. sin6->sin6_family = family;
  202. inet_pton(family, netmask, &sin6->sin6_addr);
  203. if (ioctl(fd, SIOCSIFNETMASK, &ifr) < 0) {
  204. LOGD("ioctl SIOCSIFNETMASK \n");
  205. close(fd);
  206. return -1;
  207. }
  208. }
  209. close(fd);
  210. return 0;
  211. }
  212. static int get_ipaddr(int family, char* iface, char* addr, char* netmask)
  213. {
  214. struct ifaddrs *ifap, *ifa;
  215. if (getifaddrs(&ifap) == -1) {
  216. LOGE("getifaddrs() error\n");
  217. return -1;
  218. }
  219. for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
  220. if (ifa->ifa_addr != NULL && ifa->ifa_addr->sa_family == family) {
  221. if(family==IP_V4) {
  222. struct sockaddr_in *sa,*msk;
  223. sa = (struct sockaddr_in *) ifa->ifa_addr;
  224. msk = (struct sockaddr_in *) ifa->ifa_netmask;
  225. inet_ntop(family, &sa->sin_addr, addr, INET6_ADDRSTRLEN);
  226. inet_ntop(family, &msk->sin_addr, netmask, INET6_ADDRSTRLEN);
  227. }
  228. else {
  229. struct sockaddr_in6 *sa,*msk;
  230. sa = (struct sockaddr_in6 *) ifa->ifa_addr;
  231. msk = (struct sockaddr_in6 *) ifa->ifa_netmask;
  232. inet_ntop(family, &sa->sin6_addr, addr, INET6_ADDRSTRLEN);
  233. inet_ntop(family, &msk->sin6_addr, netmask, INET6_ADDRSTRLEN);
  234. }
  235. }
  236. }
  237. freeifaddrs(ifap);
  238. return 0;
  239. }
  240. static int set_gateway(int family, const char* gateway)
  241. {
  242. struct rtentry rt;
  243. int fd;
  244. fd = socket(family, SOCK_DGRAM, 0);
  245. if (fd < 0) {
  246. LOGE("socket SOCK_DGRAM failed\n");
  247. return -1;
  248. }
  249. memset(&rt, 0, sizeof(rt));
  250. if(family==AF_INET) {
  251. struct sockaddr_in* sin;
  252. sin = (struct sockaddr_in*)&rt.rt_gateway;
  253. sin->sin_family = family;
  254. sin->sin_port = 0;
  255. inet_pton(family, gateway, &sin->sin_addr);
  256. sin = (struct sockaddr_in*)&rt.rt_dst;
  257. sin->sin_family = family;
  258. sin->sin_addr.s_addr = 0;
  259. }
  260. else {
  261. struct sockaddr_in6* sin;
  262. sin = (struct sockaddr_in6*)&rt.rt_gateway;
  263. sin->sin6_family = family;
  264. sin->sin6_port = 0;
  265. inet_pton(family, gateway, &sin->sin6_addr);
  266. sin = (struct sockaddr_in6*)&rt.rt_dst;
  267. sin->sin6_family = family;
  268. //sin->sin6_addr.s_addr[0] = 0;
  269. }
  270. rt.rt_flags = RTF_GATEWAY;
  271. if (ioctl(fd, SIOCADDRT, &rt) < 0) {
  272. LOGE("ioctl SIOCADDRT failed\n");
  273. close(fd);
  274. return -1;
  275. }
  276. close(fd);
  277. return 0;
  278. }
  279. static int get_gateway(int family, const char* gateway)
  280. {
  281. #if 0
  282. int sockfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
  283. if (sockfd == -1) {
  284. log_e("set_gateway, socket AF_NETLINK error\n");
  285. return -1;
  286. }
  287. struct sockaddr_nl sa;
  288. memset(&sa, 0, sizeof(sa));
  289. sa.nl_family = AF_NETLINK;
  290. if (bind(sockfd, (struct sockaddr *) &sa, sizeof(sa)) == -1) {
  291. log_e("set_gateway, bind error\n");
  292. return -1;
  293. }
  294. struct nlreq req;
  295. memset(&req, 0, sizeof(req));
  296. req.hdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
  297. req.hdr.nlmsg_type = RTM_GETROUTE;
  298. req.hdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP;
  299. req.msg.rtm_family = family;
  300. req.msg.rtm_table = RT_TABLE_MAIN;
  301. req.msg.rtm_protocol = RTPROT_UNSPEC;
  302. req.msg.rtm_scope = RT_SCOPE_UNIVERSE;
  303. req.msg.rtm_type = RTN_UNICAST;
  304. struct iovec iov;
  305. memset(&iov, 0, sizeof(iov));
  306. iov.iov_base = &req;
  307. iov.iov_len = req.hdr.nlmsg_len;
  308. struct msghdr msg;
  309. memset(&msg, 0, sizeof(msg));
  310. msg.msg_name = &sa;
  311. msg.msg_namelen = sizeof(sa);
  312. msg.msg_iov = &iov;
  313. msg.msg_iovlen = 1;
  314. char buf[BUFSIZE];
  315. memset(buf, 0, sizeof(buf));
  316. struct nlmsghdr *hdr;
  317. int len;
  318. if (sendmsg(sockfd, &msg, 0) == -1) {
  319. log_e("set_gateway, sendmsg error\n");
  320. return -1;
  321. }
  322. while ((len = recv(sockfd, buf, sizeof(buf), 0)) > 0) {
  323. for (hdr = (struct nlmsghdr *) buf; NLMSG_OK(hdr, len); hdr = NLMSG_NEXT(hdr, len)) {
  324. if (hdr->nlmsg_type == NLMSG_DONE) {
  325. goto finish;
  326. }
  327. if (hdr->nlmsg_type == NLMSG_ERROR) {
  328. log_e("set_gateway, NLMSG_ERROR\n");
  329. return -1;
  330. }
  331. struct rtmsg *rt = (struct rtmsg *) NLMSG_DATA(hdr);
  332. if (rt->rtm_family != family || rt->rtm_table != RT_TABLE_MAIN || rt->rtm_type != RTN_UNICAST) {
  333. continue;
  334. }
  335. struct rtattr *attr;
  336. int attrlen;
  337. for (attr = (struct rtattr *) RTM_RTA(rt), attrlen = RTM_PAYLOAD(hdr); RTA_OK(attr, attrlen); attr = RTA_NEXT(attr, attrlen)) {
  338. if (attr->rta_type == RTA_GATEWAY) {
  339. char gw_addr[INET_ADDRSTRLEN];
  340. struct in_addr addr;
  341. memcpy(&addr, RTA_DATA(attr), sizeof(addr));
  342. if (inet_ntop(family, &addr, gateway, INET6_ADDRSTRLEN) == NULL) {
  343. log_e("set_gateway, inet_ntop error\n");
  344. continue;
  345. }
  346. printf("Gateway address: %s\n", gw_addr);
  347. log_i("set_gateway, Gateway address: %s\n");
  348. goto finish;
  349. }
  350. }
  351. }
  352. }
  353. finish:
  354. close(sockfd);
  355. #endif
  356. return 0;
  357. }
  358. static int set_dhcp(int on)
  359. {
  360. return 0;
  361. }
  362. static int set_dns(int family, const char* iface, char* dns1, char *dns2)
  363. {
  364. int fd;
  365. struct ifreq ifr;
  366. #if 0
  367. fd = socket(family, SOCK_DGRAM, 0);
  368. if (fd < 0) {
  369. log_e("socket SOCK_DGRAM failed\n");
  370. return -1;
  371. }
  372. memset(&ifr, 0, sizeof(ifr));
  373. strncpy(ifr.ifr_name, iface, sizeof(ifr.ifr_name));
  374. struct sockaddr_in* addr = (struct sockaddr_in*)&ifr.ifr_addr;
  375. addr->sin_family = family;
  376. inet_pton(family, dns1, &addr->sin_addr);
  377. if (ioctl(fd, SIOCSIFDNS, &ifr) < 0) {
  378. log_e("socket SIOCSIFDNS failed\n");
  379. close(fd);
  380. return -1;
  381. }
  382. #endif
  383. close(fd);
  384. return 0;
  385. }
  386. static int get_dns(int family, const char* iface, char* dns1, char *dns2)
  387. {
  388. return 0;
  389. }
  390. static int ip_check(char* addr)
  391. {
  392. int flag = IP_ERR;
  393. int len = 0;
  394. int num = 0;
  395. int Count = 0;
  396. int first = 0;
  397. int i = 0,j=0;
  398. len = strlen(addr);
  399. if (strchr(addr,'.') != NULL) {// 含 .的情况,判断是否是IPv4
  400. for(i = 0;i <= len-1; i++) {
  401. if(addr[i] >= '0' && addr[i] <= '9') {
  402. num = num * 10 + addr[i] - '0';
  403. }
  404. else if(addr[i] == '.') {
  405. if((i == 0)||(i == len-1)) {
  406. break;
  407. }
  408. if(addr[i-1] < '0' || addr[i-1] > '9') {
  409. break;
  410. }
  411. if(addr[i] == '.') {
  412. Count++;
  413. if(Count > 3) {
  414. break;
  415. }
  416. }
  417. if(num > 255) {
  418. break;
  419. }
  420. if(num != 0 && addr[first] == '0') {
  421. break;
  422. }
  423. first = i+1;
  424. num = 0;
  425. }
  426. else {
  427. break;
  428. }
  429. }
  430. if(Count == 3) {
  431. flag = IP_V4;
  432. }
  433. }
  434. else if (strchr(addr,':') != NULL) {// 含 :的情况,判断是否是IPv6
  435. for(i = 0;i <= len-1; i++) {
  436. if((addr[i] >= '0' && addr[i] <= '9')||(tolower(addr[i]) >= 'a' && tolower(addr[i]) <= 'f')) {
  437. j++;
  438. if (j > 4) {
  439. break;
  440. }
  441. }
  442. else if(addr[i] == ':') {
  443. if((i == 0)||(i == len-1)) {
  444. break;
  445. }
  446. if (j == 0) {
  447. break;
  448. }
  449. Count++;
  450. if(Count > 7) {
  451. break;
  452. }
  453. j = 0;
  454. }
  455. else {
  456. break;
  457. }
  458. }
  459. if((Count == 7)&&(j <= 4))
  460. {
  461. flag = IP_V6;
  462. }
  463. }
  464. return flag;
  465. }
  466. ///////////////////////////////////////////////
  467. static int file_length(char* path)
  468. {
  469. int r;
  470. struct stat st;
  471. r = stat(path, &st);
  472. if (r) {
  473. return -1;
  474. }
  475. return st.st_size;
  476. }
  477. static int file_save(char *path, void *buf, int len)
  478. {
  479. int r;
  480. FILE *fp;
  481. fp = fopen(path, "w");
  482. if(!fp) {
  483. LOGE("file_save, fopen %s failed, %d, %d\n", path);
  484. return -1;
  485. }
  486. r = fwrite(buf, 1, len, fp);
  487. if(r!=len) {
  488. LOGE("file_save %s failed, %d, %d\n", path, r, len);
  489. r = -1;
  490. }
  491. else {
  492. r = 0;
  493. }
  494. fclose(fp);
  495. return r;
  496. }
  497. static int file_load(char* path, void* buf, int len)
  498. {
  499. int r;
  500. FILE* fp;
  501. fp = fopen(path, "r");
  502. if (!fp) {
  503. LOGE("file_load, fopen %s failed, %d, %d\n", path);
  504. return -1;
  505. }
  506. r = fread(buf, 1, len, fp);
  507. if (r != len) {
  508. LOGE("file_load %s failed, %d, %d\n", path, r, len);
  509. r = -1;
  510. }
  511. else {
  512. r = 0;
  513. }
  514. fclose(fp);
  515. return r;
  516. }
  517. typedef struct {
  518. char lo[500];
  519. char e0[500];
  520. char e1[500];
  521. }net_t;
  522. static net_t sNet;
  523. typedef uint32_t u32;
  524. #define XLEN(a,b) ((u32)(a)-(u32)(b))
  525. typedef struct {
  526. char *ptr;
  527. int len;
  528. }nic_t;
  529. static int find_str(char *buf, char *head, char *tail, char *nic)
  530. {
  531. int len;
  532. char *p,*p1,*p2;
  533. p1 = strstr(buf, head);
  534. p2 = strstr(buf, tail);
  535. if(p1 && p2) {
  536. p1 = p1 + sizeof(head);
  537. len = XLEN(p2,p1);
  538. if(len>0) {
  539. p = malloc(len+1);
  540. if(p) {
  541. memcpy(p, p1, len); p[len] = 0;
  542. if(strstr(p, nic)) {
  543. return p1;
  544. }
  545. free(p);
  546. }
  547. }
  548. }
  549. return NULL;
  550. }
  551. static int get_nic(char *nbuf, int nlen, char *nic, char *fbuf, int flen)
  552. {
  553. int r,len;
  554. char *p,*p1,*p2;
  555. char *fend=fbuf+flen-1;
  556. p = fbuf;
  557. while(p<fend) {
  558. p1 = find_str(p, "auto", "\n", nic);
  559. if(p1) {
  560. p2 = strstr(p1+1, "auto");
  561. if(!p2) {
  562. p2 = fend;
  563. }
  564. len = XLEN(p2,p1);
  565. if(nlen>=len) {
  566. memcpy(nbuf, p1, len);
  567. nbuf[len] = 0;
  568. //LOGD("__x__%s:\n %s\n", nic, nbuf);
  569. return 0;
  570. }
  571. else {
  572. LOGD("___ nbuf is too small\n");
  573. }
  574. }
  575. p = p+1;
  576. }
  577. return -1;
  578. }
  579. static int get_ip(char *nbuf, char *token, char *ipaddr)
  580. {
  581. int cnt=0;
  582. char *p,*p1,*p2;
  583. p = strstr(nbuf, token);
  584. if(p) {
  585. while(!isdigit(*p)) p++;
  586. p1 = p;
  587. while(!isspace(*p)) p++;
  588. p2 = p;
  589. for(p=p1; p<p2; p++) {
  590. if(isgraph(*p)) {
  591. ipaddr[cnt++] = *p;
  592. }
  593. }
  594. ipaddr[cnt] = 0;
  595. }
  596. }
  597. static int get_net(NetworkInfo_t *para)
  598. {
  599. char *fpath=FILE_INTERFACE;
  600. int xlen=10*1000;
  601. net_t *pNet=&sNet;
  602. int flen=file_length(fpath);
  603. char *fbuf=malloc(xlen);
  604. if(!fbuf) {
  605. LOGE("___ malloc %d failed\n", flen);
  606. return -1;
  607. }
  608. file_load(fpath, fbuf, flen);
  609. fbuf[flen] = 0;
  610. get_nic(pNet->lo, sizeof(pNet->lo), "lo", fbuf, flen);
  611. get_nic(pNet->e0, sizeof(pNet->e0), "eth0", fbuf, flen);
  612. get_nic(pNet->e1, sizeof(pNet->e1), "eth1", fbuf, flen);
  613. if(strstr(pNet->e0, "dhcp")) {
  614. para->mode = 0;
  615. }
  616. else if(strstr(pNet->e0, "static")) {
  617. para->mode = 1;
  618. }
  619. get_ip(pNet->e0, "address", para->ip_address);
  620. get_ip(pNet->e0, "netmask", para->mask);
  621. get_ip(pNet->e0, "gateway", para->gateway);
  622. free(fbuf);
  623. return 0;
  624. }
  625. static int set_net(NetworkInfo_t *para)
  626. {
  627. int r;
  628. char *p1,*p2,*p3,*p4;
  629. char *fpath=FILE_INTERFACE;
  630. int xlen=10*1000;
  631. NetworkInfo_t para2;
  632. net_t *pNet=&sNet;
  633. memset(&para2, 0, sizeof(para2));
  634. get_net(&para2);
  635. if(para->mode<2 && para->mode!=para2.mode) {
  636. para2.mode = para->mode;
  637. }
  638. if(ip_check(para->ip_address) && strcmp(para->ip_address, para2.ip_address)) {
  639. strcpy(para2.ip_address, para->ip_address);
  640. }
  641. if(ip_check(para->mask) && strcmp(para->mask, para2.mask)) {
  642. strcpy(para2.mask, para->mask);
  643. }
  644. if(ip_check(para->gateway) && strcmp(para->gateway, para2.gateway)) {
  645. strcpy(para2.gateway, para->gateway);
  646. }
  647. char *fbuf=malloc(xlen);
  648. if(!fbuf) {
  649. LOGE("___ malloc %d failed\n", xlen);
  650. return -1;
  651. }
  652. #if 0
  653. file_load(fpath, fbuf, flen);
  654. fbuf[flen] = 0;
  655. get_nic(pNet->lo, sizeof(pNet->lo), "lo", fbuf, flen);
  656. get_nic(pNet->e1, sizeof(pNet->e1), "eth1", fbuf, flen);
  657. snprintf(pNet->e0, sizeof(pNet->e0), "auto eth0\niface eth0 inet %s\n address %s\n netmask %s\n gateway %s\n\n",
  658. para2.mode?"static":"dhcp", para2.ip_address, para2.mask, para2.gateway);
  659. strcpy(fbuf, pNet->lo);
  660. strcat(fbuf, pNet->e0);
  661. strcat(fbuf, pNet->e1);
  662. #else
  663. char *lo="auto lo\niface lo inet loopback\n\n";
  664. char *eth1="auto eth1\niface eth1 inet dhcp\npre-up /etc/network/nfs_check\nwait-delay 5\nhostname $(hostname)\n";
  665. char eth0[500];
  666. snprintf(eth0, sizeof(eth0), "auto eth0\niface eth0 inet %s\n address %s\n netmask %s\n gateway %s\n\n",
  667. para2.mode?"static":"dhcp", para2.ip_address, para2.mask, para2.gateway);
  668. sprintf(fbuf, "%s%s%s", lo, eth0, eth1);
  669. #endif
  670. //LOGD("___interfaces___:\n%s", fbuf);
  671. r = file_save(fpath, fbuf, strlen(fbuf));
  672. free(fbuf);
  673. if(r==0) {
  674. paras_get()->dev._network_info = para2;
  675. }
  676. return r;
  677. }
  678. //////////////////////////////////////////////////////////////////////////////
  679. int sys_set_net(NetworkInfo_t *para, int ipVersion)
  680. {
  681. int r,ipv;
  682. #ifdef USE_BASH
  683. char cmd[200];
  684. snprintf(cmd, sizeof(cmd), "ip addr flush dev %s", DFLT_NIC);
  685. r = system(cmd);
  686. if(r) {
  687. LOGE("set ipaddr failed\n");
  688. return -1;
  689. }
  690. snprintf(cmd, sizeof(cmd), "ip addr add %s/%s dev %s", para->ip_address, para->mask, DFLT_NIC);
  691. r = system(cmd);
  692. if(r) {
  693. LOGE("set netmask %s failed\n", para->mask);
  694. return -1;
  695. }
  696. snprintf(cmd, sizeof(cmd), "ip route add default via %s dev %s", para->gateway, DFLT_NIC);
  697. r = system(cmd);
  698. if(r) {
  699. LOGE("set gateway %s failed\n", para->gateway);
  700. return -1;
  701. }
  702. snprintf(cmd, sizeof(cmd), "ip link set dev %s up", DFLT_NIC);
  703. r = system(cmd);
  704. if(r) {
  705. LOGE("restart %s failed\n", DFLT_NIC);
  706. return -1;
  707. }
  708. #elif defined USE_FILE
  709. NetworkInfo_t para2;
  710. r = get_net(&para2);
  711. if(r==0 && memcmp(para, &para2, sizeof(NetworkInfo_t))) {
  712. r = set_net(para);
  713. }
  714. else {
  715. LOGE("get_net failed\n");
  716. }
  717. #elif defined USE_API
  718. if(para->mode==IP_DHCP) {
  719. r = set_dhcp(1);
  720. }
  721. else {
  722. set_dhcp(0);
  723. int family=(ipv==IP_V4)?AF_INET:AF_INET6;
  724. r = set_ipaddr(family, "eth0", para->ip_address, para->mask);
  725. if(r) {
  726. LOGE("set_ipaddr failed\n");
  727. return r;
  728. }
  729. r = set_gateway(family, para->gateway);
  730. if(r) {
  731. LOGE("set_gateway failed\n");
  732. return r;
  733. }
  734. r = set_dns(family, "eth0", para->dns1, para->dns2);
  735. if(r) {
  736. LOGE("set_dns failed\n");
  737. return r;
  738. }
  739. }
  740. #endif
  741. system("ifdown eth0 && ifup eth0");
  742. //system("重启dns服务器"); //目前dns服务未启动
  743. return r;
  744. }
  745. int sys_get_net(NetworkInfo_t *para, int ipVersion)
  746. {
  747. int r;
  748. int family=AF_INET;
  749. #ifdef USE_BASH
  750. #elif defined USE_FILE
  751. r = get_net(para);
  752. #elif defined USE_API
  753. r = get_ipaddr(family, DFLT_NIC, para->ip_address, para->mask);
  754. if(r) {
  755. LOGE("set_ipaddr failed\n");
  756. return r;
  757. }
  758. r = get_gateway(family, para->gateway);
  759. if(r) {
  760. LOGE("set_gateway failed\n");
  761. return r;
  762. }
  763. r = get_dns(family, DFLT_NIC, para->dns1, para->dns2);
  764. if(r) {
  765. LOGE("set_dns failed\n");
  766. return r;
  767. }
  768. #endif
  769. return 0;
  770. }
  771. static thread_handle_t myThdHandles[THREAD_ID_MAX]={0};
  772. int sys_start_thread(int id, thread_fn fn, void *arg)
  773. {
  774. int r;
  775. pthread_attr_t attr;
  776. if(id>=THREAD_ID_MAX) {
  777. return -1;
  778. }
  779. thread_handle_t *h=&myThdHandles[id];
  780. h->arg = arg;
  781. h->quit = 0;
  782. pthread_attr_init(&attr);
  783. //pthread_attr_setstacksize(&attr, 1024*1024*2);
  784. r = pthread_create(&h->tid, NULL, fn, h);
  785. return r;
  786. }
  787. int sys_stop_thread(int id)
  788. {
  789. if(id>=THREAD_ID_MAX) {
  790. return -1;
  791. }
  792. thread_handle_t *h=&myThdHandles[id];
  793. h->quit = 1;
  794. #ifdef USE_WEBAPP
  795. if(id==THREAD_ID_WEB) {
  796. extern void httpStopEndpoints();
  797. httpStopEndpoints();
  798. }
  799. #endif
  800. pthread_join(h->tid, NULL);
  801. h->tid = 0;
  802. h->arg = NULL;
  803. h->fn = NULL;
  804. return 0;
  805. }
  806. int sys_stop_all_thread(void)
  807. {
  808. int i;
  809. for(i=0; i<THREAD_ID_MAX; i++) {
  810. sys_stop_thread(i);
  811. }
  812. return 0;
  813. }