summaryrefslogtreecommitdiffstats
path: root/cpukit/libfs/src/imfs
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>2008-10-14 15:06:25 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>2008-10-14 15:06:25 +0000
commite2324c081a4b1a0c6d7fdaaa99e0d5ef29325e20 (patch)
tree828a80e48298c57d4b897d3b9a74f9ade00bbdf1 /cpukit/libfs/src/imfs
parentFix formatting. (diff)
downloadrtems-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.h17
-rw-r--r--cpukit/libfs/src/imfs/imfs_creat.c4
-rw-r--r--cpukit/libfs/src/imfs/imfs_debug.c5
-rw-r--r--cpukit/libfs/src/imfs/imfs_eval.c3
-rw-r--r--cpukit/libfs/src/imfs/imfs_fifo.c151
-rw-r--r--cpukit/libfs/src/imfs/imfs_initsupp.c11
-rw-r--r--cpukit/libfs/src/imfs/imfs_mknod.c5
-rw-r--r--cpukit/libfs/src/imfs/imfs_stat.c4
-rw-r--r--cpukit/libfs/src/imfs/memfile.c2
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;
}