"Fossies" - the Fresh Open Source Software Archive 
Member "apache-zookeeper-3.8.1/zookeeper-client/zookeeper-client-c/src/addrvec.h" (25 Jan 2023, 4334 Bytes) of package /linux/misc/apache-zookeeper-3.8.1.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style:
standard) with prefixed line numbers and
code folding option.
Alternatively you can here
view or
download the uninterpreted source code file.
For more information about "addrvec.h" see the
Fossies "Dox" file reference documentation.
1 /**
2 * Licensed to the Apache Software Foundation (ASF) under one
3 * or more contributor license agreements. See the NOTICE file
4 * distributed with this work for additional information
5 * regarding copyright ownership. The ASF licenses this file
6 * to you under the Apache License, Version 2.0 (the
7 * "License"); you may not use this file except in compliance
8 * with the License. You may obtain a copy of the License at
9 *
10 * http://www.apache.org/licenses/LICENSE-2.0
11 *
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License.
17 */
18
19 #ifndef ADDRVEC_H_
20 #define ADDRVEC_H_
21
22 #ifndef WIN32
23 #include <sys/types.h>
24 #include <sys/socket.h>
25 #include <netinet/in.h>
26 #include <netdb.h>
27 #else
28 #include <WinSock2.h>
29 #include <stdint.h>
30 #endif
31
32 /**
33 * This structure represents a list of addresses. It stores the count of the
34 * number of elements that have been inserted via calls to addrvec_append and
35 * addrvec_append_addrinfo. It also has a capacity field for the number of
36 * addresses it has the ability to hold without needing to be enlarged.
37 */
38 typedef struct _addrvec {
39 unsigned int next; // next index to use
40 unsigned int count; // number of addresses in this list
41 unsigned int capacity; // number of address this list can hold
42 struct sockaddr_storage *data; // list of addresses
43 } addrvec_t;
44
45 /**
46 * Initialize an addrvec by clearing out all its state.
47 */
48 void addrvec_init(addrvec_t *avec);
49
50 /**
51 * Free any memory used internally by an addrvec
52 */
53 void addrvec_free(addrvec_t *avec);
54
55 /**
56 * Allocate an addrvec with a default capacity (16)
57 */
58 int addrvec_alloc(addrvec_t *avec);
59
60 /**
61 * Allocates an addrvec with a specified capacity
62 */
63 int addrvec_alloc_capacity(addrvec_t *avec, uint32_t capacity);
64
65 /**
66 * Grow an addrvec by the specified amount. This will increase the capacity
67 * of the vector and not the contents.
68 */
69 int addrvec_grow(addrvec_t *avec, uint32_t grow_amount);
70
71 /**
72 * Similar to addrvec_grow but uses a default growth amount of 16.
73 */
74 int addrvec_grow_default(addrvec_t *avec);
75
76 /**
77 * Check if an addrvec contains the specificed sockaddr_storage value.
78 * \returns 1 if it contains the value and 0 otherwise.
79 */
80 int addrvec_contains(const addrvec_t *avec, const struct sockaddr_storage *addr);
81
82 /**
83 * Append the given sockaddr_storage pointer into the addrvec. The contents of
84 * the given 'addr' are copied into the addrvec via memcpy.
85 */
86 int addrvec_append(addrvec_t *avec, const struct sockaddr_storage *addr);
87
88 /**
89 * Append the given addrinfo pointer into the addrvec. The contents of the given
90 * 'addrinfo' are copied into the addrvec via memcpy.
91 */
92 int addrvec_append_addrinfo(addrvec_t *avec, const struct addrinfo *addrinfo);
93
94 /**
95 * Shuffle the addrvec so that it's internal list of addresses are randomized.
96 * Uses random() and assumes it has been properly seeded.
97 */
98 void addrvec_shuffle(addrvec_t *avec);
99
100 /**
101 * Determine if the addrvec has a next element (e.g. it's safe to call addrvec_next)
102 *
103 * \returns 1 if it has a next element and 0 otherwise
104 */
105 int addrvec_hasnext(const addrvec_t *avec);
106
107 /**
108 * Determine if the addrvec is at the end or not. Specifically, this means a
109 * subsequent call to addrvec_next will loop around to the start again.
110 */
111 int addrvec_atend(const addrvec_t *avec);
112
113 /**
114 * Get the next entry from the addrvec and update the associated index.
115 *
116 * If next is NULL, the index will still be updated.
117 *
118 * If the current index points at (or after) the last element in the vector then
119 * it will loop back around and start at the beginning of the list.
120 */
121 void addrvec_next(addrvec_t *avec, struct sockaddr_storage *next);
122
123 /**
124 * Retrieves the next entry from the addrvec but doesn't update the index.
125 */
126 void addrvec_peek(addrvec_t *avec, struct sockaddr_storage *next);
127
128 /**
129 * Compare two addrvecs for equality.
130 *
131 * \returns 1 if the contents of the two lists are identical and and 0 otherwise.
132 */
133 int addrvec_eq(const addrvec_t *a1, const addrvec_t *a2);
134
135 #endif // ADDRVEC_H
136
137
138