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