⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fsmount.c

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 C
字号:
/*===============================================================*\| Project: RTEMS fsmount                                          |+-----------------------------------------------------------------+| File: fsmount.c                                                 |+-----------------------------------------------------------------+|                    Copyright (c) 2003 IMD                       ||      Ingenieurbuero fuer Microcomputertechnik Th. Doerfler      ||               <Thomas.Doerfler@imd-systems.de>                  ||                       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.rtems.com/license/LICENSE.                     ||                                                                 |+-----------------------------------------------------------------+|   date                      history                        ID   || ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ || 02.07.03  creation                                         doe  |\*===============================================================*/#include <rtems.h>#include <rtems/fsmount.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <errno.h>#include <imfs.h>#include <sys/stat.h>/*=========================================================================*\| 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;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -