stoddard 99/09/24 11:49:08
Modified: src/lib/apr/file_io/win32 file_io.def fileacc.c fileio.h
filestat.c readwrite.c
Log:
Win32 fileio stuff. Not tested and needs to be reviewed & debugged.
Revision Changes Path
1.3 +6 -5 apache-2.0/src/lib/apr/file_io/win32/file_io.def
Index: file_io.def
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/file_io/win32/file_io.def,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- file_io.def 1999/09/22 19:50:04 1.2
+++ file_io.def 1999/09/24 18:49:00 1.3
@@ -36,8 +36,9 @@
ap_get_os_dir @29
ap_putc @30
ap_getc @31
- ap_fprintf @32
- ap_eof @33
-
-
-
+ ap_puts @32
+ ap_gets @33
+ ap_flush @34
+ ap_fprintf @35
+ ap_eof @36
+ ap_get_filetype @37
1.3 +17 -0 apache-2.0/src/lib/apr/file_io/win32/fileacc.c
Index: fileacc.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/file_io/win32/fileacc.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- fileacc.c 1999/09/22 17:53:17 1.2
+++ fileacc.c 1999/09/24 18:49:01 1.3
@@ -162,7 +162,24 @@
return APR_ENOFILE;
}
}
+ap_status_t ap_get_filetype(struct file_t *file, ap_filetype_e *type)
+{
+ if (file != NULL) {
+ if (!file->stated) {
+ ap_getfileinfo(file);
+ }
+ if (file->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ *type = APR_DIR;
+ else
+ *type = APR_REG;
+ return APR_SUCCESS;
+ }
+ else {
+ *type = APR_REG;
+ return APR_ENOFILE;
+ }
+}
ap_status_t ap_get_filedata(struct file_t *file, char *key, void *data)
{
if (file != NULL) {
1.2 +7 -8 apache-2.0/src/lib/apr/file_io/win32/fileio.h
Index: fileio.h
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/file_io/win32/fileio.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- fileio.h 1999/08/17 15:59:36 1.1
+++ fileio.h 1999/09/24 18:49:02 1.2
@@ -84,14 +84,13 @@
ap_context_t *cntxt;
HANDLE filehand;
char *fname;
- char *demonfname;
- char *lowerdemonfname;
+ DWORD dwFileAttributes;
+ char *demonfname; /* Is this necessary */
+ char *lowerdemonfname; /* Is this necessary */
int buffered;
- int append;
+ int stated;
+ int append; /* is this necessary?*/
int eof_hit;
-/* mode_t protection;
- uid_t user;
- gid_t group;*/
off_t size;
time_t atime;
time_t mtime;
@@ -102,12 +101,12 @@
ap_context_t *cntxt;
char *dirname;
HANDLE dirhand;
- WIN32_FIND_DATA *entry;
+ WIN32_FIND_DATA *entry;
};
struct iovec_t {
ap_context_t *cntxt;
- struct iovec *iovec;
+ struct iovec *iov;
};
ap_status_t file_cleanup(void *);
1.2 +9 -11 apache-2.0/src/lib/apr/file_io/win32/filestat.c
Index: filestat.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/file_io/win32/filestat.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- filestat.c 1999/08/17 15:59:37 1.1
+++ filestat.c 1999/09/24 18:49:02 1.2
@@ -58,21 +58,19 @@
#include "apr_file_io.h"
#include "apr_general.h"
#include "apr_errno.h"
-
+/* TODO: Handle the case when the file has not been opened */
ap_status_t ap_getfileinfo(struct file_t *thefile)
{
- FILETIME atime, ctime, mtime;
+ BY_HANDLE_FILE_INFORMATION info;
+ GetFileInformationByHandle(thefile->filehand, &info);
+ thefile->dwFileAttributes = info.dwFileAttributes;
+ thefile->size = info.nFileSizeLow; /* This is broken for files > ?? */
+ thefile->atime = WinTimeToUnixTime(&info.ftLastAccessTime);
+ thefile->ctime = WinTimeToUnixTime(&info.ftCreationTime);
+ thefile->mtime = WinTimeToUnixTime(&info.ftLastWriteTime);
+ thefile->stated = 1;
-/* thefile->protection = info.st_mode;
- thefile->user = info.st_uid;
- thefile->group = info.st_gid;*/
- thefile->size = GetFileSize(thefile->filehand, NULL);
- GetFileTime(thefile->filehand, &ctime, &atime, &mtime);
- thefile->atime = WinTimeToUnixTime(&atime);
- thefile->mtime = WinTimeToUnixTime(&mtime);
- thefile->ctime = WinTimeToUnixTime(&ctime);
return APR_SUCCESS;
}
-
1.2 +82 -30 apache-2.0/src/lib/apr/file_io/win32/readwrite.c
Index: readwrite.c
===================================================================
RCS file: /home/cvs/apache-2.0/src/lib/apr/file_io/win32/readwrite.c,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- readwrite.c 1999/08/17 15:59:37 1.1
+++ readwrite.c 1999/09/24 18:49:03 1.2
@@ -62,7 +62,7 @@
ap_status_t ap_read(struct file_t *thefile, void *buf, ap_ssize_t *nbytes)
{
- DWORD bread;
+ DWORD bread;
int lasterror;
if (thefile->filehand == INVALID_HANDLE_VALUE) {
@@ -71,18 +71,18 @@
}
if (ReadFile(thefile->filehand, buf, *nbytes, &bread, NULL)) {
- *nbytes = bread;
- return APR_SUCCESS;
- }
- *nbytes = -1;
+ *nbytes = bread;
+ return APR_SUCCESS;
+ }
+ *nbytes = -1;
lasterror = GetLastError();
- return APR_EEXIST;
+ return APR_EEXIST;
}
ap_status_t ap_write(struct file_t *thefile, void *buf, ap_ssize_t *nbytes)
{
DWORD bwrote;
- FILETIME atime, mtime, ctime;
+ FILETIME atime, mtime, ctime;
if (thefile->filehand == INVALID_HANDLE_VALUE) {
*nbytes = -1;
@@ -90,40 +90,45 @@
}
if (WriteFile(thefile->filehand, buf, *nbytes, &bwrote, NULL)) {
- if (strcmp(thefile->fname, "PIPE")) {
- FlushFileBuffers(thefile->filehand);
- thefile->size = GetFileSize(thefile->filehand, NULL);
- GetFileTime(thefile->filehand, &ctime, &atime, &mtime);
- thefile->atime = WinTimeToUnixTime(&atime);
- thefile->mtime = WinTimeToUnixTime(&mtime);
- thefile->ctime = WinTimeToUnixTime(&ctime);
- }
- *nbytes = bwrote;
- return APR_SUCCESS;
- }
- (*nbytes) = -1;
- return APR_EEXIST;
+ if (strcmp(thefile->fname, "PIPE")) {
+ FlushFileBuffers(thefile->filehand);
+ thefile->size = GetFileSize(thefile->filehand, NULL);
+ GetFileTime(thefile->filehand, &ctime, &atime, &mtime);
+ thefile->atime = WinTimeToUnixTime(&atime);
+ thefile->mtime = WinTimeToUnixTime(&mtime);
+ thefile->ctime = WinTimeToUnixTime(&ctime);
+ }
+ *nbytes = bwrote;
+ return APR_SUCCESS;
+ }
+ (*nbytes) = -1;
+ return APR_EEXIST;
}
/*
+ * Too bad WriteFileGather() is not supported on 95&98 (or NT prior to SP2)
+ */
ap_status_t ap_writev(struct file_t *thefile, const struct iovec_t *vec,
ap_ssize_t *iocnt)
{
- int bytes;
- if ((bytes = writev(thefile->filedes, vec->iovec, *iocnt)) < 0) {
- *iocnt = bytes;
- return errno;
- 12}
- else {
- *iocnt = bytes;
- return APR_SUCCESS;
+ int i;
+ DWORD bwrote = 0;
+ int numvec = *iocnt;
+ *iocnt = 0;
+
+ for (i = 0; i < numvec; i++) {
+ if (!WriteFile(thefile->filehand,
+ vec->iov[i].iov_base, vec->iov[i].iov_len, &bwrote,
NULL)) {
+ return GetLastError(); /* TODO: Yes, I know this is broken... */
+ }
+ *iocnt += bwrote;
}
+ return APR_SUCCESS;
}
-*/
ap_status_t ap_putc(ap_file_t *thefile, char ch)
{
DWORD bwrote;
- if (WriteFile(thefile->filehand, &ch, 1, &bwrote, NULL)) {
+ if (!WriteFile(thefile->filehand, &ch, 1, &bwrote, NULL)) {
return APR_EEXIST;
}
return APR_SUCCESS;
@@ -139,6 +144,53 @@
thefile->eof_hit = TRUE;
return APR_EOF;
}
+ return APR_SUCCESS;
+}
+
+ap_status_t ap_puts(ap_file_t *thefile, char *str)
+{
+ DWORD bwrote;
+ int len;
+
+ len = strlen(str);
+ str[len] = '\n';
+ if (!WriteFile(thefile->filehand, str, len+1, &bwrote, NULL)) {
+ str[len] = '\0';
+ return APR_EEXIST;
+ }
+ str[len] = '\0';
+
+ return APR_SUCCESS;
+}
+
+ap_status_t ap_gets(ap_file_t *thefile, char *str, int len)
+{
+ DWORD bread;
+ int i;
+ if (!ReadFile(thefile->filehand, str, len, &bread, NULL)) {
+ switch(GetLastError()) {
+ case ERROR_HANDLE_EOF:
+ return APR_EOF;
+ default:
+ return APR_EEXIST;
+ }
+ }
+ if (bread == 0) {
+ thefile->eof_hit = TRUE;
+ return APR_EOF;
+ }
+ for (i=0; i<len; i++) {
+ if (str[i] == '\n') {
+ str[i] = '\0';
+ return APR_SUCCESS;
+ }
+ str[i] = '\0';
+ }
+ return APR_SUCCESS;
+}
+ap_status_t ap_flush(ap_file_t *thefile)
+{
+ FlushFileBuffers(thefile->filehand);
return APR_SUCCESS;
}