summaryrefslogtreecommitdiff
path: root/src/commands.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/commands.c')
-rw-r--r--src/commands.c267
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 = &top;
+
+ initialize_readline();
+ return( 0 );
+}