sys.c 47 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957
  1. #include <sys/types.h>
  2. #include <sys/stat.h>
  3. #include <sys/statvfs.h>
  4. #include <fcntl.h>
  5. #include <dirent.h>
  6. #include <signal.h>
  7. #include <sys/wait.h>
  8. #include <unistd.h>
  9. #include <string.h>
  10. #include <limits.h>
  11. #include "elog.h"
  12. #include "sys.h"
  13. #include "upgrade.h"
  14. #include "paras.h"
  15. #include "cfg.h"
  16. #include "file.h"
  17. #include "lock.h"
  18. #include "qrc.h"
  19. #include "thread.h"
  20. #include "shell.h"
  21. #include "common.h"
  22. #include "sqlite_handle.h"
  23. #include "language_hashmap.h"
  24. #include "wifi.h"
  25. #if (CHIP_TYPE != CHIP_T113s)
  26. #include <sys/sysinfo.h>
  27. #endif
  28. #if 1
  29. #define LOGE log_e
  30. #define LOGW log_w
  31. #define LOGD log_d
  32. #else
  33. #define LOGD printf
  34. #define LOGW printf
  35. #define LOGE printf
  36. #endif
  37. //#define USE_BASH
  38. #define USE_FILE
  39. //#define USE_API
  40. #define DFLT_NIC "eth0"
  41. //#define FILE_NET "/root/interfaces"
  42. #define FILE_NET "/etc/network/interfaces"
  43. #define FILE_DNS "/etc/dnsmasq.conf"
  44. static int net_check(void);
  45. static int get_pid(char *proc);
  46. static int get_net(NetworkInfo_t *para, int ipv);
  47. static int set_net(NetworkInfo_t *para, int ipv);
  48. static void nic_restart(void)
  49. {
  50. NetworkInfo_t info;
  51. char *p=getLocalIpAddress(DFLT_NIC);
  52. if(p==NULL) {
  53. system("ifdown eth0;ifup eth0;sleep 2");
  54. }
  55. }
  56. static int is_mac_fixed(void)
  57. {
  58. const char *path="/usr/bin/docker";
  59. if(access(path,0)==0) { //docker存在则是老版镜像,每次重启mac不固定, 为随机值
  60. return 0;
  61. }
  62. return 1;
  63. }
  64. static void nic_set_mac(void)
  65. {
  66. #if (CHIP_TYPE == CHIP_T113i)
  67. //if(is_mac_fixed()) return; //如果是t113i新版镜像,mac地址跟id绑定,不需要写固定值进去
  68. #endif
  69. system("ip link set dev eth0 address `cat /sys/class/addr_mgt/addr_eth`");
  70. }
  71. ////////////////////////////////////////////////////////////////////
  72. int sys_reboot(void)
  73. {
  74. int r=0;
  75. r = system("reboot");
  76. if(r) {
  77. LOGE("sys_reboot failed!\n");
  78. return -1;
  79. }
  80. return r;
  81. }
  82. #include "upgrade.h"
  83. int sys_set_factory(void)
  84. {
  85. int r=0;
  86. char dir[200],src[400],dst[400];
  87. GlobalDeviceManager *dm=&__globalDeviceManage;
  88. sqlite_deinit(dm->db, &dm->dbThreadlock);
  89. sys_get_path(dir, "");
  90. LOGD("___ curdir: %s\n", dir);
  91. snprintf(src, sizeof(src), "%s/%s", dir, DATABASE_BAK_NAME);
  92. snprintf(dst, sizeof(dst), "%s/%s", dir, DATABASE_NAME);
  93. LOGD("__1__ file_copy from %s to %s\n", src, dst);
  94. char sysorder[100];
  95. snprintf(sysorder, sizeof(sysorder), "cp -f %s %s", src, dst);
  96. // r = file_copy(dst, src);
  97. r = system(sysorder);
  98. LOGD("__1__ file_copy r=%d!\n", r);
  99. if(0) {
  100. r = paras_reset();
  101. }
  102. else {
  103. snprintf(src, sizeof(src), "%s/%s", dir, INI_FILE_BAK_NAME);
  104. snprintf(dst, sizeof(dst), "%s/%s", dir, INI_FILE_NAME);
  105. LOGD("__2__ file_copy from %s to %s\n", src, dst);
  106. char sysorder1[100];
  107. snprintf(sysorder1, sizeof(sysorder1), "cp -f %s %s", src, dst);
  108. // r = file_copy(dst, src);
  109. r = system(sysorder1);
  110. LOGD("__2__ file_copy r=%d!\n", r);
  111. }
  112. #if 0
  113. r = set_net(&DFLT_PARAS.dev._network_info, IP_V4);
  114. if(r) {
  115. LOGE("____ set_net failed\n");
  116. return -1;
  117. }
  118. #endif
  119. LOGD("____ exit smartPDU now ...\n");
  120. exit(0);
  121. return r;
  122. }
  123. int sys_get_path(char *path, char *name)
  124. {
  125. int r,n;
  126. char *p,tmp[500];
  127. pid_t pid = getpid();
  128. snprintf(tmp, sizeof(tmp), "/proc/%d/exe", pid);
  129. n = readlink(tmp, path, sizeof(tmp));
  130. if(n>0 && n<sizeof(tmp)) {
  131. path[n] = 0;
  132. p = strrchr(path, '/');
  133. if(p && strlen(path)>1) {
  134. *p = 0;
  135. if(name && strlen(name)>0) {
  136. strcat(path, "/");
  137. strcat(path, name);
  138. }
  139. }
  140. return 0;
  141. }
  142. return -1;
  143. }
  144. ////////////////////////////////////////////////
  145. #include <net/if.h>
  146. #include <sys/socket.h>
  147. #include <net/route.h>
  148. #include <sys/ioctl.h>
  149. #include <netinet/in.h>
  150. #include <arpa/inet.h>
  151. #include <unistd.h>
  152. #include <net/if.h>
  153. #include <ifaddrs.h>
  154. #include <netinet/in.h>
  155. #include <linux/if.h>
  156. #include <linux/if_link.h>
  157. #include <linux/netlink.h>
  158. #include <linux/rtnetlink.h>
  159. void print_net(char*s, NetworkInfo_t *p)
  160. {
  161. LOGD("__%s__net.mode: %d\n", s, p->mode);
  162. LOGD("__%s__net.addr: %s\n", s, p->ip_address);
  163. LOGD("__%s__net.mask: %s\n", s, p->mask);
  164. LOGD("__%s__net.gateway: %s\n", s, p->gateway);
  165. LOGD("__%s__net.dns1: %s\n", s, p->dns1);
  166. LOGD("__%s__net.dns2: %s\n", s, p->dns2);
  167. }
  168. void print_modbus(char*s, ModbusInfo_t *p)
  169. {
  170. LOGD("__%s__mbus.mode: %d\n", s, p->mode);
  171. LOGD("__%s__mbus.addr: %d\n", s, p->addr);
  172. LOGD("__%s__mbus.baud: %d\n", s, p->baudrate);
  173. LOGD("__%s__mbus.path: %s\n", s, p->path);
  174. }
  175. static int set_ipaddr(int family, const char* iface, const char* addr, const char* netmask)
  176. {
  177. struct ifreq ifr;
  178. struct sockaddr_in *sin;
  179. struct sockaddr_in6 *sin6;
  180. int fd = socket(family, SOCK_DGRAM, 0);
  181. if (fd < 0) {
  182. LOGD("socket SOCK_DGRAM failed\n");
  183. return -1;
  184. }
  185. strcpy(ifr.ifr_name, iface);
  186. sin = (struct sockaddr_in*)&ifr.ifr_addr;
  187. sin6 = (struct sockaddr_in6*)&ifr.ifr_addr;
  188. if(family==AF_INET) {
  189. sin->sin_family = family;
  190. sin->sin_port = 0;
  191. inet_pton(family, addr, &sin->sin_addr);
  192. if (ioctl(fd, SIOCSIFADDR, &ifr) < 0) {
  193. LOGD("ioctl SIOCSIFADDR \n");
  194. close(fd);
  195. return -1;
  196. }
  197. sin->sin_family = family;
  198. inet_pton(family, netmask, &sin->sin_addr);
  199. if (ioctl(fd, SIOCSIFNETMASK, &ifr) < 0) {
  200. LOGD("ioctl SIOCSIFNETMASK \n");
  201. close(fd);
  202. return -1;
  203. }
  204. }
  205. else {
  206. sin6->sin6_family = family;
  207. sin6->sin6_port = 0;
  208. inet_pton(family, addr, &sin6->sin6_addr);
  209. if (ioctl(fd, SIOCSIFADDR, &ifr) < 0) {
  210. LOGD("ioctl SIOCSIFADDR \n");
  211. close(fd);
  212. return -1;
  213. }
  214. sin6->sin6_family = family;
  215. inet_pton(family, netmask, &sin6->sin6_addr);
  216. if (ioctl(fd, SIOCSIFNETMASK, &ifr) < 0) {
  217. LOGD("ioctl SIOCSIFNETMASK \n");
  218. close(fd);
  219. return -1;
  220. }
  221. }
  222. close(fd);
  223. return 0;
  224. }
  225. static int get_ipaddr(int family, char *iface, char *addr, char *netmask)
  226. {
  227. int r=-1;
  228. struct ifaddrs *ifap, *ifa;
  229. if (getifaddrs(&ifap) == -1) {
  230. LOGE("___getifaddrs() error\n");
  231. return -1;
  232. }
  233. for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
  234. if (ifa->ifa_addr != NULL && ifa->ifa_addr->sa_family == family) {
  235. if(family==AF_INET) {
  236. struct sockaddr_in *sa,*msk;
  237. sa = (struct sockaddr_in *) ifa->ifa_addr;
  238. msk = (struct sockaddr_in *) ifa->ifa_netmask;
  239. if(addr) {
  240. char *p = (char*)inet_ntop(family, &sa->sin_addr, addr, INET6_ADDRSTRLEN);
  241. if(p && strcmp(p, "127.0.0.1") && strcmp(p, "172.17.0.1")) {
  242. //printf("___addr4: %s\n", addr);
  243. r = 0;
  244. }
  245. }
  246. if(netmask) {
  247. inet_ntop(family, &msk->sin_addr, netmask, INET6_ADDRSTRLEN);
  248. //printf("___netmask4: %s\n", netmask);
  249. }
  250. if(r==0) break;
  251. }
  252. else {
  253. struct sockaddr_in6 *sa,*msk;
  254. sa = (struct sockaddr_in6 *) ifa->ifa_addr;
  255. msk = (struct sockaddr_in6 *) ifa->ifa_netmask;
  256. if(addr) {
  257. char *p = (char*)inet_ntop(family, &sa->sin6_addr, addr, INET6_ADDRSTRLEN);
  258. if(p && strcmp(p, "::1")) {
  259. //printf("___addr6: %s\n", addr);
  260. r = 0;
  261. }
  262. }
  263. if(netmask) {
  264. inet_ntop(family, &msk->sin6_addr, netmask, INET6_ADDRSTRLEN);
  265. //printf("___netmask6: %s\n", netmask);
  266. }
  267. if(r==0) break;
  268. }
  269. }
  270. }
  271. freeifaddrs(ifap);
  272. return r;
  273. }
  274. static int set_gateway(int family, const char* gateway)
  275. {
  276. struct rtentry rt;
  277. int fd;
  278. fd = socket(family, SOCK_DGRAM, 0);
  279. if (fd < 0) {
  280. LOGE("socket SOCK_DGRAM failed\n");
  281. return -1;
  282. }
  283. memset(&rt, 0, sizeof(rt));
  284. if(family==AF_INET) {
  285. struct sockaddr_in* sin;
  286. sin = (struct sockaddr_in*)&rt.rt_gateway;
  287. sin->sin_family = family;
  288. sin->sin_port = 0;
  289. inet_pton(family, gateway, &sin->sin_addr);
  290. sin = (struct sockaddr_in*)&rt.rt_dst;
  291. sin->sin_family = family;
  292. sin->sin_addr.s_addr = 0;
  293. }
  294. else {
  295. struct sockaddr_in6* sin;
  296. sin = (struct sockaddr_in6*)&rt.rt_gateway;
  297. sin->sin6_family = family;
  298. sin->sin6_port = 0;
  299. inet_pton(family, gateway, &sin->sin6_addr);
  300. sin = (struct sockaddr_in6*)&rt.rt_dst;
  301. sin->sin6_family = family;
  302. //sin->sin6_addr.s_addr[0] = 0;
  303. }
  304. rt.rt_flags = RTF_GATEWAY;
  305. if (ioctl(fd, SIOCADDRT, &rt) < 0) {
  306. LOGE("ioctl SIOCADDRT failed\n");
  307. close(fd);
  308. return -1;
  309. }
  310. close(fd);
  311. return 0;
  312. }
  313. static int get_gateway(int family, const char* gateway)
  314. {
  315. #if 0
  316. int sockfd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
  317. if (sockfd == -1) {
  318. log_e("set_gateway, socket AF_NETLINK error\n");
  319. return -1;
  320. }
  321. struct sockaddr_nl sa;
  322. memset(&sa, 0, sizeof(sa));
  323. sa.nl_family = AF_NETLINK;
  324. if (bind(sockfd, (struct sockaddr *) &sa, sizeof(sa)) == -1) {
  325. log_e("set_gateway, bind error\n");
  326. return -1;
  327. }
  328. struct nlreq req;
  329. memset(&req, 0, sizeof(req));
  330. req.hdr.nlmsg_len = NLMSG_LENGTH(sizeof(struct rtmsg));
  331. req.hdr.nlmsg_type = RTM_GETROUTE;
  332. req.hdr.nlmsg_flags = NLM_F_REQUEST | NLM_F_DUMP;
  333. req.msg.rtm_family = family;
  334. req.msg.rtm_table = RT_TABLE_MAIN;
  335. req.msg.rtm_protocol = RTPROT_UNSPEC;
  336. req.msg.rtm_scope = RT_SCOPE_UNIVERSE;
  337. req.msg.rtm_type = RTN_UNICAST;
  338. struct iovec iov;
  339. memset(&iov, 0, sizeof(iov));
  340. iov.iov_base = &req;
  341. iov.iov_len = req.hdr.nlmsg_len;
  342. struct msghdr msg;
  343. memset(&msg, 0, sizeof(msg));
  344. msg.msg_name = &sa;
  345. msg.msg_namelen = sizeof(sa);
  346. msg.msg_iov = &iov;
  347. msg.msg_iovlen = 1;
  348. char buf[BUFSIZE];
  349. memset(buf, 0, sizeof(buf));
  350. struct nlmsghdr *hdr;
  351. int len;
  352. if (sendmsg(sockfd, &msg, 0) == -1) {
  353. log_e("set_gateway, sendmsg error\n");
  354. return -1;
  355. }
  356. while ((len = recv(sockfd, buf, sizeof(buf), 0)) > 0) {
  357. for (hdr = (struct nlmsghdr *) buf; NLMSG_OK(hdr, len); hdr = NLMSG_NEXT(hdr, len)) {
  358. if (hdr->nlmsg_type == NLMSG_DONE) {
  359. goto finish;
  360. }
  361. if (hdr->nlmsg_type == NLMSG_ERROR) {
  362. log_e("set_gateway, NLMSG_ERROR\n");
  363. return -1;
  364. }
  365. struct rtmsg *rt = (struct rtmsg *) NLMSG_DATA(hdr);
  366. if (rt->rtm_family != family || rt->rtm_table != RT_TABLE_MAIN || rt->rtm_type != RTN_UNICAST) {
  367. continue;
  368. }
  369. struct rtattr *attr;
  370. int attrlen;
  371. for (attr = (struct rtattr *) RTM_RTA(rt), attrlen = RTM_PAYLOAD(hdr); RTA_OK(attr, attrlen); attr = RTA_NEXT(attr, attrlen)) {
  372. if (attr->rta_type == RTA_GATEWAY) {
  373. char gw_addr[INET_ADDRSTRLEN];
  374. struct in_addr addr;
  375. memcpy(&addr, RTA_DATA(attr), sizeof(addr));
  376. if (inet_ntop(family, &addr, gateway, INET6_ADDRSTRLEN) == NULL) {
  377. log_e("set_gateway, inet_ntop error\n");
  378. continue;
  379. }
  380. printf("Gateway address: %s\n", gw_addr);
  381. log_i("set_gateway, Gateway address: %s\n");
  382. goto finish;
  383. }
  384. }
  385. }
  386. }
  387. finish:
  388. close(sockfd);
  389. #endif
  390. return 0;
  391. }
  392. static int set_dhcp(int on)
  393. {
  394. int r;
  395. char tmp[200],path[100];
  396. sprintf(path, "/var/run/udhcpc_%s.pid", DFLT_NIC);
  397. sprintf(tmp, "kill $(cat %s)", path);
  398. r = system(tmp);
  399. if(on) {
  400. sprintf(tmp, "udhcpc -R -b -t 1 -A 1 -i %s -p %s –s /usr/share/udhcpc/default.script", DFLT_NIC, path);
  401. r = system(tmp);
  402. }
  403. return r;
  404. }
  405. static int is_number(char *str)
  406. {
  407. while (*str) {
  408. if (!isdigit(*str)) {
  409. return 0;
  410. }
  411. str++;
  412. }
  413. return 1;
  414. }
  415. static int ip_check(char* addr)
  416. {
  417. int flag=IP_ERR;
  418. struct in_addr addr4;
  419. struct in6_addr addr6;
  420. if (inet_pton(AF_INET, addr, &addr4) == 1) {
  421. flag = IP_V4;
  422. } else if (inet_pton(AF_INET6, addr, &addr6) == 1) {
  423. flag = IP_V6;
  424. }
  425. if(flag==IP_ERR) {
  426. LOGE("____ wrong ip addr: %s\n", addr);
  427. }
  428. return flag;
  429. }
  430. static int is_ipv6_prefix(char *ss)
  431. {
  432. if(is_number(ss)) {
  433. int val = atoi(ss);
  434. if(val>1 && val<128) {
  435. return 1;
  436. }
  437. }
  438. return 0;
  439. }
  440. ///////////////////////////////////////////////
  441. typedef struct {
  442. char lo[1000];
  443. char e0[1000];
  444. char e1[1000];
  445. }interface_t;
  446. typedef uint32_t u32;
  447. #define XLEN(a,b) ((u32)(a)-(u32)(b))
  448. typedef struct {
  449. char *ptr;
  450. int len;
  451. }nic_t;
  452. static int get_nic(char *nbuf, int nlen, char *nic, char *fbuf, int flen)
  453. {
  454. int r,xlen;
  455. char tmp[20];
  456. char *p1,*p2;
  457. char *fend=fbuf+flen-1;
  458. sprintf(tmp, "auto %s", nic);
  459. p1 = strstr(fbuf, tmp);
  460. if(!p1) {
  461. return -1;
  462. }
  463. p2 = strstr(p1+1, "auto");
  464. if(!p2 || p2>fend) {
  465. p2 = fend;
  466. }
  467. xlen = XLEN(p2,p1);
  468. memcpy(nbuf, p1, xlen);
  469. nbuf[xlen] = 0;
  470. return 0;
  471. }
  472. static int get_ip(char *nbuf, char *token, char *ipaddr, int ipv)
  473. {
  474. int cnt=0;
  475. char *p,*p1,*p2;
  476. char *pbuf=NULL;
  477. if(ipv==IP_V4) {
  478. pbuf = strstr(nbuf, "inet");
  479. }
  480. else {
  481. pbuf = strstr(nbuf, "inet6");
  482. }
  483. if(pbuf==NULL) {
  484. LOGE("___get_ip, not found inet or inet6\n");
  485. return -1;
  486. }
  487. p = strstr(pbuf, token);
  488. if(p) {
  489. p += strlen(token);
  490. while(isspace(*p)) p++;
  491. p1 = p;
  492. while(!isspace(*p)) p++;
  493. p2 = p;
  494. for(p=p1; p<p2; p++) {
  495. if(isgraph(*p)) {
  496. ipaddr[cnt++] = *p;
  497. }
  498. }
  499. ipaddr[cnt] = 0;
  500. return 0;
  501. }
  502. return -1;
  503. }
  504. static int get_dns(char *nbuf, char *dns1, char *dns2)
  505. {
  506. int cnt;
  507. char *p1,*p2;
  508. char *token="server=";
  509. p1 = strstr(nbuf, token);
  510. if(p1==NULL) {
  511. dns1[0] = 0;
  512. return -1;
  513. }
  514. p1 += strlen(token); cnt=0;
  515. while(!isspace(*p1)) {
  516. dns1[cnt++] = *p1;
  517. p1++;
  518. }
  519. dns1[cnt] = 0;
  520. p2 = strstr(p1, token);
  521. if(p2==NULL) {
  522. dns2[0] = 0;
  523. return -1;
  524. }
  525. p2 += strlen(token); cnt=0;
  526. while(!isspace(*p2)) {
  527. dns2[cnt++] = *p2;
  528. p2++;
  529. }
  530. dns2[cnt] = 0;
  531. return 0;
  532. }
  533. static int set_dns(NetworkInfo_t *para)
  534. {
  535. int r;
  536. char tmp[100];
  537. char buf[500];
  538. LOGD("_____ set_dns\n");
  539. int chk1=ip_check(para->dns1);
  540. int chk2=ip_check(para->dns2);
  541. if( chk1==IP_ERR && chk2==IP_ERR) {
  542. LOGE("___ dns1 and dns2 are all wrong!\n");
  543. return -1;
  544. }
  545. memset(buf, 0, sizeof(buf));
  546. strcpy(buf, "interface=eth0\nno-hosts\nno-resolv\n\n");
  547. if(chk1) {
  548. sprintf(tmp, "server=%s\n", para->dns1);
  549. strcat(buf, tmp);
  550. }
  551. if(chk2) {
  552. sprintf(tmp, "server=%s\n", para->dns2);
  553. strcat(buf, tmp);
  554. }
  555. r = file_save(FILE_DNS, buf, strlen(buf))+1;
  556. if(r==0) {
  557. #if(CHIP_TYPE == CHIP_T113s)
  558. system("mkdir -p /var/run");
  559. #endif
  560. system("killall dnsmasq; /usr/sbin/dnsmasq &");
  561. }
  562. return r;
  563. }
  564. static int get_net(NetworkInfo_t *para, int ipv)
  565. {
  566. int r;
  567. char *p=NULL;
  568. interface_t intf;
  569. buf_t fbuf;
  570. r = file_load(FILE_NET, &fbuf);
  571. if(r) {
  572. return -1;
  573. }
  574. memset(&intf, 0, sizeof(intf));
  575. get_nic(intf.lo, sizeof(intf.lo), "lo", fbuf.buf, fbuf.dlen);
  576. get_nic(intf.e0, sizeof(intf.e0), "eth0", fbuf.buf, fbuf.dlen);
  577. get_nic(intf.e1, sizeof(intf.e1), "eth1", fbuf.buf, fbuf.dlen);
  578. p = strstr(intf.e0, (ipv==IP_V4)?"inet":"inet6");
  579. if(p==NULL) {
  580. LOGE("___get_ipv%d, %s not found!\n", (ipv==IP_V4)?4:6, (ipv==IP_V4)?"inet":"inet6");
  581. free(fbuf.buf); return -1;
  582. }
  583. if(strstr(p, "dhcp")) {
  584. para->mode = 0;
  585. }
  586. else if(strstr(p, "static")) {
  587. para->mode = 1;
  588. } else {
  589. LOGE("___get_net, dhcp/static not found!\n");
  590. free(fbuf.buf); return -1;
  591. }
  592. get_ip(p, "address", para->ip_address, ipv);
  593. get_ip(p, "netmask", para->mask, ipv);
  594. get_ip(p, "gateway", para->gateway, ipv);
  595. free(fbuf.buf);
  596. r = file_load(FILE_DNS, &fbuf);
  597. if(r) {
  598. return -1;
  599. }
  600. get_dns(fbuf.buf, para->dns1, para->dns2);
  601. if (para->mode == 0)
  602. {
  603. int r1;
  604. int family = AF_INET;
  605. r1 = get_ipaddr(family, DFLT_NIC, para->ip_address, para->mask);
  606. if (r1)
  607. {
  608. LOGE("get_ipaddr failed\n");
  609. }
  610. r1 = get_gateway(family, para->gateway);
  611. if (r1)
  612. {
  613. LOGE("get_gateway failed\n");
  614. }
  615. }
  616. return 0;
  617. }
  618. static int nw_check(NetworkInfo_t *para, int ipv)
  619. {
  620. if(ipv==IP_V4) {
  621. if((ip_check(para->ip_address)!=IP_V4) || (ip_check(para->mask)!=IP_V4) || (ip_check(para->gateway)!=IP_V4)) {
  622. return -1;
  623. }
  624. }
  625. else {
  626. if((ip_check(para->ip_address)!=IP_V6) || (!is_ipv6_prefix(para->mask)) || (ip_check(para->gateway)!=IP_V6)) {
  627. return -1;
  628. }
  629. }
  630. return 0;
  631. }
  632. static int set_net(NetworkInfo_t *para, int ipv)
  633. {
  634. int r,ipv2;
  635. char *p1,*p2,*p3,*p4;
  636. int flen=100*1000;
  637. NetworkInfo_t info4,info6,*info;
  638. get_net(&info4, IP_V4);
  639. get_net(&info6, IP_V6);
  640. info = ((ipv==IP_V4)?&info4:&info6);
  641. if(para->mode<2 && para->mode!=info->mode) {
  642. info->mode = para->mode;
  643. }
  644. ipv2 = ip_check(para->ip_address);
  645. if((ipv==ipv2) && strcmp(para->ip_address, info->ip_address)) {
  646. strcpy(info->ip_address, para->ip_address);
  647. }
  648. if(ipv==IP_V4) {
  649. ipv2 = ip_check(para->mask);
  650. }
  651. else {
  652. ipv2=is_ipv6_prefix(para->mask)?IP_V6:IP_ERR;
  653. }
  654. if((ipv==ipv2) && strcmp(para->mask, info->mask)) {
  655. strcpy(info->mask, para->mask);
  656. }
  657. ipv2 = ip_check(para->gateway);
  658. if((ipv==ipv2) && strcmp(para->gateway, info->gateway)) {
  659. strcpy(info->gateway, para->gateway);
  660. }
  661. char *fbuf=malloc(flen);
  662. if(!fbuf) {
  663. LOGE("___ malloc %d failed\n", flen);
  664. return -1;
  665. }
  666. #if 0
  667. file_load(FILE_NET, fbuf);
  668. get_nic(pNet->lo, sizeof(pNet->lo), "lo", fbuf, flen);
  669. get_nic(pNet->e1, sizeof(pNet->e1), "eth1", fbuf, flen);
  670. snprintf(pNet->e0, sizeof(pNet->e0), "auto eth0\niface eth0 inet %s\n address %s\n netmask %s\n gateway %s\n\n",
  671. info4.mode?"static":"dhcp", info4.ip_address, info4.mask, info4.gateway);
  672. strcpy(fbuf, pNet->lo);
  673. strcat(fbuf, pNet->e0);
  674. strcat(fbuf, pNet->e1);
  675. #else
  676. char *lo="auto lo\niface lo inet loopback\n\n";
  677. char *eth1="auto eth1\niface eth1 inet dhcp\npre-up /etc/network/nfs_check\nwait-delay 5\nhostname $(hostname)\n";
  678. char eth0[1000];
  679. int chk4=nw_check(&info4, IP_V4);
  680. int chk6=nw_check(&info6, IP_V6);
  681. char temp[400];
  682. strcpy(eth0, "auto eth0\n");
  683. if(chk4==0) {
  684. 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);
  685. strcat(eth0, temp);
  686. }
  687. if(chk6==0) {
  688. 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);
  689. strcat(eth0, temp);
  690. }
  691. sprintf(fbuf, "%s%s%s", lo, eth0, eth1);
  692. #endif
  693. //LOGD("___interfaces___:\n%s", fbuf);
  694. r = file_save(FILE_NET, fbuf, strlen(fbuf)); free(fbuf);
  695. return r;
  696. }
  697. //////////////////////////////////////////////////////////////////////////////
  698. int sys_set_net(NetworkInfo_t *para, int ipVersion)
  699. {
  700. int r,ipv;
  701. #ifdef USE_BASH
  702. char cmd[200];
  703. snprintf(cmd, sizeof(cmd), "ip addr flush dev %s", DFLT_NIC);
  704. r = system(cmd);
  705. if(r) {
  706. LOGE("set ipaddr failed\n");
  707. return -1;
  708. }
  709. snprintf(cmd, sizeof(cmd), "ip addr add %s/%s dev %s", para->ip_address, para->mask, DFLT_NIC);
  710. r = system(cmd);
  711. if(r) {
  712. LOGE("set netmask %s failed\n", para->mask);
  713. return -1;
  714. }
  715. snprintf(cmd, sizeof(cmd), "ip route add default via %s dev %s", para->gateway, DFLT_NIC);
  716. r = system(cmd);
  717. if(r) {
  718. LOGE("set gateway %s failed\n", para->gateway);
  719. return -1;
  720. }
  721. snprintf(cmd, sizeof(cmd), "ip link set dev %s up", DFLT_NIC);
  722. r = system(cmd);
  723. if(r) {
  724. LOGE("restart %s failed\n", DFLT_NIC);
  725. return -1;
  726. }
  727. #elif defined USE_FILE
  728. NetworkInfo_t para2;
  729. r = get_net(&para2, ipVersion);
  730. if(r==0) {
  731. if(memcmp(para, &para2, sizeof(NetworkInfo_t))==0) {
  732. LOGW("%s NetworkInfo is same, no need to set\n", DFLT_NIC);
  733. return -1;
  734. }
  735. set_dns(para);
  736. r = set_net(para, ipVersion);
  737. if(r==0) {
  738. //system("ip addr flush dev eth0");
  739. //sprintf(eth0, "ip link set dev eth0 %s/%d && ip link set eth0 up && ip link set eth0 down", info->ip_address, info->netmask);
  740. //system(eth0);
  741. sys_reboot();
  742. //nic_restart(DFLT_NIC); sys_exit();
  743. }
  744. }
  745. else {
  746. LOGE("get_net failed\n");
  747. }
  748. #elif defined USE_API
  749. if(para->mode==IP_DHCP) {
  750. r = set_dhcp(1);
  751. }
  752. else {
  753. set_dhcp(0);
  754. int family=(ipv==IP_V4)?AF_INET:AF_INET6;
  755. r = set_ipaddr(family, "eth0", para->ip_address, para->mask);
  756. if(r) {
  757. LOGE("set_ipaddr failed\n");
  758. return r;
  759. }
  760. r = set_gateway(family, para->gateway);
  761. if(r) {
  762. LOGE("set_gateway failed\n");
  763. return r;
  764. }
  765. r = set_dns(family, "eth0", para->dns1, para->dns2);
  766. if(r) {
  767. LOGE("set_dns failed\n");
  768. return r;
  769. }
  770. }
  771. #endif
  772. return r;
  773. }
  774. int sys_get_net2(NetworkInfo_t *para,int ipVersion)
  775. {
  776. int r;
  777. char *p=NULL;
  778. interface_t intf;
  779. buf_t fbuf;
  780. r = file_load(FILE_NET, &fbuf);
  781. if(r) {
  782. return -1;
  783. }
  784. memset(&intf, 0, sizeof(intf));
  785. get_nic(intf.lo, sizeof(intf.lo), "lo", fbuf.buf, fbuf.dlen);
  786. get_nic(intf.e0, sizeof(intf.e0), "eth0", fbuf.buf, fbuf.dlen);
  787. get_nic(intf.e1, sizeof(intf.e1), "eth1", fbuf.buf, fbuf.dlen);
  788. p = strstr(intf.e0, (ipVersion==IP_V4)?"inet":"inet6");
  789. if(p==NULL) {
  790. LOGE("___get_ipv%d, %s not found!\n", (ipVersion==IP_V4)?4:6, (ipVersion==IP_V4)?"inet":"inet6");
  791. free(fbuf.buf); return -1;
  792. }
  793. if(strstr(p, "dhcp")) {
  794. para->mode = 0;
  795. }
  796. else if(strstr(p, "static")) {
  797. para->mode = 1;
  798. } else {
  799. LOGE("___get_net, dhcp/static not found!\n");
  800. free(fbuf.buf); return -1;
  801. }
  802. get_ip(p, "gateway", para->gateway, ipVersion);
  803. free(fbuf.buf);
  804. return 0;
  805. }
  806. int sys_get_net(NetworkInfo_t *para, int ipVersion)
  807. {
  808. int r;
  809. int family=AF_INET;
  810. #ifdef USE_BASH
  811. #elif defined USE_FILE
  812. r = get_net(para, ipVersion);
  813. #elif defined USE_API
  814. r = get_ipaddr(family, DFLT_NIC, para->ip_address, para->mask);
  815. if(r) {
  816. LOGE("get_ipaddr failed\n");
  817. return r;
  818. }
  819. r = get_gateway(family, para->gateway);
  820. if(r) {
  821. LOGE("get_gateway failed\n");
  822. return r;
  823. }
  824. r = get_dns(family, DFLT_NIC, para->dns1, para->dns2);
  825. if(r) {
  826. LOGE("get_dns failed\n");
  827. return r;
  828. }
  829. #endif
  830. return r;
  831. }
  832. int system_net(NetworkInfo_t *para)
  833. {
  834. int r = -1;
  835. int family=AF_INET;
  836. r = get_ipaddr(family, DFLT_NIC, para->ip_address, para->mask);
  837. if(r) {
  838. LOGE("get_dns failed\n");
  839. return r;
  840. }
  841. family = AF_INET6;
  842. r = get_ipaddr(family, DFLT_NIC, para->ip_v6_address, para->mask_v6);
  843. if(r) {
  844. LOGE("get_dns failed\n");
  845. return r;
  846. }
  847. r = get_gateway(family, para->gateway);
  848. if(r) {
  849. LOGE("get_dns failed\n");
  850. return r;
  851. }
  852. buf_t fbuf={0};
  853. r = file_load(FILE_DNS, &fbuf);
  854. if(r) {
  855. return -1;
  856. }
  857. get_dns(fbuf.buf, para->dns1, para->dns2);
  858. return 0;
  859. }
  860. const char *sys_get_ifname(int nic)
  861. {
  862. const char *ifname[NIC_MAX]={"eth0","eth1","usb0","wlan0"};
  863. return ifname[nic];
  864. }
  865. int sys_nic_connected(int nic, int timeout)
  866. {
  867. int fd,r=-1,ret;
  868. char ipaddr[64];
  869. sa_family_t family;
  870. struct ifaddrs *ifap, *ifa;
  871. const char *dstIP4="8.8.8.8";
  872. const char *dstIP6="2001:4860:4860::8888";
  873. const char *ifname=sys_get_ifname(nic);
  874. if (getifaddrs(&ifap) == -1) {
  875. LOGE("___getifaddrs error\n");
  876. return -1;
  877. }
  878. fd = socket(AF_INET, SOCK_STREAM, 0);
  879. if (fd<0) {
  880. freeifaddrs(ifap);
  881. return -1;
  882. }
  883. for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
  884. if (ifa->ifa_addr != NULL && strcmp(ifa->ifa_name, ifname)==0) {
  885. family = ifa->ifa_addr->sa_family;
  886. if(family==AF_INET) {
  887. struct sockaddr_in *sin=(struct sockaddr_in *)ifa->ifa_addr;
  888. inet_ntop(family, ifa->ifa_addr, ipaddr, INET6_ADDRSTRLEN);
  889. if(bind(fd, (struct sockaddr *)sin, sizeof(*sin))==0) {
  890. struct timeval tv={timeout/1000,(timeout%1000)*1000};
  891. struct sockaddr_in remote={0};
  892. setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv));
  893. remote.sin_family = AF_INET;
  894. remote.sin_port = htons(53);
  895. inet_pton(AF_INET, dstIP4, &remote.sin_addr);
  896. ret = connect(fd, (struct sockaddr *)&remote, sizeof(remote));
  897. close(fd);
  898. if(ret==0) {
  899. r = 0; break;
  900. }
  901. }
  902. }
  903. else {
  904. struct sockaddr_in6 *sin=(struct sockaddr_in6 *)ifa->ifa_addr;
  905. inet_ntop(family, ifa->ifa_addr, ipaddr, INET6_ADDRSTRLEN);
  906. if(bind(fd, (struct sockaddr *)sin, sizeof(*sin))==0) {
  907. struct timeval tv={timeout/1000,(timeout%1000)*1000};
  908. struct sockaddr_in6 remote={0};
  909. setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &tv, sizeof(tv));
  910. remote.sin6_family = AF_INET6;
  911. remote.sin6_port = htons(53);
  912. inet_pton(AF_INET6, dstIP6, &remote.sin6_addr);
  913. ret = connect(fd, (struct sockaddr *)&remote, sizeof(remote));
  914. close(fd);
  915. if(ret==0) {
  916. r = 0; break;
  917. }
  918. }
  919. }
  920. }
  921. }
  922. freeifaddrs(ifap);
  923. return r;
  924. }
  925. int sys_bind_nic(int nic, int fd)
  926. {
  927. struct ifreq ifr;
  928. const char *ifname=sys_get_ifname(nic);
  929. memset(&ifr, 0, sizeof(ifr));
  930. strncpy(ifr.ifr_name, ifname, IFNAMSIZ);
  931. if (setsockopt(fd, SOL_SOCKET, SO_BINDTODEVICE,(void *)&ifr, sizeof(ifr)) < 0) {
  932. LOGE("___setsockopt(SO_BINDTODEVICE) failed\n");
  933. return -1;
  934. }
  935. return 0;
  936. }
  937. int sys_route(int nic, char *gateway)
  938. {
  939. char tmp[200];
  940. sprintf(tmp, "ip route add default via %s dev %s", gateway, sys_get_ifname(nic));
  941. return system(tmp);
  942. }
  943. int sys_is_running(char *prog)
  944. {
  945. FILE *fp;
  946. int pid=0;
  947. char buf[20]={0};
  948. char command[200];
  949. snprintf(command, sizeof(command), "ps -ef | grep -v grep | grep -w -c %s", prog);
  950. fp = popen(command, "r");
  951. if (fp == NULL) {
  952. LOGE("execute %s failed: %s", command, strerror(errno));
  953. return 0;
  954. }
  955. if (fgets(buf, sizeof(buf), fp)) {
  956. pid = atoi(buf);
  957. }
  958. pclose(fp);
  959. return (pid)?1:0;
  960. }
  961. int sys_get_disk_ava_MB(char *path)
  962. {
  963. int r;
  964. struct statvfs st;
  965. r = statvfs(path, &st);
  966. if(r) {
  967. return -1;
  968. }
  969. int avaMB = (st.f_frsize*st.f_bavail)/(1024*1024);
  970. //int freeMB = (st.f_frsize*st.f_bfree)/(1024*1024);
  971. //printf("____ava: %dMB, free %dMB\n", avaMB, freeMB);
  972. LOGD("___ RomAvailable rom: %dMB\n", avaMB);
  973. return avaMB;
  974. }
  975. int sys_get_mem_ava_MB(void)
  976. {
  977. int r;
  978. long v1=0,v2=0;
  979. char buf[32];
  980. struct sysinfo info;
  981. #if 0
  982. r = sysinfo(&info);
  983. if(r) {
  984. return -1;
  985. }
  986. value = (info.freeram*info.mem_unit)/(1014*1024);
  987. #else
  988. FILE *fp = fopen("/proc/meminfo", "r");
  989. if(!fp) {
  990. return -1;
  991. }
  992. fscanf(fp, "MemTotal: %s kB\n", buf);
  993. fscanf(fp, "MemFree: %s kB\n", buf);
  994. v1 = atol(buf);
  995. fscanf(fp, "MemAvailable: %s kB\n", buf);
  996. v2 = atol(buf);
  997. fclose(fp);
  998. LOGD("___MemFree: %ldkB, MemAvailable: %ldkB\n", v1, v2);
  999. v2 /= 1024;
  1000. #endif
  1001. return v2;
  1002. }
  1003. int sys_get_mac(char *mac, int maclen)
  1004. {
  1005. int sock;
  1006. struct ifreq ifr;
  1007. if(!mac || maclen<6) {
  1008. return -1;
  1009. }
  1010. sock = socket(AF_INET, SOCK_DGRAM, 0);
  1011. if (sock == -1){
  1012. return -1;
  1013. }
  1014. strcpy(ifr.ifr_name, "eth0");
  1015. if (ioctl(sock, SIOCGIFHWADDR, &ifr) < 0){
  1016. close(sock); return -1;
  1017. }
  1018. close(sock);
  1019. uint8_t *p = (uint8_t*)ifr.ifr_hwaddr.sa_data;
  1020. snprintf(mac, maclen, "%02x%02x%02x%02x%02x%02x", p[0], p[1], p[2], p[3], p[4], p[5]);
  1021. return 0;
  1022. }
  1023. int sys_get_chip_id(int *id)
  1024. {
  1025. int sock;
  1026. struct ifreq ifr;
  1027. if(!id) {
  1028. return -1;
  1029. }
  1030. sock = socket(AF_INET, SOCK_DGRAM, 0);
  1031. if (sock == -1){
  1032. return -1;
  1033. }
  1034. strcpy(ifr.ifr_name, "eth0");
  1035. if (ioctl(sock, SIOCGIFHWADDR, &ifr) < 0){
  1036. close(sock); return -1;
  1037. }
  1038. close(sock);
  1039. *id = *((int*)ifr.ifr_hwaddr.sa_data);
  1040. return 0;
  1041. }
  1042. int sys_ip_check(char *ip)
  1043. {
  1044. return ip_check(ip);
  1045. }
  1046. ///////////////////////////////////////////////////////////////////////
  1047. #define MAX_BUFFER_SIZE 4096
  1048. static void* plug_thread(void *arg)
  1049. {
  1050. int nlSock;
  1051. struct sockaddr_nl srcAddr;
  1052. struct nlmsghdr *nlMsg;
  1053. char buffer[MAX_BUFFER_SIZE];
  1054. int plug_in=0,plug_out=0;
  1055. thread_handle_t *h=(thread_handle_t*)arg;
  1056. printf("___plug_thread start\n");
  1057. nlSock = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
  1058. if (nlSock < 0) {
  1059. printf("Failed to create Netlink socket");
  1060. goto quit;
  1061. }
  1062. memset(&srcAddr, 0, sizeof(srcAddr));
  1063. srcAddr.nl_family = AF_NETLINK;
  1064. srcAddr.nl_groups = RTMGRP_LINK | RTMGRP_NOTIFY;
  1065. if (bind(nlSock, (struct sockaddr *)&srcAddr, sizeof(srcAddr)) < 0) {
  1066. perror("Failed to bind Netlink socket");
  1067. close(nlSock);
  1068. goto quit;
  1069. }
  1070. int flags = fcntl(nlSock, F_GETFL, 0);
  1071. fcntl(nlSock, F_SETFL, flags | O_NONBLOCK);
  1072. while (h->quit==0) {
  1073. fd_set readSet;
  1074. FD_ZERO(&readSet);
  1075. FD_SET(nlSock, &readSet);
  1076. // 设置超时时间为 1 秒
  1077. struct timeval timeout;
  1078. timeout.tv_sec = 1;
  1079. timeout.tv_usec = 0;
  1080. // 监视 Netlink Socket 的可读状态
  1081. int result = select(nlSock + 1, &readSet, NULL, NULL, &timeout);
  1082. if (result == -1) {
  1083. perror("Failed to select");
  1084. goto quit;
  1085. } else if (result == 0) {
  1086. // 超时,没有新数据到达
  1087. //printf("Timeout\n");
  1088. continue;
  1089. }
  1090. if (FD_ISSET(nlSock, &readSet)) {
  1091. // 接收消息
  1092. int bytesRead = recv(nlSock, buffer, MAX_BUFFER_SIZE, 0);
  1093. if (bytesRead < 0) {
  1094. perror("Failed to receive message from Netlink socket");
  1095. close(nlSock);
  1096. goto quit;
  1097. }
  1098. // 遍历接收到的消息,获取到Netlink的消息头。
  1099. nlMsg = (struct nlmsghdr *)buffer;
  1100. while (NLMSG_OK(nlMsg, bytesRead)) {
  1101. if (nlMsg->nlmsg_type == NLMSG_DONE) {
  1102. break;
  1103. }
  1104. if (nlMsg->nlmsg_type == RTM_NEWLINK || nlMsg->nlmsg_type == RTM_DELLINK) {
  1105. //NLMSG_DATA()获取完整的ifinfomsg结构体的指针
  1106. //根据消息头nlMsg获取到其后面的数据部分ifinfomsg结构体的指针
  1107. struct ifinfomsg *ifInfo = (struct ifinfomsg *)NLMSG_DATA(nlMsg);
  1108. if (ifInfo->ifi_family == AF_UNSPEC) {
  1109. //获取路由信息的属性,以及消息负载的长度,通过这两个参数来判断本次的数据是否有效
  1110. struct rtattr *attribute = IFLA_RTA(ifInfo);
  1111. int attributeLen = IFLA_PAYLOAD(nlMsg);
  1112. while (RTA_OK(attribute, attributeLen)) {
  1113. char *ifaceName = (char *)RTA_DATA(attribute);
  1114. if ((attribute->rta_type == IFLA_IFNAME) && (strcmp(ifaceName, "eth0")==0)) {
  1115. //printf("____Interface: %s \n", ifaceName);
  1116. if((ifInfo->ifi_flags & IFF_LOWER_UP)) {
  1117. if(plug_in==0) {
  1118. system("ifup eth0");
  1119. printf("____eth0 plug in\n");
  1120. plug_in = 1; plug_out = 0;
  1121. }
  1122. }
  1123. else {
  1124. if(plug_out==0) {
  1125. system("ifdown eth0");
  1126. printf("____eth0 plug out\n");
  1127. plug_in = 0; plug_out = 1;
  1128. }
  1129. }
  1130. }
  1131. attribute = RTA_NEXT(attribute, attributeLen);
  1132. }
  1133. }
  1134. }
  1135. nlMsg = NLMSG_NEXT(nlMsg, bytesRead);
  1136. }
  1137. }
  1138. }
  1139. close(nlSock);
  1140. quit:
  1141. printf("___plug_thread exit\n");
  1142. pthread_exit(NULL);
  1143. }
  1144. ///////////////////////////////////////////////////////////
  1145. //#define RAM_DEBUG
  1146. //#define ROM_DEBUG
  1147. #ifdef RAM_DEBUG
  1148. #define RAM_THRD 50
  1149. #define RAM_PERIOD 1
  1150. #else
  1151. #if(CHIP_TYPE == CHIP_T113s)
  1152. #define RAM_THRD 15
  1153. #define RAM_PERIOD 30
  1154. #else
  1155. #define RAM_THRD 50
  1156. #define RAM_PERIOD 60
  1157. #endif
  1158. #endif
  1159. #ifdef ROM_DEBUG
  1160. #define ROM_THRD 50
  1161. #define ROM_PERIOD 1
  1162. #else
  1163. #if(CHIP_TYPE == CHIP_T113s)
  1164. #define ROM_THRD 30
  1165. #define ROM_PERIOD 40
  1166. #else
  1167. #define ROM_THRD 200
  1168. #define ROM_PERIOD 50
  1169. #endif
  1170. #endif
  1171. static void mem_check(void)
  1172. {
  1173. int avaMB,flag=0;
  1174. static uint32_t mem_cnt=0;
  1175. mem_cnt++;
  1176. if(mem_cnt%RAM_PERIOD==0) {
  1177. avaMB = sys_get_mem_ava_MB();
  1178. if(avaMB<RAM_THRD) {
  1179. LOGE("___ free mem less than %dMB, reboot now ...\n", RAM_THRD);
  1180. sys_reboot();
  1181. }
  1182. }
  1183. if(mem_cnt%ROM_PERIOD==0) {
  1184. #if(CHIP_TYPE != CHIP_T113s)
  1185. avaMB = sys_get_disk_ava_MB("/mnt/UDISK");
  1186. #else
  1187. avaMB = sys_get_disk_ava_MB("/mnt/UDISK");
  1188. #endif
  1189. if(avaMB<ROM_THRD) {
  1190. flag = 1;
  1191. }
  1192. dev_sql_set_overwrite(flag);
  1193. }
  1194. }
  1195. #include "mail.h"
  1196. #define SEND_PERIOD (5*60)
  1197. static int get_range(struct tm *t, time_t *from, time_t *to, int days)
  1198. {
  1199. time_t x1,x2;
  1200. struct tm t2=*t;
  1201. time_t start=mktime0(),secs=3600*24*days;
  1202. t2.tm_hour = 0;
  1203. t2.tm_min = 0;
  1204. t2.tm_sec = 0;
  1205. x2 = mktime(&t2)-1;
  1206. if((x2-start)<=secs) {
  1207. x1 = start;
  1208. }
  1209. else {
  1210. x1 = x2-secs+1;
  1211. }
  1212. *from = x1;
  1213. *to = x2;
  1214. return 0;
  1215. }
  1216. struct tm* get_curtime(void)
  1217. {
  1218. time_t cur = time(NULL);
  1219. return localtime(&cur);
  1220. }
  1221. #define TMP_DIR "/tmp/pdu"
  1222. static int tmp_create(void)
  1223. {
  1224. return mkdir(TMP_DIR, 0777);
  1225. }
  1226. static int tmp_remove(void)
  1227. {
  1228. char cmd[100];
  1229. sprintf(cmd, "rm -f %s/* > /dev/null", TMP_DIR);
  1230. return system(cmd);
  1231. }
  1232. static void send_by_mail(struct tm *tm, char *dir)
  1233. {
  1234. int r=-1;
  1235. char temp[200],sub[100];
  1236. char tmp1[100],tmp2[100];
  1237. char path[400];
  1238. GlobalDeviceManager *dm=&__globalDeviceManage;
  1239. ProductInfo_t *prod=&dm->_globalDevInfo.product;
  1240. static time_t sended_id=0;
  1241. time_t from,to;
  1242. get_range(tm, &from, &to, 1);
  1243. if(sended_id != from) {
  1244. path[0] = 0;
  1245. get_time_str2(tmp1,sizeof(tmp1),from);
  1246. get_time_str2(tmp2,sizeof(tmp2),to);
  1247. sprintf(temp, "%s/log_run_%s_%s.txt", dir, tmp1, tmp2);
  1248. r = dev_log_xport(0, from, to, temp);
  1249. if(r==0) {
  1250. strcat(path, temp);strcat(path, ";");
  1251. log_d("___ run log export ok\n");
  1252. }
  1253. else {
  1254. log_d("___ run log export failed\n");
  1255. }
  1256. sprintf(temp, "%s/log_opr_%s_%s.txt", dir, tmp1, tmp2);
  1257. r = dev_log_xport(1, from, to, temp);
  1258. if(r==0) {
  1259. strcat(path, temp);strcat(path, ";");
  1260. log_d("___ opr log export ok\n");
  1261. }
  1262. else {
  1263. log_e("___ opr log export failed\n");
  1264. }
  1265. sprintf(temp, "%s/power_%s_%s.csv", dir, tmp1, tmp2);
  1266. r = dev_power_xport(from, to, temp);
  1267. if(r==0) {
  1268. strcat(path, temp);strcat(path, ";");
  1269. log_d("___ power export ok\n");
  1270. }
  1271. else {
  1272. log_e("___ power export failed\n");
  1273. }
  1274. if(r==0) {
  1275. sprintf(sub, "%s %d power and log data", prod->name, prod->id);
  1276. r = mail_send(sub, NULL, path);
  1277. if(r==0) {
  1278. tmp_remove();
  1279. sended_id = from;
  1280. }
  1281. }
  1282. }
  1283. }
  1284. static void send_check(void)
  1285. {
  1286. static int file_flag=0;
  1287. static uint32_t send_cnt=0;
  1288. send_cnt++;
  1289. if(send_cnt%SEND_PERIOD==0) {
  1290. struct tm *tm=get_curtime();
  1291. if(tm->tm_hour==0) {
  1292. send_by_mail(tm, TMP_DIR);
  1293. file_flag = 1;
  1294. }
  1295. else if(tm->tm_hour==1 && file_flag) {
  1296. tmp_remove();
  1297. file_flag = 0;
  1298. SMS_SEND_COUNT=0;
  1299. }
  1300. }
  1301. }
  1302. //https://blog.csdn.net/weixin_47604497/article/details/136913868
  1303. #include <linux/watchdog.h>
  1304. static int wdog_fd=-1;
  1305. static int wdog_is_en(void)
  1306. {
  1307. GlobalDeviceManager *dm=&__globalDeviceManage;
  1308. MiscInfo_t *misc=&dm->_globalDevInfo.misc;
  1309. return misc->watchdog;
  1310. }
  1311. int sys_wdog_init(void)
  1312. {
  1313. int r=0;
  1314. if(wdog_is_en()) {
  1315. char *path="/dev/watchdog";
  1316. if(wdog_fd<0) {
  1317. wdog_fd = open(path, O_RDWR); //O_WRONLY
  1318. if(wdog_fd<0) {
  1319. printf("___ %s open failed\n", path);
  1320. return -1;
  1321. }
  1322. }
  1323. #if (CHIP_TYPE == CHIP_T113s)
  1324. int i,option,timeout;
  1325. struct watchdog_info info;
  1326. option = WDIOS_DISABLECARD;
  1327. r = ioctl(wdog_fd, WDIOC_SETOPTIONS, &option);
  1328. r = ioctl(wdog_fd, WDIOC_GETSUPPORT, &info);
  1329. if(r<0) {
  1330. log_w("___ %s getsupport failed\n", path);
  1331. return -1;
  1332. }
  1333. log_d("___ watchdog options: 0x%x\n", info.options&WDIOC_SETTIMEOUT);
  1334. timeout = 40;
  1335. r = ioctl(wdog_fd, WDIOC_SETTIMEOUT, &timeout);
  1336. if(r) {
  1337. log_w("______set__________ wdog set timeout: %d failed, errno: %d\n", timeout, errno);
  1338. }
  1339. option = WDIOS_ENABLECARD;
  1340. r = ioctl(wdog_fd, WDIOC_SETOPTIONS, &option);
  1341. #endif
  1342. }
  1343. return r;
  1344. }
  1345. int sys_wdog_feed(void)
  1346. {
  1347. int r=0;
  1348. if(wdog_is_en()) {
  1349. r = ioctl(wdog_fd, WDIOC_KEEPALIVE, 0);
  1350. //int t1=200,t2=0;
  1351. //r = ioctl(wdog_fd, WDIOC_SETTIMEOUT, &t1);
  1352. //printf("______set__________ wdog timeout: %d, errno: %d\n", r, errno);
  1353. //r = ioctl(wdog_fd, WDIOC_GETTIMEOUT, &t2);
  1354. //printf("________________ wdog timeout: %d\n", t2);
  1355. }
  1356. return r;
  1357. }
  1358. int sys_wdog_en(int flag)
  1359. {
  1360. if(wdog_is_en()) {
  1361. write(wdog_fd, flag?"1":"0", 1);
  1362. }
  1363. return 0;
  1364. }
  1365. static void sig_handler(int signo)
  1366. {
  1367. LOGD("___sig_handler, signo: %d\n", signo);
  1368. sys_wdog_en(0);
  1369. }
  1370. static void exit_handler(void)
  1371. {
  1372. LOGD("___exit_handler\n");
  1373. sys_wdog_en(0);
  1374. }
  1375. static void sig_init(void)
  1376. {
  1377. signal(SIGINT, sig_handler);
  1378. signal(SIGTERM, sig_handler);
  1379. signal(SIGKILL, sig_handler);
  1380. signal(SIGABRT, sig_handler);
  1381. signal(SIGFPE, sig_handler);
  1382. signal(SIGSEGV, sig_handler);
  1383. signal(SIGILL, sig_handler);
  1384. signal(SIGQUIT, sig_handler);
  1385. signal(SIGHUP, sig_handler);
  1386. signal(SIGBUS, sig_handler);
  1387. atexit(exit_handler);
  1388. }
  1389. static void* polling_thread(void *arg)
  1390. {
  1391. thread_handle_t *h=(thread_handle_t*)arg;
  1392. tmp_create();
  1393. while(h->quit==0) {
  1394. net_check();
  1395. mem_check();
  1396. #if(CHIP_TYPE != CHIP_T113S)
  1397. send_check();
  1398. #endif
  1399. sleep(1);
  1400. }
  1401. pthread_exit(NULL);
  1402. }
  1403. static char *str_get(char *buf, char *tok, char *dst, int dstlen)
  1404. {
  1405. int n=0;
  1406. char *t=dst,*p=strstr(buf,tok);
  1407. if(!p) {
  1408. return NULL;
  1409. }
  1410. while((*p)!=':') {
  1411. if((*p)=='\r' || (*p)=='\n') {
  1412. return NULL;
  1413. }
  1414. p++;
  1415. }
  1416. p++;
  1417. while((*p)!='"') {
  1418. if((*p)=='\r' || (*p)=='\n') {
  1419. return NULL;
  1420. }
  1421. p++;
  1422. }
  1423. p++;
  1424. while((*p)!='"') {
  1425. if((*p)=='\r' || (*p)=='\n') {
  1426. return NULL;
  1427. }
  1428. *dst++ = *p++;
  1429. n++;
  1430. if(n>=dstlen-1) {
  1431. LOGE("str_get %s, dst buf length %d is too small!\n", tok, dstlen);
  1432. return NULL;
  1433. }
  1434. }
  1435. *dst = 0;
  1436. return t;
  1437. }
  1438. int sys_get_prod(GlobalDeviceInfo *info)
  1439. {
  1440. int r;
  1441. char *p,*tok;
  1442. buf_t fbuf;
  1443. char path[100]={0};
  1444. r = file_load(INFO_FILE_PATH, &fbuf);
  1445. if(r) {
  1446. return -1;
  1447. }
  1448. tok = "product_name";
  1449. p = str_get(fbuf.buf, tok, info->product.pname, sizeof(info->product.pname));
  1450. if(p) LOGD("___%s:%s\n", tok, p);
  1451. tok = "product_sn";
  1452. p = str_get(fbuf.buf, tok, info->product.pnumber, sizeof( info->product.pnumber));
  1453. if(p) LOGD("___%s:%s\n", tok, p);
  1454. #if 0
  1455. tok = "device_name";
  1456. p = str_get(fbuf.buf, tok, info->product.name, sizeof( info->product.name));
  1457. if(p) LOGD("___%s:%s\n", tok, p);
  1458. #endif
  1459. tok = "device_no";
  1460. p = str_get(fbuf.buf, tok, info->product.number, sizeof(info->product.number));
  1461. if (p)
  1462. LOGD("___%s:%s\n", tok, p);
  1463. tok = "device_date";
  1464. p = str_get(fbuf.buf, tok, info->product.date, sizeof(info->product.date));
  1465. if(p) LOGD("___%s:%s\n", tok, p);
  1466. tok = "device_batch";
  1467. p = str_get(fbuf.buf, tok, info->product.batch, sizeof(info->product.batch));
  1468. if(p) LOGD("___%s:%s\n", tok, p);
  1469. tok = "service_name";
  1470. p = str_get(fbuf.buf, tok, info->service.name, sizeof(info->service.name));
  1471. if(p) LOGD("___%s:%s\n", tok, p);
  1472. tok = "service_site";
  1473. p = str_get(fbuf.buf, tok, info->service.site, sizeof(info->service.site));
  1474. if(p) LOGD("___%s:%s\n", tok, p);
  1475. tok = "service_mail";
  1476. p = str_get(fbuf.buf, tok, info->service.mail, sizeof(info->service.mail));
  1477. if(p) LOGD("___%s:%s\n", tok, p);
  1478. tok = "service_address";
  1479. p = str_get(fbuf.buf, tok, info->service.addr, sizeof(info->service.addr));
  1480. if(p) LOGD("___%s:%s\n", tok, p);
  1481. tok = "service_telephone";
  1482. p = str_get(fbuf.buf, tok, info->service.tele, sizeof(info->service.tele));
  1483. if(p) LOGD("___%s:%s\n", tok, p);
  1484. sys_get_path(path, "../web/img/shdh.png");
  1485. r = qrc_to_png(info->service.tele, path);
  1486. sys_get_path(path, "../web/img/sbh.png");
  1487. r = qrc_to_png(info->product.number, path);
  1488. free(fbuf.buf);
  1489. return 0;
  1490. }
  1491. int sys_chmod(void)
  1492. {
  1493. DIR *dir;
  1494. char path[200];
  1495. struct stat st;
  1496. struct dirent *entry;
  1497. sys_get_path(path, NULL);
  1498. dir = opendir(path);
  1499. if(!dir) {
  1500. return -1;
  1501. }
  1502. chdir(path);
  1503. while ((entry=readdir(dir))) {
  1504. lstat(entry->d_name, &st);
  1505. if(S_ISDIR(st.st_mode)) {
  1506. continue;
  1507. }
  1508. chmod(entry->d_name, S_IRWXG);
  1509. }
  1510. closedir(dir);
  1511. return 0;
  1512. }
  1513. //#include <sys/sysinfo.h>
  1514. int sys_heap_remain(void)
  1515. {
  1516. //long pages = sysconf(_SC_AVPHYS_PAGES); // 可用物理页数
  1517. //long page_size = sysconf(_SC_PAGESIZE); // 页面大小
  1518. //long memory_free = pages * page_size;
  1519. return 0;
  1520. }
  1521. int sys_get_ip_ver(char *addr)
  1522. {
  1523. return ip_check(addr);
  1524. }
  1525. static int net_check(void)
  1526. {
  1527. int r,pid;
  1528. char tmp[200],path[100];
  1529. char ipaddr[64],mask[64];
  1530. NetworkInfo_t net4,net6;
  1531. static uint32_t dhcp_cnt=0;
  1532. if(dhcp_cnt%10==0) {
  1533. //printf("__ dhcp check\n");
  1534. r = get_net(&net4, IP_V4);
  1535. if(r==0) {
  1536. r = get_ipaddr(AF_INET, DFLT_NIC, ipaddr, mask);
  1537. if(r) {
  1538. if(net4.mode==IP_DHCP) {
  1539. #if(CHIP_TYPE == CHIP_T113s)
  1540. // pid = get_pid("udhcpc");
  1541. // printf("___udhcpc pid: %d\n", pid);
  1542. // if(pid>=0) {
  1543. // kill(pid, SIGUSR2);
  1544. // }
  1545. #else
  1546. set_dhcp(1);
  1547. #endif
  1548. }
  1549. else {
  1550. sprintf(tmp, "ifconfig %s %s up", DFLT_NIC, ipaddr);
  1551. system(tmp);
  1552. }
  1553. }
  1554. }
  1555. r = get_net(&net6, IP_V6);
  1556. if(r==0) {
  1557. r = get_ipaddr(AF_INET6, DFLT_NIC, ipaddr, mask);
  1558. if(r) {
  1559. if(net6.mode==IP_DHCP) {
  1560. pid = get_pid("udhcpc6");
  1561. //printf("___udhcpc6 pid: %d\n", pid);
  1562. if(pid>=0) {
  1563. kill(pid, SIGUSR2);
  1564. }
  1565. }
  1566. else {
  1567. sprintf(tmp, "ip addr add %s/%s dev %s", ipaddr, mask, DFLT_NIC);
  1568. system(tmp);
  1569. sprintf(tmp, "ip link set dev %s up", DFLT_NIC);
  1570. system(tmp);
  1571. }
  1572. }
  1573. }
  1574. }
  1575. dhcp_cnt++;
  1576. return 0;
  1577. }
  1578. static void net_init(void)
  1579. {
  1580. nic_set_mac();
  1581. }
  1582. static int get_pid(char *proc)
  1583. {
  1584. DIR *dir;
  1585. int pid=-1;
  1586. struct dirent *entry;
  1587. dir = opendir("/proc");
  1588. if (!dir) {
  1589. return -1;
  1590. }
  1591. while ((entry = readdir(dir))) {
  1592. if (entry->d_type != DT_DIR || !isdigit(entry->d_name[0])) {
  1593. continue;
  1594. }
  1595. char path[500];
  1596. snprintf(path, sizeof(path), "/proc/%s/cmdline", entry->d_name);
  1597. FILE *f = fopen(path, "r");
  1598. if (f) {
  1599. char cmd[64];
  1600. if (fgets(cmd, sizeof(cmd), f) && strstr(cmd, proc)) {
  1601. pid = atoi(entry->d_name);
  1602. break;
  1603. }
  1604. fclose(f);
  1605. }
  1606. }
  1607. closedir(dir);
  1608. return pid;
  1609. }
  1610. int sys_kill(char *proc)
  1611. {
  1612. int status;
  1613. int pid=get_pid(proc);
  1614. if(pid<0) {
  1615. return -1;
  1616. }
  1617. kill(pid, SIGKILL);
  1618. waitpid(pid, &status, 0);
  1619. return 0;
  1620. }
  1621. int sys_restart_app(void)
  1622. {
  1623. #if (CHIP_TYPE == CHIP_T113s)
  1624. return system("reboot -f");
  1625. #else
  1626. return system("/etc/init.d/S90PDUApp restart");
  1627. #endif
  1628. }
  1629. #include "ui.h"
  1630. int sys_init(void)
  1631. {
  1632. //sig_init();
  1633. initLogger();
  1634. lock_s_init();
  1635. paras_init();
  1636. sys_chmod();
  1637. init_hash_table();
  1638. //net_init();
  1639. ui_init();
  1640. thread_start(THREAD_ID_POLLING, polling_thread, NULL);
  1641. return 0;
  1642. }
  1643. int sys_exit(void)
  1644. {
  1645. //abort();
  1646. exit(0);
  1647. return 0;
  1648. }