#include #include "defs.h" #define ERRMSG(p) fprintf(stderr,"%s: "p"\n",Argv[0]) enum { SUCCESS, FAILURE }; /* DO NOT CHANGE THIS LINE */ static void Assign( int Argc, char *Argv[ ] ) { char *ArgPtr; if( Argc != 1 ) ERRMSG( "Too many args" ); else if( ( ArgPtr = strdup( Argv[ 0 ] ) ) == NULL || putenv( ArgPtr ) ) ERRMSG( "Can't assign" ); } static void Set( int Argc, char *Argv[ ] ) { extern char **environ; /* pointer to the environment */ int i, ArgLen; char *ArgPtr; for( i = 0; environ[ i ] != NULL; i++ ) printf( "%s\n", environ[ i ] ); } int Builtin( FullCommand *Buf ) { char *Path; int Argc = 0; char **Argv = Buf->Commands[ 0 ]; while( Argv[ Argc ] != NULL ) Argc++; if( Argc == 0 ) return FAILURE; if( strchr( Argv[ 0 ], '=' ) != NULL ) Assign( Argc, Argv ); else if( strcmp( Argv[ 0 ], "set") == 0 ) Set( Argc, Argv ); else if( strcmp( Argv[ 0 ], "cd") == 0 ) { if( Argc > 1 ) Path = Argv[ 1 ]; else if( ( Path = getenv( "HOME" ) ) == NULL ) Path = "."; if( chdir( Path ) == -1 ) ERRMSG( "Can't change directories" ); } else return FAILURE; if( Buf->NumPipes || Buf->InFile[0] != '\0' || Buf->OutFile[0] != '\0' ) ERRMSG( "Illegal redirect or pipeline" ); return SUCCESS; }