stoddard 99/09/24 11:58:43
Modified: src/include ap_iol.h
src/main buff.c iol_file.c
Log:
Adapt file iol to use APR functions. Replaced ap_open_file() with
ap_create_file_iol(). ap_create_file_iol() requires that the file be opened
prior to the call using ap_open().
Revision Changes Path
1.5 +1 -2 apache-2.0/src/include/ap_iol.h
Index: ap_iol.h
===================================================================
RCS file: /home/cvs/apache-2.0/src/include/ap_iol.h,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- ap_iol.h 1999/06/28 19:00:48 1.4
+++ ap_iol.h 1999/09/24 18:58:10 1.5
@@ -127,7 +127,6 @@
#define iol_getopt(iol, a, b) ((iol)->methods->getopt((iol), (a), (b)))
/* the file iol */
-/* TODO: use APR instead of unix semantics for this */
-ap_iol *ap_open_file(const char *name, int flags, int mask);
+ap_iol *ap_create_file_iol(ap_file_t *file);
#endif
1.5 +7 -2 apache-2.0/src/main/buff.c
Index: buff.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/main/buff.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- buff.c 1999/08/31 05:32:55 1.4
+++ buff.c 1999/09/24 18:58:30 1.5
@@ -936,8 +936,13 @@
{
ap_iol *iol;
BUFF *fb;
-
- iol = ap_open_file(name, flg, mode);
+ ap_status_t rv;
+ ap_file_t *file;
+ rv = ap_open(a, name, flg, 0, &file);
+ if ((rv != APR_SUCCESS) || (file == NULL)) {
+ return NULL;
+ }
+ iol = ap_create_file_iol(file);
if (!iol) {
return NULL;
}
1.3 +78 -0 apache-2.0/src/main/iol_file.c
Index: iol_file.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/main/iol_file.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- iol_file.c 1999/06/28 19:00:49 1.2
+++ iol_file.c 1999/09/24 18:58:35 1.3
@@ -58,6 +58,7 @@
#include "httpd.h"
#include "ap_iol.h"
+#if 0
#include <sys/uio.h>
typedef struct {
@@ -82,6 +83,7 @@
method(writev, (ap_iol *viol, const struct iovec *arg1, int arg2))
method(read, (ap_iol *viol, char *arg1, int arg2))
+
static int file_close(ap_iol *viol)
{
iol_file *iol = (iol_file *)viol;
@@ -130,3 +132,79 @@
iol->fd = rv;
return (ap_iol *)iol;
}
+#else
+
+typedef struct {
+ ap_iol iol;
+ ap_file_t *file;
+} iol_file;
+
+/* TODO: I am not sure I have the return codes right...
+ * and errno has got to go. It is not thread safe on WIn32...
+ */
+#define method(syscall, args) \
+ static int file_##syscall args \
+ { \
+ ap_status_t rv; \
+ iol_file *iol = (iol_file *)viol; \
+ int cnt = arg2; \
+ /* try writing, ignoring EINTR, the upper layer has to handle \
+ partial read/writes anyhow, so we can return early */ \
+ do { \
+ rv = syscall(iol->file, (void*)arg1, &cnt); \
+ } while (rv == APR_EINTR); \
+ return cnt; \
+ }
+
+method(ap_write, (ap_iol *viol, const char *arg1, int arg2))
+method(ap_writev, (ap_iol *viol, const struct iovec *arg1, int arg2))
+method(ap_read, (ap_iol *viol, char *arg1, int arg2))
+
+
+/* This function will clean-up the iol struct and close the file... */
+static int file_close(ap_iol *viol)
+{
+ ap_status_t rv;
+ iol_file *iol = (iol_file *)viol;
+ rv = ap_close(iol->file);
+ free(iol);
+
+ if (rv == APR_SUCCESS)
+ return 0;
+ else
+ return -1;
+}
+
+static int file_setopt(ap_iol *viol, ap_iol_option opt, const void *value)
+{
+ errno = EINVAL;
+ return -1;
+}
+
+static int file_getopt(ap_iol *viol, ap_iol_option opt, void *value)
+{
+ errno = EINVAL;
+ return -1;
+}
+
+static const ap_iol_methods file_methods = {
+ file_close,
+ file_ap_write,
+ file_ap_writev,
+ file_ap_read,
+ file_setopt,
+ file_getopt
+};
+
+/*
+ * Create an ap_iol struct given an apr_file_t
+ */
+ap_iol *ap_create_file_iol(ap_file_t *file)
+{
+ iol_file *iol;
+ iol = malloc(sizeof(iol_file));
+ iol->iol.methods = &file_methods;
+ iol->file = file;
+ return (ap_iol *)iol;
+}
+#endif