From e44d8d4788e2d885e241421ea37bede402a874fe Mon Sep 17 00:00:00 2001 From: Apple Date: Tue, 14 Jun 2011 23:26:46 +0000 Subject: [PATCH] Libinfo-391.tar.gz --- Libinfo.xcodeproj/project.pbxproj | 1166 +++++++++++++++++++++++++ Makefile | 24 - dns.subproj/Makefile | 17 - dns.subproj/Makefile.dist | 112 --- gen.subproj/Makefile | 71 -- gen.subproj/getifmaddrs.3 | 116 +++ gen.subproj/getifmaddrs.c | 210 +++++ gen.subproj/ifaddrs.h | 19 +- gen.subproj/inet6_opt_init.3 | 337 ++++++++ gen.subproj/inet6_rth_space.3 | 224 +++++ gen.subproj/ip6opt.c | 269 +++++- gen.subproj/rthdr.c | 569 +++++++----- lookup.subproj/Makefile | 66 -- lookup.subproj/cache_module.c | 190 ++--- lookup.subproj/ds_module.c | 377 ++++---- lookup.subproj/file_module.c | 1186 +++++++++++++++++++------- lookup.subproj/getgrent.3 | 10 +- lookup.subproj/getnameinfo.3 | 38 +- lookup.subproj/getnameinfo_link.c | 116 +++ lookup.subproj/ils.c | 42 +- lookup.subproj/kvbuf.c | 43 +- lookup.subproj/libinfo.c | 61 +- lookup.subproj/libinfo.h | 9 +- lookup.subproj/mdns_module.c | 662 +++----------- lookup.subproj/search_module.c | 703 ++++++--------- lookup.subproj/si_getaddrinfo.c | 528 +++++++----- lookup.subproj/si_module.c | 486 ++++++----- lookup.subproj/si_module.h | 161 ++-- lookup.subproj/thread_data.c | 8 +- lookup.subproj/thread_data.h | 8 +- membership.subproj/Makefile | 36 - membership.subproj/mbr_uid_to_uuid.3 | 31 +- membership.subproj/membership.c | 189 ++-- membership.subproj/membership.h | 23 +- membership.subproj/membershipPriv.h | 3 +- membership.subproj/ntsid.h | 2 +- netinfo.subproj/Makefile | 12 - nis.subproj/Makefile | 32 - nis.subproj/yp_prot.h | 172 ++-- rpc.subproj/Makefile | 71 -- rpc.subproj/clnt_simple.c | 9 +- rpc.subproj/clnt_tcp.c | 2 +- rpc.subproj/clnt_udp.c | 4 +- rpc.subproj/getrpcport.c | 3 + rpc.subproj/pmap_clnt.c | 2 +- rpc.subproj/pmap_getport.c | 2 +- util.subproj/Makefile | 23 - xcodescripts/install_files.sh | 248 ++++++ 48 files changed, 5626 insertions(+), 3066 deletions(-) create mode 100644 Libinfo.xcodeproj/project.pbxproj delete mode 100644 Makefile delete mode 100644 dns.subproj/Makefile delete mode 100644 dns.subproj/Makefile.dist delete mode 100644 gen.subproj/Makefile create mode 100644 gen.subproj/getifmaddrs.3 create mode 100644 gen.subproj/getifmaddrs.c create mode 100644 gen.subproj/inet6_opt_init.3 create mode 100644 gen.subproj/inet6_rth_space.3 delete mode 100644 lookup.subproj/Makefile create mode 100644 lookup.subproj/getnameinfo_link.c delete mode 100644 membership.subproj/Makefile delete mode 100644 netinfo.subproj/Makefile delete mode 100644 nis.subproj/Makefile delete mode 100644 rpc.subproj/Makefile delete mode 100644 util.subproj/Makefile create mode 100755 xcodescripts/install_files.sh diff --git a/Libinfo.xcodeproj/project.pbxproj b/Libinfo.xcodeproj/project.pbxproj new file mode 100644 index 0000000..d633498 --- /dev/null +++ b/Libinfo.xcodeproj/project.pbxproj @@ -0,0 +1,1166 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 45; + objects = { + +/* Begin PBXBuildFile section */ + 2D31A0FC128074E700D5A84C /* getifmaddrs.c in Sources */ = {isa = PBXBuildFile; fileRef = 2D31A0FB128074E700D5A84C /* getifmaddrs.c */; }; + 2D31A0FD128074E700D5A84C /* getifmaddrs.c in Sources */ = {isa = PBXBuildFile; fileRef = 2D31A0FB128074E700D5A84C /* getifmaddrs.c */; }; + 2D4070B1129354A700FE81ED /* getnameinfo_link.c in Sources */ = {isa = PBXBuildFile; fileRef = 2D4070B0129354A700FE81ED /* getnameinfo_link.c */; }; + 2D4070B2129354A700FE81ED /* getnameinfo_link.c in Sources */ = {isa = PBXBuildFile; fileRef = 2D4070B0129354A700FE81ED /* getnameinfo_link.c */; }; + 3FCF60EC1257C272008D8BB1 /* herror.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5283EE11478C200058CCB0 /* herror.c */; }; + 3FCF60ED1257C272008D8BB1 /* res_comp.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5283F711478C200058CCB0 /* res_comp.c */; }; + 3FCF60EE1257C272008D8BB1 /* res_data.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5283F811478C200058CCB0 /* res_data.c */; }; + 3FCF60EF1257C272008D8BB1 /* res_debug.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5283F911478C200058CCB0 /* res_debug.c */; }; + 3FCF60F01257C272008D8BB1 /* res_init.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5283FA11478C200058CCB0 /* res_init.c */; }; + 3FCF60F11257C272008D8BB1 /* res_mkquery.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5283FB11478C200058CCB0 /* res_mkquery.c */; }; + 3FCF60F21257C272008D8BB1 /* res_query.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5283FC11478C200058CCB0 /* res_query.c */; }; + 3FCF60F31257C272008D8BB1 /* res_send.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5283FE11478C200058CCB0 /* res_send.c */; }; + 3FCF60F41257C272008D8BB1 /* getifaddrs.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52840411478C200058CCB0 /* getifaddrs.c */; }; + 3FCF60F51257C272008D8BB1 /* if_indextoname.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52840A11478C200058CCB0 /* if_indextoname.c */; }; + 3FCF60F61257C272008D8BB1 /* if_nameindex.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52840B11478C200058CCB0 /* if_nameindex.c */; }; + 3FCF60F71257C272008D8BB1 /* if_nametoindex.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52840C11478C200058CCB0 /* if_nametoindex.c */; }; + 3FCF60F81257C272008D8BB1 /* inet_ntop.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52841011478C200058CCB0 /* inet_ntop.c */; }; + 3FCF60F91257C272008D8BB1 /* inet_pton.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52841111478C200058CCB0 /* inet_pton.c */; }; + 3FCF60FA1257C272008D8BB1 /* ip6opt.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52841211478C200058CCB0 /* ip6opt.c */; }; + 3FCF60FB1257C272008D8BB1 /* map_v4v6.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52841411478C200058CCB0 /* map_v4v6.c */; }; + 3FCF60FC1257C272008D8BB1 /* rthdr.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52841511478C200058CCB0 /* rthdr.c */; }; + 3FCF60FD1257C272008D8BB1 /* vars.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52841611478C200058CCB0 /* vars.c */; }; + 3FCF610A1257C272008D8BB1 /* membership.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52843E11478C200058CCB0 /* membership.c */; }; + 3FCF610B1257C272008D8BB1 /* ni_stub.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52844411478C200058CCB0 /* ni_stub.c */; }; + 3FCF610C1257C272008D8BB1 /* getdomainname.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52844611478C200058CCB0 /* getdomainname.c */; }; + 3FCF610D1257C272008D8BB1 /* getnetgrent.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52844711478C200058CCB0 /* getnetgrent.c */; }; + 3FCF610E1257C272008D8BB1 /* innetgr.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52844811478C200058CCB0 /* innetgr.c */; }; + 3FCF610F1257C272008D8BB1 /* setdomainname.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52844A11478C200058CCB0 /* setdomainname.c */; }; + 3FCF61101257C272008D8BB1 /* xdr_domainname.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52844B11478C200058CCB0 /* xdr_domainname.c */; }; + 3FCF61111257C272008D8BB1 /* xdr_keydat.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52844C11478C200058CCB0 /* xdr_keydat.c */; }; + 3FCF61121257C272008D8BB1 /* xdr_mapname.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52844D11478C200058CCB0 /* xdr_mapname.c */; }; + 3FCF61131257C272008D8BB1 /* xdr_peername.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52844E11478C200058CCB0 /* xdr_peername.c */; }; + 3FCF61141257C272008D8BB1 /* xdr_valdat.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52844F11478C200058CCB0 /* xdr_valdat.c */; }; + 3FCF61151257C272008D8BB1 /* xdr_ypbind_binding.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845011478C200058CCB0 /* xdr_ypbind_binding.c */; }; + 3FCF61161257C272008D8BB1 /* xdr_ypbind_resp.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845111478C200058CCB0 /* xdr_ypbind_resp.c */; }; + 3FCF61171257C272008D8BB1 /* xdr_ypbind_resptype.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845211478C200058CCB0 /* xdr_ypbind_resptype.c */; }; + 3FCF61181257C272008D8BB1 /* xdr_ypbind_setdom.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845311478C200058CCB0 /* xdr_ypbind_setdom.c */; }; + 3FCF61191257C272008D8BB1 /* xdr_ypmaplist.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845411478C200058CCB0 /* xdr_ypmaplist.c */; }; + 3FCF611A1257C272008D8BB1 /* xdr_ypreq_key.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845511478C200058CCB0 /* xdr_ypreq_key.c */; }; + 3FCF611B1257C272008D8BB1 /* xdr_ypreq_nokey.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845611478C200058CCB0 /* xdr_ypreq_nokey.c */; }; + 3FCF611C1257C272008D8BB1 /* xdr_ypresp_all.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845711478C200058CCB0 /* xdr_ypresp_all.c */; }; + 3FCF611D1257C272008D8BB1 /* xdr_ypresp_key_val.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845811478C200058CCB0 /* xdr_ypresp_key_val.c */; }; + 3FCF611E1257C272008D8BB1 /* xdr_ypresp_maplist.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845911478C200058CCB0 /* xdr_ypresp_maplist.c */; }; + 3FCF611F1257C272008D8BB1 /* xdr_ypresp_master.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845A11478C200058CCB0 /* xdr_ypresp_master.c */; }; + 3FCF61201257C272008D8BB1 /* xdr_ypresp_order.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845B11478C200058CCB0 /* xdr_ypresp_order.c */; }; + 3FCF61211257C272008D8BB1 /* xdr_ypresp_val.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845C11478C200058CCB0 /* xdr_ypresp_val.c */; }; + 3FCF61221257C272008D8BB1 /* xdr_ypstat.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845D11478C200058CCB0 /* xdr_ypstat.c */; }; + 3FCF61231257C272008D8BB1 /* yp_all.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52846011478C200058CCB0 /* yp_all.c */; }; + 3FCF61241257C272008D8BB1 /* yp_bind.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52846211478C200058CCB0 /* yp_bind.c */; }; + 3FCF61251257C272008D8BB1 /* yp_first.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52846411478C200058CCB0 /* yp_first.c */; }; + 3FCF61261257C272008D8BB1 /* yp_get_default_domain.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52846611478C200058CCB0 /* yp_get_default_domain.c */; }; + 3FCF61271257C272008D8BB1 /* yp_maplist.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52846711478C200058CCB0 /* yp_maplist.c */; }; + 3FCF61281257C272008D8BB1 /* yp_master.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52846911478C200058CCB0 /* yp_master.c */; }; + 3FCF61291257C272008D8BB1 /* yp_order.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52846D11478C200058CCB0 /* yp_order.c */; }; + 3FCF612A1257C272008D8BB1 /* yperr_string.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52847311478C200058CCB0 /* yperr_string.c */; }; + 3FCF612B1257C272008D8BB1 /* ypmatch_cache.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52847511478C200058CCB0 /* ypmatch_cache.c */; }; + 3FCF612C1257C272008D8BB1 /* yppasswdd_xdr.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52847611478C200058CCB0 /* yppasswdd_xdr.c */; }; + 3FCF612D1257C272008D8BB1 /* ypprot_err.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52847811478C200058CCB0 /* ypprot_err.c */; }; + 3FCF612E1257C272008D8BB1 /* auth_none.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52847B11478C200058CCB0 /* auth_none.c */; }; + 3FCF612F1257C272008D8BB1 /* auth_unix.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52847C11478C200058CCB0 /* auth_unix.c */; }; + 3FCF61301257C272008D8BB1 /* authunix_prot.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52847E11478C200058CCB0 /* authunix_prot.c */; }; + 3FCF61311257C272008D8BB1 /* bindresvport.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52848011478C200058CCB0 /* bindresvport.c */; }; + 3FCF61321257C272008D8BB1 /* clnt_generic.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52848211478C200058CCB0 /* clnt_generic.c */; }; + 3FCF61331257C272008D8BB1 /* clnt_perror.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52848311478C200058CCB0 /* clnt_perror.c */; }; + 3FCF61341257C272008D8BB1 /* clnt_raw.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52848411478C200058CCB0 /* clnt_raw.c */; }; + 3FCF61351257C272008D8BB1 /* clnt_simple.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52848511478C200058CCB0 /* clnt_simple.c */; }; + 3FCF61361257C272008D8BB1 /* clnt_tcp.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52848611478C200058CCB0 /* clnt_tcp.c */; }; + 3FCF61371257C272008D8BB1 /* clnt_udp.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52848711478C200058CCB0 /* clnt_udp.c */; }; + 3FCF61381257C272008D8BB1 /* get_myaddress.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52848911478C200058CCB0 /* get_myaddress.c */; }; + 3FCF61391257C272008D8BB1 /* getrpcent.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52848B11478C200058CCB0 /* getrpcent.c */; }; + 3FCF613A1257C272008D8BB1 /* getrpcport.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52848D11478C200058CCB0 /* getrpcport.c */; }; + 3FCF613B1257C272008D8BB1 /* pmap_clnt.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52849011478C200058CCB0 /* pmap_clnt.c */; }; + 3FCF613C1257C272008D8BB1 /* pmap_getmaps.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52849211478C200058CCB0 /* pmap_getmaps.c */; }; + 3FCF613D1257C272008D8BB1 /* pmap_getport.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52849311478C200058CCB0 /* pmap_getport.c */; }; + 3FCF613E1257C272008D8BB1 /* pmap_prot.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52849411478C200058CCB0 /* pmap_prot.c */; }; + 3FCF613F1257C272008D8BB1 /* pmap_prot2.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52849611478C200058CCB0 /* pmap_prot2.c */; }; + 3FCF61401257C272008D8BB1 /* pmap_rmt.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52849711478C200058CCB0 /* pmap_rmt.c */; }; + 3FCF61411257C272008D8BB1 /* pmap_wakeup.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52849911478C200058CCB0 /* pmap_wakeup.c */; }; + 3FCF61421257C272008D8BB1 /* rpc_callmsg.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52849E11478C200058CCB0 /* rpc_callmsg.c */; }; + 3FCF61431257C272008D8BB1 /* rpc_commondata.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52849F11478C200058CCB0 /* rpc_commondata.c */; }; + 3FCF61441257C272008D8BB1 /* rpc_dtablesize.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284A011478C200058CCB0 /* rpc_dtablesize.c */; }; + 3FCF61451257C272008D8BB1 /* rpc_prot.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284A211478C200058CCB0 /* rpc_prot.c */; }; + 3FCF61461257C272008D8BB1 /* svc.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284A311478C200058CCB0 /* svc.c */; }; + 3FCF61471257C272008D8BB1 /* svc_auth.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284A511478C200058CCB0 /* svc_auth.c */; }; + 3FCF61481257C272008D8BB1 /* svc_auth_unix.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284A711478C200058CCB0 /* svc_auth_unix.c */; }; + 3FCF61491257C272008D8BB1 /* svc_raw.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284A811478C200058CCB0 /* svc_raw.c */; }; + 3FCF614A1257C272008D8BB1 /* svc_run.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284A911478C200058CCB0 /* svc_run.c */; }; + 3FCF614B1257C272008D8BB1 /* svc_simple.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284AA11478C200058CCB0 /* svc_simple.c */; }; + 3FCF614C1257C272008D8BB1 /* svc_tcp.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284AB11478C200058CCB0 /* svc_tcp.c */; }; + 3FCF614D1257C272008D8BB1 /* svc_udp.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284AC11478C200058CCB0 /* svc_udp.c */; }; + 3FCF614E1257C272008D8BB1 /* xdr.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284AF11478C200058CCB0 /* xdr.c */; }; + 3FCF614F1257C272008D8BB1 /* xdr_array.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284B111478C200058CCB0 /* xdr_array.c */; }; + 3FCF61501257C272008D8BB1 /* xdr_float.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284B211478C200058CCB0 /* xdr_float.c */; }; + 3FCF61511257C272008D8BB1 /* xdr_mem.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284B311478C200058CCB0 /* xdr_mem.c */; }; + 3FCF61521257C272008D8BB1 /* xdr_rec.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284B411478C200058CCB0 /* xdr_rec.c */; }; + 3FCF61531257C272008D8BB1 /* xdr_reference.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284B511478C200058CCB0 /* xdr_reference.c */; }; + 3FCF61541257C272008D8BB1 /* xdr_sizeof.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284B611478C200058CCB0 /* xdr_sizeof.c */; }; + 3FCF61551257C272008D8BB1 /* xdr_stdio.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284B711478C200058CCB0 /* xdr_stdio.c */; }; + 3FCF61561257C272008D8BB1 /* hton.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284BA11478C200058CCB0 /* hton.c */; }; + 3FCF61571257C272008D8BB1 /* putpwpasswd.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284BC11478C200058CCB0 /* putpwpasswd.c */; }; + 3FCF61581257C272008D8BB1 /* rcmd.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284BE11478C200058CCB0 /* rcmd.c */; }; + 3FCF61591257C272008D8BB1 /* rcmdsh.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284BF11478C200058CCB0 /* rcmdsh.c */; }; + 3FCF615D1257C272008D8BB1 /* ether_addr.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5285F6114793400058CCB0 /* ether_addr.c */; }; + FC5284C011478C200058CCB0 /* herror.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5283EE11478C200058CCB0 /* herror.c */; }; + FC5284C811478C200058CCB0 /* res_comp.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5283F711478C200058CCB0 /* res_comp.c */; }; + FC5284C911478C200058CCB0 /* res_data.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5283F811478C200058CCB0 /* res_data.c */; }; + FC5284CA11478C200058CCB0 /* res_debug.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5283F911478C200058CCB0 /* res_debug.c */; }; + FC5284CB11478C200058CCB0 /* res_init.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5283FA11478C200058CCB0 /* res_init.c */; }; + FC5284CC11478C200058CCB0 /* res_mkquery.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5283FB11478C200058CCB0 /* res_mkquery.c */; }; + FC5284CD11478C200058CCB0 /* res_query.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5283FC11478C200058CCB0 /* res_query.c */; }; + FC5284CF11478C200058CCB0 /* res_send.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5283FE11478C200058CCB0 /* res_send.c */; }; + FC5284D211478C200058CCB0 /* getifaddrs.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52840411478C200058CCB0 /* getifaddrs.c */; }; + FC5284D311478C200058CCB0 /* if_indextoname.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52840A11478C200058CCB0 /* if_indextoname.c */; }; + FC5284D411478C200058CCB0 /* if_nameindex.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52840B11478C200058CCB0 /* if_nameindex.c */; }; + FC5284D511478C200058CCB0 /* if_nametoindex.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52840C11478C200058CCB0 /* if_nametoindex.c */; }; + FC5284D711478C200058CCB0 /* inet_ntop.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52841011478C200058CCB0 /* inet_ntop.c */; }; + FC5284D811478C200058CCB0 /* inet_pton.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52841111478C200058CCB0 /* inet_pton.c */; }; + FC5284D911478C200058CCB0 /* ip6opt.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52841211478C200058CCB0 /* ip6opt.c */; }; + FC5284DB11478C200058CCB0 /* map_v4v6.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52841411478C200058CCB0 /* map_v4v6.c */; }; + FC5284DC11478C200058CCB0 /* rthdr.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52841511478C200058CCB0 /* rthdr.c */; }; + FC5284DD11478C200058CCB0 /* vars.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52841611478C200058CCB0 /* vars.c */; }; + FC5284E011478C200058CCB0 /* cache_module.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52841B11478C200058CCB0 /* cache_module.c */; }; + FC5284E111478C200058CCB0 /* ds_module.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52841C11478C200058CCB0 /* ds_module.c */; }; + FC5284E211478C200058CCB0 /* file_module.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52841D11478C200058CCB0 /* file_module.c */; }; + FC5284E311478C200058CCB0 /* ils.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52842611478C200058CCB0 /* ils.c */; }; + FC5284E511478C200058CCB0 /* kvbuf.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52842911478C200058CCB0 /* kvbuf.c */; }; + FC5284E711478C200058CCB0 /* libinfo.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52842B11478C200058CCB0 /* libinfo.c */; }; + FC5284EA11478C200058CCB0 /* mdns_module.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52842E11478C200058CCB0 /* mdns_module.c */; }; + FC5284EE11478C200058CCB0 /* search_module.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52843211478C200058CCB0 /* search_module.c */; }; + FC5284EF11478C200058CCB0 /* si_data.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52843311478C200058CCB0 /* si_data.c */; }; + FC5284F111478C200058CCB0 /* si_getaddrinfo.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52843511478C200058CCB0 /* si_getaddrinfo.c */; }; + FC5284F211478C200058CCB0 /* si_module.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52843611478C200058CCB0 /* si_module.c */; }; + FC5284F411478C200058CCB0 /* thread_data.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52843811478C200058CCB0 /* thread_data.c */; }; + FC5284F711478C200058CCB0 /* membership.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52843E11478C200058CCB0 /* membership.c */; }; + FC5284FC11478C200058CCB0 /* ni_stub.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52844411478C200058CCB0 /* ni_stub.c */; }; + FC5284FD11478C200058CCB0 /* getdomainname.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52844611478C200058CCB0 /* getdomainname.c */; }; + FC5284FE11478C200058CCB0 /* getnetgrent.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52844711478C200058CCB0 /* getnetgrent.c */; }; + FC5284FF11478C200058CCB0 /* innetgr.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52844811478C200058CCB0 /* innetgr.c */; }; + FC52850111478C200058CCB0 /* setdomainname.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52844A11478C200058CCB0 /* setdomainname.c */; }; + FC52850211478C200058CCB0 /* xdr_domainname.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52844B11478C200058CCB0 /* xdr_domainname.c */; }; + FC52850311478C200058CCB0 /* xdr_keydat.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52844C11478C200058CCB0 /* xdr_keydat.c */; }; + FC52850411478C200058CCB0 /* xdr_mapname.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52844D11478C200058CCB0 /* xdr_mapname.c */; }; + FC52850511478C200058CCB0 /* xdr_peername.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52844E11478C200058CCB0 /* xdr_peername.c */; }; + FC52850611478C200058CCB0 /* xdr_valdat.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52844F11478C200058CCB0 /* xdr_valdat.c */; }; + FC52850711478C200058CCB0 /* xdr_ypbind_binding.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845011478C200058CCB0 /* xdr_ypbind_binding.c */; }; + FC52850811478C200058CCB0 /* xdr_ypbind_resp.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845111478C200058CCB0 /* xdr_ypbind_resp.c */; }; + FC52850911478C200058CCB0 /* xdr_ypbind_resptype.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845211478C200058CCB0 /* xdr_ypbind_resptype.c */; }; + FC52850A11478C200058CCB0 /* xdr_ypbind_setdom.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845311478C200058CCB0 /* xdr_ypbind_setdom.c */; }; + FC52850B11478C200058CCB0 /* xdr_ypmaplist.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845411478C200058CCB0 /* xdr_ypmaplist.c */; }; + FC52850C11478C200058CCB0 /* xdr_ypreq_key.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845511478C200058CCB0 /* xdr_ypreq_key.c */; }; + FC52850D11478C200058CCB0 /* xdr_ypreq_nokey.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845611478C200058CCB0 /* xdr_ypreq_nokey.c */; }; + FC52850E11478C200058CCB0 /* xdr_ypresp_all.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845711478C200058CCB0 /* xdr_ypresp_all.c */; }; + FC52850F11478C200058CCB0 /* xdr_ypresp_key_val.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845811478C200058CCB0 /* xdr_ypresp_key_val.c */; }; + FC52851011478C200058CCB0 /* xdr_ypresp_maplist.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845911478C200058CCB0 /* xdr_ypresp_maplist.c */; }; + FC52851111478C200058CCB0 /* xdr_ypresp_master.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845A11478C200058CCB0 /* xdr_ypresp_master.c */; }; + FC52851211478C200058CCB0 /* xdr_ypresp_order.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845B11478C200058CCB0 /* xdr_ypresp_order.c */; }; + FC52851311478C200058CCB0 /* xdr_ypresp_val.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845C11478C200058CCB0 /* xdr_ypresp_val.c */; }; + FC52851411478C200058CCB0 /* xdr_ypstat.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52845D11478C200058CCB0 /* xdr_ypstat.c */; }; + FC52851511478C200058CCB0 /* yp_all.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52846011478C200058CCB0 /* yp_all.c */; }; + FC52851611478C200058CCB0 /* yp_bind.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52846211478C200058CCB0 /* yp_bind.c */; }; + FC52851711478C200058CCB0 /* yp_first.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52846411478C200058CCB0 /* yp_first.c */; }; + FC52851811478C200058CCB0 /* yp_get_default_domain.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52846611478C200058CCB0 /* yp_get_default_domain.c */; }; + FC52851911478C200058CCB0 /* yp_maplist.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52846711478C200058CCB0 /* yp_maplist.c */; }; + FC52851A11478C200058CCB0 /* yp_master.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52846911478C200058CCB0 /* yp_master.c */; }; + FC52851B11478C200058CCB0 /* yp_order.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52846D11478C200058CCB0 /* yp_order.c */; }; + FC52851E11478C200058CCB0 /* yperr_string.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52847311478C200058CCB0 /* yperr_string.c */; }; + FC52852011478C200058CCB0 /* ypmatch_cache.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52847511478C200058CCB0 /* ypmatch_cache.c */; }; + FC52852111478C200058CCB0 /* yppasswdd_xdr.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52847611478C200058CCB0 /* yppasswdd_xdr.c */; }; + FC52852211478C200058CCB0 /* ypprot_err.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52847811478C200058CCB0 /* ypprot_err.c */; }; + FC52852411478C200058CCB0 /* auth_none.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52847B11478C200058CCB0 /* auth_none.c */; }; + FC52852511478C200058CCB0 /* auth_unix.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52847C11478C200058CCB0 /* auth_unix.c */; }; + FC52852711478C200058CCB0 /* authunix_prot.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52847E11478C200058CCB0 /* authunix_prot.c */; }; + FC52852811478C200058CCB0 /* bindresvport.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52848011478C200058CCB0 /* bindresvport.c */; }; + FC52852A11478C200058CCB0 /* clnt_generic.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52848211478C200058CCB0 /* clnt_generic.c */; }; + FC52852B11478C200058CCB0 /* clnt_perror.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52848311478C200058CCB0 /* clnt_perror.c */; }; + FC52852C11478C200058CCB0 /* clnt_raw.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52848411478C200058CCB0 /* clnt_raw.c */; }; + FC52852D11478C200058CCB0 /* clnt_simple.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52848511478C200058CCB0 /* clnt_simple.c */; }; + FC52852E11478C200058CCB0 /* clnt_tcp.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52848611478C200058CCB0 /* clnt_tcp.c */; }; + FC52852F11478C200058CCB0 /* clnt_udp.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52848711478C200058CCB0 /* clnt_udp.c */; }; + FC52853011478C200058CCB0 /* get_myaddress.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52848911478C200058CCB0 /* get_myaddress.c */; }; + FC52853111478C200058CCB0 /* getrpcent.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52848B11478C200058CCB0 /* getrpcent.c */; }; + FC52853211478C200058CCB0 /* getrpcport.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52848D11478C200058CCB0 /* getrpcport.c */; }; + FC52853511478C200058CCB0 /* pmap_clnt.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52849011478C200058CCB0 /* pmap_clnt.c */; }; + FC52853711478C200058CCB0 /* pmap_getmaps.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52849211478C200058CCB0 /* pmap_getmaps.c */; }; + FC52853811478C200058CCB0 /* pmap_getport.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52849311478C200058CCB0 /* pmap_getport.c */; }; + FC52853911478C200058CCB0 /* pmap_prot.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52849411478C200058CCB0 /* pmap_prot.c */; }; + FC52853B11478C200058CCB0 /* pmap_prot2.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52849611478C200058CCB0 /* pmap_prot2.c */; }; + FC52853C11478C200058CCB0 /* pmap_rmt.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52849711478C200058CCB0 /* pmap_rmt.c */; }; + FC52853E11478C200058CCB0 /* pmap_wakeup.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52849911478C200058CCB0 /* pmap_wakeup.c */; }; + FC52854111478C200058CCB0 /* rpc_callmsg.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52849E11478C200058CCB0 /* rpc_callmsg.c */; }; + FC52854211478C200058CCB0 /* rpc_commondata.c in Sources */ = {isa = PBXBuildFile; fileRef = FC52849F11478C200058CCB0 /* rpc_commondata.c */; }; + FC52854311478C200058CCB0 /* rpc_dtablesize.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284A011478C200058CCB0 /* rpc_dtablesize.c */; }; + FC52854511478C200058CCB0 /* rpc_prot.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284A211478C200058CCB0 /* rpc_prot.c */; }; + FC52854611478C200058CCB0 /* svc.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284A311478C200058CCB0 /* svc.c */; }; + FC52854811478C200058CCB0 /* svc_auth.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284A511478C200058CCB0 /* svc_auth.c */; }; + FC52854A11478C200058CCB0 /* svc_auth_unix.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284A711478C200058CCB0 /* svc_auth_unix.c */; }; + FC52854B11478C200058CCB0 /* svc_raw.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284A811478C200058CCB0 /* svc_raw.c */; }; + FC52854C11478C200058CCB0 /* svc_run.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284A911478C200058CCB0 /* svc_run.c */; }; + FC52854D11478C200058CCB0 /* svc_simple.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284AA11478C200058CCB0 /* svc_simple.c */; }; + FC52854E11478C200058CCB0 /* svc_tcp.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284AB11478C200058CCB0 /* svc_tcp.c */; }; + FC52854F11478C200058CCB0 /* svc_udp.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284AC11478C200058CCB0 /* svc_udp.c */; }; + FC52855111478C200058CCB0 /* xdr.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284AF11478C200058CCB0 /* xdr.c */; }; + FC52855311478C200058CCB0 /* xdr_array.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284B111478C200058CCB0 /* xdr_array.c */; }; + FC52855411478C200058CCB0 /* xdr_float.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284B211478C200058CCB0 /* xdr_float.c */; }; + FC52855511478C200058CCB0 /* xdr_mem.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284B311478C200058CCB0 /* xdr_mem.c */; }; + FC52855611478C200058CCB0 /* xdr_rec.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284B411478C200058CCB0 /* xdr_rec.c */; }; + FC52855711478C200058CCB0 /* xdr_reference.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284B511478C200058CCB0 /* xdr_reference.c */; }; + FC52855811478C200058CCB0 /* xdr_sizeof.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284B611478C200058CCB0 /* xdr_sizeof.c */; }; + FC52855911478C200058CCB0 /* xdr_stdio.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284B711478C200058CCB0 /* xdr_stdio.c */; }; + FC52855A11478C200058CCB0 /* hton.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284BA11478C200058CCB0 /* hton.c */; }; + FC52855C11478C200058CCB0 /* putpwpasswd.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284BC11478C200058CCB0 /* putpwpasswd.c */; }; + FC52855D11478C200058CCB0 /* rcmd.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284BE11478C200058CCB0 /* rcmd.c */; }; + FC52855E11478C200058CCB0 /* rcmdsh.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5284BF11478C200058CCB0 /* rcmdsh.c */; }; + FC5285D4114791B50058CCB0 /* DSlibinfoMIG.defs in Sources */ = {isa = PBXBuildFile; fileRef = FC5285D1114791B50058CCB0 /* DSlibinfoMIG.defs */; }; + FC5285D5114791B50058CCB0 /* DSlibinfoMIGAsyncReply.defs in Sources */ = {isa = PBXBuildFile; fileRef = FC5285D2114791B50058CCB0 /* DSlibinfoMIGAsyncReply.defs */; settings = {ATTRIBUTES = (Server, ); }; }; + FC5285D6114791B50058CCB0 /* DSmemberdMIG.defs in Sources */ = {isa = PBXBuildFile; fileRef = FC5285D3114791B50058CCB0 /* DSmemberdMIG.defs */; }; + FC5285F7114793400058CCB0 /* ether_addr.c in Sources */ = {isa = PBXBuildFile; fileRef = FC5285F6114793400058CCB0 /* ether_addr.c */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 2D31A0FA128074E700D5A84C /* getifmaddrs.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = getifmaddrs.3; sourceTree = ""; }; + 2D31A0FB128074E700D5A84C /* getifmaddrs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = getifmaddrs.c; sourceTree = ""; }; + 2D4070B0129354A700FE81ED /* getnameinfo_link.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = getnameinfo_link.c; sourceTree = ""; }; + 2D4D4AB1122C5B83009791E5 /* inet6_rth_space.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = inet6_rth_space.3; sourceTree = ""; }; + 2DBB147712DBD63300D710E3 /* inet6_opt_init.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = inet6_opt_init.3; sourceTree = ""; }; + 3FCF61621257C272008D8BB1 /* libsystem_sim_info.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libsystem_sim_info.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; + D2AAC0630554660B00DB518D /* libsystem_info.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libsystem_info.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; + FC5283EE11478C200058CCB0 /* herror.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = herror.c; sourceTree = ""; }; + FC5283EF11478C200058CCB0 /* inet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = inet.h; sourceTree = ""; }; + FC5283F311478C200058CCB0 /* nameser8_compat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nameser8_compat.h; sourceTree = ""; }; + FC5283F511478C200058CCB0 /* options.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = options.h; sourceTree = ""; }; + FC5283F611478C200058CCB0 /* portability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = portability.h; sourceTree = ""; }; + FC5283F711478C200058CCB0 /* res_comp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = res_comp.c; sourceTree = ""; }; + FC5283F811478C200058CCB0 /* res_data.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = res_data.c; sourceTree = ""; }; + FC5283F911478C200058CCB0 /* res_debug.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = res_debug.c; sourceTree = ""; }; + FC5283FA11478C200058CCB0 /* res_init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = res_init.c; sourceTree = ""; }; + FC5283FB11478C200058CCB0 /* res_mkquery.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = res_mkquery.c; sourceTree = ""; }; + FC5283FC11478C200058CCB0 /* res_query.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = res_query.c; sourceTree = ""; }; + FC5283FE11478C200058CCB0 /* res_send.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = res_send.c; sourceTree = ""; }; + FC5283FF11478C200058CCB0 /* resolv8_compat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resolv8_compat.h; sourceTree = ""; }; + FC52840211478C200058CCB0 /* gethostbyname.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = gethostbyname.3; sourceTree = ""; }; + FC52840311478C200058CCB0 /* getifaddrs.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = getifaddrs.3; sourceTree = ""; }; + FC52840411478C200058CCB0 /* getifaddrs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = getifaddrs.c; sourceTree = ""; }; + FC52840511478C200058CCB0 /* getipnodebyname.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = getipnodebyname.3; sourceTree = ""; }; + FC52840611478C200058CCB0 /* getnetent.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = getnetent.3; sourceTree = ""; }; + FC52840711478C200058CCB0 /* getprotoent.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = getprotoent.3; sourceTree = ""; }; + FC52840811478C200058CCB0 /* getservent.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = getservent.3; sourceTree = ""; }; + FC52840911478C200058CCB0 /* if_indextoname.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = if_indextoname.3; sourceTree = ""; }; + FC52840A11478C200058CCB0 /* if_indextoname.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = if_indextoname.c; sourceTree = ""; }; + FC52840B11478C200058CCB0 /* if_nameindex.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = if_nameindex.c; sourceTree = ""; }; + FC52840C11478C200058CCB0 /* if_nametoindex.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = if_nametoindex.c; sourceTree = ""; }; + FC52840D11478C200058CCB0 /* ifaddrs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ifaddrs.h; sourceTree = ""; }; + FC52840E11478C200058CCB0 /* inet6_option_space.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = inet6_option_space.3; sourceTree = ""; }; + FC52840F11478C200058CCB0 /* inet6_rthdr_space.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = inet6_rthdr_space.3; sourceTree = ""; }; + FC52841011478C200058CCB0 /* inet_ntop.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = inet_ntop.c; sourceTree = ""; }; + FC52841111478C200058CCB0 /* inet_pton.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = inet_pton.c; sourceTree = ""; }; + FC52841211478C200058CCB0 /* ip6opt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ip6opt.c; sourceTree = ""; }; + FC52841411478C200058CCB0 /* map_v4v6.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = map_v4v6.c; sourceTree = ""; }; + FC52841511478C200058CCB0 /* rthdr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rthdr.c; sourceTree = ""; }; + FC52841611478C200058CCB0 /* vars.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = vars.c; sourceTree = ""; }; + FC52841811478C200058CCB0 /* aliasdb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aliasdb.h; sourceTree = ""; }; + FC52841911478C200058CCB0 /* bootparams.5 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = bootparams.5; sourceTree = ""; }; + FC52841A11478C200058CCB0 /* bootparams.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bootparams.h; sourceTree = ""; }; + FC52841B11478C200058CCB0 /* cache_module.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = cache_module.c; sourceTree = ""; }; + FC52841C11478C200058CCB0 /* ds_module.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ds_module.c; sourceTree = ""; }; + FC52841D11478C200058CCB0 /* file_module.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = file_module.c; sourceTree = ""; }; + FC52841E11478C200058CCB0 /* gai_strerror.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = gai_strerror.3; sourceTree = ""; }; + FC52841F11478C200058CCB0 /* getaddrinfo.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = getaddrinfo.3; sourceTree = ""; }; + FC52842011478C200058CCB0 /* getfsent.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = getfsent.3; sourceTree = ""; }; + FC52842111478C200058CCB0 /* getgrent.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = getgrent.3; sourceTree = ""; }; + FC52842211478C200058CCB0 /* getgrouplist.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = getgrouplist.3; sourceTree = ""; }; + FC52842311478C200058CCB0 /* getnameinfo.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = getnameinfo.3; sourceTree = ""; }; + FC52842411478C200058CCB0 /* getnetgrent.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = getnetgrent.3; sourceTree = ""; }; + FC52842511478C200058CCB0 /* getpwent.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = getpwent.3; sourceTree = ""; }; + FC52842611478C200058CCB0 /* ils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ils.c; sourceTree = ""; }; + FC52842711478C200058CCB0 /* ils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ils.h; sourceTree = ""; }; + FC52842811478C200058CCB0 /* initgroups.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = initgroups.3; sourceTree = ""; }; + FC52842911478C200058CCB0 /* kvbuf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = kvbuf.c; sourceTree = ""; }; + FC52842A11478C200058CCB0 /* kvbuf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kvbuf.h; sourceTree = ""; }; + FC52842B11478C200058CCB0 /* libinfo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = libinfo.c; sourceTree = ""; }; + FC52842C11478C200058CCB0 /* libinfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = libinfo.h; sourceTree = ""; }; + FC52842E11478C200058CCB0 /* mdns_module.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mdns_module.c; sourceTree = ""; }; + FC52842F11478C200058CCB0 /* netdb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = netdb.h; sourceTree = ""; }; + FC52843011478C200058CCB0 /* netdb_async.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = netdb_async.h; sourceTree = ""; }; + FC52843111478C200058CCB0 /* printerdb.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = printerdb.h; sourceTree = ""; }; + FC52843211478C200058CCB0 /* search_module.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = search_module.c; sourceTree = ""; }; + FC52843311478C200058CCB0 /* si_data.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = si_data.c; sourceTree = ""; }; + FC52843411478C200058CCB0 /* si_data.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = si_data.h; sourceTree = ""; }; + FC52843511478C200058CCB0 /* si_getaddrinfo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = si_getaddrinfo.c; sourceTree = ""; }; + FC52843611478C200058CCB0 /* si_module.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = si_module.c; sourceTree = ""; }; + FC52843711478C200058CCB0 /* si_module.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = si_module.h; sourceTree = ""; }; + FC52843811478C200058CCB0 /* thread_data.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = thread_data.c; sourceTree = ""; }; + FC52843911478C200058CCB0 /* thread_data.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = thread_data.h; sourceTree = ""; }; + FC52843C11478C200058CCB0 /* mbr_check_membership.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = mbr_check_membership.3; sourceTree = ""; }; + FC52843D11478C200058CCB0 /* mbr_uid_to_uuid.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = mbr_uid_to_uuid.3; sourceTree = ""; }; + FC52843E11478C200058CCB0 /* membership.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = membership.c; sourceTree = ""; }; + FC52843F11478C200058CCB0 /* membership.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = membership.h; sourceTree = ""; }; + FC52844011478C200058CCB0 /* membershipPriv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = membershipPriv.h; sourceTree = ""; }; + FC52844111478C200058CCB0 /* ntsid.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ntsid.h; sourceTree = ""; }; + FC52844411478C200058CCB0 /* ni_stub.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ni_stub.c; sourceTree = ""; }; + FC52844611478C200058CCB0 /* getdomainname.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = getdomainname.c; sourceTree = ""; }; + FC52844711478C200058CCB0 /* getnetgrent.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = getnetgrent.c; sourceTree = ""; }; + FC52844811478C200058CCB0 /* innetgr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = innetgr.c; sourceTree = ""; }; + FC52844A11478C200058CCB0 /* setdomainname.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = setdomainname.c; sourceTree = ""; }; + FC52844B11478C200058CCB0 /* xdr_domainname.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_domainname.c; sourceTree = ""; }; + FC52844C11478C200058CCB0 /* xdr_keydat.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_keydat.c; sourceTree = ""; }; + FC52844D11478C200058CCB0 /* xdr_mapname.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_mapname.c; sourceTree = ""; }; + FC52844E11478C200058CCB0 /* xdr_peername.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_peername.c; sourceTree = ""; }; + FC52844F11478C200058CCB0 /* xdr_valdat.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_valdat.c; sourceTree = ""; }; + FC52845011478C200058CCB0 /* xdr_ypbind_binding.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_ypbind_binding.c; sourceTree = ""; }; + FC52845111478C200058CCB0 /* xdr_ypbind_resp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_ypbind_resp.c; sourceTree = ""; }; + FC52845211478C200058CCB0 /* xdr_ypbind_resptype.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_ypbind_resptype.c; sourceTree = ""; }; + FC52845311478C200058CCB0 /* xdr_ypbind_setdom.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_ypbind_setdom.c; sourceTree = ""; }; + FC52845411478C200058CCB0 /* xdr_ypmaplist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_ypmaplist.c; sourceTree = ""; }; + FC52845511478C200058CCB0 /* xdr_ypreq_key.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_ypreq_key.c; sourceTree = ""; }; + FC52845611478C200058CCB0 /* xdr_ypreq_nokey.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_ypreq_nokey.c; sourceTree = ""; }; + FC52845711478C200058CCB0 /* xdr_ypresp_all.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_ypresp_all.c; sourceTree = ""; }; + FC52845811478C200058CCB0 /* xdr_ypresp_key_val.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_ypresp_key_val.c; sourceTree = ""; }; + FC52845911478C200058CCB0 /* xdr_ypresp_maplist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_ypresp_maplist.c; sourceTree = ""; }; + FC52845A11478C200058CCB0 /* xdr_ypresp_master.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_ypresp_master.c; sourceTree = ""; }; + FC52845B11478C200058CCB0 /* xdr_ypresp_order.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_ypresp_order.c; sourceTree = ""; }; + FC52845C11478C200058CCB0 /* xdr_ypresp_val.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_ypresp_val.c; sourceTree = ""; }; + FC52845D11478C200058CCB0 /* xdr_ypstat.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_ypstat.c; sourceTree = ""; }; + FC52845E11478C200058CCB0 /* yp.8 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = yp.8; sourceTree = ""; }; + FC52845F11478C200058CCB0 /* yp_all.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = yp_all.3; sourceTree = ""; }; + FC52846011478C200058CCB0 /* yp_all.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = yp_all.c; sourceTree = ""; }; + FC52846111478C200058CCB0 /* yp_bind.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = yp_bind.3; sourceTree = ""; }; + FC52846211478C200058CCB0 /* yp_bind.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = yp_bind.c; sourceTree = ""; }; + FC52846311478C200058CCB0 /* yp_first.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = yp_first.3; sourceTree = ""; }; + FC52846411478C200058CCB0 /* yp_first.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = yp_first.c; sourceTree = ""; }; + FC52846511478C200058CCB0 /* yp_get_default_domain.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = yp_get_default_domain.3; sourceTree = ""; }; + FC52846611478C200058CCB0 /* yp_get_default_domain.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = yp_get_default_domain.c; sourceTree = ""; }; + FC52846711478C200058CCB0 /* yp_maplist.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = yp_maplist.c; sourceTree = ""; }; + FC52846811478C200058CCB0 /* yp_master.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = yp_master.3; sourceTree = ""; }; + FC52846911478C200058CCB0 /* yp_master.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = yp_master.c; sourceTree = ""; }; + FC52846A11478C200058CCB0 /* yp_match.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = yp_match.3; sourceTree = ""; }; + FC52846B11478C200058CCB0 /* yp_next.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = yp_next.3; sourceTree = ""; }; + FC52846C11478C200058CCB0 /* yp_order.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = yp_order.3; sourceTree = ""; }; + FC52846D11478C200058CCB0 /* yp_order.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = yp_order.c; sourceTree = ""; }; + FC52846E11478C200058CCB0 /* yp_prot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = yp_prot.h; sourceTree = ""; }; + FC52846F11478C200058CCB0 /* yp_unbind.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = yp_unbind.3; sourceTree = ""; }; + FC52847011478C200058CCB0 /* ypclnt.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ypclnt.3; sourceTree = ""; }; + FC52847111478C200058CCB0 /* ypclnt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ypclnt.h; sourceTree = ""; }; + FC52847211478C200058CCB0 /* yperr_string.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = yperr_string.3; sourceTree = ""; }; + FC52847311478C200058CCB0 /* yperr_string.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = yperr_string.c; sourceTree = ""; }; + FC52847411478C200058CCB0 /* ypinternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ypinternal.h; sourceTree = ""; }; + FC52847511478C200058CCB0 /* ypmatch_cache.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ypmatch_cache.c; sourceTree = ""; }; + FC52847611478C200058CCB0 /* yppasswdd_xdr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = yppasswdd_xdr.c; sourceTree = ""; }; + FC52847711478C200058CCB0 /* ypprot_err.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ypprot_err.3; sourceTree = ""; }; + FC52847811478C200058CCB0 /* ypprot_err.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ypprot_err.c; sourceTree = ""; }; + FC52847A11478C200058CCB0 /* auth.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = auth.h; sourceTree = ""; }; + FC52847B11478C200058CCB0 /* auth_none.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = auth_none.c; sourceTree = ""; }; + FC52847C11478C200058CCB0 /* auth_unix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = auth_unix.c; sourceTree = ""; }; + FC52847D11478C200058CCB0 /* auth_unix.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = auth_unix.h; sourceTree = ""; }; + FC52847E11478C200058CCB0 /* authunix_prot.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = authunix_prot.c; sourceTree = ""; }; + FC52847F11478C200058CCB0 /* bindresvport.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = bindresvport.3; sourceTree = ""; }; + FC52848011478C200058CCB0 /* bindresvport.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = bindresvport.c; sourceTree = ""; }; + FC52848111478C200058CCB0 /* clnt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = clnt.h; sourceTree = ""; }; + FC52848211478C200058CCB0 /* clnt_generic.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = clnt_generic.c; sourceTree = ""; }; + FC52848311478C200058CCB0 /* clnt_perror.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = clnt_perror.c; sourceTree = ""; }; + FC52848411478C200058CCB0 /* clnt_raw.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = clnt_raw.c; sourceTree = ""; }; + FC52848511478C200058CCB0 /* clnt_simple.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = clnt_simple.c; sourceTree = ""; }; + FC52848611478C200058CCB0 /* clnt_tcp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = clnt_tcp.c; sourceTree = ""; }; + FC52848711478C200058CCB0 /* clnt_udp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = clnt_udp.c; sourceTree = ""; }; + FC52848811478C200058CCB0 /* DISCLAIMER */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = DISCLAIMER; sourceTree = ""; }; + FC52848911478C200058CCB0 /* get_myaddress.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = get_myaddress.c; sourceTree = ""; }; + FC52848A11478C200058CCB0 /* getrpcent.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = getrpcent.3; sourceTree = ""; }; + FC52848B11478C200058CCB0 /* getrpcent.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = getrpcent.c; sourceTree = ""; }; + FC52848C11478C200058CCB0 /* getrpcport.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = getrpcport.3; sourceTree = ""; }; + FC52848D11478C200058CCB0 /* getrpcport.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = getrpcport.c; sourceTree = ""; }; + FC52849011478C200058CCB0 /* pmap_clnt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pmap_clnt.c; sourceTree = ""; }; + FC52849111478C200058CCB0 /* pmap_clnt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pmap_clnt.h; sourceTree = ""; }; + FC52849211478C200058CCB0 /* pmap_getmaps.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pmap_getmaps.c; sourceTree = ""; }; + FC52849311478C200058CCB0 /* pmap_getport.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pmap_getport.c; sourceTree = ""; }; + FC52849411478C200058CCB0 /* pmap_prot.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pmap_prot.c; sourceTree = ""; }; + FC52849511478C200058CCB0 /* pmap_prot.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pmap_prot.h; sourceTree = ""; }; + FC52849611478C200058CCB0 /* pmap_prot2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pmap_prot2.c; sourceTree = ""; }; + FC52849711478C200058CCB0 /* pmap_rmt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pmap_rmt.c; sourceTree = ""; }; + FC52849811478C200058CCB0 /* pmap_rmt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pmap_rmt.h; sourceTree = ""; }; + FC52849911478C200058CCB0 /* pmap_wakeup.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = pmap_wakeup.c; sourceTree = ""; }; + FC52849A11478C200058CCB0 /* pmap_wakeup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pmap_wakeup.h; sourceTree = ""; }; + FC52849B11478C200058CCB0 /* README */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = README; sourceTree = ""; }; + FC52849C11478C200058CCB0 /* rpc.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = rpc.3; sourceTree = ""; }; + FC52849D11478C200058CCB0 /* rpc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rpc.h; sourceTree = ""; }; + FC52849E11478C200058CCB0 /* rpc_callmsg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rpc_callmsg.c; sourceTree = ""; }; + FC52849F11478C200058CCB0 /* rpc_commondata.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rpc_commondata.c; sourceTree = ""; }; + FC5284A011478C200058CCB0 /* rpc_dtablesize.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rpc_dtablesize.c; sourceTree = ""; }; + FC5284A111478C200058CCB0 /* rpc_msg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rpc_msg.h; sourceTree = ""; }; + FC5284A211478C200058CCB0 /* rpc_prot.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rpc_prot.c; sourceTree = ""; }; + FC5284A311478C200058CCB0 /* svc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = svc.c; sourceTree = ""; }; + FC5284A411478C200058CCB0 /* svc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = svc.h; sourceTree = ""; }; + FC5284A511478C200058CCB0 /* svc_auth.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = svc_auth.c; sourceTree = ""; }; + FC5284A611478C200058CCB0 /* svc_auth.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = svc_auth.h; sourceTree = ""; }; + FC5284A711478C200058CCB0 /* svc_auth_unix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = svc_auth_unix.c; sourceTree = ""; }; + FC5284A811478C200058CCB0 /* svc_raw.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = svc_raw.c; sourceTree = ""; }; + FC5284A911478C200058CCB0 /* svc_run.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = svc_run.c; sourceTree = ""; }; + FC5284AA11478C200058CCB0 /* svc_simple.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = svc_simple.c; sourceTree = ""; }; + FC5284AB11478C200058CCB0 /* svc_tcp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = svc_tcp.c; sourceTree = ""; }; + FC5284AC11478C200058CCB0 /* svc_udp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = svc_udp.c; sourceTree = ""; }; + FC5284AD11478C200058CCB0 /* types.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = types.h; sourceTree = ""; }; + FC5284AE11478C200058CCB0 /* xdr.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = xdr.3; sourceTree = ""; }; + FC5284AF11478C200058CCB0 /* xdr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr.c; sourceTree = ""; }; + FC5284B011478C200058CCB0 /* xdr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = xdr.h; sourceTree = ""; }; + FC5284B111478C200058CCB0 /* xdr_array.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_array.c; sourceTree = ""; }; + FC5284B211478C200058CCB0 /* xdr_float.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_float.c; sourceTree = ""; }; + FC5284B311478C200058CCB0 /* xdr_mem.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_mem.c; sourceTree = ""; }; + FC5284B411478C200058CCB0 /* xdr_rec.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_rec.c; sourceTree = ""; }; + FC5284B511478C200058CCB0 /* xdr_reference.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_reference.c; sourceTree = ""; }; + FC5284B611478C200058CCB0 /* xdr_sizeof.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_sizeof.c; sourceTree = ""; }; + FC5284B711478C200058CCB0 /* xdr_stdio.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = xdr_stdio.c; sourceTree = ""; }; + FC5284B911478C200058CCB0 /* hosts.equiv.5 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = hosts.equiv.5; sourceTree = ""; }; + FC5284BA11478C200058CCB0 /* hton.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = hton.c; sourceTree = ""; }; + FC5284BC11478C200058CCB0 /* putpwpasswd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = putpwpasswd.c; sourceTree = ""; }; + FC5284BD11478C200058CCB0 /* rcmd.3 */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = rcmd.3; sourceTree = ""; }; + FC5284BE11478C200058CCB0 /* rcmd.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rcmd.c; sourceTree = ""; }; + FC5284BF11478C200058CCB0 /* rcmdsh.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = rcmdsh.c; sourceTree = ""; }; + FC5285D1114791B50058CCB0 /* DSlibinfoMIG.defs */ = {isa = PBXFileReference; explicitFileType = sourcecode.mig; fileEncoding = 4; name = DSlibinfoMIG.defs; path = usr/local/include/opendirectory/DSlibinfoMIG.defs; sourceTree = SDKROOT; }; + FC5285D2114791B50058CCB0 /* DSlibinfoMIGAsyncReply.defs */ = {isa = PBXFileReference; explicitFileType = sourcecode.mig; fileEncoding = 4; name = DSlibinfoMIGAsyncReply.defs; path = usr/local/include/opendirectory/DSlibinfoMIGAsyncReply.defs; sourceTree = SDKROOT; }; + FC5285D3114791B50058CCB0 /* DSmemberdMIG.defs */ = {isa = PBXFileReference; explicitFileType = sourcecode.mig; fileEncoding = 4; name = DSmemberdMIG.defs; path = usr/local/include/opendirectory/DSmemberdMIG.defs; sourceTree = SDKROOT; }; + FC5285F6114793400058CCB0 /* ether_addr.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ether_addr.c; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 3FCF615E1257C272008D8BB1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D289988505E68E00004EDB86 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 08FB7794FE84155DC02AAC07 /* Libinfo */ = { + isa = PBXGroup; + children = ( + FC5283ED11478C200058CCB0 /* dns.subproj */, + FC52840011478C200058CCB0 /* gen.subproj */, + FC52841711478C200058CCB0 /* lookup.subproj */, + FC52843A11478C200058CCB0 /* membership.subproj */, + FC52844211478C200058CCB0 /* netinfo.subproj */, + FC52844511478C200058CCB0 /* nis.subproj */, + FC52847911478C200058CCB0 /* rpc.subproj */, + FC5284B811478C200058CCB0 /* util.subproj */, + 1AB674ADFE9D54B511CA2CBB /* Products */, + ); + name = Libinfo; + sourceTree = ""; + }; + 1AB674ADFE9D54B511CA2CBB /* Products */ = { + isa = PBXGroup; + children = ( + D2AAC0630554660B00DB518D /* libsystem_info.dylib */, + 3FCF61621257C272008D8BB1 /* libsystem_sim_info.dylib */, + ); + name = Products; + sourceTree = ""; + }; + FC5283ED11478C200058CCB0 /* dns.subproj */ = { + isa = PBXGroup; + children = ( + FC5283EE11478C200058CCB0 /* herror.c */, + FC5283EF11478C200058CCB0 /* inet.h */, + FC5283F311478C200058CCB0 /* nameser8_compat.h */, + FC5283F511478C200058CCB0 /* options.h */, + FC5283F611478C200058CCB0 /* portability.h */, + FC5283F711478C200058CCB0 /* res_comp.c */, + FC5283F811478C200058CCB0 /* res_data.c */, + FC5283F911478C200058CCB0 /* res_debug.c */, + FC5283FA11478C200058CCB0 /* res_init.c */, + FC5283FB11478C200058CCB0 /* res_mkquery.c */, + FC5283FC11478C200058CCB0 /* res_query.c */, + FC5283FE11478C200058CCB0 /* res_send.c */, + FC5283FF11478C200058CCB0 /* resolv8_compat.h */, + ); + path = dns.subproj; + sourceTree = ""; + }; + FC52840011478C200058CCB0 /* gen.subproj */ = { + isa = PBXGroup; + children = ( + 2DBB147712DBD63300D710E3 /* inet6_opt_init.3 */, + 2D31A0FA128074E700D5A84C /* getifmaddrs.3 */, + 2D31A0FB128074E700D5A84C /* getifmaddrs.c */, + FC5285F6114793400058CCB0 /* ether_addr.c */, + FC52840211478C200058CCB0 /* gethostbyname.3 */, + FC52840311478C200058CCB0 /* getifaddrs.3 */, + FC52840411478C200058CCB0 /* getifaddrs.c */, + FC52840511478C200058CCB0 /* getipnodebyname.3 */, + FC52840611478C200058CCB0 /* getnetent.3 */, + FC52840711478C200058CCB0 /* getprotoent.3 */, + FC52840811478C200058CCB0 /* getservent.3 */, + FC52840911478C200058CCB0 /* if_indextoname.3 */, + FC52840A11478C200058CCB0 /* if_indextoname.c */, + FC52840B11478C200058CCB0 /* if_nameindex.c */, + FC52840C11478C200058CCB0 /* if_nametoindex.c */, + FC52840D11478C200058CCB0 /* ifaddrs.h */, + FC52840E11478C200058CCB0 /* inet6_option_space.3 */, + FC52840F11478C200058CCB0 /* inet6_rthdr_space.3 */, + 2D4D4AB1122C5B83009791E5 /* inet6_rth_space.3 */, + FC52841011478C200058CCB0 /* inet_ntop.c */, + FC52841111478C200058CCB0 /* inet_pton.c */, + FC52841211478C200058CCB0 /* ip6opt.c */, + FC52841411478C200058CCB0 /* map_v4v6.c */, + FC52841511478C200058CCB0 /* rthdr.c */, + FC52841611478C200058CCB0 /* vars.c */, + ); + path = gen.subproj; + sourceTree = ""; + }; + FC52841711478C200058CCB0 /* lookup.subproj */ = { + isa = PBXGroup; + children = ( + 2D4070B0129354A700FE81ED /* getnameinfo_link.c */, + FC5285D1114791B50058CCB0 /* DSlibinfoMIG.defs */, + FC5285D2114791B50058CCB0 /* DSlibinfoMIGAsyncReply.defs */, + FC52841811478C200058CCB0 /* aliasdb.h */, + FC52841911478C200058CCB0 /* bootparams.5 */, + FC52841A11478C200058CCB0 /* bootparams.h */, + FC52841B11478C200058CCB0 /* cache_module.c */, + FC52841C11478C200058CCB0 /* ds_module.c */, + FC52841D11478C200058CCB0 /* file_module.c */, + FC52841E11478C200058CCB0 /* gai_strerror.3 */, + FC52841F11478C200058CCB0 /* getaddrinfo.3 */, + FC52842011478C200058CCB0 /* getfsent.3 */, + FC52842111478C200058CCB0 /* getgrent.3 */, + FC52842211478C200058CCB0 /* getgrouplist.3 */, + FC52842311478C200058CCB0 /* getnameinfo.3 */, + FC52842411478C200058CCB0 /* getnetgrent.3 */, + FC52842511478C200058CCB0 /* getpwent.3 */, + FC52842611478C200058CCB0 /* ils.c */, + FC52842711478C200058CCB0 /* ils.h */, + FC52842811478C200058CCB0 /* initgroups.3 */, + FC52842911478C200058CCB0 /* kvbuf.c */, + FC52842A11478C200058CCB0 /* kvbuf.h */, + FC52842B11478C200058CCB0 /* libinfo.c */, + FC52842C11478C200058CCB0 /* libinfo.h */, + FC52842E11478C200058CCB0 /* mdns_module.c */, + FC52842F11478C200058CCB0 /* netdb.h */, + FC52843011478C200058CCB0 /* netdb_async.h */, + FC52843111478C200058CCB0 /* printerdb.h */, + FC52843211478C200058CCB0 /* search_module.c */, + FC52843311478C200058CCB0 /* si_data.c */, + FC52843411478C200058CCB0 /* si_data.h */, + FC52843511478C200058CCB0 /* si_getaddrinfo.c */, + FC52843611478C200058CCB0 /* si_module.c */, + FC52843711478C200058CCB0 /* si_module.h */, + FC52843811478C200058CCB0 /* thread_data.c */, + FC52843911478C200058CCB0 /* thread_data.h */, + ); + path = lookup.subproj; + sourceTree = ""; + }; + FC52843A11478C200058CCB0 /* membership.subproj */ = { + isa = PBXGroup; + children = ( + FC5285D3114791B50058CCB0 /* DSmemberdMIG.defs */, + FC52843C11478C200058CCB0 /* mbr_check_membership.3 */, + FC52843D11478C200058CCB0 /* mbr_uid_to_uuid.3 */, + FC52843E11478C200058CCB0 /* membership.c */, + FC52843F11478C200058CCB0 /* membership.h */, + FC52844011478C200058CCB0 /* membershipPriv.h */, + FC52844111478C200058CCB0 /* ntsid.h */, + ); + path = membership.subproj; + sourceTree = ""; + }; + FC52844211478C200058CCB0 /* netinfo.subproj */ = { + isa = PBXGroup; + children = ( + FC52844411478C200058CCB0 /* ni_stub.c */, + ); + path = netinfo.subproj; + sourceTree = ""; + }; + FC52844511478C200058CCB0 /* nis.subproj */ = { + isa = PBXGroup; + children = ( + FC52844611478C200058CCB0 /* getdomainname.c */, + FC52844711478C200058CCB0 /* getnetgrent.c */, + FC52844811478C200058CCB0 /* innetgr.c */, + FC52844A11478C200058CCB0 /* setdomainname.c */, + FC52844B11478C200058CCB0 /* xdr_domainname.c */, + FC52844C11478C200058CCB0 /* xdr_keydat.c */, + FC52844D11478C200058CCB0 /* xdr_mapname.c */, + FC52844E11478C200058CCB0 /* xdr_peername.c */, + FC52844F11478C200058CCB0 /* xdr_valdat.c */, + FC52845011478C200058CCB0 /* xdr_ypbind_binding.c */, + FC52845111478C200058CCB0 /* xdr_ypbind_resp.c */, + FC52845211478C200058CCB0 /* xdr_ypbind_resptype.c */, + FC52845311478C200058CCB0 /* xdr_ypbind_setdom.c */, + FC52845411478C200058CCB0 /* xdr_ypmaplist.c */, + FC52845511478C200058CCB0 /* xdr_ypreq_key.c */, + FC52845611478C200058CCB0 /* xdr_ypreq_nokey.c */, + FC52845711478C200058CCB0 /* xdr_ypresp_all.c */, + FC52845811478C200058CCB0 /* xdr_ypresp_key_val.c */, + FC52845911478C200058CCB0 /* xdr_ypresp_maplist.c */, + FC52845A11478C200058CCB0 /* xdr_ypresp_master.c */, + FC52845B11478C200058CCB0 /* xdr_ypresp_order.c */, + FC52845C11478C200058CCB0 /* xdr_ypresp_val.c */, + FC52845D11478C200058CCB0 /* xdr_ypstat.c */, + FC52845E11478C200058CCB0 /* yp.8 */, + FC52845F11478C200058CCB0 /* yp_all.3 */, + FC52846011478C200058CCB0 /* yp_all.c */, + FC52846111478C200058CCB0 /* yp_bind.3 */, + FC52846211478C200058CCB0 /* yp_bind.c */, + FC52846311478C200058CCB0 /* yp_first.3 */, + FC52846411478C200058CCB0 /* yp_first.c */, + FC52846511478C200058CCB0 /* yp_get_default_domain.3 */, + FC52846611478C200058CCB0 /* yp_get_default_domain.c */, + FC52846711478C200058CCB0 /* yp_maplist.c */, + FC52846811478C200058CCB0 /* yp_master.3 */, + FC52846911478C200058CCB0 /* yp_master.c */, + FC52846A11478C200058CCB0 /* yp_match.3 */, + FC52846B11478C200058CCB0 /* yp_next.3 */, + FC52846C11478C200058CCB0 /* yp_order.3 */, + FC52846D11478C200058CCB0 /* yp_order.c */, + FC52846E11478C200058CCB0 /* yp_prot.h */, + FC52846F11478C200058CCB0 /* yp_unbind.3 */, + FC52847011478C200058CCB0 /* ypclnt.3 */, + FC52847111478C200058CCB0 /* ypclnt.h */, + FC52847211478C200058CCB0 /* yperr_string.3 */, + FC52847311478C200058CCB0 /* yperr_string.c */, + FC52847411478C200058CCB0 /* ypinternal.h */, + FC52847511478C200058CCB0 /* ypmatch_cache.c */, + FC52847611478C200058CCB0 /* yppasswdd_xdr.c */, + FC52847711478C200058CCB0 /* ypprot_err.3 */, + FC52847811478C200058CCB0 /* ypprot_err.c */, + ); + path = nis.subproj; + sourceTree = ""; + }; + FC52847911478C200058CCB0 /* rpc.subproj */ = { + isa = PBXGroup; + children = ( + FC52847A11478C200058CCB0 /* auth.h */, + FC52847B11478C200058CCB0 /* auth_none.c */, + FC52847C11478C200058CCB0 /* auth_unix.c */, + FC52847D11478C200058CCB0 /* auth_unix.h */, + FC52847E11478C200058CCB0 /* authunix_prot.c */, + FC52847F11478C200058CCB0 /* bindresvport.3 */, + FC52848011478C200058CCB0 /* bindresvport.c */, + FC52848111478C200058CCB0 /* clnt.h */, + FC52848211478C200058CCB0 /* clnt_generic.c */, + FC52848311478C200058CCB0 /* clnt_perror.c */, + FC52848411478C200058CCB0 /* clnt_raw.c */, + FC52848511478C200058CCB0 /* clnt_simple.c */, + FC52848611478C200058CCB0 /* clnt_tcp.c */, + FC52848711478C200058CCB0 /* clnt_udp.c */, + FC52848811478C200058CCB0 /* DISCLAIMER */, + FC52848911478C200058CCB0 /* get_myaddress.c */, + FC52848A11478C200058CCB0 /* getrpcent.3 */, + FC52848B11478C200058CCB0 /* getrpcent.c */, + FC52848C11478C200058CCB0 /* getrpcport.3 */, + FC52848D11478C200058CCB0 /* getrpcport.c */, + FC52849011478C200058CCB0 /* pmap_clnt.c */, + FC52849111478C200058CCB0 /* pmap_clnt.h */, + FC52849211478C200058CCB0 /* pmap_getmaps.c */, + FC52849311478C200058CCB0 /* pmap_getport.c */, + FC52849411478C200058CCB0 /* pmap_prot.c */, + FC52849511478C200058CCB0 /* pmap_prot.h */, + FC52849611478C200058CCB0 /* pmap_prot2.c */, + FC52849711478C200058CCB0 /* pmap_rmt.c */, + FC52849811478C200058CCB0 /* pmap_rmt.h */, + FC52849911478C200058CCB0 /* pmap_wakeup.c */, + FC52849A11478C200058CCB0 /* pmap_wakeup.h */, + FC52849B11478C200058CCB0 /* README */, + FC52849C11478C200058CCB0 /* rpc.3 */, + FC52849D11478C200058CCB0 /* rpc.h */, + FC52849E11478C200058CCB0 /* rpc_callmsg.c */, + FC52849F11478C200058CCB0 /* rpc_commondata.c */, + FC5284A011478C200058CCB0 /* rpc_dtablesize.c */, + FC5284A111478C200058CCB0 /* rpc_msg.h */, + FC5284A211478C200058CCB0 /* rpc_prot.c */, + FC5284A311478C200058CCB0 /* svc.c */, + FC5284A411478C200058CCB0 /* svc.h */, + FC5284A511478C200058CCB0 /* svc_auth.c */, + FC5284A611478C200058CCB0 /* svc_auth.h */, + FC5284A711478C200058CCB0 /* svc_auth_unix.c */, + FC5284A811478C200058CCB0 /* svc_raw.c */, + FC5284A911478C200058CCB0 /* svc_run.c */, + FC5284AA11478C200058CCB0 /* svc_simple.c */, + FC5284AB11478C200058CCB0 /* svc_tcp.c */, + FC5284AC11478C200058CCB0 /* svc_udp.c */, + FC5284AD11478C200058CCB0 /* types.h */, + FC5284AE11478C200058CCB0 /* xdr.3 */, + FC5284AF11478C200058CCB0 /* xdr.c */, + FC5284B011478C200058CCB0 /* xdr.h */, + FC5284B111478C200058CCB0 /* xdr_array.c */, + FC5284B211478C200058CCB0 /* xdr_float.c */, + FC5284B311478C200058CCB0 /* xdr_mem.c */, + FC5284B411478C200058CCB0 /* xdr_rec.c */, + FC5284B511478C200058CCB0 /* xdr_reference.c */, + FC5284B611478C200058CCB0 /* xdr_sizeof.c */, + FC5284B711478C200058CCB0 /* xdr_stdio.c */, + ); + path = rpc.subproj; + sourceTree = ""; + }; + FC5284B811478C200058CCB0 /* util.subproj */ = { + isa = PBXGroup; + children = ( + FC5284B911478C200058CCB0 /* hosts.equiv.5 */, + FC5284BA11478C200058CCB0 /* hton.c */, + FC5284BC11478C200058CCB0 /* putpwpasswd.c */, + FC5284BD11478C200058CCB0 /* rcmd.3 */, + FC5284BE11478C200058CCB0 /* rcmd.c */, + FC5284BF11478C200058CCB0 /* rcmdsh.c */, + ); + path = util.subproj; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 3FCF60EA1257C272008D8BB1 /* Libinfo_Sim */ = { + isa = PBXNativeTarget; + buildConfigurationList = 3FCF61601257C272008D8BB1 /* Build configuration list for PBXNativeTarget "Libinfo_Sim" */; + buildPhases = ( + 3FCF60EB1257C272008D8BB1 /* Sources */, + 3FCF615E1257C272008D8BB1 /* Frameworks */, + 3FCF615F1257C272008D8BB1 /* Install Files */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Libinfo_Sim; + productName = Libinfo; + productReference = 3FCF61621257C272008D8BB1 /* libsystem_sim_info.dylib */; + productType = "com.apple.product-type.library.dynamic"; + }; + D2AAC0620554660B00DB518D /* Libinfo */ = { + isa = PBXNativeTarget; + buildConfigurationList = 1DEB914A08733D8E0010E9CD /* Build configuration list for PBXNativeTarget "Libinfo" */; + buildPhases = ( + D2AAC0610554660B00DB518D /* Sources */, + D289988505E68E00004EDB86 /* Frameworks */, + FC52866A114795BD0058CCB0 /* Install Files */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = Libinfo; + productName = Libinfo; + productReference = D2AAC0630554660B00DB518D /* libsystem_info.dylib */; + productType = "com.apple.product-type.library.dynamic"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 08FB7793FE84155DC02AAC07 /* Project object */ = { + isa = PBXProject; + buildConfigurationList = 1DEB914E08733D8E0010E9CD /* Build configuration list for PBXProject "Libinfo" */; + compatibilityVersion = "Xcode 3.1"; + developmentRegion = English; + hasScannedForEncodings = 1; + knownRegions = ( + English, + Japanese, + French, + German, + ); + mainGroup = 08FB7794FE84155DC02AAC07 /* Libinfo */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + D2AAC0620554660B00DB518D /* Libinfo */, + 3FCF60EA1257C272008D8BB1 /* Libinfo_Sim */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXShellScriptBuildPhase section */ + 3FCF615F1257C272008D8BB1 /* Install Files */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 8; + files = ( + ); + inputPaths = ( + ); + name = "Install Files"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 1; + shellPath = /bin/sh; + shellScript = "\"$PROJECT_DIR\"/xcodescripts/install_files.sh"; + }; + FC52866A114795BD0058CCB0 /* Install Files */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 8; + files = ( + ); + inputPaths = ( + ); + name = "Install Files"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 1; + shellPath = /bin/sh; + shellScript = "\"$PROJECT_DIR\"/xcodescripts/install_files.sh"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 3FCF60EB1257C272008D8BB1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 3FCF60EC1257C272008D8BB1 /* herror.c in Sources */, + 3FCF60ED1257C272008D8BB1 /* res_comp.c in Sources */, + 3FCF60EE1257C272008D8BB1 /* res_data.c in Sources */, + 3FCF60EF1257C272008D8BB1 /* res_debug.c in Sources */, + 3FCF60F01257C272008D8BB1 /* res_init.c in Sources */, + 3FCF60F11257C272008D8BB1 /* res_mkquery.c in Sources */, + 3FCF60F21257C272008D8BB1 /* res_query.c in Sources */, + 3FCF60F31257C272008D8BB1 /* res_send.c in Sources */, + 3FCF60F41257C272008D8BB1 /* getifaddrs.c in Sources */, + 3FCF60F51257C272008D8BB1 /* if_indextoname.c in Sources */, + 3FCF60F61257C272008D8BB1 /* if_nameindex.c in Sources */, + 3FCF60F71257C272008D8BB1 /* if_nametoindex.c in Sources */, + 3FCF60F81257C272008D8BB1 /* inet_ntop.c in Sources */, + 3FCF60F91257C272008D8BB1 /* inet_pton.c in Sources */, + 3FCF60FA1257C272008D8BB1 /* ip6opt.c in Sources */, + 3FCF60FB1257C272008D8BB1 /* map_v4v6.c in Sources */, + 3FCF60FC1257C272008D8BB1 /* rthdr.c in Sources */, + 3FCF60FD1257C272008D8BB1 /* vars.c in Sources */, + 3FCF610A1257C272008D8BB1 /* membership.c in Sources */, + 3FCF610B1257C272008D8BB1 /* ni_stub.c in Sources */, + 3FCF610C1257C272008D8BB1 /* getdomainname.c in Sources */, + 3FCF610D1257C272008D8BB1 /* getnetgrent.c in Sources */, + 3FCF610E1257C272008D8BB1 /* innetgr.c in Sources */, + 3FCF610F1257C272008D8BB1 /* setdomainname.c in Sources */, + 3FCF61101257C272008D8BB1 /* xdr_domainname.c in Sources */, + 3FCF61111257C272008D8BB1 /* xdr_keydat.c in Sources */, + 3FCF61121257C272008D8BB1 /* xdr_mapname.c in Sources */, + 3FCF61131257C272008D8BB1 /* xdr_peername.c in Sources */, + 3FCF61141257C272008D8BB1 /* xdr_valdat.c in Sources */, + 3FCF61151257C272008D8BB1 /* xdr_ypbind_binding.c in Sources */, + 3FCF61161257C272008D8BB1 /* xdr_ypbind_resp.c in Sources */, + 3FCF61171257C272008D8BB1 /* xdr_ypbind_resptype.c in Sources */, + 3FCF61181257C272008D8BB1 /* xdr_ypbind_setdom.c in Sources */, + 3FCF61191257C272008D8BB1 /* xdr_ypmaplist.c in Sources */, + 3FCF611A1257C272008D8BB1 /* xdr_ypreq_key.c in Sources */, + 3FCF611B1257C272008D8BB1 /* xdr_ypreq_nokey.c in Sources */, + 3FCF611C1257C272008D8BB1 /* xdr_ypresp_all.c in Sources */, + 3FCF611D1257C272008D8BB1 /* xdr_ypresp_key_val.c in Sources */, + 3FCF611E1257C272008D8BB1 /* xdr_ypresp_maplist.c in Sources */, + 3FCF611F1257C272008D8BB1 /* xdr_ypresp_master.c in Sources */, + 3FCF61201257C272008D8BB1 /* xdr_ypresp_order.c in Sources */, + 3FCF61211257C272008D8BB1 /* xdr_ypresp_val.c in Sources */, + 3FCF61221257C272008D8BB1 /* xdr_ypstat.c in Sources */, + 3FCF61231257C272008D8BB1 /* yp_all.c in Sources */, + 3FCF61241257C272008D8BB1 /* yp_bind.c in Sources */, + 3FCF61251257C272008D8BB1 /* yp_first.c in Sources */, + 3FCF61261257C272008D8BB1 /* yp_get_default_domain.c in Sources */, + 3FCF61271257C272008D8BB1 /* yp_maplist.c in Sources */, + 3FCF61281257C272008D8BB1 /* yp_master.c in Sources */, + 3FCF61291257C272008D8BB1 /* yp_order.c in Sources */, + 3FCF612A1257C272008D8BB1 /* yperr_string.c in Sources */, + 3FCF612B1257C272008D8BB1 /* ypmatch_cache.c in Sources */, + 3FCF612C1257C272008D8BB1 /* yppasswdd_xdr.c in Sources */, + 3FCF612D1257C272008D8BB1 /* ypprot_err.c in Sources */, + 3FCF612E1257C272008D8BB1 /* auth_none.c in Sources */, + 3FCF612F1257C272008D8BB1 /* auth_unix.c in Sources */, + 3FCF61301257C272008D8BB1 /* authunix_prot.c in Sources */, + 3FCF61311257C272008D8BB1 /* bindresvport.c in Sources */, + 3FCF61321257C272008D8BB1 /* clnt_generic.c in Sources */, + 3FCF61331257C272008D8BB1 /* clnt_perror.c in Sources */, + 3FCF61341257C272008D8BB1 /* clnt_raw.c in Sources */, + 3FCF61351257C272008D8BB1 /* clnt_simple.c in Sources */, + 3FCF61361257C272008D8BB1 /* clnt_tcp.c in Sources */, + 3FCF61371257C272008D8BB1 /* clnt_udp.c in Sources */, + 3FCF61381257C272008D8BB1 /* get_myaddress.c in Sources */, + 3FCF61391257C272008D8BB1 /* getrpcent.c in Sources */, + 3FCF613A1257C272008D8BB1 /* getrpcport.c in Sources */, + 3FCF613B1257C272008D8BB1 /* pmap_clnt.c in Sources */, + 3FCF613C1257C272008D8BB1 /* pmap_getmaps.c in Sources */, + 3FCF613D1257C272008D8BB1 /* pmap_getport.c in Sources */, + 3FCF613E1257C272008D8BB1 /* pmap_prot.c in Sources */, + 3FCF613F1257C272008D8BB1 /* pmap_prot2.c in Sources */, + 3FCF61401257C272008D8BB1 /* pmap_rmt.c in Sources */, + 3FCF61411257C272008D8BB1 /* pmap_wakeup.c in Sources */, + 3FCF61421257C272008D8BB1 /* rpc_callmsg.c in Sources */, + 3FCF61431257C272008D8BB1 /* rpc_commondata.c in Sources */, + 3FCF61441257C272008D8BB1 /* rpc_dtablesize.c in Sources */, + 3FCF61451257C272008D8BB1 /* rpc_prot.c in Sources */, + 3FCF61461257C272008D8BB1 /* svc.c in Sources */, + 3FCF61471257C272008D8BB1 /* svc_auth.c in Sources */, + 3FCF61481257C272008D8BB1 /* svc_auth_unix.c in Sources */, + 3FCF61491257C272008D8BB1 /* svc_raw.c in Sources */, + 3FCF614A1257C272008D8BB1 /* svc_run.c in Sources */, + 3FCF614B1257C272008D8BB1 /* svc_simple.c in Sources */, + 3FCF614C1257C272008D8BB1 /* svc_tcp.c in Sources */, + 3FCF614D1257C272008D8BB1 /* svc_udp.c in Sources */, + 3FCF614E1257C272008D8BB1 /* xdr.c in Sources */, + 3FCF614F1257C272008D8BB1 /* xdr_array.c in Sources */, + 3FCF61501257C272008D8BB1 /* xdr_float.c in Sources */, + 3FCF61511257C272008D8BB1 /* xdr_mem.c in Sources */, + 3FCF61521257C272008D8BB1 /* xdr_rec.c in Sources */, + 3FCF61531257C272008D8BB1 /* xdr_reference.c in Sources */, + 3FCF61541257C272008D8BB1 /* xdr_sizeof.c in Sources */, + 3FCF61551257C272008D8BB1 /* xdr_stdio.c in Sources */, + 3FCF61561257C272008D8BB1 /* hton.c in Sources */, + 3FCF61571257C272008D8BB1 /* putpwpasswd.c in Sources */, + 3FCF61581257C272008D8BB1 /* rcmd.c in Sources */, + 3FCF61591257C272008D8BB1 /* rcmdsh.c in Sources */, + 3FCF615D1257C272008D8BB1 /* ether_addr.c in Sources */, + 2D31A0FD128074E700D5A84C /* getifmaddrs.c in Sources */, + 2D4070B2129354A700FE81ED /* getnameinfo_link.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + D2AAC0610554660B00DB518D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + FC5284C011478C200058CCB0 /* herror.c in Sources */, + FC5284C811478C200058CCB0 /* res_comp.c in Sources */, + FC5284C911478C200058CCB0 /* res_data.c in Sources */, + FC5284CA11478C200058CCB0 /* res_debug.c in Sources */, + FC5284CB11478C200058CCB0 /* res_init.c in Sources */, + FC5284CC11478C200058CCB0 /* res_mkquery.c in Sources */, + FC5284CD11478C200058CCB0 /* res_query.c in Sources */, + FC5284CF11478C200058CCB0 /* res_send.c in Sources */, + FC5284D211478C200058CCB0 /* getifaddrs.c in Sources */, + FC5284D311478C200058CCB0 /* if_indextoname.c in Sources */, + FC5284D411478C200058CCB0 /* if_nameindex.c in Sources */, + FC5284D511478C200058CCB0 /* if_nametoindex.c in Sources */, + FC5284D711478C200058CCB0 /* inet_ntop.c in Sources */, + FC5284D811478C200058CCB0 /* inet_pton.c in Sources */, + FC5284D911478C200058CCB0 /* ip6opt.c in Sources */, + FC5284DB11478C200058CCB0 /* map_v4v6.c in Sources */, + FC5284DC11478C200058CCB0 /* rthdr.c in Sources */, + FC5284DD11478C200058CCB0 /* vars.c in Sources */, + FC5284E011478C200058CCB0 /* cache_module.c in Sources */, + FC5284E111478C200058CCB0 /* ds_module.c in Sources */, + FC5284E211478C200058CCB0 /* file_module.c in Sources */, + FC5284E311478C200058CCB0 /* ils.c in Sources */, + FC5284E511478C200058CCB0 /* kvbuf.c in Sources */, + FC5284E711478C200058CCB0 /* libinfo.c in Sources */, + FC5284EA11478C200058CCB0 /* mdns_module.c in Sources */, + FC5284EE11478C200058CCB0 /* search_module.c in Sources */, + FC5284EF11478C200058CCB0 /* si_data.c in Sources */, + FC5284F111478C200058CCB0 /* si_getaddrinfo.c in Sources */, + FC5284F211478C200058CCB0 /* si_module.c in Sources */, + FC5284F411478C200058CCB0 /* thread_data.c in Sources */, + FC5284F711478C200058CCB0 /* membership.c in Sources */, + FC5284FC11478C200058CCB0 /* ni_stub.c in Sources */, + FC5284FD11478C200058CCB0 /* getdomainname.c in Sources */, + FC5284FE11478C200058CCB0 /* getnetgrent.c in Sources */, + FC5284FF11478C200058CCB0 /* innetgr.c in Sources */, + FC52850111478C200058CCB0 /* setdomainname.c in Sources */, + FC52850211478C200058CCB0 /* xdr_domainname.c in Sources */, + FC52850311478C200058CCB0 /* xdr_keydat.c in Sources */, + FC52850411478C200058CCB0 /* xdr_mapname.c in Sources */, + FC52850511478C200058CCB0 /* xdr_peername.c in Sources */, + FC52850611478C200058CCB0 /* xdr_valdat.c in Sources */, + FC52850711478C200058CCB0 /* xdr_ypbind_binding.c in Sources */, + FC52850811478C200058CCB0 /* xdr_ypbind_resp.c in Sources */, + FC52850911478C200058CCB0 /* xdr_ypbind_resptype.c in Sources */, + FC52850A11478C200058CCB0 /* xdr_ypbind_setdom.c in Sources */, + FC52850B11478C200058CCB0 /* xdr_ypmaplist.c in Sources */, + FC52850C11478C200058CCB0 /* xdr_ypreq_key.c in Sources */, + FC52850D11478C200058CCB0 /* xdr_ypreq_nokey.c in Sources */, + FC52850E11478C200058CCB0 /* xdr_ypresp_all.c in Sources */, + FC52850F11478C200058CCB0 /* xdr_ypresp_key_val.c in Sources */, + FC52851011478C200058CCB0 /* xdr_ypresp_maplist.c in Sources */, + FC52851111478C200058CCB0 /* xdr_ypresp_master.c in Sources */, + FC52851211478C200058CCB0 /* xdr_ypresp_order.c in Sources */, + FC52851311478C200058CCB0 /* xdr_ypresp_val.c in Sources */, + FC52851411478C200058CCB0 /* xdr_ypstat.c in Sources */, + FC52851511478C200058CCB0 /* yp_all.c in Sources */, + FC52851611478C200058CCB0 /* yp_bind.c in Sources */, + FC52851711478C200058CCB0 /* yp_first.c in Sources */, + FC52851811478C200058CCB0 /* yp_get_default_domain.c in Sources */, + FC52851911478C200058CCB0 /* yp_maplist.c in Sources */, + FC52851A11478C200058CCB0 /* yp_master.c in Sources */, + FC52851B11478C200058CCB0 /* yp_order.c in Sources */, + FC52851E11478C200058CCB0 /* yperr_string.c in Sources */, + FC52852011478C200058CCB0 /* ypmatch_cache.c in Sources */, + FC52852111478C200058CCB0 /* yppasswdd_xdr.c in Sources */, + FC52852211478C200058CCB0 /* ypprot_err.c in Sources */, + FC52852411478C200058CCB0 /* auth_none.c in Sources */, + FC52852511478C200058CCB0 /* auth_unix.c in Sources */, + FC52852711478C200058CCB0 /* authunix_prot.c in Sources */, + FC52852811478C200058CCB0 /* bindresvport.c in Sources */, + FC52852A11478C200058CCB0 /* clnt_generic.c in Sources */, + FC52852B11478C200058CCB0 /* clnt_perror.c in Sources */, + FC52852C11478C200058CCB0 /* clnt_raw.c in Sources */, + FC52852D11478C200058CCB0 /* clnt_simple.c in Sources */, + FC52852E11478C200058CCB0 /* clnt_tcp.c in Sources */, + FC52852F11478C200058CCB0 /* clnt_udp.c in Sources */, + FC52853011478C200058CCB0 /* get_myaddress.c in Sources */, + FC52853111478C200058CCB0 /* getrpcent.c in Sources */, + FC52853211478C200058CCB0 /* getrpcport.c in Sources */, + FC52853511478C200058CCB0 /* pmap_clnt.c in Sources */, + FC52853711478C200058CCB0 /* pmap_getmaps.c in Sources */, + FC52853811478C200058CCB0 /* pmap_getport.c in Sources */, + FC52853911478C200058CCB0 /* pmap_prot.c in Sources */, + FC52853B11478C200058CCB0 /* pmap_prot2.c in Sources */, + FC52853C11478C200058CCB0 /* pmap_rmt.c in Sources */, + FC52853E11478C200058CCB0 /* pmap_wakeup.c in Sources */, + FC52854111478C200058CCB0 /* rpc_callmsg.c in Sources */, + FC52854211478C200058CCB0 /* rpc_commondata.c in Sources */, + FC52854311478C200058CCB0 /* rpc_dtablesize.c in Sources */, + FC52854511478C200058CCB0 /* rpc_prot.c in Sources */, + FC52854611478C200058CCB0 /* svc.c in Sources */, + FC52854811478C200058CCB0 /* svc_auth.c in Sources */, + FC52854A11478C200058CCB0 /* svc_auth_unix.c in Sources */, + FC52854B11478C200058CCB0 /* svc_raw.c in Sources */, + FC52854C11478C200058CCB0 /* svc_run.c in Sources */, + FC52854D11478C200058CCB0 /* svc_simple.c in Sources */, + FC52854E11478C200058CCB0 /* svc_tcp.c in Sources */, + FC52854F11478C200058CCB0 /* svc_udp.c in Sources */, + FC52855111478C200058CCB0 /* xdr.c in Sources */, + FC52855311478C200058CCB0 /* xdr_array.c in Sources */, + FC52855411478C200058CCB0 /* xdr_float.c in Sources */, + FC52855511478C200058CCB0 /* xdr_mem.c in Sources */, + FC52855611478C200058CCB0 /* xdr_rec.c in Sources */, + FC52855711478C200058CCB0 /* xdr_reference.c in Sources */, + FC52855811478C200058CCB0 /* xdr_sizeof.c in Sources */, + FC52855911478C200058CCB0 /* xdr_stdio.c in Sources */, + FC52855A11478C200058CCB0 /* hton.c in Sources */, + FC52855C11478C200058CCB0 /* putpwpasswd.c in Sources */, + FC52855D11478C200058CCB0 /* rcmd.c in Sources */, + FC52855E11478C200058CCB0 /* rcmdsh.c in Sources */, + FC5285D4114791B50058CCB0 /* DSlibinfoMIG.defs in Sources */, + FC5285D5114791B50058CCB0 /* DSlibinfoMIGAsyncReply.defs in Sources */, + FC5285D6114791B50058CCB0 /* DSmemberdMIG.defs in Sources */, + FC5285F7114793400058CCB0 /* ether_addr.c in Sources */, + 2D31A0FC128074E700D5A84C /* getifmaddrs.c in Sources */, + 2D4070B1129354A700FE81ED /* getnameinfo_link.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin XCBuildConfiguration section */ + 1DEB914C08733D8E0010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + EXECUTABLE_PREFIX = libsystem_; + GCC_PREPROCESSOR_DEFINITIONS = ( + "__DARWIN_NON_CANCELABLE=1", + "__MigTypeCheck=1", + "INET6=1", + USE_OPTIONS_H, + ); + "GCC_PREPROCESSOR_DEFINITIONS[sdk=iphone*][arch=*]" = ( + CONFIG_IPHONE, + "$(GCC_PREPROCESSOR_DEFINITIONS)", + ); + "GCC_PREPROCESSOR_DEFINITIONS[sdk=macosx*][arch=*]" = ( + CONFIG_MAC, + DS_AVAILABLE, + SYNTH_ROOTFS, + "$(GCC_PREPROCESSOR_DEFINITIONS)", + ); + INSTALLHDRS_SCRIPT_PHASE = YES; + INSTALL_PATH = /usr/lib/system; + PRODUCT_NAME = info; + VERSION_INFO_EXPORT_DECL = static; + VERSION_INFO_PREFIX = __; + }; + name = Release; + }; + 1DEB915008733D8E0010E9CD /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ARCHS = "$(ARCHS_STANDARD_32_64_BIT)"; + BUILD_VARIANTS = ( + normal, + profile, + debug, + ); + CODE_SIGN_IDENTITY = "-"; + CURRENT_PROJECT_VERSION = "$(RC_ProjectSourceVersion)"; + DEAD_CODE_STRIPPING = YES; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_TREAT_WARNINGS_AS_ERRORS = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + PREBINDING = NO; + VERSIONING_SYSTEM = "apple-generic"; + WARNING_LDFLAGS = "-Wall"; + }; + name = Release; + }; + 3FCF61611257C272008D8BB1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + EXECUTABLE_PREFIX = libsystem_sim_; + GCC_PREPROCESSOR_DEFINITIONS = ( + "__DARWIN_NON_CANCELABLE=1", + "__MigTypeCheck=1", + "INET6=1", + USE_OPTIONS_H, + ); + "GCC_PREPROCESSOR_DEFINITIONS[sdk=iphone*][arch=*]" = ( + CONFIG_IPHONE, + "$(GCC_PREPROCESSOR_DEFINITIONS)", + ); + "GCC_PREPROCESSOR_DEFINITIONS[sdk=macosx*][arch=*]" = ( + CONFIG_MAC, + DS_AVAILABLE, + SYNTH_ROOTFS, + "$(GCC_PREPROCESSOR_DEFINITIONS)", + ); + INSTALLHDRS_SCRIPT_PHASE = YES; + INSTALL_PATH = "$(SDKROOT)/usr/lib/system"; + PRODUCT_NAME = info; + VERSION_INFO_EXPORT_DECL = static; + VERSION_INFO_PREFIX = __; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 1DEB914A08733D8E0010E9CD /* Build configuration list for PBXNativeTarget "Libinfo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB914C08733D8E0010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 1DEB914E08733D8E0010E9CD /* Build configuration list for PBXProject "Libinfo" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 1DEB915008733D8E0010E9CD /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 3FCF61601257C272008D8BB1 /* Build configuration list for PBXNativeTarget "Libinfo_Sim" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 3FCF61611257C272008D8BB1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 08FB7793FE84155DC02AAC07 /* Project object */; +} diff --git a/Makefile b/Makefile deleted file mode 100644 index bd8fd83..0000000 --- a/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -Project = info -ProductType = staticlib -Install_Dir = /usr/local/lib/system -BuildDebug = YES -BuildProfile = YES - -DIRS = dns gen lookup membership netinfo nis rpc util - -SubProjects = $(foreach DIR, $(DIRS), $(DIR).subproj) - -include $(MAKEFILEPATH)/CoreOS/ReleaseControl/BSDCommon.make - -after_install: - $(LIBTOOL) -static -o $(SYMROOT)/libinfo.a \ - $(foreach DIR, $(DIRS), $(SYMROOT)/lib$(DIR).a) - $(LIBTOOL) -static -o $(SYMROOT)/libinfo_debug.a \ - $(foreach DIR, $(DIRS), $(SYMROOT)/lib$(DIR)_debug.a) - $(LIBTOOL) -static -o $(SYMROOT)/libinfo_profile.a \ - $(foreach DIR, $(DIRS), $(SYMROOT)/lib$(DIR)_profile.a) - $(INSTALL_DIRECTORY) $(DSTROOT)/usr/local/lib/system - $(INSTALL_LIBRARY) $(SYMROOT)/libinfo.a $(DSTROOT)/usr/local/lib/system - $(INSTALL_LIBRARY) $(SYMROOT)/libinfo_debug.a $(DSTROOT)/usr/local/lib/system - $(INSTALL_LIBRARY) $(SYMROOT)/libinfo_profile.a $(DSTROOT)/usr/local/lib/system - $(RMDIR) $(DSTROOT)/scratch diff --git a/dns.subproj/Makefile b/dns.subproj/Makefile deleted file mode 100644 index 2c168da..0000000 --- a/dns.subproj/Makefile +++ /dev/null @@ -1,17 +0,0 @@ -Project = dns -ProductType = staticlib -Install_Dir = /scratch -BuildDebug = YES -BuildProfile = YES - -Install_Headers_Directory = /usr/include/arpa -Install_Headers = inet.h - -CFILES = herror.c res_comp.c res_data.c res_debug.c\ - res_init.c res_mkquery.c res_query.c res_send.c - -Extra_CC_Flags = -Wall -fno-common -I. \ - -I../gen.subproj -I../lookup.subproj \ - -DUSE_OPTIONS_H -D__DARWIN_NON_CANCELABLE=1 - -include $(MAKEFILEPATH)/CoreOS/ReleaseControl/BSDCommon.make diff --git a/dns.subproj/Makefile.dist b/dns.subproj/Makefile.dist deleted file mode 100644 index 385c8a9..0000000 --- a/dns.subproj/Makefile.dist +++ /dev/null @@ -1,112 +0,0 @@ -# -# from @(#)Makefile 5.16 (Berkeley) 3/14/88 -# $Id: Makefile.dist,v 1.1 1999/04/13 23:15:30 wsanchez Exp $ -# - -## ++Copyright++ 1988, 1995 -## - -## Copyright (c) 1988, 1995 -## The Regents of the University of California. All rights reserved. -## -## Redistribution and use in source and binary forms, with or without -## modification, are permitted provided that the following conditions -## are met: -## 1. Redistributions of source code must retain the above copyright -## notice, this list of conditions and the following disclaimer. -## 2. Redistributions in binary form must reproduce the above copyright -## notice, this list of conditions and the following disclaimer in the -## documentation and/or other materials provided with the distribution. -## 3. All advertising materials mentioning features or use of this software -## must display the following acknowledgement: -## This product includes software developed by the University of -## California, Berkeley and its contributors. -## 4. Neither the name of the University nor the names of its contributors -## may be used to endorse or promote products derived from this software -## without specific prior written permission. -## -## THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND -## ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -## IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -## ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE -## FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -## DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS -## OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) -## HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -## LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -## OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF -## SUCH DAMAGE. -## - -## Portions Copyright (c) 1993 by Digital Equipment Corporation. -## -## Permission to use, copy, modify, and distribute this software for any -## purpose with or without fee is hereby granted, provided that the above -## copyright notice and this permission notice appear in all copies, and that -## the name of Digital Equipment Corporation not be used in advertising or -## publicity pertaining to distribution of the document or software without -## specific, written prior permission. -## -## THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL -## WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES -## OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT -## CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL -## DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR -## PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS -## ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS -## SOFTWARE. -## - -## --Copyright-- - -DESTDIR = -DESTLIB = /usr/lib -CC= cc -SHELL= /bin/sh -CDEBUG= -O -INCL = ../include -COMPINCL = ../compat/include -AR= ar cru -RANLIB= ranlib -DEFS= -LOCDEFS= -DUSE_OPTIONS_H - -AROBJS= ${ARPREF} ${OBJS} ${ARSUFF} - -CFLAGS= ${CDEBUG} -I${INCL} -I${COMPINCL} ${DEFS} ${LOCDEFS} - -SRCS= herror.c res_debug.c \ - res_comp.c res_init.c res_mkquery.c res_query.c res_send.c \ - getnetbyaddr.c getnetbyname.c getnetent.c getnetnamadr.c \ - gethnamaddr.c sethostent.c nsap_addr.c inet_addr.c hostnamelen.c - -OBJS= herror.o res_debug.o \ - res_comp.o res_init.o res_mkquery.o res_query.o res_send.o \ - getnetbyaddr.o getnetbyname.o getnetent.o getnetnamadr.o \ - gethnamaddr.o sethostent.o nsap_addr.o inet_addr.o hostnamelen.o - -all: libresolv.a - -libresolv.a: ${OBJS} - ${AR} libresolv.a ${AROBJS} - $(RANLIB) libresolv.a - -install: ${DESTDIR}${DESTLIB}/libresolv.a - -${DESTDIR}${DESTLIB}/libresolv.a: libresolv.a - ${INSTALL} -c -o bin -g bin -m 644 libresolv.a ${DESTDIR}${DESTLIB}/ - ( cd ${DESTDIR}${DESTLIB} ; $(RANLIB) libresolv.a ) - -.c.o: - ${CC} ${CPPFLAGS} ${CFLAGS} -c $*.c - -${LDS} ld -x -r $*.o - ${LDS} mv a.out $*.o - -clean: FRC - rm -f errs a.out core libresolv.a tags .depend - rm -f *.o *.BAK *.CKP *~ *.orig - -depend: FRC - mkdep ${CPPFLAGS} -I${INCL} -I${COMPINCL} ${DEFS} ${SRCS} - -FRC: - -# DO NOT DELETE THIS LINE -- mkdep uses it. -# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY. diff --git a/gen.subproj/Makefile b/gen.subproj/Makefile deleted file mode 100644 index f8484cc..0000000 --- a/gen.subproj/Makefile +++ /dev/null @@ -1,71 +0,0 @@ -Project = gen -ProductType = staticlib -Install_Dir = /scratch -BuildDebug = YES -BuildProfile = YES - -CFILES = ether_addr.c getifaddrs.c \ - if_indextoname.c if_nameindex.c if_nametoindex.c \ - inet_ntop.c inet_pton.c map_v4v6.c ip6opt.c rthdr.c vars.c \ - $(OBJROOT)/_version.c - -MANPAGES = getifaddrs.3 if_indextoname.3 inet6_rthdr_space.3 \ - gethostbyname.3 inet6_option_space.3 \ - getprotoent.3 gethostbyname.3 getipnodebyname.3 \ - getnetent.3 getservent.3 inet6_option_space.3 - -Install_Headers = ifaddrs.h - -Extra_CC_Flags = -Wall -fno-common -I. \ - -I../dns.subproj -I../lookup.subproj \ - -D__DARWIN_NON_CANCELABLE=1 -DINET6=1 - - -include $(MAKEFILEPATH)/CoreOS/ReleaseControl/BSDCommon.make - -$(OBJROOT)/_version.c: - /Developer/Makefiles/bin/version.pl Libinfo > $@ - -after_install: - @for LINK in endhostent.3 gethostbyaddr.3 gethostbyname2.3 \ - gethostent.3 herror.3 hstrerror.3 sethostent.3 ; do \ - $(LN) -f "$(DSTROOT)/usr/share/man/man3/gethostbyname.3" \ - "$(DSTROOT)/usr/share/man/man3/$${LINK}" ; \ - done - $(LN) -f "$(DSTROOT)/usr/share/man/man3/getifaddrs.3" \ - "$(DSTROOT)/usr/share/man/man3/freeifaddrs.3" - @for LINK in freehostent.3 getipnodebyaddr.3 ; do \ - $(LN) -f "$(DSTROOT)/usr/share/man/man3/getipnodebyname.3" \ - "$(DSTROOT)/usr/share/man/man3/$${LINK}" ; \ - done - @for LINK in endnetent.3 getnetbyaddr.3 getnetbyname.3 \ - setnetent.3 ; do \ - $(LN) -f "$(DSTROOT)/usr/share/man/man3/getnetent.3" \ - "$(DSTROOT)/usr/share/man/man3/$${LINK}" ; \ - done - @for LINK in endprotoent.3 getprotobyname.3 getprotobynumber.3 \ - setprotoent.3 ; do \ - $(LN) -f "$(DSTROOT)/usr/share/man/man3/getprotoent.3" \ - "$(DSTROOT)/usr/share/man/man3/$${LINK}" ; \ - done - @for LINK in endservent.3 getservbyname.3 getservbyport.3 \ - setservent.3 ; do \ - $(LN) -f "$(DSTROOT)/usr/share/man/man3/getservent.3" \ - "$(DSTROOT)/usr/share/man/man3/$${LINK}" ; \ - done - @for LINK in if_freenameindex.3 if_nameindex.3 if_nametoindex.3 ; do \ - $(LN) -f "$(DSTROOT)/usr/share/man/man3/if_indextoname.3" \ - "$(DSTROOT)/usr/share/man/man3/$${LINK}" ; \ - done - @for LINK in inet6_option_alloc.3 inet6_option_append.3 \ - inet6_option_find.3 inet6_option_init.3 inet6_option_next.3 ; do \ - $(LN) -f "$(DSTROOT)/usr/share/man/man3/inet6_option_space.3" \ - "$(DSTROOT)/usr/share/man/man3/$${LINK}" ; \ - done - @for LINK in inet6_rthdr_add.3 inet6_rthdr_getaddr.3 \ - inet6_rthdr_getflags.3 inet6_rthdr_init.3 \ - inet6_rthdr_lasthop.3 inet6_rthdr_reverse.3 \ - inet6_rthdr_segments.3 ; do \ - $(LN) -f "$(DSTROOT)/usr/share/man/man3/inet6_rthdr_space.3" \ - "$(DSTROOT)/usr/share/man/man3/$${LINK}" ; \ - done diff --git a/gen.subproj/getifmaddrs.3 b/gen.subproj/getifmaddrs.3 new file mode 100644 index 0000000..3c9b911 --- /dev/null +++ b/gen.subproj/getifmaddrs.3 @@ -0,0 +1,116 @@ +.\" Copyright (c) 2003 Bruce M. Simpson. All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" +.\" THIS SOFTWARE IS PROVIDED BY Bruce M. Simpson ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL Bruce M. Simpson BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD: src/lib/libc/net/getifmaddrs.3,v 1.3.22.1.4.1 2010/06/14 02:09:06 kensmith Exp $ +.\" +.Dd November 14, 2003 +.Dt GETIFMADDRS 3 +.Os +.Sh NAME +.Nm getifmaddrs +.Nd get multicast group memberships +.Sh SYNOPSIS +.In sys/types.h +.In sys/socket.h +.In ifaddrs.h +.Ft int +.Fn getifmaddrs "struct ifmaddrs **ifmap" +.Ft void +.Fn freeifmaddrs "struct ifmaddrs *ifmp" +.Sh DESCRIPTION +The +.Fn getifmaddrs +function stores a reference to a linked list of the multicast memberships +on the local machine in the memory referenced by +.Fa ifmap . +The list consists of +.Vt ifmaddrs +structures, as defined in the include file +.In ifaddrs.h . +The +.Vt ifmaddrs +structure contains at least the following entries: +.Bd -literal + struct ifmaddrs *ifma_next; /* Pointer to next struct */ + struct sockaddr *ifma_name; /* Interface name (AF_LINK) */ + struct sockaddr *ifma_addr; /* Multicast address */ + struct sockaddr *ifma_lladdr; /* Link-layer translation, if any */ +.Ed +.Pp +The +.Va ifma_next +field contains a pointer to the next structure on the list. +This field is +.Dv NULL +in last structure on the list. +.Pp +The +.Va ifma_name +field references an +.Dv AF_LINK +address structure, containing the name of the +interface where the membership exists. +.Pp +The +.Va ifma_addr +references the address that this membership is for. +.Pp +The +.Va ifma_lladdr +field references a link-layer translation for the protocol-level address in +.Va ifma_addr , +if one is set, otherwise it is +.Dv NULL . +.Pp +The data returned by +.Fn getifmaddrs +is dynamically allocated and should be freed using +.Fn freeifmaddrs +when no longer needed. +.Sh RETURN VALUES +.Rv -std getifmaddrs +.Sh ERRORS +The +.Fn getifmaddrs +may fail and set +.Va errno +for any of the errors specified for the library routines +.Xr malloc 3 +or +.Xr sysctl 3 . +.Sh SEE ALSO +.Xr sysctl 3 , +.Xr networking 4 , +.Xr ifconfig 8 +.Sh HISTORY +The +.Fn getifmaddrs +function first appeared in +.Fx 5.2 . +.Sh BUGS +If both +.In net/if.h +and +.In ifaddrs.h +are being included, +.In net/if.h +.Em must +be included before +.In ifaddrs.h . diff --git a/gen.subproj/getifmaddrs.c b/gen.subproj/getifmaddrs.c new file mode 100644 index 0000000..93049ff --- /dev/null +++ b/gen.subproj/getifmaddrs.c @@ -0,0 +1,210 @@ +/* + * Copyright (c) 2003 Bruce M. Simpson. + * All rights reserved + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by Bruce M. Simpson. + * 4. Neither the name of Bruce M. Simpson nor the names of other + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY BRUCE M. SIMPSON AND AFFILIATES + * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BRUCE M. SIMPSON OR CONTRIBUTORS + * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define SALIGN (sizeof(uint32_t) - 1) +#define SA_RLEN(sa) ((sa)->sa_len ? (((sa)->sa_len + SALIGN) & ~SALIGN) : \ +(SALIGN + 1)) +#define MAX_SYSCTL_TRY 5 +#define RTA_MASKS (RTA_GATEWAY | RTA_IFP | RTA_IFA) + +/* FreeBSD uses NET_RT_IFMALIST and RTM_NEWMADDR from */ +/* We can use NET_RT_IFLIST2 and RTM_NEWMADDR2 on Darwin */ +#define DARWIN_COMPAT + +#ifdef DARWIN_COMPAT +#define GIM_SYSCTL_MIB NET_RT_IFLIST2 +#define GIM_RTM_ADDR RTM_NEWMADDR2 +#else +#define GIM_SYSCTL_MIB NET_RT_IFMALIST +#define GIM_RTM_ADDR RTM_NEWMADDR +#endif + +int +getifmaddrs(struct ifmaddrs **pif) +{ + int icnt = 1; + int dcnt = 0; + int ntry = 0; + size_t len; + size_t needed; + int mib[6]; + int i; + char *buf; + char *data; + char *next; + char *p; + struct ifma_msghdr2 *ifmam; + struct ifmaddrs *ifa, *ift; + struct rt_msghdr *rtm; + struct sockaddr *sa; + + mib[0] = CTL_NET; + mib[1] = PF_ROUTE; + mib[2] = 0; /* protocol */ + mib[3] = 0; /* wildcard address family */ + mib[4] = GIM_SYSCTL_MIB; + mib[5] = 0; /* no flags */ + do { + if (sysctl(mib, 6, NULL, &needed, NULL, 0) < 0) + return (-1); + if ((buf = malloc(needed)) == NULL) + return (-1); + if (sysctl(mib, 6, buf, &needed, NULL, 0) < 0) { + if (errno != ENOMEM || ++ntry >= MAX_SYSCTL_TRY) { + free(buf); + return (-1); + } + free(buf); + buf = NULL; + } + } while (buf == NULL); + + for (next = buf; next < buf + needed; next += rtm->rtm_msglen) { + rtm = (struct rt_msghdr *)(void *)next; + if (rtm->rtm_version != RTM_VERSION) + continue; + switch (rtm->rtm_type) { + case GIM_RTM_ADDR: + ifmam = (struct ifma_msghdr2 *)(void *)rtm; + if ((ifmam->ifmam_addrs & RTA_IFA) == 0) + break; + icnt++; + p = (char *)(ifmam + 1); + for (i = 0; i < RTAX_MAX; i++) { + if ((RTA_MASKS & ifmam->ifmam_addrs & + (1 << i)) == 0) + continue; + sa = (struct sockaddr *)(void *)p; + len = SA_RLEN(sa); + dcnt += len; + p += len; + } + break; + } + } + + data = malloc(sizeof(struct ifmaddrs) * icnt + dcnt); + if (data == NULL) { + free(buf); + return (-1); + } + + ifa = (struct ifmaddrs *)(void *)data; + data += sizeof(struct ifmaddrs) * icnt; + + memset(ifa, 0, sizeof(struct ifmaddrs) * icnt); + ift = ifa; + + for (next = buf; next < buf + needed; next += rtm->rtm_msglen) { + rtm = (struct rt_msghdr *)(void *)next; + if (rtm->rtm_version != RTM_VERSION) + continue; + + switch (rtm->rtm_type) { + case GIM_RTM_ADDR: + ifmam = (struct ifma_msghdr2 *)(void *)rtm; + if ((ifmam->ifmam_addrs & RTA_IFA) == 0) + break; + + p = (char *)(ifmam + 1); + for (i = 0; i < RTAX_MAX; i++) { + if ((RTA_MASKS & ifmam->ifmam_addrs & + (1 << i)) == 0) + continue; + sa = (struct sockaddr *)(void *)p; + len = SA_RLEN(sa); + switch (i) { + case RTAX_GATEWAY: + ift->ifma_lladdr = + (struct sockaddr *)(void *)data; + memcpy(data, p, len); + data += len; + break; + + case RTAX_IFP: + ift->ifma_name = + (struct sockaddr *)(void *)data; + memcpy(data, p, len); + data += len; + break; + + case RTAX_IFA: + ift->ifma_addr = + (struct sockaddr *)(void *)data; + memcpy(data, p, len); + data += len; + break; + + default: + data += len; + break; + } + p += len; + } + ift->ifma_next = ift + 1; + ift = ift->ifma_next; + break; + } + } + + free(buf); + + if (ift > ifa) { + ift--; + ift->ifma_next = NULL; + *pif = ifa; + } else { + *pif = NULL; + free(ifa); + } + return (0); +} + +void +freeifmaddrs(struct ifmaddrs *ifmp) +{ + free(ifmp); +} diff --git a/gen.subproj/ifaddrs.h b/gen.subproj/ifaddrs.h index e264596..97cc6ca 100644 --- a/gen.subproj/ifaddrs.h +++ b/gen.subproj/ifaddrs.h @@ -1,4 +1,4 @@ -/* $KAME: ifaddrs.h,v 1.3 2001/01/26 08:14:55 itojun Exp $ */ +/* $FreeBSD: src/include/ifaddrs.h,v 1.3.32.1.4.1 2010/06/14 02:09:06 kensmith Exp $ */ /* * Copyright (c) 1995, 1999 @@ -28,10 +28,12 @@ #ifndef _IFADDRS_H_ #define _IFADDRS_H_ +#include + struct ifaddrs { struct ifaddrs *ifa_next; char *ifa_name; - unsigned int ifa_flags; + unsigned int ifa_flags; struct sockaddr *ifa_addr; struct sockaddr *ifa_netmask; struct sockaddr *ifa_dstaddr; @@ -46,11 +48,20 @@ struct ifaddrs { #define ifa_broadaddr ifa_dstaddr /* broadcast address interface */ #endif +struct ifmaddrs { + struct ifmaddrs *ifma_next; + struct sockaddr *ifma_name; + struct sockaddr *ifma_addr; + struct sockaddr *ifma_lladdr; +}; + #include __BEGIN_DECLS -extern int getifaddrs __P((struct ifaddrs **)); -extern void freeifaddrs __P((struct ifaddrs *)); +extern int getifaddrs(struct ifaddrs **); +extern void freeifaddrs(struct ifaddrs *); +extern int getifmaddrs(struct ifmaddrs **) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); +extern void freeifmaddrs(struct ifmaddrs *) __OSX_AVAILABLE_STARTING(__MAC_10_7, __IPHONE_4_3); __END_DECLS #endif diff --git a/gen.subproj/inet6_opt_init.3 b/gen.subproj/inet6_opt_init.3 new file mode 100644 index 0000000..ffb9cc9 --- /dev/null +++ b/gen.subproj/inet6_opt_init.3 @@ -0,0 +1,337 @@ +.\" $KAME: inet6_opt_init.3,v 1.7 2004/12/27 05:08:23 itojun Exp $ +.\" +.\" Copyright (C) 2004 WIDE Project. +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. Neither the name of the project nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD: src/lib/libc/net/inet6_opt_init.3,v 1.10.10.1.4.1 2010/06/14 02:09:06 kensmith Exp $ +.\" +.Dd December 23, 2004 +.Dt INET6_OPT_INIT 3 +.Os +.\" +.Sh NAME +.Nm inet6_opt_init , +.Nm inet6_opt_append , +.Nm inet6_opt_finish , +.Nm inet6_opt_set_val , +.Nm inet6_opt_next , +.Nm inet6_opt_find , +.Nm inet6_opt_get_val +.Nd IPv6 Hop-by-Hop and Destination Options manipulation +.\" +.Sh SYNOPSIS +.In netinet/in.h +.Ft "int" +.Fn inet6_opt_init "void *extbuf" "socklen_t extlen" +.Ft "int" +.Fn inet6_opt_append "void *extbuf" "socklen_t extlen" "int offset" "u_int8_t type" "socklen_t len" "u_int8_t align" "void **databufp" +.Ft "int" +.Fn inet6_opt_finish "void *extbuf" "socklen_t extlen" "int offset" +.Ft "int" +.Fn inet6_opt_set_val "void *databuf" "int offset" "void *val" "socklen_t vallen" +.Ft "int" +.Fn inet6_opt_next "void *extbuf" "socklen_t extlen" "int offset" "u_int8_t *typep" "socklen_t *lenp" "void **databufp" +.Ft "int" +.Fn inet6_opt_find "void *extbuf" "socklen_t extlen" "int offset" "u_int8_t type" "socklen_t *lenp" "void **databufp" +.Ft "int" +.Fn inet6_opt_get_val "void *databuf" "int offset" "void *val" "socklen_t vallen" +.\" +.Sh DESCRIPTION +Building and parsing the Hop-by-Hop and Destination options is +complicated. +The advanced sockets API defines a set of functions to +help applications create and manipulate Hop-by-Hop and Destination +options. +This man page describes the functions specified in +IETF Draft RFC3542. +These functions use the +formatting rules specified in Appendix B in RFC2460, i.e., that the +largest field is placed last in the option. +The function prototypes +for these functions are all contained in the +.In netinet/in.h +header file. +.\" +.Ss inet6_opt_init +The +.Fn inet6_opt_init +function +returns the number of bytes needed for an empty +extension header, one without any options. +If the +.Fa extbuf +argument points to a valid section of memory +then the +.Fn inet6_opt_init +function also initializes the extension header's length field. +When attempting to initialize an extension buffer passed in the +.Fa extbuf +argument, +.Fa extlen +must be a positive multiple of 8 or else the function fails and +returns \-1 to the caller. +.\" +.Ss inet6_opt_append +The +.Fn inet6_opt_append +function can perform two different jobs. +When a valid +.Fa extbuf +argument is supplied it appends an option to the extension buffer and +returns the updated total length as well as a pointer to the newly +created option in +.Fa databufp . +If the value +of +.Fa extbuf +is +.Dv NULL +then the +.Fn inet6_opt_append +function only reports what the total length would +be if the option were actually appended. +The +.Fa len +and +.Fa align +arguments specify the length of the option and the required data +alignment which must be used when appending the option. +The +.Fa offset +argument should be the length returned by the +.Fn inet6_opt_init +function or a previous call to +.Fn inet6_opt_append . +.Pp +The +.Fa type +argument is the 8-bit option type. +.Pp +After +.Fn inet6_opt_append +has been called, the application can use the buffer pointed to by +.Fa databufp +directly, or use +.Fn inet6_opt_set_val +to specify the data to be contained in the option. +.Pp +Option types of +.Li 0 +and +.Li 1 +are reserved for the +.Li Pad1 +and +.Li PadN +options. +All other values from 2 through 255 may be used by applications. +.Pp +The length of the option data is contained in an 8-bit value and so +may contain any value from 0 through 255. +.Pp +The +.Fa align +parameter must have a value of 1, 2, 4, or 8 and cannot exceed the +value of +.Fa len . +The alignment values represent no alignment, 16 bit, 32 bit and 64 bit +alignments, respectively. +.\" +.Ss inet6_opt_finish +The +.Fn inet6_opt_finish +function +calculates the final padding necessary to make the extension header a +multiple of 8 bytes, as required by the IPv6 extension header +specification, and returns the extension header's updated total +length. +The +.Fa offset +argument should be the length returned by +.Fn inet6_opt_init +or +.Fn inet6_opt_append . +When +.Fa extbuf +is not +.Dv NULL +the function also sets up the appropriate padding bytes by inserting a +Pad1 or PadN option of the proper length. +.Pp +If the extension header is too small to contain the proper padding +then an error of \-1 is returned to the caller. +.\" +.Ss inet6_opt_set_val +The +.Fn inet6_opt_set_val +function inserts data items of various sizes into the data portion of +the option. +The +.Fa databuf +argument is a pointer to memory that was returned by the +.Fn inet6_opt_append +call and the +.Fa offset +argument specifies where the option should be placed in the +data buffer. +The +.Fa val +argument points to an area of memory containing the data to be +inserted into the extension header, and the +.Fa vallen +argument indicates how much data to copy. +.Pp +The caller should ensure that each field is aligned on its natural +boundaries as described in Appendix B of RFC2460. +.Pp +The function returns the offset for the next field which is calculated as +.Fa offset ++ +.Fa vallen +and is used when composing options with multiple fields. +.\" +.Ss inet6_opt_next +The +.Fn inet6_opt_next +function parses received extension headers. +The +.Fa extbuf +and +.Fa extlen +arguments specify the location and length of the extension header +being parsed. +The +.Fa offset +argument should either be zero, for the first option, or the length value +returned by a previous call to +.Fn inet6_opt_next +or +.Fn inet6_opt_find . +The return value specifies the position where to continue scanning the +extension buffer. +The option is returned in the arguments +.Fa typep , lenp , +and +.Fa databufp , +which +point to the 8-bit option type, the 8-bit option length and the option +data, respectively. +This function does not return any PAD1 or PADN options. +When an error occurs or there are no more options, the return +value is \-1. +.\" +.Ss inet6_opt_find +The +.Fn inet6_opt_find +function searches the extension buffer for a particular option type, +passed in through the +.Fa type +argument. +If the option is found then the +.Fa lenp +and +.Fa databufp +arguments are updated to point to the option's length and data, +respectively. +The +.Fa extbuf +and +.Fa extlen +arguments +must point to a valid extension buffer and give its length. +The +.Fa offset +argument can be used to search from a location anywhere in the +extension header. +.Ss inet6_opt_get_val +The +.Fn inet6_opt_get_val +function extracts data items of various sizes in the data portion of +the option. +The +.Fa databuf +is a pointer returned by the +.Fn inet6_opt_next +or +.Fn inet6_opt_find +functions. +The +.Fa val +argument points where the data will be extracted. +The +.Fa offset +argument specifies from where in the data portion of the option the +value should be extracted; the first byte of option data is specified +by an offset of zero. +.Pp +It is expected that each field is aligned on its natural boundaries as +described in Appendix B of RFC2460. +.Pp +The function returns the offset for the next field +by calculating +.Fa offset ++ +.Fa vallen +which can be used when extracting option content with multiple fields. +Robust receivers must verify alignment before calling this function. +.\" +.Sh RETURN VALUES +All the functions return +\-1 +on an error. +.\" +.Sh EXAMPLES +RFC3542 gives comprehensive examples in Section 23. +.Pp +KAME also provides examples in the +.Pa advapitest +directory of its kit. +.\" +.Sh SEE ALSO +.Rs +.%A W. Stevens +.%A M. Thomas +.%A E. Nordmark +.%A T. Jinmei +.%T "Advanced Sockets API for IPv6" +.%N RFC3542 +.%D October 2002 +.Re +.Rs +.%A S. Deering +.%A R. Hinden +.%T "Internet Protocol, Version 6 (IPv6) Specification" +.%N RFC2460 +.%D December 1998 +.Re +.Sh STANDARDS +The functions are documented in +.Dq Advanced Sockets API for IPv6 +.Pq RFC3542 . +.\" +.Sh HISTORY +The implementation first appeared in KAME advanced networking kit. diff --git a/gen.subproj/inet6_rth_space.3 b/gen.subproj/inet6_rth_space.3 new file mode 100644 index 0000000..654bd5a --- /dev/null +++ b/gen.subproj/inet6_rth_space.3 @@ -0,0 +1,224 @@ +.\" $KAME: inet6_rth_space.3,v 1.7 2005/01/05 03:00:44 itojun Exp $ +.\" +.\" Copyright (C) 2004 WIDE Project. +.\" All rights reserved. +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. Neither the name of the project nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" $FreeBSD: src/lib/libc/net/inet6_rth_space.3,v 1.10.10.1.4.1 2010/06/14 02:09:06 kensmith Exp $ +.\" +.Dd December 24, 2004 +.Dt INET6_RTH_SPACE 3 +.Os +.\" +.Sh NAME +.Nm inet6_rth_space , +.Nm inet6_rth_init , +.Nm inet6_rth_add , +.Nm inet6_rth_reverse , +.Nm inet6_rth_segments , +.Nm inet6_rth_getaddr +.Nd IPv6 Routing Header Options manipulation +.\" +.Sh SYNOPSIS +.Fd #include +.Ft socklen_t +.Fn inet6_rth_space "int" "int" +.Ft "void *" +.Fn inet6_rth_init "void *" "socklen_t" "int" "int" +.Ft int +.Fn inet6_rth_add "void *" "const struct in6_addr *" +.Ft int +.Fn inet6_rth_reverse "const void *" "void *" +.Ft int +.Fn inet6_rth_segments "const void *" +.Ft "struct in6_addr *" +.Fn inet6_rth_getaddr "const void *" "int" +.\" +.Sh DESCRIPTION +The IPv6 Advanced API, RFC 3542, defines the functions that an +application calls to build and examine IPv6 Routing headers. +Routing headers are used to perform source routing in IPv6 networks. +The RFC uses the word +.Dq segments +to describe addresses and that is the term used here as well. +All of the functions are defined in the +.In netinet/in.h +header file. +The functions described in this manual page all operate +on routing header structures which are defined in +.In netinet/ip6.h +but which should not need to be modified outside the use of this API. +The size and shape of the route header structures may change, so using +the APIs is a more portable, long term, solution. +.Pp +The functions in the API are split into two groups, those that build a +routing header and those that parse a received routing header. +We will describe the builder functions followed by the parser functions. +.Ss inet6_rth_space +The +.Fn inet6_rth_space +function returns the number of bytes required to hold a Routing Header +of the type, specified in the +.Fa type +argument and containing the number of addresses specified in the +.Fa segments +argument. +When the type is +.Dv IPV6_RTHDR_TYPE_0 +the number of segments must be from 0 through 127. +Routing headers of type +.Dv IPV6_RTHDR_TYPE_2 +contain only one segment, and are only used with Mobile IPv6. +The return value from this function is the number of bytes required to +store the routing header. +If the value 0 is returned then either the +route header type was not recognized or another error occurred. +.Ss inet6_rth_init +The +.Fn inet6_rth_init +function initializes the pre-allocated buffer pointed to by +.Fa bp +to contain a routing header of the specified type The +.Fa bp_len +argument is used to verify that the buffer is large enough. +The caller must allocate the buffer pointed to by bp. +The necessary buffer size should be determined by calling +.Fn inet6_rth_space +described in the previous sections. +.Pp +The +.Fn inet6_rth_init +function returns a pointer to +.Fa bp +on success and +.Dv NULL +when there is an error. +.Ss inet6_rth_add +The +.Fn inet6_rth_add +function adds the IPv6 address pointed to by +.Fa addr +to the end of the routing header being constructed. +.Pp +A successful addition results in the function returning 0, otherwise +\-1 is returned. +.Ss inet6_rth_reverse +The +.Fn inet6_rth_reverse +function takes a routing header, pointed to by the +argument +.Fa in , +and writes a new routing header into the argument pointed to by +.Fa out . +The routing header at that sends datagrams along the reverse of that +route. +Both arguments are allowed to point to the same buffer meaning +that the reversal can occur in place. +.Pp +The return value of the function is 0 on success, or \-1 when +there is an error. +.\" +.Pp +The next set of functions operate on a routing header that the +application wants to parse. +In the usual case such a routing header +is received from the network, although these functions can also be +used with routing headers that the application itself created. +.Ss inet6_rth_segments +The +.Fn inet6_rth_segments +function returns the number of segments contained in the +routing header pointed to by +.Fa bp . +The return value is the number of segments contained in the routing +header, or \-1 if an error occurred. +It is not an error for 0 to be +returned as a routing header may contain 0 segments. +.\" +.Ss inet6_rth_getaddr +The +.Fn inet6_rth_getaddr +function is used to retrieve a single address from a routing header. +The +.Fa index +is the location in the routing header from which the application wants +to retrieve an address. +The +.Fa index +parameter must have a value between 0 and one less than the number of +segments present in the routing header. +The +.Fn inet6_rth_segments +function, described in the last section, should be used to determine +the total number of segments in the routing header. +The +.Fn inet6_rth_getaddr +function returns a pointer to an IPv6 address on success or +.Dv NULL +when an error has occurred. +.\" +.Sh EXAMPLES +RFC 3542 gives extensive examples in Section 21, Appendix B. +.Pp +KAME also provides examples in the advapitest directory of its kit. +.\" +.Sh DIAGNOSTICS +The +.Fn inet6_rth_space +and +.Fn inet6_rth_getaddr +functions return 0 on errors. +.Pp +The +.Fn inet6_rthdr_init +function returns +.Dv NULL +on error. +The +.Fn inet6_rth_add +and +.Fn inet6_rth_reverse +functions return 0 on success, or \-1 upon an error. +.\" +.Sh SEE ALSO +.Rs +.%A W. Stevens +.%A M. Thomas +.%A E. Nordmark +.%A T. Jinmei +.%T "Advanced Sockets API for IPv6" +.%N RFC 3542 +.%D May 2003 +.Re +.Rs +.%A S. Deering +.%A R. Hinden +.%T "Internet Protocol, Version 6 (IPv6) Specification" +.%N RFC2460 +.%D December 1998 +.Re +.Sh HISTORY +The implementation first appeared in KAME advanced networking kit. diff --git a/gen.subproj/ip6opt.c b/gen.subproj/ip6opt.c index 0dd5264..10d36b1 100644 --- a/gen.subproj/ip6opt.c +++ b/gen.subproj/ip6opt.c @@ -1,3 +1,5 @@ +/* $KAME: ip6opt.c,v 1.13 2003/06/06 10:08:20 suz Exp $ */ + /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. * All rights reserved. @@ -26,8 +28,16 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/lib/libc/net/ip6opt.c,v 1.1 1999/12/16 18:32:01 shin Exp $ + * $FreeBSD: src/lib/libc/net/ip6opt.c,v 1.8.10.2.2.1 2010/06/14 02:09:06 kensmith Exp $ + */ + +/* + * These routines support RFC 3542 + * __APPLE_USE_RFC_3542 selects the appropriate API in */ +#define __APPLE_USE_RFC_3542 + +#include #include #include @@ -52,8 +62,7 @@ static void inet6_insert_padopt(u_char *p, int len); * byte, the length byte, and the option data. */ int -inet6_option_space(nbytes) - int nbytes; +inet6_option_space(int nbytes) { nbytes += 2; /* we need space for nxt-hdr and length fields */ return(CMSG_SPACE((nbytes + 7) & ~7)); @@ -65,12 +74,9 @@ inet6_option_space(nbytes) * success or -1 on an error. */ int -inet6_option_init(bp, cmsgp, type) - void *bp; - struct cmsghdr **cmsgp; - int type; +inet6_option_init(void *bp, struct cmsghdr **cmsgp, int type) { - register struct cmsghdr *ch = (struct cmsghdr *)bp; + struct cmsghdr *ch = (struct cmsghdr *)bp; /* argument validation */ if (type != IPV6_HOPOPTS && type != IPV6_DSTOPTS) @@ -95,14 +101,11 @@ inet6_option_init(bp, cmsgp, type) * earlier. It must have a value between 0 and 7, inclusive. */ int -inet6_option_append(cmsg, typep, multx, plusy) - struct cmsghdr *cmsg; - const u_int8_t *typep; - int multx; - int plusy; +inet6_option_append(struct cmsghdr *cmsg, const u_int8_t *typep, int multx, + int plusy) { int padlen, optlen, off; - register u_char *bp = (u_char *)cmsg + cmsg->cmsg_len; + u_char *bp = (u_char *)cmsg + cmsg->cmsg_len; struct ip6_ext *eh = (struct ip6_ext *)CMSG_DATA(cmsg); /* argument validation */ @@ -126,6 +129,7 @@ inet6_option_append(cmsg, typep, multx, plusy) padlen = (((off % multx) + (multx - 1)) & ~(multx - 1)) - (off % multx); padlen += plusy; + padlen %= multx; /* keep the pad as short as possible */ /* insert padding */ inet6_insert_padopt(bp, padlen); cmsg->cmsg_len += padlen; @@ -167,14 +171,10 @@ inet6_option_append(cmsg, typep, multx, plusy) * */ u_int8_t * -inet6_option_alloc(cmsg, datalen, multx, plusy) - struct cmsghdr *cmsg; - int datalen; - int multx; - int plusy; +inet6_option_alloc(struct cmsghdr *cmsg, int datalen, int multx, int plusy) { int padlen, off; - register u_int8_t *bp = (u_char *)cmsg + cmsg->cmsg_len; + u_int8_t *bp = (u_char *)cmsg + cmsg->cmsg_len; u_int8_t *retval; struct ip6_ext *eh = (struct ip6_ext *)CMSG_DATA(cmsg); @@ -199,6 +199,7 @@ inet6_option_alloc(cmsg, datalen, multx, plusy) padlen = (((off % multx) + (multx - 1)) & ~(multx - 1)) - (off % multx); padlen += plusy; + padlen %= multx; /* keep the pad as short as possible */ /* insert padding */ inet6_insert_padopt(bp, padlen); cmsg->cmsg_len += padlen; @@ -233,9 +234,7 @@ inet6_option_alloc(cmsg, datalen, multx, plusy) * (RFC 2292, 6.3.5) */ int -inet6_option_next(cmsg, tptrp) - const struct cmsghdr *cmsg; - u_int8_t **tptrp; +inet6_option_next(const struct cmsghdr *cmsg, u_int8_t **tptrp) { struct ip6_ext *ip6e; int hdrlen, optlen; @@ -291,10 +290,7 @@ inet6_option_next(cmsg, tptrp) * it's a typo. The variable should be type of u_int8_t **. */ int -inet6_option_find(cmsg, tptrp, type) - const struct cmsghdr *cmsg; - u_int8_t **tptrp; - int type; +inet6_option_find(const struct cmsghdr *cmsg, u_int8_t **tptrp, int type) { struct ip6_ext *ip6e; int hdrlen, optlen; @@ -347,8 +343,7 @@ inet6_option_find(cmsg, tptrp, type) * calculated length and the limitation of the buffer. */ static int -ip6optlen(opt, lim) - u_int8_t *opt, *lim; +ip6optlen(u_int8_t *opt, u_int8_t *lim) { int optlen; @@ -382,3 +377,219 @@ inet6_insert_padopt(u_char *p, int len) return; } } + +/* + * The following functions are defined in RFC3542, which is a successor + * of RFC2292. + */ + +int +inet6_opt_init(void *extbuf, socklen_t extlen) +{ + struct ip6_ext *ext = (struct ip6_ext *)extbuf; + + if (extlen == 0 || (extlen % 8)) { + return(-1); + } + + if (ext) { + ext->ip6e_len = (extlen >> 3) - 1; + } + + return(2); /* sizeof the next and the length fields */ +} + +int +inet6_opt_append(void *extbuf, socklen_t extlen, int offset, u_int8_t type, socklen_t len, u_int8_t align, void **databufp) +{ + int currentlen = offset, padlen = 0; + + /* + * The option type must have a value from 2 to 255, inclusive. + * (0 and 1 are reserved for the Pad1 and PadN options, respectively.) + */ + if (type < 2) + return(-1); + + /* + * The option data length must have a value between 0 and 255, + * inclusive, and is the length of the option data that follows. + */ + if (len > 255) { + return(-1); + } + + /* + * The align parameter must have a value of 1, 2, 4, or 8. + * The align value can not exceed the value of len. + */ + if (align != 1 && align != 2 && align != 4 && align != 8) + return(-1); + if (align > len) + return(-1); + + /* Calculate the padding length. */ + currentlen += 2 + len; /* 2 means "type + len" */ + if (currentlen % align) + padlen = align - (currentlen % align); + + /* The option must fit in the extension header buffer. */ + currentlen += padlen; + if (extlen && /* XXX: right? */ + currentlen > extlen) + return(-1); + + if (extbuf) { + u_int8_t *optp = (u_int8_t *)extbuf + offset; + + if (padlen == 1) { + /* insert a Pad1 option */ + *optp = IP6OPT_PAD1; + optp++; + } + else if (padlen > 0) { + /* insert a PadN option for alignment */ + *optp++ = IP6OPT_PADN; + *optp++ = padlen - 2; + memset(optp, 0, padlen - 2); + optp += (padlen - 2); + } + + *optp++ = type; + *optp++ = len; + + *databufp = optp; + } + + return(currentlen); +} + +int +inet6_opt_finish(void *extbuf, socklen_t extlen, int offset) +{ + int updatelen = offset > 0 ? (1 + ((offset - 1) | 7)) : 0;; + + if (extbuf) { + u_int8_t *padp; + int padlen = updatelen - offset; + + if (updatelen > extlen) + return(-1); + + padp = (u_int8_t *)extbuf + offset; + if (padlen == 1) + *padp = IP6OPT_PAD1; + else if (padlen > 0) { + *padp++ = IP6OPT_PADN; + *padp++ = (padlen - 2); + memset(padp, 0, padlen - 2); + } + } + + return(updatelen); +} + +int +inet6_opt_set_val(void *databuf, int offset, void *val, socklen_t vallen) +{ + memcpy((u_int8_t *)databuf + offset, val, vallen); + return(offset + vallen); +} + +int +inet6_opt_next(void *extbuf, socklen_t extlen, int offset, u_int8_t *typep, socklen_t *lenp, void **databufp) +{ + u_int8_t *optp, *lim; + int optlen; + + /* Validate extlen. XXX: is the variable really necessary?? */ + if (extlen == 0 || (extlen % 8)) + return(-1); + lim = (u_int8_t *)extbuf + extlen; + + /* + * If this is the first time this function called for this options + * header, simply return the 1st option. + * Otherwise, search the option list for the next option. + */ + if (offset == 0) { + optp = (u_int8_t *)((struct ip6_hbh *)extbuf + 1); + } + else + optp = (u_int8_t *)extbuf + offset; + + /* Find the next option skipping any padding options. */ + while(optp < lim) { + switch(*optp) { + case IP6OPT_PAD1: + optp++; + break; + case IP6OPT_PADN: + if ((optlen = ip6optlen(optp, lim)) == 0) + goto optend; + optp += optlen; + break; + default: /* found */ + if ((optlen = ip6optlen(optp, lim)) == 0) + goto optend; + *typep = *optp; + *lenp = optlen - 2; + *databufp = optp + 2; + return(optp + optlen - (u_int8_t *)extbuf); + } + } + + optend: + *databufp = NULL; /* for safety */ + return(-1); +} + +int +inet6_opt_find(void *extbuf, socklen_t extlen, int offset, u_int8_t type, socklen_t *lenp, void **databufp) +{ + u_int8_t *optp, *lim; + int optlen; + + /* Validate extlen. XXX: is the variable really necessary?? */ + if (extlen == 0 || (extlen % 8)) + return(-1); + lim = (u_int8_t *)extbuf + extlen; + + /* + * If this is the first time this function called for this options + * header, simply return the 1st option. + * Otherwise, search the option list for the next option. + */ + if (offset == 0) { + optp = (u_int8_t *)((struct ip6_hbh *)extbuf + 1); + } + else + optp = (u_int8_t *)extbuf + offset; + + /* Find the specified option */ + while(optp < lim) { + if ((optlen = ip6optlen(optp, lim)) == 0) + goto optend; + + if (*optp == type) { /* found */ + *lenp = optlen - 2; + *databufp = optp + 2; + return(optp + optlen - (u_int8_t *)extbuf); + } + + optp += optlen; + } + + optend: + *databufp = NULL; /* for safety */ + return(-1); +} + +int +inet6_opt_get_val(void *databuf, int offset, void *val, socklen_t vallen) +{ + /* we can't assume alignment here */ + memcpy(val, (u_int8_t *)databuf + offset, vallen); + + return(offset + vallen); +} diff --git a/gen.subproj/rthdr.c b/gen.subproj/rthdr.c index 4f2385e..1031311 100644 --- a/gen.subproj/rthdr.c +++ b/gen.subproj/rthdr.c @@ -1,3 +1,5 @@ +/* $KAME: rthdr.c,v 1.19 2003/06/06 10:48:51 itojun Exp $ */ + /* * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. * All rights reserved. @@ -25,10 +27,18 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. - * - * $FreeBSD: src/lib/libc/net/rthdr.c,v 1.2 2000/03/03 11:12:59 shin Exp $ */ +/* __FBSDID("$FreeBSD: src/lib/libc/net/rthdr.c,v 1.9.10.1.4.1 2010/06/14 02:09:06 kensmith Exp $"); */ + +/* + * These routines support RFC 2292. + * __APPLE_USE_RFC_2292 selects the appropriate API in + */ +#define __APPLE_USE_RFC_2292 + +#include + #include #include #include @@ -39,272 +49,409 @@ #include #include +/* + * RFC2292 API + */ + size_t inet6_rthdr_space(type, seg) - int type, seg; +int type, seg; { - switch(type) { - case IPV6_RTHDR_TYPE_0: - if (seg < 1 || seg > 23) - return(0); - return(CMSG_SPACE(sizeof(struct in6_addr) * (seg - 1) - + sizeof(struct ip6_rthdr0))); - default: -#ifdef DEBUG - fprintf(stderr, "inet6_rthdr_space: unknown type(%d)\n", type); + switch (type) { + case IPV6_RTHDR_TYPE_0: + if (seg < 1 || seg > 23) + return (0); +#ifdef COMPAT_RFC2292 + return (CMSG_SPACE(sizeof(struct in6_addr) * (seg - 1) + + sizeof(struct ip6_rthdr0))); +#else + return (CMSG_SPACE(sizeof(struct in6_addr) * seg + + sizeof(struct ip6_rthdr0))); #endif - return(0); - } + default: + return (0); + } } struct cmsghdr * inet6_rthdr_init(bp, type) - void *bp; - int type; +void *bp; +int type; { - register struct cmsghdr *ch = (struct cmsghdr *)bp; - register struct ip6_rthdr *rthdr; - - rthdr = (struct ip6_rthdr *)CMSG_DATA(ch); - - ch->cmsg_level = IPPROTO_IPV6; - ch->cmsg_type = IPV6_RTHDR; - - switch(type) { - case IPV6_RTHDR_TYPE_0: - ch->cmsg_len = CMSG_LEN(sizeof(struct ip6_rthdr0) - sizeof(struct in6_addr)); - bzero(rthdr, sizeof(struct ip6_rthdr0)); - rthdr->ip6r_type = IPV6_RTHDR_TYPE_0; - return(ch); - default: -#ifdef DEBUG - fprintf(stderr, "inet6_rthdr_init: unknown type(%d)\n", type); + struct cmsghdr *ch = (struct cmsghdr *)bp; + struct ip6_rthdr *rthdr; + + rthdr = (struct ip6_rthdr *)CMSG_DATA(ch); + + ch->cmsg_level = IPPROTO_IPV6; + ch->cmsg_type = IPV6_RTHDR; + + switch (type) { + case IPV6_RTHDR_TYPE_0: +#ifdef COMPAT_RFC2292 + ch->cmsg_len = CMSG_LEN(sizeof(struct ip6_rthdr0) - + sizeof(struct in6_addr)); +#else + ch->cmsg_len = CMSG_LEN(sizeof(struct ip6_rthdr0)); #endif - return(NULL); - } + + bzero(rthdr, sizeof(struct ip6_rthdr0)); + rthdr->ip6r_type = IPV6_RTHDR_TYPE_0; + return (ch); + default: + return (NULL); + } } +/* ARGSUSED */ int inet6_rthdr_add(cmsg, addr, flags) - struct cmsghdr *cmsg; - const struct in6_addr *addr; - u_int flags; +struct cmsghdr *cmsg; +const struct in6_addr *addr; +u_int flags; { - register struct ip6_rthdr *rthdr; - - rthdr = (struct ip6_rthdr *)CMSG_DATA(cmsg); - - switch(rthdr->ip6r_type) { - case IPV6_RTHDR_TYPE_0: - { - struct ip6_rthdr0 *rt0 = (struct ip6_rthdr0 *)rthdr; - if (flags != IPV6_RTHDR_LOOSE && flags != IPV6_RTHDR_STRICT) { -#ifdef DEBUG - fprintf(stderr, "inet6_rthdr_add: unsupported flag(%d)\n", flags); + struct ip6_rthdr *rthdr; + + rthdr = (struct ip6_rthdr *)CMSG_DATA(cmsg); + + switch (rthdr->ip6r_type) { + case IPV6_RTHDR_TYPE_0: + { + struct ip6_rthdr0 *rt0 = (struct ip6_rthdr0 *)rthdr; + if (flags != IPV6_RTHDR_LOOSE && flags != IPV6_RTHDR_STRICT) + return (-1); + if (rt0->ip6r0_segleft == 23) + return (-1); + +#ifdef COMPAT_RFC1883 /* XXX */ + if (flags == IPV6_RTHDR_STRICT) { + int c, b; + c = rt0->ip6r0_segleft / 8; + b = rt0->ip6r0_segleft % 8; + rt0->ip6r0_slmap[c] |= (1 << (7 - b)); + } +#else + if (flags != IPV6_RTHDR_LOOSE) + return (-1); #endif - return(-1); - } - if (rt0->ip6r0_segleft == 23) { -#ifdef DEBUG - fprintf(stderr, "inet6_rthdr_add: segment overflow\n"); -#endif - return(-1); - } - if (flags == IPV6_RTHDR_STRICT) { - int c, b; - c = rt0->ip6r0_segleft / 8; - b = rt0->ip6r0_segleft % 8; - rt0->ip6r0_slmap[c] |= (1 << (7 - b)); - } - rt0->ip6r0_segleft++; - bcopy(addr, (caddr_t)rt0 + ((rt0->ip6r0_len + 1) << 3), - sizeof(struct in6_addr)); - rt0->ip6r0_len += sizeof(struct in6_addr) >> 3; - cmsg->cmsg_len = CMSG_LEN((rt0->ip6r0_len + 1) << 3); - break; - } - default: -#ifdef DEBUG - fprintf(stderr, "inet6_rthdr_add: unknown type(%d)\n", - rthdr->ip6r_type); -#endif - return(-1); - } + rt0->ip6r0_segleft++; + bcopy(addr, (caddr_t)rt0 + ((rt0->ip6r0_len + 1) << 3), + sizeof(struct in6_addr)); + rt0->ip6r0_len += sizeof(struct in6_addr) >> 3; + cmsg->cmsg_len = CMSG_LEN((rt0->ip6r0_len + 1) << 3); + break; + } + default: + return (-1); + } - return(0); + return (0); } +/* ARGSUSED */ int inet6_rthdr_lasthop(cmsg, flags) - struct cmsghdr *cmsg; - unsigned int flags; +struct cmsghdr *cmsg; +unsigned int flags; { - register struct ip6_rthdr *rthdr; - - rthdr = (struct ip6_rthdr *)CMSG_DATA(cmsg); - - switch(rthdr->ip6r_type) { - case IPV6_RTHDR_TYPE_0: - { - struct ip6_rthdr0 *rt0 = (struct ip6_rthdr0 *)rthdr; - if (flags != IPV6_RTHDR_LOOSE && flags != IPV6_RTHDR_STRICT) { -#ifdef DEBUG - fprintf(stderr, "inet6_rthdr_lasthop: unsupported flag(%d)\n", flags); -#endif - return(-1); - } - if (rt0->ip6r0_segleft > 23) { -#ifdef DEBUG - fprintf(stderr, "inet6_rthdr_add: segment overflow\n"); -#endif - return(-1); - } - if (flags == IPV6_RTHDR_STRICT) { - int c, b; - c = rt0->ip6r0_segleft / 8; - b = rt0->ip6r0_segleft % 8; - rt0->ip6r0_slmap[c] |= (1 << (7 - b)); - } - break; - } - default: -#ifdef DEBUG - fprintf(stderr, "inet6_rthdr_lasthop: unknown type(%d)\n", - rthdr->ip6r_type); -#endif - return(-1); - } + struct ip6_rthdr *rthdr; + + rthdr = (struct ip6_rthdr *)CMSG_DATA(cmsg); + + switch (rthdr->ip6r_type) { + case IPV6_RTHDR_TYPE_0: + { + struct ip6_rthdr0 *rt0 = (struct ip6_rthdr0 *)rthdr; +#ifdef COMPAT_RFC1883 /* XXX */ + if (flags != IPV6_RTHDR_LOOSE && flags != IPV6_RTHDR_STRICT) + return (-1); +#endif /* COMPAT_RFC1883 */ + if (rt0->ip6r0_segleft > 23) + return (-1); +#ifdef COMPAT_RFC1883 /* XXX */ + if (flags == IPV6_RTHDR_STRICT) { + int c, b; + c = rt0->ip6r0_segleft / 8; + b = rt0->ip6r0_segleft % 8; + rt0->ip6r0_slmap[c] |= (1 << (7 - b)); + } +#else + if (flags != IPV6_RTHDR_LOOSE) + return (-1); +#endif /* COMPAT_RFC1883 */ + break; + } + default: + return (-1); + } - return(0); + return (0); } #if 0 int inet6_rthdr_reverse(in, out) - const struct cmsghdr *in; - struct cmsghdr *out; +const struct cmsghdr *in; +struct cmsghdr *out; { -#ifdef DEBUG - fprintf(stderr, "inet6_rthdr_reverse: not implemented yet\n"); -#endif - return -1; + + return (-1); } #endif int inet6_rthdr_segments(cmsg) - const struct cmsghdr *cmsg; +const struct cmsghdr *cmsg; { - register struct ip6_rthdr *rthdr; + struct ip6_rthdr *rthdr; - rthdr = (struct ip6_rthdr *)CMSG_DATA(cmsg); + rthdr = (struct ip6_rthdr *)CMSG_DATA(cmsg); - switch(rthdr->ip6r_type) { - case IPV6_RTHDR_TYPE_0: - { - struct ip6_rthdr0 *rt0 = (struct ip6_rthdr0 *)rthdr; + switch (rthdr->ip6r_type) { + case IPV6_RTHDR_TYPE_0: + { + struct ip6_rthdr0 *rt0 = (struct ip6_rthdr0 *)rthdr; - if (rt0->ip6r0_len % 2 || 46 < rt0->ip6r0_len) { -#ifdef DEBUG - fprintf(stderr, "inet6_rthdr_segments: invalid size(%d)\n", - rt0->ip6r0_len); -#endif - return -1; - } + if (rt0->ip6r0_len % 2 || 46 < rt0->ip6r0_len) + return (-1); - return (rt0->ip6r0_len * 8) / sizeof(struct in6_addr); - } + return (rt0->ip6r0_len * 8) / sizeof(struct in6_addr); + } - default: -#ifdef DEBUG - fprintf(stderr, "inet6_rthdr_segments: unknown type(%d)\n", - rthdr->ip6r_type); -#endif - return -1; - } + default: + return (-1); + } } struct in6_addr * -inet6_rthdr_getaddr(cmsg, index) - struct cmsghdr *cmsg; - int index; +inet6_rthdr_getaddr(cmsg, idx) +struct cmsghdr *cmsg; +int idx; { - register struct ip6_rthdr *rthdr; + struct ip6_rthdr *rthdr; + + rthdr = (struct ip6_rthdr *)CMSG_DATA(cmsg); + + switch (rthdr->ip6r_type) { + case IPV6_RTHDR_TYPE_0: + { + struct ip6_rthdr0 *rt0 = (struct ip6_rthdr0 *)rthdr; + int naddr; + + if (rt0->ip6r0_len % 2 || 46 < rt0->ip6r0_len) + return NULL; + naddr = (rt0->ip6r0_len * 8) / sizeof(struct in6_addr); + if (idx <= 0 || naddr < idx) + return NULL; +#ifdef COMPAT_RFC2292 + return (((struct in6_addr *)(rt0 + 1)) + idx - 1); +#else + return (((struct in6_addr *)(rt0 + 1)) + idx); +#endif + } - rthdr = (struct ip6_rthdr *)CMSG_DATA(cmsg); + default: + return NULL; + } +} - switch(rthdr->ip6r_type) { - case IPV6_RTHDR_TYPE_0: - { - struct ip6_rthdr0 *rt0 = (struct ip6_rthdr0 *)rthdr; - int naddr; +int +inet6_rthdr_getflags(cmsg, idx) +const struct cmsghdr *cmsg; +int idx; +{ + struct ip6_rthdr *rthdr; + + rthdr = (struct ip6_rthdr *)CMSG_DATA(cmsg); + + switch (rthdr->ip6r_type) { + case IPV6_RTHDR_TYPE_0: + { + struct ip6_rthdr0 *rt0 = (struct ip6_rthdr0 *)rthdr; + int naddr; + + if (rt0->ip6r0_len % 2 || 46 < rt0->ip6r0_len) + return (-1); + naddr = (rt0->ip6r0_len * 8) / sizeof(struct in6_addr); + if (idx < 0 || naddr < idx) + return (-1); +#ifdef COMPAT_RFC1883 /* XXX */ + if (rt0->ip6r0_slmap[idx / 8] & (0x80 >> (idx % 8))) + return IPV6_RTHDR_STRICT; + else + return IPV6_RTHDR_LOOSE; +#else + return IPV6_RTHDR_LOOSE; +#endif /* COMPAT_RFC1883 */ + } + + default: + return (-1); + } +} - if (rt0->ip6r0_len % 2 || 46 < rt0->ip6r0_len) { -#ifdef DEBUG - fprintf(stderr, "inet6_rthdr_getaddr: invalid size(%d)\n", - rt0->ip6r0_len); -#endif - return NULL; +/* + * RFC3542 API + */ + +socklen_t +inet6_rth_space(int type, int segments) +{ + switch (type) { + case IPV6_RTHDR_TYPE_0: + if ((segments >= 0) && (segments <= 127)) + return (((segments * 2) + 1) << 3); + /* FALLTHROUGH */ + default: + return (0); /* type not suppported */ } - naddr = (rt0->ip6r0_len * 8) / sizeof(struct in6_addr); - if (index <= 0 || naddr < index) { -#ifdef DEBUG - fprintf(stderr, "inet6_rthdr_getaddr: invalid index(%d)\n", index); -#endif - return NULL; +} + +void * +inet6_rth_init(void *bp, socklen_t bp_len, int type, int segments) +{ + struct ip6_rthdr *rth = (struct ip6_rthdr *)bp; + struct ip6_rthdr0 *rth0; + + switch (type) { + case IPV6_RTHDR_TYPE_0: + /* length validation */ + if (bp_len < inet6_rth_space(IPV6_RTHDR_TYPE_0, segments)) + return (NULL); + /* segment validation */ + if ((segments < 0) || (segments > 127)) + return (NULL); + + memset(bp, 0, bp_len); + rth0 = (struct ip6_rthdr0 *)rth; + rth0->ip6r0_len = segments * 2; + rth0->ip6r0_type = IPV6_RTHDR_TYPE_0; + rth0->ip6r0_segleft = 0; + rth0->ip6r0_reserved = 0; + break; + default: + return (NULL); /* type not supported */ } - return &rt0->ip6r0_addr[index - 1]; - } - default: -#ifdef DEBUG - fprintf(stderr, "inet6_rthdr_getaddr: unknown type(%d)\n", - rthdr->ip6r_type); -#endif - return NULL; - } + return (bp); } int -inet6_rthdr_getflags(cmsg, index) - const struct cmsghdr *cmsg; - int index; +inet6_rth_add(void *bp, const struct in6_addr *addr) { - register struct ip6_rthdr *rthdr; + struct ip6_rthdr *rth = (struct ip6_rthdr *)bp; + struct ip6_rthdr0 *rth0; + struct in6_addr *nextaddr; + + switch (rth->ip6r_type) { + case IPV6_RTHDR_TYPE_0: + rth0 = (struct ip6_rthdr0 *)rth; + /* Don't exceed the number of stated segments */ + if (rth0->ip6r0_segleft == (rth0->ip6r0_len / 2)) + return (-1); + nextaddr = (struct in6_addr *)(rth0 + 1) + rth0->ip6r0_segleft; + *nextaddr = *addr; + rth0->ip6r0_segleft++; + break; + default: + return (-1); /* type not supported */ + } + + return (0); +} - rthdr = (struct ip6_rthdr *)CMSG_DATA(cmsg); +int +inet6_rth_reverse(const void *in, void *out) +{ + struct ip6_rthdr *rth_in = (struct ip6_rthdr *)in; + struct ip6_rthdr0 *rth0_in, *rth0_out; + int i, segments; + + switch (rth_in->ip6r_type) { + case IPV6_RTHDR_TYPE_0: + rth0_in = (struct ip6_rthdr0 *)in; + rth0_out = (struct ip6_rthdr0 *)out; + + /* parameter validation XXX too paranoid? */ + if (rth0_in->ip6r0_len % 2) + return (-1); + segments = rth0_in->ip6r0_len / 2; + + /* we can't use memcpy here, since in and out may overlap */ + memmove((void *)rth0_out, (void *)rth0_in, + ((rth0_in->ip6r0_len) + 1) << 3); + rth0_out->ip6r0_segleft = segments; + + /* reverse the addresses */ + for (i = 0; i < segments / 2; i++) { + struct in6_addr addr_tmp, *addr1, *addr2; + + addr1 = (struct in6_addr *)(rth0_out + 1) + i; + addr2 = (struct in6_addr *)(rth0_out + 1) + + (segments - i - 1); + addr_tmp = *addr1; + *addr1 = *addr2; + *addr2 = addr_tmp; + } + + break; + default: + return (-1); /* type not supported */ + } - switch(rthdr->ip6r_type) { - case IPV6_RTHDR_TYPE_0: - { - struct ip6_rthdr0 *rt0 = (struct ip6_rthdr0 *)rthdr; - int naddr; + return (0); +} - if (rt0->ip6r0_len % 2 || 46 < rt0->ip6r0_len) { -#ifdef DEBUG - fprintf(stderr, "inet6_rthdr_getflags: invalid size(%d)\n", - rt0->ip6r0_len); -#endif - return -1; +int +inet6_rth_segments(const void *bp) +{ + struct ip6_rthdr *rh = (struct ip6_rthdr *)bp; + struct ip6_rthdr0 *rh0; + int addrs; + + switch (rh->ip6r_type) { + case IPV6_RTHDR_TYPE_0: + rh0 = (struct ip6_rthdr0 *)bp; + + /* + * Validation for a type-0 routing header. + * Is this too strict? + */ + if ((rh0->ip6r0_len % 2) != 0 || + (addrs = (rh0->ip6r0_len >> 1)) < rh0->ip6r0_segleft) + return (-1); + + return (addrs); + default: + return (-1); /* unknown type */ } - naddr = (rt0->ip6r0_len * 8) / sizeof(struct in6_addr); - if (index < 0 || naddr < index) { -#ifdef DEBUG - fprintf(stderr, "inet6_rthdr_getflags: invalid index(%d)\n", index); -#endif - return -1; +} + +struct in6_addr * +inet6_rth_getaddr(const void *bp, int idx) +{ + struct ip6_rthdr *rh = (struct ip6_rthdr *)bp; + struct ip6_rthdr0 *rh0; + int addrs; + + switch (rh->ip6r_type) { + case IPV6_RTHDR_TYPE_0: + rh0 = (struct ip6_rthdr0 *)bp; + + /* + * Validation for a type-0 routing header. + * Is this too strict? + */ + if ((rh0->ip6r0_len % 2) != 0 || + (addrs = (rh0->ip6r0_len >> 1)) < rh0->ip6r0_segleft) + return (NULL); + + if (idx < 0 || addrs <= idx) + return (NULL); + + return (((struct in6_addr *)(rh0 + 1)) + idx); + default: + return (NULL); /* unknown type */ + break; } - if (rt0->ip6r0_slmap[index / 8] & (0x80 >> (index % 8))) - return IPV6_RTHDR_STRICT; - else - return IPV6_RTHDR_LOOSE; - } - - default: -#ifdef DEBUG - fprintf(stderr, "inet6_rthdr_getflags: unknown type(%d)\n", - rthdr->ip6r_type); -#endif - return -1; - } } diff --git a/lookup.subproj/Makefile b/lookup.subproj/Makefile deleted file mode 100644 index f7b15bd..0000000 --- a/lookup.subproj/Makefile +++ /dev/null @@ -1,66 +0,0 @@ -Project = lookup -ProductType = staticlib -Install_Dir = /scratch -BuildDebug = YES -BuildProfile = YES - -PRODUCT = $(shell tconf --product) - -HFILES = aliasdb.h bootparams.h ils.h kvbuf.h libinfo.h netdb.h netdb_async.h \ - printerdb.h si_data.h si_module.h thread_data.h - -CFILES = cache_module.c file_module.c ils.c kvbuf.c libinfo.c\ - mdns_module.c \ - search_module.c si_data.c si_getaddrinfo.c si_module.c thread_data.c - -ifeq ($(PRODUCT),MacOSX) -CFILES += ds_module.c -USERDEFS = /usr/local/include/DSlibinfoMIG.defs -SERVERDEFS = /usr/local/include/DSlibinfoMIGAsyncReply.defs -endif - -MANPAGES = bootparams.5 gai_strerror.3 getaddrinfo.3 getfsent.3 getgrent.3 \ - getgrouplist.3 getnameinfo.3 getnetgrent.3 getpwent.3 initgroups.3 - -Install_Headers = aliasdb.h bootparams.h netdb.h printerdb.h -Install_Private_Headers = ils.h kvbuf.h libinfo.h netdb_async.h si_data.h \ - si_module.h thread_data.h - -Extra_CC_Flags = -Wall -Werror -fno-common -I. \ - -I../gen.subproj \ - -D__MigTypeCheck=1 -D__DARWIN_NON_CANCELABLE=1 - -ifeq ($(PRODUCT),MacOSX) -Extra_CC_Flags += -DCONFIG_MAC -DDS_AVAILABLE -DSYNTH_ROOTFS -endif -ifeq ($(PRODUCT),AppleTV) -Extra_CC_Flags += -DCONFIG_APPLETV -endif -ifeq ($(PRODUCT),iPhone) -Extra_CC_Flags += -DCONFIG_IPHONE -endif - -include $(MAKEFILEPATH)/CoreOS/ReleaseControl/BSDCommon.make - -after_install: - $(LN) -f "$(DSTROOT)/usr/share/man/man3/getaddrinfo.3" \ - "$(DSTROOT)/usr/share/man/man3/freeaddrinfo.3" - @for LINK in endfsent.3 getfsfile.3 getfsspec.3 getfstype.3 \ - setfsent.3 ; do \ - $(LN) -f "$(DSTROOT)/usr/share/man/man3/getfsent.3" \ - "$(DSTROOT)/usr/share/man/man3/$${LINK}" ; \ - done - @for LINK in endgrent.3 getgrgid.3 getgrgid_r.3 getgrnam.3 \ - getgrnam_r.3 setgrent.3 setgroupent.3 ; do \ - $(LN) -f "$(DSTROOT)/usr/share/man/man3/getgrent.3" \ - "$(DSTROOT)/usr/share/man/man3/$${LINK}" ; \ - done - @for LINK in endnetgrent.3 innetgr.3 setnetgrent.3 ; do \ - $(LN) -f "$(DSTROOT)/usr/share/man/man3/getnetgrent.3" \ - "$(DSTROOT)/usr/share/man/man3/$${LINK}" ; \ - done - @for LINK in endpwent.3 getpwnam.3 getpwnam_r.3 getpwuid.3 \ - getpwuid_r.3 setpassent.3 setpwent.3 setpwfile.3 ; do \ - $(LN) -f "$(DSTROOT)/usr/share/man/man3/getpwent.3" \ - "$(DSTROOT)/usr/share/man/man3/$${LINK}" ; \ - done diff --git a/lookup.subproj/cache_module.c b/lookup.subproj/cache_module.c index 3fa0071..6a55ee1 100644 --- a/lookup.subproj/cache_module.c +++ b/lookup.subproj/cache_module.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2009 Apple Inc. All rights reserved. + * Copyright (c) 2008-2010 Apple Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -31,6 +31,7 @@ #include #include #include +#include /* GLOBAL */ uint32_t gL1CacheEnabled = 1; @@ -153,61 +154,61 @@ cache_fetch_list(si_mod_t *si, int cat) return list; } -__private_extern__ si_item_t * +static si_item_t * cache_user_byname(si_mod_t *si, const char *name) { return cache_fetch_item(si, CATEGORY_USER, name, 0, SEL_NAME); } -__private_extern__ si_item_t * +static si_item_t * cache_user_byuid(si_mod_t *si, uid_t uid) { return cache_fetch_item(si, CATEGORY_USER, NULL, uid, SEL_NUMBER); } -__private_extern__ si_list_t * +static si_list_t * cache_user_all(si_mod_t *si) { return cache_fetch_list(si, CATEGORY_USER); } -__private_extern__ si_item_t * +static si_item_t * cache_group_byname(si_mod_t *si, const char *name) { return cache_fetch_item(si, CATEGORY_GROUP, name, 0, SEL_NAME); } -__private_extern__ si_item_t * +static si_item_t * cache_group_bygid(si_mod_t *si, gid_t gid) { return cache_fetch_item(si, CATEGORY_GROUP, NULL, gid, SEL_NUMBER); } -__private_extern__ si_list_t * +static si_list_t * cache_group_all(si_mod_t *si) { return cache_fetch_list(si, CATEGORY_GROUP); } -__private_extern__ si_item_t * +static si_item_t * cache_grouplist(si_mod_t *si, const char *name) { return cache_fetch_item(si, CATEGORY_GROUPLIST, name, 0, SEL_NAME); } -__private_extern__ si_item_t * +static si_item_t * cache_alias_byname(si_mod_t *si, const char *name) { return cache_fetch_item(si, CATEGORY_ALIAS, name, 0, SEL_NAME); } -__private_extern__ si_list_t * +static si_list_t * cache_alias_all(si_mod_t *si) { return cache_fetch_list(si, CATEGORY_ALIAS); } -__private_extern__ si_item_t * +static si_item_t * cache_host_byname(si_mod_t *si, const char *name, int af, const char *ignored, uint32_t *err) { si_item_t *item; @@ -223,7 +224,7 @@ cache_host_byname(si_mod_t *si, const char *name, int af, const char *ignored, u return item; } -__private_extern__ si_item_t * +static si_item_t * cache_host_byaddr(si_mod_t *si, const void *addr, int af, const char *ignored, uint32_t *err) { si_item_t *item; @@ -239,31 +240,31 @@ cache_host_byaddr(si_mod_t *si, const void *addr, int af, const char *ignored, u return item; } -__private_extern__ si_list_t * +static si_list_t * cache_host_all(si_mod_t *si) { return cache_fetch_list(si, CATEGORY_HOST); } -__private_extern__ si_item_t * +static si_item_t * cache_network_byname(si_mod_t *si, const char *name) { return cache_fetch_item(si, CATEGORY_NETWORK, name, 0, SEL_NAME); } -__private_extern__ si_item_t * +static si_item_t * cache_network_byaddr(si_mod_t *si, uint32_t addr) { return cache_fetch_item(si, CATEGORY_NETWORK, NULL, addr, SEL_NUMBER); } -__private_extern__ si_list_t * +static si_list_t * cache_network_all(si_mod_t *si) { return cache_fetch_list(si, CATEGORY_NETWORK); } -__private_extern__ si_item_t * +static si_item_t * cache_service_byname(si_mod_t *si, const char *name, const char *proto) { uint32_t pn; @@ -277,91 +278,91 @@ cache_service_byname(si_mod_t *si, const char *name, const char *proto) return cache_fetch_item(si, CATEGORY_SERVICE, name, pn, SEL_NAME); } -__private_extern__ si_item_t * +static si_item_t * cache_service_byport(si_mod_t *si, int port, const char *proto) { return cache_fetch_item(si, CATEGORY_SERVICE, proto, port, SEL_NUMBER); } -__private_extern__ si_list_t * +static si_list_t * cache_service_all(si_mod_t *si) { return cache_fetch_list(si, CATEGORY_SERVICE); } -__private_extern__ si_item_t * +static si_item_t * cache_protocol_byname(si_mod_t *si, const char *name) { return cache_fetch_item(si, CATEGORY_PROTOCOL, name, 0, SEL_NAME); } -__private_extern__ si_item_t * +static si_item_t * cache_protocol_bynumber(si_mod_t *si, int number) { return cache_fetch_item(si, CATEGORY_PROTOCOL, NULL, number, SEL_NUMBER); } -__private_extern__ si_list_t * +static si_list_t * cache_protocol_all(si_mod_t *si) { return cache_fetch_list(si, CATEGORY_PROTOCOL); } -__private_extern__ si_item_t * +static si_item_t * cache_rpc_byname(si_mod_t *si, const char *name) { return cache_fetch_item(si, CATEGORY_RPC, name, 0, SEL_NAME); } -__private_extern__ si_item_t * +static si_item_t * cache_rpc_bynumber(si_mod_t *si, int number) { return cache_fetch_item(si, CATEGORY_RPC, NULL, number, SEL_NUMBER); } -__private_extern__ si_list_t * +static si_list_t * cache_rpc_all(si_mod_t *si) { return cache_fetch_list(si, CATEGORY_RPC); } -__private_extern__ si_item_t * +static si_item_t * cache_fs_byspec(si_mod_t *si, const char *name) { return cache_fetch_item(si, CATEGORY_FS, name, 0, SEL_NAME); } -__private_extern__ si_item_t * +static si_item_t * cache_fs_byfile(si_mod_t *si, const char *name) { return cache_fetch_item(si, CATEGORY_FS, name, 0, SEL_NUMBER); } -__private_extern__ si_list_t * +static si_list_t * cache_fs_all(si_mod_t *si) { return cache_fetch_list(si, CATEGORY_FS); } -__private_extern__ si_item_t * +static si_item_t * cache_mac_byname(si_mod_t *si, const char *name) { return cache_fetch_item(si, CATEGORY_MAC, name, 0, SEL_NAME); } -__private_extern__ si_item_t * +static si_item_t * cache_mac_bymac(si_mod_t *si, const char *mac) { return cache_fetch_item(si, CATEGORY_MAC, mac, 0, SEL_NUMBER); } -__private_extern__ si_list_t * +static si_list_t * cache_mac_all(si_mod_t *si) { return cache_fetch_list(si, CATEGORY_MAC); } -__private_extern__ si_item_t * +static si_item_t * cache_nameinfo(si_mod_t *si, const struct sockaddr *sa, int flags, const char *ignored, uint32_t *err) { /* @@ -374,7 +375,7 @@ cache_nameinfo(si_mod_t *si, const struct sockaddr *sa, int flags, const char *i return NULL; } -__private_extern__ void +static void cache_close(si_mod_t *si) { cache_si_private_t *pp; @@ -396,92 +397,89 @@ cache_close(si_mod_t *si) } } - free(si->private); + free(pp); } -__private_extern__ si_mod_t * -si_module_static_cache() +si_mod_t * +si_module_static_cache(void) { - si_mod_t *out; - char *outname; - cache_si_private_t *pp; - - out = (si_mod_t *)calloc(1, sizeof(si_mod_t)); - outname = strdup("cache"); - pp = (cache_si_private_t *)calloc(1, sizeof(cache_si_private_t)); - - if ((out == NULL) || (outname == NULL) || (pp == NULL)) + static const struct si_mod_vtable_s cache_vtable = { - if (out != NULL) free(out); - if (outname != NULL) free(outname); - if (pp != NULL) free(pp); + .sim_close = &cache_close, - errno = ENOMEM; - return NULL; - } + .sim_user_byname = &cache_user_byname, + .sim_user_byuid = &cache_user_byuid, + .sim_user_all = &cache_user_all, - out->name = outname; - out->vers = 1; - out->refcount = 1; - out->private = pp; + .sim_group_byname = &cache_group_byname, + .sim_group_bygid = &cache_group_bygid, + .sim_group_all = &cache_group_all, - out->sim_close = cache_close; + .sim_grouplist = &cache_grouplist, - out->sim_user_byname = cache_user_byname; - out->sim_user_byuid = cache_user_byuid; - out->sim_user_all = cache_user_all; + /* no netgroup support */ + .sim_netgroup_byname = NULL, + .sim_in_netgroup = NULL, - out->sim_group_byname = cache_group_byname; - out->sim_group_bygid = cache_group_bygid; - out->sim_group_all = cache_group_all; + .sim_alias_byname = &cache_alias_byname, + .sim_alias_all = &cache_alias_all, - out->sim_grouplist = cache_grouplist; + .sim_host_byname = &cache_host_byname, + .sim_host_byaddr = &cache_host_byaddr, + .sim_host_all = &cache_host_all, - /* no netgroup support */ - out->sim_netgroup_byname = NULL; - out->sim_in_netgroup = NULL; + .sim_network_byname = &cache_network_byname, + .sim_network_byaddr = &cache_network_byaddr, + .sim_network_all = &cache_network_all, - out->sim_alias_byname = cache_alias_byname; - out->sim_alias_all = cache_alias_all; + .sim_service_byname = &cache_service_byname, + .sim_service_byport = &cache_service_byport, + .sim_service_all = &cache_service_all, - out->sim_host_byname = cache_host_byname; - out->sim_host_byaddr = cache_host_byaddr; - out->sim_host_all = cache_host_all; + .sim_protocol_byname = &cache_protocol_byname, + .sim_protocol_bynumber = &cache_protocol_bynumber, + .sim_protocol_all = &cache_protocol_all, - out->sim_network_byname = cache_network_byname; - out->sim_network_byaddr = cache_network_byaddr; - out->sim_network_all = cache_network_all; + .sim_rpc_byname = &cache_rpc_byname, + .sim_rpc_bynumber = &cache_rpc_bynumber, + .sim_rpc_all = &cache_rpc_all, - out->sim_service_byname = cache_service_byname; - out->sim_service_byport = cache_service_byport; - out->sim_service_all = cache_service_all; + .sim_fs_byspec = &cache_fs_byspec, + .sim_fs_byfile = &cache_fs_byfile, + .sim_fs_all = &cache_fs_all, - out->sim_protocol_byname = cache_protocol_byname; - out->sim_protocol_bynumber = cache_protocol_bynumber; - out->sim_protocol_all = cache_protocol_all; + .sim_mac_byname = &cache_mac_byname, + .sim_mac_bymac = &cache_mac_bymac, + .sim_mac_all = &cache_mac_all, - out->sim_rpc_byname = cache_rpc_byname; - out->sim_rpc_bynumber = cache_rpc_bynumber; - out->sim_rpc_all = cache_rpc_all; + /* no addrinfo support */ + .sim_wants_addrinfo = NULL, + .sim_addrinfo = NULL, - out->sim_fs_byspec = cache_fs_byspec; - out->sim_fs_byfile = cache_fs_byfile; - out->sim_fs_all = cache_fs_all; + .sim_nameinfo = &cache_nameinfo, + }; + + static si_mod_t si = + { + .vers = 1, + .refcount = 1, + .flags = SI_MOD_FLAG_STATIC, - out->sim_mac_byname = cache_mac_byname; - out->sim_mac_bymac = cache_mac_bymac; - out->sim_mac_all = cache_mac_all; + .private = NULL, + .vtable = &cache_vtable, + }; - /* no addrinfo support */ - out->sim_wants_addrinfo = NULL; - out->sim_addrinfo = NULL; + static dispatch_once_t once; - out->sim_nameinfo = cache_nameinfo; + dispatch_once(&once, ^{ + si.name = strdup("cache"); + si.private = calloc(1, sizeof(cache_si_private_t)); + }); - return out; + return &si; } -__private_extern__ void +void si_cache_add_item(si_mod_t *si, si_mod_t *src, si_item_t *item) { cache_si_private_t *pp; @@ -516,7 +514,7 @@ si_cache_add_item(si_mod_t *si, si_mod_t *src, si_item_t *item) OSSpinLockUnlock(&(pp->cache_store[cat].lock)); } -__private_extern__ void +void si_cache_add_list(si_mod_t *si, si_mod_t *src, si_list_t *list) { cache_si_private_t *pp; diff --git a/lookup.subproj/ds_module.c b/lookup.subproj/ds_module.c index ac3af3d..8d36360 100644 --- a/lookup.subproj/ds_module.c +++ b/lookup.subproj/ds_module.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2009 Apple Inc. All rights reserved. + * Copyright (c) 2008-2010 Apple Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -21,28 +21,40 @@ * @APPLE_LICENSE_HEADER_END@ */ +#include + +kern_return_t +libinfoDSmig_do_Response_async(mach_port_t server, char *reply, mach_msg_type_number_t replyCnt, vm_offset_t ooreply, mach_msg_type_number_t ooreplyCnt, mach_vm_address_t callbackAddr, security_token_t servertoken) +{ + return KERN_SUCCESS; +} + +#ifdef DS_AVAILABLE + #include +#include #include #include #include #include #include #include -#include #include -#include +#include "kvbuf.h" #include #include #include #include #include +#include #include #include #include #include #include -#include -#include +#include +#include "DSlibinfoMIG.h" +#include "DSmemberdMIG.h" #ifdef DEBUG #include #endif @@ -62,36 +74,76 @@ /* ONLY TO BE USED BY getipv6nodebyaddr */ #define WANT_A6_OR_MAPPED_A4_IF_NO_A6 5 -#define DS_NOTIFICATION_KEY_GLOBAL "com.apple.system.DirectoryService.InvalidateCache" -#define DS_NOTIFICATION_KEY_USER "com.apple.system.DirectoryService.InvalidateCache.user" -#define DS_NOTIFICATION_KEY_GROUP "com.apple.system.DirectoryService.InvalidateCache.group" -#define DS_NOTIFICATION_KEY_HOST "com.apple.system.DirectoryService.InvalidateCache.host" -#define DS_NOTIFICATION_KEY_SERVICE "com.apple.system.DirectoryService.InvalidateCache.service" - #define MAX_LOOKUP_ATTEMPTS 10 #define INET_NTOP_AF_INET_OFFSET 4 #define INET_NTOP_AF_INET6_OFFSET 8 -extern mach_port_t _ds_port; -extern int _ds_running(); +mach_port_t _ds_port; +mach_port_t _mbr_port; + extern uint32_t gL1CacheEnabled; static pthread_key_t _ds_serv_cache_key = 0; static void -_ds_serv_cache_free(void *x) +_ds_child(void) { - if (x != NULL) si_item_release(x); + _ds_port = MACH_PORT_NULL; + _mbr_port = MACH_PORT_NULL; } -__private_extern__ kern_return_t -libinfoDSmig_do_Response_async(mach_port_t server, char *reply, mach_msg_type_number_t replyCnt, vm_offset_t ooreply, mach_msg_type_number_t ooreplyCnt, mach_vm_address_t callbackAddr, security_token_t servertoken) +static int _si_opendirectory_disabled; + +void +_si_disable_opendirectory(void) { - return KERN_SUCCESS; + _si_opendirectory_disabled = 1; + _ds_port = MACH_PORT_NULL; + _mbr_port = MACH_PORT_NULL; } -__private_extern__ kern_return_t +int +_ds_running(void) +{ + kern_return_t status; + char *od_debug_mode = NULL; + + if (_ds_port != MACH_PORT_NULL) return 1; + + if (_si_opendirectory_disabled) return 0; + pthread_atfork(NULL, NULL, _ds_child); + + if (!issetugid()) { + od_debug_mode = getenv("OD_DEBUG_MODE"); + } + + if (od_debug_mode) { + status = bootstrap_look_up(bootstrap_port, kDSStdMachDSLookupPortName "_debug", &_ds_port); + } else { + status = bootstrap_look_up2(bootstrap_port, kDSStdMachDSLookupPortName, + &_ds_port, 0, BOOTSTRAP_PRIVILEGED_SERVER); + } + if ((status != BOOTSTRAP_SUCCESS) && (status != BOOTSTRAP_UNKNOWN_SERVICE)) _ds_port = MACH_PORT_NULL; + + if (od_debug_mode) { + status = bootstrap_look_up(bootstrap_port, kDSStdMachDSMembershipPortName "_debug", &_mbr_port); + } else { + status = bootstrap_look_up2(bootstrap_port, kDSStdMachDSMembershipPortName, + &_mbr_port, 0, BOOTSTRAP_PRIVILEGED_SERVER); + } + if ((status != BOOTSTRAP_SUCCESS) && (status != BOOTSTRAP_UNKNOWN_SERVICE)) _mbr_port = MACH_PORT_NULL; + + return (_ds_port != MACH_PORT_NULL); +} + +static void +_ds_serv_cache_free(void *x) +{ + if (x != NULL) si_item_release(x); +} + +static kern_return_t LI_DSLookupGetProcedureNumber(const char *name, int32_t *procno) { kern_return_t status; @@ -117,7 +169,7 @@ LI_DSLookupGetProcedureNumber(const char *name, int32_t *procno) if (status == MACH_SEND_INVALID_DEST) { mach_port_mod_refs(mach_task_self(), _ds_port, MACH_PORT_RIGHT_SEND, -1); - status = bootstrap_look_up(bootstrap_port, kDSStdMachDSLookupPortName, &_ds_port); + status = bootstrap_look_up2(bootstrap_port, kDSStdMachDSLookupPortName, &_ds_port, 0, BOOTSTRAP_PRIVILEGED_SERVER); if ((status != BOOTSTRAP_SUCCESS) && (status != BOOTSTRAP_UNKNOWN_SERVICE)) _ds_port = MACH_PORT_NULL; status = MIG_SERVER_DIED; } @@ -145,7 +197,7 @@ LI_DSLookupGetProcedureNumber(const char *name, int32_t *procno) return status; } -__private_extern__ kern_return_t +static kern_return_t LI_DSLookupQuery(int32_t procno, kvbuf_t *request, kvarray_t **reply) { kern_return_t status; @@ -185,7 +237,7 @@ LI_DSLookupQuery(int32_t procno, kvbuf_t *request, kvarray_t **reply) if (status == MACH_SEND_INVALID_DEST) { mach_port_mod_refs(mach_task_self(), _ds_port, MACH_PORT_RIGHT_SEND, -1); - status = bootstrap_look_up(bootstrap_port, kDSStdMachDSLookupPortName, &_ds_port); + status = bootstrap_look_up2(bootstrap_port, kDSStdMachDSLookupPortName, &_ds_port, 0, BOOTSTRAP_PRIVILEGED_SERVER); if ((status != BOOTSTRAP_SUCCESS) && (status != BOOTSTRAP_UNKNOWN_SERVICE)) _ds_port = MACH_PORT_NULL; status = MIG_SERVER_DIED; } @@ -204,18 +256,18 @@ LI_DSLookupQuery(int32_t procno, kvbuf_t *request, kvarray_t **reply) #ifdef DEBUG asl_log(NULL, NULL, ASL_LEVEL_DEBUG, "_DSLookupQuery %d auth failure uid=%d", procno, token.val[0]); #endif - if (oolen > 0) vm_deallocate(mach_task_self(), (vm_address_t)oobuf, oolen); + if ((oolen > 0) && (oobuf != 0)) vm_deallocate(mach_task_self(), (vm_address_t)oobuf, oolen); return KERN_FAILURE; } out = (kvbuf_t *)calloc(1, sizeof(kvbuf_t)); if (out == NULL) { - if (oolen > 0) vm_deallocate(mach_task_self(), (vm_address_t)oobuf, oolen); + if ((oolen > 0) && (oobuf != 0)) vm_deallocate(mach_task_self(), (vm_address_t)oobuf, oolen); return KERN_FAILURE; } - if (oolen > 0) + if ((oolen > 0) && (oobuf != 0)) { out->datalen = oolen; out->databuf = malloc(oolen); @@ -1195,7 +1247,7 @@ extract_mac_mac(si_mod_t *si, kvarray_t *in, void *extra, uint64_t valid_global, if ((cmac == NULL) && (string_equal(in->dict[d].key[k], "mac"))) { if (in->dict[d].vcount[k] == 0) continue; - cmac = si_canonical_mac_address(in->dict[d].val[k][0]); + cmac = si_standardize_mac_address(in->dict[d].val[k][0]); if (cmac == NULL) return NULL; } } @@ -1241,7 +1293,7 @@ extract_mac_name(si_mod_t *si, kvarray_t *in, void *extra, uint64_t valid_global return out; } -__private_extern__ si_item_t * +static si_item_t * ds_user_byname(si_mod_t *si, const char *name) { static int proc = -1; @@ -1257,7 +1309,7 @@ ds_user_byname(si_mod_t *si, const char *name) return item; } -__private_extern__ si_item_t * +static si_item_t * ds_user_byuid(si_mod_t *si, uid_t uid) { static int proc = -1; @@ -1275,7 +1327,7 @@ ds_user_byuid(si_mod_t *si, uid_t uid) return item; } -__private_extern__ si_list_t * +static si_list_t * ds_user_all(si_mod_t *si) { static int proc = -1; @@ -1283,7 +1335,7 @@ ds_user_all(si_mod_t *si) return ds_list(si, CATEGORY_USER, "getpwent", &proc, NULL, extract_user, NULL); } -__private_extern__ si_item_t * +static si_item_t * ds_group_byname(si_mod_t *si, const char *name) { static int proc = -1; @@ -1299,7 +1351,7 @@ ds_group_byname(si_mod_t *si, const char *name) return item; } -__private_extern__ si_item_t * +static si_item_t * ds_group_bygid(si_mod_t *si, gid_t gid) { static int proc = -1; @@ -1317,7 +1369,7 @@ ds_group_bygid(si_mod_t *si, gid_t gid) return item; } -__private_extern__ si_list_t * +static si_list_t * ds_group_all(si_mod_t *si) { static int proc = -1; @@ -1325,11 +1377,11 @@ ds_group_all(si_mod_t *si) return ds_list(si, CATEGORY_GROUP, "getgrent", &proc, NULL, extract_group, NULL); } -__private_extern__ si_item_t * +static si_item_t * ds_grouplist(si_mod_t *si, const char *name) { struct passwd *pw; - kern_return_t kstatus; + kern_return_t kstatus, ks2; uint32_t i, j, count, uid, basegid, gidptrCnt; int32_t *gidp; gid_t *gidptr; @@ -1338,6 +1390,7 @@ ds_grouplist(si_mod_t *si, const char *name) char **gidlist; uint64_t va, vb; size_t gidptrsz; + int n; if (name == NULL) return NULL; @@ -1356,10 +1409,32 @@ ds_grouplist(si_mod_t *si, const char *name) gidptrsz = 0; memset(&token, 0, sizeof(audit_token_t)); - kstatus = memberdDSmig_GetAllGroups(_ds_port, uid, &count, &gidptr, &gidptrCnt, &token); + if (_mbr_port == MACH_PORT_NULL) + { + kstatus = bootstrap_look_up2(bootstrap_port, kDSStdMachDSMembershipPortName, &_mbr_port, 0, BOOTSTRAP_PRIVILEGED_SERVER); + } + + for (n = 0; n < MAX_LOOKUP_ATTEMPTS; n++) + { + kstatus = memberdDSmig_GetAllGroups(_mbr_port, uid, &count, &gidptr, &gidptrCnt, &token); + if (kstatus != MACH_SEND_INVALID_DEST) break; + + mach_port_mod_refs(mach_task_self(), _mbr_port, MACH_PORT_RIGHT_SEND, -1); + + ks2 = bootstrap_look_up2(bootstrap_port, kDSStdMachDSMembershipPortName, &_mbr_port, 0, BOOTSTRAP_PRIVILEGED_SERVER); + if ((ks2 != BOOTSTRAP_SUCCESS) && (ks2 != BOOTSTRAP_UNKNOWN_SERVICE)) + { + _mbr_port = MACH_PORT_NULL; + break; + } + } + if (kstatus != KERN_SUCCESS) return NULL; + if (gidptr == NULL) return NULL; - gidptrsz = gidptrCnt * sizeof(gid_t); + /* gidptrCnt is the size, but it was set to number of groups (by DS) in 10.6 and earlier */ + gidptrsz = gidptrCnt; + if (count == gidptrCnt) gidptrsz = gidptrCnt * sizeof(gid_t); if ((audit_token_uid(token) != 0) || (count == 0)) { @@ -1409,7 +1484,7 @@ ds_grouplist(si_mod_t *si, const char *name) return item; } -__private_extern__ si_list_t * +static si_list_t * ds_netgroup_byname(si_mod_t *si, const char *name) { static int proc = -1; @@ -1450,7 +1525,7 @@ check_innetgr(kvarray_t *in) return 0; } -__private_extern__ int +static int ds_in_netgroup(si_mod_t *si, const char *group, const char *host, const char *user, const char *domain) { int is_innetgr; @@ -1487,7 +1562,7 @@ ds_in_netgroup(si_mod_t *si, const char *group, const char *host, const char *us return is_innetgr; } -__private_extern__ si_item_t * +static si_item_t * ds_alias_byname(si_mod_t *si, const char *name) { static int proc = -1; @@ -1503,7 +1578,7 @@ ds_alias_byname(si_mod_t *si, const char *name) return item; } -__private_extern__ si_list_t * +static si_list_t * ds_alias_all(si_mod_t *si) { static int proc = -1; @@ -1511,7 +1586,7 @@ ds_alias_all(si_mod_t *si) return ds_list(si, CATEGORY_ALIAS, "alias_getent", &proc, NULL, extract_alias, NULL); } -__private_extern__ si_item_t * +static si_item_t * ds_host_byname(si_mod_t *si, const char *name, int af, const char *ignored, uint32_t *err) { static int proc = -1; @@ -1563,7 +1638,7 @@ ds_host_byname(si_mod_t *si, const char *name, int af, const char *ignored, uint return item; } -__private_extern__ si_item_t * +static si_item_t * ds_host_byaddr(si_mod_t *si, const void *addr, int af, const char *ignored, uint32_t *err) { static int proc = -1; @@ -1626,7 +1701,7 @@ ds_host_byaddr(si_mod_t *si, const void *addr, int af, const char *ignored, uint return item; } -__private_extern__ si_list_t * +static si_list_t * ds_host_all(si_mod_t *si) { static int proc = -1; @@ -1634,7 +1709,7 @@ ds_host_all(si_mod_t *si) return ds_list(si, CATEGORY_HOST_IPV4, "gethostent", &proc, NULL, extract_host, NULL); } -__private_extern__ si_item_t * +static si_item_t * ds_network_byname(si_mod_t *si, const char *name) { static int proc = -1; @@ -1650,7 +1725,7 @@ ds_network_byname(si_mod_t *si, const char *name) return item; } -__private_extern__ si_item_t * +static si_item_t * ds_network_byaddr(si_mod_t *si, uint32_t addr) { static int proc = -1; @@ -1678,7 +1753,7 @@ ds_network_byaddr(si_mod_t *si, uint32_t addr) return item; } -__private_extern__ si_list_t * +static si_list_t * ds_network_all(si_mod_t *si) { static int proc = -1; @@ -1686,7 +1761,7 @@ ds_network_all(si_mod_t *si) return ds_list(si, CATEGORY_NETWORK, "getnetent", &proc, NULL, extract_network, NULL); } -__private_extern__ si_item_t * +static si_item_t * ds_service_byname(si_mod_t *si, const char *name, const char *proto) { static int proc = -1; @@ -1714,7 +1789,7 @@ ds_service_byname(si_mod_t *si, const char *name, const char *proto) return item; } -__private_extern__ si_item_t * +static si_item_t * ds_service_byport(si_mod_t *si, int port, const char *proto) { static int proc = -1; @@ -1737,7 +1812,7 @@ ds_service_byport(si_mod_t *si, int port, const char *proto) return item; } -__private_extern__ si_list_t * +static si_list_t * ds_service_all(si_mod_t *si) { static int proc = -1; @@ -1745,7 +1820,7 @@ ds_service_all(si_mod_t *si) return ds_list(si, CATEGORY_SERVICE, "getservent", &proc, NULL, extract_service, NULL); } -__private_extern__ si_item_t * +static si_item_t * ds_protocol_byname(si_mod_t *si, const char *name) { static int proc = -1; @@ -1761,7 +1836,7 @@ ds_protocol_byname(si_mod_t *si, const char *name) return item; } -__private_extern__ si_item_t * +static si_item_t * ds_protocol_bynumber(si_mod_t *si, int number) { static int proc = -1; @@ -1779,7 +1854,7 @@ ds_protocol_bynumber(si_mod_t *si, int number) return item; } -__private_extern__ si_list_t * +static si_list_t * ds_protocol_all(si_mod_t *si) { static int proc = -1; @@ -1787,7 +1862,7 @@ ds_protocol_all(si_mod_t *si) return ds_list(si, CATEGORY_PROTOCOL, "getprotoent", &proc, NULL, extract_protocol, NULL); } -__private_extern__ si_item_t * +static si_item_t * ds_rpc_byname(si_mod_t *si, const char *name) { static int proc = -1; @@ -1803,7 +1878,7 @@ ds_rpc_byname(si_mod_t *si, const char *name) return item; } -__private_extern__ si_item_t * +static si_item_t * ds_rpc_bynumber(si_mod_t *si, int number) { static int proc = -1; @@ -1821,7 +1896,7 @@ ds_rpc_bynumber(si_mod_t *si, int number) return item; } -__private_extern__ si_list_t * +static si_list_t * ds_rpc_all(si_mod_t *si) { static int proc = -1; @@ -1829,7 +1904,7 @@ ds_rpc_all(si_mod_t *si) return ds_list(si, CATEGORY_RPC, "getrpcent", &proc, NULL, extract_rpc, NULL); } -__private_extern__ si_item_t * +static si_item_t * ds_fs_byspec(si_mod_t *si, const char *name) { static int proc = -1; @@ -1845,7 +1920,7 @@ ds_fs_byspec(si_mod_t *si, const char *name) return item; } -__private_extern__ si_list_t * +static si_list_t * ds_fs_all(si_mod_t *si) { static int proc = -1; @@ -1853,7 +1928,7 @@ ds_fs_all(si_mod_t *si) return ds_list(si, CATEGORY_FS, "getfsent", &proc, NULL, extract_fstab, NULL); } -__private_extern__ si_item_t * +static si_item_t * ds_fs_byfile(si_mod_t *si, const char *name) { si_item_t *item; @@ -1877,7 +1952,7 @@ ds_fs_byfile(si_mod_t *si, const char *name) return item; } -__private_extern__ si_item_t * +static si_item_t * ds_mac_byname(si_mod_t *si, const char *name) { static int proc = -1; @@ -1893,7 +1968,7 @@ ds_mac_byname(si_mod_t *si, const char *name) return item; } -__private_extern__ si_item_t * +static si_item_t * ds_mac_bymac(si_mod_t *si, const char *mac) { static int proc = -1; @@ -1901,7 +1976,7 @@ ds_mac_bymac(si_mod_t *si, const char *mac) si_item_t *item; char *cmac; - cmac = si_canonical_mac_address(mac); + cmac = si_standardize_mac_address(mac); if (cmac == NULL) return NULL; request = kvbuf_query_key_val("mac", cmac); @@ -1953,7 +2028,7 @@ ds_addrinfo(si_mod_t *si, const void *node, const void *serv, uint32_t family, u if (node != NULL) { - wantv4 = (family != AF_INET6); + wantv4 = ((family != AF_INET6) || (flags & AI_V4MAPPED)); wantv6 = (family != AF_INET); } @@ -2050,7 +2125,7 @@ ds_addrinfo(si_mod_t *si, const void *node, const void *serv, uint32_t family, u h_aliases_cnt = dict->vcount[k]; h_aliases = (const char **)calloc(h_aliases_cnt, sizeof(char *)); if (h_aliases == NULL) h_aliases_cnt = 0; - + for (i = 0; i < h_aliases_cnt; ++i) { h_aliases[i] = dict->val[k][i]; @@ -2073,7 +2148,7 @@ ds_addrinfo(si_mod_t *si, const void *node, const void *serv, uint32_t family, u a6_cnt = dict->vcount[k]; a6 = calloc(a6_cnt, sizeof(struct in6_addr)); if (a6 == NULL) a6_cnt = 0; - + for (i = 0; i < a6_cnt; ++i) { memset(&a6[i], 0, sizeof(struct in6_addr)); @@ -2095,7 +2170,7 @@ ds_addrinfo(si_mod_t *si, const void *node, const void *serv, uint32_t family, u s_aliases_cnt = dict->vcount[k]; s_aliases = (const char **)calloc(s_aliases_cnt+1, sizeof(char *)); if (s_aliases == NULL) s_aliases_cnt = 0; - + for (i = 0; i < s_aliases_cnt; ++i) { s_aliases[i] = dict->val[k][i]; @@ -2115,7 +2190,7 @@ ds_addrinfo(si_mod_t *si, const void *node, const void *serv, uint32_t family, u if (((wantv4 || wantv6) && (a4_cnt == 0) && (a6_cnt == 0)) || ((serv != NULL) && (s_port == 0))) { if (err != NULL) *err = SI_STATUS_EAI_NONAME; - + free(h_name); free(h_aliases); free(s_aliases); @@ -2157,14 +2232,14 @@ ds_addrinfo(si_mod_t *si, const void *node, const void *serv, uint32_t family, u out = NULL; for (i = 0; i < a6_cnt; i++) { - list = si_addrinfo_list(si, socktype, proto, NULL, &a6[i], s_port, scope, NULL, h_name); + list = si_addrinfo_list(si, flags, socktype, proto, NULL, &a6[i], s_port, scope, NULL, h_name); out = si_list_concat(out, list); si_list_release(list); } for (i = 0; i < a4_cnt; i++) { - list = si_addrinfo_list(si, socktype, proto, &a4[i], NULL, s_port, 0, h_name, NULL); + list = si_addrinfo_list(si, flags, socktype, proto, &a4[i], NULL, s_port, 0, h_name, NULL); out = si_list_concat(out, list); si_list_release(list); } @@ -2178,7 +2253,7 @@ ds_addrinfo(si_mod_t *si, const void *node, const void *serv, uint32_t family, u return out; } -__private_extern__ int +static int ds_is_valid(si_mod_t *si, si_item_t *item) { si_mod_t *src; @@ -2225,108 +2300,110 @@ ds_is_valid(si_mod_t *si, si_item_t *item) return 1; } -__private_extern__ si_mod_t * -si_module_static_ds() +si_mod_t * +si_module_static_ds(void) { - si_mod_t *out; - char *outname; - ds_si_private_t *pp; - int status; - - out = (si_mod_t *)calloc(1, sizeof(si_mod_t)); - outname = strdup("ds"); - pp = (ds_si_private_t *)calloc(1, sizeof(ds_si_private_t)); - - if ((out == NULL) || (outname == NULL) || (pp == NULL)) + static const struct si_mod_vtable_s ds_vtable = { - if (out != NULL) free(out); - if (outname != NULL) free(outname); - if (pp != NULL) free(pp); + .sim_is_valid = &ds_is_valid, - errno = ENOMEM; - return NULL; - } + .sim_user_byname = &ds_user_byname, + .sim_user_byuid = &ds_user_byuid, + .sim_user_all = &ds_user_all, - pthread_key_create(&_ds_serv_cache_key, _ds_serv_cache_free); + .sim_group_byname = &ds_group_byname, + .sim_group_bygid = &ds_group_bygid, + .sim_group_all = &ds_group_all, - pp->notify_token_global = -1; - pp->notify_token_user = -1; - pp->notify_token_group = -1; - pp->notify_token_host = -1; - pp->notify_token_service = -1; + .sim_grouplist = &ds_grouplist, - /* - * Don't register for notifications if the cache is disabled. - * notifyd (notably) disables the cache to prevent deadlocks. - */ - if (gL1CacheEnabled != 0) - { - /* - * Errors in registering for cache invalidation notifications are ignored. - * If there are failures, the tokens remain set to -1 which just causes - * cached items to be invalidated. - */ - status = notify_register_check(DS_NOTIFICATION_KEY_GLOBAL, &(pp->notify_token_global)); - status = notify_register_check(DS_NOTIFICATION_KEY_GLOBAL, &(pp->notify_token_user)); - status = notify_register_check(DS_NOTIFICATION_KEY_GLOBAL, &(pp->notify_token_group)); - status = notify_register_check(DS_NOTIFICATION_KEY_GLOBAL, &(pp->notify_token_host)); - status = notify_register_check(DS_NOTIFICATION_KEY_GLOBAL, &(pp->notify_token_service)); - } + .sim_netgroup_byname = &ds_netgroup_byname, + .sim_in_netgroup = &ds_in_netgroup, - out->name = outname; - out->vers = 1; - out->refcount = 1; - out->private = pp; + .sim_alias_byname = &ds_alias_byname, + .sim_alias_all = &ds_alias_all, - out->sim_is_valid = ds_is_valid; + .sim_host_byname = &ds_host_byname, + .sim_host_byaddr = &ds_host_byaddr, + .sim_host_all = &ds_host_all, - out->sim_user_byname = ds_user_byname; - out->sim_user_byuid = ds_user_byuid; - out->sim_user_all = ds_user_all; + .sim_network_byname = &ds_network_byname, + .sim_network_byaddr = &ds_network_byaddr, + .sim_network_all = &ds_network_all, - out->sim_group_byname = ds_group_byname; - out->sim_group_bygid = ds_group_bygid; - out->sim_group_all = ds_group_all; + .sim_service_byname = &ds_service_byname, + .sim_service_byport = &ds_service_byport, + .sim_service_all = &ds_service_all, - out->sim_grouplist = ds_grouplist; + .sim_protocol_byname = &ds_protocol_byname, + .sim_protocol_bynumber = &ds_protocol_bynumber, + .sim_protocol_all = &ds_protocol_all, - out->sim_netgroup_byname = ds_netgroup_byname; - out->sim_in_netgroup = ds_in_netgroup; + .sim_rpc_byname = &ds_rpc_byname, + .sim_rpc_bynumber = &ds_rpc_bynumber, + .sim_rpc_all = &ds_rpc_all, - out->sim_alias_byname = ds_alias_byname; - out->sim_alias_all = ds_alias_all; + .sim_fs_byspec = &ds_fs_byspec, + .sim_fs_byfile = &ds_fs_byfile, + .sim_fs_all = &ds_fs_all, - out->sim_host_byname = ds_host_byname; - out->sim_host_byaddr = ds_host_byaddr; - out->sim_host_all = ds_host_all; + .sim_mac_byname = &ds_mac_byname, + .sim_mac_bymac = &ds_mac_bymac, - out->sim_network_byname = ds_network_byname; - out->sim_network_byaddr = ds_network_byaddr; - out->sim_network_all = ds_network_all; + /* si_mac_all not supported */ + .sim_mac_all = NULL, - out->sim_service_byname = ds_service_byname; - out->sim_service_byport = ds_service_byport; - out->sim_service_all = ds_service_all; + .sim_addrinfo = &ds_addrinfo, + }; - out->sim_protocol_byname = ds_protocol_byname; - out->sim_protocol_bynumber = ds_protocol_bynumber; - out->sim_protocol_all = ds_protocol_all; + static si_mod_t si = + { + .vers = 1, + .refcount = 1, + .flags = SI_MOD_FLAG_STATIC, - out->sim_rpc_byname = ds_rpc_byname; - out->sim_rpc_bynumber = ds_rpc_bynumber; - out->sim_rpc_all = ds_rpc_all; + .private = NULL, + .vtable = &ds_vtable, + }; - out->sim_fs_byspec = ds_fs_byspec; - out->sim_fs_byfile = ds_fs_byfile; - out->sim_fs_all = ds_fs_all; + static dispatch_once_t once; + dispatch_once(&once, ^{ + pthread_key_create(&_ds_serv_cache_key, _ds_serv_cache_free); - out->sim_mac_byname = ds_mac_byname; - out->sim_mac_bymac = ds_mac_bymac; + si.name = strdup("ds"); + ds_si_private_t *pp = calloc(1, sizeof(ds_si_private_t)); - /* si_mac_all not supported */ - out->sim_mac_all = NULL; + if (pp != NULL) + { + pp->notify_token_global = -1; + pp->notify_token_user = -1; + pp->notify_token_group = -1; + pp->notify_token_host = -1; + pp->notify_token_service = -1; + } - out->sim_addrinfo = ds_addrinfo; + /* + * Don't register for notifications if the cache is disabled. + * notifyd (notably) disables the cache to prevent deadlocks. + */ + if (gL1CacheEnabled != 0) + { + /* + * Errors in registering for cache invalidation notifications are ignored. + * If there are failures, the tokens remain set to -1 which just causes + * cached items to be invalidated. + */ + notify_register_check(kNotifyDSCacheInvalidation, &(pp->notify_token_global)); + notify_register_check(kNotifyDSCacheInvalidationUser, &(pp->notify_token_user)); + notify_register_check(kNotifyDSCacheInvalidationGroup, &(pp->notify_token_group)); + notify_register_check(kNotifyDSCacheInvalidationHost, &(pp->notify_token_host)); + notify_register_check(kNotifyDSCacheInvalidationService, &(pp->notify_token_service)); + } - return out; + si.private = pp; + }); + + return &si; } + +#endif /* DS_AVAILABLE */ diff --git a/lookup.subproj/file_module.c b/lookup.subproj/file_module.c index 28e38eb..7db0b89 100644 --- a/lookup.subproj/file_module.c +++ b/lookup.subproj/file_module.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2009 Apple Inc. All rights reserved. + * Copyright (c) 2008-2011 Apple Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -29,19 +29,89 @@ #include #include #include +#include #include #include #include #include #include +#include + +/* notify SPI */ +uint32_t notify_peek(int token, uint32_t *val); + +extern uint32_t gL1CacheEnabled; /* These really should be in netdb.h & etc. */ #define _PATH_RPCS "/etc/rpc" #define _PATH_ALIASES "/etc/aliases" #define _PATH_ETHERS "/etc/ethers" +#define _PATH_NETGROUP "/etc/netgroup" +static dispatch_once_t rootfs_once; static si_item_t *rootfs = NULL; +#define CHUNK 256 +#define FNG_MEM 0x00000010 +#define FNG_GRP 0x00000020 + +#define forever for(;;) + +#define VALIDATION_PASSWD 0 +#define VALIDATION_MASTER_PASSWD 1 +#define VALIDATION_GROUP 2 +#define VALIDATION_NETGROUP 3 +#define VALIDATION_ALIASES 4 +#define VALIDATION_HOSTS 5 +#define VALIDATION_NETWORKS 6 +#define VALIDATION_SERVICES 7 +#define VALIDATION_PROTOCOLS 8 +#define VALIDATION_RPC 9 +#define VALIDATION_FSTAB 10 +#define VALIDATION_ETHERS 11 +#define VALIDATION_COUNT 12 + +#define VALIDATION_MASK_PASSWD 0x00000001 +#define VALIDATION_MASK_MASTER_PASSWD 0x00000002 +#define VALIDATION_MASK_MASK_GROUP 0x00000004 +#define VALIDATION_MASK_NETGROUP 0x00000008 +#define VALIDATION_MASK_ALIASES 0x00000010 +#define VALIDATION_MASK_HOSTS 0x00000020 +#define VALIDATION_MASK_NETWORKS 0x00000040 +#define VALIDATION_MASK_SERVICES 0x00000080 +#define VALIDATION_MASK_PROTOCOLS 0x00000100 +#define VALIDATION_MASK_RPC 0x00000200 +#define VALIDATION_MASK_FSTAB 0x00000400 +#define VALIDATION_MASK_ETHERS 0x00000800 + +typedef struct file_netgroup_member_s +{ + uint32_t flags; + char *host; + char *user; + char *domain; + struct file_netgroup_member_s *next; +} file_netgroup_member_t; + +typedef struct file_netgroup_s +{ + char *name; + uint32_t flags; + file_netgroup_member_t *members; + struct file_netgroup_s *next; +} file_netgroup_t; + +typedef struct +{ + uint32_t validation_notify_mask; + int notify_token[VALIDATION_COUNT]; + file_netgroup_t *file_netgroup_cache; + uint64_t netgroup_validation_a; + uint64_t netgroup_validation_b; +} file_si_private_t; + +static pthread_mutex_t file_mutex = PTHREAD_MUTEX_INITIALIZER; + static char * _fsi_copy_string(char *s) { @@ -80,7 +150,7 @@ _fsi_append_string(char *s, char **l) return l; } -__private_extern__ char ** +char ** _fsi_tokenize(char *data, const char *sep, int trailing_empty, int *ntokens) { char **tokens; @@ -161,7 +231,7 @@ _fsi_tokenize(char *data, const char *sep, int trailing_empty, int *ntokens) return tokens; } -__private_extern__ char * +char * _fsi_get_line(FILE *fp) { char s[4096]; @@ -178,14 +248,526 @@ _fsi_get_line(FILE *fp) return out; } +static const char * +_fsi_validation_path(int vtype) +{ + if (vtype == VALIDATION_PASSWD) return _PATH_PASSWD; + else if (vtype == VALIDATION_MASTER_PASSWD) return _PATH_MASTERPASSWD; + else if (vtype == VALIDATION_GROUP) return _PATH_GROUP; + else if (vtype == VALIDATION_NETGROUP) return _PATH_NETGROUP; + else if (vtype == VALIDATION_ALIASES) return _PATH_ALIASES; + else if (vtype == VALIDATION_HOSTS) return _PATH_HOSTS; + else if (vtype == VALIDATION_NETWORKS) return _PATH_NETWORKS; + else if (vtype == VALIDATION_SERVICES) return _PATH_SERVICES; + else if (vtype == VALIDATION_PROTOCOLS) return _PATH_PROTOCOLS; + else if (vtype == VALIDATION_RPC) return _PATH_RPCS; + else if (vtype == VALIDATION_FSTAB) return _PATH_FSTAB; + else if (vtype == VALIDATION_ETHERS) return _PATH_ETHERS; + + return NULL; +} + +static void +_fsi_get_validation(si_mod_t *si, int vtype, const char *path, FILE *f, uint64_t *a, uint64_t *b) +{ + struct stat sb; + file_si_private_t *pp; + uint32_t peek, bit; + int status; + + if (a != NULL) *a = 0; + if (b != NULL) *a = 0; + + if (si == NULL) return; + if (path == NULL) return; + if (gL1CacheEnabled == 0) return; + + pp = (file_si_private_t *)si->private; + if (pp == NULL) return; + + if (vtype >= VALIDATION_COUNT) return; + + bit = 1 << vtype; + if (bit & pp->validation_notify_mask) + { + /* use notify validation for this type */ + if (pp->notify_token[vtype] < 0) + { + char *str = NULL; + asprintf(&str, "com.apple.system.info:%s", path); + if (str == NULL) return; + + status = notify_register_check(str, &(pp->notify_token[vtype])); + free(str); + } + + if (a != NULL) + { + status = notify_peek(pp->notify_token[vtype], &peek); + if (status == NOTIFY_STATUS_OK) *a = ntohl(peek); + } + + if (b != NULL) *b = vtype; + } + else + { + /* use stat() and last mod time for this type */ + memset(&sb, 0, sizeof(struct stat)); + if (f != NULL) + { + if (fstat(fileno(f), &sb) == 0) + { + if (a != NULL) *a = sb.st_mtimespec.tv_sec; + if (b != NULL) *b = sb.st_mtimespec.tv_nsec; + } + } + else + { + path = _fsi_validation_path(vtype); + if (path != NULL) + { + memset(&sb, 0, sizeof(struct stat)); + if (stat(path, &sb) == 0) + { + if (a != NULL) *a = sb.st_mtimespec.tv_sec; + if (b != NULL) *b = sb.st_mtimespec.tv_nsec; + } + } + } + } +} + +static int +_fsi_validate(si_mod_t *si, int cat, uint64_t va, uint64_t vb) +{ + struct stat sb; + const char *path; + uint32_t item_val, curr_val, vtype; + file_si_private_t *pp; + int status; + + if (si == NULL) return 0; + + pp = (file_si_private_t *)si->private; + if (pp == NULL) return 0; + + vtype = UINT32_MAX; + switch (cat) + { + case CATEGORY_USER: + { + if (geteuid() == 0) vtype = VALIDATION_MASTER_PASSWD; + else vtype = VALIDATION_PASSWD; + break; + } + case CATEGORY_GROUP: + { + vtype = VALIDATION_GROUP; + break; + } + case CATEGORY_GROUPLIST: + { + vtype = VALIDATION_GROUP; + break; + } + case CATEGORY_NETGROUP: + { + vtype = VALIDATION_NETGROUP; + break; + } + case CATEGORY_ALIAS: + { + vtype = VALIDATION_ALIASES; + break; + } + case CATEGORY_HOST_IPV4: + { + vtype = VALIDATION_HOSTS; + break; + } + case CATEGORY_HOST_IPV6: + { + vtype = VALIDATION_HOSTS; + break; + } + case CATEGORY_NETWORK: + { + vtype = VALIDATION_NETWORKS; + break; + } + case CATEGORY_SERVICE: + { + vtype = VALIDATION_SERVICES; + break; + } + case CATEGORY_PROTOCOL: + { + vtype = VALIDATION_PROTOCOLS; + break; + } + case CATEGORY_RPC: + { + vtype = VALIDATION_RPC; + break; + } + case CATEGORY_FS: + { + vtype = VALIDATION_FSTAB; + break; + } + case CATEGORY_MAC: + { + vtype = VALIDATION_ETHERS; + break; + } + default: return 0; + } + + if (pp->notify_token[vtype] < 0) + { + path = _fsi_validation_path(vtype); + if (path == NULL) return 0; + + memset(&sb, 0, sizeof(struct stat)); + if (stat(path, &sb) != 0) return 0; + if (va != sb.st_mtimespec.tv_sec) return 0; + if (vb != sb.st_mtimespec.tv_nsec) return 0; + } + else + { + item_val = va; + curr_val = -1; + status = notify_peek(pp->notify_token[vtype], &curr_val); + if (status != NOTIFY_STATUS_OK) return 0; + + curr_val = ntohl(curr_val); + if (item_val != curr_val) return 0; + } + + return 1; +} + +/* netgroup support */ +static char * +_fsi_append_char_to_line(char c, char *buf, size_t *x) +{ + if (x == NULL) return NULL; + + if (buf == NULL) *x = 0; + + if ((*x % CHUNK) == 0) + { + buf = reallocf(buf, *x + CHUNK); + memset(buf + *x, 0, CHUNK); + } + + buf[*x] = c; + *x = *x + 1; + + return buf; +} + +static char * +_fsi_read_netgroup_line(FILE *f) +{ + char *out = NULL; + size_t x = 0; + int white = 0; + int paren = 0; + + if (f == NULL) return NULL; + forever + { + int c = getc(f); + + if (c == EOF) + { + if (out == NULL) return NULL; + return _fsi_append_char_to_line('\0', out, &x); + } + + if (c == '\n') return _fsi_append_char_to_line('\0', out, &x); + if (c == '(') paren = 1; + else if (c == ')') paren = 0; + + if ((c == ' ') || (c == '\t')) + { + if ((white == 0) && (paren == 0)) out = _fsi_append_char_to_line(' ', out, &x); + white = 1; + } + else if (c == '\\') + { + forever + { + c = getc(f); + if (c == EOF) return _fsi_append_char_to_line('\0', out, &x); + if (c == '\n') break; + } + } + else + { + out = _fsi_append_char_to_line(c, out, &x); + white = 0; + } + } +} + +static file_netgroup_t * +_fsi_find_netgroup(file_netgroup_t **list, const char *name, int create) +{ + file_netgroup_t *n; + + if (list == NULL) return NULL; + + for (n = *list; n != NULL; n = n->next) + { + if (!strcmp(name, n->name)) return n; + } + + if (create == 0) return NULL; + + n = (file_netgroup_t *)calloc(1, sizeof(file_netgroup_t)); + if (n == NULL) return NULL; + + n->name = strdup(name); + + n->next = *list; + *list = n; + return n; +} + +void +_fsi_free_file_netgroup(file_netgroup_t *n) +{ + file_netgroup_member_t *m; + + if (n == NULL) return; + free(n->name); + + m = n->members; + while (m != NULL) + { + file_netgroup_member_t *x = m; + m = m->next; + free(x->host); + free(x->user); + free(x->domain); + free(x); + } + + free(n); +} + +static void +_fsi_add_netgroup_group(file_netgroup_t *n, char *grp) +{ + file_netgroup_member_t *g; + + if (n == NULL) return; + + g = (file_netgroup_member_t *)calloc(1, sizeof(file_netgroup_member_t)); + if (g == NULL) return; + + g->flags = FNG_GRP; + g->host = strdup(grp); + + g->next = n->members; + n->members = g; + + return; +} + +static void +_fsi_add_netgroup_member(file_netgroup_t *n, char *mem) +{ + char **tokens; + file_netgroup_member_t *m; + int ntokens; + + if (n == NULL) return; + + m = (file_netgroup_member_t *)calloc(1, sizeof(file_netgroup_member_t)); + if (m == NULL) return; + + tokens = _fsi_tokenize(mem + 1, ",)", 0, &ntokens); + + if (tokens == NULL) + { + free(m); + return; + } + + if ((ntokens > 0) && (tokens[0][0] != '\0')) m->host = strdup(tokens[0]); + if ((ntokens > 1) && (tokens[1][0] != '\0')) m->user = strdup(tokens[1]); + if ((ntokens > 2) && (tokens[2][0] != '\0')) m->domain = strdup(tokens[2]); + + free(tokens); + + m->flags = FNG_MEM; + m->next = n->members; + n->members = m; +} + +static file_netgroup_t * +_fsi_process_netgroup_line(file_netgroup_t **pass1, char *line) +{ + file_netgroup_t *n; + char **tokens; + int i, ntokens = 0; + + tokens = _fsi_tokenize(line, " ", 0, &ntokens); + if (tokens == NULL) return NULL; + if (tokens[0] == NULL) + { + free(tokens); + return NULL; + } + + n = _fsi_find_netgroup(pass1, tokens[0], 1); + + for (i = 1; tokens[i] != NULL; i++) + { + if (tokens[i][0] == '(') _fsi_add_netgroup_member(n, tokens[i]); + else if (tokens[i][0] != '\0') _fsi_add_netgroup_group(n, tokens[i]); + } + + free(tokens); + return n; +} + +static void +_fsi_flatten_netgroup(file_netgroup_t *pass1, file_netgroup_t **top, file_netgroup_t *n, file_netgroup_member_t *m) +{ + if (n == NULL) return; + + if (n->flags == 1) return; + n->flags = 1; + + if (*top == NULL) + { + *top = (file_netgroup_t *)calloc(1, sizeof(file_netgroup_t)); + if (*top == NULL) return; + (*top)->name = strdup(n->name); + if ((*top)->name == NULL) + { + free(*top); + *top = NULL; + return; + } + } + + while (m!= NULL) + { + if (m->flags & FNG_MEM) + { + file_netgroup_member_t *x = (file_netgroup_member_t *)calloc(1, sizeof(file_netgroup_member_t)); + if (x == NULL) return; + + x->flags = FNG_MEM; + if (m->host != NULL) x->host = strdup(m->host); + if (m->user != NULL) x->user = strdup(m->user); + if (m->domain != NULL) x->domain = strdup(m->domain); + + x->next = (*top)->members; + (*top)->members = x; + } + else + { + file_netgroup_t *g = _fsi_find_netgroup(&pass1, m->host, 0); + if (g == NULL) continue; + + _fsi_flatten_netgroup(pass1, top, g, g->members); + } + + m = m->next; + } +} + +static void +_fsi_check_netgroup_cache(si_mod_t *si) +{ + file_netgroup_t *p1, *n, *x, *a; + char *line; + FILE *f; + file_si_private_t *pp; + + if (si == NULL) return; + + pp = (file_si_private_t *)si->private; + if (pp == NULL) return; + + pthread_mutex_lock(&file_mutex); + + if (_fsi_validate(si, CATEGORY_NETGROUP, pp->netgroup_validation_a, pp->netgroup_validation_b)) + { + pthread_mutex_unlock(&file_mutex); + return; + } + + n = pp->file_netgroup_cache; + while (n != NULL) + { + x = n; + n = n->next; + _fsi_free_file_netgroup(x); + } + + pp->file_netgroup_cache = NULL; + + f = fopen(_PATH_NETGROUP, "r"); + if (f == NULL) + { + pthread_mutex_unlock(&file_mutex); + return; + } + + _fsi_get_validation(si, VALIDATION_NETGROUP, _PATH_NETGROUP, f, &(pp->netgroup_validation_a), &(pp->netgroup_validation_b)); + + p1 = NULL; + + line = _fsi_read_netgroup_line(f); + while (line != NULL) + { + n = _fsi_process_netgroup_line(&p1, line); + + free(line); + line = _fsi_read_netgroup_line(f); + } + + fclose(f); + + for (n = p1; n != NULL; n = n->next) + { + a = NULL; + _fsi_flatten_netgroup(p1, &a, n, n->members); + for (x = p1; x != NULL; x = x->next) x->flags = 0; + + if (a != NULL) + { + a->next = pp->file_netgroup_cache; + pp->file_netgroup_cache = a; + } + } + + n = p1; + while (n != NULL) + { + x = n; + n = n->next; + _fsi_free_file_netgroup(x); + } + + pthread_mutex_unlock(&file_mutex); +} + /* USERS */ static si_item_t * -_fsi_parse_user(si_mod_t *si, const char *name, uid_t uid, int which, char *data, int format, uint64_t sec, uint64_t nsec) +_fsi_parse_user(si_mod_t *si, const char *name, uid_t uid, int which, char *data, int format, uint64_t va, uint64_t vb) { char **tokens; int ntokens, match; - time_t change, exsire; + time_t change, expire; si_item_t *item; uid_t xuid; @@ -215,17 +797,17 @@ _fsi_parse_user(si_mod_t *si, const char *name, uid_t uid, int which, char *data if (format == 0) { - /* master.passwd: name[0] passwd[1] uid[2] gid[3] class[4] change[5] exsire[6] gecos[7] dir[8] shell[9] */ - /* struct pwd: name[0] passwd[1] uid[2] gid[3] change[5] class[4] gecos[7] dir[8] shell[9] exsire[6] */ + /* master.passwd: name[0] passwd[1] uid[2] gid[3] class[4] change[5] expire[6] gecos[7] dir[8] shell[9] */ + /* struct pwd: name[0] passwd[1] uid[2] gid[3] change[5] class[4] gecos[7] dir[8] shell[9] expire[6] */ change = atoi(tokens[5]); - exsire = atoi(tokens[6]); - item = (si_item_t *)LI_ils_create("L4488ss44LssssL", (unsigned long)si, CATEGORY_USER, 1, sec, nsec, tokens[0], tokens[1], xuid, atoi(tokens[3]), change, tokens[4], tokens[7], tokens[8], tokens[9], exsire); + expire = atoi(tokens[6]); + item = (si_item_t *)LI_ils_create("L4488ss44LssssL", (unsigned long)si, CATEGORY_USER, 1, va, vb, tokens[0], tokens[1], xuid, atoi(tokens[3]), change, tokens[4], tokens[7], tokens[8], tokens[9], expire); } else { /* passwd: name[0] passwd[1] uid[2] gid[3] gecos[4] dir[5] shell[6] */ - /* struct pwd: name[0] passwd[1] uid[2] gid[3] change[-] class[-] gecos[4] dir[5] shell[6] exsire[-] */ - item = (si_item_t *)LI_ils_create("L4488ss44LssssL", (unsigned long)si, CATEGORY_USER, 1, sec, nsec, tokens[0], tokens[1], xuid, atoi(tokens[3]), 0, "", tokens[4], tokens[5], tokens[6], 0); + /* struct pwd: name[0] passwd[1] uid[2] gid[3] change[-] class[-] gecos[4] dir[5] shell[6] expire[-] */ + item = (si_item_t *)LI_ils_create("L4488ss44LssssL", (unsigned long)si, CATEGORY_USER, 1, va, vb, tokens[0], tokens[1], xuid, atoi(tokens[3]), 0, "", tokens[4], tokens[5], tokens[6], 0); } free(tokens); @@ -240,35 +822,30 @@ _fsi_get_user(si_mod_t *si, const char *name, uid_t uid, int which) int fmt; FILE *f; si_list_t *all; - struct stat sb; - uint64_t sec, nsec; + uint64_t va, vb; if ((which == SEL_NAME) && (name == NULL)) return NULL; all = NULL; f = NULL; fmt = 0; - sec = 0; - nsec = 0; + va = 0; + vb = 0; if (geteuid() == 0) { f = fopen(_PATH_MASTERPASSWD, "r"); + _fsi_get_validation(si, VALIDATION_MASTER_PASSWD, _PATH_MASTERPASSWD, f, &va, &vb); } else { f = fopen(_PATH_PASSWD, "r"); + _fsi_get_validation(si, VALIDATION_PASSWD, _PATH_PASSWD, f, &va, &vb); fmt = 1; } if (f == NULL) return NULL; - memset(&sb, 0, sizeof(struct stat)); - if (fstat(fileno(f), &sb) == 0) - { - sec = sb.st_mtimespec.tv_sec; - nsec = sb.st_mtimespec.tv_nsec; - } forever { @@ -282,7 +859,7 @@ _fsi_get_user(si_mod_t *si, const char *name, uid_t uid, int which) continue; } - item = _fsi_parse_user(si, name, uid, which, line, fmt, sec, nsec); + item = _fsi_parse_user(si, name, uid, which, line, fmt, va, vb); free(line); line = NULL; @@ -305,7 +882,7 @@ _fsi_get_user(si_mod_t *si, const char *name, uid_t uid, int which) /* GROUPS */ static si_item_t * -_fsi_parse_group(si_mod_t *si, const char *name, gid_t gid, int which, char *data, uint64_t sec, uint64_t nsec) +_fsi_parse_group(si_mod_t *si, const char *name, gid_t gid, int which, char *data, uint64_t va, uint64_t vb) { char **tokens, **members; int ntokens, match; @@ -338,7 +915,7 @@ _fsi_parse_group(si_mod_t *si, const char *name, gid_t gid, int which, char *dat ntokens = 0; members = _fsi_tokenize(tokens[3], ",", 1, &ntokens); - item = (si_item_t *)LI_ils_create("L4488ss4*", (unsigned long)si, CATEGORY_GROUP, 1, sec, nsec, tokens[0], tokens[1], xgid, members); + item = (si_item_t *)LI_ils_create("L4488ss4*", (unsigned long)si, CATEGORY_GROUP, 1, va, vb, tokens[0], tokens[1], xgid, members); free(tokens); free(members); @@ -353,25 +930,17 @@ _fsi_get_group(si_mod_t *si, const char *name, gid_t gid, int which) si_item_t *item; FILE *f; si_list_t *all; - struct stat sb; - uint64_t sec, nsec; + uint64_t va, vb; if ((which == SEL_NAME) && (name == NULL)) return NULL; all = NULL; f = NULL; - sec = 0; - nsec = 0; f = fopen(_PATH_GROUP, "r"); if (f == NULL) return NULL; - memset(&sb, 0, sizeof(struct stat)); - if (fstat(fileno(f), &sb) == 0) - { - sec = sb.st_mtimespec.tv_sec; - nsec = sb.st_mtimespec.tv_nsec; - } + _fsi_get_validation(si, VALIDATION_GROUP, _PATH_GROUP, f, &va, &vb); forever { @@ -385,7 +954,7 @@ _fsi_get_group(si_mod_t *si, const char *name, gid_t gid, int which) continue; } - item = _fsi_parse_group(si, name, gid, which, line, sec, nsec); + item = _fsi_parse_group(si, name, gid, which, line, va, vb); free(line); line = NULL; @@ -414,8 +983,7 @@ _fsi_get_grouplist(si_mod_t *si, const char *user) char *line; si_item_t *item; FILE *f; - struct stat sb; - uint64_t sec, nsec; + uint64_t va, vb; int32_t gid, basegid, *gidp; char **gidlist; struct passwd *pw; @@ -425,11 +993,9 @@ _fsi_get_grouplist(si_mod_t *si, const char *user) gidlist = NULL; gidcount = 0; f = NULL; - sec = 0; - nsec = 0; basegid = -1; - item = si->sim_user_byname(si, user); + item = si->vtable->sim_user_byname(si, user); if (item != NULL) { pw = (struct passwd *)((uintptr_t)item + sizeof(si_item_t)); @@ -440,12 +1006,7 @@ _fsi_get_grouplist(si_mod_t *si, const char *user) f = fopen(_PATH_GROUP, "r"); if (f == NULL) return NULL; - memset(&sb, 0, sizeof(struct stat)); - if (fstat(fileno(f), &sb) == 0) - { - sec = sb.st_mtimespec.tv_sec; - nsec = sb.st_mtimespec.tv_nsec; - } + _fsi_get_validation(si, VALIDATION_GROUP, _PATH_GROUP, f, &va, &vb); forever { @@ -520,7 +1081,7 @@ _fsi_get_grouplist(si_mod_t *si, const char *user) if (gidlist == NULL) return NULL; gidlist[gidcount] = NULL; - item = (si_item_t *)LI_ils_create("L4488s44a", (unsigned long)si, CATEGORY_GROUPLIST, 1, sec, nsec, user, basegid, gidcount, gidlist); + item = (si_item_t *)LI_ils_create("L4488s44a", (unsigned long)si, CATEGORY_GROUPLIST, 1, va, vb, user, basegid, gidcount, gidlist); for (i = 0; i <= gidcount; i++) free(gidlist[i]); free(gidlist); @@ -531,7 +1092,7 @@ _fsi_get_grouplist(si_mod_t *si, const char *user) /* ALIASES */ static si_item_t * -_fsi_parse_alias(si_mod_t *si, const char *name, int which, char *data, uint64_t sec, uint64_t nsec) +_fsi_parse_alias(si_mod_t *si, const char *name, int which, char *data, uint64_t va, uint64_t vb) { char **tokens, **members; int ntokens, match; @@ -559,9 +1120,9 @@ _fsi_parse_alias(si_mod_t *si, const char *name, int which, char *data, uint64_t } ntokens = 0; - members = _fsi_tokenize(tokens[3], ",", 1, &ntokens); + members = _fsi_tokenize(tokens[1], ",", 1, &ntokens); - item = (si_item_t *)LI_ils_create("L4488s4*4", (unsigned long)si, CATEGORY_ALIAS, 1, sec, nsec, tokens[0], ntokens, members, 1); + item = (si_item_t *)LI_ils_create("L4488s4*4", (unsigned long)si, CATEGORY_ALIAS, 1, va, vb, tokens[0], ntokens, members, 1); free(tokens); free(members); @@ -576,25 +1137,17 @@ _fsi_get_alias(si_mod_t *si, const char *name, int which) si_item_t *item; FILE *f; si_list_t *all; - struct stat sb; - uint64_t sec, nsec; + uint64_t va, vb; if ((which == SEL_NAME) && (name == NULL)) return NULL; all = NULL; f = NULL; - sec = 0; - nsec = 0; f = fopen(_PATH_ALIASES, "r"); if (f == NULL) return NULL; - memset(&sb, 0, sizeof(struct stat)); - if (fstat(fileno(f), &sb) == 0) - { - sec = sb.st_mtimespec.tv_sec; - nsec = sb.st_mtimespec.tv_nsec; - } + _fsi_get_validation(si, VALIDATION_ALIASES, _PATH_ALIASES, f, &va, &vb); forever { @@ -608,7 +1161,7 @@ _fsi_get_alias(si_mod_t *si, const char *name, int which) continue; } - item = _fsi_parse_alias(si, name, which, line, sec, nsec); + item = _fsi_parse_alias(si, name, which, line, va, vb); free(line); line = NULL; @@ -632,7 +1185,7 @@ _fsi_get_alias(si_mod_t *si, const char *name, int which) /* ETHERS */ static si_item_t * -_fsi_parse_ether(si_mod_t *si, const char *name, int which, char *data, uint64_t sec, uint64_t nsec) +_fsi_parse_ether(si_mod_t *si, const char *name, int which, char *data, uint64_t va, uint64_t vb) { char **tokens; char *cmac; @@ -649,7 +1202,7 @@ _fsi_parse_ether(si_mod_t *si, const char *name, int which, char *data, uint64_t return NULL; } - cmac = si_canonical_mac_address(tokens[1]); + cmac = si_standardize_mac_address(tokens[0]); if (cmac == NULL) { free(tokens); @@ -658,7 +1211,7 @@ _fsi_parse_ether(si_mod_t *si, const char *name, int which, char *data, uint64_t match = 0; if (which == SEL_ALL) match = 1; - else if ((which == SEL_NAME) && (string_equal(name, tokens[0]))) match = 1; + else if ((which == SEL_NAME) && (string_equal(name, tokens[1]))) match = 1; else if ((which == SEL_NUMBER) && (string_equal(name, cmac))) match = 1; if (match == 0) @@ -668,7 +1221,7 @@ _fsi_parse_ether(si_mod_t *si, const char *name, int which, char *data, uint64_t return NULL; } - item = (si_item_t *)LI_ils_create("L4488ss", (unsigned long)si, CATEGORY_MAC, 1, sec, nsec, tokens[0], cmac); + item = (si_item_t *)LI_ils_create("L4488ss", (unsigned long)si, CATEGORY_MAC, 1, va, vb, tokens[1], cmac); free(tokens); free(cmac); @@ -683,32 +1236,24 @@ _fsi_get_ether(si_mod_t *si, const char *name, int which) si_item_t *item; FILE *f; si_list_t *all; - struct stat sb; - uint64_t sec, nsec; + uint64_t va, vb; if ((which != SEL_ALL) && (name == NULL)) return NULL; cmac = NULL; if (which == SEL_NUMBER) { - cmac = si_canonical_mac_address(name); + cmac = si_standardize_mac_address(name); if (cmac == NULL) return NULL; } all = NULL; f = NULL; - sec = 0; - nsec = 0; f = fopen(_PATH_ETHERS, "r"); if (f == NULL) return NULL; - memset(&sb, 0, sizeof(struct stat)); - if (fstat(fileno(f), &sb) == 0) - { - sec = sb.st_mtimespec.tv_sec; - nsec = sb.st_mtimespec.tv_nsec; - } + _fsi_get_validation(si, VALIDATION_ETHERS, _PATH_ETHERS, f, &va, &vb); forever { @@ -723,8 +1268,8 @@ _fsi_get_ether(si_mod_t *si, const char *name, int which) } item = NULL; - if (which == SEL_NUMBER) item = _fsi_parse_ether(si, cmac, which, line, sec, nsec); - else item = _fsi_parse_ether(si, name, which, line, sec, nsec); + if (which == SEL_NUMBER) item = _fsi_parse_ether(si, cmac, which, line, va, vb); + else item = _fsi_parse_ether(si, name, which, line, va, vb); free(line); line = NULL; @@ -749,10 +1294,10 @@ _fsi_get_ether(si_mod_t *si, const char *name, int which) /* HOSTS */ static si_item_t * -_fsi_parse_host(si_mod_t *si, const char *name, const void *addr, int af, int which, char *data, uint64_t sec, uint64_t nsec) +_fsi_parse_host(si_mod_t *si, const char *name, const void *addr, int af, int which, char *data, uint64_t va, uint64_t vb) { char **tokens, **h_aliases, *null_alias; - int i, ntokens, match, xaf, h_length; + int i, ntokens, match, h_addrtype, h_length; struct in_addr a4; struct in6_addr a6; si_item_t *item; @@ -773,23 +1318,23 @@ _fsi_parse_host(si_mod_t *si, const char *name, const void *addr, int af, int wh h_addr_list[1] = NULL; - xaf = AF_UNSPEC; + h_addrtype = AF_UNSPEC; if (inet_pton(AF_INET, tokens[0], &a4) == 1) { - xaf = AF_INET; + h_addrtype = AF_INET; h_length = sizeof(struct in_addr); memcpy(h_addr_4, &a4, 4); h_addr_list[0] = h_addr_4; } else if (inet_pton(AF_INET6, tokens[0], &a6) == 1) { - xaf = AF_INET6; + h_addrtype = AF_INET6; h_length = sizeof(struct in6_addr); memcpy(h_addr_6, &a6, 16); h_addr_list[0] = h_addr_6; } - if (xaf == AF_UNSPEC) + if (h_addrtype == AF_UNSPEC) { free(tokens); return NULL; @@ -803,7 +1348,7 @@ _fsi_parse_host(si_mod_t *si, const char *name, const void *addr, int af, int wh if (which == SEL_ALL) match = 1; else { - if (af == xaf) + if (h_addrtype == af) { if (which == SEL_NAME) { @@ -831,13 +1376,13 @@ _fsi_parse_host(si_mod_t *si, const char *name, const void *addr, int af, int wh if (h_aliases == NULL) h_aliases = &null_alias; - if (af == AF_INET) + if (h_addrtype == AF_INET) { - item = (si_item_t *)LI_ils_create("L4488s*44a", (unsigned long)si, CATEGORY_HOST_IPV4, 1, sec, nsec, tokens[1], h_aliases, af, h_length, h_addr_list); + item = (si_item_t *)LI_ils_create("L4488s*44a", (unsigned long)si, CATEGORY_HOST_IPV4, 1, va, vb, tokens[1], h_aliases, h_addrtype, h_length, h_addr_list); } else { - item = (si_item_t *)LI_ils_create("L4488s*44c", (unsigned long)si, CATEGORY_HOST_IPV6, 1, sec, nsec, tokens[1], h_aliases, af, h_length, h_addr_list); + item = (si_item_t *)LI_ils_create("L4488s*44c", (unsigned long)si, CATEGORY_HOST_IPV6, 1, va, vb, tokens[1], h_aliases, h_addrtype, h_length, h_addr_list); } free(tokens); @@ -852,11 +1397,7 @@ _fsi_get_host(si_mod_t *si, const char *name, const void *addr, int af, int whic si_item_t *item; FILE *f; si_list_t *all; - struct stat sb; - uint64_t sec, nsec; - - sec = 0; - nsec = 0; + uint64_t va, vb; if ((which == SEL_NAME) && (name == NULL)) { @@ -877,12 +1418,7 @@ _fsi_get_host(si_mod_t *si, const char *name, const void *addr, int af, int whic return NULL; } - memset(&sb, 0, sizeof(struct stat)); - if (fstat(fileno(f), &sb) == 0) - { - sec = sb.st_mtimespec.tv_sec; - nsec = sb.st_mtimespec.tv_nsec; - } + _fsi_get_validation(si, VALIDATION_HOSTS, _PATH_HOSTS, f, &va, &vb); all = NULL; @@ -898,7 +1434,7 @@ _fsi_get_host(si_mod_t *si, const char *name, const void *addr, int af, int whic continue; } - item = _fsi_parse_host(si, name, addr, af, which, line, sec, nsec); + item = _fsi_parse_host(si, name, addr, af, which, line, va, vb); free(line); line = NULL; @@ -922,7 +1458,7 @@ _fsi_get_host(si_mod_t *si, const char *name, const void *addr, int af, int whic /* SERVICE */ static si_item_t * -_fsi_parse_service(si_mod_t *si, const char *name, const char *proto, int port, int which, char *data, uint64_t sec, uint64_t nsec) +_fsi_parse_service(si_mod_t *si, const char *name, const char *proto, int port, int which, char *data, uint64_t va, uint64_t vb) { char **tokens, **s_aliases, *xproto; int i, ntokens, match; @@ -983,7 +1519,7 @@ _fsi_parse_service(si_mod_t *si, const char *name, const char *proto, int port, /* strange but correct */ xport = htons(xport); - item = (si_item_t *)LI_ils_create("L4488s*4s", (unsigned long)si, CATEGORY_SERVICE, 1, sec, nsec, tokens[0], s_aliases, xport, xproto); + item = (si_item_t *)LI_ils_create("L4488s*4s", (unsigned long)si, CATEGORY_SERVICE, 1, va, vb, tokens[0], s_aliases, xport, xproto); free(tokens); @@ -997,11 +1533,7 @@ _fsi_get_service(si_mod_t *si, const char *name, const char *proto, int port, in si_item_t *item; FILE *f; si_list_t *all; - struct stat sb; - uint64_t sec, nsec; - - sec = 0; - nsec = 0; + uint64_t va, vb; if ((which == SEL_NAME) && (name == NULL)) return NULL; if ((which == SEL_NUMBER) && (port == 0)) return NULL; @@ -1009,12 +1541,7 @@ _fsi_get_service(si_mod_t *si, const char *name, const char *proto, int port, in f = fopen(_PATH_SERVICES, "r"); if (f == NULL) return NULL; - memset(&sb, 0, sizeof(struct stat)); - if (fstat(fileno(f), &sb) == 0) - { - sec = sb.st_mtimespec.tv_sec; - nsec = sb.st_mtimespec.tv_nsec; - } + _fsi_get_validation(si, VALIDATION_SERVICES, _PATH_SERVICES, f, &va, &vb); all = NULL; @@ -1033,7 +1560,7 @@ _fsi_get_service(si_mod_t *si, const char *name, const char *proto, int port, in p = strchr(line, '#'); if (p != NULL) *p = '\0'; - item = _fsi_parse_service(si, name, proto, port, which, line, sec, nsec); + item = _fsi_parse_service(si, name, proto, port, which, line, va, vb); free(line); line = NULL; @@ -1060,7 +1587,7 @@ _fsi_get_service(si_mod_t *si, const char *name, const char *proto, int port, in */ static si_item_t * -_fsi_parse_name_num_aliases(si_mod_t *si, const char *name, int num, int which, char *data, uint64_t sec, uint64_t nsec, int cat) +_fsi_parse_name_num_aliases(si_mod_t *si, const char *name, int num, int which, char *data, uint64_t va, uint64_t vb, int cat) { char **tokens, **aliases; int i, ntokens, match, xnum; @@ -1101,7 +1628,20 @@ _fsi_parse_name_num_aliases(si_mod_t *si, const char *name, int num, int which, return NULL; } - item = (si_item_t *)LI_ils_create("L4488s*4", (unsigned long)si, cat, 1, sec, nsec, tokens[0], aliases, xnum); + switch (cat) { + case CATEGORY_NETWORK: + // struct netent + item = (si_item_t *)LI_ils_create("L4488s*44", (unsigned long)si, cat, 1, va, vb, tokens[0], aliases, AF_INET, xnum); + break; + case CATEGORY_PROTOCOL: + case CATEGORY_RPC: + // struct protoent + // struct rpcent + item = (si_item_t *)LI_ils_create("L4488s*4", (unsigned long)si, cat, 1, va, vb, tokens[0], aliases, xnum); + break; + default: + abort(); + } free(tokens); @@ -1109,27 +1649,37 @@ _fsi_parse_name_num_aliases(si_mod_t *si, const char *name, int num, int which, } static void * -_fsi_get_name_number_aliases(si_mod_t *si, const char *name, int num, int which, int cat, const char *path) +_fsi_get_name_number_aliases(si_mod_t *si, const char *name, int num, int which, int cat) { char *p, *line; si_item_t *item; FILE *f; si_list_t *all; - struct stat sb; - uint64_t sec, nsec; + uint64_t va, vb; + const char *path; + int vtype; - sec = 0; - nsec = 0; + switch (cat) { + case CATEGORY_NETWORK: + vtype = VALIDATION_NETWORKS; + path = _PATH_NETWORKS; + break; + case CATEGORY_PROTOCOL: + vtype = VALIDATION_PROTOCOLS; + path = _PATH_PROTOCOLS; + break; + case CATEGORY_RPC: + vtype = VALIDATION_RPC; + path = _PATH_RPCS; + break; + default: + abort(); + } f = fopen(path, "r"); if (f == NULL) return NULL; - memset(&sb, 0, sizeof(struct stat)); - if (fstat(fileno(f), &sb) == 0) - { - sec = sb.st_mtimespec.tv_sec; - nsec = sb.st_mtimespec.tv_nsec; - } + _fsi_get_validation(si, vtype, path, f, &va, &vb); all = NULL; @@ -1148,7 +1698,7 @@ _fsi_get_name_number_aliases(si_mod_t *si, const char *name, int num, int which, p = strchr(line, '#'); if (p != NULL) *p = '\0'; - item = _fsi_parse_name_num_aliases(si, name, num, which, line, sec, nsec, cat); + item = _fsi_parse_name_num_aliases(si, name, num, which, line, va, vb, cat); free(line); line = NULL; @@ -1172,7 +1722,7 @@ _fsi_get_name_number_aliases(si_mod_t *si, const char *name, int num, int which, /* MOUNT */ static si_item_t * -_fsi_parse_fs(si_mod_t *si, const char *name, int which, char *data, uint64_t sec, uint64_t nsec) +_fsi_parse_fs(si_mod_t *si, const char *name, int which, char *data, uint64_t va, uint64_t vb) { char **tokens, *tmp, **opts, *fstype; int ntokens, match, i, freq, passno; @@ -1233,7 +1783,7 @@ _fsi_parse_fs(si_mod_t *si, const char *name, int which, char *data, uint64_t se return NULL; } - item = (si_item_t *)LI_ils_create("L4488sssss44", (unsigned long)si, CATEGORY_FS, 1, sec, nsec, tokens[0], tokens[1], tokens[2], tokens[3], (fstype == NULL) ? "rw" : fstype, freq, passno); + item = (si_item_t *)LI_ils_create("L4488sssss44", (unsigned long)si, CATEGORY_FS, 1, va, vb, tokens[0], tokens[1], tokens[2], tokens[3], (fstype == NULL) ? "rw" : fstype, freq, passno); free(tokens); free(opts); @@ -1284,7 +1834,7 @@ _fsi_get_device_path(dev_t target_dev) /* reset dev to _PATH_DEV and try again */ dev[sizeof(_PATH_DEV) - 1] = '\0'; } - + if (dirp) closedir(dirp); } else @@ -1300,33 +1850,30 @@ _fsi_get_device_path(dev_t target_dev) static si_item_t * _fsi_fs_root(si_mod_t *si) { - struct stat rootstat; - struct statfs rootfsinfo; - char *root_spec; - const char *root_path; - - if (rootfs != NULL) return si_item_retain(rootfs); - - root_path = "/"; - - if (stat(root_path, &rootstat) < 0) return NULL; - if (statfs(root_path, &rootfsinfo) < 0) return NULL; + dispatch_once(&rootfs_once, ^{ + struct stat rootstat; + struct statfs rootfsinfo; + char *root_spec; + const char *root_path = "/"; + + if (stat(root_path, &rootstat) < 0) return; + if (statfs(root_path, &rootfsinfo) < 0) return; + + // Check to make sure we're not looking at a synthetic root: + if (string_equal(rootfsinfo.f_fstypename, "synthfs")) { + root_path = "/root"; + if (stat(root_path, &rootstat) < 0) return; + if (statfs(root_path, &rootfsinfo) < 0) return; + } - /* Check to make sure we're not looking at a synthetic root: */ - if (string_equal(rootfsinfo.f_fstypename, "synthfs")) - { - root_path = "/root"; - if (stat(root_path, &rootstat) < 0) return NULL; - if (statfs(root_path, &rootfsinfo) < 0) return NULL; - } + root_spec = _fsi_get_device_path(rootstat.st_dev); - root_spec = _fsi_get_device_path(rootstat.st_dev); + rootfs = (si_item_t *)LI_ils_create("L4488sssss44", (unsigned long)si, CATEGORY_FS, 1, 0LL, 0LL, root_spec, root_path, rootfsinfo.f_fstypename, FSTAB_RW, FSTAB_RW, 0, 1); + }); - rootfs = (si_item_t *)LI_ils_create("L4488sssss44", (unsigned long)si, CATEGORY_FS, 1, 0LL, 0LL, root_spec, root_path, rootfsinfo.f_fstypename, FSTAB_RW, FSTAB_RW, 0, 1); - return rootfs; + return si_item_retain(rootfs); } - static void * _fsi_get_fs(si_mod_t *si, const char *name, int which) { @@ -1334,8 +1881,7 @@ _fsi_get_fs(si_mod_t *si, const char *name, int which) si_item_t *item; FILE *f; si_list_t *all; - struct stat sb; - uint64_t sec, nsec; + uint64_t va, vb; int synthesize_root; struct fstab *rfs; @@ -1343,8 +1889,6 @@ _fsi_get_fs(si_mod_t *si, const char *name, int which) all = NULL; f = NULL; - sec = 0; - nsec = 0; #ifdef SYNTH_ROOTFS synthesize_root = 1; #else @@ -1394,12 +1938,7 @@ _fsi_get_fs(si_mod_t *si, const char *name, int which) if (f == NULL) return all; - memset(&sb, 0, sizeof(struct stat)); - if (fstat(fileno(f), &sb) == 0) - { - sec = sb.st_mtimespec.tv_sec; - nsec = sb.st_mtimespec.tv_nsec; - } + _fsi_get_validation(si, VALIDATION_FSTAB, _PATH_FSTAB, f, &va, &vb); forever { @@ -1413,7 +1952,7 @@ _fsi_get_fs(si_mod_t *si, const char *name, int which) continue; } - item = _fsi_parse_fs(si, name, which, line, sec, nsec); + item = _fsi_parse_fs(si, name, which, line, va, vb); free(line); line = NULL; @@ -1434,12 +1973,9 @@ _fsi_get_fs(si_mod_t *si, const char *name, int which) return all; } -__private_extern__ int +static int file_is_valid(si_mod_t *si, si_item_t *item) { - struct stat sb; - uint64_t sec, nsec; - const char *path; si_mod_t *src; if (si == NULL) return 0; @@ -1454,76 +1990,142 @@ file_is_valid(si_mod_t *si, si_item_t *item) if (item == rootfs) return 1; - path = NULL; - memset(&sb, 0, sizeof(struct stat)); - sec = item->validation_a; - nsec = item->validation_b; - - if (item->type == CATEGORY_USER) - { - if (geteuid() == 0) path = _PATH_MASTERPASSWD; - else path = _PATH_PASSWD; - } - else if (item->type == CATEGORY_GROUP) path = _PATH_GROUP; - else if (item->type == CATEGORY_HOST_IPV4) path = _PATH_HOSTS; - else if (item->type == CATEGORY_HOST_IPV6) path = _PATH_HOSTS; - else if (item->type == CATEGORY_NETWORK) path = _PATH_NETWORKS; - else if (item->type == CATEGORY_SERVICE) path = _PATH_SERVICES; - else if (item->type == CATEGORY_PROTOCOL) path = _PATH_PROTOCOLS; - else if (item->type == CATEGORY_RPC) path = _PATH_RPCS; - else if (item->type == CATEGORY_FS) path = _PATH_FSTAB; - - if (path == NULL) return 0; - if (stat(path, &sb) != 0) return 0; - if (sec != sb.st_mtimespec.tv_sec) return 0; - if (nsec != sb.st_mtimespec.tv_nsec) return 0; - - return 1; + return _fsi_validate(si, item->type, item->validation_a, item->validation_b); } -__private_extern__ si_item_t * +static si_item_t * file_user_byname(si_mod_t *si, const char *name) { return _fsi_get_user(si, name, 0, SEL_NAME); } -__private_extern__ si_item_t * +static si_item_t * file_user_byuid(si_mod_t *si, uid_t uid) { return _fsi_get_user(si, NULL, uid, SEL_NUMBER); } -__private_extern__ si_list_t * +static si_list_t * file_user_all(si_mod_t *si) { return _fsi_get_user(si, NULL, 0, SEL_ALL); } -__private_extern__ si_item_t * +static si_item_t * file_group_byname(si_mod_t *si, const char *name) { return _fsi_get_group(si, name, 0, SEL_NAME); } -__private_extern__ si_item_t * +static si_item_t * file_group_bygid(si_mod_t *si, gid_t gid) { return _fsi_get_group(si, NULL, gid, SEL_NUMBER); } -__private_extern__ si_list_t * +static si_list_t * file_group_all(si_mod_t *si) { return _fsi_get_group(si, NULL, 0, SEL_ALL); } -__private_extern__ si_item_t * +static si_item_t * file_grouplist(si_mod_t *si, const char *name) { return _fsi_get_grouplist(si, name); } -__private_extern__ si_item_t * +static si_list_t * +file_netgroup_byname(si_mod_t *si, const char *name) +{ + si_list_t *list = NULL; + si_item_t *item; + uint64_t va, vb; + file_netgroup_t *n; + file_si_private_t *pp; + + if (name == NULL) return NULL; + + pp = (file_si_private_t *)si->private; + if (pp == NULL) return NULL; + + _fsi_check_netgroup_cache(si); + + pthread_mutex_lock(&file_mutex); + + n = _fsi_find_netgroup(&(pp->file_netgroup_cache), name, 0); + if (n != NULL) + { + file_netgroup_member_t *m = n->members; + while (m != NULL) + { + item = (si_item_t *)LI_ils_create("L4488sss", (unsigned long)si, CATEGORY_NETGROUP, 1, va, vb, m->host, m->user, m->domain); + list = si_list_add(list, item); + m = m->next; + } + } + + pthread_mutex_unlock(&file_mutex); + + return list; +} + +static int +file_in_netgroup(si_mod_t *si, const char *group, const char *host, const char *user, const char *domain) +{ + file_netgroup_t *n; + file_netgroup_member_t *m; + file_si_private_t *pp; + + if (group == NULL) return 0; + + pp = (file_si_private_t *)si->private; + if (pp == NULL) return 0; + + _fsi_check_netgroup_cache(si); + + pthread_mutex_lock(&file_mutex); + + n = _fsi_find_netgroup(&(pp->file_netgroup_cache), group, 0); + if (n == NULL) + { + pthread_mutex_unlock(&file_mutex); + return 0; + } + + m = n->members; + while (m != NULL) + { + file_netgroup_member_t *x = m; + m = m->next; + + if (host != NULL) + { + if (x->host == NULL) continue; + if (strcmp(host, x->host)) continue; + } + + if (user != NULL) + { + if (x->user == NULL) continue; + if (strcmp(user, x->user)) continue; + } + + if (domain != NULL) + { + if (x->domain == NULL) continue; + if (strcmp(domain, x->domain)) continue; + } + + pthread_mutex_unlock(&file_mutex); + return 1; + } + + pthread_mutex_unlock(&file_mutex); + return 0; +} + +static si_item_t * file_host_byname(si_mod_t *si, const char *name, int af, const char *ignored, uint32_t *err) { si_item_t *item; @@ -1536,7 +2138,7 @@ file_host_byname(si_mod_t *si, const char *name, int af, const char *ignored, ui return item; } -__private_extern__ si_item_t * +static si_item_t * file_host_byaddr(si_mod_t *si, const void *addr, int af, const char *ignored, uint32_t *err) { si_item_t *item; @@ -1549,130 +2151,130 @@ file_host_byaddr(si_mod_t *si, const void *addr, int af, const char *ignored, ui return item; } -__private_extern__ si_list_t * +static si_list_t * file_host_all(si_mod_t *si) { return _fsi_get_host(si, NULL, NULL, 0, SEL_ALL, NULL); } -__private_extern__ si_item_t * +static si_item_t * file_network_byname(si_mod_t *si, const char *name) { if (name == NULL) return NULL; - return _fsi_get_name_number_aliases(si, name, 0, SEL_NAME, CATEGORY_NETWORK, _PATH_NETWORKS); + return _fsi_get_name_number_aliases(si, name, 0, SEL_NAME, CATEGORY_NETWORK); } -__private_extern__ si_item_t * +static si_item_t * file_network_byaddr(si_mod_t *si, uint32_t addr) { - return _fsi_get_name_number_aliases(si, NULL, (int)addr, SEL_NUMBER, CATEGORY_NETWORK, _PATH_NETWORKS); + return _fsi_get_name_number_aliases(si, NULL, (int)addr, SEL_NUMBER, CATEGORY_NETWORK); } -__private_extern__ si_list_t * +static si_list_t * file_network_all(si_mod_t *si) { - return _fsi_get_name_number_aliases(si, NULL, 0, SEL_ALL, CATEGORY_NETWORK, _PATH_NETWORKS); + return _fsi_get_name_number_aliases(si, NULL, 0, SEL_ALL, CATEGORY_NETWORK); } -__private_extern__ si_item_t * +static si_item_t * file_service_byname(si_mod_t *si, const char *name, const char *proto) { return _fsi_get_service(si, name, proto, 0, SEL_NAME); } -__private_extern__ si_item_t * +static si_item_t * file_service_byport(si_mod_t *si, int port, const char *proto) { return _fsi_get_service(si, NULL, proto, port, SEL_NUMBER); } -__private_extern__ si_list_t * +static si_list_t * file_service_all(si_mod_t *si) { return _fsi_get_service(si, NULL, NULL, 0, SEL_ALL); } -__private_extern__ si_item_t * +static si_item_t * file_protocol_byname(si_mod_t *si, const char *name) { if (name == NULL) return NULL; - return _fsi_get_name_number_aliases(si, name, 0, SEL_NAME, CATEGORY_PROTOCOL, _PATH_PROTOCOLS); + return _fsi_get_name_number_aliases(si, name, 0, SEL_NAME, CATEGORY_PROTOCOL); } -__private_extern__ si_item_t * +static si_item_t * file_protocol_bynumber(si_mod_t *si, int number) { - return _fsi_get_name_number_aliases(si, NULL, number, SEL_NUMBER, CATEGORY_PROTOCOL, _PATH_PROTOCOLS); + return _fsi_get_name_number_aliases(si, NULL, number, SEL_NUMBER, CATEGORY_PROTOCOL); } -__private_extern__ si_list_t * +static si_list_t * file_protocol_all(si_mod_t *si) { - return _fsi_get_name_number_aliases(si, NULL, 0, SEL_ALL, CATEGORY_PROTOCOL, _PATH_PROTOCOLS); + return _fsi_get_name_number_aliases(si, NULL, 0, SEL_ALL, CATEGORY_PROTOCOL); } -__private_extern__ si_item_t * +static si_item_t * file_rpc_byname(si_mod_t *si, const char *name) { if (name == NULL) return NULL; - return _fsi_get_name_number_aliases(si, name, 0, SEL_NAME, CATEGORY_RPC, _PATH_RPCS); + return _fsi_get_name_number_aliases(si, name, 0, SEL_NAME, CATEGORY_RPC); } -__private_extern__ si_item_t * +static si_item_t * file_rpc_bynumber(si_mod_t *si, int number) { - return _fsi_get_name_number_aliases(si, NULL, number, SEL_NUMBER, CATEGORY_RPC, _PATH_RPCS); + return _fsi_get_name_number_aliases(si, NULL, number, SEL_NUMBER, CATEGORY_RPC); } -__private_extern__ si_list_t * +static si_list_t * file_rpc_all(si_mod_t *si) { - return _fsi_get_name_number_aliases(si, NULL, 0, SEL_ALL, CATEGORY_RPC, _PATH_RPCS); + return _fsi_get_name_number_aliases(si, NULL, 0, SEL_ALL, CATEGORY_RPC); } -__private_extern__ si_item_t * +static si_item_t * file_fs_byspec(si_mod_t *si, const char *spec) { return _fsi_get_fs(si, spec, SEL_NAME); } -__private_extern__ si_item_t * +static si_item_t * file_fs_byfile(si_mod_t *si, const char *file) { return _fsi_get_fs(si, file, SEL_NUMBER); } -__private_extern__ si_list_t * +static si_list_t * file_fs_all(si_mod_t *si) { return _fsi_get_fs(si, NULL, SEL_ALL); } -__private_extern__ si_item_t * +static si_item_t * file_alias_byname(si_mod_t *si, const char *name) { return _fsi_get_alias(si, name, SEL_NAME); } -__private_extern__ si_list_t * +static si_list_t * file_alias_all(si_mod_t *si) { return _fsi_get_alias(si, NULL, SEL_ALL); } -__private_extern__ si_item_t * +static si_item_t * file_mac_byname(si_mod_t *si, const char *name) { return _fsi_get_ether(si, name, SEL_NAME); } -__private_extern__ si_item_t * +static si_item_t * file_mac_bymac(si_mod_t *si, const char *mac) { return _fsi_get_ether(si, mac, SEL_NUMBER); } -__private_extern__ si_list_t * +static si_list_t * file_mac_all(si_mod_t *si) { return _fsi_get_ether(si, NULL, SEL_ALL); @@ -1685,80 +2287,90 @@ file_addrinfo(si_mod_t *si, const void *node, const void *serv, uint32_t family, return _gai_simple(si, node, serv, family, socktype, proto, flags, interface, err); } -__private_extern__ si_mod_t * -si_module_static_file() +si_mod_t * +si_module_static_file(void) { - si_mod_t *out; - char *outname; + static const struct si_mod_vtable_s file_vtable = + { + .sim_is_valid = &file_is_valid, - out = (si_mod_t *)calloc(1, sizeof(si_mod_t)); - outname = strdup("file"); + .sim_user_byname = &file_user_byname, + .sim_user_byuid = &file_user_byuid, + .sim_user_all = &file_user_all, - if ((out == NULL) || (outname == NULL)) - { - if (out != NULL) free(out); - if (outname != NULL) free(outname); + .sim_group_byname = &file_group_byname, + .sim_group_bygid = &file_group_bygid, + .sim_group_all = &file_group_all, - errno = ENOMEM; - return NULL; - } + .sim_grouplist = &file_grouplist, - out->name = outname; - out->vers = 1; - out->refcount = 1; + .sim_netgroup_byname = &file_netgroup_byname, + .sim_in_netgroup = &file_in_netgroup, - out->sim_is_valid = file_is_valid; + .sim_alias_byname = &file_alias_byname, + .sim_alias_all = &file_alias_all, - out->sim_user_byname = file_user_byname; - out->sim_user_byuid = file_user_byuid; - out->sim_user_all = file_user_all; + .sim_host_byname = &file_host_byname, + .sim_host_byaddr = &file_host_byaddr, + .sim_host_all = &file_host_all, - out->sim_group_byname = file_group_byname; - out->sim_group_bygid = file_group_bygid; - out->sim_group_all = file_group_all; + .sim_network_byname = &file_network_byname, + .sim_network_byaddr = &file_network_byaddr, + .sim_network_all = &file_network_all, - out->sim_grouplist = file_grouplist; + .sim_service_byname = &file_service_byname, + .sim_service_byport = &file_service_byport, + .sim_service_all = &file_service_all, - /* NETGROUP SUPPORT NOT IMPLEMENTED */ - out->sim_netgroup_byname = NULL; - out->sim_in_netgroup = NULL; + .sim_protocol_byname = &file_protocol_byname, + .sim_protocol_bynumber = &file_protocol_bynumber, + .sim_protocol_all = &file_protocol_all, - out->sim_alias_byname = file_alias_byname; - out->sim_alias_all = file_alias_all; + .sim_rpc_byname = &file_rpc_byname, + .sim_rpc_bynumber = &file_rpc_bynumber, + .sim_rpc_all = &file_rpc_all, - out->sim_host_byname = file_host_byname; - out->sim_host_byaddr = file_host_byaddr; - out->sim_host_all = file_host_all; + .sim_fs_byspec = &file_fs_byspec, + .sim_fs_byfile = &file_fs_byfile, + .sim_fs_all = &file_fs_all, - out->sim_network_byname = file_network_byname; - out->sim_network_byaddr = file_network_byaddr; - out->sim_network_all = file_network_all; + .sim_mac_byname = &file_mac_byname, + .sim_mac_bymac = &file_mac_bymac, + .sim_mac_all = &file_mac_all, - out->sim_service_byname = file_service_byname; - out->sim_service_byport = file_service_byport; - out->sim_service_all = file_service_all; + .sim_wants_addrinfo = NULL, + .sim_addrinfo = &file_addrinfo, - out->sim_protocol_byname = file_protocol_byname; - out->sim_protocol_bynumber = file_protocol_bynumber; - out->sim_protocol_all = file_protocol_all; + /* no nameinfo support */ + .sim_nameinfo = NULL, + }; - out->sim_rpc_byname = file_rpc_byname; - out->sim_rpc_bynumber = file_rpc_bynumber; - out->sim_rpc_all = file_rpc_all; + static si_mod_t si = + { + .vers = 1, + .refcount = 1, + .flags = SI_MOD_FLAG_STATIC, - out->sim_fs_byspec = file_fs_byspec; - out->sim_fs_byfile = file_fs_byfile; - out->sim_fs_all = file_fs_all; + .private = NULL, + .vtable = &file_vtable, + }; - out->sim_mac_byname = file_mac_byname; - out->sim_mac_bymac = file_mac_bymac; - out->sim_mac_all = file_mac_all; + static dispatch_once_t once; - out->sim_wants_addrinfo = NULL; - out->sim_addrinfo = file_addrinfo; + dispatch_once(&once, ^{ + si.name = strdup("file"); + file_si_private_t *pp = calloc(1, sizeof(file_si_private_t)); + if (pp != NULL) + { + int i; + for (i = 0; i < VALIDATION_COUNT; i++) pp->notify_token[i] = -1; - /* no nameinfo support */ - out->sim_nameinfo = NULL; + /* hardwired for now, but we may want to make this configurable someday */ + pp->validation_notify_mask = VALIDATION_MASK_HOSTS | VALIDATION_MASK_SERVICES; + } - return out; + si.private = pp; + }); + + return (si_mod_t *)&si; } diff --git a/lookup.subproj/getgrent.3 b/lookup.subproj/getgrent.3 index 2a95a2d..2a2920c 100644 --- a/lookup.subproj/getgrent.3 +++ b/lookup.subproj/getgrent.3 @@ -60,7 +60,7 @@ .Fn getgrgid_r "gid_t gid" "struct group *grp" "char *buffer" "size_t bufsize" "struct group **result" .Ft int .Fn setgroupent "int stayopen" -.Ft int +.Ft void .Fn setgrent void .Ft void .Fn endgrent void @@ -199,14 +199,12 @@ is set to .Dv NULL and the return value is 0, no matching entry exists.) .Pp -The functions .Fn setgroupent -and -.Fn setgrent -return the value 1 if successful, otherwise the value +returns the value 1 if successful, otherwise the value 0 is returned. The functions -.Fn endgrent +.Fn setgrent , +.Fn endgrent , and .Fn setgrfile have no return value. diff --git a/lookup.subproj/getnameinfo.3 b/lookup.subproj/getnameinfo.3 index a121a45..ac41596 100644 --- a/lookup.subproj/getnameinfo.3 +++ b/lookup.subproj/getnameinfo.3 @@ -47,34 +47,30 @@ and functions and is the converse of the .Xr getaddrinfo 3 function. -.\".Pp -.\"If a link-layer address is passed to -.\".Fn getnameinfo , -.\"its ASCII representation will be stored in -.\".Fa host . -.\"The string pointed to by -.\".Fa serv -.\"will be set to the empty string if non-NULL; -.\".Fa flags -.\"will always be ignored. -.\"This is intended as a replacement for the legacy -.\".Xr link_ntoa 3 -.\"function. +.Pp +If a link-layer address is passed to +.Fn getnameinfo , +its ASCII representation will be stored in +.Fa host . +The string pointed to by +.Fa serv +will be set to the empty string if non-NULL; +.Fa flags +will always be ignored. +This is intended as a replacement for the legacy +.Xr link_ntoa 3 +function. .Pp The .Li sockaddr structure .Fa sa should point to either a -.\".Li sockaddr_in , -.\".Li sockaddr_in6 -.\"or -.\".Li sockaddr_dl -.\"structure (for IPv4, IPv6 or link-layer respectively) that is -.Li sockaddr_in -or +.Li sockaddr_in , .Li sockaddr_in6 -structure (for IPv4 or IPv6 respectively) that is +or +.Li sockaddr_dl +structure (for IPv4, IPv6 or link-layer respectively) that is .Fa salen bytes long. .Pp diff --git a/lookup.subproj/getnameinfo_link.c b/lookup.subproj/getnameinfo_link.c new file mode 100644 index 0000000..35ed743 --- /dev/null +++ b/lookup.subproj/getnameinfo_link.c @@ -0,0 +1,116 @@ +/* + * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. + * Copyright (c) 2000 Ben Harris. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include +#include +#include +#include + +static int +hexname(const uint8_t *cp, size_t len, char *host, size_t hostlen) +{ + int i, n; + char *outp = host; + + *outp = '\0'; + for (i = 0; i < len; i++) + { + n = snprintf(outp, hostlen, "%s%02x", i ? ":" : "", cp[i]); + if ((n < 0) || (n >= hostlen)) + { + *host = '\0'; + return EAI_MEMORY; + } + + outp += n; + hostlen -= n; + } + + return 0; +} + +/* + * getnameinfo_link(): + * Format a link-layer address into a printable format, paying attention to + * the interface type. + */ +__private_extern__ int +getnameinfo_link(const struct sockaddr *sa, socklen_t salen, char *host, size_t hostlen, char *serv, size_t servlen, int flags) +{ + const struct sockaddr_dl *sdl = (const struct sockaddr_dl *)(const void *)sa; + int n; + + if (serv != NULL && servlen > 0) *serv = '\0'; + + if ((sdl->sdl_nlen == 0) && (sdl->sdl_alen == 0) && (sdl->sdl_slen == 0)) + { + n = snprintf(host, hostlen, "link#%d", sdl->sdl_index); + if (n > hostlen) + { + *host = '\0'; + return EAI_MEMORY; + } + + return 0; + } + + switch (sdl->sdl_type) + { + /* + * The following have zero-length addresses. + * IFT_ATM (net/if_atmsubr.c) + * IFT_FAITH (net/if_faith.c) + * IFT_GIF (net/if_gif.c) + * IFT_LOOP (net/if_loop.c) + * IFT_PPP (net/if_ppp.c, net/if_spppsubr.c) + * IFT_SLIP (net/if_sl.c, net/if_strip.c) + * IFT_STF (net/if_stf.c) + * IFT_L2VLAN (net/if_vlan.c) + * IFT_BRIDGE (net/if_bridge.h> + */ + /* + * The following use IPv4 addresses as link-layer addresses: + * IFT_OTHER (net/if_gre.c) + * IFT_OTHER (netinet/ip_ipip.c) + */ + /* default below is believed correct for all these. */ + case IFT_ARCNET: + case IFT_ETHER: + case IFT_FDDI: + case IFT_HIPPI: + case IFT_ISO88025: + default: + return hexname((uint8_t *)LLADDR(sdl), (size_t)sdl->sdl_alen, host, hostlen); + } + + /* NOTREACHED */ + return EAI_FAIL; +} diff --git a/lookup.subproj/ils.c b/lookup.subproj/ils.c index 776c6a6..167ed2e 100644 --- a/lookup.subproj/ils.c +++ b/lookup.subproj/ils.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1999-2009 Apple Inc. All rights reserved. + * Copyright (c) 1999-2010 Apple Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -203,7 +203,7 @@ LI_ils_create(char *fmt, ...) case '*': { - /* NULL-terminated list of strings */ + // NULL-terminated list of strings if (largest < sizeof(char *)) largest = sizeof(char *); csize = sizeof(char *) + padsize(hsize, sizeof(char *), align); @@ -215,10 +215,11 @@ LI_ils_create(char *fmt, ...) slen += sizeof(char *); slen += (strlen(list[i]) + 1); } - - slen += sizeof(char *); } + // reserve space for the terminator + slen += sizeof(char *); + break; } @@ -499,31 +500,24 @@ LI_ils_create(char *fmt, ...) list = va_arg(ap, char **); - if (list == NULL) - { - memset(hp, 0, sizeof(char *)); - } - else - { - memcpy(hp, &dp, sizeof(char *)); + memcpy(hp, &dp, sizeof(char *)); - for (i = 0; list[i] != NULL; i++); + for (i = 0; list && list[i] != NULL; i++); - lp = dp; - dp += ((i + 1) * sizeof(char *)); + lp = dp; + dp += ((i + 1) * sizeof(char *)); - for (i = 0; list[i] != NULL; i++) - { - memcpy(lp, &dp, sizeof(char *)); - lp += sizeof(char *); - slen = strlen(list[i]) + 1; - memcpy(dp, list[i], slen); - dp += slen; - } - - memset(lp, 0, sizeof(char *)); + for (i = 0; list && list[i] != NULL; i++) + { + memcpy(lp, &dp, sizeof(char *)); + lp += sizeof(char *); + slen = strlen(list[i]) + 1; + memcpy(dp, list[i], slen); + dp += slen; } + memset(lp, 0, sizeof(char *)); + hp += sizeof(char *); hsize += sizeof(char *); diff --git a/lookup.subproj/kvbuf.c b/lookup.subproj/kvbuf.c index a32a1ef..fa2fb51 100644 --- a/lookup.subproj/kvbuf.c +++ b/lookup.subproj/kvbuf.c @@ -69,7 +69,7 @@ * (keys are always strings), "s" denotes a string value, * "i" denotes a 32 bit signed int, and "u" denotes an unsigned. */ -__private_extern__ kvbuf_t * +kvbuf_t * kvbuf_query(char *fmt, ...) { va_list ap; @@ -188,7 +188,7 @@ kvbuf_query_key_val(const char *key, const char *val) return kv; } -__private_extern__ kvbuf_t * +kvbuf_t * kvbuf_query_key_int(const char *key, int32_t i) { char str[32]; @@ -197,7 +197,7 @@ kvbuf_query_key_int(const char *key, int32_t i) return kvbuf_query_key_val(key, str); } -__private_extern__ kvbuf_t * +kvbuf_t * kvbuf_query_key_uint(const char *key, uint32_t u) { char str[32]; @@ -248,15 +248,18 @@ kvbuf_init_zone(malloc_zone_t *zone, char *buffer, uint32_t length) kv->_size = length; kv->datalen = length; - kv->databuf = malloc_zone_calloc(zone, 1, length); - if (kv->databuf == NULL) - { - free(kv); - kv = NULL; - } - else + if (length > 0) { - memcpy(kv->databuf, buffer, length); + kv->databuf = malloc_zone_calloc(zone, 1, length); + if (kv->databuf == NULL) + { + free(kv); + kv = NULL; + } + else + { + memcpy(kv->databuf, buffer, length); + } } return kv; @@ -271,24 +274,24 @@ kvbuf_init(char *buffer, uint32_t length) static void kvbuf_grow(kvbuf_t *kv, uint32_t delta) { - uint32_t newlen, n; - char *p; + uint32_t newlen; + char *p, *newbuf; + malloc_zone_t *zone; if (kv == NULL) return; if (delta == 0) return; if (kv->databuf == NULL) delta += sizeof(uint32_t); - n = (delta + KVBUF_CHUNK - 1) / KVBUF_CHUNK; - newlen = kv->datalen + (n * KVBUF_CHUNK); - + newlen = kv->datalen + delta; if (newlen <= kv->_size) return; - kv->_size = newlen; + kv->_size = ((newlen + KVBUF_CHUNK - 1) / KVBUF_CHUNK) * KVBUF_CHUNK; + zone = malloc_zone_from_ptr(kv); if (kv->databuf == NULL) { - kv->databuf = calloc(1, kv->_size); + kv->databuf = malloc_zone_calloc(zone, 1, kv->_size); if (kv->databuf == NULL) { memset(kv, 0, sizeof(kvbuf_t)); @@ -300,7 +303,9 @@ kvbuf_grow(kvbuf_t *kv, uint32_t delta) } else { - kv->databuf = reallocf(kv->databuf, kv->_size); + newbuf = malloc_zone_realloc(zone, kv->databuf, kv->_size); + if (newbuf == NULL) free(kv->databuf); + kv->databuf = newbuf; if (kv->databuf == NULL) { memset(kv, 0, sizeof(kvbuf_t)); diff --git a/lookup.subproj/libinfo.c b/lookup.subproj/libinfo.c index 127d78f..0f5f2e2 100644 --- a/lookup.subproj/libinfo.c +++ b/lookup.subproj/libinfo.c @@ -33,7 +33,6 @@ #include #include #include -#include #include "si_module.h" #include "libinfo.h" #include @@ -45,10 +44,15 @@ #define IPV6_ADDR_LEN 16 #define IPV4_ADDR_LEN 4 +/* The kernel's initgroups call */ +extern int __initgroups(u_int gidsetsize, gid_t *gidset, int gmuid); + /* SPI from long ago */ int _proto_stayopen; -__private_extern__ struct addrinfo *si_list_to_addrinfo(si_list_t *list); +extern struct addrinfo *si_list_to_addrinfo(si_list_t *list); +extern int getnameinfo_link(const struct sockaddr *sa, socklen_t salen, char *host, size_t hostlen, char *serv, size_t servlen, int flags); +__private_extern__ void search_set_flags(si_mod_t *si, const char *name, uint32_t flag); /* * Impedence matching for async calls. @@ -68,22 +72,22 @@ typedef struct int32_t key_offset; } si_context_t; -__private_extern__ si_mod_t * +si_mod_t * si_search(void) { static si_mod_t *search = NULL; - static OSSpinLock spin = OS_SPINLOCK_INIT; - if (search == NULL) - { - OSSpinLockLock(&spin); - if (search == NULL) search = si_module_with_name("search"); - OSSpinLockUnlock(&spin); - } + if (search == NULL) search = si_module_with_name("search"); return search; } +void +si_search_module_set_flags(const char *name, uint32_t flag) +{ + search_set_flags(si_search(), name, flag); +} + static void si_libinfo_general_callback(si_item_t *item, uint32_t status, void *ctx) { @@ -555,8 +559,8 @@ endnetgrent(void) /* GROUPLIST */ -int -getgrouplist(const char *name, int basegid, int *groups, int *ngroups) +static int +getgrouplist_internal(const char *name, int basegid, gid_t *groups, uint32_t *ngroups, int set_thread_data) { int i, j, x, g, add, max; si_item_t *item; @@ -584,7 +588,7 @@ getgrouplist(const char *name, int basegid, int *groups, int *ngroups) *ngroups = 1; item = si_grouplist(si_search(), name); - LI_set_thread_item(CATEGORY_GROUPLIST, item); + if (set_thread_data != 0) LI_set_thread_item(CATEGORY_GROUPLIST, item); if (item == NULL) return 0; gl = (si_grouplist_t *)((uintptr_t)item + sizeof(si_item_t)); @@ -615,6 +619,12 @@ getgrouplist(const char *name, int basegid, int *groups, int *ngroups) return 0; } +int +getgrouplist(const char *name, int basegid, int *groups, int *ngroups) +{ + return getgrouplist_internal(name, basegid, (gid_t *)groups, (uint32_t *)ngroups, 1); +} + /* XXX to do: async getgrouplist */ static int @@ -737,7 +747,9 @@ getgroupcount(const char *name, gid_t basegid) int initgroups(const char *name, int basegid) { - int status, ngroups, groups[NGROUPS]; + int status; + uint32_t ngroups; + gid_t groups[NGROUPS]; uid_t uid; #ifdef DS_AVAILABLE si_item_t *item; @@ -765,14 +777,14 @@ initgroups(const char *name, int basegid) ngroups = NGROUPS; - status = getgrouplist(name, basegid, groups, &ngroups); + status = getgrouplist_internal(name, basegid, groups, &ngroups, 0); /* * Ignore status. * A failure either means that user belongs to more than NGROUPS groups * or no groups at all. */ - status = syscall(SYS_initgroups, ngroups, groups, uid); + status = __initgroups(ngroups, groups, uid); if (status < 0) return -1; return 0; @@ -1470,7 +1482,7 @@ int ether_hostton(const char *name, struct ether_addr *e) { si_item_t *item; - char *cmac; + si_mac_t *mac; uint32_t t[6]; int i; @@ -1485,9 +1497,9 @@ ether_hostton(const char *name, struct ether_addr *e) LI_set_thread_item(CATEGORY_MAC + 100, item); if (item == NULL) return -1; - cmac = (char *)((uintptr_t)item + sizeof(si_item_t)); + mac = (si_mac_t *)((uintptr_t)item + sizeof(si_item_t)); - i = sscanf(cmac, " %x:%x:%x:%x:%x:%x", &t[0], &t[1], &t[2], &t[3], &t[4], &t[5]); + i = sscanf(mac->mac, " %x:%x:%x:%x:%x:%x", &t[0], &t[1], &t[2], &t[3], &t[4], &t[5]); if (i != 6) return -1; for (i = 0; i < 6; i++) e->ether_addr_octet[i] = t[i]; @@ -1500,7 +1512,7 @@ int ether_ntohost(char *name, const struct ether_addr *e) { si_item_t *item; - char *cname; + si_mac_t *mac; uint32_t i, x[6]; char str[256]; @@ -1518,9 +1530,9 @@ ether_ntohost(char *name, const struct ether_addr *e) LI_set_thread_item(CATEGORY_MAC + 200, item); if (item == NULL) return -1; - cname = (char *)((uintptr_t)item + sizeof(si_item_t)); + mac = (si_mac_t *)((uintptr_t)item + sizeof(si_item_t)); - memcpy(name, cname, strlen(cname) + 1); + memcpy(name, mac->host, strlen(mac->host) + 1); return 0; } @@ -2264,7 +2276,7 @@ _getaddrinfo_internal(const char *nodename, const char *servname, const struct a #endif list = si_addrinfo(si_search(), nodename, servname, family, socktype, protocol, flags, interface, &status); - if ((status != SI_STATUS_NO_ERROR) || (list == NULL)) + if ((status != SI_STATUS_NO_ERROR) || (list == NULL) || (list->count == 0)) { si_list_release(list); @@ -2681,6 +2693,9 @@ _getnameinfo_interface_internal(const struct sockaddr *sa, socklen_t salen, char int getnameinfo(const struct sockaddr *sa, socklen_t salen, char *node, socklen_t nodelen, char *service, socklen_t servicelen, int flags) { + if (sa == NULL) return EAI_FAIL; + + if (sa->sa_family == AF_LINK) return getnameinfo_link(sa, salen, node, nodelen, service, servicelen, flags); return _getnameinfo_interface_internal(sa, salen, node, nodelen, service, servicelen, flags, NULL); } diff --git a/lookup.subproj/libinfo.h b/lookup.subproj/libinfo.h index a2ae50b..477d625 100644 --- a/lookup.subproj/libinfo.h +++ b/lookup.subproj/libinfo.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008 Apple Inc. All rights reserved. + * Copyright (c) 2008-2010 Apple Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -23,6 +23,13 @@ #include +/* + * SPI to disable / enable modules during Libinfo search. + * Currently known module names are "cache", "ds", "file", and "mdns". + * Use flag = 0 to disable a module, flag = 1 to enable. + */ +void si_search_module_set_flags(const char *name, uint32_t flag); + /* * Most of these async callbacks get data that's held in thread-specific * memory (specific to the callback thread) that will be re-used by that diff --git a/lookup.subproj/mdns_module.c b/lookup.subproj/mdns_module.c index 980380e..7f23aad 100644 --- a/lookup.subproj/mdns_module.c +++ b/lookup.subproj/mdns_module.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2009 Apple Inc. All rights reserved. + * Copyright (c) 2008-2011 Apple Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -117,8 +117,7 @@ #include #include #include - -__private_extern__ int si_inet_config(uint32_t *inet4, uint32_t *inet6); +#include /* from dns_util.c */ #define DNS_MAX_RECEIVE_SIZE 65536 @@ -139,23 +138,6 @@ static int _mdns_debug = 0; // mutex protects DNSServiceProcessResult and DNSServiceRefDeallocate static pthread_mutex_t _mdns_mutex = PTHREAD_MUTEX_INITIALIZER; -// XXX -// Options: timeout:n total_timeout attempts - -/* _dns_config_token: notify token indicating dns config needs refresh - */ -static int _dns_config_token = -1; - -typedef struct { - int32_t rc; - dns_config_t *dns; - dns_resolver_t *primary; - uint32_t n_defaults; - dns_resolver_t **defaults; - char **search_list; - int ndots; -} mdns_config_t; - typedef struct { uint16_t priority; uint16_t weight; @@ -184,17 +166,12 @@ typedef struct { } mdns_reply_t; static uint32_t _mdns_generation = 0; -DNSServiceRef _mdns_sdref; -DNSServiceRef _mdns_old_sdref; - -static int _mdns_query_mDNSResponder(const char *name, int class, int type, - const char *interface, DNSServiceFlags flags, - uint8_t *answer, uint32_t *anslen, - mdns_reply_t *reply, uint32_t timeout); +static DNSServiceRef _mdns_sdref; +static DNSServiceRef _mdns_old_sdref; -static int _mdns_resolver_get_option(dns_resolver_t *resolver, const char* option); static void _mdns_hostent_clear(mdns_hostent_t *h); static void _mdns_reply_clear(mdns_reply_t *r); +static int _mdns_search(const char *name, int class, int type, const char *interface, DNSServiceFlags flags, uint8_t *answer, uint32_t *anslen, mdns_reply_t *reply); static const char hexchar[] = "0123456789abcdef"; @@ -220,462 +197,6 @@ const static uint8_t hexval[128] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 /* 112 - 127 */ }; -/* - * _mdns_create_search_list - * Creates a NULL terminated array of strings from the specied resolver's - * search list, or from the components of the specified resolver's domain - * if search list is empty. - * Free the list and elements with free(3) when done. - */ -static char ** -_mdns_create_search_list(dns_resolver_t *resolver) -{ - int n, m; - char *p, *domain; - char **list; - - if (resolver == NULL) return NULL; - - // return the search list if present - if (resolver->n_search > 0) { - list = (char **)calloc(resolver->n_search+1, sizeof(char *)); - if (list == NULL) return NULL; - for (n = 0; n < resolver->n_search; ++n) { - list[n] = strdup(resolver->search[n]); - } - return list; - } - - if (resolver->domain == NULL) return NULL; - domain = strdup(resolver->domain); - if (domain == NULL) return NULL; - - // count dots - n = 0; - for (p = domain; *p != '\0'; p++) { - if (*p == '.') n++; - } - - // trim trailing dots - for (p--; (p >= domain) && (*p == '.'); p--) { - *p = '\0'; - n--; - } - - // make sure the resulting string is not empty - if (p < domain) { - free(domain); - return NULL; - } - - // dots are separators, so number of components is one larger - n++; - - m = 0; - list = (char **)calloc(n+1, sizeof(char *)); - if (list == NULL) return NULL; - // first item in list is domain itself - list[m++] = domain; - - // include parent domains with at least LOCALDOMAINPARTS components - p = domain; - while (n > LOCALDOMAINPARTS) { - // find next component - while ((*p != '.') && (*p != '\0')) p++; - if (*p == '\0') break; - p++; - // add to the list - n--; - list[m++] = strdup(p); - } - return list; -} - -/* _mdns_resolver_get_option - * Determines whether the specified option is present in the resolver. - */ -static int -_mdns_resolver_get_option(dns_resolver_t *resolver, const char* option) -{ - if (resolver == NULL) return 0; - int len = strlen(option); - char *options = resolver->options; - if (options == NULL) return 0; - // look for "(^| )option( |:|$)" - char *ptr = strstr(options, option); - while (ptr) { - if (ptr == options || ptr[-1] == ' ') { - if (ptr[len] == ' ' || ptr[len] == 0) { - return 1; - } else if (ptr[len] == ':') { - return strtol(&ptr[len+1], NULL, 10); - } - } - ptr = strstr(ptr, option); - } - return 0; -} - -/* _mdns_compare_resolvers - * Compares two dns_resolver_t pointers by search order ascending. - */ -static int -_mdns_compare_resolvers(const void *a, const void *b) -{ - dns_resolver_t **x = (dns_resolver_t **)a, **y = (dns_resolver_t **)b; - return ((*x)->search_order - (*y)->search_order); -} - -/* _mdns_create_default_resolvers_list - * Returns an array of dns_resolver_t containing only default resolvers. - * A resolver is a default resolver if it is the primary resolver or if it - * contains the "default" configuration option. - */ -static void -_mdns_config_init_default_resolvers(mdns_config_t *config) -{ - uint32_t count = config->dns->n_resolver; - if (count == 0) return; - config->defaults = calloc(count, sizeof(dns_resolver_t *)); - if (config->defaults == NULL) return; - int m = 0, i, j; - if (config->primary) config->defaults[m++] = config->primary; - // iterate the resolvers, add any default resolvers that are not - // already in the list. - for (i = 0; i < count; ++i) { - dns_resolver_t *resolver = config->dns->resolver[i]; - if (_mdns_resolver_get_option(resolver, "default")) { - int exists = 0; - for (j = 0; j < m; ++j) { - if (config->defaults[j] == resolver) { - exists = 1; - break; - } - } - if (!exists) { - config->defaults[m++] = resolver; - } - } - } - config->n_defaults = m; - // sort list by search order ascending - qsort(config->defaults, config->n_defaults, sizeof(dns_resolver_t *), _mdns_compare_resolvers); -} - -#if 0 -static void -_mdns_print_dns_resolver(dns_resolver_t *resolver) -{ - printf("resolver = {\n"); - printf("\tdomain = %s\n", resolver->domain); - int j; - for (j = 0; j < resolver->n_nameserver; ++j) { - int res; - char host[255], serv[255]; - res = getnameinfo(resolver->nameserver[j], resolver->nameserver[j]->sa_len, host, sizeof(host), serv, sizeof(serv), NI_NUMERICHOST | NI_NUMERICSERV); - if (res == 0) { - printf("\tnameserver[%d] = %s:%s\n", j, host, serv); - } else { - printf("\tnameserver[%d] = %s\n", j, gai_strerror(res)); - } - } - printf("\tport = %d\n", resolver->port); - for (j = 0; j < resolver->n_search; ++j) { - printf("\tsearch[%d] = %s\n", j, resolver->search[j]); - } - // sortaddr - printf("\tn_sortaddr = %d\n", resolver->n_sortaddr); - // options - printf("\toptions = %s\n", resolver->options); - printf("\ttimeout = %d\n", resolver->timeout); - printf("\tsearch_order = %d\n", resolver->search_order); - printf("}\n"); -} - -static void -_mdns_print_dns_config(dns_config_t *config) -{ - int i; - dns_resolver_t **list = _mdns_create_sorted_resolver_list(config); - dns_resolver_t **ptr = list; - while (*ptr) { - _mdns_print_dns_resolver(*ptr); - ptr++; - } - free(list); -} - -static void -_mdns_print_hostent(mdns_hostent_t* h) -{ - if (h == NULL) return; - printf("hostent[%p] = {\n", h); - printf("\thost = {\n"); - printf("\t\th_name = %s\n", h->host.h_name); - printf("\t\th_length = %d\n", h->host.h_length); - printf("\t\th_addrtype = %d\n", h->host.h_addrtype); - char **alias = h->host.h_aliases; - while (alias && *alias) { - printf("\t\th_aliases = %s\n", *alias++); - } - char **addr = h->host.h_addr_list; - while (addr && *addr) { - printf("\t\th_addr_list = %x\n", ntohl(*(uint32_t*)*addr++)); - } - printf("\t}\n"); - printf("\talias_count = %d\n", h->alias_count); - printf("\taddr_count = %d\n", h->addr_count); - printf("}\n"); -} - -#endif - -/* _mdns_config_retain - * Retain the mdns configuration. - */ -static mdns_config_t * -_mdns_config_retain(mdns_config_t *config) -{ - int32_t rc; - - if (config == NULL) return NULL; - rc = OSAtomicIncrement32Barrier(&config->rc); - assert(rc > 1); - return config; -} - -/* _mdns_config_release - * Releases the mdns configuration structure and - * frees the data if no references remain. - */ -static void -_mdns_config_release(mdns_config_t *config) -{ - int32_t rc; - - if (config == NULL) return; - rc = OSAtomicDecrement32Barrier(&config->rc); - assert(rc >= 0); - if (rc == 0) { - if (config->dns) dns_configuration_free(config->dns); - free(config->defaults); - char **p = config->search_list; - while (p && *p) { free(*p++); } - free(config->search_list); - free(config); - } -} - -/* _mdns_copy_system_config - * Retrieves DNS configuration from SystemConfiguration.framework. - * Checks notify notification to determine whether configuration is in need - * of a refresh. - */ -static mdns_config_t * -_mdns_copy_system_config(void) -{ - // first call needs refresh - static mdns_config_t *current_config; - mdns_config_t *config = NULL; - int refresh = 1; - int res; - - pthread_mutex_lock(&_mdns_mutex); - - // check whether the global configuration has changed - if (_dns_config_token == -1) { - res = notify_register_check(dns_configuration_notify_key(), &_dns_config_token); - if (res != NOTIFY_STATUS_OK) _dns_config_token = -1; - } - - if (_dns_config_token != -1) { - res = notify_check(_dns_config_token, &refresh); - if (res != NOTIFY_STATUS_OK) refresh = 1; - } - - // return the current configuration if still valid - if (refresh == 0) { - mdns_config_t *config = _mdns_config_retain(current_config); - pthread_mutex_unlock(&_mdns_mutex); - return config; - } - - // need to allocate a new configuration - - config = calloc(1, sizeof(mdns_config_t)); - if (config != NULL) config->dns = dns_configuration_copy(); - - // failed to get new config, return previous config - if (config == NULL || config->dns == NULL) { - free(config); - config = _mdns_config_retain(current_config); - pthread_mutex_unlock(&_mdns_mutex); - return config; - } - - config->rc = 1; - if (config->dns->n_resolver > 0) { - // primary resolver is always index 0 and contains the - // search domains - config->primary = config->dns->resolver[0]; - config->search_list = _mdns_create_search_list(config->primary); - _mdns_config_init_default_resolvers(config); - } - config->ndots = _mdns_resolver_get_option(config->primary, "ndots"); - - // promote the new configuration to current - _mdns_config_release(current_config); - current_config = config; - - // return the new configuration - config = _mdns_config_retain(config); - pthread_mutex_unlock(&_mdns_mutex); - return config; -} - -/* _mdns_timeout_for_name - * Returns the appropriate timeout for the specified name based on the - * sum of the timeouts of all resolvers that match the name. - */ -static uint32_t -_mdns_timeout_for_name(mdns_config_t *config, const char *name) -{ - int i; - uint32_t timeout = 0; - - if (name == NULL) return 0; - - // use strncasecmp to ignore a trailing '.' in name - int len = strlen(name); - if ((len - 1) >= 0 && name[len-1] == '.') --len; - - const char *p = name; - while (len > 0) { - uint32_t count = config->dns->n_resolver; - for (i = 0; i < count; ++i) { - dns_resolver_t *resolver = config->dns->resolver[i]; - if (resolver->domain == NULL) continue; - if (strncasecmp(resolver->domain, p, len) == 0) { - timeout += resolver->timeout; - } - } - // discard the current label - while (len > 0) { - ++p; - --len; - if (p[-1] == '.') break; - } - } - return timeout; -} - -/* _mdns_query_unqualified - * Performs a query for the name as an unqualified name (appends each - * of the default resolver's domains). - */ -static int -_mdns_query_unqualified(mdns_config_t *config, const char *name, uint32_t class, uint32_t type, const char *interface, DNSServiceFlags flags, uint8_t *buf, uint32_t *len, mdns_reply_t *reply) -{ - int i, res = -1; - - for (i = 0; i < config->n_defaults; ++i) { - dns_resolver_t *resolver = config->defaults[i]; - char *qname; - - asprintf(&qname, "%s.%s", name, resolver->domain ? resolver->domain : ""); - res = _mdns_query_mDNSResponder(qname, class, type, interface, flags, buf, len, reply, resolver->timeout); - free(qname); - - if (res == 0) break; - else _mdns_reply_clear(reply); - } - return res; -} - -/* _mdns_query_absolute - * Performs a query for the name as an absolute name (does not qualify with any - * additional domains). - */ -static int -_mdns_query_absolute(mdns_config_t *config, const char *name, uint32_t class, uint32_t type, const char *interface, DNSServiceFlags flags, uint32_t fqdn, uint8_t *buf, uint32_t *len, mdns_reply_t *reply) -{ - int res = -1; - char *qname = (char *)name; - - uint32_t timeout = _mdns_timeout_for_name(config, name); - - if (fqdn == 0) asprintf(&qname, "%s.", name); - res = _mdns_query_mDNSResponder(qname, class, type, interface, flags, buf, len, reply, timeout); - if (fqdn == 0) free(qname); - if (res != 0) _mdns_reply_clear(reply); - return res; -} - -static int -_mdns_search(const char *name, uint32_t class, uint32_t type, const char *interface, DNSServiceFlags flags, uint32_t fqdn, uint32_t recurse, uint8_t *buf, uint32_t *len, mdns_reply_t *reply) -{ - int res = -1; - int i, n, ndots; - char *dot; - - if (name == NULL) return -1; - - mdns_config_t *config = _mdns_copy_system_config(); - if (config == NULL) return -1; - - // NDOTS is the threshold for trying a qualified name "as is" - ndots = config->ndots; - if (ndots == 0) ndots = 1; - - // count the dots, and remember position of the last one - n = 0; - dot = NULL; - for (i = 0; name[i] != '\0'; i++) { - if (name[i] == '.') { - n++; - dot = (char *)(name + i); - } - } - // FQDN has dot for last character - if (fqdn == 0 && dot != NULL && dot[1] == '\0') fqdn = 1; - - // if the name has at least ndots, try first as an absolute query. - // FQDN and PTR queries are always absolute. - if (n >= ndots || fqdn == 1 || type == ns_t_ptr) { - res = _mdns_query_absolute(config, name, class, type, interface, flags, fqdn, buf, len, reply); - if (res == 0) { - _mdns_config_release(config); - return res; - } - } - - // stop if FQDN, PTR, or no recursion requested - if (fqdn == 1 || type == ns_t_ptr || recurse == 0) { - _mdns_config_release(config); - return -1; - } - - // Qualify the name with each of the search domains looking for a match. - char **search = config->search_list; - if (search != NULL) { - res = -1; - for (i = 0; i < MAXDNSRCH && search[i] != NULL; ++i) { - char *qname; - asprintf(&qname, "%s.%s", name, search[i]); - res = _mdns_search(qname, class, type, interface, flags, 0, 0, buf, len, reply); - free(qname); - if (res == 0) break; - } - } else { - // The name is not fully qualified and there is no search list. - // Try each default resolver, qualifying the name with that - // resolver's domain. - res = _mdns_query_unqualified(config, name, class, type, interface, flags, buf, len, reply); - } - _mdns_config_release(config); - return res; -} - static char * _mdns_reverse_ipv4(const char *addr) { @@ -846,7 +367,7 @@ _mdns_reply_clear(mdns_reply_t *r) } static si_item_t * -_mdns_hostbyname(si_mod_t *si, const char *name, int af, const char *interface, uint32_t *err) +mdns_hostbyname(si_mod_t *si, const char *name, int af, const char *interface, uint32_t *err) { uint32_t type; mdns_hostent_t h; @@ -883,7 +404,7 @@ _mdns_hostbyname(si_mod_t *si, const char *name, int af, const char *interface, } h.host.h_addrtype = af; - status = _mdns_search(name, ns_c_in, type, interface, flags, 0, 1, NULL, NULL, &reply); + status = _mdns_search(name, ns_c_in, type, interface, flags, NULL, NULL, &reply); if (status != 0 || h.addr_count == 0) { _mdns_reply_clear(&reply); if (err != NULL) *err = SI_STATUS_H_ERRNO_HOST_NOT_FOUND; @@ -909,7 +430,7 @@ _mdns_hostbyname(si_mod_t *si, const char *name, int af, const char *interface, } static si_item_t * -_mdns_hostbyaddr(si_mod_t *si, const void *addr, int af, const char *interface, uint32_t *err) +mdns_hostbyaddr(si_mod_t *si, const void *addr, int af, const char *interface, uint32_t *err) { mdns_hostent_t h; mdns_reply_t reply; @@ -949,7 +470,7 @@ _mdns_hostbyaddr(si_mod_t *si, const void *addr, int af, const char *interface, } h.host.h_addrtype = af; - status = _mdns_search(name, ns_c_in, ns_t_ptr, interface, flags, 0, 1, NULL, NULL, &reply); + status = _mdns_search(name, ns_c_in, ns_t_ptr, interface, flags, NULL, NULL, &reply); free(name); if (status != 0) { _mdns_reply_clear(&reply); @@ -974,14 +495,10 @@ _mdns_hostbyaddr(si_mod_t *si, const void *addr, int af, const char *interface, } static si_list_t * -_mdns_addrinfo(si_mod_t *si, const void *node, const void *serv, uint32_t family, uint32_t socktype, uint32_t proto, uint32_t flags, const char *interface, uint32_t *err) +mdns_addrinfo(si_mod_t *si, const void *node, const void *serv, uint32_t family, uint32_t socktype, uint32_t proto, uint32_t flags, const char *interface, uint32_t *err) { int wantv4 = 1; int wantv6 = 1; - if (family == AF_INET6) wantv4 = 0; - else if (family == AF_INET) wantv6 = 0; - else if (family != AF_UNSPEC) return NULL; - struct in_addr a4; struct in6_addr a6; mdns_hostent_t h4; @@ -990,6 +507,19 @@ _mdns_addrinfo(si_mod_t *si, const void *node, const void *serv, uint32_t family uint32_t type; uint16_t port; + if (family == AF_INET6) + { + if ((flags & AI_V4MAPPED) == 0) wantv4 = 0; + } + else if (family == AF_INET) + { + wantv6 = 0; + } + else if (family != AF_UNSPEC) + { + return NULL; + } + if (err != NULL) *err = SI_STATUS_NO_ERROR; si_list_t *out = NULL; @@ -1040,16 +570,16 @@ _mdns_addrinfo(si_mod_t *si, const void *node, const void *serv, uint32_t family p6 = &a6; memcpy(p6, node, sizeof(a6)); } - out = si_addrinfo_list(si, socktype, proto, p4, p6, port, 0, cname, cname); + out = si_addrinfo_list(si, flags, socktype, proto, p4, p6, port, 0, cname, cname); } else { DNSServiceFlags dns_flags = 0; if (flags & AI_ADDRCONFIG) { dns_flags |= kDNSServiceFlagsSuppressUnusable; } int res; - res = _mdns_search(node, ns_c_in, type, interface, dns_flags, 0, 1, NULL, NULL, &reply); + res = _mdns_search(node, ns_c_in, type, interface, dns_flags, NULL, NULL, &reply); if (res == 0 && (h4.addr_count > 0 || h6.addr_count > 0)) { - out = si_addrinfo_list_from_hostent(si, socktype, proto, + out = si_addrinfo_list_from_hostent(si, flags, socktype, proto, port, 0, (wantv4 ? &h4.host : NULL), (wantv6 ? &h6.host : NULL)); @@ -1062,7 +592,7 @@ _mdns_addrinfo(si_mod_t *si, const void *node, const void *serv, uint32_t family } static si_list_t * -_mdns_srv_byname(si_mod_t* si, const char *qname, const char *interface, uint32_t *err) +mdns_srv_byname(si_mod_t* si, const char *qname, const char *interface, uint32_t *err) { si_list_t *out = NULL; mdns_reply_t reply; @@ -1074,7 +604,7 @@ _mdns_srv_byname(si_mod_t* si, const char *qname, const char *interface, uint32_ if (err != NULL) *err = SI_STATUS_NO_ERROR; memset(&reply, 0, sizeof(reply)); - res = _mdns_search(qname, ns_c_in, ns_t_srv, interface, flags, 0, 1, NULL, NULL, &reply); + res = _mdns_search(qname, ns_c_in, ns_t_srv, interface, flags, NULL, NULL, &reply); if (res == 0) { srv = reply.srv; while (srv) { @@ -1093,7 +623,7 @@ _mdns_srv_byname(si_mod_t* si, const char *qname, const char *interface, uint32_ * We support dns_async_start / cancel / handle_reply using dns_item_call */ static si_item_t * -_mdns_item_call(si_mod_t *si, int call, const char *name, const char *ignored, const char *interface, uint32_t class, uint32_t type, uint32_t *err) +mdns_item_call(si_mod_t *si, int call, const char *name, const char *ignored, const char *interface, uint32_t class, uint32_t type, uint32_t *err) { int res; uint8_t buf[DNS_MAX_RECEIVE_SIZE]; @@ -1102,23 +632,10 @@ _mdns_item_call(si_mod_t *si, int call, const char *name, const char *ignored, c mdns_hostent_t h4; mdns_hostent_t h6; si_item_t *out; - int norecurse = 0; DNSServiceFlags flags = 0; if (err != NULL) *err = SI_STATUS_NO_ERROR; - switch (call) { - case SI_CALL_DNS_QUERY: - norecurse = 1; - break; - case SI_CALL_DNS_SEARCH: - break; - default: - if (err) *err = SI_STATUS_H_ERRNO_NO_RECOVERY; - return NULL; - break; - } - if (name == NULL) { if (err != NULL) *err = SI_STATUS_H_ERRNO_NO_RECOVERY; return NULL; @@ -1135,7 +652,7 @@ _mdns_item_call(si_mod_t *si, int call, const char *name, const char *ignored, c reply.h4 = &h4; reply.h6 = &h6; - res = _mdns_search(name, class, type, interface, flags, norecurse, 1, buf, &len, &reply); + res = _mdns_search(name, class, type, interface, flags, buf, &len, &reply); if (res != 0 || len <= 0 || len > DNS_MAX_RECEIVE_SIZE) { _mdns_reply_clear(&reply); if (err != NULL) *err = SI_STATUS_H_ERRNO_HOST_NOT_FOUND; @@ -1162,16 +679,14 @@ _mdns_item_call(si_mod_t *si, int call, const char *name, const char *ignored, c } static int -_mdns_is_valid(si_mod_t *si, si_item_t *item) +mdns_is_valid(si_mod_t *si, si_item_t *item) { return 0; } static void -_mdns_close(si_mod_t *si) +mdns_close(si_mod_t *si) { - if (_dns_config_token != -1) notify_cancel(_dns_config_token); - //_mdns_dir_token; } static void @@ -1194,46 +709,49 @@ _mdns_atfork_child(void) // child needs to force re-initialization _mdns_old_sdref = _mdns_sdref; // for later deallocation _mdns_sdref = NULL; - _dns_config_token = -1; pthread_mutex_unlock(&_mdns_mutex); } -__private_extern__ si_mod_t * -si_module_static_mdns(void) +static void +_mdns_init(void) { - si_mod_t *out = (si_mod_t *)calloc(1, sizeof(si_mod_t)); - char *outname = strdup("mdns"); - - if ((out == NULL) || (outname == NULL)) - { - free(out); - free(outname); - return NULL; - } - - out->name = outname; - out->vers = 1; - out->refcount = 1; - out->private = NULL; - - out->sim_close = _mdns_close; - out->sim_is_valid = _mdns_is_valid; - out->sim_host_byname = _mdns_hostbyname; - out->sim_host_byaddr = _mdns_hostbyaddr; - out->sim_item_call = _mdns_item_call; - out->sim_addrinfo = _mdns_addrinfo; - out->sim_srv_byname = _mdns_srv_byname; - - int res; - - res = notify_register_check(dns_configuration_notify_key(), &_dns_config_token); - if (res != NOTIFY_STATUS_OK) _dns_config_token = -1; - pthread_atfork(_mdns_atfork_prepare, _mdns_atfork_parent, _mdns_atfork_child); _mdns_debug = getenv("RES_DEBUG") != NULL; +} - return out; +si_mod_t * +si_module_static_mdns(void) +{ + static const struct si_mod_vtable_s mdns_vtable = + { + .sim_close = &mdns_close, + .sim_is_valid = &mdns_is_valid, + .sim_host_byname = &mdns_hostbyname, + .sim_host_byaddr = &mdns_hostbyaddr, + .sim_item_call = &mdns_item_call, + .sim_addrinfo = &mdns_addrinfo, + .sim_srv_byname = &mdns_srv_byname, + }; + + static si_mod_t si = + { + .vers = 1, + .refcount = 1, + .flags = SI_MOD_FLAG_STATIC, + + .private = NULL, + .vtable = &mdns_vtable, + }; + + static dispatch_once_t once; + + dispatch_once(&once, ^{ + si.name = strdup("mdns"); + _mdns_init(); + }); + + return (si_mod_t*)&si; } /* @@ -1248,7 +766,7 @@ _mdns_parse_domain_name(const uint8_t *data, uint32_t datalen) uint32_t len; uint32_t domainlen = 0; char *domain = NULL; - + if ((data == NULL) || (datalen == 0)) return NULL; // i: index into input data @@ -1286,8 +804,9 @@ _mdns_parse_domain_name(const uint8_t *data, uint32_t datalen) static int _mdns_pack_domain_name(const char* str, uint8_t *buf, size_t buflen) { int i = 0; + uintptr_t len = 0; + while (i < buflen) { - uintptr_t len; // calculate length to next '.' or '\0' char *dot = strchr(str, '.'); if (dot == NULL) dot = strchr(str, '\0'); @@ -1295,13 +814,21 @@ _mdns_pack_domain_name(const char* str, uint8_t *buf, size_t buflen) { if (len > NS_MAXLABEL) return -1; // copy data for label buf[i++] = len; - while (str < dot) { + while (str < dot && i < buflen) { buf[i++] = *str++; } // skip past '.', break if '\0' if (*str++ == '\0') break; } + if (i >= buflen) return -1; + + if (len > 0) { + // no trailing dot - add a null label + buf[i++] = 0; + if (i >= buflen) return -1; + } + buf[i] = '\0'; return i; } @@ -1451,6 +978,9 @@ _mdns_query_start(mdns_query_context_t *ctx, mdns_reply_t *reply, uint8_t *answe flags |= kDNSServiceFlagsShareConnection; flags |= kDNSServiceFlagsReturnIntermediates; + /* mDNSResponder is now responsible for timeouts */ + flags |= kDNSServiceFlagsTimeout; + memset(ctx, 0, sizeof(mdns_query_context_t)); if (answer && anslen) { @@ -1540,11 +1070,13 @@ _mdns_query_clear(mdns_query_context_t *ctx) int complete = _mdns_query_is_complete(ctx); if (ctx == NULL) return complete; - /* only dealloc this DNSServiceRef if the "main" _mdns_sdref has not been deallocated */ - if (ctx->sd != NULL && ctx->sd_gen == _mdns_generation) { - DNSServiceRefDeallocate(ctx->sd); + if (ctx->sd != NULL) { + /* only dealloc this DNSServiceRef if the "main" _mdns_sdref has not been deallocated */ + if (ctx->sd != NULL && ctx->sd_gen == _mdns_generation) { + DNSServiceRefDeallocate(ctx->sd); + } } - + ctx->sd = NULL; ctx->sd_gen = 0; ctx->flags = 0; @@ -1794,7 +1326,7 @@ _mdns_timeout(struct timespec *timeout, const struct timespec *deadline) } int -_mdns_query_mDNSResponder(const char *name, int class, int type, const char *interface, DNSServiceFlags flags, uint8_t *answer, uint32_t *anslen, mdns_reply_t *reply, uint32_t timeout_sec) +_mdns_search(const char *name, int class, int type, const char *interface, DNSServiceFlags flags, uint8_t *answer, uint32_t *anslen, mdns_reply_t *reply) { DNSServiceErrorType err = 0; int kq, n, wait = 1; @@ -1809,6 +1341,9 @@ _mdns_query_mDNSResponder(const char *name, int class, int type, const char *int si_inet_config(&n_iface_4, NULL); if (n_iface_4 > 0) n_iface_4--; + // limit the number of initialization retries + int initialize_retries = 3; + // 2 for A and AAAA parallel queries int n_ctx = 0; mdns_query_context_t ctx[2]; @@ -1817,7 +1352,7 @@ _mdns_query_mDNSResponder(const char *name, int class, int type, const char *int #if TARGET_OS_EMBEDDED // log a warning for queries from the main thread - if (pthread_main_np()) asl_log(NULL, NULL, ASL_LEVEL_WARNING, "Warning: Libinfo call to mDNSResponder on main thread"); + if (pthread_is_threaded_np() && pthread_main_np()) asl_log(NULL, NULL, ASL_LEVEL_WARNING, "Warning: Libinfo call to mDNSResponder on main thread"); #endif // TARGET_OS_EMBEDDED // Timeout Logic @@ -1835,8 +1370,7 @@ _mdns_query_mDNSResponder(const char *name, int class, int type, const char *int // for the receipt of a AAAA response. // determine the maximum time to wait for a result - if (timeout_sec == 0) timeout_sec = RES_MAXRETRANS; - delta.tv_sec = timeout_sec; + delta.tv_sec = RES_MAXRETRANS + 5; delta.tv_nsec = 0; _mdns_deadline(&finish, &delta); timeout = delta; @@ -1870,6 +1404,11 @@ _mdns_query_mDNSResponder(const char *name, int class, int type, const char *int } // (re)initialize the shared connection err = DNSServiceCreateConnection(&_mdns_sdref); + + // limit the number of retries + if (initialize_retries-- <= 0 && err == 0) { + err = kDNSServiceErr_Unknown; + } if (err != 0) { wait = 0; pthread_mutex_unlock(&_mdns_mutex); @@ -1966,7 +1505,7 @@ _mdns_query_mDNSResponder(const char *name, int class, int type, const char *int if (_mdns_debug) printf(";; done\n"); break; } else if (got_a_response != 0) { - // Got A record or NXERROR for A query, adjust deadline for AAAA. + // got A, adjust deadline for AAAA struct timespec now, tn, extra; // delta = now - start @@ -1985,6 +1524,7 @@ _mdns_query_mDNSResponder(const char *name, int class, int type, const char *int } else if (got_a_response == GOT_ERROR) { extra.tv_sec = MEDIUM_AAAA_EXTRA; } + // tn = 2 * delta _mdns_add_time(&tn, &delta, &delta); diff --git a/lookup.subproj/search_module.c b/lookup.subproj/search_module.c index 8ea0f1d..2b17317 100644 --- a/lookup.subproj/search_module.c +++ b/lookup.subproj/search_module.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2009 Apple Inc. All rights reserved. + * Copyright (c) 2008-2010 Apple Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -33,46 +33,38 @@ #include #include #include +#include #include "si_module.h" #define _PATH_SI_CONF "/etc/sysinfo.conf" -#define SEARCH_FLAG_MAC 0x00000001 -#define SEARCH_FLAG_APPLETV 0x00000002 -#define SEARCH_FLAG_IPHONE 0x00000004 -#define SEARCH_FLAG_CACHE_ENABLED 0x00010000 +#define SEARCH_FLAG_CACHE_ENABLED 0x00000001 +#define SEARCH_MODULE_FLAG_DISABLED 0x00000001 typedef struct { si_mod_t **module; + uint32_t *module_flags; uint32_t count; uint32_t flags; } search_list_t; typedef struct { - uint32_t flags; search_list_t search_list[CATEGORY_COUNT]; si_mod_t *cache; - si_mod_t *dns; - si_mod_t *mdns; - si_mod_t *file; - si_mod_t *ds; } search_si_private_t; -__private_extern__ void si_cache_add_item(si_mod_t *si, si_mod_t *src, si_item_t *item); -__private_extern__ void si_cache_add_list(si_mod_t *si, si_mod_t *src, si_list_t *list); +extern void si_cache_add_item(si_mod_t *si, si_mod_t *src, si_item_t *item); +extern void si_cache_add_list(si_mod_t *si, si_mod_t *src, si_list_t *list); -__private_extern__ char **_fsi_tokenize(char *data, const char *sep, int trailing_empty, int *ntokens); -__private_extern__ char *_fsi_get_line(FILE *fp); +extern char **_fsi_tokenize(char *data, const char *sep, int trailing_empty, int *ntokens); +extern char *_fsi_get_line(FILE *fp); -#ifdef DS_AVAILABLE -extern int _ds_running(); -#else -static inline int _ds_running(void) { return 0; } -#endif +static void si_module_config_parse_line(search_si_private_t *pp, char *line); +static void si_module_config_modules_for_category(search_si_private_t *pp, int cat, int ntokens, const char * const *tokens); -static __attribute__((noinline)) si_mod_t * +static si_mod_t * search_get_module(search_si_private_t *pp, int cat, int *n) { int x; @@ -83,24 +75,49 @@ search_get_module(search_si_private_t *pp, int cat, int *n) *n = x + 1; /* Use custom search list if available */ - if (x < pp->search_list[cat].count) + if (pp->search_list[cat].count > 0 && x < pp->search_list[cat].count) { return pp->search_list[cat].module[x]; } - - /* - * Search order: - * 1) cache - * 2) DS if available, otherwise flat files - * 3) mdns (for host lookups only) - */ - switch (x) + + /* Otherwise use the default search list */ + while (x < pp->search_list[CATEGORY_DEFAULT].count) { - case 0: return pp->cache; - case 1: if (_ds_running()) return pp->ds; - else return pp->file; - case 2: return pp->mdns; - default: return NULL; + if (pp->search_list[CATEGORY_DEFAULT].module_flags[x] & SEARCH_MODULE_FLAG_DISABLED) + { + x++; + *n = x + 1; + } + else + { + return pp->search_list[CATEGORY_DEFAULT].module[x]; + } + } + + return NULL; +} + +__private_extern__ void +search_set_flags(si_mod_t *si, const char *name, uint32_t flag) +{ + search_si_private_t *pp; + uint32_t i; + + if (si == NULL) return; + if (si->private == NULL) return; + + pp = (search_si_private_t *)si->private; + + for (i = 0; i < pp->search_list[CATEGORY_DEFAULT].count; i++) + { + si_mod_t *mod = pp->search_list[CATEGORY_DEFAULT].module[i]; + if ((mod == NULL) || (mod->name == NULL)) continue; + + if (string_equal(name, mod->name)) + { + pp->search_list[CATEGORY_DEFAULT].module_flags[i] = flag; + break; + } } } @@ -108,15 +125,18 @@ static si_mod_t * search_cat_cache(search_si_private_t *pp, int cat) { if (pp == NULL) return NULL; - if ((cat < 0) || (cat > CATEGORY_COUNT)) return NULL; + if (cat < 0 || cat > CATEGORY_COUNT) return NULL; - if (pp->search_list[cat].count > 0) + if (pp->search_list[cat].count == 0) { - if (pp->search_list[cat].flags & SEARCH_FLAG_CACHE_ENABLED) return pp->cache; - return NULL; + cat = CATEGORY_DEFAULT; + } + + if ((pp->search_list[cat].flags & SEARCH_FLAG_CACHE_ENABLED) != 0) + { + return pp->cache; } - if ((pp->flags & SEARCH_FLAG_MAC) || (pp->flags & SEARCH_FLAG_APPLETV) || (pp->flags & SEARCH_FLAG_IPHONE)) return pp->cache; return NULL; } @@ -131,12 +151,6 @@ search_close(si_mod_t *si) pp = (search_si_private_t *)si->private; - si_module_release(pp->cache); - si_module_release(pp->file); - si_module_release(pp->dns); - si_module_release(pp->mdns); - si_module_release(pp->ds); - for (i = 0; i < CATEGORY_COUNT; i++) { if (pp->search_list[i].module != NULL) @@ -212,7 +226,7 @@ search_item_bynumber(si_mod_t *si, uint32_t number, int cat, si_item_t *(*call)( static si_list_t * search_list(si_mod_t *si, int cat, si_list_t *(*call)(si_mod_t *)) { - int i; + int i, null_res; search_si_private_t *pp; si_list_t *list, *all; si_mod_t *cache, *src; @@ -233,68 +247,73 @@ search_list(si_mod_t *si, int cat, si_list_t *(*call)(si_mod_t *)) i = 0; all = NULL; + null_res = 0; while (NULL != (src = search_get_module(pp, cat, &i))) { if (src == pp->cache) continue; list = call(src); - if (list == NULL) continue; + if (list == NULL) + { + null_res = 1; + continue; + } all = si_list_concat(all, list); si_list_release(list); } - si_cache_add_list(cache, si, all); + if ((all != NULL) && (null_res == 0)) si_cache_add_list(cache, si, all); return all; } -__private_extern__ si_item_t * +static si_item_t * search_user_byname(si_mod_t *si, const char *name) { return search_item_byname(si, name, CATEGORY_USER, si_user_byname); } -__private_extern__ si_item_t * +static si_item_t * search_user_byuid(si_mod_t *si, uid_t uid) { return search_item_bynumber(si, (uint32_t)uid, CATEGORY_USER, si_user_byuid); } -__private_extern__ si_list_t * +static si_list_t * search_user_all(si_mod_t *si) { return search_list(si, CATEGORY_USER, si_user_all); } -__private_extern__ si_item_t * +static si_item_t * search_group_byname(si_mod_t *si, const char *name) { return search_item_byname(si, name, CATEGORY_GROUP, si_group_byname); } -__private_extern__ si_item_t * +static si_item_t * search_group_bygid(si_mod_t *si, gid_t gid) { return search_item_bynumber(si, (uint32_t)gid, CATEGORY_USER, si_group_bygid); } -__private_extern__ si_list_t * +static si_list_t * search_group_all(si_mod_t *si) { return search_list(si, CATEGORY_GROUP, si_group_all); } -__private_extern__ si_item_t * +static si_item_t * search_groupist(si_mod_t *si, const char *name) { return search_item_byname(si, name, CATEGORY_GROUPLIST, si_grouplist); } -__private_extern__ si_list_t * +static si_list_t * search_netgroup_byname(si_mod_t *si, const char *name) { - int i, cat; + int i, cat, null_res; search_si_private_t *pp; si_list_t *list, *all; si_mod_t *cache, *src; @@ -321,17 +340,21 @@ search_netgroup_byname(si_mod_t *si, const char *name) if (src == pp->cache) continue; list = si_netgroup_byname(src, name); - if (list == NULL) continue; + if (list == NULL) + { + null_res = 1; + continue; + } all = si_list_concat(all, list); si_list_release(list); } - si_cache_add_list(cache, si, all); + if ((all != NULL) && (null_res == 0)) si_cache_add_list(cache, si, all); return all; } -__private_extern__ int +static int search_in_netgroup(si_mod_t *si, const char *group, const char *host, const char *user, const char *domain) { int i, cat, innetgr; @@ -356,19 +379,19 @@ search_in_netgroup(si_mod_t *si, const char *group, const char *host, const char return 0; } -__private_extern__ si_item_t * +static si_item_t * search_alias_byname(si_mod_t *si, const char *name) { return search_item_byname(si, name, CATEGORY_ALIAS, si_alias_byname); } -__private_extern__ si_list_t * +static si_list_t * search_alias_all(si_mod_t *si) { return search_list(si, CATEGORY_ALIAS, si_alias_all); } -__private_extern__ si_item_t * +static si_item_t * search_host_byname(si_mod_t *si, const char *name, int af, const char *interface, uint32_t *err) { int i, cat; @@ -410,7 +433,7 @@ search_host_byname(si_mod_t *si, const char *name, int af, const char *interface return NULL; } -__private_extern__ si_item_t * +static si_item_t * search_host_byaddr(si_mod_t *si, const void *addr, int af, const char *interface, uint32_t *err) { int i, cat; @@ -435,7 +458,7 @@ search_host_byaddr(si_mod_t *si, const void *addr, int af, const char *interface cat = CATEGORY_HOST_IPV4; if (af == AF_INET6) cat = CATEGORY_HOST_IPV6; - + i = 0; while (NULL != (src = search_get_module(pp, cat, &i))) @@ -452,31 +475,31 @@ search_host_byaddr(si_mod_t *si, const void *addr, int af, const char *interface return NULL; } -__private_extern__ si_list_t * +static si_list_t * search_host_all(si_mod_t *si) { return search_list(si, CATEGORY_HOST, si_host_all); } -__private_extern__ si_item_t * +static si_item_t * search_network_byname(si_mod_t *si, const char *name) { return search_item_byname(si, name, CATEGORY_NETWORK, si_network_byname); } -__private_extern__ si_item_t * +static si_item_t * search_network_byaddr(si_mod_t *si, uint32_t addr) { return search_item_bynumber(si, addr, CATEGORY_NETWORK, si_network_byaddr); } -__private_extern__ si_list_t * +static si_list_t * search_network_all(si_mod_t *si) { return search_list(si, CATEGORY_NETWORK, si_network_all); } -__private_extern__ si_item_t * +static si_item_t * search_service_byname(si_mod_t *si, const char *name, const char *proto) { int i, cat; @@ -506,7 +529,7 @@ search_service_byname(si_mod_t *si, const char *name, const char *proto) return NULL; } -__private_extern__ si_item_t * +static si_item_t * search_service_byport(si_mod_t *si, int port, const char *proto) { int i, cat; @@ -535,37 +558,37 @@ search_service_byport(si_mod_t *si, int port, const char *proto) return NULL; } -__private_extern__ si_list_t * +static si_list_t * search_service_all(si_mod_t *si) { return search_list(si, CATEGORY_SERVICE, si_service_all); } -__private_extern__ si_item_t * +static si_item_t * search_protocol_byname(si_mod_t *si, const char *name) { return search_item_byname(si, name, CATEGORY_PROTOCOL, si_protocol_byname); } -__private_extern__ si_item_t * +static si_item_t * search_protocol_bynumber(si_mod_t *si, int number) { return search_item_bynumber(si, (uint32_t)number, CATEGORY_PROTOCOL, si_protocol_bynumber); } -__private_extern__ si_list_t * +static si_list_t * search_protocol_all(si_mod_t *si) { return search_list(si, CATEGORY_PROTOCOL, si_protocol_all); } -__private_extern__ si_item_t * +static si_item_t * search_rpc_byname(si_mod_t *si, const char *name) { return search_item_byname(si, name, CATEGORY_RPC, si_rpc_byname); } -__private_extern__ si_item_t * +static si_item_t * search_rpc_bynumber(si_mod_t *si, int number) { int i, cat; @@ -594,49 +617,49 @@ search_rpc_bynumber(si_mod_t *si, int number) return NULL; } -__private_extern__ si_list_t * +static si_list_t * search_rpc_all(si_mod_t *si) { return search_list(si, CATEGORY_RPC, si_rpc_all); } -__private_extern__ si_item_t * +static si_item_t * search_fs_byspec(si_mod_t *si, const char *name) { return search_item_byname(si, name, CATEGORY_FS, si_fs_byspec); } -__private_extern__ si_item_t * +static si_item_t * search_fs_byfile(si_mod_t *si, const char *name) { return search_item_byname(si, name, CATEGORY_FS, si_fs_byfile); } -__private_extern__ si_list_t * +static si_list_t * search_fs_all(si_mod_t *si) { return search_list(si, CATEGORY_FS, si_fs_all); } -__private_extern__ si_item_t * +static si_item_t * search_mac_byname(si_mod_t *si, const char *name) { return search_item_byname(si, name, CATEGORY_MAC, si_mac_byname); } -__private_extern__ si_item_t * +static si_item_t * search_mac_bymac(si_mod_t *si, const char *mac) { return search_item_byname(si, mac, CATEGORY_MAC, si_mac_bymac); } -__private_extern__ si_list_t * +static si_list_t * search_mac_all(si_mod_t *si) { return search_list(si, CATEGORY_MAC, si_mac_all); } -__private_extern__ si_list_t * +static si_list_t * search_srv_byname(si_mod_t *si, const char* qname, const char *interface, uint32_t *err) { int i, cat; @@ -656,9 +679,9 @@ search_srv_byname(si_mod_t *si, const char* qname, const char *interface, uint32 { if (src == pp->cache) continue; - if (src->sim_srv_byname != NULL) + if (src->vtable->sim_srv_byname != NULL) { - list = src->sim_srv_byname(src, qname, interface, err); + list = src->vtable->sim_srv_byname(src, qname, interface, err); if (list != NULL) return list; } } @@ -667,7 +690,7 @@ search_srv_byname(si_mod_t *si, const char* qname, const char *interface, uint32 return NULL; } -__private_extern__ int +static int search_wants_addrinfo(si_mod_t *si) { int i, cat; @@ -685,13 +708,13 @@ search_wants_addrinfo(si_mod_t *si) while (NULL != (src = search_get_module(pp, cat, &i))) { if (src == pp->cache) continue; - if (src->sim_addrinfo != NULL) return 1; + if (src->vtable->sim_addrinfo != NULL) return 1; } return 0; } -__private_extern__ si_list_t * +static si_list_t * search_addrinfo(si_mod_t *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) { int i, cat; @@ -713,9 +736,9 @@ search_addrinfo(si_mod_t *si, const void *node, const void *serv, uint32_t famil { if (src == pp->cache) continue; - if (src->sim_addrinfo != NULL) + if (src->vtable->sim_addrinfo != NULL) { - list = src->sim_addrinfo(src, node, serv, family, socktype, protocol, flags, interface, err); + list = src->vtable->sim_addrinfo(src, node, serv, family, socktype, protocol, flags, interface, err); if (list != NULL) return list; } } @@ -724,7 +747,7 @@ search_addrinfo(si_mod_t *si, const void *node, const void *serv, uint32_t famil return NULL; } -__private_extern__ si_item_t * +static si_item_t * search_nameinfo(si_mod_t *si, const struct sockaddr *sa, int flags, const char *interface, uint32_t *err) { int i, cat; @@ -735,7 +758,7 @@ search_nameinfo(si_mod_t *si, const struct sockaddr *sa, int flags, const char * if (err != NULL) *err = SI_STATUS_EAI_FAIL; if (si == NULL) return NULL; - + pp = (search_si_private_t *)si->private; if (pp == NULL) return NULL; @@ -757,7 +780,7 @@ search_nameinfo(si_mod_t *si, const struct sockaddr *sa, int flags, const char * return NULL; } -__private_extern__ int +static int search_is_valid(si_mod_t *si, si_item_t *item) { si_mod_t *src; @@ -774,412 +797,194 @@ search_is_valid(si_mod_t *si, si_item_t *item) return 0; } -static si_mod_t * -search_alloc() +si_mod_t * +si_module_static_search(void) { - si_mod_t *out; - char *outname; - search_si_private_t *pp; - - out = (si_mod_t *)calloc(1, sizeof(si_mod_t)); - outname = strdup("search"); - pp = (search_si_private_t *)calloc(1, sizeof(search_si_private_t)); - - if ((out == NULL) || (outname == NULL) || (pp == NULL)) + static const struct si_mod_vtable_s search_vtable = { - if (out != NULL) free(out); - if (outname != NULL) free(outname); - if (pp != NULL) free(pp); + .sim_close = &search_close, - errno = ENOMEM; - return NULL; - } + .sim_is_valid = &search_is_valid, - out->name = outname; - out->vers = 1; - out->refcount = 1; - out->private = pp; + .sim_user_byname = &search_user_byname, + .sim_user_byuid = &search_user_byuid, + .sim_user_all = &search_user_all, - out->sim_close = search_close; + .sim_group_byname = &search_group_byname, + .sim_group_bygid = &search_group_bygid, + .sim_group_all = &search_group_all, - out->sim_is_valid = search_is_valid; + .sim_grouplist = &search_groupist, - out->sim_user_byname = search_user_byname; - out->sim_user_byuid = search_user_byuid; - out->sim_user_all = search_user_all; + .sim_netgroup_byname = &search_netgroup_byname, + .sim_in_netgroup = &search_in_netgroup, - out->sim_group_byname = search_group_byname; - out->sim_group_bygid = search_group_bygid; - out->sim_group_all = search_group_all; + .sim_alias_byname = &search_alias_byname, + .sim_alias_all = &search_alias_all, - out->sim_grouplist = search_groupist; + .sim_host_byname = &search_host_byname, + .sim_host_byaddr = &search_host_byaddr, + .sim_host_all = &search_host_all, - out->sim_netgroup_byname = search_netgroup_byname; - out->sim_in_netgroup = search_in_netgroup; + .sim_network_byname = &search_network_byname, + .sim_network_byaddr = &search_network_byaddr, + .sim_network_all = &search_network_all, - out->sim_alias_byname = search_alias_byname; - out->sim_alias_all = search_alias_all; + .sim_service_byname = &search_service_byname, + .sim_service_byport = &search_service_byport, + .sim_service_all = &search_service_all, - out->sim_host_byname = search_host_byname; - out->sim_host_byaddr = search_host_byaddr; - out->sim_host_all = search_host_all; + .sim_protocol_byname = &search_protocol_byname, + .sim_protocol_bynumber = &search_protocol_bynumber, + .sim_protocol_all = &search_protocol_all, - out->sim_network_byname = search_network_byname; - out->sim_network_byaddr = search_network_byaddr; - out->sim_network_all = search_network_all; + .sim_rpc_byname = &search_rpc_byname, + .sim_rpc_bynumber = &search_rpc_bynumber, + .sim_rpc_all = &search_rpc_all, - out->sim_service_byname = search_service_byname; - out->sim_service_byport = search_service_byport; - out->sim_service_all = search_service_all; + .sim_fs_byspec = &search_fs_byspec, + .sim_fs_byfile = &search_fs_byfile, + .sim_fs_all = &search_fs_all, - out->sim_protocol_byname = search_protocol_byname; - out->sim_protocol_bynumber = search_protocol_bynumber; - out->sim_protocol_all = search_protocol_all; + .sim_mac_byname = &search_mac_byname, + .sim_mac_bymac = &search_mac_bymac, + .sim_mac_all = &search_mac_all, - out->sim_rpc_byname = search_rpc_byname; - out->sim_rpc_bynumber = search_rpc_bynumber; - out->sim_rpc_all = search_rpc_all; + .sim_addrinfo = &search_addrinfo, + .sim_wants_addrinfo = &search_wants_addrinfo, + .sim_nameinfo = &search_nameinfo, - out->sim_fs_byspec = search_fs_byspec; - out->sim_fs_byfile = search_fs_byfile; - out->sim_fs_all = search_fs_all; + .sim_srv_byname = &search_srv_byname, + }; - out->sim_mac_byname = search_mac_byname; - out->sim_mac_bymac = search_mac_bymac; - out->sim_mac_all = search_mac_all; - - out->sim_addrinfo = search_addrinfo; - out->sim_wants_addrinfo = search_wants_addrinfo; - out->sim_nameinfo = search_nameinfo; - - out->sim_srv_byname = search_srv_byname; - - return out; -} - -static void -init_optional_modules(search_si_private_t *pp) -{ - if (pp->mdns == NULL) + static si_mod_t si = { - pp->mdns = si_module_with_name("mdns"); - /* allow this to fail */ - } + .vers = 1, + .refcount = 1, + .flags = SI_MOD_FLAG_STATIC, -#ifdef DS_AVAILABLE - if (pp->flags & SEARCH_FLAG_MAC) - { - if (pp->ds == NULL) - { - pp->ds = si_module_with_name("ds"); - /* allow this to fail */ - } - } -#endif + .private = NULL, + .vtable = &search_vtable, + }; - if (pp->flags & (SEARCH_FLAG_APPLETV | SEARCH_FLAG_IPHONE)) - { - if (pp->dns == NULL) - { - pp->dns = si_module_with_name("dns"); - /* allow this to fail */ - } - } -} + static dispatch_once_t once; -__private_extern__ si_mod_t * -si_module_static_search() -{ - si_mod_t *out; - search_si_private_t *pp; - FILE *conf; - char *line, **tokens; - int cat, i, j, ntokens; + dispatch_once(&once, ^{ + si.name = strdup("search"); + search_si_private_t *pp = calloc(1, sizeof(search_si_private_t)); + si.private = pp; - out = search_alloc(); - if (out == NULL) return NULL; - - pp = (search_si_private_t *)out->private; - if (pp == NULL) - { - free(out); - return NULL; - } + /* + * Default search order: + * 1) cache + * 2) DirectoryService/OpenDirectory (where available) + * 3) flat file + * 4) mDNSResponder + */ -#ifdef CONFIG_MAC - pp->flags = SEARCH_FLAG_CACHE_ENABLED | SEARCH_FLAG_MAC; -#endif -#ifdef CONFIG_APPLETV - pp->flags = SEARCH_FLAG_CACHE_ENABLED | SEARCH_FLAG_APPLETV; -#endif - -#ifdef CONFIG_IPHONE - pp->flags = SEARCH_FLAG_CACHE_ENABLED | SEARCH_FLAG_IPHONE; + const char * const modules[] = + { + "default", // CATEGORY_DEFAULT + "cache", +#ifdef DS_AVAILABLE + "ds", #endif + "mdns", + "file", + }; - pp->cache = si_module_with_name("cache"); - if (pp->cache == NULL) - { - search_close(out); - return NULL; - } - - pp->file = si_module_with_name("file"); - if (pp->file == NULL) - { - search_close(out); - return NULL; - } - - init_optional_modules(pp); + int count = sizeof(modules) / sizeof(char *); + si_module_config_modules_for_category(pp, CATEGORY_DEFAULT, count, modules); + pp->cache = pp->search_list[CATEGORY_DEFAULT].module[0]; - conf = fopen(_PATH_SI_CONF, "r"); - if (conf == NULL) return out; - - forever - { - line = _fsi_get_line(conf); - if (line == NULL) break; - - if (line[0] == '#') + FILE *conf = fopen(_PATH_SI_CONF, "r"); + errno = 0; + if (conf != NULL) { - free(line); - line = NULL; - continue; - } + forever + { + char *line = _fsi_get_line(conf); + if (line == NULL) break; - ntokens = 0; - tokens = _fsi_tokenize(line, " : ", 0, &ntokens); + si_module_config_parse_line(pp, line); + free(line); + } - if (ntokens < 2) - { - free(tokens); - tokens = NULL; - free(line); - line = NULL; - continue; + fclose(conf); } + }); - if (string_equal(tokens[0], "config")) - { - if (string_equal(tokens[1], "mac")) pp->flags = SEARCH_FLAG_CACHE_ENABLED | SEARCH_FLAG_MAC; - else if (string_equal(tokens[1], "appletv")) pp->flags = SEARCH_FLAG_CACHE_ENABLED | SEARCH_FLAG_APPLETV; - else if (string_equal(tokens[1], "iphone")) pp->flags = SEARCH_FLAG_CACHE_ENABLED | SEARCH_FLAG_IPHONE; - - init_optional_modules(pp); - - free(tokens); - tokens = NULL; - free(line); - line = NULL; - continue; - } + return &si; +} - if (string_equal(tokens[0], "user")) cat = CATEGORY_USER; - else if (string_equal(tokens[0], "group")) cat = CATEGORY_GROUP; - else if (string_equal(tokens[0], "grouplist")) cat = CATEGORY_GROUPLIST; - else if (string_equal(tokens[0], "netgroup")) cat = CATEGORY_NETGROUP; - else if (string_equal(tokens[0], "alias")) cat = CATEGORY_ALIAS; - else if (string_equal(tokens[0], "host")) cat = CATEGORY_HOST_IPV4; - else if (string_equal(tokens[0], "network")) cat = CATEGORY_NETWORK; - else if (string_equal(tokens[0], "service")) cat = CATEGORY_SERVICE; - else if (string_equal(tokens[0], "protocol")) cat = CATEGORY_PROTOCOL; - else if (string_equal(tokens[0], "rpc")) cat = CATEGORY_RPC; - else if (string_equal(tokens[0], "fs")) cat = CATEGORY_FS; - else if (string_equal(tokens[0], "mac")) cat = CATEGORY_MAC; - else if (string_equal(tokens[0], "addrinfo")) cat = CATEGORY_ADDRINFO; - else if (string_equal(tokens[0], "nameinfo")) cat = CATEGORY_NAMEINFO; - else - { - free(tokens); - tokens = NULL; - free(line); - line = NULL; - continue; - } +static void +si_module_config_parse_line(search_si_private_t *pp, char *line) +{ + if (line == NULL || line[0] == '#') { + return; + } - do_ipv6: + int ntokens = 0; + char **tokens = _fsi_tokenize(line, " : ", 0, &ntokens); - if (pp->search_list[cat].module != NULL) - { - free(tokens); - tokens = NULL; - free(line); - line = NULL; - continue; - } + int cat = CATEGORY_INVALID; - pp->search_list[cat].count = ntokens - 1; - pp->search_list[cat].module = (si_mod_t **)calloc(pp->search_list[cat].count, sizeof(si_mod_t *)); - if (pp->search_list[cat].module == NULL) - { - search_close(out); - free(tokens); - tokens = NULL; - free(line); - line = NULL; - return NULL; - } + if (string_equal(tokens[0], "default")) cat = CATEGORY_DEFAULT; + else if (string_equal(tokens[0], "user")) cat = CATEGORY_USER; + else if (string_equal(tokens[0], "group")) cat = CATEGORY_GROUP; + else if (string_equal(tokens[0], "grouplist")) cat = CATEGORY_GROUPLIST; + else if (string_equal(tokens[0], "netgroup")) cat = CATEGORY_NETGROUP; + else if (string_equal(tokens[0], "alias")) cat = CATEGORY_ALIAS; + else if (string_equal(tokens[0], "host")) cat = CATEGORY_HOST_IPV4; + else if (string_equal(tokens[0], "network")) cat = CATEGORY_NETWORK; + else if (string_equal(tokens[0], "service")) cat = CATEGORY_SERVICE; + else if (string_equal(tokens[0], "protocol")) cat = CATEGORY_PROTOCOL; + else if (string_equal(tokens[0], "rpc")) cat = CATEGORY_RPC; + else if (string_equal(tokens[0], "fs")) cat = CATEGORY_FS; + else if (string_equal(tokens[0], "mac")) cat = CATEGORY_MAC; + else if (string_equal(tokens[0], "addrinfo")) cat = CATEGORY_ADDRINFO; + else if (string_equal(tokens[0], "nameinfo")) cat = CATEGORY_NAMEINFO; - for (i = 1, j = 0; i < ntokens; i++, j++) - { - if (string_equal(tokens[i], "cache")) - { - pp->search_list[cat].module[j] = pp->cache; - pp->search_list[cat].flags = SEARCH_FLAG_CACHE_ENABLED; - } - else if (string_equal(tokens[i], "file")) - { - if (pp->file == NULL) pp->file = si_module_with_name("file"); - pp->search_list[cat].module[j] = pp->file; - } - else if (string_equal(tokens[i], "dns")) - { - if (pp->dns == NULL) pp->dns = si_module_with_name("dns"); - pp->search_list[cat].module[j] = pp->dns; - } - else if (string_equal(tokens[i], "mdns")) - { - if (pp->mdns == NULL) pp->mdns = si_module_with_name("mdns"); - pp->search_list[cat].module[j] = pp->mdns; - } - else if (string_equal(tokens[i], "ds")) - { - if (pp->ds == NULL) pp->ds = si_module_with_name("ds"); - pp->search_list[cat].module[j] = pp->ds; - } - } - - if (cat == CATEGORY_HOST_IPV4) - { - cat = CATEGORY_HOST_IPV6; - goto do_ipv6; - } - - free(tokens); - tokens = NULL; - free(line); - line = NULL; + if (cat != CATEGORY_INVALID) + { + si_module_config_modules_for_category(pp, cat, ntokens, (const char * const *)tokens); } - return out; + free(tokens); } -__private_extern__ si_mod_t * -search_custom(int n, ...) +static void +si_module_config_modules_for_category(search_si_private_t *pp, int cat, int ntokens, const char * const *tokens) { - va_list ap; - si_mod_t *out, *m; - search_si_private_t *pp; - int cat, i; - char *name; - - if (n == 0) return si_module_static_search(); - - out = search_alloc(); - if (out == NULL) return NULL; - - pp = (search_si_private_t *)out->private; - if (pp == NULL) + int count = ntokens - 1; + pp->search_list[cat].count = count; + if (count == 0) { - free(out); - return NULL; + return; } - for (cat = 0; cat < CATEGORY_COUNT; cat++) + pp->search_list[cat].module = (si_mod_t **)calloc(pp->search_list[cat].count, sizeof(si_mod_t *)); + pp->search_list[cat].module_flags = (uint32_t *)calloc(pp->search_list[cat].count, sizeof(uint32_t)); + if ((pp->search_list[cat].module == NULL) || (pp->search_list[cat].module_flags == NULL)) { - pp->search_list[cat].count = n; - pp->search_list[cat].module = (si_mod_t **)calloc(pp->search_list[cat].count, sizeof(si_mod_t *)); - if (pp->search_list[cat].module == NULL) - { - search_close(out); - return NULL; - } - + free(pp->search_list[cat].module); + free(pp->search_list[cat].module_flags); + return; } - va_start(ap, n); - - for (i = 0; i < n; i++) + int i, j; + for (i = 1, j = 0; i < ntokens; i++) { - name = va_arg(ap, char *); - if (name == NULL) break; - - m = NULL; - if (string_equal(name, "cache")) - { - if (pp->cache == NULL) - { - pp->cache = si_module_with_name("cache"); - m = pp->cache; - if (pp->cache == NULL) - { - search_close(out); - return NULL; - } - } - } - else if (string_equal(name, "file")) - { - if (pp->file == NULL) - { - pp->file = si_module_with_name("file"); - m = pp->file; - if (pp->file == NULL) - { - search_close(out); - return NULL; - } - } - } - else if (string_equal(name, "dns")) - { - if (pp->dns == NULL) - { - pp->dns = si_module_with_name("dns"); - m = pp->dns; - if (pp->dns == NULL) - { - search_close(out); - return NULL; - } - } - } - else if (string_equal(name, "mdns")) - { - if (pp->mdns == NULL) - { - pp->mdns = si_module_with_name("mdns"); - m = pp->mdns; - if (pp->mdns == NULL) - { - search_close(out); - return NULL; - } - } - } - else if (string_equal(name, "ds")) + si_mod_t *mod = si_module_with_name(tokens[i]); + if (mod != NULL) { - if (pp->ds == NULL) + pp->search_list[cat].module[j] = mod; + j++; + + if (string_equal(tokens[i], "cache")) { - pp->ds = si_module_with_name("ds"); - m = pp->ds; - if (pp->ds == NULL) - { - search_close(out); - return NULL; - } + pp->search_list[cat].flags |= SEARCH_FLAG_CACHE_ENABLED; } } - - for (cat = 0; cat < CATEGORY_COUNT; cat++) - { - if (string_equal(name, "cache")) pp->search_list[cat].flags = SEARCH_FLAG_CACHE_ENABLED; - pp->search_list[cat].module[i] = m; - } } - - va_end(ap); - - return out; } diff --git a/lookup.subproj/si_getaddrinfo.c b/lookup.subproj/si_getaddrinfo.c index 780a133..d227ad4 100644 --- a/lookup.subproj/si_getaddrinfo.c +++ b/lookup.subproj/si_getaddrinfo.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2009 Apple Inc. All rights reserved. + * Copyright (c) 2008-2011 Apple Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -53,34 +54,11 @@ #define WANT_A6_PLUS_MAPPED_A4 3 #define WANT_A6_OR_MAPPED_A4_IF_NO_A6 4 -#define TEREDO_PREFIX_32 0x20010000 #define V6TO4_PREFIX_16 0x2002 -#define ULA_PREFIX_8 0xfc - -#define NET_TYPE_UNKNOWN 0x00000000 -#define NET_TYPE_V4 0x00000001 -#define NET_TYPE_V6 0x00000002 -#define NET_TYPE_TEREDO 0x00000012 -#define NET_TYPE_6TO4 0x00000022 -#define NET_TYPE_LINKLOCAL 0x00000042 -#define NET_TYPE_SITELOCAL 0x00000082 -#define NET_TYPE_ULA 0x00000102 -#define NET_MASK_T6LSU 0x000001f0 - -typedef struct -{ - int v4_count; - int v6_count; - int v6to4_count; - int teredo_count; - int ula_count; - int ll_count; - int sl_count; - int gai_v6_preferred; -} config_stats_t; static int net_config_token = -1; -static config_stats_t config_stats_global; +static uint32_t net_v4_count = 0; +static uint32_t net_v6_count = 0; // includes 6to4 addresses static pthread_mutex_t net_config_mutex = PTHREAD_MUTEX_INITIALIZER; typedef struct { @@ -90,46 +68,14 @@ typedef struct { uint64_t ttl; } build_hostent_t; -static int -_si_net_addr_type(const struct sockaddr *s) -{ - const struct sockaddr_in6 *sa6 = (const struct sockaddr_in6 *)s; - - if (s == NULL) return NET_TYPE_UNKNOWN; - else if (s->sa_family == AF_INET) return NET_TYPE_V4; - else if (s->sa_family != AF_INET6) return NET_TYPE_UNKNOWN; - else if (sa6->sin6_addr.__u6_addr.__u6_addr32[0] == ntohs(TEREDO_PREFIX_32)) return NET_TYPE_TEREDO; - else if (sa6->sin6_addr.__u6_addr.__u6_addr16[0] == ntohs(V6TO4_PREFIX_16)) return NET_TYPE_6TO4; - else if (IN6_IS_ADDR_LINKLOCAL(&(sa6->sin6_addr))) return NET_TYPE_LINKLOCAL; - else if (IN6_IS_ADDR_SITELOCAL(&(sa6->sin6_addr))) return NET_TYPE_SITELOCAL; - else if ((sa6->sin6_addr.__u6_addr.__u6_addr8[0] & 0xfe) == ULA_PREFIX_8) return NET_TYPE_ULA; - - return NET_TYPE_V6; -} - -static int -_si_net_type_is_IPv6_globably_reachable_non_transitional(int t) -{ - if (t & NET_TYPE_V6) - { - if (t & NET_MASK_T6LSU) return 0; - return 1; - } - - return 0; -} - -static int -_si_netconfig(config_stats_t *stats) +__private_extern__ int +si_inet_config(uint32_t *inet4, uint32_t *inet6) { - int status, checkit, net_type; + int status, checkit; struct ifaddrs *ifa, *ifap; - if (stats == NULL) return 0; - pthread_mutex_lock(&net_config_mutex); - status = 0; checkit = 1; if (net_config_token < 0) @@ -144,6 +90,8 @@ _si_netconfig(config_stats_t *stats) if (status != 0) checkit = 1; } + status = 0; + if (checkit != 0) { if (getifaddrs(&ifa) < 0) @@ -152,78 +100,36 @@ _si_netconfig(config_stats_t *stats) } else { - memset(&config_stats_global, 0, sizeof(config_stats_t)); + net_v4_count = 0; + net_v6_count = 0; for (ifap = ifa; ifap != NULL; ifap = ifap->ifa_next) { if (ifap->ifa_addr == NULL) continue; if ((ifap->ifa_flags & IFF_UP) == 0) continue; - net_type = _si_net_addr_type(ifap->ifa_addr); - - if (net_type == NET_TYPE_UNKNOWN) - { - } - else if (net_type == NET_TYPE_V4) + if (ifap->ifa_addr->sa_family == AF_INET) { - config_stats_global.v4_count++; + net_v4_count++; } - else + else if (ifap->ifa_addr->sa_family == AF_INET6) { - config_stats_global.v6_count++; - - if (net_type == NET_TYPE_LINKLOCAL) - { - config_stats_global.ll_count++; - continue; - } - else if (net_type == NET_TYPE_ULA) - { - config_stats_global.ula_count++; - if (!strncmp(ifap->ifa_name, "utun", 4)) continue; - } - if (net_type == NET_TYPE_TEREDO) - { - config_stats_global.teredo_count++; - } - else if (net_type == NET_TYPE_6TO4) - { - config_stats_global.v6to4_count++; - } - else if (net_type == NET_TYPE_SITELOCAL) - { - config_stats_global.sl_count++; - } - - if (_si_net_type_is_IPv6_globably_reachable_non_transitional(net_type)) - { - config_stats_global.gai_v6_preferred = 1; - } + net_v6_count++; } } - - freeifaddrs(ifa); } + + freeifaddrs(ifa); } - *stats = config_stats_global; + if (inet4 != NULL) *inet4 = net_v4_count; + if (inet6 != NULL) *inet6 = net_v6_count; pthread_mutex_unlock(&net_config_mutex); return status; } -__private_extern__ int -si_inet_config(uint32_t *inet4, uint32_t *inet6) -{ - config_stats_t x; - - if (_si_netconfig(&x) < 0) return -1; - if (inet4 != NULL) *inet4 = x.v4_count; - if (inet6 != NULL) *inet6 = x.v6_count; - return 0; -} - void freeaddrinfo(struct addrinfo *a) { @@ -274,7 +180,7 @@ gai_strerror(int32_t err) * string. If the caller specifies both NI_NUMERICHOST and NI_NUMERICSERV, * we inet_ntop() and printf() and return the results. */ -__private_extern__ si_item_t * +si_item_t * si_nameinfo(si_mod_t *si, const struct sockaddr *sa, int flags, const char *interface, uint32_t *err) { si_item_t *out = NULL; @@ -316,8 +222,8 @@ si_nameinfo(si_mod_t *si, const struct sockaddr *sa, int flags, const char *inte memcpy(&a6, &s6->sin6_addr, sizeof(a6)); port = s6->sin6_port; - /* Look for link-local IPv6 scope id */ - if (IN6_IS_ADDR_LINKLOCAL(&s6->sin6_addr)) + /* Look for scope id in IPv6 Link Local, Multicast Node Local, and Multicast Link Local */ + if (IN6_IS_ADDR_LINKLOCAL(&s6->sin6_addr) || IN6_IS_ADDR_MC_NODELOCAL(&s6->sin6_addr) || IN6_IS_ADDR_MC_LINKLOCAL(&s6->sin6_addr)) { ifnum = ntohs(a6.__u6_addr.__u6_addr16[1]); if (ifnum == 0) @@ -326,8 +232,7 @@ si_nameinfo(si_mod_t *si, const struct sockaddr *sa, int flags, const char *inte a6.__u6_addr.__u6_addr16[1] = htons(ifnum); } - if (ifnum != s6->sin6_scope_id && - s6->sin6_scope_id != 0) + if ((ifnum != s6->sin6_scope_id) && (s6->sin6_scope_id != 0)) { if (err != NULL) *err = SI_STATUS_EAI_FAIL; return NULL; @@ -359,12 +264,6 @@ si_nameinfo(si_mod_t *si, const struct sockaddr *sa, int flags, const char *inte if (do_host_lookup == 1) { -#if 0 - if ((do_serv_lookup == 1) && (si->sim_nameinfo != NULL)) - { - return si->sim_nameinfo(si, lookup_sa, flags, interface, err); - } -#endif si_item_t *item = si_host_byaddr(si, addr, lookup_sa->sa_family, interface, NULL); if (item != NULL) { @@ -402,7 +301,7 @@ si_nameinfo(si_mod_t *si, const struct sockaddr *sa, int flags, const char *inte * Return numeric host name for NI_NUMERICHOST or if lookup failed, but not * if NI_NAMEREQD is specified (so that we later fail with EAI_NONAME). */ - if (host == NULL && (flags & NI_NAMEREQD) == 0) + if ((host == NULL) && ((flags & NI_NAMEREQD) == 0)) { char tmp[INET6_ADDRSTRLEN + 1 + IF_NAMESIZE + 1]; tmp[0] = '\0'; @@ -505,7 +404,7 @@ _gai_numericserv(const char *serv, uint16_t *port) return numeric; } -__private_extern__ int +int _gai_serv_to_port(const char *serv, uint32_t proto, uint16_t *port) { si_item_t *item; @@ -527,7 +426,7 @@ _gai_serv_to_port(const char *serv, uint32_t proto, uint16_t *port) return 0; } -__private_extern__ si_item_t * +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) { socket_data_t sockdata; @@ -552,7 +451,33 @@ si_addrinfo_v4(si_mod_t *si, int32_t flags, int32_t sock, int32_t proto, uint16_ return (si_item_t *)LI_ils_create("L448844444Ss", (unsigned long)si, CATEGORY_ADDRINFO, 1, unused, unused, flags, AF_INET, sock, proto, len, sockdata, cname); } -__private_extern__ si_item_t * +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) +{ + socket_data_t sockdata; + struct sockaddr_in6 *sa; + int32_t len; + uint64_t unused; + + unused = 0; + len = sizeof(struct sockaddr_in6); + memset(&sockdata, 0, sizeof(socket_data_t)); + sa = (struct sockaddr_in6 *)&sockdata; + + sa->sin6_len = len; + sa->sin6_family = AF_INET6; + sa->sin6_port = htons(port); + memset(&(sa->sin6_addr.__u6_addr.__u6_addr8[10]), 0xff, 2); + memcpy(&(sa->sin6_addr.__u6_addr.__u6_addr8[12]), addr, sizeof(struct in_addr)); + + /* sin6_scope_id is in host byte order */ + sa->sin6_scope_id = iface; + + return (si_item_t *)LI_ils_create("L448844444Ss", (unsigned long)si, CATEGORY_ADDRINFO, 1, unused, unused, flags, AF_INET6, sock, proto, len, sockdata, cname); +} + + +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) { socket_data_t sockdata; @@ -587,55 +512,86 @@ si_addrinfo_v6(si_mod_t *si, int32_t flags, int32_t sock, int32_t proto, uint16_ return (si_item_t *)LI_ils_create("L448844444Ss", (unsigned long)si, CATEGORY_ADDRINFO, 1, unused, unused, flags, AF_INET6, sock, proto, len, sockdata, cname); } -__private_extern__ si_list_t * -si_addrinfo_list(si_mod_t *si, int socktype, int proto, struct in_addr *a4, struct in6_addr *a6, int port, int scopeid, const char *cname4, const char *cname6) +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) { + int do_map = 0; si_item_t *item = NULL; si_list_t *out4 = NULL, *out6 = NULL; - if (a4 != NULL) + + if ((flags & AI_V4MAPPED) && ((flags & AI_ALL) || (a6 == NULL))) do_map = 1; + + if (a6 != NULL) { if ((proto == IPPROTO_UNSPEC) || (proto == IPPROTO_UDP)) { - item = si_addrinfo_v4(si, 0, SOCK_DGRAM, IPPROTO_UDP, port, a4, 0, cname4); - out4 = si_list_add(out4, item); + item = si_addrinfo_v6(si, 0, SOCK_DGRAM, IPPROTO_UDP, port, a6, scopeid, cname6); + out6 = si_list_add(out6, item); si_item_release(item); } if ((proto == IPPROTO_UNSPEC) || (proto == IPPROTO_TCP)) { - item = si_addrinfo_v4(si, 0, SOCK_STREAM, IPPROTO_TCP, port, a4, 0, cname4); - out4 = si_list_add(out4, item); + item = si_addrinfo_v6(si, 0, SOCK_STREAM, IPPROTO_TCP, port, a6, scopeid, cname6); + out6 = si_list_add(out6, item); si_item_release(item); } - if (proto == IPPROTO_ICMP) + if (proto == IPPROTO_ICMPV6) { - item = si_addrinfo_v4(si, 0, SOCK_RAW, IPPROTO_ICMP, port, a4, 0, cname4); - out4 = si_list_add(out4, item); + item = si_addrinfo_v6(si, 0, SOCK_RAW, IPPROTO_ICMPV6, port, a6, scopeid, cname6); + out6 = si_list_add(out6, item); si_item_release(item); } } - if (a6 != NULL) + if (a4 != NULL) { if ((proto == IPPROTO_UNSPEC) || (proto == IPPROTO_UDP)) { - item = si_addrinfo_v6(si, 0, SOCK_DGRAM, IPPROTO_UDP, port, a6, scopeid, cname6); - out6 = si_list_add(out6, item); + if (do_map == 0) + { + item = si_addrinfo_v4(si, 0, SOCK_DGRAM, IPPROTO_UDP, port, a4, 0, cname4); + out4 = si_list_add(out4, item); + } + else + { + item = si_addrinfo_v4_mapped(si, 0, SOCK_DGRAM, IPPROTO_UDP, port, a4, 0, cname4); + out6 = si_list_add(out6, item); + } + si_item_release(item); } if ((proto == IPPROTO_UNSPEC) || (proto == IPPROTO_TCP)) { - item = si_addrinfo_v6(si, 0, SOCK_STREAM, IPPROTO_TCP, port, a6, scopeid, cname6); - out6 = si_list_add(out6, item); + if (do_map == 0) + { + item = si_addrinfo_v4(si, 0, SOCK_STREAM, IPPROTO_TCP, port, a4, 0, cname4); + out4 = si_list_add(out4, item); + } + else + { + item = si_addrinfo_v4_mapped(si, 0, SOCK_STREAM, IPPROTO_TCP, port, a4, 0, cname4); + out6 = si_list_add(out6, item); + } + si_item_release(item); } - if (proto == IPPROTO_ICMPV6) + if (proto == IPPROTO_ICMP) { - item = si_addrinfo_v6(si, 0, SOCK_RAW, IPPROTO_ICMPV6, port, a6, scopeid, cname6); - out6 = si_list_add(out6, item); + if (do_map == 0) + { + item = si_addrinfo_v4(si, 0, SOCK_RAW, IPPROTO_ICMP, port, a4, 0, cname4); + out4 = si_list_add(out4, item); + } + else + { + item = si_addrinfo_v4_mapped(si, 0, SOCK_RAW, IPPROTO_ICMP, port, a4, 0, cname4); + out6 = si_list_add(out6, item); + } + si_item_release(item); } } @@ -654,9 +610,10 @@ si_addrinfo_list(si_mod_t *si, int socktype, int proto, struct in_addr *a4, stru * Returns 1 if host name is numeric or 0 if not, or -1 on error. */ static int -_gai_numerichost(const char* nodename, uint32_t *family, int flags, struct in_addr *a4, struct in6_addr *a6) +_gai_numerichost(const char* nodename, uint32_t *family, int flags, struct in_addr *a4, struct in6_addr *a6, int *scope) { int numerichost, passive; + in_addr_t test; numerichost = 0; @@ -665,7 +622,7 @@ _gai_numerichost(const char* nodename, uint32_t *family, int flags, struct in_ad /* return loopback or passive addresses */ passive = (flags & AI_PASSIVE); - if ((*family == AF_UNSPEC) || (*family == AF_INET)) + if (((*family == AF_UNSPEC) || (*family == AF_INET)) || ((*family == AF_INET6) && (flags & AI_V4MAPPED) && (flags & AI_ALL))) { if (passive) a4->s_addr = 0; else a4->s_addr = htonl(INADDR_LOOPBACK); @@ -681,12 +638,41 @@ _gai_numerichost(const char* nodename, uint32_t *family, int flags, struct in_ad } else { - /* numeric IPv4 host valid for AF_UNSPEC and AF_INET */ + /* + * numeric IPv4 host valid for AF_UNSPEC and AF_INET + * also valid for AF_INET6 with AI_V4MAPPED + */ numerichost = inet_pton(AF_INET, nodename, a4); + if (numerichost == 0) + { + test = inet_addr(nodename); + if (test != (in_addr_t)-1) + { + a4->s_addr = test; + numerichost = 1; + } + } + if (numerichost == 1) { - if (*family == AF_UNSPEC) *family = AF_INET; - else if (*family == AF_INET6) numerichost = -1; + if (*family == AF_UNSPEC) + { + *family = AF_INET; + } + else if (*family == AF_INET6) + { + if (flags & AI_V4MAPPED) + { + memset(a6, 0, sizeof(struct in6_addr)); + memset(&(a6->__u6_addr.__u6_addr8[10]), 0xff, 2); + memcpy(&(a6->__u6_addr.__u6_addr8[12]), a4, sizeof(struct in_addr)); + } + else + { + numerichost = -1; + } + } + return numerichost; } @@ -694,8 +680,28 @@ _gai_numerichost(const char* nodename, uint32_t *family, int flags, struct in_ad numerichost = inet_pton(AF_INET6, nodename, a6); if (numerichost == 1) { + /* check for scope/zone id */ + char *p = strrchr(nodename, SCOPE_DELIMITER); + if (p != NULL) + { + int i, d; + char *x; + + p++; + d = 1; + for (x = p; (*x != '\0') && (d == 1); x++) + { + i = *x; + d = isdigit(i); + } + + if (d == 1) *scope = atoi(p); + else *scope = if_nametoindex(p); + } + if (*family == AF_UNSPEC) *family = AF_INET6; else if (*family == AF_INET) numerichost = -1; + return numerichost; } } @@ -706,8 +712,8 @@ _gai_numerichost(const char* nodename, uint32_t *family, int flags, struct in_ad /* si_addrinfo_list_from_hostent * Returns an addrinfo list from IPv4 and IPv6 hostent entries */ -__private_extern__ si_list_t * -si_addrinfo_list_from_hostent(si_mod_t *si, uint32_t socktype, uint32_t proto, uint16_t port, uint16_t scope, const struct hostent *h4, const struct hostent *h6) +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) { int i; si_list_t *out = NULL; @@ -719,7 +725,7 @@ si_addrinfo_list_from_hostent(si_mod_t *si, uint32_t socktype, uint32_t proto, u { struct in6_addr a6; memcpy(&a6, h6->h_addr_list[i], h6->h_length); - list = si_addrinfo_list(si, socktype, proto, NULL, &a6, port, scope, NULL, h6->h_name); + list = si_addrinfo_list(si, flags, socktype, proto, NULL, &a6, port, scope, NULL, h6->h_name); out = si_list_concat(out, list); si_list_release(list); } @@ -731,7 +737,7 @@ si_addrinfo_list_from_hostent(si_mod_t *si, uint32_t socktype, uint32_t proto, u { struct in_addr a4; memcpy(&a4, h4->h_addr_list[i], h4->h_length); - list = si_addrinfo_list(si, socktype, proto, &a4, NULL, port, 0, h4->h_name, NULL); + list = si_addrinfo_list(si, flags, socktype, proto, &a4, NULL, port, 0, h4->h_name, NULL); out = si_list_concat(out, list); si_list_release(list); } @@ -741,74 +747,107 @@ si_addrinfo_list_from_hostent(si_mod_t *si, uint32_t socktype, uint32_t proto, u } int -_gai_sa_dst_compare(const struct sockaddr *a, const struct sockaddr *b, int unused) +_gai_addr_sort(const void *a, const void *b) { - int ta, tb, posn_a, posn_b; - - ta = _si_net_addr_type(a); - tb = _si_net_addr_type(b); - - posn_a = 2; - posn_b = 2; - - if (ta & NET_TYPE_V4) posn_a = 1; - if (tb & NET_TYPE_V4) posn_b = 1; - - if (_si_net_type_is_IPv6_globably_reachable_non_transitional(ta)) posn_a = 0; - if (_si_net_type_is_IPv6_globably_reachable_non_transitional(tb)) posn_b = 0; - - return (posn_a - posn_b); -} - -int -_gai_addr_sort(void *thunk, const void *a, const void *b) -{ - si_item_t **ia, **ib; + si_item_t **item_a, **item_b; si_addrinfo_t *p, *q; struct sockaddr *sp, *sq; - uint32_t *v4first = (uint32_t *)thunk; - - ia = (si_item_t **)a; - ib = (si_item_t **)b; - p = (si_addrinfo_t *)((uintptr_t)*ia + sizeof(si_item_t)); - q = (si_addrinfo_t *)((uintptr_t)*ib + sizeof(si_item_t)); + item_a = (si_item_t **)a; + item_b = (si_item_t **)b; + + p = (si_addrinfo_t *)((uintptr_t)*item_a + sizeof(si_item_t)); + q = (si_addrinfo_t *)((uintptr_t)*item_b + sizeof(si_item_t)); sp = (struct sockaddr *)p->ai_addr.x; sq = (struct sockaddr *)q->ai_addr.x; - if (*v4first == 1) - { - if (sp->sa_family == sq->sa_family) return 0; - if (sp->sa_family == AF_INET) return -1; - return 1; - } - - return _gai_sa_dst_compare(sp, sq, 0); + /* + * sa_dst_compare(A,B) returns -1 if A is less desirable than B, + * 0 if they are equally desirable, and 1 if A is more desirable. + * qsort() expects the inverse, so we swap sp and sq. + */ + return sa_dst_compare(sq, sp, 0); } static si_list_t * -_gai_sort_list(si_list_t *in) +_gai_sort_list(si_list_t *in, uint32_t flags) { - uint32_t v4first; - config_stats_t x; + si_list_t *out; + int filter_mapped; + uint32_t i; + uint32_t v4mapped_count = 0; + uint32_t v6_count = 0; + si_addrinfo_t *a; if (in == NULL) return NULL; - memset(&x, 0, sizeof(config_stats_t)); - if (_si_netconfig(&x) < 0) return in; + for (i = 0; i < in->count; i++) + { + a = (si_addrinfo_t *)((uintptr_t)in->entry[i] + sizeof(si_item_t)); + if (a->ai_family == AF_INET6) + { + struct sockaddr_in6 *s6 = (struct sockaddr_in6 *)a->ai_addr.x; + if (IN6_IS_ADDR_V4MAPPED(&(s6->sin6_addr))) v4mapped_count++; + else v6_count++; + } + } + + filter_mapped = 1; + if ((flags & AI_V4MAPPED) && ((v6_count == 0) || (flags & AI_ALL))) filter_mapped = 0; + + out = in; + + if ((filter_mapped == 1) && (v4mapped_count > 0)) + { + i = in->count - v4mapped_count; + if (i == 0) return NULL; + + out = (si_list_t *)calloc(1, sizeof(si_list_t)); + if (out == NULL) return in; + + out->count = i; + out->refcount = in->refcount; - v4first = 1; - if (x.gai_v6_preferred != 0) v4first = 0; + out->entry = (si_item_t **)calloc(out->count, sizeof(si_item_t *)); + if (out->entry == NULL) + { + free(out); + return in; + } + + out->curr = 0; + + for (i = 0; i < in->count; i++) + { + a = (si_addrinfo_t *)((uintptr_t)in->entry[i] + sizeof(si_item_t)); + if (a->ai_family == AF_INET6) + { + struct sockaddr_in6 *s6 = (struct sockaddr_in6 *)a->ai_addr.x; + if (IN6_IS_ADDR_V4MAPPED(&(s6->sin6_addr))) + { + si_item_release(in->entry[i]); + continue; + } + } + + out->entry[out->curr++] = in->entry[i]; + } - qsort_r(&in->entry[0], in->count, sizeof(si_item_t *), (void *)&v4first, _gai_addr_sort); - return in; + out->curr = 0; + + free(in->entry); + free(in); + } + + qsort(&out->entry[0], out->count, sizeof(si_item_t *), _gai_addr_sort); + return out; } /* _gai_simple * Simple lookup via gethostbyname2(3) mechanism. */ -__private_extern__ si_list_t * +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) { si_item_t *h4_item = NULL, *h6_item = NULL; @@ -863,30 +902,30 @@ _gai_simple(si_mod_t *si, const void *nodeptr, const void *servptr, uint32_t fam h6 = (struct hostent *)((uintptr_t)h6_item + sizeof(si_item_t)); } - out = si_addrinfo_list_from_hostent(si, socktype, proto, port, 0, h4, h6); + out = si_addrinfo_list_from_hostent(si, flags, socktype, proto, port, 0, h4, h6); si_item_release(h4_item); si_item_release(h6_item); - return _gai_sort_list(out); + return _gai_sort_list(out, flags); } -__private_extern__ si_list_t * +si_list_t * si_srv_byname(si_mod_t *si, const char *qname, const char *interface, uint32_t *err) { if (si == NULL) return 0; - if (si->sim_srv_byname == NULL) return 0; + if (si->vtable->sim_srv_byname == NULL) return 0; - return si->sim_srv_byname(si, qname, interface, err); + return si->vtable->sim_srv_byname(si, qname, interface, err); } -__private_extern__ int +int si_wants_addrinfo(si_mod_t *si) { if (si == NULL) return 0; - if (si->sim_addrinfo == NULL) return 0; - if (si->sim_wants_addrinfo == NULL) return 0; + if (si->vtable->sim_addrinfo == NULL) return 0; + if (si->vtable->sim_wants_addrinfo == NULL) return 0; - return si->sim_wants_addrinfo(si); + return si->vtable->sim_wants_addrinfo(si); } static si_list_t * @@ -903,13 +942,13 @@ _gai_srv(si_mod_t *si, const char *node, const char *serv, uint32_t family, uint /* Minimum SRV priority is zero. Start below that. */ int lastprio = -1; int currprio; - + if (node == NULL || serv == NULL) return NULL; - + asprintf(&qname, "%s.%s", serv, node); list = si_srv_byname(si, qname, interface, err); free(qname); - + /* Iterate the SRV records starting at lowest priority and attempt to * lookup the target host name. Returns the first successful lookup. * It's an O(n^2) algorithm but data sets are small (less than 100) and @@ -920,12 +959,12 @@ _gai_srv(si_mod_t *si, const char *node, const char *serv, uint32_t family, uint /* Find the next lowest priority level. */ /* Maximum SRV priority is UINT16_MAX. Start above that. */ currprio = INT_MAX; - + for (i = 0; i < list->count; ++i) { item = list->entry[i]; srv = (si_srv_t *)((uintptr_t)item + sizeof(si_item_t)); - + if (srv->priority > lastprio && srv->priority < currprio) { currprio = srv->priority; @@ -941,13 +980,13 @@ _gai_srv(si_mod_t *si, const char *node, const char *serv, uint32_t family, uint { lastprio = currprio; } - + /* Lookup hosts at the current priority level. Return first match. */ for (i = 0; i < list->count; ++i) { item = list->entry[i]; srv = (si_srv_t *)((uintptr_t)item + sizeof(si_item_t)); - + if (srv->priority == currprio) { /* So that _gai_simple expects an integer service. */ @@ -966,14 +1005,15 @@ _gai_srv(si_mod_t *si, const char *node, const char *serv, uint32_t family, uint { si_list_release(list); } - + return result; } -__private_extern__ si_list_t * +si_list_t * si_addrinfo(si_mod_t *si, const char *node, const char *serv, uint32_t family, uint32_t socktype, uint32_t proto, uint32_t flags, const char *interface, uint32_t *err) { int numerichost, numericserv = 0; + int scope = 0; const void *nodeptr = NULL, *servptr = NULL; uint16_t port; struct in_addr a4, *p4; @@ -1046,6 +1086,18 @@ si_addrinfo(si_mod_t *si, const char *node, const char *serv, uint32_t family, u return NULL; } + /* check AI_V4MAPPED and AI_ALL */ + if (family != AF_INET6) + { + /* unset AI_V4MAPPED and AI_ALL unless family is AF_INET6 */ + flags &= ~(AI_V4MAPPED | AI_ALL); + } + else if ((flags & AI_V4MAPPED) == 0) + { + /* unset AI_ALL unless family is AF_INET6 and AI_V4MAPPED is set */ + flags &= ~AI_ALL; + } + memset(&a4, 0, sizeof(struct in_addr)); memset(&a6, 0, sizeof(struct in6_addr)); @@ -1059,7 +1111,7 @@ si_addrinfo(si_mod_t *si, const char *node, const char *serv, uint32_t family, u { /* AI_SRV SPI */ out = _gai_srv(si, node, serv, family, socktype, proto, flags, interface, err); - return _gai_sort_list(out); + return _gai_sort_list(out, flags); } else { @@ -1074,7 +1126,7 @@ si_addrinfo(si_mod_t *si, const char *node, const char *serv, uint32_t family, u return NULL; } - if (serv != NULL) + if ((serv != NULL) && (strcmp(serv, "0") != 0)) { if (numericserv == 1) { @@ -1087,7 +1139,7 @@ si_addrinfo(si_mod_t *si, const char *node, const char *serv, uint32_t family, u } } - numerichost = _gai_numerichost(node, &family, flags, &a4, &a6); + numerichost = _gai_numerichost(node, &family, flags, &a4, &a6, &scope); if ((numerichost == -1) || ((flags & AI_NUMERICHOST) && (numerichost == 0))) { if (err != NULL) *err = SI_STATUS_EAI_NONAME; @@ -1137,20 +1189,23 @@ si_addrinfo(si_mod_t *si, const char *node, const char *serv, uint32_t family, u if (family == AF_INET6) p4 = NULL; if (node == NULL) cname = "localhost"; + /* allow nodename to be a mapped IPv4 address, e.g. "::ffff:10.0.0.1" */ + if (p6 != NULL) flags |= AI_V4MAPPED; + /* handle trivial questions */ - out = si_addrinfo_list(si, socktype, proto, p4, p6, port, 0, cname, cname); - return _gai_sort_list(out); + out = si_addrinfo_list(si, flags, socktype, proto, p4, p6, port, scope, cname, cname); + return _gai_sort_list(out, flags); } - else if ((si->sim_wants_addrinfo != NULL) && si->sim_wants_addrinfo(si)) + else if (si_wants_addrinfo(si)) { /* or let the current module handle the host lookups intelligently */ - out = si->sim_addrinfo(si, nodeptr, servptr, family, socktype, proto, flags, interface, err); - return _gai_sort_list(out); + out = si->vtable->sim_addrinfo(si, nodeptr, servptr, family, socktype, proto, flags, interface, err); + return _gai_sort_list(out, flags); } /* fall back to a default path */ out = _gai_simple(si, nodeptr, servptr, family, socktype, proto, flags, interface, err); - return _gai_sort_list(out); + return _gai_sort_list(out, flags); } static struct addrinfo * @@ -1194,7 +1249,7 @@ si_item_to_addrinfo(si_item_t *item) return out; } -__private_extern__ struct addrinfo * +struct addrinfo * si_list_to_addrinfo(si_list_t *list) { struct addrinfo *tail, *out; @@ -1369,17 +1424,17 @@ free_build_hostent(build_hostent_t *h) free(h); } -__private_extern__ si_item_t * +si_item_t * si_ipnode_byname(si_mod_t *si, const char *name, int family, int flags, const char *interface, uint32_t *err) { int i, status, want; + uint32_t if4, if6; struct in_addr addr4; struct in6_addr addr6; si_item_t *item4, *item6; build_hostent_t *out; struct hostent *h; uint64_t unused; - config_stats_t ifstats; memset(&addr4, 0, sizeof(struct in_addr)); memset(&addr6, 0, sizeof(struct in6_addr)); @@ -1453,18 +1508,19 @@ si_ipnode_byname(si_mod_t *si, const char *name, int family, int flags, const ch * IF AI_ADDRCONFIG is set, we need to know what interface flavors we really have. */ - memset(&ifstats, 0, sizeof(config_stats_t)); + if4 = 0; + if6 = 0; if (flags & AI_ADDRCONFIG) { - if (_si_netconfig(&ifstats) < 0) + if (si_inet_config(&if4, &if6) < 0) { if (err != NULL) *err = SI_STATUS_H_ERRNO_NO_RECOVERY; return NULL; } /* Bail out if there are no interfaces */ - if ((ifstats.v4_count == 0) && (ifstats.v6_count == 0)) + if ((if4 == 0) && (if6 == 0)) { if (err != NULL) *err = SI_STATUS_H_ERRNO_NO_RECOVERY; return NULL; @@ -1479,7 +1535,7 @@ si_ipnode_byname(si_mod_t *si, const char *name, int family, int flags, const ch if (family == AF_INET) { - if ((flags & AI_ADDRCONFIG) && (ifstats.v4_count == 0)) + if ((flags & AI_ADDRCONFIG) && (if4 == 0)) { if (err != NULL) *err = SI_STATUS_H_ERRNO_NO_RECOVERY; return NULL; @@ -1503,7 +1559,7 @@ si_ipnode_byname(si_mod_t *si, const char *name, int family, int flags, const ch } else { - if ((flags & AI_ADDRCONFIG) && (ifstats.v6_count == 0)) + if ((flags & AI_ADDRCONFIG) && (if6 == 0)) { if (err != NULL) *err = SI_STATUS_H_ERRNO_NO_RECOVERY; return NULL; diff --git a/lookup.subproj/si_module.c b/lookup.subproj/si_module.c index ada6b25..b0fc587 100644 --- a/lookup.subproj/si_module.c +++ b/lookup.subproj/si_module.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2008-2009 Apple Inc. All rights reserved. + * Copyright (c) 2008-2011 Apple Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -31,15 +31,21 @@ #include #include #include +#include #include "si_module.h" #define PLUGIN_DIR_PATH "/usr/lib/info" #define PLUGIN_BUNDLE_SUFFIX "so" -#define WORKUNIT_CALL_ACTIVE 0x00000001 -#define WORKUNIT_THREAD_ACTIVE 0x00000002 -#define WORKUNIT_RETURNS_LIST 0x00000004 +#define WORKUNIT_CANCELLED 0x00000001 +#define WORKUNIT_RETURNS_LIST 0x00000002 + +#ifdef __BIG_ENDIAN__ +#define WORKUNIT_CANCELLED_BIT_ADDRESS 31 +#else +#define WORKUNIT_CANCELLED_BIT_ADDRESS 7 +#endif typedef struct si_async_workunit_s { @@ -55,6 +61,7 @@ typedef struct si_async_workunit_s uint32_t err; /* async support below */ uint32_t flags; + int32_t refcount; void *callback; void *context; mach_port_t port; @@ -69,13 +76,13 @@ static uint32_t module_count = 0; static pthread_mutex_t module_mutex = PTHREAD_MUTEX_INITIALIZER; static si_async_workunit_t *si_async_worklist = NULL; -__private_extern__ si_mod_t *si_module_static_search(); -__private_extern__ si_mod_t *si_module_static_file(); -__private_extern__ si_mod_t *si_module_static_cache(); -__private_extern__ si_mod_t *si_module_static_mdns(); +si_mod_t *si_module_static_search(void); +si_mod_t *si_module_static_cache(void); +si_mod_t *si_module_static_file(void); #ifdef DS_AVAILABLE -__private_extern__ si_mod_t *si_module_static_ds(); +si_mod_t *si_module_static_ds(void); #endif +si_mod_t *si_module_static_mdns(void); static void * si_mod_dlsym(void *so, const char *name, const char *sym) @@ -94,22 +101,7 @@ si_mod_dlsym(void *so, const char *name, const char *sym) return out; } -static si_mod_t * -si_mod_static(const char *name) -{ - if (name == NULL) return NULL; - - if (string_equal(name, "search")) return si_module_static_search(); - if (string_equal(name, "file")) return si_module_static_file(); - if (string_equal(name, "cache")) return si_module_static_cache(); - if (string_equal(name, "mdns")) return si_module_static_mdns(); -#ifdef DS_AVAILABLE - if (string_equal(name, "ds")) return si_module_static_ds(); -#endif - return NULL; -} - -__private_extern__ si_mod_t * +si_mod_t * si_module_with_path(const char *path, const char *name) { void *so; @@ -149,8 +141,8 @@ si_module_with_path(const char *path, const char *name) if ((out == NULL) || (outname == NULL)) { - if (out != NULL) free(out); - if (outname != NULL) free(outname); + free(out); + free(outname); dlclose(so); errno = ENOMEM; return NULL; @@ -158,6 +150,7 @@ si_module_with_path(const char *path, const char *name) out->name = outname; out->refcount = 1; + out->flags = 0; out->bundle = so; status = si_sym_init(out); @@ -176,84 +169,91 @@ si_module_with_path(const char *path, const char *name) si_mod_t * si_module_with_name(const char *name) { - uint32_t i; - char *path; - si_mod_t *out; - - if (name == NULL) + static struct { - errno = EINVAL; - return NULL; - } + const char *name; + si_mod_t *(*init)(void); + si_mod_t *module; + } modules[] = + { + { "search", si_module_static_search, NULL }, + { "cache", si_module_static_cache, NULL }, + { "file", si_module_static_file, NULL }, +#ifdef DS_AVAILABLE + { "ds", si_module_static_ds, NULL }, +#endif + { "mdns", si_module_static_mdns, NULL }, + { NULL, NULL }, + }; - pthread_mutex_lock(&module_mutex); + si_mod_t *si = NULL; + int i; + + /* + * We don't need to worry about locking during initialization + * because all modules init routine returns static storage. + */ - for (i = 0; i < module_count; i++) + /* Find the module by name */ + for (i = 0; modules[i].name != NULL; ++i) { - if (string_equal(module_list[i]->name, name)) + if (string_equal(name, modules[i].name)) { - si_module_retain(module_list[i]); - pthread_mutex_unlock(&module_mutex); - return module_list[i]; + si = modules[i].module; + if (si == NULL) + { + si = modules[i].init(); + modules[i].module = si; + } + + break; } } - pthread_mutex_unlock(&module_mutex); - out = si_mod_static(name); - pthread_mutex_lock(&module_mutex); - - if (out == NULL) - { - path = NULL; + if (si != NULL) return si; - /* mdns lives in dns.so */ - asprintf(&path, "%s/%s.%s", PLUGIN_DIR_PATH, name, PLUGIN_BUNDLE_SUFFIX); - - if (path == NULL) - { - errno = ENOMEM; - pthread_mutex_unlock(&module_mutex); - return NULL; - } + pthread_mutex_lock(&module_mutex); + char *path = NULL; - out = si_module_with_path(path, name); - free(path); - } + asprintf(&path, "%s/%s.%s", PLUGIN_DIR_PATH, name, PLUGIN_BUNDLE_SUFFIX); - if (out == NULL) + if (path == NULL) { + errno = ENOMEM; pthread_mutex_unlock(&module_mutex); return NULL; } - /* add out to module_list */ - if (module_count == 0) - { - module_list = (si_mod_t **)calloc(1, sizeof(si_mod_t *)); - } - else + si = si_module_with_path(path, name); + free(path); + + if (si == NULL) { - module_list = (si_mod_t **)reallocf(module_list, (module_count + 1) * sizeof(si_mod_t *)); + pthread_mutex_unlock(&module_mutex); + return NULL; } + /* add out to module_list */ + module_list = (si_mod_t **)reallocf(module_list, (module_count + 1) * sizeof(si_mod_t *)); if (module_list == NULL) { pthread_mutex_unlock(&module_mutex); - return out; + return si; } - module_list[module_count] = out; + module_list[module_count] = si; module_count++; pthread_mutex_unlock(&module_mutex); - return out; + return si; } -__private_extern__ si_mod_t * +si_mod_t * si_module_retain(si_mod_t *si) { if (si == NULL) return NULL; + if (si->flags & SI_MOD_FLAG_STATIC) return si; OSAtomicIncrement32Barrier(&si->refcount); @@ -266,6 +266,7 @@ si_module_release(si_mod_t *si) int32_t i; if (si == NULL) return; + if (si->flags & SI_MOD_FLAG_STATIC) return; i = OSAtomicDecrement32Barrier(&si->refcount); if (i > 0) return; @@ -295,21 +296,21 @@ si_module_release(si_mod_t *si) pthread_mutex_unlock(&module_mutex); - if (si->sim_close != NULL) si->sim_close(si); + if (si->vtable->sim_close != NULL) si->vtable->sim_close(si); if (si->bundle != NULL) dlclose(si->bundle); - if (si->name != NULL) free(si->name); + free(si->name); free(si); } -__private_extern__ const char * +const char * si_module_name(si_mod_t *si) { if (si == NULL) return NULL; - return si->name; + return (const char *)si->name; } -__private_extern__ int +int si_module_vers(si_mod_t *si) { if (si == NULL) return 0; @@ -317,7 +318,7 @@ si_module_vers(si_mod_t *si) return si->vers; } -__private_extern__ int +int si_item_match(si_item_t *item, int cat, const void *name, uint32_t num, int which) { int i; @@ -489,7 +490,7 @@ si_item_match(si_item_t *item, int cat, const void *name, uint32_t num, int whic return 0; } -__private_extern__ int +int si_item_is_valid(si_item_t *item) { si_mod_t *si; @@ -499,268 +500,268 @@ si_item_is_valid(si_item_t *item) si = item->src; if (si == NULL) return 0; - if (si->sim_is_valid == NULL) return 0; + if (si->vtable->sim_is_valid == NULL) return 0; - return si->sim_is_valid(si, item); + return si->vtable->sim_is_valid(si, item); } -__private_extern__ si_item_t * +si_item_t * si_user_byname(si_mod_t *si, const char *name) { if (si == NULL) return NULL; - if (si->sim_user_byname == NULL) return NULL; - return si->sim_user_byname(si, name); + if (si->vtable->sim_user_byname == NULL) return NULL; + return si->vtable->sim_user_byname(si, name); } -__private_extern__ si_item_t * +si_item_t * si_user_byuid(si_mod_t *si, uid_t uid) { if (si == NULL) return NULL; - if (si->sim_user_byuid == NULL) return NULL; - return si->sim_user_byuid(si, uid); + if (si->vtable->sim_user_byuid == NULL) return NULL; + return si->vtable->sim_user_byuid(si, uid); } -__private_extern__ si_list_t * +si_list_t * si_user_all(si_mod_t *si) { if (si == NULL) return NULL; - if (si->sim_user_all == NULL) return NULL; - return si->sim_user_all(si); + if (si->vtable->sim_user_all == NULL) return NULL; + return si->vtable->sim_user_all(si); } -__private_extern__ si_item_t * +si_item_t * si_group_byname(si_mod_t *si, const char *name) { if (si == NULL) return NULL; - if (si->sim_group_byname == NULL) return NULL; - return si->sim_group_byname(si, name); + if (si->vtable->sim_group_byname == NULL) return NULL; + return si->vtable->sim_group_byname(si, name); } -__private_extern__ si_item_t * +si_item_t * si_group_bygid(si_mod_t *si, gid_t gid) { if (si == NULL) return NULL; - if (si->sim_group_bygid == NULL) return NULL; - return si->sim_group_bygid(si, gid); + if (si->vtable->sim_group_bygid == NULL) return NULL; + return si->vtable->sim_group_bygid(si, gid); } -__private_extern__ si_list_t * +si_list_t * si_group_all(si_mod_t *si) { if (si == NULL) return NULL; - if (si->sim_group_all == NULL) return NULL; - return si->sim_group_all(si); + if (si->vtable->sim_group_all == NULL) return NULL; + return si->vtable->sim_group_all(si); } -__private_extern__ si_item_t * +si_item_t * si_grouplist(si_mod_t *si, const char *name) { if (si == NULL) return NULL; - if (si->sim_grouplist == NULL) return NULL; - return si->sim_grouplist(si, name); + if (si->vtable->sim_grouplist == NULL) return NULL; + return si->vtable->sim_grouplist(si, name); } -__private_extern__ si_list_t * +si_list_t * si_netgroup_byname(struct si_mod_s *si, const char *name) { if (si == NULL) return NULL; - if (si->sim_netgroup_byname == NULL) return NULL; - return si->sim_netgroup_byname(si, name); + if (si->vtable->sim_netgroup_byname == NULL) return NULL; + return si->vtable->sim_netgroup_byname(si, name); } -__private_extern__ int +int si_in_netgroup(struct si_mod_s *si, const char *name, const char *host, const char *user, const char *domain) { if (si == NULL) return 0; - if (si->sim_in_netgroup == NULL) return 0; - return si->sim_in_netgroup(si, name, host, user, domain); + if (si->vtable->sim_in_netgroup == NULL) return 0; + return si->vtable->sim_in_netgroup(si, name, host, user, domain); } -__private_extern__ si_item_t * +si_item_t * si_alias_byname(si_mod_t *si, const char *name) { if (si == NULL) return NULL; - if (si->sim_alias_byname == NULL) return NULL; - return si->sim_alias_byname(si, name); + if (si->vtable->sim_alias_byname == NULL) return NULL; + return si->vtable->sim_alias_byname(si, name); } -__private_extern__ si_list_t * +si_list_t * si_alias_all(si_mod_t *si) { if (si == NULL) return NULL; - if (si->sim_alias_all == NULL) return NULL; - return si->sim_alias_all(si); + if (si->vtable->sim_alias_all == NULL) return NULL; + return si->vtable->sim_alias_all(si); } -__private_extern__ si_item_t * +si_item_t * si_host_byname(si_mod_t *si, const char *name, int af, const char *interface, uint32_t *err) { if (si == NULL) return NULL; - if (si->sim_host_byname == NULL) return NULL; - return si->sim_host_byname(si, name, af, interface, err); + if (si->vtable->sim_host_byname == NULL) return NULL; + return si->vtable->sim_host_byname(si, name, af, interface, err); } -__private_extern__ si_item_t * +si_item_t * si_host_byaddr(si_mod_t *si, const void *addr, int af, const char *interface, uint32_t *err) { if (si == NULL) return NULL; - if (si->sim_host_byaddr == NULL) return NULL; - return si->sim_host_byaddr(si, addr, af, interface, err); + if (si->vtable->sim_host_byaddr == NULL) return NULL; + return si->vtable->sim_host_byaddr(si, addr, af, interface, err); } -__private_extern__ si_list_t * +si_list_t * si_host_all(si_mod_t *si) { if (si == NULL) return NULL; - if (si->sim_host_all == NULL) return NULL; - return si->sim_host_all(si); + if (si->vtable->sim_host_all == NULL) return NULL; + return si->vtable->sim_host_all(si); } -__private_extern__ si_item_t * +si_item_t * si_mac_byname(struct si_mod_s *si, const char *name) { if (si == NULL) return NULL; - if (si->sim_mac_byname == NULL) return NULL; - return si->sim_mac_byname(si, name); + if (si->vtable->sim_mac_byname == NULL) return NULL; + return si->vtable->sim_mac_byname(si, name); } -__private_extern__ si_item_t * +si_item_t * si_mac_bymac(struct si_mod_s *si, const char *mac) { if (si == NULL) return NULL; - if (si->sim_mac_bymac == NULL) return NULL; - return si->sim_mac_bymac(si, mac); + if (si->vtable->sim_mac_bymac == NULL) return NULL; + return si->vtable->sim_mac_bymac(si, mac); } -__private_extern__ si_list_t * +si_list_t * si_mac_all(si_mod_t *si) { if (si == NULL) return NULL; - if (si->sim_mac_all == NULL) return NULL; - return si->sim_mac_all(si); + if (si->vtable->sim_mac_all == NULL) return NULL; + return si->vtable->sim_mac_all(si); } -__private_extern__ si_item_t * +si_item_t * si_network_byname(si_mod_t *si, const char *name) { if (si == NULL) return NULL; - if (si->sim_network_byname == NULL) return NULL; - return si->sim_network_byname(si, name); + if (si->vtable->sim_network_byname == NULL) return NULL; + return si->vtable->sim_network_byname(si, name); } -__private_extern__ si_item_t * +si_item_t * si_network_byaddr(si_mod_t *si, uint32_t addr) { if (si == NULL) return NULL; - if (si->sim_network_byaddr == NULL) return NULL; - return si->sim_network_byaddr(si, addr); + if (si->vtable->sim_network_byaddr == NULL) return NULL; + return si->vtable->sim_network_byaddr(si, addr); } -__private_extern__ si_list_t * +si_list_t * si_network_all(si_mod_t *si) { if (si == NULL) return NULL; - if (si->sim_network_all == NULL) return NULL; - return si->sim_network_all(si); + if (si->vtable->sim_network_all == NULL) return NULL; + return si->vtable->sim_network_all(si); } -__private_extern__ si_item_t * +si_item_t * si_service_byname(si_mod_t *si, const char *name, const char *proto) { if (si == NULL) return NULL; - if (si->sim_service_byname == NULL) return NULL; - return si->sim_service_byname(si, name, proto); + if (si->vtable->sim_service_byname == NULL) return NULL; + return si->vtable->sim_service_byname(si, name, proto); } -__private_extern__ si_item_t * +si_item_t * si_service_byport(si_mod_t *si, int port, const char *proto) { if (si == NULL) return NULL; - if (si->sim_service_byport == NULL) return NULL; - return si->sim_service_byport(si, port, proto); + if (si->vtable->sim_service_byport == NULL) return NULL; + return si->vtable->sim_service_byport(si, port, proto); } -__private_extern__ si_list_t * +si_list_t * si_service_all(si_mod_t *si) { if (si == NULL) return NULL; - if (si->sim_service_all == NULL) return NULL; - return si->sim_service_all(si); + if (si->vtable->sim_service_all == NULL) return NULL; + return si->vtable->sim_service_all(si); } -__private_extern__ si_item_t * +si_item_t * si_protocol_byname(si_mod_t *si, const char *name) { if (si == NULL) return NULL; - if (si->sim_protocol_byname == NULL) return NULL; - return si->sim_protocol_byname(si, name); + if (si->vtable->sim_protocol_byname == NULL) return NULL; + return si->vtable->sim_protocol_byname(si, name); } -__private_extern__ si_item_t * +si_item_t * si_protocol_bynumber(si_mod_t *si, uint32_t number) { if (si == NULL) return NULL; - if (si->sim_protocol_bynumber == NULL) return NULL; - return si->sim_protocol_bynumber(si, number); + if (si->vtable->sim_protocol_bynumber == NULL) return NULL; + return si->vtable->sim_protocol_bynumber(si, number); } -__private_extern__ si_list_t * +si_list_t * si_protocol_all(si_mod_t *si) { if (si == NULL) return NULL; - if (si->sim_protocol_all == NULL) return NULL; - return si->sim_protocol_all(si); + if (si->vtable->sim_protocol_all == NULL) return NULL; + return si->vtable->sim_protocol_all(si); } -__private_extern__ si_item_t * +si_item_t * si_rpc_byname(si_mod_t *si, const char *name) { if (si == NULL) return NULL; - if (si->sim_rpc_byname == NULL) return NULL; - return si->sim_rpc_byname(si, name); + if (si->vtable->sim_rpc_byname == NULL) return NULL; + return si->vtable->sim_rpc_byname(si, name); } -__private_extern__ si_item_t * +si_item_t * si_rpc_bynumber(si_mod_t *si, int number) { if (si == NULL) return NULL; - if (si->sim_rpc_bynumber == NULL) return NULL; - return si->sim_rpc_bynumber(si, number); + if (si->vtable->sim_rpc_bynumber == NULL) return NULL; + return si->vtable->sim_rpc_bynumber(si, number); } -__private_extern__ si_list_t * +si_list_t * si_rpc_all(si_mod_t *si) { if (si == NULL) return NULL; - if (si->sim_rpc_all == NULL) return NULL; - return si->sim_rpc_all(si); + if (si->vtable->sim_rpc_all == NULL) return NULL; + return si->vtable->sim_rpc_all(si); } -__private_extern__ si_item_t * +si_item_t * si_fs_byspec(si_mod_t *si, const char *spec) { if (si == NULL) return NULL; - if (si->sim_fs_byspec == NULL) return NULL; - return si->sim_fs_byspec(si, spec); + if (si->vtable->sim_fs_byspec == NULL) return NULL; + return si->vtable->sim_fs_byspec(si, spec); } -__private_extern__ si_item_t * +si_item_t * si_fs_byfile(si_mod_t *si, const char *file) { if (si == NULL) return NULL; - if (si->sim_fs_byfile == NULL) return NULL; - return si->sim_fs_byfile(si, file); + if (si->vtable->sim_fs_byfile == NULL) return NULL; + return si->vtable->sim_fs_byfile(si, file); } -__private_extern__ si_list_t * +si_list_t * si_fs_all(si_mod_t *si) { if (si == NULL) return NULL; - if (si->sim_fs_all == NULL) return NULL; - return si->sim_fs_all(si); + if (si->vtable->sim_fs_all == NULL) return NULL; + return si->vtable->sim_fs_all(si); } -__private_extern__ si_item_t * +si_item_t * si_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) { if (si == NULL) return NULL; @@ -794,8 +795,8 @@ si_item_call(struct si_mod_s *si, int call, const char *str1, const char *str2, case SI_CALL_DNS_QUERY: case SI_CALL_DNS_SEARCH: { - if (si->sim_item_call == NULL) return NULL; - return si->sim_item_call(si, call, str1, str2, str3, num1, num2, err); + if (si->vtable->sim_item_call == NULL) return NULL; + return si->vtable->sim_item_call(si, call, str1, str2, str3, num1, num2, err); } default: return NULL; @@ -804,7 +805,7 @@ si_item_call(struct si_mod_s *si, int call, const char *str1, const char *str2, return NULL; } -__private_extern__ si_list_t * +si_list_t * si_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) { if (si == NULL) return NULL; @@ -951,7 +952,8 @@ si_async_workunit_create(si_mod_t *si, int call, const char *str1, const char *s r->num3 = num3; r->num4 = num4; - r->flags = WORKUNIT_CALL_ACTIVE | WORKUNIT_THREAD_ACTIVE; + r->refcount = 2; + r->flags = 0; if (si_call_returns_list(call)) r->flags |= WORKUNIT_RETURNS_LIST; r->callback = callback; @@ -969,7 +971,11 @@ si_async_workunit_release(si_async_workunit_t *r) { if (r == NULL) return; - if (r->flags & (WORKUNIT_THREAD_ACTIVE | WORKUNIT_CALL_ACTIVE)) return; + if (OSAtomicDecrement32Barrier(&(r->refcount)) != 0) return; + +#ifdef CALL_TRACE + fprintf(stderr, "** %s freeing worklist item %p\n", __func__, r); +#endif si_async_worklist_remove_unit(r); @@ -983,19 +989,46 @@ si_async_workunit_release(si_async_workunit_t *r) free(r); } -static void * -si_async_launchpad(void *x) +static void +si_async_launchpad(si_async_workunit_t *r) { - si_async_workunit_t *r; kern_return_t status; mach_msg_empty_send_t msg; - if (x == NULL) pthread_exit(NULL); - r = (si_async_workunit_t *)x; +#ifdef CALL_TRACE + fprintf(stderr, "** %s starting worklist item %p\n", __func__, r); +#endif + + if (r->flags & WORKUNIT_CANCELLED) + { + si_async_workunit_release(r); +#ifdef CALL_TRACE + fprintf(stderr, "** %s worklist item %p was cancelled early\n", __func__, r); +#endif + return; + } if (r->flags & WORKUNIT_RETURNS_LIST) r->reslist = si_list_call(r->si, r->call, r->str1, r->str2, r->str3, r->num1, r->num2, r->num3, r->num4, &(r->err)); else r->resitem = si_item_call(r->si, r->call, r->str1, r->str2, r->str3, r->num1, r->num2, &(r->err)); + /* + * Test and set the cancelled flag. + * If it was set, then this work item was cancelled. + * Otherwise, setting it here prevents si_async_cancel from cancelling: + * too late to cancel now! + */ + if (OSAtomicTestAndSetBarrier(WORKUNIT_CANCELLED_BIT_ADDRESS, &(r->flags)) == 1) + { + si_async_workunit_release(r); +#ifdef CALL_TRACE + fprintf(stderr, "** %s worklist item %p was cancelled in flight\n", __func__, r); +#endif + return; + } +#ifdef CALL_TRACE + else fprintf(stderr, "** %s worklist item %p flags are now 0x%08x\n", __func__, r, r->flags); +#endif + memset(&msg, 0, sizeof(mach_msg_empty_send_t)); msg.header.msgh_bits = MACH_MSGH_BITS(MACH_MSG_TYPE_MOVE_SEND_ONCE, MACH_MSGH_BITS_ZERO); @@ -1004,47 +1037,50 @@ si_async_launchpad(void *x) msg.header.msgh_size = sizeof(mach_msg_empty_send_t); msg.header.msgh_id = r->call; - OSAtomicAnd32Barrier(~WORKUNIT_THREAD_ACTIVE, &r->flags); - - si_async_workunit_release(r); - status = mach_msg(&(msg.header), MACH_SEND_MSG, msg.header.msgh_size, 0, MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); if (status != MACH_MSG_SUCCESS) { /* receiver failed - clean up to avoid a port leak */ mach_msg_destroy(&(msg.header)); +#ifdef CALL_TRACE + fprintf(stderr, "** %s mach message send failed for worklist item %p\n", __func__, r); +#endif } - pthread_exit(NULL); + si_async_workunit_release(r); - /* UNREACHED */ - return NULL; + /* + * The client is now responsible for calling si_async_handle_reply, + * which will invoke the client's callback and then release the workunit. + */ + +#ifdef CALL_TRACE + fprintf(stderr, "** %s completed async worklist item %p\n", __func__, r); +#endif } mach_port_t si_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) { si_async_workunit_t *req; - pthread_attr_t attr; - pthread_t t; if (si == NULL) return MACH_PORT_NULL; if (callback == NULL) return MACH_PORT_NULL; /* if module does async on it's own, hand off the call */ - if (si->sim_async_call != NULL) + if (si->vtable->sim_async_call != NULL) { - return si->sim_async_call(si, call, str1, str2, str3, num1, num2, num3, num4, callback, context); + return si->vtable->sim_async_call(si, call, str1, str2, str3, num1, num2, num3, num4, callback, context); } req = si_async_workunit_create(si, call, str1, str2, str3, num1, num2, num3, num4, callback, context); if (req == NULL) return MACH_PORT_NULL; - /* start a new thread to do the work */ - pthread_attr_init(&attr); - pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); - pthread_create(&t, &attr, si_async_launchpad, req); - pthread_attr_destroy(&attr); + /* queue the work on the global low-priority dispatch queue */ +#ifdef CALL_TRACE + fprintf(stderr, "** %s dispatching worklist item %p\n", __func__, req); +#endif + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, DISPATCH_QUEUE_OVERCOMMIT), ^{ si_async_launchpad(req); }); return req->port; } @@ -1055,9 +1091,30 @@ si_async_cancel(mach_port_t p) si_async_workunit_t *r; r = si_async_worklist_find_unit(p); - if (r == NULL) return; + if (r == NULL) + { +#ifdef CALL_TRACE + fprintf(stderr, "** %s can't find worklist item\n", __func__); +#endif + return; + } - OSAtomicAnd32Barrier(~WORKUNIT_CALL_ACTIVE, &r->flags); + /* + * Test and set the WORKUNIT_CANCELLED flag. + * If it was already set, this work item has been executed - too late to cancel. + */ + if (OSAtomicTestAndSetBarrier(WORKUNIT_CANCELLED_BIT_ADDRESS, &(r->flags)) == 1) + { + /* already executed */ +#ifdef CALL_TRACE + fprintf(stderr, "** %s worklist item %p has executed\n", __func__, r); +#endif + return; + } + +#ifdef CALL_TRACE + fprintf(stderr, "** %s calling worklist item %p callback SI_STATUS_CALL_CANCELLED\n", __func__, r); +#endif if (r->callback != NULL) { @@ -1085,7 +1142,10 @@ si_async_handle_reply(mach_msg_header_t *msg) return; } - if (r->flags & WORKUNIT_THREAD_ACTIVE) +#ifdef CALL_TRACE + fprintf(stderr, "** %s worklist item %p flags are 0x%08x\n", __func__, r, r->flags); +#endif + if ((r->flags & WORKUNIT_CANCELLED) == 0) { #ifdef CALL_TRACE fprintf(stderr, "** %s workunit thread is still active\n", __func__); @@ -1108,20 +1168,18 @@ si_async_handle_reply(mach_msg_header_t *msg) #endif } - OSAtomicAnd32Barrier(~WORKUNIT_CALL_ACTIVE, &r->flags); - si_async_workunit_release(r); mach_port_mod_refs(mach_task_self(), reply, MACH_PORT_RIGHT_RECEIVE, -1); } -__private_extern__ char * -si_canonical_mac_address(const char *addr) +char * +si_standardize_mac_address(const char *addr) { char e[6][3]; char *out; struct ether_addr *ether; - int i, bit; + int i; if (addr == NULL) return NULL; @@ -1135,9 +1193,9 @@ si_canonical_mac_address(const char *addr) return NULL; } - for (i = 0, bit = 1; i < 6; i++, bit *= 2) + for (i = 0; i < 6; i++) { - if ((i & bit) && (ether->ether_addr_octet[i] <= 15)) + if (ether->ether_addr_octet[i] <= 15) { sprintf(e[i], "0%x", ether->ether_addr_octet[i]); } diff --git a/lookup.subproj/si_module.h b/lookup.subproj/si_module.h index 676c1f9..37635c0 100644 --- a/lookup.subproj/si_module.h +++ b/lookup.subproj/si_module.h @@ -87,24 +87,26 @@ #define si_call_str1_is_buffer(A) \ ((A==SI_CALL_HOST_BYADDR)||(A==SI_CALL_NAMEINFO)) -#define CATEGORY_USER 0 -#define CATEGORY_GROUP 1 -#define CATEGORY_GROUPLIST 2 -#define CATEGORY_NETGROUP 3 -#define CATEGORY_ALIAS 4 -#define CATEGORY_HOST_IPV4 5 -#define CATEGORY_HOST_IPV6 6 -#define CATEGORY_NETWORK 7 -#define CATEGORY_SERVICE 8 -#define CATEGORY_PROTOCOL 9 -#define CATEGORY_RPC 10 -#define CATEGORY_FS 11 -#define CATEGORY_MAC 12 -#define CATEGORY_NAMEINFO 13 -#define CATEGORY_ADDRINFO 14 -#define CATEGORY_DNSPACKET 15 -#define CATEGORY_SRV 16 -#define CATEGORY_COUNT 17 +#define CATEGORY_INVALID (-1) +#define CATEGORY_DEFAULT 0 +#define CATEGORY_USER 1 +#define CATEGORY_GROUP 2 +#define CATEGORY_GROUPLIST 3 +#define CATEGORY_NETGROUP 4 +#define CATEGORY_ALIAS 5 +#define CATEGORY_HOST_IPV4 6 +#define CATEGORY_HOST_IPV6 7 +#define CATEGORY_NETWORK 8 +#define CATEGORY_SERVICE 9 +#define CATEGORY_PROTOCOL 10 +#define CATEGORY_RPC 11 +#define CATEGORY_FS 12 +#define CATEGORY_MAC 13 +#define CATEGORY_NAMEINFO 14 +#define CATEGORY_ADDRINFO 15 +#define CATEGORY_DNSPACKET 16 +#define CATEGORY_SRV 17 +#define CATEGORY_COUNT 18 /* convenience */ #define CATEGORY_HOST CATEGORY_HOST_IPV4 @@ -199,15 +201,10 @@ typedef struct si_srv_s char *target; } si_srv_t; -typedef struct si_mod_s -{ - char *name; - uint32_t vers; - int32_t refcount; - - void *bundle; - void *private; +struct si_mod_s; +struct si_mod_vtable_s +{ void (*sim_close)(struct si_mod_s *si); int (*sim_is_valid)(struct si_mod_s *si, si_item_t *item); @@ -269,86 +266,102 @@ typedef struct si_mod_s 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); void (*sim_async_cancel)(mach_port_t p); void (*sim_async_handle_reply)(mach_msg_header_t *msg); +}; + +#define SI_MOD_FLAG_STATIC 0x00000001 + +typedef struct si_mod_s +{ + char *name; + uint32_t vers; + int32_t refcount; + uint32_t flags; + + void *bundle; + void *private; + + const struct si_mod_vtable_s *vtable; } si_mod_t; si_mod_t *si_module_with_name(const char *name); -__private_extern__ si_mod_t *si_module_with_path(const char *path, const char *name); -__private_extern__ si_mod_t *si_module_retain(si_mod_t *si); +si_mod_t *si_module_retain(si_mod_t *si); void si_module_release(si_mod_t *si); -__private_extern__ const char *si_module_name(si_mod_t *si); -__private_extern__ int si_module_vers(si_mod_t *si); +const char *si_module_name(si_mod_t *si); +int si_module_vers(si_mod_t *si); si_mod_t *si_search(void); -__private_extern__ int si_item_match(si_item_t *item, int cat, const void *name, uint32_t num, int which); -__private_extern__ int si_item_is_valid(si_item_t *item); +int si_item_match(si_item_t *item, int cat, const void *name, uint32_t num, int which); +int si_item_is_valid(si_item_t *item); -__private_extern__ si_item_t *si_user_byname(si_mod_t *si, const char *name); -__private_extern__ si_item_t *si_user_byuid(si_mod_t *si, uid_t uid); -__private_extern__ si_list_t *si_user_all(si_mod_t *si); +si_item_t *si_user_byname(si_mod_t *si, const char *name); +si_item_t *si_user_byuid(si_mod_t *si, uid_t uid); +si_list_t *si_user_all(si_mod_t *si); -__private_extern__ si_item_t *si_group_byname(si_mod_t *si, const char *name); -__private_extern__ si_item_t *si_group_bygid(si_mod_t *si, gid_t gid); -__private_extern__ si_list_t *si_group_all(si_mod_t *si); +si_item_t *si_group_byname(si_mod_t *si, const char *name); +si_item_t *si_group_bygid(si_mod_t *si, gid_t gid); +si_list_t *si_group_all(si_mod_t *si); -__private_extern__ si_item_t *si_grouplist(si_mod_t *si, const char *name); +si_item_t *si_grouplist(si_mod_t *si, const char *name); -__private_extern__ int si_in_netgroup(struct si_mod_s *si, const char *name, const char *host, const char *user, const char *domain); -__private_extern__ si_list_t *si_netgroup_byname(struct si_mod_s *si, const char *name); +int si_in_netgroup(struct si_mod_s *si, const char *name, const char *host, const char *user, const char *domain); +si_list_t *si_netgroup_byname(struct si_mod_s *si, const char *name); -__private_extern__ si_item_t *si_alias_byname(struct si_mod_s *si, const char *name); -__private_extern__ si_list_t *si_alias_all(struct si_mod_s *si); +si_item_t *si_alias_byname(struct si_mod_s *si, const char *name); +si_list_t *si_alias_all(struct si_mod_s *si); -__private_extern__ si_item_t *si_host_byname(si_mod_t *si, const char *name, int af, const char *interface, uint32_t *err); -__private_extern__ si_item_t *si_host_byaddr(si_mod_t *si, const void *addr, int af, const char *interface, uint32_t *err); -__private_extern__ si_list_t *si_host_all(si_mod_t *si); +si_item_t *si_host_byname(si_mod_t *si, const char *name, int af, const char *interface, uint32_t *err); +si_item_t *si_host_byaddr(si_mod_t *si, const void *addr, int af, const char *interface, uint32_t *err); +si_list_t *si_host_all(si_mod_t *si); -__private_extern__ si_item_t *si_mac_byname(struct si_mod_s *si, const char *name); -__private_extern__ si_item_t *si_mac_bymac(struct si_mod_s *si, const char *mac); -__private_extern__ si_list_t *si_mac_all(struct si_mod_s *si); +si_item_t *si_mac_byname(struct si_mod_s *si, const char *name); +si_item_t *si_mac_bymac(struct si_mod_s *si, const char *mac); +si_list_t *si_mac_all(struct si_mod_s *si); -__private_extern__ si_item_t *si_network_byname(si_mod_t *si, const char *name); -__private_extern__ si_item_t *si_network_byaddr(si_mod_t *si, uint32_t addr); -__private_extern__ si_list_t *si_network_all(si_mod_t *si); +si_item_t *si_network_byname(si_mod_t *si, const char *name); +si_item_t *si_network_byaddr(si_mod_t *si, uint32_t addr); +si_list_t *si_network_all(si_mod_t *si); -__private_extern__ si_item_t *si_service_byname(si_mod_t *si, const char *name, const char *proto); -__private_extern__ si_item_t *si_service_byport(si_mod_t *si, int port, const char *proto); -__private_extern__ si_list_t *si_service_all(si_mod_t *si); +si_item_t *si_service_byname(si_mod_t *si, const char *name, const char *proto); +si_item_t *si_service_byport(si_mod_t *si, int port, const char *proto); +si_list_t *si_service_all(si_mod_t *si); -__private_extern__ si_item_t *si_protocol_byname(si_mod_t *si, const char *name); -__private_extern__ si_item_t *si_protocol_bynumber(si_mod_t *si, uint32_t number); -__private_extern__ si_list_t *si_protocol_all(si_mod_t *si); +si_item_t *si_protocol_byname(si_mod_t *si, const char *name); +si_item_t *si_protocol_bynumber(si_mod_t *si, uint32_t number); +si_list_t *si_protocol_all(si_mod_t *si); -__private_extern__ si_item_t *si_rpc_byname(si_mod_t *si, const char *name); -__private_extern__ si_item_t *si_rpc_bynumber(si_mod_t *si, int number); -__private_extern__ si_list_t *si_rpc_all(si_mod_t *si); +si_item_t *si_rpc_byname(si_mod_t *si, const char *name); +si_item_t *si_rpc_bynumber(si_mod_t *si, int number); +si_list_t *si_rpc_all(si_mod_t *si); -__private_extern__ si_item_t *si_fs_byspec(si_mod_t *si, const char *spec); -__private_extern__ si_item_t *si_fs_byfile(si_mod_t *si, const char *file); -__private_extern__ si_list_t *si_fs_all(si_mod_t *si); +si_item_t *si_fs_byspec(si_mod_t *si, const char *spec); +si_item_t *si_fs_byfile(si_mod_t *si, const char *file); +si_list_t *si_fs_all(si_mod_t *si); -__private_extern__ int si_wants_addrinfo(si_mod_t *s); -__private_extern__ 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); +int si_wants_addrinfo(si_mod_t *s); +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); -__private_extern__ si_item_t *si_nameinfo(si_mod_t *si, const struct sockaddr *sa, int flags, const char *interface, uint32_t *err); -__private_extern__ si_item_t *si_ipnode_byname(si_mod_t *si, const char *name, int family, int flags, const char *interface, uint32_t *err); +si_item_t *si_nameinfo(si_mod_t *si, const struct sockaddr *sa, int flags, const char *interface, uint32_t *err); +si_item_t *si_ipnode_byname(si_mod_t *si, const char *name, int family, int flags, const char *interface, uint32_t *err); -__private_extern__ si_list_t *si_srv_byname(si_mod_t *si, const char *qname, const char *interface, uint32_t *err); +si_list_t *si_srv_byname(si_mod_t *si, const char *qname, const char *interface, uint32_t *err); -__private_extern__ 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); -__private_extern__ 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); +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); +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); 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); extern void si_async_cancel(mach_port_t p); extern void si_async_handle_reply(mach_msg_header_t *msg); -char *si_canonical_mac_address(const char *addr); +char *si_standardize_mac_address(const char *addr); 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); 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); -si_list_t *si_addrinfo_list(si_mod_t *si, int socktype, int proto, struct in_addr *a4, struct in6_addr *a6, int port, int scopeid, const char *cname4, const char *cname6); -si_list_t *si_addrinfo_list_from_hostent(si_mod_t *si, uint32_t socktype, uint32_t proto, uint16_t port, uint16_t scope, const struct hostent *h4, const struct hostent *h6); +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); +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); +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); int _gai_serv_to_port(const char *serv, uint32_t proto, uint16_t *port); 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); +int si_inet_config(uint32_t *inet4, uint32_t *inet6); #endif /* ! __SI_MODULE_H__ */ diff --git a/lookup.subproj/thread_data.c b/lookup.subproj/thread_data.c index c29ce54..d7aa02a 100644 --- a/lookup.subproj/thread_data.c +++ b/lookup.subproj/thread_data.c @@ -162,7 +162,7 @@ LI_get_thread_info(uint32_t key) return tdata; } -__private_extern__ si_item_t * +si_item_t * LI_get_thread_item(uint32_t key) { li_thread_data_t *tdata; @@ -173,7 +173,7 @@ LI_get_thread_item(uint32_t key) return tdata->thread_item; } -__private_extern__ si_list_t * +si_list_t * LI_get_thread_list(uint32_t key) { li_thread_data_t *tdata; @@ -184,7 +184,7 @@ LI_get_thread_list(uint32_t key) return tdata->thread_list; } -__private_extern__ void +void LI_set_thread_item(uint32_t key, si_item_t *item) { li_thread_data_t *tdata; @@ -196,7 +196,7 @@ LI_set_thread_item(uint32_t key, si_item_t *item) tdata->thread_item = item; } -__private_extern__ void +void LI_set_thread_list(uint32_t key, si_list_t *list) { li_thread_data_t *tdata; diff --git a/lookup.subproj/thread_data.h b/lookup.subproj/thread_data.h index 08dd022..357ec22 100644 --- a/lookup.subproj/thread_data.h +++ b/lookup.subproj/thread_data.h @@ -26,9 +26,9 @@ #include -__private_extern__ si_item_t *LI_get_thread_item(uint32_t key); -__private_extern__ si_list_t *LI_get_thread_list(uint32_t key); -__private_extern__ void LI_set_thread_item(uint32_t key, si_item_t *item); -__private_extern__ void LI_set_thread_list(uint32_t key, si_list_t *list); +si_item_t *LI_get_thread_item(uint32_t key); +si_list_t *LI_get_thread_list(uint32_t key); +void LI_set_thread_item(uint32_t key, si_item_t *item); +void LI_set_thread_list(uint32_t key, si_list_t *list); #endif /* ! __THREAD_DATA_H__ */ diff --git a/membership.subproj/Makefile b/membership.subproj/Makefile deleted file mode 100644 index 20b6836..0000000 --- a/membership.subproj/Makefile +++ /dev/null @@ -1,36 +0,0 @@ -Project = membership -ProductType = staticlib -Install_Dir = /scratch -BuildDebug = YES -BuildProfile = YES - -PRODUCT = $(shell tconf --product) - -HFILES = membership.h membershipPriv.h ntsid.h - -CFILES = membership.c - -MANPAGES = mbr_check_membership.3 mbr_uid_to_uuid.3 - -ifeq ($(PRODUCT),MacOSX) -USERDEFS = /usr/local/include/DSmemberdMIG.defs -endif - -Install_Headers = membership.h ntsid.h -Install_Private_Headers = membershipPriv.h - -Extra_CC_Flags = -Wall -fno-common \ - -D__MigTypeCheck=1 -D__DARWIN_NON_CANCELABLE=1 -ifeq ($(PRODUCT),MacOSX) -Extra_CC_Flags += -DDS_AVAILABLE -endif - -include $(MAKEFILEPATH)/CoreOS/ReleaseControl/BSDCommon.make - -after_install: - @for LINK in mbr_gid_to_uuid.3 mbr_sid_to_uuid.3 mbr_uuid_to_id.3 \ - mbr_uuid_to_sid.3 ; do \ - $(LN) -f "$(DSTROOT)/usr/share/man/man3/mbr_uid_to_uuid.3" \ - "$(DSTROOT)/usr/share/man/man3/$${LINK}" ; \ - done - diff --git a/membership.subproj/mbr_uid_to_uuid.3 b/membership.subproj/mbr_uid_to_uuid.3 index 96d8ae6..a778aea 100644 --- a/membership.subproj/mbr_uid_to_uuid.3 +++ b/membership.subproj/mbr_uid_to_uuid.3 @@ -1,4 +1,4 @@ -.\" Copyright (c) 2005-2007 Apple Inc +.\" Copyright (c) 2005-2010 Apple Inc .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without @@ -26,7 +26,7 @@ .\" SUCH DAMAGE. .\" .\" -.Dd February 3, 2005 +.Dd August 25, 2010 .Dt MBR_UID_TO_UUID 3 .Os "Mac OS X" .Sh NAME @@ -48,6 +48,10 @@ .Fn mbr_sid_to_uuid "const nt_sid_t *sid" "uuid_t uu" .Ft int .Fn mbr_uuid_to_sid "const uuid_t uu" "nt_sid_t *sid" +.Ft int +.Fn mbr_sid_to_string "const nt_sid_t *sid" "char *string" +.Ft int +.Fn mbr_string_to_sid "const char *string" "nt_sid_t *sid" .Sh DESCRIPTION Users and groups can be referred to in multiple ways. In addition to the traditional uid and gid, @@ -88,13 +92,22 @@ or .Pp .Fn mbr_sid_to_uuid takes a sid and returns the associated uuid. -Like -.Fn mbr_uuid_to_id , -.Fn mbr_sid_to_uuid -always returns a uuid for the sid, even if the sid can not be found. .Pp .Fn mbr_uuid_to_sid returns a sid for the associated uuid. +.Pp +Two additional utility functions are available to convert between sids and a string representation. +String representations may be required, for example, when text files or XML files are used to save sid values. +.Pp +.Fn mbr_sid_to_string +converts a sid into a string representation. +The +.Fa string +parameter must be a buffer of at least 194 characters. +The converted string is terminated with a nul character. +.Pp +.Fn mbr_string_to_sid +converts an external string representation into a sid. .Sh RETURN VALUES These functions return 0 on success, or EIO if communications with the .Xr DirectoryService 8 @@ -105,6 +118,12 @@ ENOENT is returned if the mapping can not be performed. and .Fn mbr_uid_to_uuid return 0 (success), even if the user/group does not exist. +.Pp +The +.Fn mbr_sid_to_string +and +.Fn mbr_string_to_sid +functions return 0 on success, or an errno value on failure. .Sh SEE ALSO .Xr getpwuid 3 , .Xr getgrgid 3 , diff --git a/membership.subproj/membership.c b/membership.subproj/membership.c index 4d9edb9..b2c980c 100644 --- a/membership.subproj/membership.c +++ b/membership.subproj/membership.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2004-2007 Apple Inc. All rights reserved. + * Copyright (c) 2004-2010 Apple Inc. All rights reserved. * * @APPLE_LICENSE_HEADER_START@ * @@ -28,20 +28,22 @@ #include #include #ifdef DS_AVAILABLE -#include -#include +#include "DSmemberdMIG.h" #endif #ifdef DS_AVAILABLE extern mach_port_t _mbr_port; extern int _ds_running(void); -static const uint8_t _mbr_root_uuid[] = {0xff, 0xff, 0xee, 0xee, 0xdd, 0xdd, 0xcc, 0xcc, 0xbb, 0xbb, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00}; +static const uuid_t _user_compat_prefix = {0xff, 0xff, 0xee, 0xee, 0xdd, 0xdd, 0xcc, 0xcc, 0xbb, 0xbb, 0xaa, 0xaa, 0x00, 0x00, 0x00, 0x00}; +static const uuid_t _group_compat_prefix = {0xab, 0xcd, 0xef, 0xab, 0xcd, 0xef, 0xab, 0xcd, 0xef, 0xab, 0xcd, 0xef, 0x00, 0x00, 0x00, 0x00}; + +#define COMPAT_PREFIX_LEN (sizeof(uuid_t) - sizeof(id_t)) #define MAX_LOOKUP_ATTEMPTS 10 #endif -__private_extern__ uid_t +uid_t audit_token_uid(audit_token_t a) { /* @@ -59,7 +61,8 @@ _mbr_MembershipCall(struct kauth_identity_extlookup *req) kern_return_t status; uint32_t i; - if (_ds_running() == 0) return EIO; + /* call _ds_running() to look up _mbr_port */ + _ds_running(); if (_mbr_port == MACH_PORT_NULL) return EIO; memset(&token, 0, sizeof(audit_token_t)); @@ -95,7 +98,8 @@ _mbr_MapName(char *name, int type, guid_t *uu) if (name == NULL) return EINVAL; if (strlen(name) > 255) return EINVAL; - if (_ds_running() == 0) return EIO; + /* call _ds_running() to look up _mbr_port */ + _ds_running(); if (_mbr_port == MACH_PORT_NULL) return EIO; memset(&token, 0, sizeof(audit_token_t)); @@ -129,7 +133,8 @@ _mbr_ClearCache() kern_return_t status; uint32_t i; - if (_ds_running() == 0) return EIO; + /* call _ds_running() to look up _mbr_port */ + _ds_running(); if (_mbr_port == MACH_PORT_NULL) return EIO; status = MIG_SERVER_DIED; @@ -151,55 +156,46 @@ _mbr_ClearCache() } #endif -int -mbr_uid_to_uuid(uid_t id, uuid_t uu) -{ #ifdef DS_AVAILABLE - struct kauth_identity_extlookup request; - int status; - - if (id == 0) +static int +_mbr_SetIdentifierTTL(int idType, const void *identifier, size_t identifier_size, unsigned int seconds) +{ + kern_return_t status; + uint32_t i; + + /* call _ds_running() to look up _mbr_port */ + _ds_running(); + if (_mbr_port == MACH_PORT_NULL) return EIO; + + status = MIG_SERVER_DIED; + for (i = 0; (_mbr_port != MACH_PORT_NULL) && (status == MIG_SERVER_DIED) && (i < MAX_LOOKUP_ATTEMPTS); i++) { - memcpy(uu, _mbr_root_uuid, sizeof(uuid_t)); - return 0; + status = memberdDSmig_SetIdentifierTTL(_mbr_port, idType, (identifier_data_t)identifier, identifier_size, seconds); + if (status == MACH_SEND_INVALID_DEST) + { + mach_port_mod_refs(mach_task_self(), _mbr_port, MACH_PORT_RIGHT_SEND, -1); + _mbr_port = MACH_PORT_NULL; + _ds_running(); + status = MIG_SERVER_DIED; + } } - - /* used as a byte order field */ - request.el_seqno = 1; - request.el_flags = KAUTH_EXTLOOKUP_VALID_UID | KAUTH_EXTLOOKUP_WANT_UGUID; - request.el_uid = id; - - status = _mbr_MembershipCall(&request); - if (status != 0) return status; - if ((request.el_flags & KAUTH_EXTLOOKUP_VALID_UGUID) == 0) return ENOENT; - - memcpy(uu, &request.el_uguid, sizeof(guid_t)); + + if (status != KERN_SUCCESS) return EIO; + return 0; -#else - return EIO; +} #endif + +int +mbr_uid_to_uuid(uid_t id, uuid_t uu) +{ + return mbr_identifier_to_uuid(ID_TYPE_UID, &id, sizeof(id), uu); } int mbr_gid_to_uuid(gid_t id, uuid_t uu) { -#ifdef DS_AVAILABLE - struct kauth_identity_extlookup request; - int status; - - request.el_seqno = 1; - request.el_flags = KAUTH_EXTLOOKUP_VALID_GID | KAUTH_EXTLOOKUP_WANT_GGUID; - request.el_gid = id; - - status = _mbr_MembershipCall(&request); - if (status != 0) return status; - if ((request.el_flags & KAUTH_EXTLOOKUP_VALID_GGUID) == 0) return ENOENT; - - memcpy(uu, &request.el_gguid, sizeof(guid_t)); - return 0; -#else - return EIO; -#endif + return mbr_identifier_to_uuid(ID_TYPE_GID, &id, sizeof(id), uu); } int @@ -208,16 +204,25 @@ mbr_uuid_to_id(const uuid_t uu, uid_t *id, int *id_type) #ifdef DS_AVAILABLE struct kauth_identity_extlookup request; int status; + id_t tempID; if (id == NULL) return EIO; if (id_type == NULL) return EIO; - if (!memcmp(uu, _mbr_root_uuid, sizeof(uuid_t))) + if (!memcmp(uu, _user_compat_prefix, COMPAT_PREFIX_LEN)) { - *id = 0; + memcpy(&tempID, &uu[COMPAT_PREFIX_LEN], sizeof(tempID)); + *id = ntohl(tempID); *id_type = ID_TYPE_UID; return 0; } + else if (!memcmp(uu, _group_compat_prefix, COMPAT_PREFIX_LEN)) + { + memcpy(&tempID, &uu[COMPAT_PREFIX_LEN], sizeof(tempID)); + *id = ntohl(tempID); + *id_type = ID_TYPE_GID; + return 0; + } request.el_seqno = 1; request.el_flags = KAUTH_EXTLOOKUP_VALID_UGUID | KAUTH_EXTLOOKUP_VALID_GGUID | KAUTH_EXTLOOKUP_WANT_UID | KAUTH_EXTLOOKUP_WANT_GID; @@ -284,17 +289,52 @@ mbr_identifier_to_uuid(int id_type, const void *identifier, size_t identifier_si vm_offset_t ool = 0; mach_msg_type_number_t oolCnt = 0; uint32_t i; + id_t tempID; #if __BIG_ENDIAN__ id_t newID; #endif - + if (identifier == NULL) return EINVAL; if (identifier_size == 0) return EINVAL; else if (identifier_size == -1) identifier_size = strlen((char*) identifier) + 1; - - if (_ds_running() == 0) return EIO; + + /* call _ds_running() to look up _mbr_port */ + _ds_running(); + + /* if this is a UID or GID translation, we shortcut UID/GID 0 */ + /* if no DS, we return compatibility UUIDs */ + switch (id_type) + { + case ID_TYPE_UID: + { + if (identifier_size != sizeof(tempID)) return EINVAL; + + tempID = *((id_t *) identifier); + if ((tempID == 0) || (_mbr_port == MACH_PORT_NULL)) + { + uuid_copy(uu, _user_compat_prefix); + *((id_t *) &uu[COMPAT_PREFIX_LEN]) = htonl(tempID); + return 0; + } + break; + } + case ID_TYPE_GID: + { + if (identifier_size != sizeof(tempID)) return EINVAL; + + tempID = *((id_t *) identifier); + if ((tempID == 0) || (_mbr_port == MACH_PORT_NULL)) + { + uuid_copy(uu, _group_compat_prefix); + *((id_t *) &uu[COMPAT_PREFIX_LEN]) = htonl(tempID); + return 0; + } + break; + } + } + if (_mbr_port == MACH_PORT_NULL) return EIO; - + memset(&token, 0, sizeof(audit_token_t)); #if __BIG_ENDIAN__ @@ -308,20 +348,20 @@ mbr_identifier_to_uuid(int id_type, const void *identifier, size_t identifier_si break; } #endif - + if (identifier_size > MAX_MIG_INLINE_DATA) { if (vm_read(mach_task_self(), (vm_offset_t) identifier, identifier_size, &ool, &oolCnt) != 0) return ENOMEM; identifier = NULL; identifier_size = 0; } - + status = MIG_SERVER_DIED; for (i = 0; (_mbr_port != MACH_PORT_NULL) && (status == MIG_SERVER_DIED) && (i < MAX_LOOKUP_ATTEMPTS); i++) { - status = memberdDSmig_MapIdentifier(_mbr_port, id_type, (vm_offset_t)identifier, identifier_size, ool, oolCnt, uu, &token); + status = memberdDSmig_MapIdentifier(_mbr_port, id_type, (identifier_data_t) identifier, identifier_size, ool, oolCnt, (guid_t *)uu, &token); if (status == KERN_FAILURE) return ENOENT; - + if (status == MACH_SEND_INVALID_DEST) { if (ool != 0) vm_deallocate(mach_task_self(), ool, oolCnt); @@ -332,10 +372,10 @@ mbr_identifier_to_uuid(int id_type, const void *identifier, size_t identifier_si status = MIG_SERVER_DIED; } } - + if (status != KERN_SUCCESS) return EIO; if (audit_token_uid(token) != 0) return EAUTH; - + return 0; #else return EIO; @@ -396,7 +436,7 @@ mbr_uuid_to_sid(const uuid_t uu, nt_sid_t *sid) } int -mbr_check_membership(uuid_t user, uuid_t group, int *ismember) +mbr_check_membership(const uuid_t user, const uuid_t group, int *ismember) { #ifdef DS_AVAILABLE struct kauth_identity_extlookup request; @@ -502,7 +542,7 @@ mbr_check_service_membership(const uuid_t user, const char *servicename, int *is char *all_services = "com.apple.access_all_services"; char groupName[256]; uuid_t group_uu; - int result, dummy; + int result; if (servicename == NULL) return EINVAL; if (strlen(servicename) > 255 - strlen(prefix)) return EINVAL; @@ -522,17 +562,8 @@ mbr_check_service_membership(const uuid_t user, const char *servicename, int *is if (result == 0) { - result = mbr_check_membership_refresh(user, group_uu, ismember); - } - else if (result == EAUTH) - { - return result; - } - else - { - /* just force cache update with bogus membership check */ - memset(group_uu, 0, sizeof(group_uu)); - mbr_check_membership_refresh(user, group_uu, &dummy); + /* refreshes are driven at a higher level, just check membership */ + result = mbr_check_membership(user, group_uu, ismember); } return result; @@ -625,7 +656,11 @@ mbr_string_to_sid(const char *string, nt_sid_t *sid) while (*current != '\0' && count < NTSID_MAX_AUTHORITIES) { current++; + errno = 0; sid->sid_authorities[count] = (u_int32_t)strtoll(current, ¤t, 10); + if ((sid->sid_authorities[count] == 0) && (errno == EINVAL)) { + return EINVAL; + } count++; } @@ -741,3 +776,13 @@ mbr_string_to_uuid(const char *string, uuid_t uu) #endif } +int +mbr_set_identifier_ttl(int id_type, const void *identifier, size_t identifier_size, unsigned int seconds) +{ +#ifdef DS_AVAILABLE + _mbr_SetIdentifierTTL(id_type, identifier, identifier_size, seconds); + return 0; +#else + return EIO; +#endif +} diff --git a/membership.subproj/membership.h b/membership.subproj/membership.h index 32c8a8a..ea72447 100644 --- a/membership.subproj/membership.h +++ b/membership.subproj/membership.h @@ -175,6 +175,27 @@ int mbr_uuid_to_id(const uuid_t uu, id_t* uid_or_gid, int* id_type); */ int mbr_uuid_to_sid(const uuid_t uu, nt_sid_t* sid); +/*! + @function mbr_sid_to_string + @abstract convert a SID to a corresponding character string representation + @discussion for use in situations where an external representation of a SID is required. + @param sid is the SID to be converted + @param string is a buffer that will be filled in with a nul-terminated string + representation of the SID. The buffer must be at least 194 characters in length. + @result returns 0 on success or appropriate errno code. + */ +int mbr_sid_to_string(const nt_sid_t *sid, char *string); + +/*! + @function mbr_string_to_sid + @abstract convert a character string representation of a sid to an nt_sid_t value + @discussion for converting an external representation of a sid. + @param string is a buffer containing a nul-terminated string representation of a SID + @param sid is the target of the conversion + @result returns 0 on success or appropriate errno code. + */ +int mbr_string_to_sid(const char *string, nt_sid_t *sid); + /*! @function mbr_check_membership @abstract checks if a user is a member of a group @@ -186,7 +207,7 @@ int mbr_uuid_to_sid(const uuid_t uu, nt_sid_t* sid); otherwise 0 is returned @result returns 0 on success or appropriate errno code. */ -int mbr_check_membership(uuid_t user, uuid_t group, int* ismember); +int mbr_check_membership(const uuid_t user, const uuid_t group, int* ismember); /*! @function mbr_check_service_membership diff --git a/membership.subproj/membershipPriv.h b/membership.subproj/membershipPriv.h index a98854e..83abd35 100644 --- a/membership.subproj/membershipPriv.h +++ b/membership.subproj/membershipPriv.h @@ -41,9 +41,8 @@ int mbr_check_membership_by_id(uuid_t user, gid_t group, int *ismember); int mbr_check_membership_refresh(const uuid_t user, uuid_t group, int *ismember); int mbr_uuid_to_string(const uuid_t uu, char *string); int mbr_string_to_uuid(const char *string, uuid_t uu); -int mbr_sid_to_string(const nt_sid_t *sid, char *string); -int mbr_string_to_sid(const char *string, nt_sid_t *sid); int mbr_uuid_to_sid_type(const uuid_t uu, nt_sid_t *sid, int *id_type); +int mbr_set_identifier_ttl(int id_type, const void *identifier, size_t identifier_size, unsigned int seconds); __END_DECLS diff --git a/membership.subproj/ntsid.h b/membership.subproj/ntsid.h index 5fe28bd..06a6b80 100644 --- a/membership.subproj/ntsid.h +++ b/membership.subproj/ntsid.h @@ -32,6 +32,6 @@ typedef struct { u_int8_t sid_authcount; u_int8_t sid_authority[6]; u_int32_t sid_authorities[NTSID_MAX_AUTHORITIES]; -} nt_sid_t __attribute__ ((packed)); +} nt_sid_t; #endif /* !_NTSID_H_ */ diff --git a/netinfo.subproj/Makefile b/netinfo.subproj/Makefile deleted file mode 100644 index 41f5577..0000000 --- a/netinfo.subproj/Makefile +++ /dev/null @@ -1,12 +0,0 @@ -Project = netinfo -ProductType = staticlib -Install_Dir = /scratch -BuildDebug = YES -BuildProfile = YES - -CFILES = ni_stub.c - -Extra_CC_Flags = -Wall -fno-common \ - -D__DARWIN_NON_CANCELABLE=1 - -include $(MAKEFILEPATH)/CoreOS/ReleaseControl/BSDCommon.make diff --git a/nis.subproj/Makefile b/nis.subproj/Makefile deleted file mode 100644 index 8859ee9..0000000 --- a/nis.subproj/Makefile +++ /dev/null @@ -1,32 +0,0 @@ -Project = nis -ProductType = staticlib -Install_Dir = /scratch -BuildDebug = YES -BuildProfile = YES - -HFILES = ypclnt.h ypinternal.h yp_prot.h - -CFILES = getdomainname.c getnetgrent.c innetgr.c setdomainname.c\ - xdr_domainname.c xdr_keydat.c xdr_mapname.c xdr_peername.c\ - xdr_valdat.c xdr_ypbind_binding.c xdr_ypbind_resp.c\ - xdr_ypbind_resptype.c xdr_ypbind_setdom.c xdr_ypmaplist.c\ - xdr_ypreq_key.c xdr_ypreq_nokey.c xdr_ypresp_all.c\ - xdr_ypresp_key_val.c xdr_ypresp_maplist.c xdr_ypresp_master.c\ - xdr_ypresp_order.c xdr_ypresp_val.c xdr_ypstat.c\ - yperr_string.c ypmatch_cache.c yppasswdd_xdr.c ypprot_err.c\ - yp_all.c yp_bind.c yp_first.c yp_get_default_domain.c\ - yp_maplist.c yp_master.c yp_order.c - -MANPAGES = yp_all.3 yp_bind.3 yp_first.3\ - yp_get_default_domain.3 yp_master.3 yp_match.3 yp_next.3\ - yp_order.3 yp_unbind.3 ypclnt.3 yperr_string.3 ypprot_err.3\ - yp.8 - -Install_Headers = ypclnt.h yp_prot.h -Install_Headers_Directory = /usr/include/rpcsvc - -Extra_CC_Flags = -Wall -fno-common -I. \ - -I../gen.subproj -I../lookup.subproj \ - -D__DARWIN_NON_CANCELABLE=1 - -include $(MAKEFILEPATH)/CoreOS/ReleaseControl/BSDCommon.make diff --git a/nis.subproj/yp_prot.h b/nis.subproj/yp_prot.h index 531017c..94c7588 100644 --- a/nis.subproj/yp_prot.h +++ b/nis.subproj/yp_prot.h @@ -1,28 +1,5 @@ /* - * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. - * - * @APPLE_LICENSE_HEADER_START@ - * - * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights - * Reserved. This file contains Original Code and/or Modifications of - * Original Code as defined in and that are subject to the Apple Public - * Source License Version 1.1 (the "License"). You may not use this file - * except in compliance with the License. Please obtain a copy of the - * License at http://www.apple.com/publicsource and read it before using - * this file. - * - * The Original Code and all software distributed under the License are - * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER - * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, - * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the - * License for the specific language governing rights and limitations - * under the License. - * - * @APPLE_LICENSE_HEADER_END@ - */ -/* - * Copyright (c) 1992, 1993 Theo de Raadt + * Copyright (c) 1992/3 Theo de Raadt * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -33,11 +10,9 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * This product includes software developed by Theo de Raadt. - * 4. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. + * 3. The name of the author may not be used to endorse or promote + * products derived from this software without specific prior written + * permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED @@ -50,6 +25,8 @@ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. + * + * $FreeBSD: src/include/rpcsvc/yp_prot.h,v 1.13 2005/12/06 02:01:06 peter Exp $ */ #ifndef _RPCSVC_YP_PROT_H_ @@ -57,9 +34,9 @@ /* * YPSERV PROTOCOL: - * + * * ypserv supports the following procedures: - * + * * YPPROC_NULL takes (void), returns (void). * called to check if server is alive. * YPPROC_DOMAIN takes (char *), returns (bool_t). @@ -90,20 +67,15 @@ * YPPROC_MAPLIST takes (char *), returns (struct ypmaplist *). */ -#ifndef BOOL_DEFINED -typedef unsigned int bool; -#define BOOL_DEFINED -#endif - - /* Program and version symbols, magic numbers */ -#define YPPROG ((unsigned long)100004) -#define YPVERS ((unsigned long)2) -#define YPVERS_ORIG ((unsigned long)1) -#define YPMAXRECORD ((unsigned long)1024) -#define YPMAXDOMAIN ((unsigned long)64) -#define YPMAXMAP ((unsigned long)64) -#define YPMAXPEER ((unsigned long)256) + +#define YPPROG ((u_long)100004) +#define YPVERS ((u_long)2) +#define YPVERS_ORIG ((u_long)1) +#define YPMAXRECORD ((u_long)1024) +#define YPMAXDOMAIN ((u_long)64) +#define YPMAXMAP ((u_long)64) +#define YPMAXPEER ((u_long)256) /* * I don't know if anything of sun's depends on this, or if they @@ -114,35 +86,35 @@ typedef unsigned int bool; #ifndef DATUM typedef struct { - const char *dptr; - int dsize; + char *dptr; + int dsize; } datum; #define DATUM #endif struct ypmap_parms { - const char *domain; - const char *map; - unsigned long ordernum; + char *domain; + char *map; + u_int ordernum; char *owner; }; struct ypreq_key { - const char *domain; - const char *map; + char *domain; + char *map; datum keydat; }; struct ypreq_nokey { - const char *domain; - const char *map; + char *domain; + char *map; }; struct ypreq_xfr { struct ypmap_parms map_parms; - unsigned long transid; - unsigned long proto; - unsigned short port; + u_int transid; + u_int proto; + u_int port; }; #define ypxfr_domain map_parms.domain #define ypxfr_map map_parms.map @@ -150,24 +122,24 @@ struct ypreq_xfr { #define ypxfr_owner map_parms.owner struct ypresp_val { - unsigned long status; + u_int status; datum valdat; }; struct ypresp_key_val { - unsigned long status; + u_int status; datum keydat; datum valdat; }; struct ypresp_master { - unsigned long status; + u_int status; char *master; }; struct ypresp_order { - unsigned long status; - unsigned long ordernum; + u_int status; + u_int ordernum; }; struct ypresp_all { @@ -178,28 +150,28 @@ struct ypresp_all { }; struct ypmaplist { - char ypml_name[YPMAXMAP + 1]; + char *ypml_name; struct ypmaplist *ypml_next; }; struct ypresp_maplist { - unsigned long status; + u_int status; struct ypmaplist *list; }; /* ypserv procedure numbers */ -#define YPPROC_NULL ((unsigned long)0) -#define YPPROC_DOMAIN ((unsigned long)1) -#define YPPROC_DOMAIN_NONACK ((unsigned long)2) -#define YPPROC_MATCH ((unsigned long)3) -#define YPPROC_FIRST ((unsigned long)4) -#define YPPROC_NEXT ((unsigned long)5) -#define YPPROC_XFR ((unsigned long)6) -#define YPPROC_CLEAR ((unsigned long)7) -#define YPPROC_ALL ((unsigned long)8) -#define YPPROC_MASTER ((unsigned long)9) -#define YPPROC_ORDER ((unsigned long)10) -#define YPPROC_MAPLIST ((unsigned long)11) +#define YPPROC_NULL ((u_long)0) +#define YPPROC_DOMAIN ((u_long)1) +#define YPPROC_DOMAIN_NONACK ((u_long)2) +#define YPPROC_MATCH ((u_long)3) +#define YPPROC_FIRST ((u_long)4) +#define YPPROC_NEXT ((u_long)5) +#define YPPROC_XFR ((u_long)6) +#define YPPROC_CLEAR ((u_long)7) +#define YPPROC_ALL ((u_long)8) +#define YPPROC_MASTER ((u_long)9) +#define YPPROC_ORDER ((u_long)10) +#define YPPROC_MAPLIST ((u_long)11) /* ypserv procedure return status values */ #define YP_TRUE ((long)1) /* general purpose success code */ @@ -220,7 +192,7 @@ struct ypresp_maplist { * Users of the ypclnt package (or of this protocol) don't HAVE to know about * it, but it must be available to users because _yp_dobind is a public * interface." - * + * * This is totally bogus! Nowhere else does Sun state that _yp_dobind() is * a public interface, and I don't know any reason anyone would want to call * it. But, just in case anyone does actually expect it to be available.. @@ -230,16 +202,16 @@ struct dom_binding { struct dom_binding *dom_pnext; char dom_domain[YPMAXDOMAIN + 1]; struct sockaddr_in dom_server_addr; - unsigned short dom_server_port; + u_short dom_server_port; int dom_socket; CLIENT *dom_client; - unsigned short dom_local_port; + u_short dom_local_port; long dom_vers; }; /* * YPBIND PROTOCOL: - * + * * ypbind supports the following procedures: * * YPBINDPROC_NULL takes (void), returns (void). @@ -250,15 +222,15 @@ struct dom_binding { * YPBINDPROC_SETDOM takes (struct ypbind_setdom), returns (void). * used by ypset. */ - -#define YPBINDPROG ((unsigned long)100007) -#define YPBINDVERS ((unsigned long)2) -#define YPBINDVERS_ORIG ((unsigned long)1) + +#define YPBINDPROG ((u_long)100007) +#define YPBINDVERS ((u_long)2) +#define YPBINDVERS_ORIG ((u_long)1) /* ypbind procedure numbers */ -#define YPBINDPROC_NULL ((unsigned long)0) -#define YPBINDPROC_DOMAIN ((unsigned long)1) -#define YPBINDPROC_SETDOM ((unsigned long)2) +#define YPBINDPROC_NULL ((u_long)0) +#define YPBINDPROC_DOMAIN ((u_long)1) +#define YPBINDPROC_SETDOM ((u_long)2) /* error code in ypbind_resp.ypbind_status */ enum ypbind_resptype { @@ -269,13 +241,13 @@ enum ypbind_resptype { /* network order, of course */ struct ypbind_binding { struct in_addr ypbind_binding_addr; - unsigned short ypbind_binding_port; + u_short ypbind_binding_port; }; struct ypbind_resp { enum ypbind_resptype ypbind_status; union { - unsigned long ypbind_error; + u_int ypbind_error; struct ypbind_binding ypbind_bindinfo; } ypbind_respbody; }; @@ -291,33 +263,33 @@ struct ypbind_resp { struct ypbind_setdom { char ypsetdom_domain[YPMAXDOMAIN + 1]; struct ypbind_binding ypsetdom_binding; - unsigned short ypsetdom_vers; + u_int ypsetdom_vers; }; #define ypsetdom_addr ypsetdom_binding.ypbind_binding_addr #define ypsetdom_port ypsetdom_binding.ypbind_binding_port /* * YPPUSH PROTOCOL: - * + * * Sun says: * "Protocol between clients (ypxfr, only) and yppush * yppush speaks a protocol in the transient range, which * is supplied to ypxfr as a command-line parameter when it * is activated by ypserv." - * - * This protocol is not implimented, naturally, because this YP - * implimentation only does the client side. + * + * This protocol is not implemented, naturally, because this YP + * implementation only does the client side. */ -#define YPPUSHVERS ((unsigned long)1) -#define YPPUSHVERS_ORIG ((unsigned long)1) +#define YPPUSHVERS ((u_long)1) +#define YPPUSHVERS_ORIG ((u_long)1) /* yppush procedure numbers */ -#define YPPUSHPROC_NULL ((unsigned long)0) -#define YPPUSHPROC_XFRRESP ((unsigned long)1) +#define YPPUSHPROC_NULL ((u_long)0) +#define YPPUSHPROC_XFRRESP ((u_long)1) struct yppushresp_xfr { - unsigned long transid; - unsigned long status; + u_int transid; + u_int status; }; /* yppush status value in yppushresp_xfr.status */ @@ -325,7 +297,7 @@ struct yppushresp_xfr { #define YPPUSH_AGE ((long)2) /* Master's version not newer */ #define YPPUSH_NOMAP ((long)-1) /* Can't find server for map */ #define YPPUSH_NODOM ((long)-2) /* Domain not supported */ -#define YPPUSH_RSRC ((long)-3) /* Local resouce alloc failure */ +#define YPPUSH_RSRC ((long)-3) /* Local resource alloc failure */ #define YPPUSH_RPC ((long)-4) /* RPC failure talking to server */ #define YPPUSH_MADDR ((long)-5) /* Can't get master address */ #define YPPUSH_YPERR ((long)-6) /* YP server/map db error */ diff --git a/rpc.subproj/Makefile b/rpc.subproj/Makefile deleted file mode 100644 index 1aeaab7..0000000 --- a/rpc.subproj/Makefile +++ /dev/null @@ -1,71 +0,0 @@ -Project = rpc -ProductType = staticlib -Install_Dir = /scratch -BuildDebug = YES -BuildProfile = YES - -HFILES = auth.h auth_unix.h clnt.h pmap_clnt.h pmap_prot.h pmap_rmt.h\ - rpc.h rpc_msg.h svc.h svc_auth.h types.h xdr.h pmap_wakeup.h - -CFILES = auth_none.c auth_unix.c authunix_prot.c bindresvport.c\ - clnt_generic.c clnt_perror.c clnt_raw.c clnt_simple.c\ - clnt_tcp.c clnt_udp.c get_myaddress.c pmap_clnt.c\ - pmap_getmaps.c pmap_getport.c pmap_prot.c pmap_prot2.c\ - pmap_rmt.c rpc_callmsg.c rpc_commondata.c rpc_dtablesize.c\ - rpc_prot.c svc.c svc_auth.c svc_auth_unix.c svc_raw.c\ - svc_run.c svc_simple.c svc_tcp.c getrpcent.c svc_udp.c xdr.c\ - xdr_array.c xdr_float.c xdr_mem.c xdr_rec.c xdr_reference.c\ - xdr_sizeof.c xdr_stdio.c getrpcport.c pmap_wakeup.c - -MANPAGES = bindresvport.3 getrpcent.3 getrpcport.3 rpc.3 xdr.3 - -Install_Headers_Directory = /usr/include/rpc -Install_Headers = auth.h auth_unix.h clnt.h pmap_clnt.h pmap_prot.h\ - pmap_rmt.h rpc.h rpc_msg.h svc.h svc_auth.h types.h\ - xdr.h - -Extra_CC_Flags = -Wall -fno-common \ - -I../gen.subproj -I../lookup.subproj \ - -D__DARWIN_NON_CANCELABLE=1 - -include $(MAKEFILEPATH)/CoreOS/ReleaseControl/BSDCommon.make - -after_install: - @for LINK in getrpcbyname.3 getrpcbynumber.3 \ - endrpcent.3 setrpcent.3 ; do \ - $(LN) -f "$(DSTROOT)/usr/share/man/man3/getrpcent.3" \ - "$(DSTROOT)/usr/share/man/man3/$${LINK}" ; \ - done - @for LINK in auth_destroy.3 authnone_create.3 authunix_create.3 \ - authunix_create_default.3 callrpc.3 clnt_broadcast.3 \ - clnt_call.3 clnt_control.3 clnt_create.3 clnt_destroy.3 \ - clnt_freeres.3 clnt_geterr.3 clnt_pcreateerror.3 \ - clnt_perrno.3 clnt_perror.3 clnt_spcreateerror.3 \ - clnt_sperrno.3 clnt_sperror.3 clntraw_create.3 \ - clnttcp_create.3 clntudp_bufcreate.3 clntudp_create.3 \ - get_myaddress.3 pmap_getmaps.3 pmap_getport.3 pmap_rmtcall.3 \ - pmap_set.3 pmap_unset.3 regsterrpc.3 rpc_createerr.3 \ - svc_destroy.3 svc_fds.3 svc_fdset.3 svc_getargs.3 \ - svc_getcaller.3 svc_getreg.3 svc_getregset.3 svc_register.3 \ - svc_run.3 svc_sendreply.3 svc_unregister.3 svcerr_auth.3 \ - svcerr_decode.3 svcerr_noproc.3 svcerr_noprog.3 \ - svcerr_progvers.3 svcerr_systemerr.3 svcerr_weakauth.3 \ - svcfd_create.3 svcraw_create.3 svctcp_create.3 \ - svcudp_bufcreate.3 xdr_accepted_reply.3 xdr_authunix_parms.3 \ - xdr_callhdr.3 xdr_callmsg.3 xdr_opaque_auth.3 xdr_pmap.3 \ - xdr_pmaplist.3 xdr_rejected_reply.3 xdr_replymsg.3 \ - xprt_register.3 xprt_unregister.3 ; do \ - $(LN) -f "$(DSTROOT)/usr/share/man/man3/rpc.3" \ - "$(DSTROOT)/usr/share/man/man3/$${LINK}" ; \ - done - @for LINK in xdr_array.3 xdr_bool.3 xdr_bytes.3 xdr_char.3 \ - xdr_destroy.3 xdr_double.3 xdr_enum.3 xdr_float.3 xdr_free.3 \ - xdr_getpos.3 xdr_inline.3 xdr_int.3 xdr_long.3 \ - xdrmem_create.3 xdr_opaque.3 xdr_pointer.3 xdrrec_create.3 \ - xdrrec_endofrecord.3 xdrrec_eof.3 xdrrec_skiprecord.3 \ - xdr_reference.3 xdr_setpos.3 xdr_short.3 xdrstdio_create.3 \ - xdr_string.3 xdr_u_char.3 xdr_u_long.3 xdr_u_short.3 \ - xdr_union.3 xdr_vector.3 xdr_void.3 xdr_wrapstring.3 ; do \ - $(LN) -f "$(DSTROOT)/usr/share/man/man3/xdr.3" \ - "$(DSTROOT)/usr/share/man/man3/$${LINK}" ; \ - done diff --git a/rpc.subproj/clnt_simple.c b/rpc.subproj/clnt_simple.c index e5d2da1..b00bc19 100644 --- a/rpc.subproj/clnt_simple.c +++ b/rpc.subproj/clnt_simple.c @@ -80,6 +80,9 @@ static struct callrpc_private { int callrpc(host, prognum, versnum, procnum, inproc, in, outproc, out) + int prognum; + int versnum; + int procnum; char *host; xdrproc_t inproc, outproc; char *in, *out; @@ -121,10 +124,12 @@ callrpc(host, prognum, versnum, procnum, inproc, in, outproc, out) server_addr.sin_family = AF_INET; server_addr.sin_port = 0; #ifdef __LP64__ - if ((crp->client = clntudp_create(&server_addr, (uint32_t)prognum, (uint32_t)versnum, timeout, &crp->socket)) == NULL) + if ((crp->client = clntudp_create(&server_addr, (uint32_t)prognum, + (uint32_t)versnum, timeout, &crp->socket)) == NULL) return ((int) rpc_createerr.cf_stat); #else - if ((crp->client = clntudp_create(&server_addr, (u_long)prognum, (u_long)versnum, timeout, &crp->socket)) == NULL) + if ((crp->client = clntudp_create(&server_addr, (u_long)prognum, + (u_long)versnum, timeout, &crp->socket)) == NULL) return ((int) rpc_createerr.cf_stat); #endif crp->valid = 1; diff --git a/rpc.subproj/clnt_tcp.c b/rpc.subproj/clnt_tcp.c index 20934f6..4c1ebbb 100644 --- a/rpc.subproj/clnt_tcp.c +++ b/rpc.subproj/clnt_tcp.c @@ -93,7 +93,7 @@ extern int errno; extern int bindresvport(); extern bool_t xdr_opaque_auth(); -__private_extern__ u_short pmap_getport_timeout(struct sockaddr_in *address, uint32_t program, uint32_t version, uint32_t protocol, struct timeval *timeout, struct timeval *totaltimeout); +extern u_short pmap_getport_timeout(struct sockaddr_in *address, uint32_t program, uint32_t version, uint32_t protocol, struct timeval *timeout, struct timeval *totaltimeout); static int readtcp(); static int writetcp(); diff --git a/rpc.subproj/clnt_udp.c b/rpc.subproj/clnt_udp.c index ea76ba1..e7a1e9f 100644 --- a/rpc.subproj/clnt_udp.c +++ b/rpc.subproj/clnt_udp.c @@ -77,7 +77,7 @@ static char *rcsid = "$Id: clnt_udp.c,v 1.4 2002/03/15 22:07:49 majka Exp $"; extern int bindresvport(); extern bool_t xdr_opaque_auth(); -__private_extern__ u_short pmap_getport_timeout(struct sockaddr_in *address, uint32_t program, uint32_t version, uint32_t protocol, struct timeval *timeout, struct timeval *totaltimeout); +extern u_short pmap_getport_timeout(struct sockaddr_in *address, uint32_t program, uint32_t version, uint32_t protocol, struct timeval *timeout, struct timeval *totaltimeout); extern int errno; @@ -135,7 +135,7 @@ struct cu_data { * sendsz and recvsz are the maximum allowable packet sizes that can be * sent and received. */ -__private_extern__ CLIENT * +CLIENT * clntudp_bufcreate_timeout(struct sockaddr_in *raddr, uint32_t program, uint32_t version, int *sockp, uint32_t sendsz, uint32_t recvsz, struct timeval *retry_timeout, struct timeval *total_timeout) { CLIENT *cl; diff --git a/rpc.subproj/getrpcport.c b/rpc.subproj/getrpcport.c index f7c51af..dadcfa4 100644 --- a/rpc.subproj/getrpcport.c +++ b/rpc.subproj/getrpcport.c @@ -70,6 +70,9 @@ static char *rcsid = "$Id: getrpcport.c,v 1.3 2002/02/19 20:36:23 epeyton Exp $" int getrpcport(host, prognum, versnum, proto) char *host; + int prognum; + int versnum; + int proto; { struct sockaddr_in addr; struct hostent *hp; diff --git a/rpc.subproj/pmap_clnt.c b/rpc.subproj/pmap_clnt.c index 9cb337b..5ddfd00 100644 --- a/rpc.subproj/pmap_clnt.c +++ b/rpc.subproj/pmap_clnt.c @@ -76,7 +76,7 @@ static char *rcsid = "$Id: pmap_clnt.c,v 1.5 2004/12/19 22:45:44 zarzycki Exp $" #include "pmap_wakeup.h" -__private_extern__ CLIENT *clntudp_bufcreate_timeout(struct sockaddr_in *raddr, uint32_t program, uint32_t version, int *sockp, uint32_t sendsz, uint32_t recvsz, struct timeval *timeout, struct timeval *totaltimeout); +extern CLIENT *clntudp_bufcreate_timeout(struct sockaddr_in *raddr, uint32_t program, uint32_t version, int *sockp, uint32_t sendsz, uint32_t recvsz, struct timeval *timeout, struct timeval *totaltimeout); static struct timeval set_retry_timeout = { 5, 0 }; static struct timeval set_total_timeout = { 60, 0 }; diff --git a/rpc.subproj/pmap_getport.c b/rpc.subproj/pmap_getport.c index 318df95..fd7e6e3 100644 --- a/rpc.subproj/pmap_getport.c +++ b/rpc.subproj/pmap_getport.c @@ -77,7 +77,7 @@ static struct timeval default_timeout = { 5, 0 }; * Calls the pmap service remotely to do the lookup. * Returns 0 if no map exists. */ -__private_extern__ u_short +u_short pmap_getport_timeout(struct sockaddr_in *address, uint32_t program, uint32_t version, uint32_t protocol, struct timeval *timeout, struct timeval *totaltimeout) { u_short port; diff --git a/util.subproj/Makefile b/util.subproj/Makefile deleted file mode 100644 index ee01d36..0000000 --- a/util.subproj/Makefile +++ /dev/null @@ -1,23 +0,0 @@ -Project = util -ProductType = staticlib -Install_Dir = /scratch -BuildDebug = YES -BuildProfile = YES - -CFILES = hton.c putpwpasswd.c rcmd.c rcmdsh.c -MANPAGES = rcmd.3 hosts.equiv.5 - -Extra_CC_Flags = -Wall -fno-common -I. \ - -I../dns.subproj -I../gen.subproj -I../lookup.subproj \ - -D__DARWIN_NON_CANCELABLE=1 -DINET6=1 - -include $(MAKEFILEPATH)/CoreOS/ReleaseControl/BSDCommon.make - -after_install: - @for LINK in iruserok.3 iruserok_sa.3 rcmd_af.3 rresvport.3 \ - rresvport_af.3 ruserok.3 ; do \ - $(LN) -f "$(DSTROOT)/usr/share/man/man3/rcmd.3" \ - "$(DSTROOT)/usr/share/man/man3/$${LINK}" ; \ - done - $(LN) -f "$(DSTROOT)/usr/share/man/man5//hosts.equiv.5" \ - "$(DSTROOT)/usr/share/man/man5/.rhosts.5" diff --git a/xcodescripts/install_files.sh b/xcodescripts/install_files.sh new file mode 100755 index 0000000..4157e3f --- /dev/null +++ b/xcodescripts/install_files.sh @@ -0,0 +1,248 @@ +# exit immediately on failure +set -e -x + +# check if we're building for the simulator +if [ "${RC_ProjectName%_Sim}" != "${RC_ProjectName}" ] ; then + if [ -d ${DSTROOT}${SDKROOT}/usr/lib/system ] ; then + for lib in ${DSTROOT}${SDKROOT}/usr/lib/system/*.dylib ; do + install_name_tool -id "${lib#${DSTROOT}${SDKROOT}}" "${lib}" + done + fi + + DSTROOT="${DSTROOT}${SDKROOT}" +fi + +function InstallHeaders() { + DESTDIR="$DSTROOT/$1" + shift + install -d -o "$INSTALL_OWNER" -g "$INSTALL_GROUP" -m 0755 "$DESTDIR" + install -o "$INSTALL_OWNER" -g "$INSTALL_GROUP" -m 0444 "$@" "$DESTDIR" +} + +InstallHeaders /usr/include \ + gen.subproj/ifaddrs.h \ + lookup.subproj/aliasdb.h \ + lookup.subproj/bootparams.h \ + lookup.subproj/netdb.h \ + lookup.subproj/printerdb.h \ + membership.subproj/membership.h \ + membership.subproj/ntsid.h + +# lookup.subproj is not installed for the simulator, but its API is provided +# by Interposition_Sim. To be cautious, we only want to provide headers for +# the SPI *used* by other simulator projects. We should work to keep this +# SPI as backwards-compatible as possible and use Interposition_Sim to +# translate where that cannot be achieved. +if [ "${RC_ProjectName%_Sim}" == "${RC_ProjectName}" ] ; then + InstallHeaders /usr/local/include \ + lookup.subproj/ils.h \ + lookup.subproj/kvbuf.h \ + lookup.subproj/libinfo.h \ + lookup.subproj/si_data.h \ + lookup.subproj/si_module.h \ + lookup.subproj/thread_data.h +fi + +InstallHeaders /usr/local/include \ + lookup.subproj/netdb_async.h \ + membership.subproj/membershipPriv.h + +InstallHeaders /usr/include/arpa \ + dns.subproj/inet.h + +InstallHeaders /usr/include/rpc \ + rpc.subproj/auth.h \ + rpc.subproj/auth_unix.h \ + rpc.subproj/clnt.h \ + rpc.subproj/pmap_clnt.h \ + rpc.subproj/pmap_prot.h \ + rpc.subproj/pmap_rmt.h \ + rpc.subproj/rpc.h \ + rpc.subproj/rpc_msg.h \ + rpc.subproj/svc.h \ + rpc.subproj/svc_auth.h \ + rpc.subproj/types.h \ + rpc.subproj/xdr.h + +InstallHeaders /usr/include/rpcsvc \ + nis.subproj/yp_prot.h \ + nis.subproj/ypclnt.h + +# Don't install man pages for installhdrs nor simulator builds +if [ "$ACTION" == "installhdrs" -o \ + "${RC_ProjectName%_Sim}" != "${RC_ProjectName}" ] ; then + exit 0 +fi + +function InstallManPages() { + for MANPAGE in "$@"; do + SECTION=`basename "${MANPAGE/*./}"` + MANDIR="$DSTROOT"/usr/share/man/man"$SECTION" + install -d -o "$INSTALL_OWNER" -g "$INSTALL_GROUP" -m 0755 "$MANDIR" + install -o "$INSTALL_OWNER" -g "$INSTALL_GROUP" -m 0444 "$MANPAGE" "$MANDIR" + done +} + +function LinkManPages() { + MANPAGE=`basename "$1"` + SECTION=`basename "${MANPAGE/*./}"` + MANDIR="$DSTROOT"/usr/share/man/man"$SECTION" + shift + for LINK in "$@"; do + ln -hf "$MANDIR/$MANPAGE" "$MANDIR/$LINK" + done +} + +InstallManPages \ + gen.subproj/getifaddrs.3 \ + gen.subproj/getifmaddrs.3 \ + gen.subproj/gethostbyname.3 \ + gen.subproj/getipnodebyname.3 \ + gen.subproj/getnetent.3 \ + gen.subproj/getprotoent.3 \ + gen.subproj/getservent.3 \ + gen.subproj/if_indextoname.3 \ + gen.subproj/inet6_rth_space.3 \ + gen.subproj/inet6_rthdr_space.3 \ + gen.subproj/inet6_option_space.3 \ + gen.subproj/inet6_opt_init.3 + +InstallManPages \ + lookup.subproj/bootparams.5 \ + lookup.subproj/gai_strerror.3 \ + lookup.subproj/getaddrinfo.3 \ + lookup.subproj/getfsent.3 \ + lookup.subproj/getgrent.3 \ + lookup.subproj/getgrouplist.3 \ + lookup.subproj/getnameinfo.3 \ + lookup.subproj/getnetgrent.3 \ + lookup.subproj/getpwent.3 \ + lookup.subproj/initgroups.3 + +InstallManPages \ + membership.subproj/mbr_check_membership.3 \ + membership.subproj/mbr_uid_to_uuid.3 + +InstallManPages \ + nis.subproj/yp_all.3 \ + nis.subproj/yp_bind.3 \ + nis.subproj/yp_first.3 \ + nis.subproj/yp_get_default_domain.3 \ + nis.subproj/yp_master.3 \ + nis.subproj/yp_match.3 \ + nis.subproj/yp_next.3 \ + nis.subproj/yp_order.3 \ + nis.subproj/yp_unbind.3 \ + nis.subproj/ypclnt.3 \ + nis.subproj/yperr_string.3 \ + nis.subproj/ypprot_err.3 \ + nis.subproj/yp.8 + +InstallManPages \ + rpc.subproj/bindresvport.3 \ + rpc.subproj/getrpcent.3 \ + rpc.subproj/getrpcport.3 \ + rpc.subproj/rpc.3 \ + rpc.subproj/xdr.3 + +InstallManPages \ + util.subproj/rcmd.3 \ + util.subproj/hosts.equiv.5 + +LinkManPages gethostbyname.3 \ + endhostent.3 gethostbyaddr.3 gethostbyname2.3 \ + gethostent.3 herror.3 hstrerror.3 sethostent.3 + +LinkManPages getifaddrs.3 \ + freeifaddrs.3 + +LinkManPages getipnodebyname.3 \ + freehostent.3 getipnodebyaddr.3 + +LinkManPages getnetent.3 \ + endnetent.3 getnetbyaddr.3 getnetbyname.3 setnetent.3 + +LinkManPages getprotoent.3 \ + endprotoent.3 getprotobyname.3 getprotobynumber.3 setprotoent.3 + +LinkManPages getservent.3 \ + endservent.3 getservbyname.3 getservbyport.3 setservent.3 + +LinkManPages if_indextoname.3 \ + if_freenameindex.3 if_nameindex.3 if_nametoindex.3 + +LinkManPages inet6_option_space.3 \ + inet6_option_alloc.3 inet6_option_append.3 \ + inet6_option_find.3 inet6_option_init.3 inet6_option_next.3 + +LinkManPages inet6_rthdr_space.3 \ + inet6_rthdr_add.3 inet6_rthdr_getaddr.3 \ + inet6_rthdr_getflags.3 inet6_rthdr_init.3 \ + inet6_rthdr_lasthop.3 inet6_rthdr_reverse.3 \ + inet6_rthdr_segments.3 + +LinkManPages inet6_opt_init.3 \ + inet6_opt_append.3 inet6_opt_finish.3 inet6_opt_set_val.3 \ + inet6_opt_next.3 inet6_opt_find.3 inet6_opt_get_val.3 + +LinkManPages getaddrinfo.3 \ + freeaddrinfo.3 + +LinkManPages getfsent.3 \ + endfsent.3 getfsfile.3 getfsspec.3 getfstype.3 setfsent.3 + +LinkManPages getgrent.3 \ + endgrent.3 getgrgid.3 getgrgid_r.3 getgrnam.3 \ + getgrnam_r.3 setgrent.3 setgroupent.3 + +LinkManPages getnetgrent.3 \ + endnetgrent.3 innetgr.3 setnetgrent.3 + +LinkManPages getpwent.3 \ + endpwent.3 getpwnam.3 getpwnam_r.3 getpwuid.3 \ + getpwuid_r.3 setpassent.3 setpwent.3 setpwfile.3 + +LinkManPages mbr_uid_to_uuid.3 \ + mbr_gid_to_uuid.3 mbr_sid_to_uuid.3 mbr_uuid_to_id.3 mbr_uuid_to_sid.3 \ + mbr_sid_to_string.3 mbr_string_to_sid.3 + +LinkManPages getrpcent.3 \ + getrpcbyname.3 getrpcbynumber.3 endrpcent.3 setrpcent.3 + +LinkManPages rpc.3 \ + auth_destroy.3 authnone_create.3 authunix_create.3 \ + authunix_create_default.3 callrpc.3 clnt_broadcast.3 \ + clnt_call.3 clnt_control.3 clnt_create.3 clnt_destroy.3 \ + clnt_freeres.3 clnt_geterr.3 clnt_pcreateerror.3 \ + clnt_perrno.3 clnt_perror.3 clnt_spcreateerror.3 \ + clnt_sperrno.3 clnt_sperror.3 clntraw_create.3 \ + clnttcp_create.3 clntudp_bufcreate.3 clntudp_create.3 \ + get_myaddress.3 pmap_getmaps.3 pmap_getport.3 pmap_rmtcall.3 \ + pmap_set.3 pmap_unset.3 regsterrpc.3 rpc_createerr.3 \ + svc_destroy.3 svc_fds.3 svc_fdset.3 svc_getargs.3 \ + svc_getcaller.3 svc_getreg.3 svc_getregset.3 svc_register.3 \ + svc_run.3 svc_sendreply.3 svc_unregister.3 svcerr_auth.3 \ + svcerr_decode.3 svcerr_noproc.3 svcerr_noprog.3 \ + svcerr_progvers.3 svcerr_systemerr.3 svcerr_weakauth.3 \ + svcfd_create.3 svcraw_create.3 svctcp_create.3 \ + svcudp_bufcreate.3 xdr_accepted_reply.3 xdr_authunix_parms.3 \ + xdr_callhdr.3 xdr_callmsg.3 xdr_opaque_auth.3 xdr_pmap.3 \ + xdr_pmaplist.3 xdr_rejected_reply.3 xdr_replymsg.3 \ + xprt_register.3 xprt_unregister.3 + +LinkManPages xdr.3 \ + xdr_array.3 xdr_bool.3 xdr_bytes.3 xdr_char.3 \ + xdr_destroy.3 xdr_double.3 xdr_enum.3 xdr_float.3 xdr_free.3 \ + xdr_getpos.3 xdr_inline.3 xdr_int.3 xdr_long.3 \ + xdrmem_create.3 xdr_opaque.3 xdr_pointer.3 xdrrec_create.3 \ + xdrrec_endofrecord.3 xdrrec_eof.3 xdrrec_skiprecord.3 \ + xdr_reference.3 xdr_setpos.3 xdr_short.3 xdrstdio_create.3 \ + xdr_string.3 xdr_u_char.3 xdr_u_long.3 xdr_u_short.3 \ + xdr_union.3 xdr_vector.3 xdr_void.3 xdr_wrapstring.3 + +LinkManPages rcmd.3 \ + iruserok.3 iruserok_sa.3 rcmd_af.3 rresvport.3 rresvport_af.3 ruserok.3 + +LinkManPages hosts.equiv.5 \ + .rhosts.5 + -- 2.45.2