ftp_var_example.c
来自「开放源码实时操作系统源码.」· C语言 代码 · 共 567 行 · 第 1/2 页
C
567 行
void
expand_file_name(char *file_name, char *path, char *ip)
{
char *fn = nvram_get("dump_name");
char *dp = file_name;
char last = '\0';
if (!fn) fn = "XPathOS.%i.core.gz";
if (!path) path = "/";
while (*path) {
last = *path++;
*dp++ = last;
}
if (last != '/') {
*dp++ = '/';
}
while (*fn) {
if (*fn == '%') {
fn += 2; // Skip '%i'
while (*ip) {
*dp++ = *ip++;
}
} else {
*dp++ = *fn++;
}
}
*dp = '\0';
}
void
do_core_dump(core_info_t *cp, char *ip)
{
struct core_dump_param cd;
// Caution - this can't be on the stack unless you increase the stack size!
static struct ftp_data dp;
int err, wlen, i;
unsigned long total_ram_size;
char file_name[256];
char *dump_ip, *dump_user, *dump_pass;
dump_ip = nvram_get("dump_server");
if (!dump_ip) {
diag_printf("Can't dump: server IP missing in NVRAM\n");
return;
}
dump_user = nvram_get("dump_user");
if (!dump_user) {
diag_printf("Can't dump: user name missing in NVRAM\n");
return;
}
dump_pass = nvram_get("dump_pass");
if (!dump_pass) {
diag_printf("Can't dump: password missing in NVRAM\n");
return;
}
expand_file_name(file_name, nvram_get("dump_path"), ip);
// Fill in core dump structures
cd.hdr.c_midmag = KCORE_HDR_MAGIC;
cd.hdr.c_hdrsize = ALIGN(sizeof(cd.hdr), 8);
cd.hdr.c_seghdrsize = ALIGN(sizeof(cd.cpu_hdr), 8);
cd.hdr.c_nseg = cp->nsegs;
cd.cpu_hdr.c_midmag = KCORE_CPU_SEGMENT;
cd.cpu_hdr.c_size = sizeof(kcore_seg_t)+sizeof(cpu_kcore_hdr_t)+(cp->nsegs*sizeof(phys_ram_seg_t));
// Copy info from core-dump area
cd.cpu_info.pvr = cp->pvr;
cd.cpu_info.sdr1 = cp->sdr1;
for (i = 0; i < 8; i++) {
cd.cpu_info.sr[i] = cp->sr[i];
cd.cpu_info.dbatl[i] = cp->dbatl[i];
cd.cpu_info.dbatu[i] = cp->dbatu[i];
cd.cpu_info.ibatl[i] = cp->ibatl[i];
cd.cpu_info.ibatu[i] = cp->ibatu[i];
}
for (i = 0; i < 8; i++) {
cd.cpu_phys_segs[i].start = cp->physical_banks[i].base;
cd.cpu_phys_segs[i].size = cp->physical_banks[i].length;
}
total_ram_size = 0;
cd.ram_hdr.c_midmag = KCORE_DATA_SEGMENT;
cd.ram_hdr.c_size = sizeof(kcore_seg_t)+total_ram_size;
cd.phase = 0;
cd.cp = cp;
dp.len = 0;
dp.get_data = dump_core;
dp.get_param = &cd;
dp.src_len = 1;
dp.first = 1;
dp.stream.next_in = 0;
dp.stream.avail_in = 0x1000;
dp.stream.next_out = dp.buf;
dp.stream.avail_out = FTP_BUFSIZE;
dp.stream.zalloc = (alloc_func)0;
dp.stream.zfree = (free_func)0;
dp.stream.opaque = (voidpf)0;
err = deflateInit(&dp.stream, Z_DEFAULT_COMPRESSION);
diag_printf("err = %d\n", err);
diag_printf("... dumping core as %s\n", file_name);
wlen = ftp_put_var(dump_ip, dump_user, dump_pass, file_name,
_ftp_write_gz, &dp, ftpclient_printf);
diag_printf("res = %d\n", wlen);
deflateEnd(&dp.stream);
}
void
scan_args(char *cmdline, int *argc, char **argv, char **alt_cmdline)
{
char *cp = cmdline;
int indx = 0;
argv[indx++] = "secondary-load";
*alt_cmdline = (char *)0;
while (*cp) {
// Skip over any white space
while (*cp && (*cp == ' ')) cp++;
if (!*cp) break;
// Check for -- break
if ((cp[0] == '-') && (cp[1] == '-')) {
// End of normal list
cp += 2;
while (*cp && (*cp == ' ')) cp++;
*alt_cmdline = cp;
*argc = indx;
return;
}
// Split argument
argv[indx++] = cp;
while (*cp) {
if (*cp == ' ') {
*cp++ = '\0';
break;
}
cp++;
}
}
*argc = indx;
}
int
loader_main(char *cmdline)
{
int len, wlen;
int err;
int argc, i;
char *argv[MAX_ARGV], *alt_cmdline;
bool force_dump = false;
bool quick_boot = false;
bool verbose = false;
char *boot_info = (char *)NULL;
// Caution - this can't be on the stack unless you increase the stack size!
static struct ftp_data dp;
struct _simple_get_data_param gp;
#ifdef CYGHWR_NET_DRIVER_ETH0
char eth0_ip[32], eth0_netmask[32], eth0_broadcast[32];
#endif
#ifdef CYGHWR_NET_DRIVER_ETH1
char eth1_ip[32], eth1_netmask[32], eth1_broadcast[32];
#endif
char *eth_gateway;
scan_args(cmdline, &argc, argv, &alt_cmdline);
while (1) {
i = getopt(argc, argv, "fqv");
if (i < 0) break;
switch (i) {
case 'f':
force_dump = true;
break;
case 'q':
quick_boot = true;
break;
case 'v':
verbose = true;
break;
default:
diag_printf("Invalid return from getopt: %d\n", i);
}
}
if (optind < argc) {
boot_info = argv[optind];
};
if (!(eth_gateway = nvram_get("net_gateway"))) {
diag_printf("Error: need network gateway\n");
return 1;
}
#ifdef CYGHWR_NET_DRIVER_ETH0
if (!parse_eth_addrs(nvram_get("net0_ip"), nvram_get("net0_mask"),
eth0_ip, eth0_netmask, eth0_broadcast)) {
diag_printf("Can't set up ethernet 'net0' - I give up!\n");
return 1;
}
build_bootp_record(ð0_bootp_data,
eth0_name,
eth0_ip,
eth0_netmask,
eth0_broadcast,
eth_gateway,
"0.0.0.0");
show_bootp(eth0_name, ð0_bootp_data);
if (!init_net(eth0_name, ð0_bootp_data)) {
diag_printf("Network initialization failed for eth0\n");
}
#endif
#ifdef CYGHWR_NET_DRIVER_ETH1
if (!parse_eth_addrs(nvram_get("net1_ip"), nvram_get("net1_mask"),
eth1_ip, eth1_netmask, eth1_broadcast)) {
diag_printf("Can't set up ethernet 'net1' - I give up!\n");
return 1;
}
build_bootp_record(ð1_bootp_data,
eth1_name,
eth1_ip,
eth1_netmask,
eth1_broadcast,
eth_gateway,
"0.0.0.0");
show_bootp(eth1_name, ð1_bootp_data);
if (!init_net(eth1_name, ð1_bootp_data)) {
diag_printf("Network initialization failed for eth1\n");
}
#endif
if (!quick_boot) {
if (!force_dump) {
// See if the 'core dump' page contains an indication that a
// dump should be taken
force_dump = true;
}
do_core_dump(&test_core_info, eth0_ip);
}
do_load(boot_info);
len = ftp_get(FTP_SERV, FTP_USER, FTP_PASS, "TEST.dat",
(char *)0x200000, 0x100000, ftpclient_printf);
diag_printf("res = %d\n", len);
if (len <= 0) exit(0);
wlen = ftp_put(FTP_SERV, FTP_USER, FTP_PASS, "TEST2.dat",
(char *)0x200000, len, ftpclient_printf);
diag_printf("res = %d\n", wlen);
// Set up to compress data
gp.ptr = (char *)0x200000;
gp.len = len;
dp.len = 0;
dp.get_data = simple_get_data;
dp.get_param = &gp;
dp.src_len = 1;
dp.first = 1;
dp.stream.next_in = 0;
dp.stream.avail_in = 0x1000;
dp.stream.next_out = dp.buf;
dp.stream.avail_out = FTP_BUFSIZE;
dp.stream.zalloc = (alloc_func)0;
dp.stream.zfree = (free_func)0;
dp.stream.opaque = (voidpf)0;
err = deflateInit(&dp.stream, Z_DEFAULT_COMPRESSION);
diag_printf("err = %d\n", err);
wlen = ftp_put_var(FTP_SERV, FTP_USER, FTP_PASS, "TEST3.dat.gz",
_ftp_write_gz, &dp, ftpclient_printf);
diag_printf("res = %d\n", wlen);
deflateEnd(&dp.stream);
return 0;
}
int
main(void)
{
return (loader_main("-f -t test joe -- junk"));
}
#endif // _config_OK
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?