Windows: remove trailing whitespace
[openafs.git] / src / WINNT / client_config / afsmap.c
1 /*
2  * Copyright 2004.  Secure Endpoints Inc.
3  *
4  * This software has been released under the terms of the IBM Public
5  * License.  For details, see the LICENSE file in the top-level source
6  * directory or online at http://www.openafs.org/dl/license10.html
7  */
8
9 extern "C" {
10 #include <afs/param.h>
11 #include <afs/stds.h>
12 #include <rx/rxkad.h>
13 #include <afs/fs_utils.h>
14 }
15 #include <windows.h>
16 #include <stdlib.h>
17 #include <stdio.h>
18
19 /*
20  *
21  */
22
23 void usage(char * program)
24 {
25     fprintf(stderr, "Usage: %s <drive> <afs-path> [ <submount> ] [ /persistent ]\n", program);
26     fprintf(stderr, "       %s <drive> <unc-path> [ /persistent ]\n", program);
27     fprintf(stderr, "       %s <drive> /delete\n", program);
28     fprintf(stderr, "       %s /list\n", program);
29     fprintf(stderr, "       %s /help\n", program);
30     exit(1);
31 }
32
33 int main(int argc, char * argv)
34 {
35     int retval = 0;
36     char drive = 0;
37     char mountRoot[16];
38     DWORD mountRootLen = 0;
39     char buf[200];
40         HKEY parmKey;
41         DWORD dummyLen;
42     DWORD code;
43     char  netbiosName[17];
44     DWORD netbiosNameLen;
45     BOOL  persistent;
46     char  submount[32] = "";
47
48     if ( argc < 2 || argc > 5 )
49         usage(program);
50
51     if ( stricmp("/list", argv[1]) ) {
52         /* print list of afs drive mappings */
53
54         return 0;
55     }
56
57     if ( stricmp("/help", argv[1]) ) {
58         usage(program);
59     }
60
61     if ( strlen(argv[1]) == 2 && argv[1][1] == ':' ) {
62         drive = toupper(argv[1][0]);
63         if ( drive < 'A' || drive > 'Z' )
64             usage(program);
65     }
66
67     if ( stricmp("/delete", argv[2]) ) {
68         if ( !DriveIsGlobalAfsDrive(drive) ) {
69             fprintf(stderr, "%s: Drive %c is not mapped to AFS\n", argv[0], drive);
70             return 6;
71         }
72
73         /* remove drive map */
74         WriteActiveMap( drive, FALSE );
75         code = DisMountDOSDrive( drive, TRUE );
76         if ( code ) {
77             fprintf(stderr, "%s: Unable to delete drive %c:, error = %lX\n", argv[0], code);
78             return 2;
79         }
80         return 0;
81     }
82
83     /* need to determine if argv[3] contains a /mountroot or \\netbiosname path.
84      * do not use hard code constants; instead use the registry strings
85      */
86     code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSConfigKeyName,
87                          0, KEY_QUERY_VALUE, &parmKey);
88     dummyLen = sizeof(cm_mountRoot);
89         code = RegQueryValueEx(parmKey, "MountRoot", NULL, NULL,
90                            mountRoot, &mountRootLen);
91         if (code == ERROR_SUCCESS) {
92                 cm_mountRootLen = strlen(cm_mountRoot);
93         } else {
94                 strncpy(mountRoot, sizeof(cm_mountRoot), "/afs");
95                 cm_mountRootLen = 4;
96         }
97
98     code = lana_GetNetbiosName(netbiosName, LANA_NETBIOS_NAME_FULL);
99     if ( code ) {
100         fprintf(stderr, "%s: Unable to determine AFS SMB server name\n",argv[0]);
101         return 3;
102     }
103     netbiosNameLen = strlen(netbiosName);
104
105     if ( argv[3][0] == '\\' && argv[3][1] == '\\' &&
106          _strnicmp(netbiosName, &argv[3][2], netbiosNameLen) == 0 &&
107          argv[3][netbiosNameLen+3] == '\\') {
108         /* we have a UNC style path */
109
110         if ( argc == 4 ) {
111             persistent = FALSE;
112         } else if (argc > 5) {
113             usage(argv[0]);
114         } else {
115             if ( stricmp("/persistent", argv[4]) )
116                 usage(argv[0]);
117             persistent = TRUE;
118         }
119
120         code = MountDOSDrive(drive, &argv[3][netbiosNameLen+4], persistent, NULL);
121         if ( code ) {
122             fprintf(stderr, "%s: Unable to map %c: to %s, error = %lX\n", argv[0], drive, argv[3], code);
123             return 4;
124         }
125         WriteActiveMap( drive, persistent );
126         return 0;
127     }
128
129     if ( argv[3][0] == '/' &&
130          _strnicmp(mountRoot, &argv[1], mountRootLen) &&
131          argv[3][mountRootLen+2] == '/') {
132         /* we have an afs path */
133         /* check to see if we have a submount, if not generate a random one */
134         /* check to see if we are persistent or not */
135
136         if ( argc == 4 ) {
137             /* we have neither persistence nor a submount name */
138             persistent = FALSE;
139         } else if ( argc > 6 ) {
140             usage(argv[0]);
141         } else if ( argc == 5 ) {
142             /* we have either persistence or a submount */
143             if ( _stricmp("/persistent", argv[4]) == 0 ) {
144                 persistent = TRUE;
145             } else {
146                 /* we have a submount name */
147                 if ( !IsValidSubmountName(argv[4]) ) {
148                     fprintf(stderr, "%s: invalid submount name: %s\n", argv[4]);
149                     return 5;
150                 }
151                 strcpy(submount, argv[4]);
152                 persistent = FALSE;
153             }
154         } else {
155             /* we have both persistent and a submount */
156             if ( _stricmp("/persistent", argv[5]) == 0 ) {
157                 persistent = TRUE;
158             } else {
159                 usage(argv[0]);
160             }
161
162             if ( !IsValidSubmountName(argv[4]) ) {
163                 fprintf(stderr, "%s: invalid submount name: %s\n", argv[4]);
164                 return 5;
165             }
166             strcpy(submount, argv[4]);
167         }
168
169         WriteActiveMap( drive, persistent );
170     }
171     return 0;
172 }