globus_common 18.13
Loading...
Searching...
No Matches
globus_libc.h
Go to the documentation of this file.
1/*
2 * Copyright 1999-2006 University of Chicago
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
21
22#ifndef GLOBUS_LIBC_H
23#define GLOBUS_LIBC_H 1
24
26#include "globus_thread.h"
27
28#if defined(WIN32) && !defined(__CYGWIN__)
29/* For addrinfo struct */
30#include <winsock2.h>
31#include <ws2tcpip.h>
32#define EAI_SYSTEM 11
33/* snprintf is already defined to mingw version */
34#if !defined(__USE_MINGW_ANSI_STDIO)
35#define snprintf _snprintf
36#endif
37#endif
38
39#if __GNUC__
40# define GLOBUS_DEPRECATED(func) func __attribute__((deprecated))
41#elif defined(_MSC_VER)
42# define GLOBUS_DEPRECATED(func) __declspec(deprecated) func
43#else
44# define GLOBUS_DEPRECATED(func) func
45#endif
46
47#ifdef __cplusplus
48extern "C" {
49#endif
50
51extern globus_mutex_t globus_libc_mutex;
52
53#define globus_macro_libc_lock() \
54 globus_mutex_lock(&globus_libc_mutex)
55#define globus_macro_libc_unlock() \
56 globus_mutex_unlock(&globus_libc_mutex)
57
58#ifdef USE_MACROS
59#define globus_libc_lock() globus_macro_libc_lock()
60#define globus_libc_unlock() globus_macro_libc_unlock()
61#else /* USE_MACROS */
62extern int globus_libc_lock(void);
63extern int globus_libc_unlock(void);
64#endif /* USE_MACROS */
65
66#if defined(va_copy)
67# define globus_libc_va_copy(dest,src) \
68 va_copy(dest,src)
69#elif defined(__va_copy)
70# define globus_libc_va_copy(dest,src) \
71 __va_copy(dest,src)
72#else
73# define globus_libc_va_copy(dest,src) \
74 memcpy(&dest, &src, sizeof(va_list))
75#endif
76
77
78#define globus_stdio_lock globus_libc_lock
79#define globus_stdio_unlock globus_libc_unlock
80#define globus_libc_printf printf
81#define globus_libc_fprintf fprintf
82#define globus_libc_sprintf sprintf
83#define globus_libc_vprintf vprintf
84#define globus_libc_vfprintf vfprintf
85#define globus_libc_vsprintf vsprintf
86
87#if __STDC_VERSION__ >= 199901L
88#define globus_libc_snprintf snprintf
89#define globus_libc_vsnprintf vsnprintf
90#else
91extern int globus_libc_snprintf(char *s, size_t n, const char *format, ...);
92extern int globus_libc_vsnprintf(char *s, size_t n, const char *format,
93 va_list ap);
94#endif
95
96/*
97 * File I/O routines
98 */
99#if !defined(_WIN32)
100#define globus_libc_open open
101#define globus_libc_close close
102#define globus_libc_read read
103#define globus_libc_write write
104#define globus_libc_umask umask
105#define globus_libc_writev writev
106#define globus_libc_fstat fstat
107
108#define globus_libc_opendir opendir
109#define globus_libc_telldir telldir
110#define globus_libc_seekdir seekdir
111#define globus_libc_rewinddir rewinddir
112#define globus_libc_closedir closedir
113#define globus_libc_getpwuid_r getpwuid_r
114
115#else /* _WIN32 */
116
117extern
118mode_t
119globus_libc_umask_win32(
120 mode_t mask);
121
122# define globus_libc_open _open
123# define globus_libc_close _close
124# define globus_libc_read _read
125# define globus_libc_write _write
126# define globus_libc_umask globus_libc_umask_win32
127# define globus_libc_writev(fd,iov,iovcnt) \
128 write(fd,iov[0].iov_base,iov[0].iov_len)
129# define uid_t int
130#if defined(TARGET_ARCH_CYGWIN) || defined(TARGET_ARCH_MINGW32)
131#define globus_libc_opendir opendir
132#define globus_libc_telldir telldir
133#define globus_libc_seekdir seekdir
134#define globus_libc_rewinddir rewinddir
135#define globus_libc_closedir closedir
136#endif
137#endif /* _WIN32 */
138extern
139int
140globus_libc_readdir_r(
141 DIR * dirp,
142 struct dirent ** result);
143
144/*
145 * Memory allocation routines
146 */
147#define globus_malloc(bytes) globus_libc_malloc(bytes)
148#define globus_realloc(ptr,bytes) globus_libc_realloc(ptr,bytes)
149#define globus_calloc(nobjs,bytes) globus_libc_calloc(nobjs,bytes)
150#define globus_free(ptr) globus_libc_free(ptr)
151
152#define globus_libc_malloc malloc
153#define globus_libc_realloc realloc
154#define globus_libc_calloc calloc
155#define globus_libc_free free
156#define globus_libc_alloca alloca
157#define globus_libc_lseek lseek
158
159/* Miscellaneous libc functions (formerly md_unix.c) */
160int globus_libc_gethostname(char *name, int len);
161int globus_libc_getpid(void);
162int globus_libc_fork(void);
163int globus_libc_usleep(long usec);
164double globus_libc_wallclock(void);
165
166/* returns # of characters printed to s */
167extern int globus_libc_sprint_off_t(char * s, globus_off_t off);
168/* returns 1 if scanned succeeded */
169extern int globus_libc_scan_off_t(char *s, globus_off_t *off, int *consumed);
170
171/* Use getaddrinfo instead */
172GLOBUS_DEPRECATED(struct hostent *globus_libc_gethostbyname_r(char *name,
173 struct hostent *result,
174 char *buffer,
175 int buflen,
176 int *h_errnop));
177/* Use getnameinfo instead */
178GLOBUS_DEPRECATED(struct hostent *globus_libc_gethostbyaddr_r(char *addr,
179 int length,
180 int type,
181 struct hostent *result,
182 char *buffer,
183 int buflen,
184 int *h_errnop));
185
186#ifdef _POSIX_THREAD_SAFE_FUCTIONS
187#define globus_libc_ctime_r(clock, buf, buflen) ctime_r(clock, buf)
188#define globus_libc_localtime_r(timer, result) localtime_r(timer, result)
189#define globus_libc_gmtime_r(timer, result) gmtime_r(timer, result)
190#else
191char *globus_libc_ctime_r(/*should be const */time_t *clock, char *buf, int buflen);
192struct tm * globus_libc_localtime_r(const time_t *timep, struct tm *result);
193struct tm * globus_libc_gmtime_r(const time_t *timep, struct tm *result);
194#endif
195
196#if !defined(_WIN32)
197#define globus_libc_getpwnam_r getpwnam_r
198#endif
199
200int
201globus_libc_strncasecmp(
202 const char * s1,
203 const char * s2,
204 globus_size_t n);
205
206int globus_libc_setenv(register const char *name,
207 register const char *value,
208 int rewrite);
209void globus_libc_unsetenv(register const char *name);
210
211/* Use getenv instead */
212GLOBUS_DEPRECATED(char *globus_libc_getenv(register const char *name));
213
214/* Use strerror or strerror_r as needed instead */
215char *globus_libc_system_error_string(int the_error);
216
217char *
218globus_libc_strdup(const char * source);
219
220char *
221globus_libc_strndup(const char * string, globus_size_t length);
222
223char *
224globus_libc_strtok(
225 char * s,
226 const char * delim);
227
228#define globus_libc_strcmp strcmp
229#define globus_libc_strlen strlen
230
231char *
233 const char ** array,
234 int count);
235
236int
237globus_libc_vprintf_length(const char * fmt, va_list ap);
238
239int
240globus_libc_printf_length(const char * fmt, ...);
241
242/* not really 'libc'... but a convenient place to put it in */
243int globus_libc_gethomedir(char *result, int bufsize);
244
245char *
246globus_common_create_string(
247 const char * format,
248 ...);
249
250char *
251globus_common_create_nstring(
252 int length,
253 const char * format,
254 ...);
255
256char *
257globus_common_v_create_string(
258 const char * format,
259 va_list ap);
260
261char *
262globus_common_v_create_nstring(
263 int length,
264 const char * format,
265 va_list ap);
266
267/* for backwards compatibility */
268#define globus_libc_memmove(d, s, n) memmove((d), (s), (n))
269
270#ifdef __hpux
271# define globus_libc_setegid(a) setresgid(-1,a,-1)
272# define globus_libc_seteuid(a) setresuid(-1,a,-1)
273#else
274# define globus_libc_setegid(a) setegid(a)
275# define globus_libc_seteuid(a) seteuid(a)
276#endif
277
278
279/* IPv6 compatible utils */
280typedef struct sockaddr_storage globus_sockaddr_t;
281typedef struct addrinfo globus_addrinfo_t;
282
283#ifdef AF_INET6
284#define GlobusLibcProtocolFamilyIsIP(family) \
285 ((family == AF_INET ? 1 : (family == AF_INET6 ? 1 : 0)))
286#else
287#define GlobusLibcProtocolFamilyIsIP(family) \
288 (family == AF_INET ? 1 : 0)
289#endif
290
291#ifndef PF_INET
292#define PF_INET AF_INET
293#endif
294
295#ifndef PF_UNSPEC
296#define PF_UNSPEC AF_UNSPEC
297#endif
298
299#define GlobusLibcSockaddrSetFamily(_addr, fam) ((struct sockaddr *) &(_addr))->sa_family = fam
300#define GlobusLibcSockaddrGetFamily(_addr) ((struct sockaddr *) &(_addr))->sa_family
301
302#ifdef AF_INET6
303#define GlobusLibcSockaddrGetPort(addr, port) \
304 do \
305 { \
306 const struct sockaddr * _addr = (struct sockaddr *) &(addr);\
307 \
308 switch(_addr->sa_family) \
309 { \
310 case AF_INET: \
311 (port) = ntohs(((struct sockaddr_in *) _addr)->sin_port); \
312 break; \
313 \
314 case AF_INET6: \
315 (port) = ntohs(((struct sockaddr_in6 *) _addr)->sin6_port); \
316 break; \
317 \
318 default: \
319 globus_assert(0 && \
320 "Unknown family in GlobusLibcSockaddrGetPort"); \
321 (port) = -1; \
322 break; \
323 } \
324 } while(0)
325#else
326#define GlobusLibcSockaddrGetPort(addr, port) \
327 do \
328 { \
329 const struct sockaddr * _addr = (struct sockaddr *) &(addr);\
330 \
331 switch(_addr->sa_family) \
332 { \
333 case AF_INET: \
334 (port) = ntohs(((struct sockaddr_in *) _addr)->sin_port); \
335 break; \
336 \
337 default: \
338 globus_assert(0 && \
339 "Unknown family in GlobusLibcSockaddrGetPort"); \
340 (port) = -1; \
341 break; \
342 } \
343 } while(0)
344#endif
345
346#ifdef AF_INET6
347#define GlobusLibcSockaddrSetPort(addr, port) \
348 do \
349 { \
350 struct sockaddr * _addr = (struct sockaddr *) &(addr);\
351 \
352 switch(_addr->sa_family) \
353 { \
354 case AF_INET: \
355 ((struct sockaddr_in *) _addr)->sin_port = htons((port)); \
356 break; \
357 \
358 case AF_INET6: \
359 ((struct sockaddr_in6 *) _addr)->sin6_port = htons((port)); \
360 break; \
361 \
362 default: \
363 globus_assert(0 && \
364 "Unknown family in GlobusLibcSockaddrSetPort"); \
365 break; \
366 } \
367 } while(0)
368#else
369#define GlobusLibcSockaddrSetPort(addr, port) \
370 do \
371 { \
372 struct sockaddr * _addr = (struct sockaddr *) &(addr);\
373 \
374 switch(_addr->sa_family) \
375 { \
376 case AF_INET: \
377 ((struct sockaddr_in *) _addr)->sin_port = htons((port)); \
378 break; \
379 \
380 default: \
381 globus_assert(0 && \
382 "Unknown family in GlobusLibcSockaddrSetPort"); \
383 break; \
384 } \
385 } while(0)
386#endif
387
388/* only use this on systems with the sin_len field (AIX) */
389#define GlobusLibcSockaddrSetLen(addr, len) \
390 do \
391 { \
392 struct sockaddr * _addr = (struct sockaddr *) &(addr);\
393 \
394 switch(_addr->sa_family) \
395 { \
396 case AF_INET: \
397 ((struct sockaddr_in *) _addr)->sin_len = (len); \
398 break; \
399 \
400 case AF_INET6: \
401 ((struct sockaddr_in6 *) _addr)->sin6_len = (len); \
402 break; \
403 \
404 default: \
405 globus_assert(0 && \
406 "Unknown family in GlobusLibcSockaddrSetLen"); \
407 break; \
408 } \
409 } while(0)
410
411#define GlobusLibcSockaddrCopy(dest_addr, source_addr, source_len) \
412 (memcpy(&(dest_addr), &(source_addr), (source_len)))
413
414#define GlobusLibcSockaddrLen(addr) \
415 (((struct sockaddr *) (addr))->sa_family == AF_INET \
416 ? sizeof(struct sockaddr_in) : \
417 (((struct sockaddr *) (addr))->sa_family == AF_INET6 \
418 ? sizeof(struct sockaddr_in6) : -1))
419
420#define GLOBUS_AI_PASSIVE AI_PASSIVE
421#define GLOBUS_AI_NUMERICHOST AI_NUMERICHOST
422#define GLOBUS_AI_CANONNAME AI_CANONNAME
423
424#define GLOBUS_NI_MAXHOST NI_MAXHOST
425#define GLOBUS_NI_NOFQDN NI_NOFQDN
426#define GLOBUS_NI_NAMEREQD NI_NAMEREQD
427#define GLOBUS_NI_DGRAM NI_DGRAM
428#define GLOBUS_NI_NUMERICSERV NI_NUMERICSERV
429#define GLOBUS_NI_NUMERICHOST NI_NUMERICHOST
430
431#define GLOBUS_EAI_ERROR_OFFSET 2048
432
433#define GLOBUS_EAI_FAMILY (EAI_FAMILY + GLOBUS_EAI_ERROR_OFFSET)
434#define GLOBUS_EAI_SOCKTYPE (EAI_SOCKTYPE + GLOBUS_EAI_ERROR_OFFSET)
435#define GLOBUS_EAI_BADFLAGS (EAI_BADFLAGS + GLOBUS_EAI_ERROR_OFFSET)
436#define GLOBUS_EAI_NONAME (EAI_NONAME + GLOBUS_EAI_ERROR_OFFSET)
437#define GLOBUS_EAI_SERVICE (EAI_SERVICE + GLOBUS_EAI_ERROR_OFFSET)
438#define GLOBUS_EAI_ADDRFAMILY (EAI_ADDRFAMILY + GLOBUS_EAI_ERROR_OFFSET)
439#define GLOBUS_EAI_NODATA (EAI_NODATA + GLOBUS_EAI_ERROR_OFFSET)
440#define GLOBUS_EAI_MEMORY (EAI_MEMORY + GLOBUS_EAI_ERROR_OFFSET)
441#define GLOBUS_EAI_FAIL (EAI_FAIL + GLOBUS_EAI_ERROR_OFFSET)
442#define GLOBUS_EAI_AGAIN (EAI_AGAIN + GLOBUS_EAI_ERROR_OFFSET)
443#define GLOBUS_EAI_SYSTEM (EAI_SYSTEM + GLOBUS_EAI_ERROR_OFFSET)
444
446globus_libc_getaddrinfo(
447 const char * node,
448 const char * service,
449 const globus_addrinfo_t * hints,
450 globus_addrinfo_t ** res);
451
452void
453globus_libc_freeaddrinfo(
454 globus_addrinfo_t * res);
455
457globus_libc_getnameinfo(
458 const globus_sockaddr_t * addr,
459 char * hostbuf,
460 globus_size_t hostbuf_len,
461 char * servbuf,
462 globus_size_t servbuf_len,
463 int flags);
464
466globus_libc_addr_is_loopback(
467 const globus_sockaddr_t * addr);
468
470globus_libc_addr_is_wildcard(
471 const globus_sockaddr_t * addr);
472
473/* use this to get a numeric contact string (ip addr.. default is hostname) */
474#define GLOBUS_LIBC_ADDR_NUMERIC 1
475/* use this if this is a local addr; will use GLOBUS_HOSTNAME if avail */
476#define GLOBUS_LIBC_ADDR_LOCAL 2
477/* force IPV6 host addresses */
478#define GLOBUS_LIBC_ADDR_IPV6 4
479/* force IPV4 host addresses */
480#define GLOBUS_LIBC_ADDR_IPV4 8
481
482/* creates a contact string of the form <host>:<port>
483 * user needs to free contact string
484 */
486globus_libc_addr_to_contact_string(
487 const globus_sockaddr_t * addr,
488 int opts_mask,
489 char ** contact_string);
490
491/* copy and convert an addr between ipv4 and v4mapped */
493globus_libc_addr_convert_family(
494 const globus_sockaddr_t * src,
495 globus_sockaddr_t * dest,
496 int dest_family);
497
500 const char * contact_string,
501 int * host,
502 int * count,
503 unsigned short * port);
504
505/* create a contact string... if port == 0, it will be omitted
506 * returned string must be freed
507 *
508 * count should be 4 for ipv4 or 16 for ipv6
509 */
510char *
511globus_libc_ints_to_contact_string(
512 int * host,
513 int count,
514 unsigned short port);
515
516int
517globus_libc_gethostaddr(
518 globus_sockaddr_t * addr);
519
520int
521globus_libc_gethostaddr_by_family(
522 globus_sockaddr_t * addr,
523 int family);
524
525#ifdef __cplusplus
526}
527#endif
528
529#endif /* GLOBUS_LIBC_H */
Include System Headers.
char * globus_libc_join(const char **array, int count)
Definition globus_libc.c:3227
globus_result_t globus_libc_contact_string_to_ints(const char *contact_string, int *host, int *count, unsigned short *port)
Definition globus_libc.c:2965
Globus Threading Abstraction.
uint32_t globus_result_t
Definition globus_types.h:99
int globus_bool_t
Boolean type.
Definition globus_types.h:93
size_t globus_size_t
Standard size of memory objectThe globus_size_t is the size of a memory object. It is identical to si...
Definition globus_types.h:48
Mutex.
Definition globus_thread.h:108