Files
haiku-beta6/src/kernel/apps/shell/commands.c
T
lillo f510e6ce60 posix signals support, 1st pass
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@1623 a95241bf-73f2-0310-859d-f6bbb57e9c96
2002-10-23 17:31:10 +00:00

223 lines
4.1 KiB
C

/*
** Copyright 2001, Travis Geiselbrecht. All rights reserved.
** Distributed under the terms of the NewOS License.
*/
#include <syscalls.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <errno.h>
#include "commands.h"
#include "file_utils.h"
#include "shell_defs.h"
struct command cmds[] = {
{"exec", &cmd_exec},
{"stat", &cmd_stat},
{"mkdir", &cmd_mkdir},
{"cat", &cmd_cat},
{"cd", &cmd_cd},
{"pwd", &cmd_pwd},
{"kill", &cmd_kill},
{"help", &cmd_help},
{NULL, NULL}
};
int cmd_exec(int argc, char *argv[])
{
return cmd_create_proc(argc - 1,argv+1);
}
int cmd_create_proc(int argc,char *argv[])
{
bool must_wait=true;
team_id pid;
int arg_len;
char *tmp;
char filename[SCAN_SIZE+1];
if(argc <1){
printf("not enough args to exec\n");
return 0;
}
tmp = argv[argc - 1];
if( !find_file_in_path(argv[0],filename,SCAN_SIZE)){
printf("can't find '%s' \n",argv[0]);
return 0;
}
// a hack to support the unix '&'
if(argc >= 1) {
arg_len = strlen(tmp);
if(arg_len > 0){
tmp += arg_len -1;
if(*tmp == '&'){
if(arg_len == 1){
argc --;
} else {
*tmp = 0;
}
must_wait = false;
}
}
}
pid = sys_create_team(filename,filename, argv, argc, NULL, 0, 5);
if(pid >= 0) {
int retcode;
if(must_wait) {
sys_wait_on_team(pid, &retcode);
}
} else {
printf("Error: cannot execute '%s'\n", filename);
return 0; // should be -1, but the shell would exit
}
return 0;
}
int cmd_mkdir(int argc, char *argv[])
{
int rc;
if (argc < 2) {
printf("not enough arguments to mkdir\n");
return 0;
}
rc = sys_create_dir(argv[1],0755);
if (rc < 0) {
printf("sys_mkdir() returned error: %s\n", strerror(rc));
} else {
printf("%s successfully created.\n", argv[1]);
}
return 0;
}
int cmd_cat(int argc, char *argv[])
{
int rc;
int fd;
char buf[257];
if(argc < 2) {
printf("not enough arguments to cat\n");
return 0;
}
fd = sys_open(argv[1], 0);
if(fd < 0) {
printf("cat: sys_open() returned error: %s!\n", strerror(fd));
goto done_cat;
}
for(;;) {
rc = sys_read(fd, -1, buf, sizeof(buf) -1);
if(rc <= 0)
break;
buf[rc] = '\0';
printf("%s", buf);
}
sys_close(fd);
done_cat:
return 0;
}
int cmd_cd(int argc, char *argv[])
{
int rc;
if (argc < 2) {
printf("not enough arguments to cd\n");
return 0;
}
rc = chdir(argv[1]);
if (rc < 0)
printf("cd: sys_setcwd() returned error: %s!\n", strerror(errno));
return 0;
}
int cmd_pwd(int argc, char *argv[])
{
char buffer[SYS_MAX_PATH_LEN];
if (getcwd(buffer, sizeof(buffer)) == NULL) {
printf("cd: sys_getcwd() returned error: %s!\n", strerror(errno));
return 0;
}
printf("%s\n", buffer);
return 0;
}
int cmd_stat(int argc, char *argv[])
{
int rc;
struct stat st;
if (argc < 2) {
printf("not enough arguments to stat\n");
return 0;
}
rc = stat(argv[1], &st);
if (rc >= 0) {
printf("stat of file '%s': \n", argv[1]);
printf("vnid 0x%x\n", (unsigned int)st.st_ino);
printf("type %d\n", st.st_type);
printf("size %d\n", (int)st.st_size);
} else
printf("stat failed for file '%s'\n", argv[1]);
return 0;
}
int cmd_kill(int argc, char *argv[])
{
int rc;
if (argc < 3) {
printf("not enough arguments to kill\n");
return 0;
}
rc = sys_kill(atoi(argv[2]), atoi(argv[1]));
if (rc)
printf("kill failed\n");
return 0;
}
int cmd_help(int argc, char *argv[])
{
printf("command list:\n\n");
printf("exit : quits this copy of the shell\n");
printf("exec <file> : load this file as a binary and run it\n");
printf("mkdir <path> : makes a directory at <path>\n");
printf("cd <path> : sets the current working directory at <path>\n");
printf("ls <path> : directory list of <path>. If no path given it lists the current dir\n");
printf("stat <file> : gives detailed file statistics of <file>\n");
printf("help : this command\n");
printf("cat <file> : dumps the file to stdout\n");
printf("mount <path> <device> <fsname> : tries to mount <device> at <path>\n");
printf("unmount <path> : tries to unmount at <path>\n");
printf("kill <sig> <tid> : sends signal <sig> to thread <tid>\n");
return 0;
}