secureboot.c

来自「基于h323协议的软phone」· C语言 代码 · 共 1,453 行 · 第 1/3 页

C
1,453
字号
	}
	*ptr_port = ntohs(client_addr.sin_port);
	printf("client port %u\n", *ptr_port);
	return data_fd;
}

int FtpPrepareTransfer(int ctrl_fd, unsigned short port)
{
	unsigned char port_data[32];
	unsigned int i_ip;
	/**
	* Command TYPE
	*/
	if (FtpCommand(ctrl_fd, ftp_type_cmd, "I") < 0)
	{
		printf("TYPE I command error\n");
		return SECURE_UPDATE_CONN_ERROR;
	}
	/**
	* PASS reply should be "200"
	*/
	if (FtpRecvReply(ctrl_fd) < 0 || ftp_reply[0] != '2')
	{
		printf("error recv TYPE I\n");
		return SECURE_UPDATE_CONN_ERROR;
	}
	else
	{
		printf("%.3s: TYPE set to binary\n", ftp_reply);
	}
	/**
	* Command PORT
	*/
	memset(port_data, 0, 32);
	if (ifAddrGet("IPPhone0", port_data) != 0)
	{
		printf("error get ip\n");
		return SECURE_UPDATE_CONN_ERROR;
	}
	i_ip = ntohl(inet_addr(port_data));
	memset(port_data, 0, 32);
	/**
	* 获得自己的IP
	*/
	sprintf(port_data, "%u,%u,%u,%u,%u,%u", 
		(unsigned char) (i_ip >> 24), 
		(unsigned char) (i_ip >> 16),
		(unsigned char) (i_ip >> 8),
		(unsigned char) (i_ip),
		(unsigned char) (port >> 8),
		(unsigned char) port
		);
	if (FtpCommand(ctrl_fd, ftp_port_cmd, port_data) < 0)
	{
		printf("PORT command error\n");
		return SECURE_UPDATE_CONN_ERROR;
	}
	/**
	* PORT reply should be "200"
	*/
	if (FtpRecvReply(ctrl_fd) < 0 || ftp_reply[0] != '2')
	{
		printf("error recv PORT\n");
		return SECURE_UPDATE_CONN_ERROR;
	}
	else
	{
		printf("%.3s: PORT set to %u.%u.%u.%u.%u.%u\n", ftp_reply,
		(unsigned char) (i_ip >> 24), 
		(unsigned char) (i_ip >> 16),
		(unsigned char) (i_ip >> 8),
		(unsigned char) (i_ip),
		(unsigned char) (port >> 8),
		(unsigned char) port
		);
	}
	return SECURE_UPDATE_OK;
}

int FtpGetUpdate(int ctrl_fd, int data_fd, const char * filename)
{
	int transfer_fd;
	int len = sizeof(struct sockaddr);
	struct sockaddr_in addr;
	s_updateblock update_block; 
	s_updateblock * ptr_block;
	int count, result;
	int fileType;
int kkk = 0;
	/**
	* Command RETR
	*/
	if (FtpCommand(ctrl_fd, ftp_retr_cmd, filename) < 0)
	{
		printf("RETR command error\n");
		return SECURE_UPDATE_CONN_ERROR;
	}
	/**
	* RETR reply should be "150"
	*/
	if (FtpRecvReply(ctrl_fd) < 0)
	{
		printf("error recv RETR\n");
		return SECURE_UPDATE_CONN_ERROR;
	}
	else if (ftp_reply[0] != '1')
	{
		printf("RETR file error\n");
		return SECURE_UPDATE_FILE_NOTEXIST;
	}
	else
	{
		printf("%.3s: RETR success\n", ftp_reply);
	}
	/**
	* accept server connect
	*/
	if ((transfer_fd = accept(data_fd, (struct sockaddr *) &addr, &len)) < 0)
	{
		printf("accept server\n");
		return SECURE_UPDATE_CONN_ERROR;
	}
	printf("server port %u\n", ntohs(addr.sin_port));
	
	count = 0;
	update_block.next = NULL;
	ptr_block = & update_block;
	fileType = 0;
	/**
	* get data
	*/
	while ((len = recv(transfer_fd, ftp_fileblock, 1024, 0)) > 0)
	{
		/*判断文件头是否有效*/
		if ( count == 0 )
		{
			if (len > 4)
			{
#include "phonerecord.h"		

#ifndef MAX_PHONE_BOOK
#define MAX_PHONE_BOOK	200
#endif

#ifndef MAX_CALL_RECORD
#define MAX_CALL_RECORD	40
#endif

#ifndef BOOT_LINE_SIZE
#define BOOT_LINE_SIZE 	255
#endif

#ifndef CONFIG_LOCATION
#define CONFIG_LOCATION	((BOOT_LINE_SIZE + 1023) & ~1023)	/* Location of configuration items */
#endif

				struct s_config config;
				
				/*int sizePhoneBook = sizeof(struct s_phonebook) * (MAX_PHONE_BOOK+1);
				int sizeCallRecord = sizeof(struct s_callrecord) * (MAX_CALL_RECORD+1);
				int sizePhoneConfig = sizeof(struct s_config);
				int offset = CONFIG_LOCATION + sizePhoneBook + sizeCallRecord*3;
				memset(&config, 0, sizeof(struct s_config));
				if (sysNvRamGet((char *) &config, sizePhoneConfig - 1, offset) != OK)
				{
					printf("read phone config error. load default param!\n");
				*/	config.bootFileHead[0] = 0xFE;
					config.bootFileHead[1] = 0x03;
					config.bootFileHead[2] = 0x00;
					config.bootFileHead[3] = 0xEA;
					config.appFileHead[0] = 0x08;
					config.appFileHead[1] = 0x78;
					config.appFileHead[2] = 0x9C;
					config.appFileHead[3] = 0xDC;
				/*}*/
				if ( memcmp(ftp_fileblock, config.bootFileHead, 4) == 0 )
					fileType = 1;
				if ( memcmp(ftp_fileblock, config.appFileHead, 4) == 0 )
					fileType = 2;
			}
			if (fileType != 1 && fileType != 2)
			{
				printf("file type error!\n\n");
				return SECURE_UPDATE_INVALID_FILE;
			}
		}
		kkk++;
		if ((count + len) > COMPRESSED_IMAGE_SIZE ||
			(ptr_block -> next = ConstructBlockNode()) == NULL)
		{
			printf("count + len = %d\n", count+len);
			printf("COMPRESSED_IMAGE_SIZE = %d\n", COMPRESSED_IMAGE_SIZE);
			printf("kkk = %d\n", kkk);
			printf("file too long, can't malloc\n");
			/* 释放内存 */
			ClearUpdateBlock(update_block.next);
			return SECURE_UPDATE_NO_SPACE;;
		}
		ptr_block = ptr_block -> next;
		memcpy(ptr_block -> fileblock, ftp_fileblock, len);
		ptr_block -> length = len;
		count += len;
	}
	if (count == 0)
	{
		printf("file size is 0!!!\n\n");
		return SECURE_UPDATE_INVALID_FILE;
	}
	/**
	* RETR reply after transfer should be "226"
	*/
	if (FtpRecvReply(ctrl_fd) < 0 || ftp_reply[0] != '2')
	{
		printf("error while transfer\n");
		/* 释放内存 */
		ClearUpdateBlock(update_block.next);
		return SECURE_UPDATE_CONN_ERROR;
	}
	else
	{
		printf("%.3s: transfer completed\n", ftp_reply);
		printf("file %s %d bytes got\n", filename, count);
	}
	
	close(data_fd);
	FtpQuitServer(ctrl_fd);
	close(ctrl_fd);
	
	/* 写入Flash */
	result = UpdateFlashRom(update_block.next, count, fileType);
	ClearUpdateBlock(update_block.next);
	
	if (result == SECURE_UPDATE_OK)
	{
		printf("Update OK.\n");
	}

	return result;
}

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

/*******************************************************
* Part FTP_UPDATE
*******************************************************/
int FtpUpdate()
{
	int ctrl_fd, data_fd;
	unsigned short data_port;
	int result;
	unsigned int ftpserver;

	printf("Begin FTP Update...\n");
	printf("fujiangdong: ftp server = %s\n", ftpServer);
	printf("fujiangdong: ftp user = %s\n", ftpUser);
	printf("fujiangdong: ftp pass = %s\n", ftpPwd);
	printf("fujiangdong: update file = %s\n", updateFile);
	convertString2Int(ftpServer, &ftpserver);
	printf("fujiangdong: ftp server ip = %x\n", ftpserver);
	if ((ctrl_fd = FtpOpenCtrlConn(ftpserver)) < 0)
	{
		printf("can not connect to server\n");
		return SECURE_UPDATE_CONN_ERROR;
	}
	if ((result = FtpLoginServer(ctrl_fd, 
		(strlen(ftpUser)==0?"anonymous":ftpUser), 
		ftpPwd)) 
		< 0)
	{
		close(ctrl_fd);
		printf("login error\n");
		return result;
	}	

	if ((data_fd = FtpInitDataConn(ftpServer, &data_port)) < 0)
	{
		close(ctrl_fd);
		printf("error open data connection\n");
		return data_fd;
	}

	if ((result = FtpPrepareTransfer(ctrl_fd, data_port)) < 0)
	{
		close(data_fd);
		close(ctrl_fd);
		printf("error prepare for transfer\n");
		return result;
	}
	if ((result = FtpGetUpdate(ctrl_fd, data_fd, updateFile)) < 0)
	{
		close(data_fd);
		close(ctrl_fd);
		printf("error get ftp update file\n");
		return result;
	}
	/*close(data_fd);
	FtpQuitServer(ctrl_fd);
	close(ctrl_fd);*/
	
	printf("FTP Update OK.\n");

	return SECURE_UPDATE_OK;
}

static void showInputInfo(char *info, char *old)
{
	lcdCursorPos pos;
	ClearLcd();
	WriteLcd(info, 0, 0);
	if (old != NULL && old[0] != '\0')
	{
		WriteLcd(old, 1, 0);
		LcdDShowCursor(TRUE);
		strcpy(digit_set, old);
		digit_index = strlen(old);
		return;
	}
	else
	{
		pos.row = 1;
		pos.col = 0;
		lcdSetCurPos(pos);
		LcdDShowCursor(TRUE);
		memset(digit_set, 0, sizeof(digit_set));
		digit_index = 0;
	}
}

static void doUpdate(int* psState)
{
	int ret;
	ClearLcd();
	WriteLcd(SECURE_SYSTEM_UPDATING, 0, 0);
	WriteLcd(SECURE_PLEASE_WAIT, 1, 0);
	
	ret = FtpUpdate();
	ClearLcd();
	WriteLcd(SECURE_PLEASE_WAIT, 0, 0);
	switch(ret)
	{
		case SECURE_UPDATE_OK:
			WriteLcd(SECURE_UPDATE_OK_AND_REBOOT1, 0, 0);
			WriteLcd(SECURE_UPDATE_OK_AND_REBOOT2, 1, 0);
			taskDelay(300);
			ClearLcd();
			WriteLcd(SECURE_SYSTEM_REBOOTING, 0, 0);
			system_reboot();
			break;
			
		case SECURE_UPDATE_CONN_ERROR:
			WriteLcd(SECURE_FTP_CONNECTION_ERROR, 1, 0);
			taskDelay(300);
			*psState = SET_FTPSERVER_STATE;
			showInputInfo(stateInfo[SET_FTPSERVER_STATE], ftpServer);
			break;
			
		case SECURE_UPDATE_PASSWD_ERROR:
			WriteLcd(SECURE_FTP_INVALID_ID_OR_PIN, 1, 0);
			taskDelay(300);
			*psState = SET_PWD_STATE;
			showInputInfo(stateInfo[SET_PWD_STATE], ftpPwd);
			break;
			
		case SECURE_UPDATE_FILE_NOTEXIST:
		case SECURE_UPDATE_NO_SPACE:
		case SECURE_UPDATE_WRITE_ERROR:
		case SECURE_UPDATE_INVALID_FILE:
		case SECURE_UPDATE_TOO_LONG:
		default:
			WriteLcd(SECURE_FTP_UNKNOWN_ERROR, 1, 0);
			taskDelay(300);
			*psState = SET_UPDATEFILE_STATE;
			showInputInfo(stateInfo[SET_UPDATEFILE_STATE], updateFile);
	}
}

static void cancel_key_process(char *info)
{
	if (digit_index <= 0)
		return;

	digit_set[--digit_index] = '\0';
	ClearLcd();
	WriteLcd(info, 0, 0);
	WriteLcd(digit_set, 1, 0);
	LcdDShowCursor(TRUE);
	return;
}

static int doCancel(int* psState, int curState, char *info)
{
	if (digit_index <= 0)
	{
		*psState = curState-1;
		showInputInfo(stateInfo[curState-1], info);
		return 0;
	}
	cancel_key_process(stateInfo[curState]);
	return 0;
}

static int timeout_event_process(struct prcess_event* psEvent, int maxLen)
{
	lcdCursorPos pos;
	msg = (NonWrapperMsg *)psEvent->pMsg;
	if (msg->digit != digit_timer)
		return 0;

	pos = lcdGetCursorPos();
	pos.col++;
	lcdSetCurPos(pos);	
	lastDigit = 100;
	lastIndex = 0;
	if (digit_index < maxLen)
		digit_index++;
	return 0;	
}

static int collectIpDigit(int* psState, struct prcess_event* psEvent)
{
	char digit;

	msg = (NonWrapperMsg *) psEvent->pMsg;
	if (msg->digit == 11 || digit_index >= SECURE_COLLECT_IP_MAXSIZE)
		return 0;

	digit = msg->digit + '0';
	if ((digit_index+1) % 4 == 0)
	{
		if (msg->digit != 10)
			return 0;
		digit = '.';
	}
	else if (msg->digit == 10)
	{
		return 0;
	}
	lcdPutCharRel(digit);
	LcdDShowCursor(TRUE);
	digit_set[digit_index] = digit;
	digit_index++;
	digit_set[digit_index] = '\0';
	return 0;

}

static void formatIPStr(char *oldStr, char *newStr)
{
	char temp[4];
	temp[3] = (oldStr[12]-'0')*100+(oldStr[13]-'0')*10+(oldStr[14]-'0');
	temp[2] = (oldStr[8]-'0')*100+(oldStr[9]-'0')*10+(oldStr[10]-'0');
	temp[1] = (oldStr[4]-'0')*100+(oldStr[5]-'0')*10+(oldStr[6]-'0');
	temp[0] = (oldStr[0]-'0')*100+(oldStr[1]-'0')*10+(oldStr[2]-'0');
	sprintf(newStr, "%d.%d.%d.%d", temp[0], temp[1], temp[2], temp[3]);
}

static int setupNetwork(int* psState)
{
	char ip[16];
	unsigned int mask;
	char gateway[16];
	

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?