2 * Copyright (c) 2008-2011 Apple Inc. All rights reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
21 * @APPLE_LICENSE_HEADER_END@
24 #ifndef __SI_MODULE_H__
25 #define __SI_MODULE_H__
29 #include <netinet/in.h>
30 #include <sys/socket.h>
33 #include <uuid/uuid.h>
37 #include <mach/mach.h>
41 #define forever for(;;)
42 #define string_equal(A,B) (strcmp(A,B)==0)
43 #define string_not_equal(A,B) (strcmp(A,B)!=0)
45 #define SI_CALL_USER_BYNAME 0
46 #define SI_CALL_USER_BYUID 1
47 #define SI_CALL_USER_ALL 2
48 #define SI_CALL_GROUP_BYNAME 3
49 #define SI_CALL_GROUP_BYGID 4
50 #define SI_CALL_GROUP_ALL 5
51 #define SI_CALL_NETGROUP_BYNAME 6
52 #define SI_CALL_IN_NETGROUP 7
53 #define SI_CALL_GROUPLIST 8
54 #define SI_CALL_ALIAS_BYNAME 9
55 #define SI_CALL_ALIAS_ALL 10
56 #define SI_CALL_HOST_BYNAME 11
57 #define SI_CALL_HOST_BYADDR 12
58 #define SI_CALL_HOST_ALL 13
59 #define SI_CALL_NETWORK_BYNAME 14
60 #define SI_CALL_NETWORK_BYADDR 15
61 #define SI_CALL_NETWORK_ALL 16
62 #define SI_CALL_SERVICE_BYNAME 17
63 #define SI_CALL_SERVICE_BYPORT 18
64 #define SI_CALL_SERVICE_ALL 19
65 #define SI_CALL_PROTOCOL_BYNAME 20
66 #define SI_CALL_PROTOCOL_BYNUMBER 21
67 #define SI_CALL_PROTOCOL_ALL 22
68 #define SI_CALL_RPC_BYNAME 23
69 #define SI_CALL_RPC_BYNUMBER 24
70 #define SI_CALL_RPC_ALL 25
71 #define SI_CALL_FS_BYSPEC 26
72 #define SI_CALL_FS_BYFILE 27
73 #define SI_CALL_FS_ALL 28
74 #define SI_CALL_ADDRINFO 29
75 #define SI_CALL_NAMEINFO 30
76 #define SI_CALL_IPNODE_BYNAME 31
77 #define SI_CALL_MAC_BYNAME 32
78 #define SI_CALL_MAC_BYMAC 33
79 #define SI_CALL_MAC_ALL 34
80 #define SI_CALL_DNS_QUERY 35
81 #define SI_CALL_DNS_SEARCH 36
83 #define si_call_returns_list(A) \
84 ((A==SI_CALL_USER_ALL)||(A==SI_CALL_GROUP_ALL)||(A==SI_CALL_HOST_ALL)||(A==SI_CALL_NETWORK_ALL)||\
85 (A==SI_CALL_SERVICE_ALL)||(A==SI_CALL_PROTOCOL_ALL)||(A==SI_CALL_RPC_ALL)||(A==SI_CALL_FS_ALL)||\
86 (A==SI_CALL_ALIAS_ALL)||(A==SI_CALL_NETGROUP_BYNAME)||(A==SI_CALL_ADDRINFO)||(A==SI_CALL_MAC_ALL))
88 #define si_call_str1_is_buffer(A) \
89 ((A==SI_CALL_HOST_BYADDR)||(A==SI_CALL_NAMEINFO))
91 #define CATEGORY_INVALID (-1)
92 #define CATEGORY_DEFAULT 0
93 #define CATEGORY_USER 1
94 #define CATEGORY_GROUP 2
95 #define CATEGORY_GROUPLIST 3
96 #define CATEGORY_NETGROUP 4
97 #define CATEGORY_ALIAS 5
98 #define CATEGORY_HOST_IPV4 6
99 #define CATEGORY_HOST_IPV6 7
100 #define CATEGORY_NETWORK 8
101 #define CATEGORY_SERVICE 9
102 #define CATEGORY_PROTOCOL 10
103 #define CATEGORY_RPC 11
104 #define CATEGORY_FS 12
105 #define CATEGORY_MAC 13
106 #define CATEGORY_NAMEINFO 14
107 #define CATEGORY_ADDRINFO 15
108 #define CATEGORY_DNSPACKET 16
109 #define CATEGORY_SRV 17
110 #define CATEGORY_COUNT 18
113 #define CATEGORY_HOST CATEGORY_HOST_IPV4
119 /* host, getaddrinfo, and getnameinfo status codes */
120 #define SI_STATUS_NO_ERROR 0
121 #define SI_STATUS_H_ERRNO_HOST_NOT_FOUND 1
122 #define SI_STATUS_H_ERRNO_TRY_AGAIN 2
123 #define SI_STATUS_H_ERRNO_NO_RECOVERY 3
124 #define SI_STATUS_H_ERRNO_NO_DATA 4
125 #define SI_STATUS_INTERNAL 10
126 #define SI_STATUS_WORKITEM_NOT_FOUND 11
127 #define SI_STATUS_RETURNS_ITEM 12
128 #define SI_STATUS_RETURNS_LIST 13
129 #define SI_STATUS_CALL_IN_PROGRESS 14
130 #define SI_STATUS_CALL_CANCELLED 15
131 #define SI_STATUS_EAI_PLUS_100 100
132 #define SI_STATUS_EAI_ADDRFAMILY 101
133 #define SI_STATUS_EAI_AGAIN 102
134 #define SI_STATUS_EAI_BADFLAGS 103
135 #define SI_STATUS_EAI_FAIL 104
136 #define SI_STATUS_EAI_FAMILY 105
137 #define SI_STATUS_EAI_MEMORY 106
138 #define SI_STATUS_EAI_NODATA 107
139 #define SI_STATUS_EAI_NONAME 108
140 #define SI_STATUS_EAI_SERVICE 109
141 #define SI_STATUS_EAI_SOCKTYPE 110
142 #define SI_STATUS_EAI_SYSTEM 111
143 #define SI_STATUS_EAI_BADHINTS 112
144 #define SI_STATUS_EAI_PROTOCOL 113
145 #define SI_STATUS_EAI_OVERFLOW 114
146 #define SI_STATUS_ERRNO_PLUS_200 200
148 typedef void (*item_async_callback
)(si_item_t
*, uint32_t, void *);
149 typedef void (*list_async_callback
)(si_list_t
*, uint32_t, void *);
151 typedef struct grouplist_s
159 typedef struct addrinfo_s
166 socket_data_t ai_addr
;
170 typedef struct nameinfo_s
182 typedef struct netgrent_s
189 typedef struct dnspacket_s
194 struct sockaddr
*dns_server
;
197 typedef struct si_srv_s
207 struct si_mod_vtable_s
209 void (*sim_close
)(struct si_mod_s
*si
);
211 int (*sim_is_valid
)(struct si_mod_s
*si
, si_item_t
*item
);
213 si_item_t
*(*sim_user_byname
)(struct si_mod_s
*si
, const char *name
);
214 si_item_t
*(*sim_user_byuid
)(struct si_mod_s
*si
, uid_t uid
);
215 si_item_t
*(*sim_user_byuuid
)(struct si_mod_s
*si
, uuid_t uuid
);
216 si_list_t
*(*sim_user_all
)(struct si_mod_s
*si
);
218 si_item_t
*(*sim_group_byname
)(struct si_mod_s
*si
, const char *name
);
219 si_item_t
*(*sim_group_bygid
)(struct si_mod_s
*si
, gid_t gid
);
220 si_item_t
*(*sim_group_byuuid
)(struct si_mod_s
*si
, uuid_t uuid
);
221 si_list_t
*(*sim_group_all
)(struct si_mod_s
*si
);
223 si_item_t
*(*sim_grouplist
)(struct si_mod_s
*si
, const char *name
, uint32_t count
);
225 si_list_t
*(*sim_netgroup_byname
)(struct si_mod_s
*si
, const char *name
);
226 int (*sim_in_netgroup
)(struct si_mod_s
*si
, const char *name
, const char *host
, const char *user
, const char *domain
);
228 si_item_t
*(*sim_alias_byname
)(struct si_mod_s
*si
, const char *name
);
229 si_list_t
*(*sim_alias_all
)(struct si_mod_s
*si
);
231 si_item_t
*(*sim_host_byname
)(struct si_mod_s
*si
, const char *name
, int af
, const char *interface
, uint32_t *err
);
232 si_item_t
*(*sim_host_byaddr
)(struct si_mod_s
*si
, const void *addr
, int af
, const char *interface
, uint32_t *err
);
233 si_list_t
*(*sim_host_all
)(struct si_mod_s
*si
);
235 si_item_t
*(*sim_network_byname
)(struct si_mod_s
*si
, const char *name
);
236 si_item_t
*(*sim_network_byaddr
)(struct si_mod_s
*si
, uint32_t addr
);
237 si_list_t
*(*sim_network_all
)(struct si_mod_s
*si
);
239 si_item_t
*(*sim_service_byname
)(struct si_mod_s
*si
, const char *name
, const char *proto
);
240 si_item_t
*(*sim_service_byport
)(struct si_mod_s
*si
, int port
, const char *proto
);
241 si_list_t
*(*sim_service_all
)(struct si_mod_s
*si
);
243 si_item_t
*(*sim_protocol_byname
)(struct si_mod_s
*si
, const char *name
);
244 si_item_t
*(*sim_protocol_bynumber
)(struct si_mod_s
*si
, int number
);
245 si_list_t
*(*sim_protocol_all
)(struct si_mod_s
*si
);
247 si_item_t
*(*sim_rpc_byname
)(struct si_mod_s
*si
, const char *name
);
248 si_item_t
*(*sim_rpc_bynumber
)(struct si_mod_s
*si
, int number
);
249 si_list_t
*(*sim_rpc_all
)(struct si_mod_s
*si
);
251 si_item_t
*(*sim_fs_byspec
)(struct si_mod_s
*si
, const char *spec
);
252 si_item_t
*(*sim_fs_byfile
)(struct si_mod_s
*si
, const char *file
);
253 si_list_t
*(*sim_fs_all
)(struct si_mod_s
*si
);
255 si_item_t
*(*sim_mac_byname
)(struct si_mod_s
*si
, const char *name
);
256 si_item_t
*(*sim_mac_bymac
)(struct si_mod_s
*si
, const char *mac
);
257 si_list_t
*(*sim_mac_all
)(struct si_mod_s
*si
);
259 si_list_t
*(*sim_addrinfo
)(struct si_mod_s
*si
, const void *node
, const void *serv
, uint32_t family
, uint32_t socktype
, uint32_t protocol
, uint32_t flags
, const char *interface
, uint32_t *err
);
260 int (*sim_wants_addrinfo
)(struct si_mod_s
*si
);
262 si_item_t
*(*sim_nameinfo
)(struct si_mod_s
*si
, const struct sockaddr
*sa
, int flags
, const char *interface
, uint32_t *err
);
264 si_list_t
*(*sim_srv_byname
)(struct si_mod_s
*si
, const char *qname
, const char *interface
, uint32_t *err
);
266 si_item_t
*(*sim_item_call
)(struct si_mod_s
*si
, int call
, const char *str1
, const char *str2
, const char *str3
, uint32_t num1
, uint32_t num2
, uint32_t *err
);
267 si_list_t
*(*sim_list_call
)(struct si_mod_s
*si
, int call
, const char *str1
, const char *str2
, const char *str3
, uint32_t num1
, uint32_t num2
, uint32_t num3
, uint32_t num4
, uint32_t *err
);
269 mach_port_t (*sim_async_call
)(struct si_mod_s
*si
, int call
, const char *str1
, const char *str2
, const char *str3
, uint32_t num1
, uint32_t num2
, uint32_t num3
, uint32_t num4
, void *callback
, void *context
);
270 void (*sim_async_cancel
)(mach_port_t p
);
271 void (*sim_async_handle_reply
)(mach_msg_header_t
*msg
);
274 #define SI_MOD_FLAG_STATIC 0x00000001
276 typedef struct si_mod_s
286 const struct si_mod_vtable_s
*vtable
;
289 si_mod_t
*si_module_with_name(const char *name
);
290 si_mod_t
*si_module_retain(si_mod_t
*si
);
291 void si_module_release(si_mod_t
*si
);
292 const char *si_module_name(si_mod_t
*si
);
293 int si_module_vers(si_mod_t
*si
);
295 si_mod_t
*si_search(void);
297 int si_item_match(si_item_t
*item
, int cat
, const void *name
, uint32_t num
, int which
);
298 int si_item_is_valid(si_item_t
*item
);
300 si_item_t
*si_user_byname(si_mod_t
*si
, const char *name
);
301 si_item_t
*si_user_byuid(si_mod_t
*si
, uid_t uid
);
302 si_item_t
*si_user_byuuid(si_mod_t
*si
, uuid_t uuid
);
303 si_list_t
*si_user_all(si_mod_t
*si
);
305 si_item_t
*si_group_byname(si_mod_t
*si
, const char *name
);
306 si_item_t
*si_group_bygid(si_mod_t
*si
, gid_t gid
);
307 si_item_t
*si_group_byuuid(si_mod_t
*si
, uuid_t uuid
);
308 si_list_t
*si_group_all(si_mod_t
*si
);
310 si_item_t
*si_grouplist(si_mod_t
*si
, const char *name
, uint32_t count
);
312 int si_in_netgroup(struct si_mod_s
*si
, const char *name
, const char *host
, const char *user
, const char *domain
);
313 si_list_t
*si_netgroup_byname(struct si_mod_s
*si
, const char *name
);
315 si_item_t
*si_alias_byname(struct si_mod_s
*si
, const char *name
);
316 si_list_t
*si_alias_all(struct si_mod_s
*si
);
318 si_item_t
*si_host_byname(si_mod_t
*si
, const char *name
, int af
, const char *interface
, uint32_t *err
);
319 si_item_t
*si_host_byaddr(si_mod_t
*si
, const void *addr
, int af
, const char *interface
, uint32_t *err
);
320 si_list_t
*si_host_all(si_mod_t
*si
);
322 si_item_t
*si_mac_byname(struct si_mod_s
*si
, const char *name
);
323 si_item_t
*si_mac_bymac(struct si_mod_s
*si
, const char *mac
);
324 si_list_t
*si_mac_all(struct si_mod_s
*si
);
326 si_item_t
*si_network_byname(si_mod_t
*si
, const char *name
);
327 si_item_t
*si_network_byaddr(si_mod_t
*si
, uint32_t addr
);
328 si_list_t
*si_network_all(si_mod_t
*si
);
330 si_item_t
*si_service_byname(si_mod_t
*si
, const char *name
, const char *proto
);
331 si_item_t
*si_service_byport(si_mod_t
*si
, int port
, const char *proto
);
332 si_list_t
*si_service_all(si_mod_t
*si
);
334 si_item_t
*si_protocol_byname(si_mod_t
*si
, const char *name
);
335 si_item_t
*si_protocol_bynumber(si_mod_t
*si
, uint32_t number
);
336 si_list_t
*si_protocol_all(si_mod_t
*si
);
338 si_item_t
*si_rpc_byname(si_mod_t
*si
, const char *name
);
339 si_item_t
*si_rpc_bynumber(si_mod_t
*si
, int number
);
340 si_list_t
*si_rpc_all(si_mod_t
*si
);
342 si_item_t
*si_fs_byspec(si_mod_t
*si
, const char *spec
);
343 si_item_t
*si_fs_byfile(si_mod_t
*si
, const char *file
);
344 si_list_t
*si_fs_all(si_mod_t
*si
);
346 int si_wants_addrinfo(si_mod_t
*s
);
347 si_list_t
*si_addrinfo(si_mod_t
*si
, const char *node
, const char *serv
, uint32_t family
, uint32_t socktype
, uint32_t protocol
, uint32_t flags
, const char *interface
, uint32_t *err
);
349 si_item_t
*si_nameinfo(si_mod_t
*si
, const struct sockaddr
*sa
, int flags
, const char *interface
, uint32_t *err
);
350 si_item_t
*si_ipnode_byname(si_mod_t
*si
, const char *name
, int family
, int flags
, const char *interface
, uint32_t *err
);
352 si_list_t
*si_srv_byname(si_mod_t
*si
, const char *qname
, const char *interface
, uint32_t *err
);
354 si_item_t
*si_item_call(si_mod_t
*si
, int call
, const char *str1
, const char *str2
, const char *str3
, uint32_t num1
, uint32_t num2
, uint32_t *err
);
355 si_list_t
*si_list_call(si_mod_t
*si
, int call
, const char *str1
, const char *str2
, const char *str3
, uint32_t num1
, uint32_t num2
, uint32_t num3
, uint32_t num4
, uint32_t *err
);
357 extern mach_port_t
si_async_call(si_mod_t
*si
, int call
, const char *str1
, const char *str2
, const char *str3
, uint32_t num1
, uint32_t num2
, uint32_t num3
, uint32_t num4
, void *callback
, void *context
);
358 extern void si_async_cancel(mach_port_t p
);
359 extern void si_async_handle_reply(mach_msg_header_t
*msg
);
361 char *si_standardize_mac_address(const char *addr
);
362 si_item_t
*si_addrinfo_v4(si_mod_t
*si
, int32_t flags
, int32_t sock
, int32_t proto
, uint16_t port
, struct in_addr
*addr
, uint16_t iface
, const char *cname
);
363 si_item_t
*si_addrinfo_v6(si_mod_t
*si
, int32_t flags
, int32_t sock
, int32_t proto
, uint16_t port
, struct in6_addr
*addr
, uint16_t iface
, const char *cname
);
364 si_item_t
*si_addrinfo_v4_mapped(si_mod_t
*si
, int32_t flags
, int32_t sock
, int32_t proto
, uint16_t port
, struct in_addr
*addr
, uint16_t iface
, const char *cname
);
365 si_list_t
*si_addrinfo_list(si_mod_t
*si
, uint32_t flags
, int socktype
, int proto
, struct in_addr
*a4
, struct in6_addr
*a6
, int port
, int scopeid
, const char *cname4
, const char *cname6
);
366 si_list_t
*si_addrinfo_list_from_hostent(si_mod_t
*si
, uint32_t flags
, uint32_t socktype
, uint32_t proto
, uint16_t port
, uint16_t scope
, const struct hostent
*h4
, const struct hostent
*h6
);
368 int _gai_serv_to_port(const char *serv
, uint32_t proto
, uint16_t *port
);
369 si_list_t
*_gai_simple(si_mod_t
*si
, const void *nodeptr
, const void *servptr
, uint32_t family
, uint32_t socktype
, uint32_t proto
, uint32_t flags
, const char *interface
, uint32_t *err
);
370 int si_inet_config(uint32_t *inet4
, uint32_t *inet6
);
372 #endif /* ! __SI_MODULE_H__ */