diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2015-01-28 18:25:49 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2015-01-28 18:25:49 +0100 |
commit | 29fa2419bfff57811453b081d0ac771e9158e469 (patch) | |
tree | 4451541dfb3b297019fdd85ce649f167a2b43136 /cpukit/libfs/src/imfs/imfs_symlink.c | |
parent | IMFS: Replace node union with individual struct (diff) | |
download | rtems-29fa2419bfff57811453b081d0ac771e9158e469.tar.bz2 |
IMFS: Aggregate link support in dedicated modules
Diffstat (limited to 'cpukit/libfs/src/imfs/imfs_symlink.c')
-rw-r--r-- | cpukit/libfs/src/imfs/imfs_symlink.c | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/cpukit/libfs/src/imfs/imfs_symlink.c b/cpukit/libfs/src/imfs/imfs_symlink.c index 963cefcd77..eaed80b75d 100644 --- a/cpukit/libfs/src/imfs/imfs_symlink.c +++ b/cpukit/libfs/src/imfs/imfs_symlink.c @@ -60,3 +60,79 @@ int IMFS_symlink( return 0; } + +ssize_t IMFS_readlink( + const rtems_filesystem_location_info_t *loc, + char *buf, + size_t bufsize +) +{ + IMFS_sym_link_t *sym_link; + ssize_t i; + + sym_link = loc->node_access; + + for( i=0; ((i<bufsize) && (sym_link->name[i] != '\0')); i++ ) + buf[i] = sym_link->name[i]; + + return i; +} + +static int IMFS_stat_sym_link( + const rtems_filesystem_location_info_t *loc, + struct stat *buf +) +{ + const IMFS_sym_link_t *sym_link = loc->node_access; + + buf->st_size = strlen( sym_link->name ); + + return IMFS_stat( loc, buf ); +} + +static const rtems_filesystem_file_handlers_r IMFS_link_handlers = { + .open_h = rtems_filesystem_default_open, + .close_h = rtems_filesystem_default_close, + .read_h = rtems_filesystem_default_read, + .write_h = rtems_filesystem_default_write, + .ioctl_h = rtems_filesystem_default_ioctl, + .lseek_h = rtems_filesystem_default_lseek, + .fstat_h = IMFS_stat_sym_link, + .ftruncate_h = rtems_filesystem_default_ftruncate, + .fsync_h = rtems_filesystem_default_fsync_or_fdatasync, + .fdatasync_h = rtems_filesystem_default_fsync_or_fdatasync, + .fcntl_h = rtems_filesystem_default_fcntl, + .kqfilter_h = rtems_filesystem_default_kqfilter, + .poll_h = rtems_filesystem_default_poll, + .readv_h = rtems_filesystem_default_readv, + .writev_h = rtems_filesystem_default_writev +}; + +static IMFS_jnode_t *IMFS_node_initialize_sym_link( + IMFS_jnode_t *node, + void *arg +) +{ + IMFS_sym_link_t *sym_link = (IMFS_sym_link_t *) node; + + sym_link->name = arg; + + return node; +} + +static void IMFS_node_destroy_sym_link( IMFS_jnode_t *node ) +{ + IMFS_sym_link_t *sym_link = (IMFS_sym_link_t *) node; + + free( sym_link->name ); + + IMFS_node_destroy_default( node ); +} + +const IMFS_node_control IMFS_node_control_sym_link = { + .handlers = &IMFS_link_handlers, + .node_size = sizeof(IMFS_sym_link_t), + .node_initialize = IMFS_node_initialize_sym_link, + .node_remove = IMFS_node_remove_default, + .node_destroy = IMFS_node_destroy_sym_link +}; |