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

📄 imfs_eval.c

📁 RTEMS (Real-Time Executive for Multiprocessor Systems) is a free open source real-time operating sys
💻 C
📖 第 1 页 / 共 2 页
字号:
         break;       /* Throw out the .. in this case */	/*	 * Am I at the root of this mounted filesystem?	 */        if (pathloc->node_access == pathloc->mt_entry->mt_fs_root.node_access){          /*	   *  Am I at the root of all filesystems?	   */          if ( pathloc->node_access == rtems_filesystem_root.node_access ) {            break; 	  } else {            newloc = pathloc->mt_entry->mt_point_node;            *pathloc = newloc;            return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name );	  }	} else {          if ( !node->Parent )            rtems_set_errno_and_return_minus_one( ENOENT );          node = node->Parent;	}        pathloc->node_access = node;        break;      case IMFS_NAME:	if ( node->type == IMFS_HARD_LINK ) {          result = IMFS_evaluate_link( pathloc, 0 );          if ( result == -1 )            return -1;	} else if ( node->type == IMFS_SYM_LINK ) {          result = IMFS_evaluate_link( pathloc, 0 );          if ( result == -1 )            return -1;	}        node = pathloc->node_access;        if ( !node )          rtems_set_errno_and_return_minus_one( ENOTDIR );         /*         * Only a directory can be decended into.	 */        if ( node->type != IMFS_DIRECTORY )          rtems_set_errno_and_return_minus_one( ENOTDIR );	/*	 * If we are at a node that is a mount point. Set loc to the	 * new fs root node and let them finish evaluating the path.	 */        if ( node->info.directory.mt_fs != NULL ) {          newloc  = node->info.directory.mt_fs->mt_fs_root;          *pathloc = newloc;          return (*pathloc->ops->evalformake_h)( &path[i-len], pathloc, name );	}	/*	 * Otherwise find the token name in the present location.	 */        node = IMFS_find_match_in_dir( node, token );	/*	 * If there is no node we have found the name of the node we          * wish to create.	 */        if ( ! node )          done = TRUE;        else          pathloc->node_access = node;        break;       case IMFS_NO_MORE_PATH:        rtems_set_errno_and_return_minus_one( EEXIST );        break;      case IMFS_INVALID_TOKEN:        rtems_set_errno_and_return_minus_one( ENAMETOOLONG );        break;      case IMFS_CURRENT_DIR:        break;    }  }  *name = &path[ i - len ];     /*   * We have evaluated the path as far as we can.   * Verify there is not any invalid stuff at the end of the name.    */  for( ; path[i] != '\0'; i++) {    if ( !IMFS_is_separator( path[ i ] ) )       rtems_set_errno_and_return_minus_one( ENOENT );  }  /*    * Verify we can execute and write to this directory.   */  result = IMFS_Set_handlers( pathloc );  /*   * The returned node must be a directory   */  node = pathloc->node_access;  if ( node->type != IMFS_DIRECTORY )    rtems_set_errno_and_return_minus_one( ENOTDIR );  /*   * We must have Write and execute permission on the returned node.   */  if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_WX ) )    rtems_set_errno_and_return_minus_one( EACCES );    return result;}/* *  IMFS_eval_path * *  The following routine evaluate path for a node that wishes to be *  accessed with mode.  pathloc is returned with a pointer to the *  node to be accessed. */int IMFS_eval_path(    const char                        *pathname,     /* IN     */  int                                flags,        /* IN     */  rtems_filesystem_location_info_t  *pathloc       /* IN/OUT */){  int                                 i = 0;  int                                 len;  IMFS_token_types                    type = IMFS_CURRENT_DIR;  char                                token[ IMFS_NAME_MAX + 1 ];  rtems_filesystem_location_info_t    newloc;  IMFS_jnode_t                       *node;  int                                 result;   if ( !rtems_libio_is_valid_perms( flags ) ) {    assert( 0 );    rtems_set_errno_and_return_minus_one( EIO );      }  /*   *  This was filled in by the caller and is valid in the    *  mount table.   */  node = pathloc->node_access;  /*   *  Evaluate all tokens until we are done or an error occurs.   */  while( (type != IMFS_NO_MORE_PATH) && (type != IMFS_INVALID_TOKEN) ) {    type = IMFS_get_token( &pathname[i], token, &len );    i +=  len;        if ( !pathloc->node_access )      rtems_set_errno_and_return_minus_one( ENOENT );    /*     * I cannot move out of this directory without execute permission.     */    if ( type != IMFS_NO_MORE_PATH )      if ( node->type == IMFS_DIRECTORY )        if ( !IMFS_evaluate_permission( pathloc, RTEMS_LIBIO_PERMS_SEARCH ) )           rtems_set_errno_and_return_minus_one( EACCES );    node = pathloc->node_access;    switch( type ) {      case IMFS_UP_DIR:       /*        *  Am I at the root of all filesystems? (chroot'ed?)	*/       if ( pathloc->node_access == rtems_filesystem_root.node_access )         break;       /* Throw out the .. in this case */	/*	 *  Am I at the root of this mounted filesystem?	 */        if (pathloc->node_access ==             pathloc->mt_entry->mt_fs_root.node_access) {          /*	   *  Am I at the root of all filesystems?	   */          if ( pathloc->node_access == rtems_filesystem_root.node_access ) {            break;       /* Throw out the .. in this case */	  } else {            newloc = pathloc->mt_entry->mt_point_node;            *pathloc = newloc;            return (*pathloc->ops->evalpath_h)(&(pathname[i-len]),flags,pathloc);	  }	} else {          if ( !node->Parent )            rtems_set_errno_and_return_minus_one( ENOENT );          node = node->Parent;          pathloc->node_access = node;	}        pathloc->node_access = node;        break;      case IMFS_NAME:	/*	 *  If we are at a link follow it.	 */        	if ( node->type == IMFS_HARD_LINK ) {          IMFS_evaluate_hard_link( pathloc, 0 );          node = pathloc->node_access;          if ( !node )            rtems_set_errno_and_return_minus_one( ENOTDIR );	} else if ( node->type == IMFS_SYM_LINK ) {          result = IMFS_evaluate_sym_link( pathloc, 0 );          node = pathloc->node_access;          if ( result == -1 )            return -1;	}       /*        *  Only a directory can be decended into.        */       if ( node->type != IMFS_DIRECTORY )          rtems_set_errno_and_return_minus_one( ENOTDIR );	/*	 *  If we are at a node that is a mount point. Set loc to the	 *  new fs root node and let them finish evaluating the path.	 */        if ( node->info.directory.mt_fs != NULL ) {          newloc   = node->info.directory.mt_fs->mt_fs_root;          *pathloc = newloc;          return (*pathloc->ops->evalpath_h)( &pathname[i-len], flags, pathloc );	}	/*	 *  Otherwise find the token name in the present location.	 */        node = IMFS_find_match_in_dir( node, token );        if ( !node )          rtems_set_errno_and_return_minus_one( ENOENT );	/*	 *  Set the node access to the point we have found.	 */        pathloc->node_access = node;        break;      case IMFS_NO_MORE_PATH:      case IMFS_CURRENT_DIR:        break;      case IMFS_INVALID_TOKEN:        rtems_set_errno_and_return_minus_one( ENAMETOOLONG );        break;    }  }  /*   *  Always return the root node.   *   *  If we are at a node that is a mount point. Set loc to the   *  new fs root node and let let the mounted filesystem set the handlers.   *   *  NOTE: The behavior of stat() on a mount point appears to be questionable.   */  if ( node->type == IMFS_DIRECTORY ) {    if ( node->info.directory.mt_fs != NULL ) {      newloc   = node->info.directory.mt_fs->mt_fs_root;      *pathloc = newloc;      return (*pathloc->ops->evalpath_h)( &pathname[i-len], flags, pathloc );    } else {      result = IMFS_Set_handlers( pathloc );    }  } else {    result = IMFS_Set_handlers( pathloc );  }  /*   * Verify we have the correct permissions for this node.   */  if ( !IMFS_evaluate_permission( pathloc, flags ) )    rtems_set_errno_and_return_minus_one( EACCES );  return result;}

⌨️ 快捷键说明

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