Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

510 lines
13 KiB

  1. /*++
  2. Copyright (c) 1990 Microsoft Corporation
  3. Module Name:
  4. alias.c
  5. Abstract:
  6. alias utility
  7. Author:
  8. Therese Stowell (thereses) 22-Mar-1990
  9. Revision History:
  10. --*/
  11. #include <windows.h>
  12. #include <conapi.h>
  13. #include <stdio.h>
  14. #include <stdlib.h>
  15. #include <string.h>
  16. #include <cvtoem.h>
  17. BOOL fVerbose;
  18. DWORD
  19. DisplayAliases(
  20. char *ExeName
  21. );
  22. DWORD
  23. DisplayAlias(
  24. LPSTR AliasName,
  25. LPSTR ExeName
  26. );
  27. DWORD
  28. DoAliasFile(
  29. char * FileName,
  30. char * ExeName,
  31. BOOL fDelete
  32. );
  33. DWORD
  34. DoAlias(
  35. char *Source,
  36. char *Target,
  37. char *ExeName
  38. );
  39. void
  40. usage( void )
  41. {
  42. fprintf( stderr, "Usage: ALIAS [-v] [-p programName] [-f filespec] [<source> <target>]\n" );
  43. fprintf( stderr, " [-v] means verbose output.\n" );
  44. fprintf( stderr, " [-d] means delete aliases.\n" );
  45. fprintf( stderr, " [-p programName] specifies which image file name these alias\n" );
  46. fprintf( stderr, " definitions are for. Default is CMD.EXE\n" );
  47. fprintf( stderr, " [-f filespec] specifies a file which contains the aliases.\n" );
  48. exit( 1 );
  49. }
  50. DWORD
  51. DoAlias(
  52. char *Source,
  53. char *Target,
  54. char *ExeName
  55. )
  56. {
  57. if (!AddConsoleAlias( Source, Target, ExeName )) {
  58. if (!Target) {
  59. fprintf( stderr,
  60. "ALIAS: Unable to delete alias - %s\n",
  61. Source
  62. );
  63. }
  64. else {
  65. fprintf( stderr,
  66. "ALIAS: Unable to add alias - %s = %s\n",
  67. Source,
  68. Target
  69. );
  70. }
  71. return ERROR_NOT_ENOUGH_MEMORY;
  72. }
  73. else
  74. if (fVerbose) {
  75. if (!Target) {
  76. fprintf( stderr, "Deleted alias - %s\n", Source );
  77. }
  78. else {
  79. fprintf( stderr, "Added alias - %s = %s\n", Source, Target );
  80. }
  81. }
  82. return NO_ERROR;
  83. }
  84. DWORD
  85. DoAliasFile(
  86. char * FileName,
  87. char * ExeName,
  88. BOOL fDelete
  89. )
  90. {
  91. DWORD rc;
  92. FILE *fh;
  93. char LineBuffer[ 512 ], *Source, *Target, *s;
  94. if (!(fh = fopen( FileName, "rt" ))) {
  95. fprintf( stderr, "ALIAS: Unable to open file - %s\n", FileName );
  96. return ERROR_FILE_NOT_FOUND;
  97. }
  98. if (fVerbose) {
  99. fprintf( stderr,
  100. "ALIAS: %s aliases defined in %s\n",
  101. fDelete ? "Deleting" : "Loading",
  102. FileName
  103. );
  104. }
  105. while (s = fgets( LineBuffer, sizeof( LineBuffer ), fh )) {
  106. while (*s <= ' ') {
  107. if (!*s) {
  108. break;
  109. }
  110. s++;
  111. }
  112. if (!*s || (*s == '/' && s[1] == '/')) {
  113. continue;
  114. }
  115. Source = s;
  116. while (*s > ' ') {
  117. s++;
  118. }
  119. *s++ = '\0';
  120. while (*s <= ' ') {
  121. if (!*s) {
  122. break;
  123. }
  124. s++;
  125. }
  126. Target = s;
  127. s += strlen( s );
  128. while (*s <= ' ') {
  129. *s-- = '\0';
  130. if (s < Target) {
  131. break;
  132. }
  133. }
  134. rc = DoAlias( Source, fDelete ? NULL : Target, ExeName );
  135. if (rc != NO_ERROR) {
  136. break;
  137. }
  138. }
  139. return rc;
  140. }
  141. DWORD
  142. DisplayAlias(
  143. LPSTR AliasName,
  144. LPSTR ExeName
  145. )
  146. {
  147. DWORD cb;
  148. CHAR AliasBuffer[512];
  149. if (cb = GetConsoleAlias( AliasName, AliasBuffer, sizeof( AliasBuffer ), ExeName )) {
  150. printf( "%-16s=%s\n", AliasName, AliasBuffer );
  151. return NO_ERROR;
  152. }
  153. else {
  154. printf( "%-16s *** Unable to read value of alias ***\n",
  155. AliasName
  156. );
  157. return ERROR_ENVVAR_NOT_FOUND;
  158. }
  159. }
  160. int __cdecl
  161. CmpNamesRoutine(
  162. const VOID *Element1,
  163. const VOID *Element2
  164. )
  165. {
  166. return( strcmp( *(LPSTR *)Element1, *(LPSTR *)Element2 ) );
  167. }
  168. DWORD
  169. DisplayAliases(
  170. char *ExeName
  171. )
  172. {
  173. DWORD cb, rc, nExeNames, nAliases, iExeName, iAlias;
  174. LPSTR FreeMem1, FreeMem2, AliasName, AliasValue, s, *SortedExeNames, *SortedAliasNames;
  175. if (ExeName == NULL) {
  176. cb = GetConsoleAliasExesLength();
  177. if (cb == 0) {
  178. return ERROR_ENVVAR_NOT_FOUND;
  179. }
  180. if (!(FreeMem1 = malloc( cb+2 ))) {
  181. fprintf( stderr, "ALIAS: Not enough memory for EXE names.\n" );
  182. return ERROR_NOT_ENOUGH_MEMORY;
  183. }
  184. ExeName = FreeMem1;
  185. if (!GetConsoleAliasExes( ExeName, cb )) {
  186. fprintf( stderr, "ALIAS: Unable to read alias EXE names.\n" );
  187. return ERROR_ENVVAR_NOT_FOUND;
  188. }
  189. ExeName[ cb ] = '\0';
  190. ExeName[ cb+1 ] = '\0';
  191. nExeNames = 0;
  192. s = ExeName;
  193. while (*s) {
  194. _strupr( s );
  195. nExeNames++;
  196. while (*s++) {
  197. }
  198. }
  199. SortedExeNames = malloc( nExeNames * sizeof( LPSTR ) );
  200. if (SortedExeNames == NULL) {
  201. fprintf( stderr, "ALIAS: Not enough memory to sort .EXE names.\n" );
  202. }
  203. else {
  204. iExeName = 0;
  205. s = ExeName;
  206. while (*s) {
  207. SortedExeNames[ iExeName++ ] = s;
  208. while (*s++) {
  209. }
  210. }
  211. qsort( SortedExeNames,
  212. nExeNames,
  213. sizeof( LPSTR ),
  214. CmpNamesRoutine
  215. );
  216. iExeName = 0;
  217. }
  218. }
  219. else {
  220. SortedExeNames = NULL;
  221. FreeMem1 = NULL;
  222. }
  223. rc = NO_ERROR;
  224. while (rc == NO_ERROR && *ExeName) {
  225. if (SortedExeNames != NULL) {
  226. ExeName = SortedExeNames[ iExeName++ ];
  227. }
  228. cb = GetConsoleAliasesLength(ExeName);
  229. if (cb == 0) {
  230. printf( "No aliases defined for %s in current console.\n", ExeName );
  231. }
  232. else {
  233. if (!(FreeMem2 = malloc( cb+2 ))) {
  234. fprintf( stderr, "ALIAS: Not enough memory for alias names.\n" );
  235. rc = ERROR_NOT_ENOUGH_MEMORY;
  236. break;
  237. }
  238. SortedAliasNames = NULL;
  239. AliasName = FreeMem2;
  240. if (GetConsoleAliases( AliasName, cb, ExeName )) {
  241. AliasName[ cb ] = '\0';
  242. AliasName[ cb+1 ] = '\0';
  243. nAliases = 0;
  244. s = AliasName;
  245. while (*s) {
  246. nAliases++;
  247. while (*s++) {
  248. }
  249. }
  250. SortedAliasNames = malloc( nAliases * sizeof( LPSTR ) );
  251. if (SortedAliasNames == NULL) {
  252. fprintf( stderr, "ALIAS: Not enough memory to sort alias names.\n" );
  253. }
  254. else {
  255. iAlias = 0;
  256. s = AliasName;
  257. while (*s) {
  258. SortedAliasNames[ iAlias++ ] = s;
  259. while (*s++) {
  260. }
  261. }
  262. qsort( SortedAliasNames,
  263. nAliases,
  264. sizeof( LPSTR ),
  265. CmpNamesRoutine
  266. );
  267. iAlias = 0;
  268. }
  269. printf( "Dumping all defined aliases for %s.\n", ExeName );
  270. while (*AliasName) {
  271. if (SortedAliasNames != NULL) {
  272. AliasName = SortedAliasNames[ iAlias++ ];
  273. }
  274. AliasValue = AliasName;
  275. while (*AliasValue) {
  276. if (*AliasValue == '=') {
  277. *AliasValue++ = '\0';
  278. break;
  279. }
  280. else {
  281. AliasValue++;
  282. }
  283. }
  284. printf( " %-16s=%s\n", AliasName, AliasValue );
  285. if (SortedAliasNames != NULL) {
  286. if (iAlias < nAliases) {
  287. AliasName = " ";
  288. }
  289. else {
  290. AliasName = "";
  291. }
  292. }
  293. else {
  294. AliasName = AliasValue;
  295. while (*AliasName++) {
  296. ;
  297. }
  298. }
  299. }
  300. }
  301. else {
  302. fprintf( stderr, "ALIAS: unable to read aliases for %s.\n", ExeName );
  303. rc = ERROR_ENVVAR_NOT_FOUND;
  304. }
  305. free( FreeMem2 );
  306. if (SortedAliasNames != NULL) {
  307. free( SortedAliasNames );
  308. }
  309. }
  310. if (SortedExeNames != NULL) {
  311. if (iExeName < nExeNames) {
  312. ExeName = " ";
  313. }
  314. else {
  315. ExeName = "";
  316. }
  317. }
  318. else {
  319. while (*ExeName++) {
  320. ;
  321. }
  322. }
  323. }
  324. if (SortedExeNames != NULL) {
  325. free( SortedExeNames );
  326. }
  327. if (FreeMem1) {
  328. free( FreeMem1 );
  329. }
  330. return rc;
  331. }
  332. DWORD __cdecl
  333. main(
  334. int argc,
  335. char *argv[]
  336. )
  337. {
  338. DWORD rc;
  339. char *s, *s1, *AliasName;
  340. char *ExeName;
  341. BOOL fDelete;
  342. BOOL DisplayAllAliases;
  343. ConvertAppToOem( argc,argv );
  344. AliasName = NULL;
  345. ExeName = NULL;
  346. fVerbose = FALSE;
  347. fDelete = FALSE;
  348. DisplayAllAliases = TRUE;
  349. rc = NO_ERROR;
  350. while (rc == NO_ERROR && --argc) {
  351. s = *++argv;
  352. if (*s == '-' || *s == '/') {
  353. while (*++s) {
  354. switch( *s ) {
  355. case '?':
  356. case 'h':
  357. case 'H':
  358. usage();
  359. break;
  360. case 'd':
  361. case 'D':
  362. fDelete = TRUE;
  363. break;
  364. case 'v':
  365. case 'V':
  366. fVerbose = TRUE;
  367. break;
  368. case 'p':
  369. case 'P':
  370. if (!--argc) {
  371. fprintf( stderr, "ALIAS: Argument to -p switch missing.\n" );
  372. usage();
  373. }
  374. if (ExeName != NULL) {
  375. free( ExeName );
  376. ExeName = NULL;
  377. }
  378. s1 = *++argv;
  379. ExeName = calloc( 1, strlen( s1 )+2 );
  380. if (ExeName) {
  381. strcpy( ExeName, s1 );
  382. }
  383. break;
  384. case 'f':
  385. case 'F':
  386. if (!--argc) {
  387. fprintf( stderr, "ALIAS: Argument to -f switch missing.\n" );
  388. usage();
  389. }
  390. DisplayAllAliases = FALSE;
  391. rc = DoAliasFile( *++argv, ExeName ? ExeName : "CMD.EXE", fDelete );
  392. break;
  393. default:
  394. fprintf( stderr, "ALIAS: invalid switch /%c\n", *s );
  395. usage();
  396. break;
  397. }
  398. }
  399. }
  400. else {
  401. DisplayAllAliases = FALSE;
  402. if (AliasName == NULL) {
  403. if (fDelete) {
  404. rc = DoAlias( s, NULL, ExeName ? ExeName : "CMD.EXE" );
  405. }
  406. else {
  407. AliasName = s;
  408. }
  409. }
  410. else {
  411. if (fDelete) {
  412. rc = DoAlias( AliasName, NULL, ExeName ? ExeName : "CMD.EXE" );
  413. AliasName = s;
  414. }
  415. else {
  416. rc = DoAlias( AliasName, s, ExeName ? ExeName : "CMD.EXE" );
  417. AliasName = NULL;
  418. }
  419. }
  420. }
  421. }
  422. if (rc == NO_ERROR) {
  423. if (AliasName != NULL) {
  424. if (fDelete) {
  425. rc = DoAlias( AliasName, NULL, ExeName ? ExeName : "CMD.EXE" );
  426. }
  427. else {
  428. rc = DisplayAlias( AliasName, ExeName ? ExeName : "CMD.EXE" );
  429. }
  430. }
  431. else
  432. if (DisplayAllAliases) {
  433. rc = DisplayAliases( ExeName );
  434. }
  435. }
  436. if (ExeName != NULL) {
  437. free( ExeName );
  438. ExeName = NULL;
  439. }
  440. exit( rc );
  441. return rc;
  442. }