亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 復件 update.c

?? 基于h323協議的軟phone
?? C
?? 第 1 頁 / 共 2 頁
字號:
	/**
	* RETR reply after transfer should be "226"
	*/
	if (FtpRecvReply(ctrl_fd) < 0 || ftp_reply[0] != '2')
	{
		fprintf(stderr, "error while transfer\n");
		/* 釋放內存 */
		ClearUpdateBlock(update_block.next);
		return UPDATE_CONN_ERROR;
	}
	else
	{
		#ifdef __UPDATE_DEBUG__
		printf("%.3s: transfer completed\n", ftp_reply);
		printf("file %s %d bytes got\n", filename, count);
		#endif
	}

	close(data_fd);
	FtpQuitServer(ctrl_fd);
	close(ctrl_fd);
	printf("now begin to update flashRom!\n");		
	/* 寫入Flash */
	result = UpdateFlashRom(update_block.next, count, fileType);
	
	ClearUpdateBlock(update_block.next);
	
	#ifdef __UPDATE_DEBUG__
	if (result == UPDATE_OK)
	{
		printf("Update OK.\n");
	}
	#endif

	return result;
}

static int FtpQuitServer(int ctrl_fd)
{
	/**
	* Command QUIT
	*/
	if (FtpCommand(ctrl_fd, ftp_quit_cmd, NULL) < 0)
	{
		fprintf(stderr, "QUIT error\n");
		return UPDATE_CONN_ERROR;
	}
	/**
	* QUIT reply should be "221"
	*/
	if (FtpRecvReply(ctrl_fd) < 0 || ftp_reply[0] != '2')
	{
		fprintf(stderr, "error recv QUIT\n");
		return UPDATE_CONN_ERROR;
	}
	else
	{
		#ifdef __UPDATE_DEBUG__
		printf("%.3s: quit from server\n", ftp_reply);
		#endif
	}
	return UPDATE_OK;
}

static int FtpCommand(int sockfd, char * cmd, const char * param)
{
	int len;
	memset(ftp_request, 0, FTP_REQ_LENGTH);
	len = sprintf(ftp_request, "%s %s\r\n", cmd, (param == NULL)? "" : param);
	#ifdef __FTP_DEBUG
	printf("%s %s\r\n", cmd, (param == NULL)? "" : param);
	#endif
	return send(sockfd, ftp_request, len, 0);
}

static int FtpRecvReply(int sockfd)
{
	int ret;
	fd_set rset;
	struct timeval tv;
	int len = -1;
	char data = 0;
	if ((len = recv(sockfd, ftp_reply, 3, 0)) <= 0)
	{
		memset(ftp_reply, 0, sizeof(ftp_reply));
		return -1;
	}
	FD_ZERO(&rset);
	FD_SET(sockfd, &rset);
	tv.tv_sec = 0.5;
	tv.tv_usec = 0;

	while (data != '\n')
	{
		if ((len = recv(sockfd, &data, 1, 0)) <= 0)
		{
			memset(ftp_reply, 0, sizeof(ftp_reply));
			return -1;
		}
	}
	#if 0
	while ((len = recv(sockfd, &data, 1, 0)) > 0)
	{
		/*memset(ftp_reply, 0, sizeof(ftp_reply));
		return -1;*/
	}
	#endif
#if 0
	while(ret = select(sockfd + 1, &rset, NULL, NULL, &tv)>0)
		len = recv(sockfd,&data,1,0);

	if (len == -1)
		memset(ftp_reply, 0, sizeof(ftp_reply));
#endif
	return len;

}

/*************************************************************************************
* Part TFTP_Update
*************************************************************************************/
static int TftpUpdate()
{
	int sockfd, ret;
		
	#ifdef __UPDATE_DEBUG__
	printf("Begin tftp update...\n");
	#endif
	
	if ((sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) < 0)
	{
		perror("tftp socket");
		return UPDATE_CONN_ERROR;
	}
	memset(&tftp_server_addr, 0, addr_len);
	tftp_server_addr.sin_len = addr_len;
	tftp_server_addr.sin_family = AF_INET;
	tftp_server_addr.sin_port = htons(TFTP_SERVER_PORT);
	tftp_server_addr.sin_addr.s_addr = htonl(phoneconfig.conf_ftp.server);
	
	tftp_tid = 0;
	tftp_index = 1;
	
	if (TftpSendRRQ(sockfd, phoneconfig.conf_ftp.filename) < 0)
	{
		perror("send RRQ");
		close(sockfd);
		return UPDATE_CONN_ERROR;
	}
	
	ret = TftpGetUpdate(sockfd);
	close(sockfd);
	return ret; 
}

/*******************************************************
* 向服務器發送RRQ請求
* RRQ的報文格式
*
* 			 2     string        1      string       1 
*          -----------------------------------------------
*   RRQ   |  01 |  Filename  |   0  |    Mode    |   0  |
*          -----------------------------------------------
*
*******************************************************/
static int TftpSendRRQ(int sockfd, char * filename)
{
	int offset = 0;
	
	memset(tftp_lastdata.data, 0, TFTP_TMP_LENGTH);
	tftp_lastdata.data[1] = TFTP_OP_RRQ;
	offset += 2;
	offset += sprintf(& tftp_lastdata.data[offset], "%s", filename);
	offset++;
	offset += sprintf(& tftp_lastdata.data[offset], "%s", tftp_filemode);
	offset++;
	tftp_lastdata.length = offset;
	
	#ifdef __UPDATE_DEBUG__
	printf("send RRQ...get file %s\n", filename);
	#endif
	
	return sendto(sockfd, (void *) tftp_lastdata.data, offset, 0, (struct sockaddr *) &tftp_server_addr, addr_len);
}

/*******************************************************
* 向服務器發送ACK
* ACK的報文格式
*
*             2       2 bytes
*          -------------------
*   ACK   |  04   |  Block #  |
*          --------------------
*
*******************************************************/
static int TftpSendAck(int sockfd, unsigned short index)
{
	tftp_lastdata.data[0] = 0;
	tftp_lastdata.data[1] = TFTP_OP_ACK;
	memcpy(&tftp_lastdata.data[2], &index, 2);
	tftp_lastdata.length = 4;
		
	return sendto(sockfd, (void *) tftp_lastdata.data, 4, 0, (struct sockaddr *) &tftp_server_addr, addr_len);
}

static int TftpGetResponse(int sockfd, int * p_len)
{
	int len, flen;
	int retry = 3;
	
	flen = addr_len;
	while (retry > 0)
	{
#ifdef __UPDATE_DEBUG__
		printf("server port %u\n", tftp_tid);
#endif
		if (readable_timeo(sockfd, TFTP_TIMEOUT) <= 0)
		{
			if (--retry <= 0)
			{
				fprintf(stderr, "No answer from TFTP server after 3 try, Quit.\n");
				return UPDATE_CONN_ERROR;
			}
			/**
			* 重新發送上次的報文
			*/
			#ifdef __UPDATE_DEBUG__
			printf("ReSend last data\n", retry);
			#endif
			if (sendto(sockfd, (void *) tftp_lastdata.data, tftp_lastdata.length, 0, 
					(struct sockaddr *) &tftp_server_addr, addr_len) < 0)
			{
				perror("ReSend last data while timeout");
				return UPDATE_CONN_ERROR;
			}
			continue;
		}
		/**
		* 收到服務器端的應答
		*/
		if ((len = recvfrom(sockfd, (void *) &tftp_fileblock, sizeof(s_tftp_data), 0,
				(struct sockaddr *) &tftp_server_addr, &flen)) < 0)
		{
			perror("recv DATA");
			return UPDATE_CONN_ERROR;
		}
		/**
		* 收到其他端口發送的報文 丟棄該報文
		*/
		if (tftp_tid != 0 && tftp_tid != ntohs(tftp_server_addr.sin_port))
		{
			tftp_server_addr.sin_port = htons(tftp_tid);
			fprintf(stderr, "Got packet from other TID!\n");
			continue;
		}
		/**
		* 收到ERROR報文 返回錯誤
		*/
		if (ntohs(tftp_fileblock.op) == TFTP_OP_ERROR)
		{
			fprintf(stderr, "file not exist!\n");
			return UPDATE_FILE_NOTEXIST;	
		}
		/**
		* 收到其它無法識別的報文類型 丟棄
		*/
		else if (ntohs(tftp_fileblock.op) != TFTP_OP_DATA)
		{
			fprintf(stderr, "OP error!\n");
			continue;
		}
		/**
		* 若為RRQ的應答 記錄服務器的端口
		*/
		tftp_tid = (tftp_tid == 0) ? ntohs(tftp_server_addr.sin_port) : tftp_tid;
		/**
		* 收到數據報文 比較數據塊的編號 回送確認 
		*/
		if (tftp_index - 1 == ntohs(tftp_fileblock.index))
		{
			/* 服務器沒有收到上次的ACK 重發 */
			if (TftpSendAck(sockfd, tftp_fileblock.index) < 0)
			{
				perror("RESend data ACK");
				return UPDATE_CONN_ERROR;
			}
			continue;
		}
		else if (tftp_index == ntohs(tftp_fileblock.index))
		{
			if (TftpSendAck(sockfd, tftp_fileblock.index) < 0)
			{
				perror("send data ACK");
				return UPDATE_CONN_ERROR;
			}
			*p_len = len;
			break;
		}
		else
		{
			return UPDATE_ERROR_UNKNOWN;
		}
	}
	if (retry <= 0)
	{
		return UPDATE_CONN_ERROR;
	}
	else
	{
		return UPDATE_OK;
	}
}

/*******************************************************
* 獲得升級文件 進行升級操作
*******************************************************/
static int TftpGetUpdate(int sockfd)
{
	int len, flen;
	int offset = 0;
	int count = 0;
	int fileType;
	unsigned char done = 0;
	unsigned short index = 0;
	int result = UPDATE_OK;
	s_updateblock update_block;
	s_updateblock * p;
		
	update_block.next = NULL;
	fileType = 0;
	p = & update_block;
	while (!done)
	{
		if ((result = TftpGetResponse(sockfd, &len)) != UPDATE_OK)
		{
			break;
		}
		if ((count + len - 4) > COMPRESSED_IMAGE_ADDR)
		{
			fprintf(stderr, "file too long\n");
			result = UPDATE_NO_SPACE;
			break;
		}
		if (count == 0)
		{
			if (len > 4)
			{
				if ( memcmp(tftp_fileblock.fileblock, phoneconfig.bootFileHead, 4) == 0 )
					fileType = 1;
				if ( memcmp(tftp_fileblock.fileblock, phoneconfig.appFileHead, 4) == 0 )
					fileType = 2;
			}
			if (fileType != 1 && fileType != 2)
			{
				printf("file type error!\n\n");
				return UPDATE_INVALID_FILE;
			}
		}
		count += len - 4;
		if (tftp_index % 2 != 0)
		{
			if ((p -> next = ConstructBlockNode()) == NULL)
			{
				fprintf(stderr, "file too long\n");
				result = UPDATE_NO_SPACE;
				break;
			}
			p = p -> next;
			memcpy(p -> fileblock, tftp_fileblock.fileblock, len - 4);
			p -> length = len - 4;
		}
		else
		{
			memcpy(p -> fileblock + p -> length, tftp_fileblock.fileblock, len - 4);
			p -> length += len - 4;
		}
		if (len < TFTP_BLOCK_SIZE + 4)
		{
			done = 1;
		}
		tftp_index++;	
	}
	if (done)
	{
		#ifdef __UPDATE_DEBUG__
		printf("file %s %d bytes got\n", phoneconfig.conf_ftp.filename, count);
		#endif
		if (count == 0)
		{
			printf("file size is 0!!!\n\n");
			return UPDATE_INVALID_FILE;
		}
		/* 寫入Flash */
		result = UpdateFlashRom(update_block.next, count, fileType);
		/*
		Program_Version_Flash_Mem((unsigned short *) ptr_file, (p - ptr_file));
		*/
	}
	#ifdef __UPDATE_DEBUG__
	if (result == UPDATE_OK)
	{
		printf("Update OK.\n");
	}
	#endif
	ClearUpdateBlock(update_block.next);
	return result;
}


/*******************************************************
* Part UPDATE_COMMON
*******************************************************/
static s_updateblock * ConstructBlockNode(void)
{
	s_updateblock * ptr_block;
	if ((ptr_block = (s_updateblock *) malloc(sizeof(s_updateblock))) == NULL)
	{
		return NULL;
	}
	if ((ptr_block -> fileblock = (unsigned char *) malloc(UPDATE_BUFFER)) == NULL)
	{
		free(ptr_block);
		return NULL;
	}
	memset(ptr_block -> fileblock, 0, UPDATE_BUFFER);
	ptr_block -> length = 0;
	ptr_block -> next = NULL;
	return ptr_block;
}

void ClearUpdateBlock(s_updateblock * ptr_updatefile)
{
	s_updateblock * p, * q;
	
	#ifdef __UPDATE_DEBUG__
	printf("Clear Update Node...\n");
	#endif
	
	if (ptr_updatefile == NULL)
	{
		return;
	}
	for (p = ptr_updatefile; p != NULL; p = q)
	{
		free(p -> fileblock);
		q = p -> next;
		free(p);
	}	
	return;
}

int UpdateFlashRom(s_updateblock * ptr_updatefile, int count, int fileT)
{
	s_updateblock * p;
	unsigned short * pAddr = (unsigned short *) COMPRESSED_IMAGE_ADDR;
	unsigned short * pBootAddr = (unsigned short *)ROM_BASE_ADRS;
	unsigned char * ptr;
	int offset = 0;
	#ifdef __UPDATE_DEBUG__
	CheckUpdateBlock(ptr_updatefile);
	#endif

	if (fileT == 1)
	{
		if (count > BOORROMSIZE)
		{
			printf("file too long!\n\n");
			return UPDATE_TOO_LONG;
		}
/*if (1)
{
printf("demo update OK!");
return UPDATE_OK;
}*/
	/** 	remove by chenguoyin 
		if ((ptr = (unsigned char *) malloc(300 * 1024)) == NULL)
		{
			fprintf(stderr, "error malloc boot\n");
			return -1;
		}
		for (p = ptr_updatefile; p != NULL; p = p -> next)
		{
			memcpy(ptr + offset, p -> fileblock, p -> length);
			offset += p -> length;
		}
		Program_Boot_Flash_Mem((unsigned short *) ptr, offset);
		free(ptr);
	
	**/
		
	        if ( gFlashType == SST )
    		{
        		if ( count> ( COMPRESSED_IMAGE_ADDR - ROM_BASE_ADRS - 4 - SST_BLOCK_SIZE_UINT16 * 2 * 2 ) )
       		 {
           			 printf("The Version is to Large!\n");
            			return UPDATE_TOO_LONG;
        		}
   		 }
   		 else
    		{
        		if (count > ( COMPRESSED_IMAGE_ADDR - ROM_BASE_ADRS - 4 - FLASH_SECTOR_SIZE * 2) )
        		{
            			printf("The Version is to Large!\n");
            			return UPDATE_TOO_LONG;
        		}
   		 }
             if ( Erase_Boot_Flash_Mem () != OK )
                     return UPDATE_WRITE_ERROR;
        	for (p = ptr_updatefile; p != NULL && count > 0; p = p -> next)
		{
			if (Program_Version_Flash_Mem((unsigned short *) p -> fileblock, pBootAddr, p -> length) != OK)
			{
				fprintf(stderr, "Write Flash ROM ERROR!\n");
				return UPDATE_WRITE_ERROR;
			}
			pBootAddr += p -> length / 2;
			count -= p -> length / 2;
		}
		
	}
	else if (fileT == 2)
	{
		if (count > APPSIZE)
		{
			printf("file too long!\n\n");
			return UPDATE_TOO_LONG;
		}
/*if (1)
{
printf("demo update OK!");
return UPDATE_OK;
}*/
		if (count > COMPRESSED_IMAGE_SIZE)
		{
			fprintf(stderr, "The Version is too Large!\n");
			return UPDATE_NO_SPACE;
		}

	      SetVersionUpdateFlag ( 0xff );/*2004-7-12 fujiangdong update begin*/

		if (Erase_Version_Flash_Mem () != OK)
		{
			fprintf(stderr, "Erase Flash ROM ERROR!\n");
			return UPDATE_WRITE_ERROR;
		}
		for (p = ptr_updatefile; p != NULL && count > 0; p = p -> next)
		{
			if (Program_Version_Flash_Mem((unsigned short *) p -> fileblock, pAddr, p -> length) != OK)
			{
				fprintf(stderr, "Write Flash ROM ERROR!\n");
				return UPDATE_WRITE_ERROR;
			}
			pAddr += p -> length / 2;
			count -= p -> length / 2;
		}
             SetVersionUpdateFlag ( 0x32 );/*2004-7-12 fujiangdong update begin*/
	}

	#ifdef __UPDATE_DEBUG__
	printf("Write Flash OK.\n");
	#endif
	return UPDATE_OK;
}

#ifdef __UPDATE_DEBUG__
static void CheckUpdateBlock(s_updateblock * ptr)
{
	s_updateblock * p;
	int i;
	
	for (p = ptr, i = 0; p != NULL; p = p -> next, i++)
	{
		/* none */
	}
	printf("There are %d blocks in the Update file\n", i);
	return;
}
#endif

#ifdef __cplusplus
}
#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日本不卡123| 色播五月激情综合网| 成人91在线观看| 欧美日韩大陆在线| 国产精品久久久久久久岛一牛影视| 亚洲成人av在线电影| 波多野结衣视频一区| 精品国产一区二区精华| 樱花草国产18久久久久| 成人一级视频在线观看| 久久综合一区二区| 捆绑变态av一区二区三区| 欧美三级乱人伦电影| |精品福利一区二区三区| 国产美女精品在线| 日韩女优电影在线观看| 亚洲成av人在线观看| 色嗨嗨av一区二区三区| 亚洲国产精品传媒在线观看| 精品一区二区三区香蕉蜜桃| 91精品啪在线观看国产60岁| 亚洲一级在线观看| 色诱视频网站一区| 亚洲视频在线观看一区| 成人美女视频在线看| 欧美激情在线看| 高清国产午夜精品久久久久久| 欧美精品一区二区三区蜜桃视频 | 欧美精品三级日韩久久| 亚洲欧美色图小说| caoporm超碰国产精品| 中文字幕亚洲欧美在线不卡| 成人精品高清在线| 亚洲欧洲精品一区二区三区 | 韩国女主播一区| 精品剧情在线观看| 狠狠色综合播放一区二区| 久久综合狠狠综合久久综合88| 久国产精品韩国三级视频| 日韩你懂的电影在线观看| 久久国产精品一区二区| 26uuu亚洲综合色| 国产91丝袜在线播放| 国产精品电影一区二区| 91久久线看在观草草青青| 亚洲尤物视频在线| 7777精品伊人久久久大香线蕉超级流畅| 亚洲一区二区三区激情| 欧美一级视频精品观看| 激情文学综合丁香| 国产精品欧美一区喷水| 色呦呦国产精品| 视频精品一区二区| 欧美变态tickling挠脚心| 国产精品12区| 一区二区久久久久| 制服丝袜成人动漫| 国产精品一区三区| 亚洲精品午夜久久久| 日韩一区二区三区视频在线 | 日本美女一区二区| 久久精品在这里| 色狠狠一区二区| 蜜臀av性久久久久蜜臀av麻豆| 精品国产青草久久久久福利| 成人免费看视频| 日韩vs国产vs欧美| 国产午夜亚洲精品不卡| 在线看国产日韩| 国产在线国偷精品免费看| 亚洲蜜臀av乱码久久精品| 日韩欧美视频一区| 色哟哟精品一区| 国产呦萝稀缺另类资源| 亚洲裸体在线观看| 久久综合网色—综合色88| 色婷婷综合久久久中文一区二区| 秋霞午夜av一区二区三区| 国产精品视频观看| 日韩西西人体444www| 色综合久久88色综合天天6| 久久精品国产99国产| 亚洲乱码国产乱码精品精可以看| 337p日本欧洲亚洲大胆精品 | 亚洲欧美在线另类| 日韩一本二本av| 在线免费观看成人短视频| 国内久久婷婷综合| 日本欧美在线观看| 一区二区激情视频| 亚洲欧洲一区二区在线播放| 精品剧情在线观看| 欧美一区二区在线视频| 色欧美片视频在线观看| 成人午夜短视频| 国产精品自在在线| 日韩成人一区二区三区在线观看| 日韩一区有码在线| 国产人成亚洲第一网站在线播放| 日韩一区二区三区精品视频| 欧美性猛交一区二区三区精品| 成人av片在线观看| 国产91丝袜在线观看| 国产福利视频一区二区三区| 日本v片在线高清不卡在线观看| 一区二区三区免费网站| 亚洲欧美视频在线观看视频| 国产精品另类一区| 欧美国产日韩精品免费观看| 久久免费视频色| 精品国产精品网麻豆系列| 欧美一级淫片007| 欧美一区二区三区免费观看视频| 久久精品人人做人人综合| 在线不卡免费欧美| 91精品欧美久久久久久动漫 | 日日夜夜免费精品| 午夜不卡在线视频| 午夜亚洲福利老司机| 三级亚洲高清视频| 免费欧美高清视频| 国产在线一区二区综合免费视频| 免费精品视频在线| 国产一区二区三区香蕉| 国产精品乡下勾搭老头1| 成人中文字幕合集| 91麻豆国产福利在线观看| 97se亚洲国产综合自在线| 色婷婷国产精品久久包臀| 欧美亚洲丝袜传媒另类| 欧美精品丝袜久久久中文字幕| 欧美一区二区三区喷汁尤物| 久久青草国产手机看片福利盒子| 精品国产污网站| 国产精品久久久久9999吃药| 亚洲免费观看高清完整版在线观看| 亚洲精品高清在线| 日韩福利电影在线观看| 国产一区欧美二区| av成人老司机| 在线成人免费视频| www激情久久| 综合精品久久久| 日韩国产欧美在线观看| 国产精品123区| 欧美少妇xxx| 亚洲精品一区二区三区蜜桃下载| 国产精品家庭影院| 亚洲国产精品久久人人爱| 狠狠色狠狠色综合日日91app| 床上的激情91.| 欧美精品视频www在线观看| 国产欧美一二三区| 亚洲电影一区二区| 国产成人丝袜美腿| 欧美日韩国产成人在线免费| 国产日韩欧美麻豆| 婷婷成人激情在线网| 丁香婷婷综合网| 欧美一区二区在线免费播放| 国产精品久久久久精k8| 裸体在线国模精品偷拍| 91在线视频官网| 日韩免费高清av| 亚洲综合久久久久| 国产白丝网站精品污在线入口| 欧美日韩一区二区三区四区| 中文字幕乱码久久午夜不卡| 日韩国产精品91| 色综合久久久久| 国产精品视频在线看| 久久97超碰色| 6080yy午夜一二三区久久| 亚洲天堂久久久久久久| 国产乱子轮精品视频| 91精品麻豆日日躁夜夜躁| 亚洲精品高清在线| 本田岬高潮一区二区三区| 久久久综合九色合综国产精品| 日韩电影免费在线| 欧美伊人久久久久久久久影院| 国产亚洲一区字幕| 久久成人18免费观看| 91精品国产综合久久香蕉的特点 | 国产高清不卡二三区| 欧美嫩在线观看| 一区二区三区免费看视频| 不卡大黄网站免费看| 日本一区二区在线不卡| 精品一区二区日韩| 欧美大片在线观看一区二区| 五月天激情综合网| 欧美三级视频在线| 亚洲电影视频在线| 欧美人成免费网站| 午夜天堂影视香蕉久久| 欧美性极品少妇| 亚洲成人先锋电影| 欧美挠脚心视频网站| 青青草视频一区|