From 29e92b090c8bc35745aa5c89231ce806bcb11e57 Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Mon, 31 May 2010 13:56:37 +0000 Subject: 2010-05-31 Chris Johns * libcsupport/Makefile.am: Add mount-mgr.c. * libcsupport/src/mount-mgr.c: New. * include/rtems/fs.h: Added rtems_filesystem_location_mount. * libcsupport/include/rtems/libio.h, libcsupport/src/mount.c: New mount interface. It is similar to Linux. * libcsupport/include/rtems/libio_.h: Remove the init_fs_mount_table call. * libcsupport/src/base_fs.c: Remove init_fs_mount_table_call. Use the new mount call. Remove setting the root node in the global pathloc. Mount does this now. * libcsupport/src/privateenv.c: Remove the hack to set the root mount table entry in the environment. * libcsupport/src/unmount.cL Free the target string. * libblock/src/bdpart-mount.c: New mount API. * libfs/src/devfs/devfs.h, libfs/src/devfs/devfs_init.c, libfs/src/dosfs/dosfs.h, libfs/src/dosfs/msdos.h, libfs/src/dosfs/msdos_init.c, libfs/src/imfs/imfs.h, libfs/src/imfs/imfs_eval.c, libfs/src/imfs/imfs_init.c, libfs/src/imfs/miniimfs_init.c, libfs/src/nfsclient/src/librtemsNfs.h, libfs/src/rfs/rtems-rfs-rtems.c, libfs/src/rfs/rtems-rfs.h, libnetworking/lib/ftpfs.c, libnetworking/rtems/ftpfs.h, libnetworking/rtems/tftp.h: New mount_h API. * libfs/src/devfs/devfs_eval.c: Local include of extern ops. * libfs/src/nfsclient/src/nfs.c: New mount API. Removed the mount me call and fixed the initialisation to happen when mounting. * libmisc/Makefile.am, libmisc/shell/shellconfig.h: Remove mount filesystem files. * libmisc/fsmount/fsmount.c, libmisc/fsmount/fsmount.h: Updated to the new mount table values. * libmisc/shell/main_mount_ftp.c, libmisc/shell/main_mount_msdos.c, libmisc/shell/main_mount_rfs.c, libmisc/shell/main_mount_tftp.c: Removed. * libmisc/shell/main_mount.c: Use the new mount API. Also access the file system table for the file system types. * libnetworking/lib/tftpDriver.c: Updated to the new mount API. Fixed to allow mounting from any mount point. Also can now have more than file system mounted. * sapi/include/confdefs.h: Add file system configuration support. --- cpukit/libmisc/Makefile.am | 9 +- cpukit/libmisc/fsmount/fsmount.c | 97 ++++++++++----------- cpukit/libmisc/fsmount/fsmount.h | 31 ++++--- cpukit/libmisc/shell/main_mount.c | 149 ++++++++++---------------------- cpukit/libmisc/shell/main_mount_ftp.c | 37 -------- cpukit/libmisc/shell/main_mount_msdos.c | 35 -------- cpukit/libmisc/shell/main_mount_rfs.c | 36 -------- cpukit/libmisc/shell/main_mount_tftp.c | 37 -------- cpukit/libmisc/shell/shellconfig.h | 39 --------- 9 files changed, 111 insertions(+), 359 deletions(-) delete mode 100644 cpukit/libmisc/shell/main_mount_ftp.c delete mode 100644 cpukit/libmisc/shell/main_mount_msdos.c delete mode 100644 cpukit/libmisc/shell/main_mount_rfs.c delete mode 100644 cpukit/libmisc/shell/main_mount_tftp.c (limited to 'cpukit/libmisc') diff --git a/cpukit/libmisc/Makefile.am b/cpukit/libmisc/Makefile.am index f69c627f48..2fc0464500 100644 --- a/cpukit/libmisc/Makefile.am +++ b/cpukit/libmisc/Makefile.am @@ -76,7 +76,7 @@ libshell_a_SOURCES = shell/cat_file.c shell/cmds.c shell/internal.h \ shell/main_id.c shell/main_logoff.c shell/main_ln.c shell/main_ls.c \ shell/main_mallocinfo.c shell/main_mdump.c shell/main_medit.c \ shell/main_mfill.c shell/main_mkdir.c shell/main_mount.c \ - shell/main_mount_msdos.c shell/main_mmove.c shell/main_msdosfmt.c \ + shell/main_mmove.c shell/main_msdosfmt.c \ shell/main_mv.c shell/main_mwdump.c shell/main_perioduse.c \ shell/main_pwd.c shell/main_rm.c shell/main_rmdir.c shell/main_sleep.c \ shell/main_stackuse.c shell/main_tty.c shell/main_umask.c \ @@ -95,14 +95,13 @@ libshell_a_SOURCES = shell/cat_file.c shell/cmds.c shell/internal.h \ shell/dd-misc.c shell/dd-position.c \ shell/main_hexdump.c shell/hexdump-conv.c shell/hexdump-display.c \ shell/hexdump-odsyntax.c shell/hexdump-parse.c shell/hexsyntax.c \ - shell/main_time.c shell/main_mknod.c shell/main_mount_rfs.c \ + shell/main_time.c shell/main_mknod.c \ shell/main_setenv.c shell/main_getenv.c shell/main_unsetenv.c \ shell/main_mkrfs.c shell/main_debugrfs.c if LIBNETWORKING -libshell_a_SOURCES += shell/main_mount_ftp.c shell/main_mount_tftp.c \ - shell/main_ifconfig.c shell/main_route.c shell/main_netstats.c \ - shell/main_mount_nfs.c +libshell_a_SOURCES += \ + shell/main_ifconfig.c shell/main_route.c shell/main_netstats.c endif endif diff --git a/cpukit/libmisc/fsmount/fsmount.c b/cpukit/libmisc/fsmount/fsmount.c index 2adfcb5d09..5fa52e99f2 100644 --- a/cpukit/libmisc/fsmount/fsmount.c +++ b/cpukit/libmisc/fsmount/fsmount.c @@ -118,82 +118,81 @@ int rtems_fsmount_create_mount_point int rtems_fsmount ( /*-------------------------------------------------------------------------*\ -| Purpose: | -| This function will create the mount points listed and mount the file | -| systems listed in the calling parameters | -+---------------------------------------------------------------------------+ -| Input Parameters: | -\*-------------------------------------------------------------------------*/ - const rtems_fstab_entry *fstab_ptr, - size_t fstab_count, - size_t *fail_idx + | Purpose: | + | This function will create the mount points listed and mount the file | + | systems listed in the calling parameters | + +---------------------------------------------------------------------------+ + | Input Parameters: | + \*-------------------------------------------------------------------------*/ + const rtems_fstab_entry *fstab_ptr, + size_t fstab_count, + size_t *fail_idx ) /*-------------------------------------------------------------------------*\ -| Return Value: | -| 0, if success, -1 and errno if failed | -\*=========================================================================*/ + | Return Value: | + | 0, if success, -1 and errno if failed | + \*=========================================================================*/ { int rc = 0; int tmp_rc; size_t fstab_idx = 0; - rtems_filesystem_mount_table_entry_t *tmp_mt_entry; bool terminate = false; /* * scan through all fstab entries; */ while (!terminate && - (fstab_idx < fstab_count)) { + (fstab_idx < fstab_count)) { tmp_rc = 0; /* * create mount point */ if (tmp_rc == 0) { - tmp_rc = rtems_fsmount_create_mount_point(fstab_ptr->mount_point); + tmp_rc = rtems_fsmount_create_mount_point(fstab_ptr->target); if (tmp_rc != 0) { - if (0 != (fstab_ptr->report_reasons & FSMOUNT_MNTPNT_CRTERR)) { - fprintf(stdout,"fsmount: creation of mount point \"%s\" failed: %s\n", - fstab_ptr->mount_point, - strerror(errno)); - } - if (0 != (fstab_ptr->abort_reasons & FSMOUNT_MNTPNT_CRTERR)) { - terminate = true; - rc = tmp_rc; - } + if (0 != (fstab_ptr->report_reasons & FSMOUNT_MNTPNT_CRTERR)) { + fprintf(stdout,"fsmount: creation of mount point \"%s\" failed: %s\n", + fstab_ptr->target, + strerror(errno)); + } + if (0 != (fstab_ptr->abort_reasons & FSMOUNT_MNTPNT_CRTERR)) { + terminate = true; + rc = tmp_rc; + } } } /* * mount device to given mount point */ if (tmp_rc == 0) { - tmp_rc = mount(&tmp_mt_entry, - fstab_ptr->fs_ops, - fstab_ptr->mount_options, - fstab_ptr->dev, - fstab_ptr->mount_point); + tmp_rc = mount(fstab_ptr->source, + fstab_ptr->target, + fstab_ptr->type, + fstab_ptr->options, + NULL); if (tmp_rc != 0) { - if (0 != (fstab_ptr->report_reasons & FSMOUNT_MNT_FAILED)) { - fprintf(stdout,"fsmount: mounting of \"%s\" to" - " \"%s\" failed: %s\n", - fstab_ptr->dev, - fstab_ptr->mount_point, - strerror(errno)); - } - if (0 != (fstab_ptr->abort_reasons & FSMOUNT_MNT_FAILED)) { - terminate = true; - rc = tmp_rc; - } + if (0 != (fstab_ptr->report_reasons & FSMOUNT_MNT_FAILED)) { + fprintf(stdout,"fsmount: mounting of \"%s\" to" + " \"%s\" failed: %s\n", + fstab_ptr->source, + fstab_ptr->target, + strerror(errno)); + } + if (0 != (fstab_ptr->abort_reasons & FSMOUNT_MNT_FAILED)) { + terminate = true; + rc = tmp_rc; + } } else { - if (0 != (fstab_ptr->report_reasons & FSMOUNT_MNT_OK)) { - fprintf(stdout,"fsmount: mounting of \"%s\" to" - " \"%s\" succeeded\n", - fstab_ptr->dev, - fstab_ptr->mount_point); - } - if (0 != (fstab_ptr->abort_reasons & FSMOUNT_MNT_OK)) { - terminate = true; - } + if (0 != (fstab_ptr->report_reasons & FSMOUNT_MNT_OK)) { + fprintf(stdout,"fsmount: mounting of \"%s\" to" + " \"%s\" succeeded\n", + fstab_ptr->source, + fstab_ptr->target); + } + if (0 != (fstab_ptr->abort_reasons & FSMOUNT_MNT_OK)) { + terminate = true; + } } } /* diff --git a/cpukit/libmisc/fsmount/fsmount.h b/cpukit/libmisc/fsmount/fsmount.h index 0841a6fe49..15597c31ff 100644 --- a/cpukit/libmisc/fsmount/fsmount.h +++ b/cpukit/libmisc/fsmount/fsmount.h @@ -90,24 +90,24 @@ typedef enum { */ typedef struct { /** - * Device file path. + * Source for the mount. */ - const char *dev; + const char *source; /** - * Mount point path. + * Target for the mount. */ - const char *mount_point; + const char *target; /** * File system operations. */ - const rtems_filesystem_operations_table *fs_ops; + const char *type; /** * File system mount options. */ - rtems_filesystem_options_t mount_options; + rtems_filesystem_options_t options; /** * Report @ref rtems_fstab_conditions "condition flags". @@ -128,7 +128,7 @@ typedef struct { * * @see rtems_fsmount(). */ -int rtems_fsmount_create_mount_point( const char *mount_point); +int rtems_fsmount_create_mount_point(const char *mount_point); /** * Mounts the file systems listed in the file system mount table @a fstab of @@ -160,23 +160,22 @@ int rtems_fsmount_create_mount_point( const char *mount_point); * * #include * #include - * #include * #include * #include * * static const rtems_fstab_entry fstab [] = { * { - * .dev = "/dev/sd-card-a", - * .mount_point = "/mnt", - * .fs_ops = &msdos_ops, - * .mount_options = RTEMS_FILESYSTEM_READ_WRITE, + * .source = "/dev/sd-card-a", + * .target = "/mnt", + * .type = "dosfs", + * .options = RTEMS_FILESYSTEM_READ_WRITE, * .report_reasons = RTEMS_FSTAB_ANY, * .abort_reasons = RTEMS_FSTAB_OK * }, { - * .dev = "/dev/sd-card-a1", - * .mount_point = "/mnt", - * .fs_ops = &msdos_ops, - * .mount_options = RTEMS_FILESYSTEM_READ_WRITE, + * .source = "/dev/sd-card-a1", + * .target = "/mnt", + * .type = "dosfs", + * .options = RTEMS_FILESYSTEM_READ_WRITE, * .report_reasons = RTEMS_FSTAB_ANY, * .abort_reasons = RTEMS_FSTAB_NONE * } diff --git a/cpukit/libmisc/shell/main_mount.c b/cpukit/libmisc/shell/main_mount.c index 0fe569cc5b..8062001d6a 100644 --- a/cpukit/libmisc/shell/main_mount.c +++ b/cpukit/libmisc/shell/main_mount.c @@ -24,74 +24,24 @@ #include #include #include -#include -#include +#include #include "internal.h" -static rtems_chain_control filesystems; -static bool fs_init; - -static void rtems_shell_mount_fsys_init(void) -{ - if (!fs_init) - { - rtems_chain_initialize_empty (&filesystems); - fs_init = true; - } -} - -void rtems_shell_mount_add_fsys(rtems_shell_filesystems_t* fs) -{ - rtems_shell_mount_fsys_init(); - rtems_chain_append (&filesystems, &fs->link); -} - -void rtems_shell_mount_del_fsys(rtems_shell_filesystems_t* fs) -{ - if (fs_init) - rtems_chain_extract (&fs->link); -} - -int rtems_shell_libc_mounter( - const char* driver, - const char* path, - rtems_shell_filesystems_t* fs, - rtems_filesystem_options_t options) -{ - rtems_filesystem_mount_table_entry_t* mt_entry; - /* - * Mount the disk. - */ - - if (mount (&mt_entry, fs->fs_ops, options, (char*) driver, (char*) path) < 0) - { - fprintf (stderr, "mount: mount failed: %s\n", strerror (errno)); - return 1; - } - - return 0; -} - -#define NUMOF(_i) (sizeof (_i) / sizeof (_i[0])) - int rtems_shell_main_mount( int argc, char *argv[] ) { rtems_filesystem_options_t options = RTEMS_FILESYSTEM_READ_WRITE; - rtems_shell_filesystems_t* fs = NULL; - char* driver = NULL; - char* mount_point = NULL; + char* type = NULL; + char* source = NULL; + char* target = NULL; + char* fsoptions = NULL; int arg; - rtems_shell_mount_fsys_init(); - for (arg = 1; arg < argc; arg++) { if (argv[arg][0] == '-') { if (argv[arg][1] == 't') { - rtems_shell_filesystems_t** a; - arg++; if (arg == argc) { fprintf( @@ -101,71 +51,58 @@ int rtems_shell_main_mount( ); return 1; } - - for (a = rtems_shell_Mount_filesystems; *a; a++) { - if (strcmp (argv[arg], (*a)->name) == 0) { - fs = *a; - break; - } - } - - if (!fs && !rtems_chain_is_empty(&filesystems)) { - rtems_chain_node* node = filesystems.first; - while (!rtems_chain_is_tail (&filesystems, node)) { - rtems_shell_filesystems_t* f = (rtems_shell_filesystems_t*)node; - if (strcmp (argv[arg], f->name) == 0) { - fs = f; - break; - } - node = node->next; - } - } + type = argv[arg]; } else if (argv[arg][1] == 'r') { options = RTEMS_FILESYSTEM_READ_ONLY; } else if (argv[arg][1] == 'L') { - rtems_shell_filesystems_t** a; - fprintf (stderr, "File systems: "); - for (a = rtems_shell_Mount_filesystems; *a; a++) - if (*a) - fprintf (stderr, "%s ", (*a)->name); - if (!rtems_chain_is_empty(&filesystems)) { - rtems_chain_node* node = filesystems.first; - while (!rtems_chain_is_tail (&filesystems, node)) { - rtems_shell_filesystems_t* f = (rtems_shell_filesystems_t*)node; - fprintf (stderr, "%s ", f->name); - node = node->next; - } + const rtems_filesystem_table_t* fs; + fs = rtems_filesystem_table_first(); + printf ("File systems: "); + while (fs) { + printf ("%s ", fs->type); + fs = rtems_filesystem_table_next(fs); } - fprintf (stderr, "\n"); - return 1; + printf ("\n"); + return 0; + } else if (argv[arg][1] == 'o') { + arg++; + if (arg == argc) { + fprintf( + stderr, + "%s: -o needs a list if filesystem options.\n", + argv[0] + ); + return 1; + } + fsoptions = argv[arg]; } else { fprintf (stderr, "unknown option: %s\n", argv[arg]); return 1; } } else { - if (!driver) - driver = argv[arg]; - else if (!mount_point) - mount_point = argv[arg]; + if (!source) + source = argv[arg]; + else if (!target) + target = argv[arg]; else { fprintf ( - stderr, "mount: driver and mount only require: %s\n", argv[arg]); + stderr, "mount: source and mount only require: %s\n", argv[arg]); return 1; } } } - if (fs == NULL) { + if (!type) { fprintf (stderr, "mount: no file-system; see the -L option\n"); return 1; } - if (fs->driver_needed && !driver) { - fprintf (stderr, "mount: no driver\n"); + if (!source) { + fprintf (stderr, "mount: no source\n"); return 1; } - if (!mount_point) { + if (!target) { fprintf (stderr, "mount: no mount point\n"); return 1; } @@ -174,19 +111,21 @@ int rtems_shell_main_mount( * Mount the disk. */ - if (fs->mounter (driver, mount_point, fs, options)) + if (mount (source, target, type, options, fsoptions) < 0) { + fprintf (stderr, "error: %s\n", strerror(errno)); return 1; + } - printf ("mounted %s -> %s\n", driver, mount_point); + printf ("mounted %s -> %s\n", source, target); return 0; } rtems_shell_cmd_t rtems_shell_MOUNT_Command = { - "mount", /* name */ - "mount [-t fstype] [-r] [-L] device path # mount disk", /* usage */ - "files", /* topic */ - rtems_shell_main_mount, /* command */ - NULL, /* alias */ - NULL /* next */ + "mount", /* name */ + "mount [-t type] [-r] [-L] source target", /* usage */ + "files", /* topic */ + rtems_shell_main_mount, /* command */ + NULL, /* alias */ + NULL /* next */ }; diff --git a/cpukit/libmisc/shell/main_mount_ftp.c b/cpukit/libmisc/shell/main_mount_ftp.c deleted file mode 100644 index 2712812fc0..0000000000 --- a/cpukit/libmisc/shell/main_mount_ftp.c +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.com/license/LICENSE. - * - * $Id$ - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include - -#include -#include -#include -#include -#include "internal.h" - -#include - -rtems_shell_filesystems_t rtems_shell_Mount_FTP = { - name: "ftp", - driver_needed: 1, - fs_ops: &rtems_ftpfs_ops, - mounter: rtems_shell_libc_mounter -}; diff --git a/cpukit/libmisc/shell/main_mount_msdos.c b/cpukit/libmisc/shell/main_mount_msdos.c deleted file mode 100644 index 67c87d984a..0000000000 --- a/cpukit/libmisc/shell/main_mount_msdos.c +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.com/license/LICENSE. - * - * $Id$ - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include - -#include -#include -#include -#include -#include "internal.h" - -rtems_shell_filesystems_t rtems_shell_Mount_MSDOS = { - name: "msdos", - driver_needed: 1, - fs_ops: &msdos_ops, - mounter: rtems_shell_libc_mounter -}; diff --git a/cpukit/libmisc/shell/main_mount_rfs.c b/cpukit/libmisc/shell/main_mount_rfs.c deleted file mode 100644 index 674556afce..0000000000 --- a/cpukit/libmisc/shell/main_mount_rfs.c +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.com/license/LICENSE. - * - * $Id$ - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include - -#include -#include -#include -#include -#include "internal.h" - -rtems_shell_filesystems_t rtems_shell_Mount_RFS = { - name: "rfs", - driver_needed: 1, - fs_ops: &rtems_rfs_ops, - mounter: rtems_shell_libc_mounter -}; - diff --git a/cpukit/libmisc/shell/main_mount_tftp.c b/cpukit/libmisc/shell/main_mount_tftp.c deleted file mode 100644 index 1efeb7b229..0000000000 --- a/cpukit/libmisc/shell/main_mount_tftp.c +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Shell Command Implmentation - * - * Author: Fernando RUIZ CASAS - * Work: fernando.ruiz@ctv.es - * Home: correo@fernando-ruiz.com - * - * The license and distribution terms for this file may be - * found in the file LICENSE in this distribution or at - * http://www.rtems.com/license/LICENSE. - * - * $Id$ - */ - -#ifdef HAVE_CONFIG_H -#include "config.h" -#endif - -#include -#include -#include -#include - -#include -#include -#include -#include "internal.h" - -#include -#include - -rtems_shell_filesystems_t rtems_shell_Mount_TFTP = { - name: "tftp", - driver_needed: 0, - fs_ops: &rtems_tftp_ops, - mounter: rtems_shell_libc_mounter -}; diff --git a/cpukit/libmisc/shell/shellconfig.h b/cpukit/libmisc/shell/shellconfig.h index 65428ea164..cfc475095e 100644 --- a/cpukit/libmisc/shell/shellconfig.h +++ b/cpukit/libmisc/shell/shellconfig.h @@ -91,17 +91,6 @@ extern rtems_shell_alias_t rtems_shell_EXIT_Alias; extern rtems_shell_alias_t *rtems_shell_Initial_aliases[]; -/* - * Externs for mount command helpers - */ -extern rtems_shell_filesystems_t rtems_shell_Mount_RFS; -extern rtems_shell_filesystems_t rtems_shell_Mount_MSDOS; -extern rtems_shell_filesystems_t rtems_shell_Mount_TFTP; -extern rtems_shell_filesystems_t rtems_shell_Mount_FTP; -extern rtems_shell_filesystems_t rtems_shell_Mount_NFS; - -extern rtems_shell_filesystems_t *rtems_shell_Mount_filesystems[]; - /* * If we are configured to alias a command, then make sure the underlying * command is configured. @@ -444,34 +433,6 @@ extern rtems_shell_filesystems_t *rtems_shell_Mount_filesystems[]; NULL }; - /* - * The mount command's support file system types. - */ - #if (defined(CONFIGURE_SHELL_COMMANDS_ALL) && \ - !defined(CONFIGURE_SHELL_COMMAND_NO_MOUNT)) || \ - defined(CONFIGURE_SHELL_COMMAND_MOUNT) - rtems_shell_filesystems_t *rtems_shell_Mount_filesystems[] = { - #if defined(CONFIGURE_SHELL_MOUNT_RFS) - &rtems_shell_Mount_RFS, - #endif - #if defined(CONFIGURE_SHELL_MOUNT_MSDOS) - &rtems_shell_Mount_MSDOS, - #endif - #if RTEMS_NETWORKING - #if defined(CONFIGURE_SHELL_MOUNT_TFTP) - &rtems_shell_Mount_TFTP, - #endif - #if defined(CONFIGURE_SHELL_MOUNT_FTP) - &rtems_shell_Mount_FTP, - #endif - #if defined(CONFIGURE_SHELL_MOUNT_NFS) - &rtems_shell_Mount_NFS, - #endif - #endif - NULL - }; - #endif - #endif #endif -- cgit v1.2.3