xref: /titanic_44/usr/src/cmd/cmd-inet/usr.lib/mdnsd/PlatformCommon.c (revision 4b22b9337f359bfd063322244f5336cc7c6ffcfa)
1*4b22b933Srs200217 /* -*- Mode: C; tab-width: 4 -*-
2*4b22b933Srs200217  *
3*4b22b933Srs200217  * Copyright (c) 2004 Apple Computer, Inc. All rights reserved.
4*4b22b933Srs200217  *
5*4b22b933Srs200217  * Licensed under the Apache License, Version 2.0 (the "License");
6*4b22b933Srs200217  * you may not use this file except in compliance with the License.
7*4b22b933Srs200217  * You may obtain a copy of the License at
8*4b22b933Srs200217  *
9*4b22b933Srs200217  *     http://www.apache.org/licenses/LICENSE-2.0
10*4b22b933Srs200217  *
11*4b22b933Srs200217  * Unless required by applicable law or agreed to in writing, software
12*4b22b933Srs200217  * distributed under the License is distributed on an "AS IS" BASIS,
13*4b22b933Srs200217  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*4b22b933Srs200217  * See the License for the specific language governing permissions and
15*4b22b933Srs200217  * limitations under the License.
16*4b22b933Srs200217 
17*4b22b933Srs200217     Change History (most recent first):
18*4b22b933Srs200217 
19*4b22b933Srs200217 $Log: PlatformCommon.c,v $
20*4b22b933Srs200217 Revision 1.7  2006/08/14 23:24:56  cheshire
21*4b22b933Srs200217 Re-licensed mDNSResponder daemon source code under Apache License, Version 2.0
22*4b22b933Srs200217 
23*4b22b933Srs200217 Revision 1.6  2005/04/08 21:30:16  ksekar
24*4b22b933Srs200217 <rdar://problem/4007457> Compiling problems with mDNSResponder-98 on Solaris/Sparc v9
25*4b22b933Srs200217 Patch submitted by Bernd Kuhls
26*4b22b933Srs200217 
27*4b22b933Srs200217 Revision 1.5  2005/02/01 19:33:30  ksekar
28*4b22b933Srs200217 <rdar://problem/3985239> Keychain format too restrictive
29*4b22b933Srs200217 
30*4b22b933Srs200217 Revision 1.4  2005/01/19 19:19:21  ksekar
31*4b22b933Srs200217 <rdar://problem/3960191> Need a way to turn off domain discovery
32*4b22b933Srs200217 
33*4b22b933Srs200217 Revision 1.3  2004/12/13 17:46:52  cheshire
34*4b22b933Srs200217 Use sizeof(buf) instead of fixed constant 1024
35*4b22b933Srs200217 
36*4b22b933Srs200217 Revision 1.2  2004/12/01 03:30:29  cheshire
37*4b22b933Srs200217 <rdar://problem/3889346> Add Unicast DNS support to mDNSPosix
38*4b22b933Srs200217 
39*4b22b933Srs200217 Revision 1.1  2004/12/01 01:51:35  cheshire
40*4b22b933Srs200217 Move ReadDDNSSettingsFromConfFile() from mDNSMacOSX.c to PlatformCommon.c
41*4b22b933Srs200217 
42*4b22b933Srs200217  */
43*4b22b933Srs200217 
44*4b22b933Srs200217 #pragma ident	"%Z%%M%	%I%	%E% SMI"
45*4b22b933Srs200217 
46*4b22b933Srs200217 #include <stdio.h>				// Needed for fopen() etc.
47*4b22b933Srs200217 #include <unistd.h>				// Needed for close()
48*4b22b933Srs200217 #include <string.h>				// Needed for strlen() etc.
49*4b22b933Srs200217 #include <errno.h>			// Needed for errno etc.
50*4b22b933Srs200217 #include <sys/socket.h>			// Needed for socket() etc.
51*4b22b933Srs200217 #include <netinet/in.h>			// Needed for sockaddr_in
52*4b22b933Srs200217 
53*4b22b933Srs200217 #include "mDNSEmbeddedAPI.h"	// Defines the interface provided to the client layer above
54*4b22b933Srs200217 #include "PlatformCommon.h"
55*4b22b933Srs200217 
56*4b22b933Srs200217 #ifdef NOT_HAVE_SOCKLEN_T
57*4b22b933Srs200217     typedef unsigned int socklen_t;
58*4b22b933Srs200217 #endif
59*4b22b933Srs200217 
60*4b22b933Srs200217 // Bind a UDP socket to a global destination to find the default route's interface address
FindDefaultRouteIP(mDNSAddr * a)61*4b22b933Srs200217 mDNSexport void FindDefaultRouteIP(mDNSAddr *a)
62*4b22b933Srs200217 	{
63*4b22b933Srs200217 	struct sockaddr_in addr;
64*4b22b933Srs200217 	socklen_t len = sizeof(addr);
65*4b22b933Srs200217 	int sock = socket(AF_INET,SOCK_DGRAM,0);
66*4b22b933Srs200217 	a->type = mDNSAddrType_None;
67*4b22b933Srs200217 	if (sock == -1) return;
68*4b22b933Srs200217 	addr.sin_family = AF_INET;
69*4b22b933Srs200217 	addr.sin_port = 1;	// Not important, any port and public address will do
70*4b22b933Srs200217 	addr.sin_addr.s_addr = 0x11111111;
71*4b22b933Srs200217 	if ((connect(sock,(const struct sockaddr*)&addr,sizeof(addr))) == -1) { close(sock); return; }
72*4b22b933Srs200217 	if ((getsockname(sock,(struct sockaddr*)&addr, &len)) == -1) { close(sock); return; }
73*4b22b933Srs200217 	close(sock);
74*4b22b933Srs200217 	a->type = mDNSAddrType_IPv4;
75*4b22b933Srs200217 	a->ip.v4.NotAnInteger = addr.sin_addr.s_addr;
76*4b22b933Srs200217 	}
77*4b22b933Srs200217 
78*4b22b933Srs200217 // dst must be at least MAX_ESCAPED_DOMAIN_NAME bytes, and option must be less than 32 bytes in length
GetConfigOption(char * dst,const char * option,FILE * f)79*4b22b933Srs200217 mDNSlocal mDNSBool GetConfigOption(char *dst, const char *option, FILE *f)
80*4b22b933Srs200217 	{
81*4b22b933Srs200217 	char buf[32+1+MAX_ESCAPED_DOMAIN_NAME];	// Option name, one space, option value
82*4b22b933Srs200217 	unsigned int len = strlen(option);
83*4b22b933Srs200217 	if (len + 1 + MAX_ESCAPED_DOMAIN_NAME > sizeof(buf)-1) { LogMsg("GetConfigOption: option %s too long", option); return mDNSfalse; }
84*4b22b933Srs200217 	fseek(f, 0, SEEK_SET);  // set position to beginning of stream
85*4b22b933Srs200217 	while (fgets(buf, sizeof(buf), f))		// Read at most sizeof(buf)-1 bytes from file, and append '\0' C-string terminator
86*4b22b933Srs200217 		{
87*4b22b933Srs200217 		if (!strncmp(buf, option, len))
88*4b22b933Srs200217 			{
89*4b22b933Srs200217 			strncpy(dst, buf + len + 1, MAX_ESCAPED_DOMAIN_NAME-1);
90*4b22b933Srs200217 			if (dst[MAX_ESCAPED_DOMAIN_NAME-1]) dst[MAX_ESCAPED_DOMAIN_NAME-1] = '\0';
91*4b22b933Srs200217 			len = strlen(dst);
92*4b22b933Srs200217 			if (len && dst[len-1] == '\n') dst[len-1] = '\0';  // chop newline
93*4b22b933Srs200217 			return mDNStrue;
94*4b22b933Srs200217 			}
95*4b22b933Srs200217 		}
96*4b22b933Srs200217 	debugf("Option %s not set", option);
97*4b22b933Srs200217 	return mDNSfalse;
98*4b22b933Srs200217 	}
99*4b22b933Srs200217 
ReadDDNSSettingsFromConfFile(mDNS * const m,const char * const filename,domainname * const hostname,domainname * const domain,mDNSBool * DomainDiscoveryDisabled)100*4b22b933Srs200217 mDNSexport void ReadDDNSSettingsFromConfFile(mDNS *const m, const char *const filename, domainname *const hostname, domainname *const domain, mDNSBool *DomainDiscoveryDisabled)
101*4b22b933Srs200217 	{
102*4b22b933Srs200217 	char buf   [MAX_ESCAPED_DOMAIN_NAME];
103*4b22b933Srs200217 	char secret[MAX_ESCAPED_DOMAIN_NAME] = "";
104*4b22b933Srs200217 	mStatus err;
105*4b22b933Srs200217 	FILE *f = fopen(filename, "r");
106*4b22b933Srs200217 
107*4b22b933Srs200217     if (hostname)                 hostname->c[0] = 0;
108*4b22b933Srs200217     if (domain)                   domain->c[0] = 0;
109*4b22b933Srs200217 	if (DomainDiscoveryDisabled) *DomainDiscoveryDisabled = mDNSfalse;
110*4b22b933Srs200217 
111*4b22b933Srs200217 	if (f)
112*4b22b933Srs200217 		{
113*4b22b933Srs200217 		if (DomainDiscoveryDisabled && GetConfigOption(buf, "DomainDiscoveryDisabled", f) && !strcasecmp(buf, "true")) *DomainDiscoveryDisabled = mDNStrue;
114*4b22b933Srs200217 		if (hostname && GetConfigOption(buf, "hostname", f) && !MakeDomainNameFromDNSNameString(hostname, buf)) goto badf;
115*4b22b933Srs200217 		if (domain && GetConfigOption(buf, "zone", f) && !MakeDomainNameFromDNSNameString(domain, buf)) goto badf;
116*4b22b933Srs200217 		GetConfigOption(secret, "secret-64", f);  // failure means no authentication
117*4b22b933Srs200217 		fclose(f);
118*4b22b933Srs200217 		f = NULL;
119*4b22b933Srs200217 		}
120*4b22b933Srs200217 	else
121*4b22b933Srs200217 		{
122*4b22b933Srs200217 		if (errno != ENOENT) LogMsg("ERROR: Config file exists, but cannot be opened.");
123*4b22b933Srs200217 		return;
124*4b22b933Srs200217 		}
125*4b22b933Srs200217 
126*4b22b933Srs200217 	if (domain && domain->c[0] && secret[0])
127*4b22b933Srs200217 		{
128*4b22b933Srs200217 		// for now we assume keyname = service reg domain and we use same key for service and hostname registration
129*4b22b933Srs200217 		err = mDNS_SetSecretForZone(m, domain, domain, secret);
130*4b22b933Srs200217 		if (err) LogMsg("ERROR: mDNS_SetSecretForZone returned %d for domain %##s", err, domain->c);
131*4b22b933Srs200217 		}
132*4b22b933Srs200217 
133*4b22b933Srs200217 	return;
134*4b22b933Srs200217 
135*4b22b933Srs200217 	badf:
136*4b22b933Srs200217 	LogMsg("ERROR: malformatted config file");
137*4b22b933Srs200217 	if (f) fclose(f);
138*4b22b933Srs200217 	}
139