Kaynağa Gözat

继续完善升级程序及工具
打包工具用pack2.sh(linux),pack2.bat(win)会导致权限丢失

guohui 2 yıl önce
ebeveyn
işleme
bccfe1672c

BIN
04-源码/03-核心板/output/out/web_temp/main


BIN
04-源码/03-核心板/output/out/web_temp/upgd


BIN
04-源码/03-核心板/output/out2/root/run/app/smartPDU


BIN
04-源码/03-核心板/output/out2/upgd


+ 4 - 4
04-源码/03-核心板/smart_pdu/src/app.c

@@ -712,8 +712,9 @@ int snmp_thread(void *arg)
 #include <errno.h>
 #include <sys/ipc.h> 
 #include <sys/msg.h>
-#include "../../upgd/upgrade.h"
-static key_t upgkey;
+#include "upgrade.h"
+
+static key_t upgkey=0;
 int upg_send(int evt)
 {
     int r,msgid;
@@ -745,7 +746,6 @@ static int upg_init(void)
 
 
 
-
 /// @brief 全局结构体初始化
 /// @param _globalDeviceManager 
 /// @return 
@@ -1361,7 +1361,7 @@ int _global_device_manage_init(GlobalDeviceManager* _globalDeviceManager)
     #endif
 
     //通知upgd,app已经运行起来
-    //app_run_notify();
+    upg_init();
     
     //等待
     pthread_join(_globalDeviceManager->dev_samp_thread,NULL);

+ 1 - 1
04-源码/03-核心板/smart_pdu/src/appweb_handle.c

@@ -5,7 +5,7 @@
 #include "sqlite_handle.h"
 #include "cJSON.h"
 #include "switch_ctrl.h"
-#include "../sys/sys.h"
+#include "sys.h"
 
 
 

+ 33 - 0
04-源码/03-核心板/tools/bat/pack2.bat

@@ -0,0 +1,33 @@
+@ECHO OFF
+
+SET TMP=pdutar
+SET TARGET=pdupkg
+
+SET CURDIR=%~dp0
+SET CURDIR=%CURDIR:~0,-1%
+
+SET OUTDIR=%CURDIR%\..\..\output
+
+SET NUM=%~1
+SET STRA=%~2
+SET OBJ1=%~3
+SET OBJ2=%~4
+
+SET RM=DEL /Q
+SET TAR=TAR  -czpf
+SET MER=%CURDIR%\..\merge\merge
+
+ECHO tar %TMP% ...
+%TAR% %OUTDIR%\%TMP%  -C %OUTDIR%\out2\  .
+IF %ERRORLEVEL% NEQ 0 (
+    ECHO tar failed
+    EXIT /B 1
+)
+
+ECHO merge %TMP% ...
+%MER%  %NUM% %STRA% %OBJ1% %OBJ2% %OUTDIR%\%TMP%
+IF %ERRORLEVEL% NEQ 0 (
+    ECHO merge failed
+    EXIT /B 1
+)
+

+ 1 - 1
04-源码/03-核心板/tools/bat/pack2.sh

@@ -10,7 +10,7 @@ TARGET=pdupkg
 
 FULLDIR=$(realpath $0)
 CURDIR=$(dirname $FULLDIR)
-MERG=../merge/merge
+MERG=$CURDIR/../merge/merge
 
 OUTDIR=$CURDIR/../../output
 

BIN
04-源码/03-核心板/tools/merge/merge


+ 26 - 18
04-源码/03-核心板/tools/merge/merge.cpp

@@ -11,15 +11,17 @@ static void print_md5(md5_t* m)
 	for (i = 0; i < 32; i++) {
 		printf("%c", m->data[i]);
 	}
+	printf("\n");
 }
 static void print_info(const char* s, upgrade_file_t* hdr, md5_t *m)
 {
 	printf("\n");
 	printf("__%s__hdr.magic:        0x%08x\n",  s, hdr->magic);
-	printf("__%s__hdr.obj.num:      %d\n",		s, hdr->obj.num);
-	printf("__%s__hdr.obj.stra:     %d\n",		s, hdr->obj.stra);
-	printf("__%s__hdr.obj.obj1:     %s\n",		s, hdr->obj.obj1);
-	printf("__%s__hdr.obj.obj2:     %s\n",		s, hdr->obj.obj2);
+	printf("__%s__hdr.obj.num:      %d\n",      s, hdr->obj.num);
+	printf("__%s__hdr.obj.stra:     %d\n",      s, hdr->obj.stra);
+	printf("__%s__hdr.obj.obj1:     %s\n",      s, hdr->obj.obj1);
+	printf("__%s__hdr.obj.obj2:     %s\n",      s, hdr->obj.obj2);
+	printf("__%s__hdr.dlen:         %d\n",      s, hdr->dlen);
 	print_md5(m);
 }
 
@@ -31,11 +33,11 @@ int main(int argc, char *argv[])
 	FILE* fp;
 	node_t nd;
 	md5_t md5;
-	char newPath[1000];
 	upgrade_obj_t obj;
 	upgrade_file_t hdr;
-	char* path = NULL;
 	myFile mf;
+	char* srcPath;
+	char dstPath[1000];
 
 	//TCHAR curPath[500];
 	//GetCurrentDirectory(500, curPath);
@@ -50,35 +52,40 @@ int main(int argc, char *argv[])
 	obj.stra = (uint8_t)atoi(argv[2]);
 	strcpy(obj.obj1, argv[3]);
 	strcpy(obj.obj2, argv[4]);
-	path = argv[5];
+	srcPath = argv[5];
+
+	strcpy(dstPath, srcPath);
 
-	strcpy(newPath, path);
-	char* dot = strrchr(newPath, '/');
+	char* dot = strrchr(dstPath, '/');
 	if (!dot) {
-		dot = strrchr(newPath, '\\');
+		dot = strrchr(dstPath, '\\');
 	}
 
 	if (dot) {
 		*(dot + 1) = 0;
-		strcat(newPath, "pdupkg");
+		strcat(dstPath, "pdupkg");
 	}
 	else {
-		strcpy(newPath, "./pdupkg");
+		strcpy(dstPath, "./pdupkg");
 	}
 
-	fp = fopen(newPath, "wb");
+	fp = fopen(dstPath, "wb");
 	if (!fp) {
-		printf("%s create failed\n", newPath);
-		return -1;
+		printf("%s create failed\n", dstPath);
+		r = -1;
+		goto failed;
 	}
 
-	r = mf.read_file(path, &nd);
+	r = mf.read_file(srcPath, &nd);
 	if (r) {
-		return -1;
+		r = -1;
+		fclose(fp);
+		goto failed;
 	}
 
 	hdr.magic = UPG_FILE_MAGIC;
 	hdr.obj = obj;
+	hdr.dlen = nd.dlen;
 
 	md5_calc(&hdr, sizeof(hdr), nd.pbuf, nd.dlen, (char*)md5.data);
 	fwrite(&hdr, 1, sizeof(hdr), fp);
@@ -86,9 +93,10 @@ int main(int argc, char *argv[])
 	fwrite(&md5, 1, sizeof(md5), fp);
 	print_info("$$$", &hdr, &md5);
 
-	fclose(fp);
 	free(nd.pbuf);
 
+failed:
+
 	return 0;
 }
 

BIN
04-源码/03-核心板/tools/merge/merge.exe


+ 7 - 0
04-源码/03-核心板/tools/merge/merge.vcxproj

@@ -70,6 +70,10 @@
     <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
   </ImportGroup>
   <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <OutDir>$(Platform)\$(Configuration)\</OutDir>
+    <IntDir>$(Platform)\$(Configuration)\</IntDir>
+  </PropertyGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
     <ClCompile>
       <WarningLevel>Level3</WarningLevel>
@@ -111,6 +115,9 @@
       <GenerateDebugInformation>true</GenerateDebugInformation>
       <OutputFile>$(OutDir)$(TargetName)$(TargetExt)</OutputFile>
     </Link>
+    <PostBuildEvent>
+      <Command>copy /y $(Platform)\$(Configuration)\$(ProjectName).exe .\</Command>
+    </PostBuildEvent>
   </ItemDefinitionGroup>
   <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
     <ClCompile>

+ 9 - 51
04-源码/03-核心板/tools/merge/myFile.cpp

@@ -1,63 +1,21 @@
 #include "myFile.h"
 
-
 int myFile::read_file(char* path, node_t* nd)
 {
-#ifdef _WIN32
-	char* pbuf;
-	HANDLE hFile;
-	DWORD  flen,rlen;
-	BOOL r;
-
-	hFile = CreateFileA(path,			//name
-		GENERIC_READ,                   //以读方式打开
-		FILE_SHARE_READ,               //可共享读
-		NULL,                           //默认安全设置
-		OPEN_EXISTING,                   //只打开已经存在的文件
-		FILE_ATTRIBUTE_NORMAL,           //常规文件属性
-		NULL);                           //无模板
-	if (hFile== INVALID_HANDLE_VALUE) {
-		printf("%s open failed, err: %d\n", path, GetLastError());
-		return -1;
-	}
-
-	flen = GetFileSize(hFile, NULL);
-	if (flen== INVALID_FILE_SIZE) {
-		printf("%s, get invalid file size!\n", path);
-		return -1;
-	}
-
-	pbuf = (char*)malloc(flen);
-	if (!pbuf) {
-		printf("malloc %d failed!\n", flen);
-		CloseHandle(hFile);
-		return -1;
-	}
-
-	r = ReadFile(hFile, pbuf, flen, &rlen, NULL);
-	if (r==FALSE) {
-		printf("ReadFile failed!\n");
-		CloseHandle(hFile);
-		return -1;
-	}
-
-	nd->pbuf = pbuf;
-	nd->dlen = rlen;
-	nd->blen = rlen;
-	CloseHandle(hFile);
-#else
     struct stat st;
     char* pbuf;
 	FILE* fp;
-	int  r,flen,rlen;
+	int  r,flen;
 
     r = stat((const char *)path, &st);
-    if (r) {
+    if (r<0) {
+		printf("%s stat failed, %d\n", path, r);
         return -1;
     }
     flen = st.st_size;
+	printf("___%s flen: %d\n", path, flen);
 
-    fp = fopen((const char *)path, "r");
+    fp = fopen((const char *)path, "rb");
     if(!fp) {
         printf("fopen %s failed!\n", path);
 		return -1;
@@ -71,17 +29,17 @@ int myFile::read_file(char* path, node_t* nd)
 	}
 
     r = fread(pbuf, 1, flen, fp);
+    printf("fread out %d\n", r);
     if (r!=flen) {
         printf("fread %s failed!\n", path);
-        fclose(fp);
+        fclose(fp); free(pbuf);
         return -1;
     }
 
     nd->pbuf = pbuf;
-    nd->dlen = rlen;
-    nd->blen = rlen;
+    nd->dlen = flen;
+    nd->blen = flen;
     fclose(fp);
-#endif
 
 	return 0;
 }

+ 2 - 1
04-源码/03-核心板/tools/merge/myFile.h

@@ -7,6 +7,7 @@
 
 #ifdef _WIN32
 #include <windows.h>
+#include <tchar.h>
 #else
 #include<sys/types.h>
 #include<sys/stat.h>
@@ -26,7 +27,7 @@ public:
     wchar_t* char_to_wchar(char* chr);
 
     int read_file(char* path, node_t* nd);
-    int get_time(char *path, char *time, int len);
+    int get_time(char*path, char *time, int len);
     int get_version(char* path, void* version, int len);
     
 };

+ 10 - 3
04-源码/03-核心板/tools/push2.bat

@@ -1,15 +1,20 @@
 @ECHO OFF
 ::https://documentation.help/PuTTY/using-cmdline.html
 
+SET TMP=pdutar
+SET TARGET=pdupkg
+
 SET CURDIR=%~dp0
 SET CURDIR=%CURDIR:~0,-1%
 
-SET TARGET=%CURDIR%\..\output\pdutar
-SET  DSTDIR=/root
+SET  OUTDIR=%CURDIR%\..\output
+SET  DEVDIR=/root
 
 SET PSCP=%CURDIR%\ssh\pscp 
 SET PUTTY=%CURDIR%\ssh\putty
 
+SET PACK=%CURDIR%\pack2.bat
+
 SET IP=192.168.1.132
 
 SET USR=root
@@ -30,11 +35,13 @@ SET PORT=
 
 ::传递文件
 ECHO send %TARGET% ...
-%PSCP% %TARGET% root@%IP%:%DSTDIR%
+%PSCP% %OUTDIR%\%TARGET% root@%IP%:%DEVDIR%
 
 ECHO release %TARGET% ...
 %PUTTY% -ssh -l %USR% -pw %PWD% -m %FBAT% %IP%
 
+PAUSE
+
 GOTO :EOF
 :getPort
 SET "%~1="

+ 118 - 131
04-源码/03-核心板/upgd/upgrade.c

@@ -178,7 +178,7 @@ static int file_touch(int id)
     FILE *fp;
     char tmp[200];
 
-    snprintf(tmp, sizeof(tmp), "%s/step%d", UPG_FOLDER, id);
+    snprintf(tmp, sizeof(tmp), "%s/s%d", UPG_FOLDER, id);
     fp = fopen(tmp, "w");       // 使用写入模式创建一个新文件
     if (fp == NULL) {
         return -1;
@@ -190,7 +190,7 @@ static int file_untouch(int id)
 {
     char tmp[200];
 
-    snprintf(tmp, sizeof(tmp), "%s/step%d", UPG_FOLDER, id);
+    snprintf(tmp, sizeof(tmp), "%s/s%d", UPG_FOLDER, id);
     return remove(tmp);
 
 }
@@ -214,7 +214,7 @@ static int folder_init(void)
 }
 
 
-static int file_save(char *path, char *buf, int len)
+static int file_save(char *path, void *buf, int len)
 {
     int r;
     FILE *fp;
@@ -236,7 +236,7 @@ static int file_save(char *path, char *buf, int len)
 
     return r;
 }
-static int file_load(char* path, char* buf, int len)
+static int file_load(char* path, void* buf, int len)
 {
     int r;
     FILE* fp;
@@ -266,15 +266,15 @@ static int file_remove(char *path)
 /*
     tar pdutar to run/
 */
-static int file_cover(char *srcDir)
+static int file_cover(char *path)
 {
     int r;
     char cmd[200];
 
-    snprintf(cmd, sizeof(cmd), "tar -xpf %s/ /", srcDir, UPG_TAR_NAME);
+    snprintf(cmd, sizeof(cmd), "tar -xpf %s -C / > /dev/null 2>&1", path);
     r = system(cmd);
     if(r) {
-        LOG("% failed, %d\n", cmd, r);
+        LOG("%s failed\n", cmd);
         return -1;
     }
 
@@ -306,7 +306,7 @@ static int dir_is_empty(char *path)
 }
 
 //when app run success, copy run/* to bak/
-static int file_bakup(void)
+static int file_backup(void)
 {
     int r;
     char tmp[100];
@@ -367,29 +367,6 @@ static int file_restore(void)
     return 0;
 }
 
-static int rebooot(void)
-{
-    int r;
-    char cmd[100];
-
-    snprintf(cmd, sizeof(cmd), "killall -e smartPDU");
-    r = system(cmd);
-    if(r) {
-        LOG("% failed, %d\n", cmd, r);
-        return -1;
-    }
-
-    return 0;
-}
-static int app_start(void)
-{
-    return system("/etc/init.d/S90PDUApp start");
-}
-static int app_stop(void)
-{
-    return system("/etc/init.d/S90PDUApp stop");
-}
-
 
 #define CHAR(b) (((b)<=9)?((b)+0x30):((b)-10+0x61));
 static void byte2char(char *chr, uint8_t b)
@@ -409,20 +386,20 @@ static void print_md5(char *s, md5_t *m)
 }
 
 //md5相同返回0,否则返回1
-static int md5_check(char *buf, int len)
+static int md5_check(upgrade_file_t *h)
 {
     md5_ctx_t ctx;
     uint8_t i,tmp[16];
     md5_t m1,m2;
 
     md5_init(&ctx);
-    md5_update(&ctx, buf, len);
+    md5_update(&ctx, (char*)h, h->dlen+sizeof(upgrade_file_t));
     md5_final(&ctx, tmp);
 
     for (i=0; i<16; i++) {
         byte2char(&m2.data[i*2], tmp[i]);
     }
-    memcpy(&m1, buf+len-sizeof(m1), sizeof(m1));
+    memcpy(&m1, h->data+h->dlen, sizeof(md5_t));
 
     print_md5("ori md5: ", &m1);
     print_md5("cal md5: ", &m2);
@@ -456,16 +433,17 @@ static int file_split(void)
         LOG("%s load failed\n", path);
         return -1;
     }
+    upgrade_file_t *hfile = (upgrade_file_t*)fbuf;
     
     snprintf(path, sizeof(path), "%s/%s", DOWN_FOLDER, UPG_HDR_NAME);
-    r = file_save(path, fbuf, sizeof(upgrade_file_t));
+    r = file_save(path, hfile, sizeof(upgrade_file_t));
     if(r) {
         LOG("file_save %s failed\n", path);
         return -1;
     }
 
     snprintf(path, sizeof(path), "%s/%s", DOWN_FOLDER, UPG_TAR_NAME);
-    r = file_save(path, fbuf+sizeof(upgrade_file_t), flen-sizeof(upgrade_file_t)-sizeof(md5_t));
+    r = file_save(path, hfile->data, hfile->dlen);
     if(r) {
         LOG("file_save %s failed\n", path);
         return -1;
@@ -477,6 +455,7 @@ static int file_split(void)
         LOG("file_remove %s failed\n", path);
         return -1;
     }
+    system("ls /root/dl");
 
     return 0;
 }
@@ -494,27 +473,22 @@ static int file_check(void)
         LOG("file_length %s failed\n", path);
         return -1;
     }
+    
     fbuf = (char*)malloc(flen);
     if(!fbuf) {
         LOG("malloc %d failed\n", flen);
         return -1;
     }
+    
     r = file_load(path, fbuf, flen);
     if(r) {
         LOG("%s load failed\n", path);
         return -1;
     }
-    
-    r = md5_check(fbuf, flen);
-    if(r) {
-        LOG("md5 check failed\n");
-        goto fail;
-    }
 
     hfile = (upgrade_file_t*)fbuf;
     if(hfile->magic!=UPG_FILE_MAGIC ||
-       hfile->obj.num>=UPGRADE_NUM_MAX ||
-       hfile->obj.stra>=UPGRADE_STRA_MAX) {
+       hfile->dlen!=flen-sizeof(upgrade_file_t)-sizeof(md5_t)) {
         r = -1;
         LOG("magic: 0x%08x, should be: 0x%08x\n", hfile->magic, UPG_FILE_MAGIC);
         LOG("num:  %d, should < %d\n", hfile->obj.num,  UPGRADE_NUM_MAX);
@@ -523,16 +497,42 @@ static int file_check(void)
         LOG("file hdr check failed\n");
         goto fail;
     }
-    free(fbuf);
-
-    return 0;
+    
+    r = md5_check(hfile);
+    if(r) {
+        LOG("md5 check failed\n");
+        goto fail;
+    }
     
 fail:
     free(fbuf);
     return r;
 
 }
-
+static int file_scan(upg_handle_t *h)
+{
+    //检查DOWN目录,如有升级文件
+    
+    //udisk检查,如有升级文件,拷贝到DOWN_FOLDER目录,并设置step为UPGRADE_STEP_DOWN
+
+    //tcard检查,如有升级文件,拷贝到DOWN_FOLDER目录,并设置step为UPGRADE_STEP_DOWN
+    
+    return 0;
+}
+
+//////////////////////////////////////////////////
+static int app_start(void)
+{
+    return system("/etc/init.d/S90PDUApp start");
+}
+static int app_stop(void)
+{
+    return system("/etc/init.d/S90PDUApp stop");
+}
+static int app_restart(void)
+{
+    return system("/etc/init.d/S90PDUApp restart");
+}
 static int set_factory(void)
 {
     int r=0;
@@ -549,63 +549,12 @@ static int set_factory(void)
         LOG("sys_set_factory failed!\n");
         return -1;
     }
-    system("reboot -f");
+    app_restart();
     
     return r;
 }
 
 //////////////////////////////////////////////////
-static int upg_init(upg_handle_t *h)
-{
-    int id,r;
-    char tmp[200];
-    key_t key;
-
-    folder_init();
-    file_bakup();
-    
-    key = ftok(UPG_KEY_PATH, UPG_KEY_SN);
-    if(key<0) {
-        LOG("ftok %s failed, errno: %d\n", UPG_KEY_PATH, errno);
-    }
-	h->src  = UPGRADE_SRC_NONE;
-    h->stat = UPGRADE_STAT_NONE;
-    h->key  = key;
-
-    return 0;
-}
-static int upg_check(upg_handle_t *h)
-{
-    int i,r;
-    char tmp[200];
-
-    for(i=1; i<UPGRADE_STEP_MAX; i++) {
-        snprintf(tmp, sizeof(tmp), "%s/step%d", UPG_FOLDER, i);
-        r = file_exist(tmp);
-        if(r) {
-            LOG("%s exist\n", tmp);
-            //重启后如果是覆盖完成,则将进度置为SUCCESS
-            h->step = (i==UPGRADE_STEP_COVER)?UPGRADE_STEP_SUCCESS:i;
-            break;
-        }
-        LOG("%s not exist\n", tmp);
-    }
-
-    return r;
-}
-
-static int file_scan(upg_handle_t *h)
-{
-    //DOWN_FOLDER检查,如有升级文件,则xxxx
-    
-    //udisk检查,如有升级文件,拷贝到DOWN_FOLDER目录,并设置step为UPGRADE_STEP_DOWN
-
-    //tcard检查,如有升级文件,拷贝到DOWN_FOLDER目录,并设置step为UPGRADE_STEP_DOWN
-    
-    return 0;
-}
-
-
 static void* upg_thread(void *arg)
 {
     int r=0;
@@ -649,6 +598,43 @@ static void* upg_thread(void *arg)
 
     pthread_exit(NULL);
 }
+static int upg_init(upg_handle_t *h)
+{
+    int id,r;
+    char tmp[200];
+    key_t key;
+
+    folder_init();
+        
+    key = ftok(UPG_KEY_PATH, UPG_KEY_SN);
+    if(key<0) {
+        LOG("ftok %s failed, errno: %d\n", UPG_KEY_PATH, errno);
+    }
+	h->src  = UPGRADE_SRC_NONE;
+    h->stat = UPGRADE_STAT_NONE;
+    h->key  = key;
+
+    return pthread_create(&h->tid, NULL, upg_thread, h);
+}
+static int upg_check(upg_handle_t *h)
+{
+    int i,r;
+    char tmp[200];
+
+    for(i=1; i<UPGRADE_STEP_MAX; i++) {
+        snprintf(tmp, sizeof(tmp), "%s/s%d", UPG_FOLDER, i);
+        r = file_exist(tmp);
+        if(r) {
+            LOG("%s exist\n", tmp);
+            //重启后如果是覆盖完成,则将进度置为SUCCESS
+            h->step = (i==UPGRADE_STEP_COVER)?UPGRADE_STEP_SUCCESS:i;
+            break;
+        }
+        LOG("%s not exist\n", tmp);
+    }
+
+    return r;
+}
 static int upg_handle(upg_handle_t *h)
 {
     int r=-1;
@@ -669,6 +655,11 @@ static int upg_handle(upg_handle_t *h)
                         file_untouch(UPGRADE_STEP_DOWN);
                         h->step = UPGRADE_STEP_SPLIT;
                     }
+                    else {
+                        LOG("remove %s\n", tmp);
+                        file_remove(tmp);
+                        h->step = UPGRADE_STEP_NONE;
+                    }
                 }
                 else {
                     LOG("___ %s not exist, ", tmp);
@@ -692,65 +683,69 @@ static int upg_handle(upg_handle_t *h)
             {
                 r = file_split();
                 if(r==0) {
+                    file_touch(UPGRADE_STEP_SPLIT);
                     h->step = UPGRADE_STEP_COVER;
                 }
                 else {
-                    snprintf(tmp, sizeof(tmp), "%s/%s", DOWN_FOLDER, UPG_PKG_NAME);
-                    LOG("file_split failed, remove %s\n", tmp);
-
-                    file_untouch(UPGRADE_STEP_DOWN);
-                    file_remove(tmp);
                     h->step = UPGRADE_STEP_NONE;
                 }
+                file_untouch(UPGRADE_STEP_DOWN);
             }
             break;
 
             case UPGRADE_STEP_COVER:
             {
                 LOG("___ UPGRADE_STEP_COVER\n");
-                r = app_stop();
-                if(r) {
-                    LOG("app_stop failed\n");
-                    break;
-                }
-                file_untouch(UPGRADE_STEP_SPLIT);
-                
-                r = file_cover(DOWN_FOLDER);
+                app_stop();
+
+                snprintf(tmp, sizeof(tmp), "%s/%s", DOWN_FOLDER, UPG_TAR_NAME);
+                r = file_cover(tmp);
                 if(r==0) {
                     file_touch(UPGRADE_STEP_COVER);
-                    h->step = UPGRADE_STEP_SUCCESS;
+                    h->step = UPGRADE_STEP_NONE;
+                    app_start();
                 }
                 else {
-                    LOG("file_cover failed, need restore!\n");
+                    LOG("tar %s failed, delete it!\n", tmp);
+                    file_remove(tmp);
+                    snprintf(tmp, sizeof(tmp), "%s/%s", DOWN_FOLDER, UPG_HDR_NAME);
+                    file_remove(tmp);
+                    
                     h->step = UPGRADE_STEP_RESTORE;
                 }
+                file_untouch(UPGRADE_STEP_DOWN);
+                file_untouch(UPGRADE_STEP_SPLIT);
             }
             break;
 
             case UPGRADE_STEP_RESTORE:
             {
                 LOG("restore now ...\n");
+                file_untouch(UPGRADE_STEP_COVER);
+                
                 app_stop();
                 r = file_restore();
-                h->step = UPGRADE_STEP_SUCCESS;
+                h->step = UPGRADE_STEP_NONE;        //设置为NONE,防止其反复进入
                 if(r==0) {
                     LOG("file_restore ok!\n");
                 }
                 else {
                     LOG("file_restore failed\n");
                 }
+                app_start();
             }
             break;
 
             case UPGRADE_STEP_SUCCESS:
             {
-                app_start();
-                if(r) {
-                    LOG("app_start failed\n");
-                    break;
+                LOG("___ UPGRADE_STEP_SUCCESS\n");
+                r = file_backup();  //启动成功才证明程序有效,可进行备份
+                if(r==0) {  //备份成功,删除下载目录中的文件以节省空间
+                    snprintf(tmp, sizeof(tmp), "rm -r %s/*", DOWN_FOLDER);
+                    system(tmp);
                 }
                 
-                LOG("___ UPGRADE_STEP_SUCCESS\n");
+                app_start();
                 file_untouch(UPGRADE_STEP_COVER);
                 h->step = UPGRADE_STEP_NONE;
             }
@@ -765,26 +760,18 @@ static int upg_handle(upg_handle_t *h)
 
     return r;
 }
-
-
-
+/////////////////////////////////////////////////////////////////////////
 int main(void)
 {
     int id,r=0;
     upg_handle_t *h=&upgHandle;
 
     LOG("___ upgd running ...\n");
+    
     upg_init(h);
     upg_check(h);
-    LOG("___ upgd loop ...   \n");
-
-    pthread_create(&h->tid, NULL, upg_thread, h);
-    LOG("___ upgd loop 222   \n");
-
-    
     while(1) {
         upg_handle(h);
-
         sleep(1);
     }
     

+ 1 - 0
04-源码/03-核心板/upgd/upgrade.h

@@ -111,6 +111,7 @@ typedef struct {
 typedef struct {
     uint32_t        magic;					//UPG_FILE_MAGIC
     upgrade_obj_t   obj;
+    uint32_t        dlen;
     uint8_t         data[0];
     /*
     uint8_t         data[x];