/*++ Copyright (c) 1990 Microsoft Corporation Module Name: alias.c Abstract: alias utility Author: Therese Stowell (thereses) 22-Mar-1990 Revision History: --*/ #include #include #include #include #include #include BOOL fVerbose; DWORD DisplayAliases( char *ExeName ); DWORD DisplayAlias( LPSTR AliasName, LPSTR ExeName ); DWORD DoAliasFile( char * FileName, char * ExeName, BOOL fDelete ); DWORD DoAlias( char *Source, char *Target, char *ExeName ); void usage( void ) { fprintf( stderr, "Usage: ALIAS [-v] [-p programName] [-f filespec] [ ]\n" ); fprintf( stderr, " [-v] means verbose output.\n" ); fprintf( stderr, " [-d] means delete aliases.\n" ); fprintf( stderr, " [-p programName] specifies which image file name these alias\n" ); fprintf( stderr, " definitions are for. Default is CMD.EXE\n" ); fprintf( stderr, " [-f filespec] specifies a file which contains the aliases.\n" ); exit( 1 ); } DWORD DoAlias( char *Source, char *Target, char *ExeName ) { if (!AddConsoleAlias( Source, Target, ExeName )) { if (!Target) { fprintf( stderr, "ALIAS: Unable to delete alias - %s\n", Source, Target ); } else { fprintf( stderr, "ALIAS: Unable to add alias - %s = %s\n", Source, Target ); } return ERROR_NOT_ENOUGH_MEMORY; } else if (fVerbose) { if (!Target) { fprintf( stderr, "Deleted alias - %s\n", Source ); } else { fprintf( stderr, "Added alias - %s = %s\n", Source, Target ); } } return NO_ERROR; } DWORD DoAliasFile( char * FileName, char * ExeName, BOOL fDelete ) { DWORD rc; FILE *fh; char LineBuffer[ 256 ], *Source, *Target, *s; if (!(fh = fopen( FileName, "rt" ))) { fprintf( stderr, "ALIAS: Unable to open file - %s\n", FileName ); return ERROR_FILE_NOT_FOUND; } if (fVerbose) { fprintf( stderr, "ALIAS: %s aliases defined in %s\n", fDelete ? "Deleting" : "Loading", FileName ); } while (s = fgets( LineBuffer, sizeof( LineBuffer ), fh )) { while (*s <= ' ') { if (!*s) { break; } s++; } if (!*s || (*s == '/' && s[1] == '/')) { continue; } Source = s; while (*s > ' ') { s++; } *s++ = '\0'; while (*s <= ' ') { if (!*s) { break; } s++; } Target = s; s += strlen( s ); while (*s <= ' ') { *s-- = '\0'; if (s < Target) { break; } } rc = DoAlias( Source, fDelete ? NULL : Target, ExeName ); if (rc != NO_ERROR) { break; } } return rc; } DWORD DisplayAlias( LPSTR AliasName, LPSTR ExeName ) { DWORD cb; CHAR AliasBuffer[512]; if (cb = GetConsoleAlias( AliasName, AliasBuffer, sizeof( AliasBuffer ), ExeName )) { printf( "%-16s=%s\n", AliasName, AliasBuffer ); return NO_ERROR; } else { printf( "%-16s *** Unable to read value of alias ***\n", AliasName ); return ERROR_ENVVAR_NOT_FOUND; } } int __cdecl CmpNamesRoutine( const VOID *Element1, const VOID *Element2 ) { return( strcmp( *(LPSTR *)Element1, *(LPSTR *)Element2 ) ); } DWORD DisplayAliases( char *ExeName ) { DWORD cb, rc, nExeNames, nAliases, iExeName, iAlias; LPSTR FreeMem1, FreeMem2, AliasName, AliasValue, s, *SortedExeNames, *SortedAliasNames; if (ExeName == NULL) { cb = GetConsoleAliasExesLength(); if (cb == 0) { return ERROR_ENVVAR_NOT_FOUND; } if (!(FreeMem1 = malloc( cb+2 ))) { fprintf( stderr, "ALIAS: Not enough memory for EXE names.\n" ); return ERROR_NOT_ENOUGH_MEMORY; } ExeName = FreeMem1; if (!GetConsoleAliasExes( ExeName, cb )) { fprintf( stderr, "ALIAS: Unable to read alias EXE names.\n" ); return ERROR_ENVVAR_NOT_FOUND; } ExeName[ cb ] = '\0'; ExeName[ cb+1 ] = '\0'; nExeNames = 0; s = ExeName; while (*s) { _strupr( s ); nExeNames++; while (*s++) { } } SortedExeNames = malloc( nExeNames * sizeof( LPSTR ) ); if (SortedExeNames == NULL) { fprintf( stderr, "ALIAS: Not enough memory to sort .EXE names.\n" ); } else { iExeName = 0; s = ExeName; while (*s) { SortedExeNames[ iExeName++ ] = s; while (*s++) { } } qsort( SortedExeNames, nExeNames, sizeof( LPSTR ), CmpNamesRoutine ); iExeName = 0; } } else { SortedExeNames = NULL; FreeMem1 = NULL; } rc = NO_ERROR; while (rc == NO_ERROR && *ExeName) { if (SortedExeNames != NULL) { ExeName = SortedExeNames[ iExeName++ ]; } cb = GetConsoleAliasesLength(ExeName); if (cb == 0) { printf( "No aliases defined for %s in current console.\n", ExeName ); } else { if (!(FreeMem2 = malloc( cb+2 ))) { fprintf( stderr, "ALIAS: Not enough memory for alias names.\n" ); rc = ERROR_NOT_ENOUGH_MEMORY; break; } SortedAliasNames = NULL; AliasName = FreeMem2; if (GetConsoleAliases( AliasName, cb, ExeName )) { AliasName[ cb ] = '\0'; AliasName[ cb+1 ] = '\0'; nAliases = 0; s = AliasName; while (*s) { nAliases++; while (*s++) { } } SortedAliasNames = malloc( nAliases * sizeof( LPSTR ) ); if (SortedAliasNames == NULL) { fprintf( stderr, "ALIAS: Not enough memory to sort alias names.\n" ); } else { iAlias = 0; s = AliasName; while (*s) { SortedAliasNames[ iAlias++ ] = s; while (*s++) { } } qsort( SortedAliasNames, nAliases, sizeof( LPSTR ), CmpNamesRoutine ); iAlias = 0; } printf( "Dumping all defined aliases for %s.\n", ExeName ); while (*AliasName) { if (SortedAliasNames != NULL) { AliasName = SortedAliasNames[ iAlias++ ]; } AliasValue = AliasName; while (*AliasValue) { if (*AliasValue == '=') { *AliasValue++ = '\0'; break; } else { AliasValue++; } } printf( " %-16s=%s\n", AliasName, AliasValue ); if (SortedAliasNames != NULL) { if (iAlias < nAliases) { AliasName = " "; } else { AliasName = ""; } } else { AliasName = AliasValue; while (*AliasName++) { ; } } } } else { fprintf( stderr, "ALIAS: unable to read aliases for %s.\n", ExeName ); rc = ERROR_ENVVAR_NOT_FOUND; } free( FreeMem2 ); if (SortedAliasNames != NULL) { free( SortedAliasNames ); } } if (SortedExeNames != NULL) { if (iExeName < nExeNames) { ExeName = " "; } else { ExeName = ""; } } else { while (*ExeName++) { ; } } } if (SortedExeNames != NULL) { free( SortedExeNames ); } if (FreeMem1) { free( FreeMem1 ); } return rc; } DWORD __cdecl main( int argc, char *argv[] ) { DWORD rc; char *s, *s1, *AliasName; char *ExeName; BOOL fDelete; BOOL DisplayAllAliases; ConvertAppToOem( argc,argv ); AliasName = NULL; ExeName = NULL; fVerbose = FALSE; fDelete = FALSE; DisplayAllAliases = TRUE; rc = NO_ERROR; while (rc == NO_ERROR && --argc) { s = *++argv; if (*s == '-' || *s == '/') { while (*++s) { switch( *s ) { case '?': case 'h': case 'H': usage(); break; case 'd': case 'D': fDelete = TRUE; break; case 'v': case 'V': fVerbose = TRUE; break; case 'p': case 'P': if (!--argc) { fprintf( stderr, "ALIAS: Argument to -p switch missing.\n" ); usage(); } if (ExeName != NULL) { free( ExeName ); ExeName = NULL; } s1 = *++argv; ExeName = calloc( 1, strlen( s1 )+2 ); if (ExeName) { strcpy( ExeName, s1 ); } break; case 'f': case 'F': if (!--argc) { fprintf( stderr, "ALIAS: Argument to -f switch missing.\n" ); usage(); } DisplayAllAliases = FALSE; rc = DoAliasFile( *++argv, ExeName ? ExeName : "CMD.EXE", fDelete ); break; default: fprintf( stderr, "ALIAS: invalid switch /%c\n", *s ); usage(); break; } } } else { DisplayAllAliases = FALSE; if (AliasName == NULL) { if (fDelete) { rc = DoAlias( s, NULL, ExeName ? ExeName : "CMD.EXE" ); } else { AliasName = s; } } else { if (fDelete) { rc = DoAlias( AliasName, NULL, ExeName ? ExeName : "CMD.EXE" ); AliasName = s; } else { rc = DoAlias( AliasName, s, ExeName ? ExeName : "CMD.EXE" ); AliasName = NULL; } } } } if (rc == NO_ERROR) { if (AliasName != NULL) { if (fDelete) { rc = DoAlias( AliasName, NULL, ExeName ? ExeName : "CMD.EXE" ); } else { rc = DisplayAlias( AliasName, ExeName ? ExeName : "CMD.EXE" ); } } else if (DisplayAllAliases) { rc = DisplayAliases( ExeName ); } } if (ExeName != NULL) { free( ExeName ); ExeName = NULL; } exit( rc ); return rc; }