summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@oarcorp.com>2013-12-09 19:53:13 -0600
committerJoel Sherrill <joel.sherrill@oarcorp.com>2013-12-09 19:53:13 -0600
commit798b8da7efe7df881ded4105981d5e74ecd0aad7 (patch)
treed5850cf7893b4eb22ad8102ebe6fa8b939eede50
parentalarm.c: Per comment add debug code for kill() failing (diff)
parentPR2161: Set the source port to SYSLOG in the syslog socket. (diff)
downloadrtems-798b8da7efe7df881ded4105981d5e74ecd0aad7.tar.bz2
Merge branch 'master' into am
-rw-r--r--c/src/lib/libbsp/arm/shared/include/linker-symbols.h1
-rw-r--r--cpukit/libcsupport/include/rtems/libio_.h7
-rw-r--r--cpukit/libcsupport/src/dup2.c2
-rw-r--r--cpukit/libcsupport/src/fcntl.c53
-rw-r--r--cpukit/libfs/src/imfs/imfs_init.c2
-rw-r--r--cpukit/libfs/src/pipe/fifo.c84
-rw-r--r--cpukit/libnetworking/lib/syslog.c2
7 files changed, 99 insertions, 52 deletions
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")))
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
@@ -42,6 +42,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 <rtems/libio_.h>
-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 */
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(
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);
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);