summaryrefslogtreecommitdiff
path: root/PACE/pace/win32/unistd.c
blob: 7e0b01551890b8883241ed95108ef1524ea51dc5 (plain)
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 */