sys.c 41 KB

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