summaryrefslogtreecommitdiffstats
path: root/c/src
diff options
context:
space:
mode:
authorJoel Sherrill <joel.sherrill@OARcorp.com>1999-03-06 18:09:15 +0000
committerJoel Sherrill <joel.sherrill@OARcorp.com>1999-03-06 18:09:15 +0000
commit3ef87981ebac62a3df5af981e8f62f151d973074 (patch)
tree9216b95a01e1df2725be70a70b339fba1c6eb4a8 /c/src
parentWrong constant name was used for the DEBUG exception. (diff)
downloadrtems-3ef87981ebac62a3df5af981e8f62f151d973074.tar.bz2
Added F_GETFL support so the fdopen() implementation in newlib 1.8.1
would work. At the same time, the initial implementation of F_SETFL was added. A support routine was added to convert internal libio flags back to the POSIX style. Eventually the internal representation should be eliminated in the interest of simplicity and code reduction. This problem was reported by Jake Janovetz <janovetz@tempest.ece.uiuc.edu>.
Diffstat (limited to 'c/src')
-rw-r--r--c/src/exec/include/rtems/libio_.h4
-rw-r--r--c/src/exec/libcsupport/include/rtems/libio_.h4
-rw-r--r--c/src/exec/libcsupport/src/fcntl.c19
-rw-r--r--c/src/exec/libcsupport/src/libio.c18
-rw-r--r--c/src/lib/include/rtems/libio_.h4
-rw-r--r--c/src/lib/libc/fcntl.c19
-rw-r--r--c/src/lib/libc/libio.c18
-rw-r--r--c/src/lib/libc/libio_.h4
8 files changed, 86 insertions, 4 deletions
diff --git a/c/src/exec/include/rtems/libio_.h b/c/src/exec/include/rtems/libio_.h
index 16dc708f53..e14f63c287 100644
--- a/c/src/exec/include/rtems/libio_.h
+++ b/c/src/exec/include/rtems/libio_.h
@@ -221,6 +221,10 @@ unsigned32 rtems_libio_fcntl_flags(
unsigned32 fcntl_flags
);
+unsigned32 rtems_libio_to_fcntl_flags(
+ unsigned32 flags
+);
+
void rtems_libio_free(
rtems_libio_t *iop
);
diff --git a/c/src/exec/libcsupport/include/rtems/libio_.h b/c/src/exec/libcsupport/include/rtems/libio_.h
index 16dc708f53..e14f63c287 100644
--- a/c/src/exec/libcsupport/include/rtems/libio_.h
+++ b/c/src/exec/libcsupport/include/rtems/libio_.h
@@ -221,6 +221,10 @@ unsigned32 rtems_libio_fcntl_flags(
unsigned32 fcntl_flags
);
+unsigned32 rtems_libio_to_fcntl_flags(
+ unsigned32 flags
+);
+
void rtems_libio_free(
rtems_libio_t *iop
);
diff --git a/c/src/exec/libcsupport/src/fcntl.c b/c/src/exec/libcsupport/src/fcntl.c
index 7673049a58..9359575e51 100644
--- a/c/src/exec/libcsupport/src/fcntl.c
+++ b/c/src/exec/libcsupport/src/fcntl.c
@@ -29,6 +29,7 @@ int fcntl(
rtems_libio_t *iop;
rtems_libio_t *diop;
int fd2;
+ int flags;
va_start( ap, cmd );
@@ -84,10 +85,24 @@ int fcntl(
return 0;
case F_GETFL: /* more flags (cloexec) */
- return -1;
+ return rtems_libio_to_fcntl_flags( iop->flags );
case F_SETFL:
- return -1;
+ flags = rtems_libio_fcntl_flags( va_arg( ap, int ) );
+
+ /*
+ * XXX Double check this in the POSIX spec. According to the Linux
+ * XXX man page, only these flags can be added.
+ */
+
+ flags &= ~(O_APPEND | O_NONBLOCK);
+
+ /*
+ * XXX If we are turning on append, should we seek to the end?
+ */
+
+ iop->flags |= flags;
+ return 0;
case F_GETLK:
return -1;
diff --git a/c/src/exec/libcsupport/src/libio.c b/c/src/exec/libcsupport/src/libio.c
index 59b7086a03..bedd4a920e 100644
--- a/c/src/exec/libcsupport/src/libio.c
+++ b/c/src/exec/libcsupport/src/libio.c
@@ -147,6 +147,24 @@ unsigned32 rtems_libio_fcntl_flags(
}
/*
+ * rtems_libio_to_fcntl_flags
+ *
+ * Convert RTEMS internal flags to UNIX fnctl(2) flags
+ */
+
+unsigned32 rtems_libio_to_fcntl_flags(
+ unsigned32 flags
+)
+{
+ unsigned32 fcntl_flags = 0;
+
+ fcntl_flags = rtems_assoc_remote_by_local( access_modes_assoc, flags );
+ fcntl_flags |=
+ rtems_assoc_remote_by_local_bitfield(status_flags_assoc, flags);
+ return fcntl_flags;
+}
+
+/*
* rtems_libio_allocate
*
* This routine searches the IOP Table for an unused entry. If it
diff --git a/c/src/lib/include/rtems/libio_.h b/c/src/lib/include/rtems/libio_.h
index 16dc708f53..e14f63c287 100644
--- a/c/src/lib/include/rtems/libio_.h
+++ b/c/src/lib/include/rtems/libio_.h
@@ -221,6 +221,10 @@ unsigned32 rtems_libio_fcntl_flags(
unsigned32 fcntl_flags
);
+unsigned32 rtems_libio_to_fcntl_flags(
+ unsigned32 flags
+);
+
void rtems_libio_free(
rtems_libio_t *iop
);
diff --git a/c/src/lib/libc/fcntl.c b/c/src/lib/libc/fcntl.c
index 7673049a58..9359575e51 100644
--- a/c/src/lib/libc/fcntl.c
+++ b/c/src/lib/libc/fcntl.c
@@ -29,6 +29,7 @@ int fcntl(
rtems_libio_t *iop;
rtems_libio_t *diop;
int fd2;
+ int flags;
va_start( ap, cmd );
@@ -84,10 +85,24 @@ int fcntl(
return 0;
case F_GETFL: /* more flags (cloexec) */
- return -1;
+ return rtems_libio_to_fcntl_flags( iop->flags );
case F_SETFL:
- return -1;
+ flags = rtems_libio_fcntl_flags( va_arg( ap, int ) );
+
+ /*
+ * XXX Double check this in the POSIX spec. According to the Linux
+ * XXX man page, only these flags can be added.
+ */
+
+ flags &= ~(O_APPEND | O_NONBLOCK);
+
+ /*
+ * XXX If we are turning on append, should we seek to the end?
+ */
+
+ iop->flags |= flags;
+ return 0;
case F_GETLK:
return -1;
diff --git a/c/src/lib/libc/libio.c b/c/src/lib/libc/libio.c
index 59b7086a03..bedd4a920e 100644
--- a/c/src/lib/libc/libio.c
+++ b/c/src/lib/libc/libio.c
@@ -147,6 +147,24 @@ unsigned32 rtems_libio_fcntl_flags(
}
/*
+ * rtems_libio_to_fcntl_flags
+ *
+ * Convert RTEMS internal flags to UNIX fnctl(2) flags
+ */
+
+unsigned32 rtems_libio_to_fcntl_flags(
+ unsigned32 flags
+)
+{
+ unsigned32 fcntl_flags = 0;
+
+ fcntl_flags = rtems_assoc_remote_by_local( access_modes_assoc, flags );
+ fcntl_flags |=
+ rtems_assoc_remote_by_local_bitfield(status_flags_assoc, flags);
+ return fcntl_flags;
+}
+
+/*
* rtems_libio_allocate
*
* This routine searches the IOP Table for an unused entry. If it
diff --git a/c/src/lib/libc/libio_.h b/c/src/lib/libc/libio_.h
index 16dc708f53..e14f63c287 100644
--- a/c/src/lib/libc/libio_.h
+++ b/c/src/lib/libc/libio_.h
@@ -221,6 +221,10 @@ unsigned32 rtems_libio_fcntl_flags(
unsigned32 fcntl_flags
);
+unsigned32 rtems_libio_to_fcntl_flags(
+ unsigned32 flags
+);
+
void rtems_libio_free(
rtems_libio_t *iop
);