xref: /aosp_15_r20/external/mdnsresponder/mDNSWindows/NSPTool/NSPTool.c (revision 48a54d368dc4fa860885eef7b70b6c53499e7c25)
1*48a54d36SAndroid Build Coastguard Worker /* -*- Mode: C; tab-width: 4 -*-
2*48a54d36SAndroid Build Coastguard Worker  *
3*48a54d36SAndroid Build Coastguard Worker  * Copyright (c) 2003-2004 Apple Computer, Inc. All rights reserved.
4*48a54d36SAndroid Build Coastguard Worker  *
5*48a54d36SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*48a54d36SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*48a54d36SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
8*48a54d36SAndroid Build Coastguard Worker  *
9*48a54d36SAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
10*48a54d36SAndroid Build Coastguard Worker  *
11*48a54d36SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*48a54d36SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*48a54d36SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*48a54d36SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*48a54d36SAndroid Build Coastguard Worker  * limitations under the License.
16*48a54d36SAndroid Build Coastguard Worker  */
17*48a54d36SAndroid Build Coastguard Worker 
18*48a54d36SAndroid Build Coastguard Worker #include	<stdio.h>
19*48a54d36SAndroid Build Coastguard Worker #include	<stdlib.h>
20*48a54d36SAndroid Build Coastguard Worker 
21*48a54d36SAndroid Build Coastguard Worker #include	"CommonServices.h"
22*48a54d36SAndroid Build Coastguard Worker #include	"DebugServices.h"
23*48a54d36SAndroid Build Coastguard Worker 
24*48a54d36SAndroid Build Coastguard Worker #include	<guiddef.h>
25*48a54d36SAndroid Build Coastguard Worker #include	<ws2spi.h>
26*48a54d36SAndroid Build Coastguard Worker 
27*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
28*48a54d36SAndroid Build Coastguard Worker //	Prototypes
29*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
30*48a54d36SAndroid Build Coastguard Worker 
31*48a54d36SAndroid Build Coastguard Worker int  					main( int argc, char *argv[] );
32*48a54d36SAndroid Build Coastguard Worker DEBUG_LOCAL void		Usage( void );
33*48a54d36SAndroid Build Coastguard Worker DEBUG_LOCAL int			ProcessArgs( int argc, char *argv[] );
34*48a54d36SAndroid Build Coastguard Worker DEBUG_LOCAL OSStatus	InstallNSP( const char *inName, const char *inGUID, const char *inPath );
35*48a54d36SAndroid Build Coastguard Worker DEBUG_LOCAL OSStatus	RemoveNSP( const char *inGUID );
36*48a54d36SAndroid Build Coastguard Worker DEBUG_LOCAL OSStatus	EnableNSP( const char *inGUID, BOOL inEnable );
37*48a54d36SAndroid Build Coastguard Worker DEBUG_LOCAL OSStatus	ListNameSpaces( void );
38*48a54d36SAndroid Build Coastguard Worker DEBUG_LOCAL OSStatus	ReorderNameSpaces( void );
39*48a54d36SAndroid Build Coastguard Worker 
40*48a54d36SAndroid Build Coastguard Worker DEBUG_LOCAL WCHAR *		CharToWCharString( const char *inCharString, WCHAR *outWCharString );
41*48a54d36SAndroid Build Coastguard Worker DEBUG_LOCAL char *		GUIDtoString( const GUID *inGUID, char *outString );
42*48a54d36SAndroid Build Coastguard Worker DEBUG_LOCAL OSStatus	StringToGUID( const char *inCharString, GUID *outGUID );
43*48a54d36SAndroid Build Coastguard Worker 
44*48a54d36SAndroid Build Coastguard Worker DEBUG_LOCAL BOOL gToolQuietMode = FALSE;
45*48a54d36SAndroid Build Coastguard Worker 
46*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
47*48a54d36SAndroid Build Coastguard Worker //	main
48*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
49*48a54d36SAndroid Build Coastguard Worker 
main(int argc,char * argv[])50*48a54d36SAndroid Build Coastguard Worker int main( int argc, char *argv[] )
51*48a54d36SAndroid Build Coastguard Worker {
52*48a54d36SAndroid Build Coastguard Worker 	OSStatus		err;
53*48a54d36SAndroid Build Coastguard Worker 
54*48a54d36SAndroid Build Coastguard Worker 	debug_initialize( kDebugOutputTypeMetaConsole );
55*48a54d36SAndroid Build Coastguard Worker 	debug_set_property( kDebugPropertyTagPrintLevel, kDebugLevelVerbose );
56*48a54d36SAndroid Build Coastguard Worker 
57*48a54d36SAndroid Build Coastguard Worker 	err = ProcessArgs( argc, argv );
58*48a54d36SAndroid Build Coastguard Worker 	return( (int) err );
59*48a54d36SAndroid Build Coastguard Worker }
60*48a54d36SAndroid Build Coastguard Worker 
61*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
62*48a54d36SAndroid Build Coastguard Worker //	Usage
63*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
64*48a54d36SAndroid Build Coastguard Worker 
Usage(void)65*48a54d36SAndroid Build Coastguard Worker DEBUG_LOCAL void	Usage( void )
66*48a54d36SAndroid Build Coastguard Worker {
67*48a54d36SAndroid Build Coastguard Worker 	fprintf( stderr, "\n" );
68*48a54d36SAndroid Build Coastguard Worker 	fprintf( stderr, "NSP Tool 1.0d1\n" );
69*48a54d36SAndroid Build Coastguard Worker 	fprintf( stderr, "  Name Space Provider Tool\n" );
70*48a54d36SAndroid Build Coastguard Worker 	fprintf( stderr, "\n" );
71*48a54d36SAndroid Build Coastguard Worker 
72*48a54d36SAndroid Build Coastguard Worker 	fprintf( stderr, "  -install <name> <guid> <path>   - Installs a Name Space Provider\n" );
73*48a54d36SAndroid Build Coastguard Worker 	fprintf( stderr, "\n" );
74*48a54d36SAndroid Build Coastguard Worker 	fprintf( stderr, "      <name> Name of the NSP\n" );
75*48a54d36SAndroid Build Coastguard Worker 	fprintf( stderr, "      <guid> GUID of the NSP\n" );
76*48a54d36SAndroid Build Coastguard Worker 	fprintf( stderr, "      <path> Path to the NSP file\n" );
77*48a54d36SAndroid Build Coastguard Worker 	fprintf( stderr, "\n" );
78*48a54d36SAndroid Build Coastguard Worker 
79*48a54d36SAndroid Build Coastguard Worker 	fprintf( stderr, "  -remove <guid>                  - Removes a Name Space Provider\n" );
80*48a54d36SAndroid Build Coastguard Worker 	fprintf( stderr, "\n" );
81*48a54d36SAndroid Build Coastguard Worker 	fprintf( stderr, "      <guid> GUID of the NSP\n" );
82*48a54d36SAndroid Build Coastguard Worker 	fprintf( stderr, "\n" );
83*48a54d36SAndroid Build Coastguard Worker 
84*48a54d36SAndroid Build Coastguard Worker 	fprintf( stderr, "  -enable/-disable <guid>         - Enables or Disables a Name Space Provider\n" );
85*48a54d36SAndroid Build Coastguard Worker 	fprintf( stderr, "\n" );
86*48a54d36SAndroid Build Coastguard Worker 	fprintf( stderr, "      <guid> GUID of the NSP\n" );
87*48a54d36SAndroid Build Coastguard Worker 	fprintf( stderr, "\n" );
88*48a54d36SAndroid Build Coastguard Worker 
89*48a54d36SAndroid Build Coastguard Worker 	fprintf( stderr, "  -list                           - Lists Name Space Providers\n" );
90*48a54d36SAndroid Build Coastguard Worker 	fprintf( stderr, "  -reorder                        - Reorders Name Space Providers\n" );
91*48a54d36SAndroid Build Coastguard Worker 	fprintf( stderr, "  -q                              - Enable quiet mode\n" );
92*48a54d36SAndroid Build Coastguard Worker 	fprintf( stderr, "  -h[elp]                         - Help\n" );
93*48a54d36SAndroid Build Coastguard Worker 	fprintf( stderr, "\n" );
94*48a54d36SAndroid Build Coastguard Worker }
95*48a54d36SAndroid Build Coastguard Worker 
96*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
97*48a54d36SAndroid Build Coastguard Worker //	ProcessArgs
98*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
99*48a54d36SAndroid Build Coastguard Worker 
ProcessArgs(int argc,char * argv[])100*48a54d36SAndroid Build Coastguard Worker DEBUG_LOCAL int ProcessArgs( int argc, char* argv[] )
101*48a54d36SAndroid Build Coastguard Worker {
102*48a54d36SAndroid Build Coastguard Worker 	OSStatus			err;
103*48a54d36SAndroid Build Coastguard Worker 	int					i;
104*48a54d36SAndroid Build Coastguard Worker 	const char *		name;
105*48a54d36SAndroid Build Coastguard Worker 	const char *		guid;
106*48a54d36SAndroid Build Coastguard Worker 	const char *		path;
107*48a54d36SAndroid Build Coastguard Worker 
108*48a54d36SAndroid Build Coastguard Worker 	if( argc <= 1 )
109*48a54d36SAndroid Build Coastguard Worker 	{
110*48a54d36SAndroid Build Coastguard Worker 		Usage();
111*48a54d36SAndroid Build Coastguard Worker 		err = 0;
112*48a54d36SAndroid Build Coastguard Worker 		goto exit;
113*48a54d36SAndroid Build Coastguard Worker 	}
114*48a54d36SAndroid Build Coastguard Worker 	for( i = 1; i < argc; ++i )
115*48a54d36SAndroid Build Coastguard Worker 	{
116*48a54d36SAndroid Build Coastguard Worker 		if( strcmp( argv[ i ], "-install" ) == 0 )
117*48a54d36SAndroid Build Coastguard Worker 		{
118*48a54d36SAndroid Build Coastguard Worker 			// Install
119*48a54d36SAndroid Build Coastguard Worker 
120*48a54d36SAndroid Build Coastguard Worker 			if( argc <= ( i + 3 ) )
121*48a54d36SAndroid Build Coastguard Worker 			{
122*48a54d36SAndroid Build Coastguard Worker 				fprintf( stderr, "\n### ERROR: missing arguments for %s\n\n", argv[ i ] );
123*48a54d36SAndroid Build Coastguard Worker 				Usage();
124*48a54d36SAndroid Build Coastguard Worker 				err = kParamErr;
125*48a54d36SAndroid Build Coastguard Worker 				goto exit;
126*48a54d36SAndroid Build Coastguard Worker 			}
127*48a54d36SAndroid Build Coastguard Worker 			name = argv[ ++i ];
128*48a54d36SAndroid Build Coastguard Worker 			guid = argv[ ++i ];
129*48a54d36SAndroid Build Coastguard Worker 			path = argv[ ++i ];
130*48a54d36SAndroid Build Coastguard Worker 
131*48a54d36SAndroid Build Coastguard Worker 			if( *name == '\0' )
132*48a54d36SAndroid Build Coastguard Worker 			{
133*48a54d36SAndroid Build Coastguard Worker 				name = "DotLocalNSP";
134*48a54d36SAndroid Build Coastguard Worker 			}
135*48a54d36SAndroid Build Coastguard Worker 			if( *guid == '\0' )
136*48a54d36SAndroid Build Coastguard Worker 			{
137*48a54d36SAndroid Build Coastguard Worker 				guid = "B600E6E9-553B-4a19-8696-335E5C896153";
138*48a54d36SAndroid Build Coastguard Worker 			}
139*48a54d36SAndroid Build Coastguard Worker 
140*48a54d36SAndroid Build Coastguard Worker 			err = InstallNSP( name, guid, path );
141*48a54d36SAndroid Build Coastguard Worker 			require_noerr( err, exit );
142*48a54d36SAndroid Build Coastguard Worker 		}
143*48a54d36SAndroid Build Coastguard Worker 		else if( strcmp( argv[ i ], "-remove" ) == 0 )
144*48a54d36SAndroid Build Coastguard Worker 		{
145*48a54d36SAndroid Build Coastguard Worker 			// Remove
146*48a54d36SAndroid Build Coastguard Worker 
147*48a54d36SAndroid Build Coastguard Worker 			if( argc <= ( i + 1 ) )
148*48a54d36SAndroid Build Coastguard Worker 			{
149*48a54d36SAndroid Build Coastguard Worker 				fprintf( stderr, "\n### ERROR: missing arguments for %s\n\n", argv[ i ] );
150*48a54d36SAndroid Build Coastguard Worker 				Usage();
151*48a54d36SAndroid Build Coastguard Worker 				err = kParamErr;
152*48a54d36SAndroid Build Coastguard Worker 				goto exit;
153*48a54d36SAndroid Build Coastguard Worker 			}
154*48a54d36SAndroid Build Coastguard Worker 			guid = argv[ ++i ];
155*48a54d36SAndroid Build Coastguard Worker 			if( *guid == '\0' )
156*48a54d36SAndroid Build Coastguard Worker 			{
157*48a54d36SAndroid Build Coastguard Worker 				guid = "B600E6E9-553B-4a19-8696-335E5C896153";
158*48a54d36SAndroid Build Coastguard Worker 			}
159*48a54d36SAndroid Build Coastguard Worker 
160*48a54d36SAndroid Build Coastguard Worker 			err = RemoveNSP( guid );
161*48a54d36SAndroid Build Coastguard Worker 			require_noerr( err, exit );
162*48a54d36SAndroid Build Coastguard Worker 		}
163*48a54d36SAndroid Build Coastguard Worker 		else if( ( strcmp( argv[ i ], "-enable" )  == 0 ) ||
164*48a54d36SAndroid Build Coastguard Worker 				 ( strcmp( argv[ i ], "-disable" ) == 0 ) )
165*48a54d36SAndroid Build Coastguard Worker 		{
166*48a54d36SAndroid Build Coastguard Worker 			BOOL		enable;
167*48a54d36SAndroid Build Coastguard Worker 
168*48a54d36SAndroid Build Coastguard Worker 			// Enable/Disable
169*48a54d36SAndroid Build Coastguard Worker 
170*48a54d36SAndroid Build Coastguard Worker 			enable = ( strcmp( argv[ i ], "-enable" ) == 0 );
171*48a54d36SAndroid Build Coastguard Worker 			if( argc <= ( i + 1 ) )
172*48a54d36SAndroid Build Coastguard Worker 			{
173*48a54d36SAndroid Build Coastguard Worker 				fprintf( stderr, "\n### ERROR: missing arguments for %s\n\n", argv[ i ] );
174*48a54d36SAndroid Build Coastguard Worker 				Usage();
175*48a54d36SAndroid Build Coastguard Worker 				err = kParamErr;
176*48a54d36SAndroid Build Coastguard Worker 				goto exit;
177*48a54d36SAndroid Build Coastguard Worker 			}
178*48a54d36SAndroid Build Coastguard Worker 			guid = argv[ ++i ];
179*48a54d36SAndroid Build Coastguard Worker 
180*48a54d36SAndroid Build Coastguard Worker 			err = EnableNSP( guid, enable );
181*48a54d36SAndroid Build Coastguard Worker 			require_noerr( err, exit );
182*48a54d36SAndroid Build Coastguard Worker 		}
183*48a54d36SAndroid Build Coastguard Worker 		else if( strcmp( argv[ i ], "-list" ) == 0 )
184*48a54d36SAndroid Build Coastguard Worker 		{
185*48a54d36SAndroid Build Coastguard Worker 			// List
186*48a54d36SAndroid Build Coastguard Worker 
187*48a54d36SAndroid Build Coastguard Worker 			err = ListNameSpaces();
188*48a54d36SAndroid Build Coastguard Worker 			require_noerr( err, exit );
189*48a54d36SAndroid Build Coastguard Worker 		}
190*48a54d36SAndroid Build Coastguard Worker 		else if( strcmp( argv[ i ], "-reorder" ) == 0 )
191*48a54d36SAndroid Build Coastguard Worker 		{
192*48a54d36SAndroid Build Coastguard Worker 			// Reorder
193*48a54d36SAndroid Build Coastguard Worker 
194*48a54d36SAndroid Build Coastguard Worker 			err = ReorderNameSpaces();
195*48a54d36SAndroid Build Coastguard Worker 			require_noerr( err, exit );
196*48a54d36SAndroid Build Coastguard Worker 		}
197*48a54d36SAndroid Build Coastguard Worker 		else if( strcmp( argv[ i ], "-q" ) == 0 )
198*48a54d36SAndroid Build Coastguard Worker 		{
199*48a54d36SAndroid Build Coastguard Worker 			gToolQuietMode = TRUE;
200*48a54d36SAndroid Build Coastguard Worker 		}
201*48a54d36SAndroid Build Coastguard Worker 		else if( ( strcmp( argv[ i ], "-help" ) == 0 ) ||
202*48a54d36SAndroid Build Coastguard Worker 				 ( strcmp( argv[ i ], "-h" ) == 0 ) )
203*48a54d36SAndroid Build Coastguard Worker 		{
204*48a54d36SAndroid Build Coastguard Worker 			// Help
205*48a54d36SAndroid Build Coastguard Worker 
206*48a54d36SAndroid Build Coastguard Worker 			Usage();
207*48a54d36SAndroid Build Coastguard Worker 			err = 0;
208*48a54d36SAndroid Build Coastguard Worker 			goto exit;
209*48a54d36SAndroid Build Coastguard Worker 		}
210*48a54d36SAndroid Build Coastguard Worker 		else
211*48a54d36SAndroid Build Coastguard Worker 		{
212*48a54d36SAndroid Build Coastguard Worker 			fprintf( stderr, "\n### ERROR: unknown argment: \"%s\"\n\n", argv[ i ] );
213*48a54d36SAndroid Build Coastguard Worker 			Usage();
214*48a54d36SAndroid Build Coastguard Worker 			err = kParamErr;
215*48a54d36SAndroid Build Coastguard Worker 			goto exit;
216*48a54d36SAndroid Build Coastguard Worker 		}
217*48a54d36SAndroid Build Coastguard Worker 	}
218*48a54d36SAndroid Build Coastguard Worker 	err = kNoErr;
219*48a54d36SAndroid Build Coastguard Worker 
220*48a54d36SAndroid Build Coastguard Worker exit:
221*48a54d36SAndroid Build Coastguard Worker 	return( err );
222*48a54d36SAndroid Build Coastguard Worker }
223*48a54d36SAndroid Build Coastguard Worker 
224*48a54d36SAndroid Build Coastguard Worker #if 0
225*48a54d36SAndroid Build Coastguard Worker #pragma mark -
226*48a54d36SAndroid Build Coastguard Worker #endif
227*48a54d36SAndroid Build Coastguard Worker 
228*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
229*48a54d36SAndroid Build Coastguard Worker //	InstallNSP
230*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
231*48a54d36SAndroid Build Coastguard Worker 
InstallNSP(const char * inName,const char * inGUID,const char * inPath)232*48a54d36SAndroid Build Coastguard Worker OSStatus	InstallNSP( const char *inName, const char *inGUID, const char *inPath )
233*48a54d36SAndroid Build Coastguard Worker {
234*48a54d36SAndroid Build Coastguard Worker 	OSStatus		err;
235*48a54d36SAndroid Build Coastguard Worker 	size_t			size;
236*48a54d36SAndroid Build Coastguard Worker 	WSADATA			wsd;
237*48a54d36SAndroid Build Coastguard Worker 	WCHAR			name[ 256 ];
238*48a54d36SAndroid Build Coastguard Worker 	GUID			guid;
239*48a54d36SAndroid Build Coastguard Worker 	WCHAR			path[ MAX_PATH ];
240*48a54d36SAndroid Build Coastguard Worker 
241*48a54d36SAndroid Build Coastguard Worker 	require_action( inName && ( *inName != '\0' ), exit, err = kParamErr );
242*48a54d36SAndroid Build Coastguard Worker 	require_action( inGUID && ( *inGUID != '\0' ), exit, err = kParamErr );
243*48a54d36SAndroid Build Coastguard Worker 	require_action( inPath && ( *inPath != '\0' ), exit, err = kParamErr );
244*48a54d36SAndroid Build Coastguard Worker 
245*48a54d36SAndroid Build Coastguard Worker 	size = strlen( inName );
246*48a54d36SAndroid Build Coastguard Worker 	require_action( size < sizeof_array( name ), exit, err = kSizeErr );
247*48a54d36SAndroid Build Coastguard Worker 	CharToWCharString( inName, name );
248*48a54d36SAndroid Build Coastguard Worker 
249*48a54d36SAndroid Build Coastguard Worker 	err = StringToGUID( inGUID, &guid );
250*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
251*48a54d36SAndroid Build Coastguard Worker 
252*48a54d36SAndroid Build Coastguard Worker 	size = strlen( inPath );
253*48a54d36SAndroid Build Coastguard Worker 	require_action( size < sizeof_array( path ), exit, err = kSizeErr );
254*48a54d36SAndroid Build Coastguard Worker 	CharToWCharString( inPath, path );
255*48a54d36SAndroid Build Coastguard Worker 
256*48a54d36SAndroid Build Coastguard Worker 	err = WSAStartup( MAKEWORD( 2, 2 ), &wsd );
257*48a54d36SAndroid Build Coastguard Worker 	err = translate_errno( err == 0, errno_compat(), WSAEINVAL );
258*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
259*48a54d36SAndroid Build Coastguard Worker 
260*48a54d36SAndroid Build Coastguard Worker 	err = WSCInstallNameSpace( name, path, NS_DNS, 1, &guid );
261*48a54d36SAndroid Build Coastguard Worker 	err = translate_errno( err == 0, errno_compat(), WSAEINVAL );
262*48a54d36SAndroid Build Coastguard Worker 	WSACleanup();
263*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
264*48a54d36SAndroid Build Coastguard Worker 
265*48a54d36SAndroid Build Coastguard Worker 	if (!gToolQuietMode)
266*48a54d36SAndroid Build Coastguard Worker 	{
267*48a54d36SAndroid Build Coastguard Worker 		fprintf( stderr, "Installed NSP \"%s\" (%s) at %s\n", inName, inGUID, inPath );
268*48a54d36SAndroid Build Coastguard Worker 	}
269*48a54d36SAndroid Build Coastguard Worker 
270*48a54d36SAndroid Build Coastguard Worker exit:
271*48a54d36SAndroid Build Coastguard Worker 	if( err != kNoErr )
272*48a54d36SAndroid Build Coastguard Worker 	{
273*48a54d36SAndroid Build Coastguard Worker 		fprintf( stderr, "### FAILED (%d) to install \"%s\" (%s) Name Space Provider at %s\n", err, inName, inGUID, inPath );
274*48a54d36SAndroid Build Coastguard Worker 	}
275*48a54d36SAndroid Build Coastguard Worker 	return( err );
276*48a54d36SAndroid Build Coastguard Worker }
277*48a54d36SAndroid Build Coastguard Worker 
278*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
279*48a54d36SAndroid Build Coastguard Worker //	RemoveNSP
280*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
281*48a54d36SAndroid Build Coastguard Worker 
RemoveNSP(const char * inGUID)282*48a54d36SAndroid Build Coastguard Worker DEBUG_LOCAL OSStatus	RemoveNSP( const char *inGUID )
283*48a54d36SAndroid Build Coastguard Worker {
284*48a54d36SAndroid Build Coastguard Worker 	OSStatus		err;
285*48a54d36SAndroid Build Coastguard Worker 	WSADATA			wsd;
286*48a54d36SAndroid Build Coastguard Worker 	GUID			guid;
287*48a54d36SAndroid Build Coastguard Worker 
288*48a54d36SAndroid Build Coastguard Worker 	require_action( inGUID && ( *inGUID != '\0' ), exit, err = kParamErr );
289*48a54d36SAndroid Build Coastguard Worker 
290*48a54d36SAndroid Build Coastguard Worker 	err = StringToGUID( inGUID, &guid );
291*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
292*48a54d36SAndroid Build Coastguard Worker 
293*48a54d36SAndroid Build Coastguard Worker 	err = WSAStartup( MAKEWORD( 2, 2 ), &wsd );
294*48a54d36SAndroid Build Coastguard Worker 	err = translate_errno( err == 0, errno_compat(), WSAEINVAL );
295*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
296*48a54d36SAndroid Build Coastguard Worker 
297*48a54d36SAndroid Build Coastguard Worker 	err = WSCUnInstallNameSpace( &guid );
298*48a54d36SAndroid Build Coastguard Worker 	err = translate_errno( err == 0, errno_compat(), WSAEINVAL );
299*48a54d36SAndroid Build Coastguard Worker 	WSACleanup();
300*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
301*48a54d36SAndroid Build Coastguard Worker 
302*48a54d36SAndroid Build Coastguard Worker 	if (!gToolQuietMode)
303*48a54d36SAndroid Build Coastguard Worker 	{
304*48a54d36SAndroid Build Coastguard Worker 		fprintf( stderr, "Removed NSP %s\n", inGUID );
305*48a54d36SAndroid Build Coastguard Worker 	}
306*48a54d36SAndroid Build Coastguard Worker 
307*48a54d36SAndroid Build Coastguard Worker exit:
308*48a54d36SAndroid Build Coastguard Worker 	if( err != kNoErr )
309*48a54d36SAndroid Build Coastguard Worker 	{
310*48a54d36SAndroid Build Coastguard Worker 		fprintf( stderr, "### FAILED (%d) to remove %s Name Space Provider\n", err, inGUID );
311*48a54d36SAndroid Build Coastguard Worker 	}
312*48a54d36SAndroid Build Coastguard Worker 	return( err );
313*48a54d36SAndroid Build Coastguard Worker }
314*48a54d36SAndroid Build Coastguard Worker 
315*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
316*48a54d36SAndroid Build Coastguard Worker //	EnableNSP
317*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
318*48a54d36SAndroid Build Coastguard Worker 
EnableNSP(const char * inGUID,BOOL inEnable)319*48a54d36SAndroid Build Coastguard Worker DEBUG_LOCAL OSStatus	EnableNSP( const char *inGUID, BOOL inEnable )
320*48a54d36SAndroid Build Coastguard Worker {
321*48a54d36SAndroid Build Coastguard Worker 	OSStatus		err;
322*48a54d36SAndroid Build Coastguard Worker 	WSADATA			wsd;
323*48a54d36SAndroid Build Coastguard Worker 	GUID			guid;
324*48a54d36SAndroid Build Coastguard Worker 
325*48a54d36SAndroid Build Coastguard Worker 	require_action( inGUID && ( *inGUID != '\0' ), exit, err = kParamErr );
326*48a54d36SAndroid Build Coastguard Worker 
327*48a54d36SAndroid Build Coastguard Worker 	err = StringToGUID( inGUID, &guid );
328*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
329*48a54d36SAndroid Build Coastguard Worker 
330*48a54d36SAndroid Build Coastguard Worker 	err = WSAStartup( MAKEWORD( 2, 2 ), &wsd );
331*48a54d36SAndroid Build Coastguard Worker 	err = translate_errno( err == 0, errno_compat(), WSAEINVAL );
332*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
333*48a54d36SAndroid Build Coastguard Worker 
334*48a54d36SAndroid Build Coastguard Worker 	err = WSCEnableNSProvider( &guid, inEnable );
335*48a54d36SAndroid Build Coastguard Worker 	err = translate_errno( err == 0, errno_compat(), WSAEINVAL );
336*48a54d36SAndroid Build Coastguard Worker 	WSACleanup();
337*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
338*48a54d36SAndroid Build Coastguard Worker 
339*48a54d36SAndroid Build Coastguard Worker 	if (!gToolQuietMode)
340*48a54d36SAndroid Build Coastguard Worker 	{
341*48a54d36SAndroid Build Coastguard Worker 		fprintf( stderr, "Removed NSP %s\n", inGUID );
342*48a54d36SAndroid Build Coastguard Worker 	}
343*48a54d36SAndroid Build Coastguard Worker 
344*48a54d36SAndroid Build Coastguard Worker exit:
345*48a54d36SAndroid Build Coastguard Worker 	if( err != kNoErr )
346*48a54d36SAndroid Build Coastguard Worker 	{
347*48a54d36SAndroid Build Coastguard Worker 		fprintf( stderr, "### FAILED (%d) to remove %s Name Space Provider\n", err, inGUID );
348*48a54d36SAndroid Build Coastguard Worker 	}
349*48a54d36SAndroid Build Coastguard Worker 	return( err );
350*48a54d36SAndroid Build Coastguard Worker }
351*48a54d36SAndroid Build Coastguard Worker 
352*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
353*48a54d36SAndroid Build Coastguard Worker //	ListNameSpaces
354*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
355*48a54d36SAndroid Build Coastguard Worker 
ListNameSpaces(void)356*48a54d36SAndroid Build Coastguard Worker DEBUG_LOCAL OSStatus	ListNameSpaces( void )
357*48a54d36SAndroid Build Coastguard Worker {
358*48a54d36SAndroid Build Coastguard Worker 	OSStatus				err;
359*48a54d36SAndroid Build Coastguard Worker 	WSADATA					wsd;
360*48a54d36SAndroid Build Coastguard Worker 	bool					started;
361*48a54d36SAndroid Build Coastguard Worker 	int						n;
362*48a54d36SAndroid Build Coastguard Worker 	int						i;
363*48a54d36SAndroid Build Coastguard Worker 	DWORD					size;
364*48a54d36SAndroid Build Coastguard Worker 	WSANAMESPACE_INFO *		array;
365*48a54d36SAndroid Build Coastguard Worker 	char					s[ 256 ];
366*48a54d36SAndroid Build Coastguard Worker 
367*48a54d36SAndroid Build Coastguard Worker 	array 	= NULL;
368*48a54d36SAndroid Build Coastguard Worker 	started	= false;
369*48a54d36SAndroid Build Coastguard Worker 
370*48a54d36SAndroid Build Coastguard Worker 	err = WSAStartup( MAKEWORD( 2, 2 ), &wsd );
371*48a54d36SAndroid Build Coastguard Worker 	err = translate_errno( err == 0, errno_compat(), WSAEINVAL );
372*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
373*48a54d36SAndroid Build Coastguard Worker 	started = true;
374*48a54d36SAndroid Build Coastguard Worker 
375*48a54d36SAndroid Build Coastguard Worker 	// Build an array of all the NSPs. Call it first with NULL to get the size, allocate a buffer, then get them into it.
376*48a54d36SAndroid Build Coastguard Worker 
377*48a54d36SAndroid Build Coastguard Worker 	size = 0;
378*48a54d36SAndroid Build Coastguard Worker 	n = WSAEnumNameSpaceProviders( &size, NULL );
379*48a54d36SAndroid Build Coastguard Worker 	err = translate_errno( n != SOCKET_ERROR, (OSStatus) GetLastError(), kUnknownErr );
380*48a54d36SAndroid Build Coastguard Worker 	require_action( err == WSAEFAULT, exit, err = kUnknownErr );
381*48a54d36SAndroid Build Coastguard Worker 
382*48a54d36SAndroid Build Coastguard Worker 	array = (WSANAMESPACE_INFO *) malloc( size );
383*48a54d36SAndroid Build Coastguard Worker 	require_action( array, exit, err = kNoMemoryErr );
384*48a54d36SAndroid Build Coastguard Worker 
385*48a54d36SAndroid Build Coastguard Worker 	n = WSAEnumNameSpaceProviders( &size, array );
386*48a54d36SAndroid Build Coastguard Worker 	err = translate_errno( n != SOCKET_ERROR, (OSStatus) GetLastError(), kUnknownErr );
387*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
388*48a54d36SAndroid Build Coastguard Worker 
389*48a54d36SAndroid Build Coastguard Worker 	fprintf( stdout, "\n" );
390*48a54d36SAndroid Build Coastguard Worker 	for( i = 0; i < n; ++i )
391*48a54d36SAndroid Build Coastguard Worker 	{
392*48a54d36SAndroid Build Coastguard Worker 		fprintf( stdout, "Name Space %d\n", i + 1 );
393*48a54d36SAndroid Build Coastguard Worker 		fprintf( stdout, "    NSProviderId:   %s\n", GUIDtoString( &array[ i ].NSProviderId, s ) );
394*48a54d36SAndroid Build Coastguard Worker 		fprintf( stdout, "    dwNameSpace:    %d\n", array[ i ].dwNameSpace );
395*48a54d36SAndroid Build Coastguard Worker 		fprintf( stdout, "    fActive:        %s\n", array[ i ].fActive ? "YES" : "NO" );
396*48a54d36SAndroid Build Coastguard Worker 		fprintf( stdout, "    dwVersion:      %d\n", array[ i ].dwVersion );
397*48a54d36SAndroid Build Coastguard Worker 		fprintf( stdout, "    lpszIdentifier: \"%s\"\n", array[ i ].lpszIdentifier );
398*48a54d36SAndroid Build Coastguard Worker 		fprintf( stdout, "\n" );
399*48a54d36SAndroid Build Coastguard Worker 	}
400*48a54d36SAndroid Build Coastguard Worker 	err = kNoErr;
401*48a54d36SAndroid Build Coastguard Worker 
402*48a54d36SAndroid Build Coastguard Worker exit:
403*48a54d36SAndroid Build Coastguard Worker 	if( array )
404*48a54d36SAndroid Build Coastguard Worker 	{
405*48a54d36SAndroid Build Coastguard Worker 		free( array );
406*48a54d36SAndroid Build Coastguard Worker 	}
407*48a54d36SAndroid Build Coastguard Worker 	if( started )
408*48a54d36SAndroid Build Coastguard Worker 	{
409*48a54d36SAndroid Build Coastguard Worker 		WSACleanup();
410*48a54d36SAndroid Build Coastguard Worker 	}
411*48a54d36SAndroid Build Coastguard Worker 	if( err != kNoErr )
412*48a54d36SAndroid Build Coastguard Worker 	{
413*48a54d36SAndroid Build Coastguard Worker 		fprintf( stderr, "### FAILED (%d) to list Name Space Providers\n", err );
414*48a54d36SAndroid Build Coastguard Worker 	}
415*48a54d36SAndroid Build Coastguard Worker 	return( err );
416*48a54d36SAndroid Build Coastguard Worker }
417*48a54d36SAndroid Build Coastguard Worker 
418*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
419*48a54d36SAndroid Build Coastguard Worker //	ReorderNameSpaces
420*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
421*48a54d36SAndroid Build Coastguard Worker 
ReorderNameSpaces(void)422*48a54d36SAndroid Build Coastguard Worker DEBUG_LOCAL OSStatus	ReorderNameSpaces( void )
423*48a54d36SAndroid Build Coastguard Worker {
424*48a54d36SAndroid Build Coastguard Worker 	OSStatus				err;
425*48a54d36SAndroid Build Coastguard Worker 	WSADATA					wsd;
426*48a54d36SAndroid Build Coastguard Worker 	bool					started;
427*48a54d36SAndroid Build Coastguard Worker 	int						n;
428*48a54d36SAndroid Build Coastguard Worker 	int						i;
429*48a54d36SAndroid Build Coastguard Worker 	DWORD					size;
430*48a54d36SAndroid Build Coastguard Worker 	WSANAMESPACE_INFO *		array;
431*48a54d36SAndroid Build Coastguard Worker 	WCHAR					name[ 256 ];
432*48a54d36SAndroid Build Coastguard Worker 	WCHAR					path[ MAX_PATH ];
433*48a54d36SAndroid Build Coastguard Worker 
434*48a54d36SAndroid Build Coastguard Worker 	array 	= NULL;
435*48a54d36SAndroid Build Coastguard Worker 	started	= false;
436*48a54d36SAndroid Build Coastguard Worker 
437*48a54d36SAndroid Build Coastguard Worker 	err = WSAStartup( MAKEWORD( 2, 2 ), &wsd );
438*48a54d36SAndroid Build Coastguard Worker 	err = translate_errno( err == 0, errno_compat(), WSAEINVAL );
439*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
440*48a54d36SAndroid Build Coastguard Worker 	started = true;
441*48a54d36SAndroid Build Coastguard Worker 
442*48a54d36SAndroid Build Coastguard Worker 	// Build an array of all the NSPs. Call it first with NULL to get the size, allocate a buffer, then get them into it.
443*48a54d36SAndroid Build Coastguard Worker 
444*48a54d36SAndroid Build Coastguard Worker 	size = 0;
445*48a54d36SAndroid Build Coastguard Worker 	n = WSAEnumNameSpaceProviders( &size, NULL );
446*48a54d36SAndroid Build Coastguard Worker 	err = translate_errno( n != SOCKET_ERROR, (OSStatus) GetLastError(), kUnknownErr );
447*48a54d36SAndroid Build Coastguard Worker 	require_action( err == WSAEFAULT, exit, err = kUnknownErr );
448*48a54d36SAndroid Build Coastguard Worker 
449*48a54d36SAndroid Build Coastguard Worker 	array = (WSANAMESPACE_INFO *) malloc( size );
450*48a54d36SAndroid Build Coastguard Worker 	require_action( array, exit, err = kNoMemoryErr );
451*48a54d36SAndroid Build Coastguard Worker 
452*48a54d36SAndroid Build Coastguard Worker 	n = WSAEnumNameSpaceProviders( &size, array );
453*48a54d36SAndroid Build Coastguard Worker 	err = translate_errno( n != SOCKET_ERROR, (OSStatus) GetLastError(), kUnknownErr );
454*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
455*48a54d36SAndroid Build Coastguard Worker 
456*48a54d36SAndroid Build Coastguard Worker 	// Find the "Tcpip" NSP.
457*48a54d36SAndroid Build Coastguard Worker 
458*48a54d36SAndroid Build Coastguard Worker 	for( i = 0; i < n; ++i )
459*48a54d36SAndroid Build Coastguard Worker 	{
460*48a54d36SAndroid Build Coastguard Worker 		if( strcmp( array[ i ].lpszIdentifier, "Tcpip" ) == 0 )
461*48a54d36SAndroid Build Coastguard Worker 		{
462*48a54d36SAndroid Build Coastguard Worker 			break;
463*48a54d36SAndroid Build Coastguard Worker 		}
464*48a54d36SAndroid Build Coastguard Worker 	}
465*48a54d36SAndroid Build Coastguard Worker 	require_action( i < n, exit, err = kNotFoundErr );
466*48a54d36SAndroid Build Coastguard Worker 
467*48a54d36SAndroid Build Coastguard Worker 	// Uninstall it then re-install it to move it to the end.
468*48a54d36SAndroid Build Coastguard Worker 
469*48a54d36SAndroid Build Coastguard Worker 	size = (DWORD) strlen( array[ i ].lpszIdentifier );
470*48a54d36SAndroid Build Coastguard Worker 	require_action( size < sizeof_array( name ), exit, err = kSizeErr );
471*48a54d36SAndroid Build Coastguard Worker 	CharToWCharString( array[ i ].lpszIdentifier, name );
472*48a54d36SAndroid Build Coastguard Worker 
473*48a54d36SAndroid Build Coastguard Worker 	size = (DWORD) strlen( "%SystemRoot%\\System32\\mswsock.dll" );
474*48a54d36SAndroid Build Coastguard Worker 	require_action( size < sizeof_array( path ), exit, err = kSizeErr );
475*48a54d36SAndroid Build Coastguard Worker 	CharToWCharString( "%SystemRoot%\\System32\\mswsock.dll", path );
476*48a54d36SAndroid Build Coastguard Worker 
477*48a54d36SAndroid Build Coastguard Worker 	err = WSCUnInstallNameSpace( &array[ i ].NSProviderId );
478*48a54d36SAndroid Build Coastguard Worker 	err = translate_errno( err == 0, errno_compat(), WSAEINVAL );
479*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
480*48a54d36SAndroid Build Coastguard Worker 
481*48a54d36SAndroid Build Coastguard Worker 	err = WSCInstallNameSpace( name, path, NS_DNS, array[ i ].dwVersion, &array[ i ].NSProviderId );
482*48a54d36SAndroid Build Coastguard Worker 	err = translate_errno( err == 0, errno_compat(), WSAEINVAL );
483*48a54d36SAndroid Build Coastguard Worker 	require_noerr( err, exit );
484*48a54d36SAndroid Build Coastguard Worker 
485*48a54d36SAndroid Build Coastguard Worker 	// Success!
486*48a54d36SAndroid Build Coastguard Worker 
487*48a54d36SAndroid Build Coastguard Worker 	fprintf( stderr, "Reordered \"Tcpip\" NSP to to the bottom of the NSP chain\n" );
488*48a54d36SAndroid Build Coastguard Worker 	err = kNoErr;
489*48a54d36SAndroid Build Coastguard Worker 
490*48a54d36SAndroid Build Coastguard Worker exit:
491*48a54d36SAndroid Build Coastguard Worker 	if( array )
492*48a54d36SAndroid Build Coastguard Worker 	{
493*48a54d36SAndroid Build Coastguard Worker 		free( array );
494*48a54d36SAndroid Build Coastguard Worker 	}
495*48a54d36SAndroid Build Coastguard Worker 	if( started )
496*48a54d36SAndroid Build Coastguard Worker 	{
497*48a54d36SAndroid Build Coastguard Worker 		WSACleanup();
498*48a54d36SAndroid Build Coastguard Worker 	}
499*48a54d36SAndroid Build Coastguard Worker 	if( err != kNoErr )
500*48a54d36SAndroid Build Coastguard Worker 	{
501*48a54d36SAndroid Build Coastguard Worker 		fprintf( stderr, "### FAILED (%d) to reorder Name Space Providers\n", err );
502*48a54d36SAndroid Build Coastguard Worker 	}
503*48a54d36SAndroid Build Coastguard Worker 	return( err );
504*48a54d36SAndroid Build Coastguard Worker }
505*48a54d36SAndroid Build Coastguard Worker 
506*48a54d36SAndroid Build Coastguard Worker #if 0
507*48a54d36SAndroid Build Coastguard Worker #pragma mark -
508*48a54d36SAndroid Build Coastguard Worker #endif
509*48a54d36SAndroid Build Coastguard Worker 
510*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
511*48a54d36SAndroid Build Coastguard Worker //	CharToWCharString
512*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
513*48a54d36SAndroid Build Coastguard Worker 
CharToWCharString(const char * inCharString,WCHAR * outWCharString)514*48a54d36SAndroid Build Coastguard Worker DEBUG_LOCAL WCHAR *	CharToWCharString( const char *inCharString, WCHAR *outWCharString )
515*48a54d36SAndroid Build Coastguard Worker {
516*48a54d36SAndroid Build Coastguard Worker 	const char *		src;
517*48a54d36SAndroid Build Coastguard Worker 	WCHAR *				dst;
518*48a54d36SAndroid Build Coastguard Worker 	char				c;
519*48a54d36SAndroid Build Coastguard Worker 
520*48a54d36SAndroid Build Coastguard Worker 	check( inCharString );
521*48a54d36SAndroid Build Coastguard Worker 	check( outWCharString );
522*48a54d36SAndroid Build Coastguard Worker 
523*48a54d36SAndroid Build Coastguard Worker 	src = inCharString;
524*48a54d36SAndroid Build Coastguard Worker 	dst = outWCharString;
525*48a54d36SAndroid Build Coastguard Worker 	do
526*48a54d36SAndroid Build Coastguard Worker 	{
527*48a54d36SAndroid Build Coastguard Worker 		c = *src++;
528*48a54d36SAndroid Build Coastguard Worker 		*dst++ = (WCHAR) c;
529*48a54d36SAndroid Build Coastguard Worker 
530*48a54d36SAndroid Build Coastguard Worker 	}	while( c != '\0' );
531*48a54d36SAndroid Build Coastguard Worker 
532*48a54d36SAndroid Build Coastguard Worker 	return( outWCharString );
533*48a54d36SAndroid Build Coastguard Worker }
534*48a54d36SAndroid Build Coastguard Worker 
535*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
536*48a54d36SAndroid Build Coastguard Worker //	GUIDtoString
537*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
538*48a54d36SAndroid Build Coastguard Worker 
GUIDtoString(const GUID * inGUID,char * outString)539*48a54d36SAndroid Build Coastguard Worker DEBUG_LOCAL char *	GUIDtoString( const GUID *inGUID, char *outString )
540*48a54d36SAndroid Build Coastguard Worker {
541*48a54d36SAndroid Build Coastguard Worker 	check( inGUID );
542*48a54d36SAndroid Build Coastguard Worker 	check( outString );
543*48a54d36SAndroid Build Coastguard Worker 
544*48a54d36SAndroid Build Coastguard Worker 	sprintf( outString, "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
545*48a54d36SAndroid Build Coastguard Worker 		inGUID->Data1, inGUID->Data2, inGUID->Data3,
546*48a54d36SAndroid Build Coastguard Worker 		inGUID->Data4[ 0 ], inGUID->Data4[ 1 ], inGUID->Data4[ 2 ], inGUID->Data4[ 3 ],
547*48a54d36SAndroid Build Coastguard Worker 		inGUID->Data4[ 4 ], inGUID->Data4[ 5 ], inGUID->Data4[ 6 ], inGUID->Data4[ 7 ] );
548*48a54d36SAndroid Build Coastguard Worker 	return( outString );
549*48a54d36SAndroid Build Coastguard Worker }
550*48a54d36SAndroid Build Coastguard Worker 
551*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
552*48a54d36SAndroid Build Coastguard Worker //	StringToGUID
553*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
554*48a54d36SAndroid Build Coastguard Worker 
StringToGUID(const char * inCharString,GUID * outGUID)555*48a54d36SAndroid Build Coastguard Worker DEBUG_LOCAL OSStatus	StringToGUID( const char *inCharString, GUID *outGUID )
556*48a54d36SAndroid Build Coastguard Worker {
557*48a54d36SAndroid Build Coastguard Worker 	OSStatus			err;
558*48a54d36SAndroid Build Coastguard Worker 	int					n;
559*48a54d36SAndroid Build Coastguard Worker 	unsigned int		v[ 8 ];
560*48a54d36SAndroid Build Coastguard Worker 
561*48a54d36SAndroid Build Coastguard Worker 	check( inCharString );
562*48a54d36SAndroid Build Coastguard Worker 	check( outGUID );
563*48a54d36SAndroid Build Coastguard Worker 
564*48a54d36SAndroid Build Coastguard Worker 	n = sscanf( inCharString, "%lX-%hX-%hX-%02X%02X-%02X%02X%02X%02X%02X%02X",
565*48a54d36SAndroid Build Coastguard Worker 		&outGUID->Data1, &outGUID->Data2, &outGUID->Data3,
566*48a54d36SAndroid Build Coastguard Worker 		&v[ 0 ], &v[ 1 ], &v[ 2 ], &v[ 3 ], &v[ 4 ], &v[ 5 ], &v[ 6 ], &v[ 7 ] );
567*48a54d36SAndroid Build Coastguard Worker 	require_action( n == 11, exit, err = kFormatErr );
568*48a54d36SAndroid Build Coastguard Worker 
569*48a54d36SAndroid Build Coastguard Worker 	outGUID->Data4[ 0 ] = (unsigned char) v[ 0 ];
570*48a54d36SAndroid Build Coastguard Worker 	outGUID->Data4[ 1 ] = (unsigned char) v[ 1 ];
571*48a54d36SAndroid Build Coastguard Worker 	outGUID->Data4[ 2 ] = (unsigned char) v[ 2 ];
572*48a54d36SAndroid Build Coastguard Worker 	outGUID->Data4[ 3 ] = (unsigned char) v[ 3 ];
573*48a54d36SAndroid Build Coastguard Worker 	outGUID->Data4[ 4 ] = (unsigned char) v[ 4 ];
574*48a54d36SAndroid Build Coastguard Worker 	outGUID->Data4[ 5 ] = (unsigned char) v[ 5 ];
575*48a54d36SAndroid Build Coastguard Worker 	outGUID->Data4[ 6 ] = (unsigned char) v[ 6 ];
576*48a54d36SAndroid Build Coastguard Worker 	outGUID->Data4[ 7 ] = (unsigned char) v[ 7 ];
577*48a54d36SAndroid Build Coastguard Worker 	err = kNoErr;
578*48a54d36SAndroid Build Coastguard Worker 
579*48a54d36SAndroid Build Coastguard Worker exit:
580*48a54d36SAndroid Build Coastguard Worker 	return( err );
581*48a54d36SAndroid Build Coastguard Worker }
582