From ce275cffd6ed98436ab689347d3b6db9ec047061 Mon Sep 17 00:00:00 2001 From: Jennifer Averett Date: Wed, 6 Aug 2003 19:14:14 +0000 Subject: 2003-08-06 Thomas Doerfler PR 369/filesystem * Makefile.am, shell/cmds.c, wrapup/Makefile.am: sample application to show the use of the DOSFS functions * fsmount/Makefile.am, fsmount/README, fsmount/fsmount.c, fsmount/fsmount.h: New files. --- cpukit/libmisc/fsmount/fsmount.c | 196 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 cpukit/libmisc/fsmount/fsmount.c (limited to 'cpukit/libmisc/fsmount/fsmount.c') diff --git a/cpukit/libmisc/fsmount/fsmount.c b/cpukit/libmisc/fsmount/fsmount.c new file mode 100644 index 0000000000..1d251199c0 --- /dev/null +++ b/cpukit/libmisc/fsmount/fsmount.c @@ -0,0 +1,196 @@ +/*===============================================================*\ +| Project: RTEMS fsmount | ++-----------------------------------------------------------------+ +| File: fsmount.c | ++-----------------------------------------------------------------+ +| Copyright (c) 2003 IMD | +| Ingenieurbuero fuer Microcomputertechnik Th. Doerfler | +| | +| all rights reserved | ++-----------------------------------------------------------------+ +| this file contains the fsmount functions. These functions | +| are used to mount a list of filesystems (and create their mount | +| points before) | +| | +| The license and distribution terms for this file may be | +| found in the file LICENSE in this distribution or at | +| http://www.OARcorp.com/rtems/license.html. | +| | ++-----------------------------------------------------------------+ +| date history ID | +| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | +| 02.07.03 creation doe | +\*===============================================================*/ +#include +#include +#include +#include +#include +#include +#include +#include + +/*=========================================================================*\ +| Function: | +\*-------------------------------------------------------------------------*/ +int rtems_fsmount_create_mountpoint +( +/*-------------------------------------------------------------------------*\ +| Purpose: | +| This function will create the mount point given | ++---------------------------------------------------------------------------+ +| Input Parameters: | +\*-------------------------------------------------------------------------*/ + const char *mount_point + ) +/*-------------------------------------------------------------------------*\ +| Return Value: | +| 0, if success, -1 and errno if failed | +\*=========================================================================*/ +{ + int rc = 0; + char *tok_buffer = NULL; + char *token = NULL; + int token_len; + size_t total_len; + IMFS_token_types token_type; + struct stat file_info; + /* + * allocate temp memory to rebuild path name + */ + tok_buffer = calloc(strlen(mount_point)+1,sizeof(char)); + token = tok_buffer; + total_len = 0; + do { + /* + * scan through given string, one segment at a time + */ + token_type = IMFS_get_token(mount_point+total_len,token,&token_len); + total_len += token_len; + strncpy(tok_buffer,mount_point,total_len); + tok_buffer[total_len] = '\0'; + + if ((token_type != IMFS_NO_MORE_PATH) && + (token_type != IMFS_CURRENT_DIR) && + (token_type != IMFS_INVALID_TOKEN)) { + /* + * check, whether segment exists + */ + if (0 != stat(tok_buffer,&file_info)) { + /* + * if not, create directory + */ + rc = mknod(tok_buffer,S_IRWXU | S_IRWXG | S_IRWXO | S_IFDIR,0); + } + } + } while ((rc == 0) && + (token_type != IMFS_NO_MORE_PATH) && + (token_type != IMFS_INVALID_TOKEN)); + + /* + * return token buffer to heap + */ + if (tok_buffer != NULL) { + free(tok_buffer); + } + return rc; +} + +/*=========================================================================*\ +| Function: | +\*-------------------------------------------------------------------------*/ +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 fstab_t *fstab_ptr, + int fstab_count, + int *fail_idx + ) +/*-------------------------------------------------------------------------*\ +| Return Value: | +| 0, if success, -1 and errno if failed | +\*=========================================================================*/ +{ + int rc = 0; + int tmp_rc; + int fstab_idx = 0; + rtems_filesystem_mount_table_entry_t *tmp_mt_entry; + boolean terminate = FALSE; + + /* + * scan through all fstab entries; + */ + while (!terminate && + (fstab_idx < fstab_count)) { + tmp_rc = 0; + /* + * create mount point + */ + if (tmp_rc == 0) { + tmp_rc = rtems_fsmount_create_mountpoint(fstab_ptr->mount_point); + if (tmp_rc != 0) { + if (0 != (fstab_ptr->report_reasons & FSMOUNT_MNTPNT_CRTERR)) { + printf("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; + } + } + } + /* + * mount device to given mount point + */ + if (tmp_rc == RTEMS_SUCCESSFUL) { + tmp_rc = mount(&tmp_mt_entry, + fstab_ptr->fs_ops, + fstab_ptr->mount_options, + fstab_ptr->dev, + fstab_ptr->mount_point); + if (tmp_rc != RTEMS_SUCCESSFUL) { + if (0 != (fstab_ptr->report_reasons & FSMOUNT_MNT_FAILED)) { + printf("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; + } + } + else { + if (0 != (fstab_ptr->report_reasons & FSMOUNT_MNT_OK)) { + printf("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; + } + } + } + /* + * proceed to next entry + */ + if (!terminate) { + fstab_ptr++; + fstab_idx++; + } + } + if (fail_idx != NULL) { + *fail_idx = fstab_idx; + } + return rc; +} + -- cgit v1.2.3