1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
/* $Id$
* =============================================================================
*
* = LIBRARY
* pace
*
* = FILENAME
* pace/win32/unistd.c
*
* = AUTHOR
* Luther Baker
*
* ============================================================================= */
#include "pace/unistd.h"
#if !defined (PACE_HAS_INLINE)
# include "pace/win32/unistd.inl"
#endif /* ! PACE_HAS_INLINE */
#if (PACE_HAS_POSIX_DI_UOF)
int
win32_close (PACE_HANDLE fildes)
{
PACE_WIN32CALL_RETURN
(PACE_ADAPT_RETVAL
(CloseHandle (fildes), pace_result_), int, -1);
}
#endif /* PACE_HAS_POSIX_DI_UOF */
#if (PACE_HAS_POSIX_FM_UOF)
PACE_HANDLE
win32_dup (PACE_HANDLE fildes)
{
PACE_HANDLE new_fd;
if (DuplicateHandle(GetCurrentProcess (),
fildes,
GetCurrentProcess(),
&new_fd,
0,
TRUE,
DUPLICATE_SAME_ACCESS))
{
return new_fd;
}
else
{
PACE_FAIL_RETURN (PACE_INVALID_HANDLE);
}
}
#endif /* PACE_HAS_POSIX_FM_UOF */
#if (PACE_HAS_POSIX_NONUOF_FUNCS)
int
win32_ftruncate (PACE_HANDLE fildes, pace_off_t length)
{
if (SetFilePointer (fildes, length, NULL, FILE_BEGIN) != (unsigned) -1)
{
PACE_WIN32CALL_RETURN
(PACE_ADAPT_RETVAL
(SetEndOfFile (fildes), pace_result_), int, -1);
}
else
{
PACE_FAIL_RETURN (-1);
}
}
#endif /* PACE_HAS_POSIX_NONUOF_FUNCS */
#if (PACE_HAS_POSIX_FM_UOF)
pace_off_t
win32_lseek (PACE_HANDLE fildes, pace_off_t offset, int whence)
{
# if SEEK_SET != FILE_BEGIN \
|| SEEK_CUR != FILE_CURRENT \
|| SEEK_END != FILE_END
/* #error Windows NT is evil AND rude! */
switch (whence) {
case SEEK_SET: {
whence = FILE_BEGIN;
break;
}
case SEEK_CUR: {
whence = FILE_CURRENT;
break;
}
case SEEK_END: {
whence = FILE_END;
break;
}
default: {
errno = EINVAL;
return (off_t)-1; // rather safe than sorry
}
}
PACE_OSCALL_RETURN (lseek (handle, offset, whence), off_t, -1);
# endif /* SEEK_SET != FILE_BEGIN || SEEK_CUR != FILE_CURRENT || SEEK_END != FILE_END */
DWORD result = SetFilePointer (fildes, offset, NULL, whence);
if (result == PACE_SYSCALL_FAILED)
{
off_t retval = -1;
PACE_FAIL_RETURN (retval);
}
else
{
return result;
}
}
#endif /* PACE_HAS_POSIX_FM_UOF */
#if (PACE_HAS_POSIX_DI_UOF)
pace_ssize_t
pace_win32_write (PACE_HANDLE fildes, const void * buf, size_t nbyte)
{
DWORD bytes_written; /* This is set to 0 byte WriteFile. */
if (WriteFile (fildes, buf, nbyte, &bytes_written, 0))
{
return (pace_ssize_t) bytes_written;
}
else
{
PACE_FAIL_RETURN (-1);
}
}
#endif /* PACE_HAS_POSIX_DI_UOF */
|