Update copyright to LGPL on all files
[dyninst.git] / common / h / headers.h
1 /*
2  * Copyright (c) 1996-2009 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.30 2008/06/30 19:40:18 legendre 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) || defined(os_bgp) || defined(os_bg_ion)
60 #include "common/h/linuxHeaders.h"
61
62 #elif defined(os_bg_compute)
63 #include "common/h/bg_compute_headers.h"
64
65 #elif defined(os_aix)
66 #include "common/h/aixv41Headers.h"
67
68 #elif defined(os_osf)
69 #include "common/h/osfHeaders.h"
70
71 #elif defined(os_windows)
72 #include "common/h/ntHeaders.h"
73
74 #elif defined(os_irix)
75 #include "common/h/irixHeaders.h"
76
77 #endif  /* architecture specific */
78
79 typedef enum {
80    RRVsuccess,
81    RRVnoData,
82    RRVinsufficientData,
83    RRVreadError,
84    RRVerror
85 } readReturnValue_t;
86
87
88 #if 0
89 template<class T>
90 readReturnValue_t P_socketRead(PDSOCKET fd, T &it, size_t sz)
91 {
92    ssize_t bytes_read = 0;
93 #if defined (os_windows)
94    bytes_read = recv( fd, (char *)&it, sz, 0 );
95 #else
96 try_again:
97    bytes_read = read(fd, &it, sz);
98 #endif
99
100    if ( (ssize_t)PDSOCKET_ERROR == bytes_read ) {
101 #if defined (os_windows)
102       if (errno != 0) {
103          fprintf(stderr, "%s[%d]:  read failed: %s:%d\n", FILE__, __LINE__,
104                strerror(errno), errno);
105          return REreadError;
106       }
107 #else
108       if (errno == EAGAIN || errno == EINTR)
109          goto try_again;
110
111       fprintf(stderr, "%s[%d]:  read failed: %s:%d\n", FILE__, __LINE__,
112             strerror(errno), errno);
113       return REreadError;
114 #endif
115    }
116
117    if (0 == bytes_read) {
118       //  fd closed on other end (most likely)
119       //bperr("%s[%d]:  cannot read, fd is closed\n", FILE__, __LINE__);
120       return REnoData;
121    }
122 #if defined (os_windows)
123    if ((PDSOCKET_ERROR == bytes_read) && (errno == 0)) {
124       //  fd closed on other end (most likely)
125       //bperr("%s[%d]:  cannot read, fd is closed\n", FILE__, __LINE__);
126       return REnoData;
127    }
128 #endif
129
130    if (bytes_read != sz) {
131       fprintf(stderr, "%s[%d]:  read wrong number of bytes! %d, not %d\n",
132             FILE__, __LINE__, bytes_read, sz);
133       fprintf(stderr, "FIXME:  Need better logic to handle incomplete reads\n");
134       return REinsufficientData;
135    }
136
137    return REsuccess;
138
139 }
140 #endif
141
142 #if !defined(os_bg_compute)
143 #if !defined(os_windows)
144 template <class T>
145 readReturnValue_t P_socketRead(PDSOCKET fd, T &it, ssize_t sz)
146 {
147    ssize_t bytes_read = 0;
148 try_again:
149    bytes_read = read(fd, (char *)&it, sz);
150
151    if ( (ssize_t)-1 == bytes_read ) {
152       if (errno == EAGAIN || errno == EINTR) 
153          goto try_again;
154
155       fprintf(stderr, "%s[%d]:  read failed: %s:%d\n", FILE__, __LINE__,
156             strerror(errno), errno);
157       return RRVreadError;
158    }
159
160    if (0 == bytes_read) {
161       //  fd closed on other end (most likely)
162       //bperr("%s[%d]:  cannot read, fd is closed\n", FILE__, __LINE__);
163       return RRVnoData;
164    }
165    if (bytes_read != sz) {
166       //bperr("%s[%d]:  read wrong number of bytes! %d, not %d\n", 
167       //      FILE__, __LINE__, bytes_read, sz);
168       //bperr("FIXME:  Need better logic to handle incomplete reads\n");
169       return RRVinsufficientData;
170    }
171
172    return RRVsuccess;
173 }
174 #else
175
176 #define ssize_t int
177 template <class T>
178 readReturnValue_t P_socketRead(PDSOCKET fd, T &it, ssize_t sz)
179 {
180    ssize_t bytes_read = 0;
181
182    bytes_read = recv( fd, (char *)&it, sz, 0 );
183
184    if ( PDSOCKET_ERROR == bytes_read && errno != 0 ) {
185       fprintf(stderr, "%s[%d]:  read failed: %s:%d\n", FILE__, __LINE__,
186             strerror(errno), errno);
187       return RRVreadError;
188    }
189
190    if (0 == bytes_read || (PDSOCKET_ERROR == bytes_read && errno == 0)) {
191       //  fd closed on other end (most likely)
192       //bperr("%s[%d]:  cannot read, fd is closed\n", FILE__, __LINE__);
193       return RRVnoData;
194    }
195
196    if (bytes_read != sz) {
197       //bperr("%s[%d]:  read wrong number of bytes!\n", FILE__, __LINE__);
198       //bperr("FIXME:  Need better logic to handle incomplete reads\n");
199       return RRVinsufficientData;
200    }
201
202    return RRVsuccess;
203 }
204 #endif /* !defined(os_windows) */
205
206 template<class T>
207 readReturnValue_t P_socketRead(PDSOCKET fd, T &it)
208 {
209    return P_socketRead<T>(fd, it, sizeof(T));
210 }
211 #endif /* !os_bg_compute */
212 #endif /* KLUDGES_H */