diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 2008-10-14 15:06:25 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 2008-10-14 15:06:25 +0000 |
commit | e2324c081a4b1a0c6d7fdaaa99e0d5ef29325e20 (patch) | |
tree | 828a80e48298c57d4b897d3b9a74f9ade00bbdf1 /cpukit/libfs/src/imfs | |
parent | Fix formatting. (diff) | |
download | rtems-e2324c081a4b1a0c6d7fdaaa99e0d5ef29325e20.tar.bz2 |
2008-10-14 Wei Shen <cquark@gmail.com>
* Makefile.am, preinstall.am, libcsupport/src/mknod.c,
libcsupport/src/open.c, libcsupport/src/pipe.c, libfs/Makefile.am,
libfs/preinstall.am, libfs/src/imfs/imfs.h,
libfs/src/imfs/imfs_creat.c, libfs/src/imfs/imfs_debug.c,
libfs/src/imfs/imfs_eval.c, libfs/src/imfs/imfs_initsupp.c,
libfs/src/imfs/imfs_mknod.c, libfs/src/imfs/imfs_stat.c,
libfs/src/imfs/memfile.c: Initial commit of POSIX pipe support.
* libfs/src/imfs/imfs_fifo.c, libfs/src/pipe/fifo.c,
libfs/src/pipe/pipe.c, libfs/src/pipe/pipe.h: New files.
Diffstat (limited to '')
-rw-r--r-- | cpukit/libfs/src/imfs/imfs.h | 17 | ||||
-rw-r--r-- | cpukit/libfs/src/imfs/imfs_creat.c | 4 | ||||
-rw-r--r-- | cpukit/libfs/src/imfs/imfs_debug.c | 5 | ||||
-rw-r--r-- | cpukit/libfs/src/imfs/imfs_eval.c | 3 | ||||
-rw-r--r-- | cpukit/libfs/src/imfs/imfs_fifo.c | 151 | ||||
-rw-r--r-- | cpukit/libfs/src/imfs/imfs_initsupp.c | 11 | ||||
-rw-r--r-- | cpukit/libfs/src/imfs/imfs_mknod.c | 5 | ||||
-rw-r--r-- | cpukit/libfs/src/imfs/imfs_stat.c | 4 | ||||
-rw-r--r-- | cpukit/libfs/src/imfs/memfile.c | 2 |
9 files changed, 192 insertions, 10 deletions
diff --git a/cpukit/libfs/src/imfs/imfs.h b/cpukit/libfs/src/imfs/imfs.h index bd56bd57f4..b53a3cd8b4 100644 --- a/cpukit/libfs/src/imfs/imfs.h +++ b/cpukit/libfs/src/imfs/imfs.h @@ -25,6 +25,8 @@ extern "C" { #include <limits.h> #include <rtems/libio.h> +#include <rtems/pipe.h> + /* * File name macros */ @@ -59,6 +61,10 @@ typedef struct { char *name; } IMFS_sym_link_t; +typedef struct { + pipe_control_t *pipe; +} IMFS_fifo_t; + /* * IMFS "memfile" information * @@ -84,7 +90,7 @@ typedef struct { extern int imfs_rq_memfile_bytes_per_block; extern int imfs_memfile_bytes_per_block; -#define IMFS_MEMFILE_BYTES_PER_BLOCK imfs_memfile_bytes_per_block +#define IMFS_MEMFILE_BYTES_PER_BLOCK imfs_memfile_bytes_per_block #define IMFS_MEMFILE_BLOCK_SLOTS \ (IMFS_MEMFILE_BYTES_PER_BLOCK / sizeof(void *)) @@ -135,8 +141,9 @@ typedef struct { #define IMFS_SYM_LINK RTEMS_FILESYSTEM_SYM_LINK #define IMFS_MEMORY_FILE RTEMS_FILESYSTEM_MEMORY_FILE #define IMFS_LINEAR_FILE (IMFS_MEMORY_FILE + 1) +#define IMFS_FIFO (IMFS_LINEAR_FILE + 1) -#define IMFS_NUMBER_OF_TYPES (IMFS_LINEAR_FILE + 1) +#define IMFS_NUMBER_OF_TYPES (IMFS_FIFO + 1) typedef union { IMFS_directory_t directory; @@ -145,6 +152,7 @@ typedef union { IMFS_sym_link_t sym_link; IMFS_memfile_t file; IMFS_linearfile_t linearfile; + IMFS_fifo_t fifo; } IMFS_types_union; /* @@ -196,12 +204,12 @@ struct IMFS_jnode_tt { _jnode->stat_ctime = (time_t) tv.tv_sec; \ } while (0) -#define IMFS_atime_mtime_update( _jnode ) \ +#define IMFS_mtime_ctime_update( _jnode ) \ do { \ struct timeval tv; \ gettimeofday( &tv, 0 ); \ _jnode->stat_mtime = (time_t) tv.tv_sec; \ - _jnode->stat_atime = (time_t) tv.tv_sec; \ + _jnode->stat_ctime = (time_t) tv.tv_sec; \ } while (0) typedef struct { @@ -230,6 +238,7 @@ extern const rtems_filesystem_file_handlers_r IMFS_directory_handlers; extern const rtems_filesystem_file_handlers_r IMFS_device_handlers; extern const rtems_filesystem_file_handlers_r IMFS_link_handlers; extern const rtems_filesystem_file_handlers_r IMFS_memfile_handlers; +extern const rtems_filesystem_file_handlers_r IMFS_fifo_handlers; extern const rtems_filesystem_operations_table IMFS_ops; extern const rtems_filesystem_operations_table miniIMFS_ops; extern const rtems_filesystem_limits_and_options_t IMFS_LIMITS_AND_OPTIONS; diff --git a/cpukit/libfs/src/imfs/imfs_creat.c b/cpukit/libfs/src/imfs/imfs_creat.c index ccf88bdf64..946e71d729 100644 --- a/cpukit/libfs/src/imfs/imfs_creat.c +++ b/cpukit/libfs/src/imfs/imfs_creat.c @@ -112,6 +112,10 @@ IMFS_jnode_t *IMFS_create_node( node->info.file.triply_indirect = 0; break; + case IMFS_FIFO: + node->info.fifo.pipe = NULL; + break; + default: assert(0); break; diff --git a/cpukit/libfs/src/imfs/imfs_debug.c b/cpukit/libfs/src/imfs/imfs_debug.c index d766c5e8b1..eb7541bb6a 100644 --- a/cpukit/libfs/src/imfs/imfs_debug.c +++ b/cpukit/libfs/src/imfs/imfs_debug.c @@ -98,6 +98,11 @@ void IMFS_print_jnode( assert(0); break; + case IMFS_FIFO: + fprintf(stdout, " FIFO not printed\n" ); + assert(0); + break; + default: fprintf(stdout, " bad type %d\n", the_jnode->type ); assert(0); diff --git a/cpukit/libfs/src/imfs/imfs_eval.c b/cpukit/libfs/src/imfs/imfs_eval.c index 9d8328d3a5..8c72fca049 100644 --- a/cpukit/libfs/src/imfs/imfs_eval.c +++ b/cpukit/libfs/src/imfs/imfs_eval.c @@ -57,6 +57,9 @@ int IMFS_Set_handlers( case IMFS_MEMORY_FILE: loc->handlers = fs_info->memfile_handlers; break; + case IMFS_FIFO: + loc->handlers = &IMFS_fifo_handlers; + break; } return 0; diff --git a/cpukit/libfs/src/imfs/imfs_fifo.c b/cpukit/libfs/src/imfs/imfs_fifo.c new file mode 100644 index 0000000000..97fef98db6 --- /dev/null +++ b/cpukit/libfs/src/imfs/imfs_fifo.c @@ -0,0 +1,151 @@ +/* + * imfs_fifo.c: FIFO support for IMFS + * + * Author: Wei Shen <cquark@gmail.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$ + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include <stdlib.h> +#include <rtems/libio_.h> +#include <rtems/seterr.h> + +#include "imfs.h" + +#define JNODE2PIPE(_jnode) ( (_jnode)->info.fifo.pipe ) + +#define LIBIO2PIPE(_iop) ( JNODE2PIPE((IMFS_jnode_t *)(_iop)->file_info) ) + +/* Set errno and return -1 if error, else return _err */ +#define IMFS_FIFO_RETURN(_err) \ +do { \ + if (_err < 0) \ + rtems_set_errno_and_return_minus_one(-_err); \ + return _err; \ +} while (0) + +int IMFS_fifo_open( + rtems_libio_t *iop, + const char *pathname, + uint32_t flag, + uint32_t mode +) +{ + IMFS_jnode_t *jnode = iop->file_info; + + int err = fifo_open(&JNODE2PIPE(jnode), iop); + IMFS_FIFO_RETURN(err); +} + +int IMFS_fifo_close( + rtems_libio_t *iop +) +{ + IMFS_jnode_t *jnode = iop->file_info; + + int err = pipe_release(&JNODE2PIPE(jnode), iop); + + if (! err) { + iop->flags &= ~LIBIO_FLAGS_OPEN; + /* Free jnode if file is already unlinked and no one opens it */ + if (! rtems_libio_is_file_open(jnode) && jnode->st_nlink < 1) + free(jnode); + } + + IMFS_FIFO_RETURN(err); +} + +ssize_t IMFS_fifo_read( + rtems_libio_t *iop, + void *buffer, + size_t count +) +{ + IMFS_jnode_t *jnode = iop->file_info; + + int err = pipe_read(JNODE2PIPE(jnode), buffer, count, iop); + if (err > 0) + IMFS_update_atime(jnode); + + IMFS_FIFO_RETURN(err); +} + +ssize_t IMFS_fifo_write( + rtems_libio_t *iop, + const void *buffer, + size_t count +) +{ + IMFS_jnode_t *jnode = iop->file_info; + + int err = pipe_write(JNODE2PIPE(jnode), buffer, count, iop); + if (err > 0) { + IMFS_mtime_ctime_update(jnode); + } + + IMFS_FIFO_RETURN(err); +} + +int IMFS_fifo_ioctl( + rtems_libio_t *iop, + uint32_t command, + void *buffer +) +{ + int err; + + if (command == FIONBIO) { + if (buffer == NULL) + err = -EFAULT; + else { + if (*(int *)buffer) + iop->flags |= LIBIO_FLAGS_NO_DELAY; + else + iop->flags &= ~LIBIO_FLAGS_NO_DELAY; + return 0; + } + } + else + err = pipe_ioctl(LIBIO2PIPE(iop), command, buffer, iop); + + IMFS_FIFO_RETURN(err); +} + +int IMFS_fifo_lseek( + rtems_libio_t *iop, + off_t offset, + int whence +) +{ + int err = pipe_lseek(LIBIO2PIPE(iop), offset, whence, iop); + IMFS_FIFO_RETURN(err); +} + +/* + * Handler table for IMFS FIFO nodes + */ + +const rtems_filesystem_file_handlers_r IMFS_fifo_handlers = { + IMFS_fifo_open, + IMFS_fifo_close, + IMFS_fifo_read, + IMFS_fifo_write, + IMFS_fifo_ioctl, + IMFS_fifo_lseek, + IMFS_stat, + IMFS_fchmod, + NULL, /* ftruncate */ + NULL, /* fpathconf */ + NULL, /* fsync */ + NULL, /* fdatasync */ + IMFS_fcntl, + IMFS_rmnod, +}; diff --git a/cpukit/libfs/src/imfs/imfs_initsupp.c b/cpukit/libfs/src/imfs/imfs_initsupp.c index 62d6b11c7a..648150257b 100644 --- a/cpukit/libfs/src/imfs/imfs_initsupp.c +++ b/cpukit/libfs/src/imfs/imfs_initsupp.c @@ -47,17 +47,17 @@ static int IMFS_determine_bytes_per_block( * check, whether requested bytes per block is valid */ for (bit_mask = 16; - !is_valid && (bit_mask <= 512); + !is_valid && (bit_mask <= 512); bit_mask <<= 1) { if (bit_mask == requested_bytes_per_block) { is_valid = true; } } - *dest_bytes_per_block = ((is_valid) + *dest_bytes_per_block = ((is_valid) ? requested_bytes_per_block : default_bytes_per_block); return 0; - + } @@ -81,7 +81,7 @@ int IMFS_initialize_support( IMFS_determine_bytes_per_block(&imfs_memfile_bytes_per_block, imfs_rq_memfile_bytes_per_block, IMFS_MEMFILE_DEFAULT_BYTES_PER_BLOCK); - + /* * Create the root node * @@ -121,5 +121,8 @@ int IMFS_initialize_support( jnode = temp_mt_entry->mt_fs_root.node_access; jnode->st_ino = fs_info->ino_count; + /* Initialize POSIX FIFO/pipe module */ + rtems_pipe_initialize(); + return 0; } diff --git a/cpukit/libfs/src/imfs/imfs_mknod.c b/cpukit/libfs/src/imfs/imfs_mknod.c index abb9ab4052..9d35e61922 100644 --- a/cpukit/libfs/src/imfs/imfs_mknod.c +++ b/cpukit/libfs/src/imfs/imfs_mknod.c @@ -54,7 +54,10 @@ int IMFS_mknod( else if ( S_ISBLK(mode) || S_ISCHR(mode) ) { type = IMFS_DEVICE; rtems_filesystem_split_dev_t( dev, info.device.major, info.device.minor ); - } else { + } + else if (S_ISFIFO(mode)) + type = IMFS_FIFO; + else { rtems_set_errno_and_return_minus_one( EINVAL ); } diff --git a/cpukit/libfs/src/imfs/imfs_stat.c b/cpukit/libfs/src/imfs/imfs_stat.c index 422e954ed1..76564811e9 100644 --- a/cpukit/libfs/src/imfs/imfs_stat.c +++ b/cpukit/libfs/src/imfs/imfs_stat.c @@ -49,6 +49,10 @@ int IMFS_stat( buf->st_size = 0; break; + case IMFS_FIFO: + buf->st_size = 0; + break; + default: rtems_set_errno_and_return_minus_one( ENOTSUP ); break; diff --git a/cpukit/libfs/src/imfs/memfile.c b/cpukit/libfs/src/imfs/memfile.c index 2391373acb..a0a89f64ec 100644 --- a/cpukit/libfs/src/imfs/memfile.c +++ b/cpukit/libfs/src/imfs/memfile.c @@ -844,7 +844,7 @@ fprintf(stdout, "write %d in %d: %*s\n", to_copy, block, to_copy, src ); copied += to_copy; } - IMFS_atime_mtime_update( the_jnode ); + IMFS_mtime_ctime_update( the_jnode ); return copied; } |