MySQL 5.6.14 Source Code Document
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
win32.h
1 /* win32.h
2  *
3  */
4 
5 #ifndef WIN32_H
6 #define WIN32_H
7 
8 #undef _WIN32_WINNT
9 #define _WIN32_WINNT 0x0501 /* Needed to resolve getaddrinfo et al. */
10 
11 #include <winsock2.h>
12 #include <ws2tcpip.h>
13 
14 #include <stdio.h>
15 #include <io.h>
16 #include <time.h>
17 #include <fcntl.h>
18 #include <errno.h>
19 #include <stdint.h>
20 #include <process.h>
21 
22 #define EWOULDBLOCK EAGAIN
23 #define EAFNOSUPPORT 47
24 #define EADDRINUSE WSAEADDRINUSE
25 #define ENOTCONN WSAENOTCONN
26 #define ECONNRESET WSAECONNRESET
27 #define EAI_SYSTEM -11
28 
29 #ifndef SIGHUP
30 #define SIGHUP -1
31 #endif
32 
33 typedef char *caddr_t;
34 
35 #define O_BLOCK 0
36 #define O_NONBLOCK 1
37 #define F_GETFL 3
38 #define F_SETFL 4
39 
40 #define RUSAGE_SELF 0
41 
42 #define IOV_MAX 1024
43 
44 struct msghdr {
45  void *msg_name; /* Socket name */
46  int msg_namelen; /* Length of name */
47  struct iovec *msg_iov; /* Data blocks */
48  int msg_iovlen; /* Number of blocks */
49  void *msg_accrights; /* Per protocol magic (eg BSD file descriptor passing) */
50  int msg_accrightslen; /* Length of rights list */
51 };
52 
53 #if defined(_MSC_VER) || defined(_MSC_EXTENSIONS)
54  #define DELTA_EPOCH_IN_MICROSECS 11644473600000000Ui64
55 #else
56  #define DELTA_EPOCH_IN_MICROSECS 11644473600000000ULL
57 #endif
58 
59 /* Structure which says how much of each resource has been used. */
60 struct rusage {
61  /* Total amount of user time used. */
62  struct timeval ru_utime;
63  /* Total amount of system time used. */
64  struct timeval ru_stime;
65  /* Maximum resident set size (in kilobytes). */
66  long int ru_maxrss;
67  /* Amount of sharing of text segment memory
68  with other processes (kilobyte-seconds). */
69  long int ru_ixrss;
70  /* Amount of data segment memory used (kilobyte-seconds). */
71  long int ru_idrss;
72  /* Amount of stack memory used (kilobyte-seconds). */
73  long int ru_isrss;
74  /* Number of soft page faults (i.e. those serviced by reclaiming
75  a page from the list of pages awaiting reallocation. */
76  long int ru_minflt;
77  /* Number of hard page faults (i.e. those that required I/O). */
78  long int ru_majflt;
79  /* Number of times a process was swapped out of physical memory. */
80  long int ru_nswap;
81  /* Number of input operations via the file system. Note: This
82  and `ru_oublock' do not include operations with the cache. */
83  long int ru_inblock;
84  /* Number of output operations via the file system. */
85  long int ru_oublock;
86  /* Number of IPC messages sent. */
87  long int ru_msgsnd;
88  /* Number of IPC messages received. */
89  long int ru_msgrcv;
90  /* Number of signals delivered. */
91  long int ru_nsignals;
92  /* Number of voluntary context switches, i.e. because the process
93  gave up the process before it had to (usually to wait for some
94  resource to be available). */
95  long int ru_nvcsw;
96  /* Number of involuntary context switches, i.e. a higher priority process
97  became runnable or the current process used up its time slice. */
98  long int ru_nivcsw;
99 };
100 
101 int inet_aton(register const char *cp, struct in_addr *addr);
102 
103 #define close(s) closesocket(s)
104 
105 #if !defined(strtok_r)
106 #define strtok_r( _s, _sep, _lasts ) \
107  ( *(_lasts) = strtok( (_s), (_sep) ) )
108 #endif /* strtok_r */
109 
110 static inline void mapErr(int error) {
111  switch(error) {
112  default:
113  errno = ECONNRESET;
114  break;
115  case WSAEPFNOSUPPORT:
116  errno = EAFNOSUPPORT;
117  break;
118  case WSA_IO_PENDING:
119  case WSATRY_AGAIN:
120  errno = EAGAIN;
121  break;
122  case WSAEWOULDBLOCK:
123  errno = EWOULDBLOCK;
124  break;
125  case WSAEMSGSIZE:
126  errno = E2BIG;
127  break;
128  case WSAECONNRESET:
129  errno = 0;
130  break;
131  }
132 }
133 
134 #define write mem_write
135 
136 static inline size_t mem_write(int s, void *buf, size_t len)
137 {
138  DWORD dwBufferCount = 0;
139  int error;
140 
141  WSABUF wsabuf = { len, (char *)buf} ;
142  if(WSASend(s, &wsabuf, 1, &dwBufferCount, 0, NULL, NULL) == 0) {
143  return dwBufferCount;
144  }
145  error = WSAGetLastError();
146  if(error == WSAECONNRESET) return 0;
147  mapErr(error);
148  return -1;
149 }
150 
151 #define read(a,b,c) mem_recv(a,b,c,0)
152 #define recv(a,b,c,d) mem_recv(a,b,c,d)
153 
154 static inline size_t mem_recv(int s, void *buf, size_t len, int unused)
155 {
156  DWORD flags = 0;
157  DWORD dwBufferCount;
158  WSABUF wsabuf = { len, (char *)buf };
159  int error;
160 
161  if(WSARecv((SOCKET)s, &wsabuf, 1, &dwBufferCount, &flags,
162  NULL, NULL) == 0) {
163  return dwBufferCount;
164  }
165  error = WSAGetLastError();
166  if (error == WSAECONNRESET) {
167  return 0;
168  }
169  mapErr(error);
170  return -1;
171 }
172 
173 static inline int sendmsg(int s, const struct msghdr *msg, int flags)
174 {
175  DWORD dwBufferCount;
176  int error;
177 
178  if(WSASendTo((SOCKET) s,
179  (LPWSABUF)msg->msg_iov,
180  (DWORD)msg->msg_iovlen,
181  &dwBufferCount,
182  flags,
183  msg->msg_name,
184  msg->msg_namelen,
185  NULL,
186  NULL
187  ) == 0) {
188  return dwBufferCount;
189  }
190  error = WSAGetLastError();
191  if (error == WSAECONNRESET) return 0;
192  mapErr(error);
193  return -1;
194 }
195 
196 int getrusage(int who, struct rusage *usage);
197 int kill(int pid, int sig);
198 int sleep(int seconds);
199 
200 struct sigaction {
201  void (*sa_handler)(int);
202  int sa_mask;
203  int sa_flags;
204 };
205 
206 #define sigemptyset(a) 0
207 extern int sigaction(int sig, struct sigaction *act, struct sigaction *oact);
208 #define daemonize(a,b) spawn_memcached(argc, argv)
209 extern int spawn_memcached(int argc, char **argv);
210 #endif