|
|
@@ -0,0 +1,203 @@
|
|
|
+#include <stdlib.h>
|
|
|
+#include <sys/types.h>
|
|
|
+#include <sys/stat.h>
|
|
|
+#include <fcntl.h>
|
|
|
+#include <unistd.h>
|
|
|
+#include <string.h>
|
|
|
+#include <pthread.h>
|
|
|
+#include "elog.h"
|
|
|
+
|
|
|
+typedef struct {
|
|
|
+ pthread_t thdId;
|
|
|
+ uint8_t stat;
|
|
|
+ uint32_t src;
|
|
|
+}upg_handle_t;
|
|
|
+typedef struct {
|
|
|
+ char *pbuf;
|
|
|
+ int dlen;
|
|
|
+ int blen;
|
|
|
+}node_t;
|
|
|
+
|
|
|
+#define TMP_FOLDER "/tmp/gowone"
|
|
|
+#define WEB_FOLDER "/root/web"
|
|
|
+#define APP_FOLDER "/root/app"
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+static upg_handle_t upgHandle;
|
|
|
+
|
|
|
+static int free_node(node_t *nd)
|
|
|
+{
|
|
|
+ if(!nd) {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ free(nd->pbuf);
|
|
|
+ nd->pbuf = NULL;
|
|
|
+ nd->dlen = 0;
|
|
|
+ nd->blen = 0;
|
|
|
+}
|
|
|
+
|
|
|
+static int exe_cmd(char *cmd, node_t *nd);
|
|
|
+{
|
|
|
+ int r=0;
|
|
|
+ FILE *fp=NULL;
|
|
|
+ char *pbuf=NULL;
|
|
|
+ int onelen=1000,
|
|
|
+ int dlen=0,blen=onelen;
|
|
|
+
|
|
|
+ pbuf = malloc(onelen);
|
|
|
+ if(!pbuf) {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ fp = popen(cmd, "r");
|
|
|
+ if (fp == NULL) {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ while(1) {
|
|
|
+ r = fread(pbuf+dlen, sizeof(char), onelen, fp);
|
|
|
+ if(r<=0) {
|
|
|
+ log_e("upgrade relloac %d failed\n", tlen+onelen);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ dlen += r;
|
|
|
+ if(dlen+onelen>blen) {
|
|
|
+ char* p = realloc(pbuf, dlen+onelen);
|
|
|
+ if(!p) {
|
|
|
+ log_e("upgrade relloac %d failed\n", dlen+onelen);
|
|
|
+ free(pbuf); pclose(fp);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ pbuf = p;
|
|
|
+ blen = dlen+onelen;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ pclose(fp);
|
|
|
+
|
|
|
+ nd->pbuf = pbuf;
|
|
|
+ nd->dlen = dlen;
|
|
|
+ nd->blen = blen;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+static int upg_file_copy(void)
|
|
|
+{
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+static int upg_file_remove(void)
|
|
|
+{
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+static int upg_file_check(void)
|
|
|
+{
|
|
|
+ int r;
|
|
|
+ char *path;
|
|
|
+
|
|
|
+ switch(upgHandle.src) {
|
|
|
+ case UPGRADE_SRC_TCP:
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case UPGRADE_SRC_HTTP:
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case UPGRADE_SRC_MQTT:
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case UPGRADE_SRC_UDISK:
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ case UPGRADE_SRC_RS485:
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+ break;
|
|
|
+
|
|
|
+ default:
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //fopen
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+static void* upgrade_thread(void *arg)
|
|
|
+{
|
|
|
+ while(1) {
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+/* @brief 升级初始化
|
|
|
+ 该函数将启动升级线程
|
|
|
+*/
|
|
|
+int upgrade_init(void)
|
|
|
+{
|
|
|
+ pthread_attr_t attr;
|
|
|
+ //_globalDeviceManager
|
|
|
+
|
|
|
+ memset(&upgHandle, 0, sizeof(upgHandle));
|
|
|
+
|
|
|
+ upgHandle.src = UPGRADE_SRC_NONE;
|
|
|
+ upgHandle.stat = UPGRADE_STAT_NONE;
|
|
|
+ upgHandle.thdId = 0;
|
|
|
+
|
|
|
+ pthread_create(&upgHandle.thdId, NULL,upgrade_thread, NULL);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+/* @brief 返回升级状态
|
|
|
+ 该函数将启动升级线程
|
|
|
+*/
|
|
|
+int upgrade_stat(UPGRADE_STAT *st)
|
|
|
+{
|
|
|
+ if(!st) {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ *st = upgHandle.stat;
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+int upgrade_set_src(UPGRADE_SRC src)
|
|
|
+{
|
|
|
+ upgHandle.src |= (src<<1);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|