These are the windows fixes that I previously alluded to, combined with
[dyninst.git] / common / h / headers.h
1 /*
2  * Copyright (c) 1996-2007 Barton P. Miller
3  * 
4  * We provide the Paradyn Parallel Performance Tools (below
5  * described as "Paradyn") on an AS IS basis, and do not warrant its
6  * validity or performance.  We reserve the right to update, modify,
7  * or discontinue this software at any time.  We shall have no
8  * obligation to supply such updates or modifications or any other
9  * form of support to you.
10  * 
11  * By your use of Paradyn, you understand and agree that we (or any
12  * other person or entity with proprietary rights in Paradyn) are
13  * under no obligation to provide either maintenance services,
14  * update services, notices of latent defects, or correction of
15  * defects for Paradyn.
16  * 
17  * This library is free software; you can redistribute it and/or
18  * modify it under the terms of the GNU Lesser General Public
19  * License as published by the Free Software Foundation; either
20  * version 2.1 of the License, or (at your option) any later version.
21  * 
22  * This library is distributed in the hope that it will be useful,
23  * but WITHOUT ANY WARRANTY; without even the implied warranty of
24  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25  * Lesser General Public License for more details.
26  * 
27  * You should have received a copy of the GNU Lesser General Public
28  * License along with this library; if not, write to the Free Software
29  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
30  */
31
32
33 // $Id: headers.h,v 1.28 2008/05/09 00:25:37 jaw Exp $
34
35 #ifndef KLUDGES_H
36 #define KLUDGES_H
37
38 #include <sys/types.h>
39
40 #ifndef FILE__
41 #define FILE__ strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__
42 #endif
43
44 /*
45  * Kludges to handle broken system includes and such...
46  */
47
48 extern "C" {
49 typedef int (*xdr_rd_func)(void *, char *, int);
50 typedef int (*xdr_wr_func)(void *, char *, int);
51 }
52
53
54 #include "common/h/Types.h"
55
56 #if defined(os_solaris)
57 #include "common/h/solarisHeaders.h"
58
59 #elif defined(os_linux)
60 #include "common/h/linuxHeaders.h"
61
62 #elif defined(os_aix)
63 #include "common/h/aixv41Headers.h"
64
65 #elif defined(os_osf)
66 #include "common/h/osfHeaders.h"
67
68 #elif defined(os_windows)
69 #include "common/h/ntHeaders.h"
70
71 #elif defined(os_irix)
72 #include "common/h/irixHeaders.h"
73
74 #endif  /* architecture specific */
75
76 typedef enum {
77    RRVsuccess,
78    RRVnoData,
79    RRVinsufficientData,
80    RRVreadError,
81    RRVerror
82 } readReturnValue_t;
83
84
85 #if 0
86 template<class T>
87 readReturnValue_t P_socketRead(PDSOCKET fd, T &it, size_t sz)
88 {
89    ssize_t bytes_read = 0;
90 #if defined (os_windows)
91    bytes_read = recv( fd, (char *)&it, sz, 0 );
92 #else
93 try_again:
94    bytes_read = read(fd, &it, sz);
95 #endif
96
97    if ( (ssize_t)PDSOCKET_ERROR == bytes_read ) {
98 #if defined (os_windows)
99       if (errno != 0) {
100          fprintf(stderr, "%s[%d]:  read failed: %s:%d\n", FILE__, __LINE__,
101                strerror(errno), errno);
102          return REreadError;
103       }
104 #else
105       if (errno == EAGAIN || errno == EINTR)
106          goto try_again;
107
108       fprintf(stderr, "%s[%d]:  read failed: %s:%d\n", FILE__, __LINE__,
109             strerror(errno), errno);
110       return REreadError;
111 #endif
112    }
113
114    if (0 == bytes_read) {
115       //  fd closed on other end (most likely)
116       //bperr("%s[%d]:  cannot read, fd is closed\n", FILE__, __LINE__);
117       return REnoData;
118    }
119 #if defined (os_windows)
120    if ((PDSOCKET_ERROR == bytes_read) && (errno == 0)) {
121       //  fd closed on other end (most likely)
122       //bperr("%s[%d]:  cannot read, fd is closed\n", FILE__, __LINE__);
123       return REnoData;
124    }
125 #endif
126
127    if (bytes_read != sz) {
128       fprintf(stderr, "%s[%d]:  read wrong number of bytes! %d, not %d\n",
129             FILE__, __LINE__, bytes_read, sz);
130       fprintf(stderr, "FIXME:  Need better logic to handle incomplete reads\n");
131       return REinsufficientData;
132    }
133
134    return REsuccess;
135
136 }
137 #endif
138
139 #if !defined(os_windows)
140 template <class T>
141 readReturnValue_t P_socketRead(PDSOCKET fd, T &it, ssize_t sz)
142 {
143    ssize_t bytes_read = 0;
144 try_again:
145    bytes_read = read(fd, (char *)&it, sz);
146
147    if ( (ssize_t)-1 == bytes_read ) {
148       if (errno == EAGAIN || errno == EINTR) 
149          goto try_again;
150
151       fprintf(stderr, "%s[%d]:  read failed: %s:%d\n", FILE__, __LINE__,
152             strerror(errno), errno);
153       return RRVreadError;
154    }
155
156    if (0 == bytes_read) {
157       //  fd closed on other end (most likely)
158       //bperr("%s[%d]:  cannot read, fd is closed\n", FILE__, __LINE__);
159       return RRVnoData;
160    }
161    if (bytes_read != sz) {
162       bperr("%s[%d]:  read wrong number of bytes! %d, not %d\n", 
163             FILE__, __LINE__, bytes_read, sz);
164       bperr("FIXME:  Need better logic to handle incomplete reads\n");
165       return RRVinsufficientData;
166    }
167
168    return RRVsuccess;
169 }
170 #else
171
172 #define ssize_t int
173 template <class T>
174 readReturnValue_t P_socketRead(PDSOCKET fd, T &it, ssize_t sz)
175 {
176    ssize_t bytes_read = 0;
177
178    bytes_read = recv( fd, (char *)&it, sz, 0 );
179
180    if ( PDSOCKET_ERROR == bytes_read && errno != 0 ) {
181       fprintf(stderr, "%s[%d]:  read failed: %s:%d\n", FILE__, __LINE__,
182             strerror(errno), errno);
183       return RRVreadError;
184    }
185
186    if (0 == bytes_read || (PDSOCKET_ERROR == bytes_read && errno == 0)) {
187       //  fd closed on other end (most likely)
188       //bperr("%s[%d]:  cannot read, fd is closed\n", FILE__, __LINE__);
189       return RRVnoData;
190    }
191
192    if (bytes_read != sz) {
193       bperr("%s[%d]:  read wrong number of bytes!\n", FILE__, __LINE__);
194       bperr("FIXME:  Need better logic to handle incomplete reads\n");
195       return RRVinsufficientData;
196    }
197
198    return RRVsuccess;
199 }
200 #endif
201
202 template<class T>
203 readReturnValue_t P_socketRead(PDSOCKET fd, T &it)
204 {
205    return P_socketRead<T>(fd, it, sizeof(T));
206 }
207
208 #endif /* KLUDGES_H */