Patch to remove segfault on the exiting of a service.
[openais.git] / exec / totemip.h
blob19ba17dc9a746676105763a3387447941126e397
1 /*
2 * Copyright (c) 2005 Red Hat Inc
3 * Author: Patrick Caulfield (pcaulfie@redhat.com)
5 * Copyright (c) 2006 Sun Microsystems, Inc.
7 * All rights reserved.
9 * This software licensed under BSD license, the text of which follows:
11 * Redistribution and use in source and binary forms, with or without
12 * modification, are permitted provided that the following conditions are met:
14 * - Redistributions of source code must retain the above copyright notice,
15 * this list of conditions and the following disclaimer.
16 * - Redistributions in binary form must reproduce the above copyright notice,
17 * this list of conditions and the following disclaimer in the documentation
18 * and/or other materials provided with the distribution.
19 * - Neither the name of the MontaVista Software, Inc. nor the names of its
20 * contributors may be used to endorse or promote products derived from this
21 * software without specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
24 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
27 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
28 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
31 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
33 * THE POSSIBILITY OF SUCH DAMAGE.
36 /* IPv4/6 abstraction */
38 #ifndef TOTEMIP_H_DEFINED
39 #define TOTEMIP_H_DEFINED
41 #include <assert.h>
42 #include <string.h>
43 #include <sys/socket.h>
44 #include <netinet/in.h>
46 #ifdef SO_NOSIGPIPE
47 #ifndef MSG_NOSIGNAL
48 #define MSG_NOSIGNAL 0
49 #endif
50 void totemip_nosigpipe(int s);
51 #else
52 #define totemip_nosigpipe(s)
53 #endif
55 #define TOTEMIP_ADDRLEN (sizeof(struct in6_addr))
57 /* These are the things that get passed around */
58 struct totem_ip_address
60 unsigned int nodeid;
61 unsigned short family;
62 unsigned char addr[TOTEMIP_ADDRLEN]; /* in Network Byteorder */
63 } __attribute__((packed));
65 typedef struct totem_ip_address totem_ip_address_t;
67 static inline void swab_totem_ip_address_t (totem_ip_address_t *to_swab)
69 to_swab->nodeid = swab32 (to_swab->nodeid);
70 to_swab->family = swab16 (to_swab->family);
73 extern int totemip_equal(struct totem_ip_address *addr1, struct totem_ip_address *addr2);
74 extern int totemip_compare(const void *a, const void *b);
75 extern void totemip_copy(struct totem_ip_address *addr1, struct totem_ip_address *addr2);
76 extern void totemip_copy_endian_convert(struct totem_ip_address *addr1, struct totem_ip_address *addr2);
77 int totemip_localhost(int family, struct totem_ip_address *localhost);
78 extern int totemip_localhost_check(struct totem_ip_address *addr);
79 extern const char *totemip_print(struct totem_ip_address *addr);
80 extern int totemip_sockaddr_to_totemip_convert(struct sockaddr_storage *saddr, struct totem_ip_address *ip_addr);
81 extern int totemip_totemip_to_sockaddr_convert(struct totem_ip_address *ip_addr,
82 uint16_t port, struct sockaddr_storage *saddr, int *addrlen);
83 extern int totemip_parse(struct totem_ip_address *totemip, char *addr, int family);
84 extern int totemip_iface_check(struct totem_ip_address *bindnet, struct totem_ip_address *boundto, int *interface_up, int *interface_num);
86 /* These two simulate a zero in_addr by clearing the family field */
87 static inline void totemip_zero_set(struct totem_ip_address *addr)
89 addr->family = 0;
91 static inline int totemip_zero_check(struct totem_ip_address *addr)
93 return (addr->family == 0);
96 static inline unsigned int totemip_compute_nodeid_from_addr(
97 const struct totem_ip_address *addr)
99 struct in_addr *in = (struct in_addr *)addr->addr;
100 assert(addr->family == AF_INET);
102 return (unsigned int)ntohl(in->s_addr);
105 #endif