fileio.c
来自「eCos操作系统源码」· C语言 代码 · 共 228 行
C
228 行
//==========================================================================//// fileio.c//// RedBoot fileio support////==========================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.// Copyright (C) 2002, 2003, 2004 Gary Thomas//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//==========================================================================//#####DESCRIPTIONBEGIN####//// Author(s): dwmw2, msalter// Date: 2003-11-27// Purpose: // Description: // // This code is part of RedBoot (tm).////####DESCRIPTIONEND####////==========================================================================// Shoot me. But I don't want struct timeval because redboot provides it.#define _POSIX_SOURCE#include <time.h>#undef _POSIX_SOURCE#include <redboot.h>#include <errno.h>#include <stdio.h>#include <fcntl.h>#include <unistd.h>#include <string.h>#ifdef CYGPKG_IO_FLASH#include <cyg/io/io.h>#include <cyg/io/flash.h>#include <cyg/io/config_keys.h>#endif#include <cyg/fileio/fileio.h>#include <cyg/infra/cyg_ass.h> // assertion macrosstatic void do_mount(int argc, char *argv[]);static void do_umount(int argc, char *argv[]);#ifdef CYGPKG_IO_FLASH_BLOCK_DEVICE#define FLASHPART "[-f <partition>] "#else#define FLASHPART#endifRedBoot_cmd("mount", "Mount file system", FLASHPART "[-d <device>] -t fstype", do_mount );RedBoot_cmd("umount", "Unmount file system", "", do_umount );int fileio_mounted = 0;// Mount disk/filesystemstatic voiddo_mount(int argc, char *argv[]){ char *part_str, *dev_str, *type_str; bool part_set = false, dev_set = false, type_set = false; struct option_info opts[3]; int err, num_opts = 2; init_opts(&opts[0], 'd', true, OPTION_ARG_TYPE_STR, (void *)&dev_str, &dev_set, "device"); init_opts(&opts[1], 't', true, OPTION_ARG_TYPE_STR, (void *)&type_str, &type_set, "fstype");#ifdef CYGPKG_IO_FLASH_BLOCK_DEVICE init_opts(&opts[2], 'f', true, OPTION_ARG_TYPE_STR, (void *)&part_str, &part_set, "partition"); num_opts++;#endif CYG_ASSERT(num_opts <= NUM_ELEMS(opts), "Too many options"); if (!scan_opts(argc, argv, 1, opts, num_opts, NULL, 0, NULL)) return; if (!type_set) { diag_printf("Must specify file system type\n"); return; } if (fileio_mounted) { diag_printf("A file system is already mounted\n"); return; }#ifdef CYGPKG_IO_FLASH_BLOCK_DEVICE if (part_set) { int len; cyg_io_handle_t h; if (dev_set && strcmp(dev_str, CYGDAT_IO_FLASH_BLOCK_DEVICE_NAME_1)) { diag_printf("May only set one of <device> or <partition>\n"); return; } dev_str = CYGDAT_IO_FLASH_BLOCK_DEVICE_NAME_1; len = strlen(part_str); err = cyg_io_lookup(dev_str, &h); if (err < 0) { diag_printf("cyg_io_lookup of \"%s\" returned %d\n", err); return; } err = cyg_io_set_config(h, CYG_IO_SET_CONFIG_FLASH_FIS_NAME, part_str, &len); if (err < 0) { diag_printf("FIS partition \"%s\" not found\n", part_str); return; } }#endif err = mount(dev_str, "/", type_str); if (err) { diag_printf("Mount failed %d\n", err); } else {// diag_printf("Mount %s file system succeeded\n", type_str); fileio_mounted = 1; }}static voiddo_umount(int argc, char *argv[]){ if (!fileio_mounted) { return; } umount ("/"); fileio_mounted = 0;}static int fd;externC int fileio_stream_open(connection_info_t *info, int *err){ char *filename = info->filename; if (!fileio_mounted) { diag_printf("No file system mounted\n"); return -1; } fd = open(filename, O_RDONLY); if (fd < 0) { diag_printf("Open failed, error %d\n", errno); return -1; } return 0;}externC int fileio_stream_read(char *buf, int size, int *err){ int nread; if ((nread = read(fd, buf, size)) < 0) { *err = errno; return -1; } return nread;}externC voidfileio_stream_close(int *err){ close(fd);}externC char *fileio_error(int err){ static char myerr[10]; diag_sprintf(myerr, "error %d\n", err); return myerr;}//// RedBoot interface//GETC_IO_FUNCS(fileio_io, fileio_stream_open, fileio_stream_close, 0, fileio_stream_read, fileio_error);RedBoot_load(file, fileio_io, true, true, 0);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?