📄 savemem.c
字号:
/*****************************************************************************
* 版权所有(C) 2006, ZTE Corp. WiMAX
*----------------------------------------------------------------------------
* 模 块 名 : BSP
* 文件名称 : savemem.c
* 文件标识 : {[N/A]}
* 内容摘要 : 本文件用于测试之目的, 在于将单板上内存中的数据保存到后台HOST
* 注意事项 : 独立性较强, 包含路径都在系统目录下, 配置数据在头部
* 作 者 : 田瑞忠
* 创建日期 : 2006-3-14
* 当前版本 : Ver1.0
*----------------------------------------------------------------------------
* 变更记录 :
*
* $记录1
* 变 更 单: $0000000(N/A)
* 责 任 人: 田瑞忠
* 修改日戳: 2006-3-14
* 变更说明: 创建文件
*
*----------------------------------------------------------------------------
*/
/*
#define OK 0
#define ERROR -1
#define NULL (void *)0
#define TRUE 0xffffffff
#define FTP_COMPLETE 2
*/
#include "vxWorks.h"
#include "string.h"
#include "stdlib.h"
#include "stdio.h"
#include "ioLib.h"
#include "ftpLib.h"
static char ftpServerName[80] = "";
static char ftpUserName[40] = "";
static char ftpUserPwd[40] = "";
extern char *sysBootLine;
#define FTP_SERVER ftpServerName
#define FTP_USER ftpUserName
#define FTP_PWD ftpUserPwd
#define MSG_LOW printf
#define SUCCESS 0
#define FAILURE 0xffffffff
ULONG getDwordData(void *p) { return (ULONG)(*(ULONG *)p); }
ULONG getWordData(void *p) { return (ULONG)(*(USHORT *)p); }
ULONG getByteData(void *p) { return (ULONG)(*(UCHAR *)p); }
ULONG getNoneData(void *p) { return 0; }
static ULONG (*pGetDataFun[5])(void *) = {
getNoneData,
getByteData,
getWordData,
getNoneData,
getDwordData,
};
/*****************************************************************************
* 函数名称 : initCheck(*)
* 功能描述 : 初始化检查, 用于得到启动行参数中宿主机名用FTP用户名密码
* 读全局变量 : 无
* 写全局变量 : 无
* 输入参数 : 无
* 输出参数 : 无
* 返 回 值 : 无
* 其它说明 : 无
*----------------------------------------------------------------------------
* 历史记录(变更单, 责任人@修改日期, 操作说明)
* $0000000(N/A), 田瑞忠@2006-10-24 16:27, 创建函数,
*----------------------------------------------------------------------------
*/
static void initCheck(void)
{
static int initialized = 0;
int iTemp;
char *p;
if (initialized) return;
p = strstr(sysBootLine, "h=") + 2;
for (iTemp = 0; iTemp < 79 && p[iTemp] != ' '; iTemp++)
ftpServerName[iTemp] = p[iTemp];
ftpServerName[iTemp] = 0;
p = strstr(sysBootLine, "u=") + 2;
for (iTemp = 0; iTemp < 39 && p[iTemp] != ' '; iTemp++)
ftpUserName[iTemp] = p[iTemp];
ftpUserName[iTemp] = 0;
p = strstr(sysBootLine, "pw=") + 3;
for (iTemp = 0; iTemp < 39 && p[iTemp] != ' '; iTemp++)
ftpUserPwd[iTemp] = p[iTemp];
ftpUserPwd[iTemp] = 0;
printf("FTP server: %s, User %s, Pwd %s.\n", ftpServerName, ftpUserName, ftpUserPwd);
initialized = 1;
} /* initCheck() */
/*****************************************************************************
* 函数名称 : GetFileFromHost(*)
* 功能描述 : 从宿主机上下载文件
* 读全局变量 : 无
* 写全局变量 : 无
* 输入参数 : pcFile_Name- 要下载的文件名
pucBuf - 下载文件存储位置
dwBufSize - 缓存区空间大小
* 输出参数 : pucBuf - 下载的文件
* 返 回 值 : 文件的字节数
* 其它说明 : 无
*----------------------------------------------------------------------------
* 历史记录(变更单, 责任人@修改日期, 操作说明)
* $0000000(N/A), 田瑞忠@2006-3-14 09:35, 创建函数,
*----------------------------------------------------------------------------
*/
ULONG GetFileFromHost(char *pcFile_Name, UCHAR *pucBuf, ULONG dwBufSize)
{
int iFd = 0;
int iFtpCtrFd = 0;
int iReadCount = 1;
int iBufLen = (int)dwBufSize;
UCHAR *pucRead = NULL;
initCheck();
/*------------------------------------------------------------------------
* 打开 FTP 设备进行文件传输 */
if (ERROR == ftpXfer(FTP_SERVER, FTP_USER, FTP_PWD, "",
"RETR %s", "", pcFile_Name, &iFtpCtrFd, &iFd))
{
MSG_LOW("Fail to get source file %s.\n",
(ULONG)pcFile_Name, 0, 0, 0, 0, 0);
return FAILURE;
} /* if (ERROR == ftpXfer(...)) */
/*------------------------------------------------------------------------
* 循环读取版本数据 */
for (pucRead = pucBuf; iBufLen > 0 && iReadCount > 0; )
{
iReadCount = read(iFd, (char *)pucRead, iBufLen);
iBufLen -= iReadCount;
pucRead += iReadCount;
} /* for (pucRead = pucVerData; iReadCount > 0; ...) */
/*------------------------------------------------------------------------
* 如果读取失败, 给出出错提示, 释放申请的缓存后返回 */
if (ERROR == iReadCount)
{
MSG_LOW("Fail to read source file %s.\n",
(ULONG)pcFile_Name, 0, 0, 0, 0, 0);
return FAILURE;
} /* if (ERROR == iReadCount) */
close(iFd);
/*------------------------------------------------------------------------
* 通过 FTP 传输读取版本, 要关闭 FTP 设备 */
if (0 != iFtpCtrFd)
{
/*--------------------------------------------------------------------
* 以前曾有使用 ftpReplyGet() 函数以获取 FTP 传输结果是否到文件尾
* 但该系统函数执行非常耗时(约0.3秒), 且非必不可少的步骤, 在此省略
* 田瑞忠 @2005-10-08 16:58
*--------------------------------------------------------------------
* 退出 FTP 连接 */
if (FTP_COMPLETE !=
ftpCommand(iFtpCtrFd, "QUIT", 0, 0, 0, 0, 0, 0))
{
MSG_LOW("Quit FTP error!\n", 0, 0, 0, 0, 0, 0);
} /* if (FTP_COMPLETE != ftpCommand(...)) */
close(iFtpCtrFd);
} /* if (0 != iFtpCtrFd) */
return (pucRead - pucBuf);
} /* GetFileFromHost() */
/*****************************************************************************
* 函数名称 : PutToHostFile(*)
* 功能描述 : 将数据保存到宿主机文件
* 读全局变量 : 无
* 写全局变量 : 无
* 输入参数 : pcFile_Name- 要保存的文件名
pucBuf - 数据存储位置
dwBufSize - 数据大小
dwMode - 保存的模式: 0, 二进制文件(默认)
1, 单字节HEX文本
2, 双字节HEX文本
4, 四字节HEX文本
其它, 非法
* 输出参数 : 无
* 返 回 值 : 文件的字节数
* 其它说明 : 无
*----------------------------------------------------------------------------
* 历史记录(变更单, 责任人@修改日期, 操作说明)
* $0000000(N/A), 田瑞忠@2006-3-14 09:36, 创建函数,
*----------------------------------------------------------------------------
*/
ULONG PutToHostFile(char *pcFile_Name,
UCHAR *pucBuf,
ULONG dwBufSize,
ULONG dwMode)
{
int iFd = 0;
int iFtpCtrFd = 0;
ULONG dwWriteCount;
char *strFileName = pcFile_Name;
initCheck();
/*------------------------------------------------------------------------
* 文件名更正 */
if (0 != dwMode)
{
strFileName = (char *)malloc(strlen(pcFile_Name) + 4);
/*--------------------------------------------------------------------
* 成功申请内存, 则拷贝文件名到新的缓存 */
if (NULL != strFileName)
{
strcpy(strFileName, pcFile_Name);
/*----------------------------------------------------------------
* 是合法的文件名, 则将扩展类型名变更为".c" */
if (NULL != strchr(strFileName, '.'))
{
strchr(strFileName, '.')[0] = '\0';
strcat(strFileName, ".c");
} /* 修改文件扩展名 */
} /* 保存文件名 */
else
{
strFileName = pcFile_Name;
} /* 使用原来的文件名 */
} /* 文件名更正 */
/*------------------------------------------------------------------------
* 打开 FTP 设备进行文件传输 */
if (ERROR == ftpXfer(FTP_SERVER, FTP_USER, FTP_PWD, "",
"STOR %s", "", strFileName, &iFtpCtrFd, &iFd))
{
MSG_LOW("Fail to create dest file %s.\n",
(ULONG)strFileName, 0, 0, 0, 0, 0);
/* 释放文件名内存空间 */
if (pcFile_Name != strFileName)
{
free(strFileName);
} /* 释放文件名内存空间 */
return FAILURE;
} /* if (ERROR == ftpXfer(...)) */
/*------------------------------------------------------------------------
* 发送内存数据 */
if (0 == dwMode)
{
dwWriteCount = (ULONG)write(iFd, (char *)pucBuf, dwBufSize);
} /* if (0 == dwMode) */
else
{
UCHAR *strWrite = NULL;
/*--------------------------------------------------------------------
* 申请保存字符串的内存 */
if (NULL == (strWrite =(UCHAR *)malloc(2048)))
{
dwWriteCount = 0;
MSG_LOW("Fail to get temp memory for write dest file %s.\n",
(ULONG)strFileName, 0, 0, 0, 0, 0);
} /* 未未成功申请内存 */
else /* 将数据转换为HEX字符串后再存为文件 */
{
int iCount = 0;
int iSprnC = 0;
iSprnC += sprintf((char *)strWrite + iSprnC, "/* %s data array: */"
"\nunsigned char Verdata[] = {\n ", strFileName);
/*----------------------------------------------------------------
* 参数正确性更正 */
if (5 <= dwMode)
{
dwMode = 1;
} /* 参数正确性更正 */
/*----------------------------------------------------------------
* 逐单元打印到缓存中并存入文件 */
for (iCount = 0; iCount < dwBufSize; iCount += dwMode)
{
iSprnC += sprintf((char *)strWrite + iSprnC, "0x%0*x, ",
dwMode * 2, pGetDataFun[dwMode](pucBuf + iCount));
/* 每打印16个字节, 换一行(最后一个字节不换行) */
if (((16 - dwMode) == (iCount % 16)) &&
(iCount < dwBufSize - 1))
{
iSprnC += sprintf((char *)strWrite + iSprnC, "\n ");
} /* 回车换行 */
/* 如果数据足够多(多保留点内存), 则将它写入文件 */
if (iSprnC > 1960)
{
dwWriteCount = (ULONG)write(iFd, (char *)strWrite, iSprnC);
/* 如果发生写入错误则退出 */
if (dwWriteCount != iSprnC)
{
break;
} /* 异常退出 */
iSprnC = 0;
} /* 写入到文件之中 */
} /* 逐单元打印到缓存中并存入文件 */
iSprnC += sprintf((char *)strWrite + iSprnC, "\n};\n"
"unsigned long VerSize = %ld;", iCount);
dwWriteCount = (ULONG)write(iFd, (char *)strWrite, iSprnC);
free(strWrite);
/*----------------------------------------------------------------
* 校正是否写完全 */
if (dwWriteCount != iSprnC)
{
dwWriteCount = 0;
} /* 没写完全, 出错 */
else
{
dwWriteCount = iCount;
} /* 写完全, 则将写入长度改为数据字节数 */
} /* if (NULL != (strWrite = malloc(2048))) */
} /* if (0 != dwMode) */
/*------------------------------------------------------------------------
* 如果发送失败, 给出出错提示后返回 */
if (dwBufSize != dwWriteCount)
{
MSG_LOW("Fail to write dest file %s.\n",
(ULONG)strFileName, 0, 0, 0, 0, 0);
/* 释放文件名内存空间 */
if (pcFile_Name != strFileName)
{
free(strFileName);
} /* 释放文件名内存空间 */
return FAILURE;
} /* if (dwBufSize != dwWriteCount) */
close(iFd);
/*------------------------------------------------------------------------
* 通过 FTP 传输读取版本, 要关闭 FTP 设备 */
if (0 != iFtpCtrFd)
{
/*--------------------------------------------------------------------
* 等待传输真正结束, 期望到文件尾 */
if (FTP_COMPLETE != ftpReplyGet(iFtpCtrFd, TRUE))
{
MSG_LOW("Transfer file error!\n", 0, 0, 0, 0, 0, 0);
} /* 等待传输真正结束 */
/*--------------------------------------------------------------------
* 退出 FTP 连接 */
if (FTP_COMPLETE !=
ftpCommand(iFtpCtrFd, "QUIT", 0, 0, 0, 0, 0, 0))
{
MSG_LOW("Quit FTP error!\n", 0, 0, 0, 0, 0, 0);
} /* if (FTP_COMPLETE != ftpCommand(...)) */
close(iFtpCtrFd);
} /* if (0 != iFtpCtrFd) */
/*------------------------------------------------------------------------
* 释放文件名内存空间 */
if (pcFile_Name != strFileName)
{
free(strFileName);
} /* 释放文件名内存空间 */
return dwWriteCount;
} /* PutToHostFile() */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -