2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
11 #include <afs/param.h>
15 #include "TaAfsUsrMgr.h"
19 #include <afs/afs_AdminErrors.h>
24 * VARIABLES __________________________________________________________________
36 TCHAR szSwitch[ cchRESOURCE ];
39 TCHAR szValue[ cchRESOURCE ];
41 { TEXT("cell"), TRUE, FALSE, TEXT("") },
42 { TEXT("remote"), TRUE, FALSE, TEXT("") },
43 { TEXT("user"), TRUE, FALSE, TEXT("") },
44 { TEXT("password"), TRUE, FALSE, TEXT("") }
47 #define nSWITCHES (sizeof(aSWITCHES) / sizeof(aSWITCHES[0]))
51 * PROTOTYPES _________________________________________________________________
55 #define iswhite(_ch) ( ((_ch)==TEXT(' ')) || ((_ch)==TEXT('\t')) )
57 void cdecl CommandLineHelp (int ids, LPTSTR pszFormat = NULL, ...);
61 * ROUTINES ___________________________________________________________________
65 CMDLINEOP ParseCommandLine (LPTSTR pszCmdLine)
67 for (size_t ii = 0; ii < nSWITCHES; ++ii)
68 aSWITCHES[ ii ].fPresent = FALSE;
70 // Search through pszCmdLine for switches; each switch must be
71 // preceeded by "/" or "-".
73 while (pszCmdLine && *pszCmdLine)
75 while (iswhite(*pszCmdLine))
80 if ( (*pszCmdLine != '-') && (*pszCmdLine != '/') )
82 CommandLineHelp (IDS_CMDLINE_SYNTAX);
88 // Okay, we've found what is probably the start of a switch.
89 // See if it matches anything.
91 for (ii = 0; ii < nSWITCHES; ++ii)
93 size_t cch = lstrlen(aSWITCHES[ ii ].szSwitch);
94 if (lstrncmpi (pszCmdLine, aSWITCHES[ ii ].szSwitch, cch))
97 // If the switch wants a value, it must be followed by ":"
98 // or whitespace; if it doesn't, it must be followed by "/"
101 LPTSTR pszAfter = &pszCmdLine[ cch ];
102 if (iswhite (*pszAfter) || (!*pszAfter) ||
103 ((*pszAfter == TEXT(':')) && (aSWITCHES[ ii ].fGetsValue)) ||
104 ((*pszAfter == TEXT('/')) && (!aSWITCHES[ ii ].fGetsValue)) )
106 break; // found a switch!
112 TCHAR szCopy[ cchRESOURCE ];
113 lstrcpy (szCopy, pszCmdLine);
114 for (LPTSTR pch = szCopy;
115 *pch && !iswhite(*pch) && !(*pch == TEXT('/')) && !(*pch == TEXT(':'));
119 CommandLineHelp (IDS_CMDLINE_UNRECOGNIZED, TEXT("%s"), szCopy);
122 if (aSWITCHES[ ii ].fPresent)
124 CommandLineHelp (IDS_CMDLINE_DUPLICATE, TEXT("%s"), aSWITCHES[ ii ].szSwitch);
128 // Woo hoo! Found what appears to be a valid switch. Parse it now.
130 aSWITCHES[ ii ].fPresent = TRUE;
131 pszCmdLine += lstrlen( aSWITCHES[ ii ].szSwitch );
132 while (iswhite (*pszCmdLine))
135 if (*pszCmdLine == TEXT(':'))
137 if (!aSWITCHES[ ii ].fGetsValue)
139 CommandLineHelp (IDS_CMDLINE_UNEXPECTVALUE, TEXT("%s"), aSWITCHES[ ii ].szSwitch);
142 for (++pszCmdLine; iswhite (*pszCmdLine); ++pszCmdLine)
146 if (aSWITCHES[ ii ].fGetsValue)
148 if ( (*pszCmdLine == TEXT('/')) || (*pszCmdLine == TEXT('\0')) )
150 CommandLineHelp (IDS_CMDLINE_MISSINGVAL, TEXT("%s"), aSWITCHES[ ii ].szSwitch);
153 BOOL fQuoted = FALSE;
154 for (LPTSTR pszTarget = aSWITCHES[ ii ].szValue;
155 *pszCmdLine && !(*pszCmdLine == TEXT('/') && !fQuoted)
156 && !(iswhite(*pszCmdLine) && !fQuoted); )
158 if (*pszCmdLine == TEXT('"'))
166 *pszTarget++ = *pszCmdLine++;
168 *pszTarget++ = TEXT('\0');
172 // Now test the command-line for syntactical correctness.
173 // First case: if the USER or PASSWORD switch is given, the other
176 if ( (aSWITCHES[ swUSER ].fPresent && !aSWITCHES[ swPASSWORD ].fPresent) ||
177 (aSWITCHES[ swPASSWORD ].fPresent && !aSWITCHES[ swUSER ].fPresent) )
179 CommandLineHelp (IDS_CMDLINE_USERPASSWORD);
183 // Connect to an administration server
185 if (aSWITCHES[ swREMOTE ].fPresent)
188 if (!AfsAppLib_OpenAdminServer (aSWITCHES[ swREMOTE ].szValue, &status))
190 if (status == ADMCLIENTCANTINITAFSLOCATION)
191 ImmediateErrorDialog (status, IDS_ERROR_BAD_REMOTE_SERVER_INSTALL, aSWITCHES[ swREMOTE ].szValue);
193 ImmediateErrorDialog (status, IDS_ERROR_BAD_REMOTE_SERVER, TEXT("%s"), aSWITCHES[ swREMOTE ].szValue);
197 else // (!aSWITCHES[ swREMOTE ].fPresent)
200 if (!AfsAppLib_OpenAdminServer (NULL, &status))
202 if (status == ADMCLIENTCANTINITAFSLOCATION)
203 ImmediateErrorDialog (status, IDS_ERROR_BAD_REMOTE_SERVER_INSTALL, aSWITCHES[ swREMOTE ].szValue);
205 ImmediateErrorDialog (status, IDS_ERROR_BAD_LOCAL_SERVER, TEXT("%s"), aSWITCHES[ swREMOTE ].szValue);
209 g.idClient = AfsAppLib_GetAdminServerClientID();
211 // Obtain credentials
213 if (aSWITCHES[ swUSER ].fPresent)
215 LPTSTR pszCell = (aSWITCHES[ swCELL ].fPresent) ? (aSWITCHES[ swCELL ].szValue) : NULL;
218 if (!AfsAppLib_SetCredentials (pszCell, aSWITCHES[ swUSER ].szValue, aSWITCHES[ swPASSWORD ].szValue, &status))
220 ImmediateErrorDialog (status, IDS_ERROR_BAD_CREDENTIALS);
225 // If the user asked us to, try to open the specified cell
227 if (aSWITCHES[ swCELL ].fPresent)
229 LPOPENCELL_PARAMS lpp = New (OPENCELL_PARAMS);
230 memset (lpp, 0x00, sizeof(OPENCELL_PARAMS));
231 lstrcpy (lpp->szCell, aSWITCHES[ swCELL ].szValue);
232 lpp->fCloseAppOnFail = TRUE;
233 StartTask (taskOPENCELL, NULL, lpp);
234 return opNOCELLDIALOG;
237 // Okay--nothing sufficiently special took place to prevent us
238 // from running the tool normally.
244 void cdecl CommandLineHelp (int ids, LPTSTR pszFormat, ...)
247 va_start (arg, pszFormat);
248 vMessage (MB_OK | MB_ICONHAND, IDS_CMDLINE_TITLE, ids, pszFormat, arg);