First take on changes to allow building with MSC for W32CE.
[gpgme.git] / src / ath.c
1 /* ath.c - Thread-safeness library.
2    Copyright (C) 2002, 2003, 2004 g10 Code GmbH
3
4    This file is part of GPGME.
5  
6    GPGME is free software; you can redistribute it and/or modify it
7    under the terms of the GNU Lesser General Public License as
8    published by the Free Software Foundation; either version 2.1 of
9    the License, or (at your option) any later version.
10    
11    GPGME is distributed in the hope that it will be useful, but
12    WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14    Lesser General Public License for more details.
15    
16    You should have received a copy of the GNU Lesser General Public
17    License along with this program; if not, write to the Free Software
18    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
19    02111-1307, USA.  */
20
21 #ifdef HAVE_CONFIG_H
22 #include <config.h>
23 #endif
24
25 #include <assert.h>
26 #ifdef HAVE_UNISTD_H
27 # include <unistd.h>
28 #endif
29 #ifdef HAVE_SYS_SELECT_H
30 # include <sys/select.h>
31 #else
32 # ifdef HAVE_SYS_TIME_H
33 #  include <sys/time.h>
34 # endif
35 #endif
36 #include <sys/types.h>
37 #ifndef HAVE_W32_SYSTEM
38 #include <sys/wait.h>
39 #endif
40
41 #ifdef _MSC_VER
42   typedef long ssize_t;
43   typedef int  pid_t;
44 #endif
45
46 #include "ath.h"
47
48
49 #define MUTEX_UNLOCKED  ((ath_mutex_t) 0)
50 #define MUTEX_LOCKED    ((ath_mutex_t) 1)
51 #define MUTEX_DESTROYED ((ath_mutex_t) 2)
52
53
54 #ifdef HAVE_W32_SYSTEM
55 #include <windows.h>
56 uintptr_t
57 ath_self (void)
58 {
59   return (uintptr_t) GetCurrentThreadId ();
60 }
61 #else
62 # ifdef __linux
63 #include <sys/types.h>
64 #include <sys/syscall.h>
65 uintptr_t
66 ath_self (void)
67 {
68   /* Just to catch users who don't use gpgme-pthread.  */
69   return (uintptr_t) syscall (SYS_gettid);
70 }
71 # else
72 uintptr_t
73 ath_self (void)
74 {
75   return (uintptr_t) getpid ();
76 }
77 # endif
78 #endif
79
80
81 int
82 ath_mutex_init (ath_mutex_t *lock)
83 {
84 #ifndef NDEBUG
85   *lock = MUTEX_UNLOCKED;
86 #endif
87   return 0;
88 }
89
90
91 int
92 ath_mutex_destroy (ath_mutex_t *lock)
93 {
94 #ifndef NDEBUG
95   assert (*lock == MUTEX_UNLOCKED);
96
97   *lock = MUTEX_DESTROYED;
98 #endif
99   return 0;
100 }
101
102
103 int
104 ath_mutex_lock (ath_mutex_t *lock)
105 {
106 #ifndef NDEBUG
107   assert (*lock == MUTEX_UNLOCKED);
108
109   *lock = MUTEX_LOCKED;
110 #endif
111   return 0;
112 }
113
114
115 int
116 ath_mutex_unlock (ath_mutex_t *lock)
117 {
118 #ifndef NDEBUG
119   assert (*lock == MUTEX_LOCKED);
120
121   *lock = MUTEX_UNLOCKED;
122 #endif
123   return 0;
124 }
125
126
127 ssize_t
128 ath_read (int fd, void *buf, size_t nbytes)
129 {
130   return read (fd, buf, nbytes);
131 }
132
133
134 ssize_t
135 ath_write (int fd, const void *buf, size_t nbytes)
136 {
137   return write (fd, buf, nbytes);
138 }
139
140
141 ssize_t
142 ath_select (int nfd, fd_set *rset, fd_set *wset, fd_set *eset,
143             struct timeval *timeout)
144 {
145 #ifdef HAVE_W32_SYSTEM
146   return -1; /* Not supported. */
147 #else
148   return select (nfd, rset, wset, eset, timeout);
149 #endif
150 }
151
152  
153 ssize_t
154 ath_waitpid (pid_t pid, int *status, int options)
155 {
156 #ifdef HAVE_W32_SYSTEM
157   return -1; /* Not supported. */
158 #else
159   return waitpid (pid, status, options);
160 #endif
161 }
162
163
164 int
165 ath_accept (int s, struct sockaddr *addr, socklen_t *length_ptr)
166 {
167 #ifdef HAVE_W32_SYSTEM
168   return -1; /* Not supported. */
169 #else
170   return accept (s, addr, length_ptr);
171 #endif
172 }
173
174
175 int
176 ath_connect (int s, const struct sockaddr *addr, socklen_t length)
177 {
178 #ifdef HAVE_W32_SYSTEM
179   return -1; /* Not supported. */
180 #else
181   return connect (s, addr, length);
182 #endif
183 }
184
185
186 int
187 ath_sendmsg (int s, const struct msghdr *msg, int flags)
188 {
189 #ifdef HAVE_W32_SYSTEM
190   return -1; /* Not supported. */
191 #else
192   return sendmsg (s, msg, flags);
193 #endif
194 }
195
196
197 int
198 ath_recvmsg (int s, struct msghdr *msg, int flags)
199 {
200 #ifdef HAVE_W32_SYSTEM
201   return -1; /* Not supported. */
202 #else
203   return recvmsg (s, msg, flags);
204 #endif
205 }