diff options
Diffstat (limited to 'src/commands.c')
-rw-r--r-- | src/commands.c | 267 |
1 files changed, 267 insertions, 0 deletions
diff --git a/src/commands.c b/src/commands.c new file mode 100644 index 0000000..64ea3e3 --- /dev/null +++ b/src/commands.c @@ -0,0 +1,267 @@ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/types.h> +#include <sys/file.h> +#include <sys/stat.h> +#include <sys/errno.h> +#include <limits.h> +#include <unistd.h> +#include <time.h> + +#include <readline/readline.h> +#include <readline/history.h> + +#include <main.h> +#include <commands.h> +#include <completion.h> +#include <utils.h> + +/* Function which tells you that you can't do this. */ +void too_dangerous( char *caller ) +{ + fprintf( stderr, + "%s: Too dangerous for me to distribute. Write it yourself.\n", + caller ); +} + +/* Return non-zero if ARG is a valid argument for CALLER, else print + an error message and return zero. */ +int valid_argument( char *caller, char *arg ) +{ + if( !arg || !*arg ) + { + fprintf( stderr, "%s: Argument required.\n", caller ); + return( 0 ); + } + + return( 1 ); +} + +/* **************************************************************** */ +/* */ +/* SILA Shell Commands */ +/* */ +/* **************************************************************** */ + +/* String to pass to system (). This is for the LIST, VIEW and RENAME + commands. */ +static char syscom[PATH_MAX]; + +/* List the file(s) named in arg. */ +int com_ls( char *arg ) +{ + if( !arg ) + arg = ""; + + sprintf( syscom, "ls -FClg %s", arg ); + return( system( syscom ) ); +} + +int com_more( char *arg ) +{ + if( !valid_argument( "more", arg ) ) + return( 1 ); + + sprintf (syscom, "more %s", arg); + return( system( syscom ) ); +} + +int com_vi( char *arg ) +{ + if( !valid_argument( "vi", arg ) ) + return( 1 ); + + sprintf (syscom, "vi %s", arg); + return( system( syscom ) ); +} + +int com_rename( char *arg ) +{ + too_dangerous( "rename" ); + return( 1 ); +} + +int com_stat( char *arg ) +{ + struct stat finfo; + + if( !valid_argument( "stat", arg ) ) + return( 1 ); + + if( stat( arg, &finfo ) == -1 ) + { + perror( arg ); + return( 1 ); + } + + printf( "Statistics for `%s':\n", arg ); + + printf( "%s has %ld link%s, and is %ld byte%s in length.\n", arg, + finfo.st_nlink, + (finfo.st_nlink == 1) ? "" : "s", + finfo.st_size, + (finfo.st_size == 1) ? "" : "s"); + printf( "Inode Last Change at: %s", ctime( &finfo.st_ctime ) ); + printf( " Last access at: %s", ctime( &finfo.st_atime ) ); + printf( " Last modified at: %s", ctime( &finfo.st_mtime ) ); + return( 0 ); +} + +int com_delete( char *arg ) +{ + too_dangerous( "delete" ); + return( 1 ); +} + +/* Print out help for ARG, or for all of the commands if ARG is + not present. */ +int com_help( char *arg ) +{ + register int i; + int printed = 0; + + for( i = 0; current->list[i].name; ++i ) + { + if( !*arg || (strcmp( arg, current->list[i].name ) == 0) ) + { + printf( " %-12s\t- %s.\n", current->list[i].name, current->list[i].doc ); + printed++; + } + } + + if( printed ) + printf( "\n" ); + + if( !printed ) + { + printf( "No commands match `%s'. Possibilties are:\n", arg ); + + for( i = 0; current->list[i].name; ++i ) + { + /* Print in six columns. */ + if( printed == 6 ) + { + printed = 0; + printf( "\n" ); + } + + printf( "%s\t", current->list[i].name ); + printed++; + } + + if( printed ) + printf( "\n" ); + } + return( 0 ); +} + +/* Change to the directory ARG. */ +int com_cd( char *arg ) +{ + if( !strcmp( arg, "~" ) ) + { + arg = getenv( "HOME" ); + } + + if( chdir( arg ) == -1 ) + { + perror( arg ); + return( 1 ); + } + + com_pwd( "" ); + return( 0 ); +} + +/* Print out the current working directory. */ +int com_pwd( char *ignore ) +{ + char dir[PATH_MAX], *s; + + s = getcwd( dir, PATH_MAX ); + if( s == 0 ) + { + printf( "Error getting pwd: %s\n", dir ); + return( 1 ); + } + + printf( "Current directory is: %s\n", dir ); + return( 0 ); +} + +int com_ping( char *arg ) +{ + if( !valid_argument( "ping", arg ) ) + return( 1 ); + + sprintf (syscom, "ping %s", arg); + return( system( syscom ) ); +} + +int com_useradd( char *arg ) +{ + if( !valid_argument( "useradd", arg ) ) + return( 1 ); + + sprintf (syscom, "useradd %s", arg); + return( system( syscom ) ); +} + +int com_userdel( char *arg ) +{ + if( !valid_argument( "userdel", arg ) ) + return( 1 ); + + sprintf (syscom, "userdel %s", arg); + return( system( syscom ) ); +} + +int com_userlist( char *arg ) +{ + if( !arg ) arg = ""; + + sprintf (syscom, "cat /etc/passwd | cut -f1 -d':' %s", arg); + return( system( syscom ) ); +} + + +/* The user wishes to quit using this program. Just set DONE non-zero. */ +int com_quit( char *arg ) +{ + done = 1; + return( 0 ); +} + + + +int com_shell( char *arg ) +{ + if( !arg ) arg = ""; + + current = &shell; + + initialize_readline(); + return( 0 ); +} + +int com_users( char *arg ) +{ + if( !arg ) arg = ""; + + current = &users; + + initialize_readline(); + return( 0 ); +} + +int com_top( char *arg ) +{ + if( !arg ) arg = ""; + + current = ⊤ + + initialize_readline(); + return( 0 ); +} |