From 136a84782bcf4c169f504d329005a1d50c76aacc Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Tue, 10 Dec 2013 12:28:09 +1100 Subject: arm shared: Add bsp_translation_table_end the linker symbols. --- c/src/lib/libbsp/arm/shared/include/linker-symbols.h | 1 + 1 file changed, 1 insertion(+) diff --git a/c/src/lib/libbsp/arm/shared/include/linker-symbols.h b/c/src/lib/libbsp/arm/shared/include/linker-symbols.h index 0d69411039..1cc1e8d39a 100644 --- a/c/src/lib/libbsp/arm/shared/include/linker-symbols.h +++ b/c/src/lib/libbsp/arm/shared/include/linker-symbols.h @@ -128,6 +128,7 @@ LINKER_SYMBOL(bsp_start_vector_table_end) LINKER_SYMBOL(bsp_start_vector_table_size) LINKER_SYMBOL(bsp_translation_table_base) +LINKER_SYMBOL(bsp_translation_table_end) #define BSP_FAST_TEXT_SECTION __attribute__((section(".bsp_fast_text"))) -- cgit v1.2.3 From b51d8a4996dda5ab0f1e8ca5cb50892e752413a6 Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Tue, 10 Dec 2013 12:30:20 +1100 Subject: libfs/imfs: Set the FIFO control block. The FIFO was incorrectly set to the default control block. --- cpukit/libfs/src/imfs/imfs_init.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpukit/libfs/src/imfs/imfs_init.c b/cpukit/libfs/src/imfs/imfs_init.c index fc458945bc..f6409196aa 100644 --- a/cpukit/libfs/src/imfs/imfs_init.c +++ b/cpukit/libfs/src/imfs/imfs_init.c @@ -53,7 +53,7 @@ static const IMFS_node_control *const [IMFS_SYM_LINK] = &IMFS_node_control_sym_link, [IMFS_MEMORY_FILE] = &IMFS_node_control_memfile, [IMFS_LINEAR_FILE] = &IMFS_node_control_linfile, - [IMFS_FIFO] = &IMFS_node_control_default + [IMFS_FIFO] = &IMFS_node_control_fifo }; int IMFS_initialize( -- cgit v1.2.3 From 9da8740f05cdf5cd6d685c2c0db2350345aa966d Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Tue, 10 Dec 2013 12:33:22 +1100 Subject: PR2159: Have the FIFO driver read follow POSIX standard. The read call was only returning once the requested buffer was full. The change returns any available data. --- cpukit/libfs/src/pipe/fifo.c | 84 +++++++++++++++++++++----------------------- 1 file changed, 41 insertions(+), 43 deletions(-) diff --git a/cpukit/libfs/src/pipe/fifo.c b/cpukit/libfs/src/pipe/fifo.c index e31ee7c5bf..29f300f151 100644 --- a/cpukit/libfs/src/pipe/fifo.c +++ b/cpukit/libfs/src/pipe/fifo.c @@ -390,54 +390,52 @@ ssize_t pipe_read( if (! PIPE_LOCK(pipe)) return -EINTR; - while (read < count) { - while (PIPE_EMPTY(pipe)) { - /* Not an error */ - if (pipe->Writers == 0) - goto out_locked; - - if (LIBIO_NODELAY(iop)) { - ret = -EAGAIN; - goto out_locked; - } - - /* Wait until pipe is no more empty or no writer exists */ - pipe->waitingReaders ++; - PIPE_UNLOCK(pipe); - if (! PIPE_READWAIT(pipe)) - ret = -EINTR; - if (! PIPE_LOCK(pipe)) { - /* WARN waitingReaders not restored! */ - ret = -EINTR; - goto out_nolock; - } - pipe->waitingReaders --; - if (ret != 0) - goto out_locked; + while (PIPE_EMPTY(pipe)) { + /* Not an error */ + if (pipe->Writers == 0) + goto out_locked; + + if (LIBIO_NODELAY(iop)) { + ret = -EAGAIN; + goto out_locked; } - /* Read chunk bytes */ - chunk = MIN(count - read, pipe->Length); - chunk1 = pipe->Size - pipe->Start; - if (chunk > chunk1) { - memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk1); - memcpy(buffer + read + chunk1, pipe->Buffer, chunk - chunk1); + /* Wait until pipe is no more empty or no writer exists */ + pipe->waitingReaders ++; + PIPE_UNLOCK(pipe); + if (! PIPE_READWAIT(pipe)) + ret = -EINTR; + if (! PIPE_LOCK(pipe)) { + /* WARN waitingReaders not restored! */ + ret = -EINTR; + goto out_nolock; } - else - memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk); - - pipe->Start += chunk; - pipe->Start %= pipe->Size; - pipe->Length -= chunk; - /* For buffering optimization */ - if (PIPE_EMPTY(pipe)) - pipe->Start = 0; - - if (pipe->waitingWriters > 0) - PIPE_WAKEUPWRITERS(pipe); - read += chunk; + pipe->waitingReaders --; + if (ret != 0) + goto out_locked; } + /* Read chunk bytes */ + chunk = MIN(count - read, pipe->Length); + chunk1 = pipe->Size - pipe->Start; + if (chunk > chunk1) { + memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk1); + memcpy(buffer + read + chunk1, pipe->Buffer, chunk - chunk1); + } + else + memcpy(buffer + read, pipe->Buffer + pipe->Start, chunk); + + pipe->Start += chunk; + pipe->Start %= pipe->Size; + pipe->Length -= chunk; + /* For buffering optimization */ + if (PIPE_EMPTY(pipe)) + pipe->Start = 0; + + if (pipe->waitingWriters > 0) + PIPE_WAKEUPWRITERS(pipe); + read += chunk; + out_locked: PIPE_UNLOCK(pipe); -- cgit v1.2.3 From 6122cb6af67c88550fecaa786c1dfd3bc1ceb1d1 Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Tue, 10 Dec 2013 12:35:29 +1100 Subject: PR2158: Add support for dup2. Split the dub call into dup and dup2 in fcntl.c. This requires a private command which is placed in the internal libio header. --- cpukit/libcsupport/include/rtems/libio_.h | 7 ++++ cpukit/libcsupport/src/dup2.c | 2 +- cpukit/libcsupport/src/fcntl.c | 53 +++++++++++++++++++++++++++---- 3 files changed, 55 insertions(+), 7 deletions(-) diff --git a/cpukit/libcsupport/include/rtems/libio_.h b/cpukit/libcsupport/include/rtems/libio_.h index 885656616f..bf01cd5659 100644 --- a/cpukit/libcsupport/include/rtems/libio_.h +++ b/cpukit/libcsupport/include/rtems/libio_.h @@ -41,6 +41,13 @@ extern "C" { #define RTEMS_FILESYSTEM_SYMLOOP_MAX 32 +/* + * Not defined in newlib so provide here. Users should use dup2 and + * not this non-portable fcntl command. Provided here to allow the + * RTEMS implementation to work. + */ +#define F_DUP2FD 20 + /* * Semaphore to protect the io table */ diff --git a/cpukit/libcsupport/src/dup2.c b/cpukit/libcsupport/src/dup2.c index 37c93a7398..ac6f0a1b62 100644 --- a/cpukit/libcsupport/src/dup2.c +++ b/cpukit/libcsupport/src/dup2.c @@ -54,5 +54,5 @@ int dup2( * This fcntl handles everything else. */ - return fcntl( fildes, F_DUPFD, fildes2 ); + return fcntl( fildes, F_DUP2FD, fildes2 ); } diff --git a/cpukit/libcsupport/src/fcntl.c b/cpukit/libcsupport/src/fcntl.c index 53feb669b1..d422a48936 100644 --- a/cpukit/libcsupport/src/fcntl.c +++ b/cpukit/libcsupport/src/fcntl.c @@ -24,14 +24,10 @@ #include -static int duplicate_iop( rtems_libio_t *iop, int fd2 ) +static int duplicate_iop( rtems_libio_t *iop ) { int rv = 0; - /* - * FIXME: We ignore the start value fd2 for the file descriptor search. This - * is not POSIX conform. - */ rtems_libio_t *diop = rtems_libio_allocate(); if (diop != NULL) { @@ -62,6 +58,47 @@ static int duplicate_iop( rtems_libio_t *iop, int fd2 ) return rv; } +static int duplicate2_iop( rtems_libio_t *iop, int fd2 ) +{ + rtems_libio_t *iop2; + int rv = 0; + + rtems_libio_check_fd( fd2 ); + iop2 = rtems_libio_iop( fd2 ); + + if (iop != iop2) + { + int oflag; + + if ((iop2->flags & LIBIO_FLAGS_OPEN) != 0) { + rv = (*iop2->pathinfo.handlers->close_h)( iop2 ); + } + + if (rv == 0) { + oflag = rtems_libio_to_fcntl_flags( iop->flags ); + oflag &= ~O_CREAT; + iop2->flags |= rtems_libio_fcntl_flags( oflag ); + + rtems_filesystem_instance_lock( &iop->pathinfo ); + rtems_filesystem_location_clone( &iop2->pathinfo, &iop->pathinfo ); + rtems_filesystem_instance_unlock( &iop->pathinfo ); + + /* + * XXX: We call the open handler here to have a proper open and close + * pair. + * + * FIXME: What to do with the path? + */ + rv = (*iop2->pathinfo.handlers->open_h)( iop2, NULL, oflag, 0 ); + if ( rv == 0 ) { + rv = fd2; + } + } + } + + return rv; +} + static int vfcntl( int fd, int cmd, @@ -88,8 +125,12 @@ static int vfcntl( switch ( cmd ) { case F_DUPFD: /* dup */ + ret = duplicate_iop( iop ); + break; + + case F_DUP2FD: /* dup2 */ fd2 = va_arg( ap, int ); - ret = duplicate_iop( iop, fd2 ); + ret = duplicate2_iop( iop, fd2 ); break; case F_GETFD: /* get f_flags */ -- cgit v1.2.3 From 663ffd0e7c3f40398280e730727d44a5e06e2e1a Mon Sep 17 00:00:00 2001 From: Chris Johns Date: Tue, 10 Dec 2013 12:37:05 +1100 Subject: PR2161: Set the source port to SYSLOG in the syslog socket. --- cpukit/libnetworking/lib/syslog.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cpukit/libnetworking/lib/syslog.c b/cpukit/libnetworking/lib/syslog.c index 10a75a612b..c0e7270b77 100644 --- a/cpukit/libnetworking/lib/syslog.c +++ b/cpukit/libnetworking/lib/syslog.c @@ -142,7 +142,7 @@ openlog (const char *ident, int logstat, int logfac) */ myAddress.sin_family = AF_INET; myAddress.sin_addr.s_addr = INADDR_ANY; - myAddress.sin_port = 0; + myAddress.sin_port = htons (SYSLOG_PORT);; memset (myAddress.sin_zero, '\0', sizeof myAddress.sin_zero); if (bind (LogFd, (struct sockaddr *)&myAddress, sizeof (myAddress)) < 0) { close (LogFd); -- cgit v1.2.3