Renamed thread/team syscalls to new scheme.

Code cleanup.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@6885 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler 2004-03-03 01:14:49 +00:00
parent 5d83d63c08
commit 663bccf7f9
4 changed files with 217 additions and 203 deletions

View File

@ -27,12 +27,16 @@ struct command cmds[] = {
{NULL, NULL}
};
int cmd_exec(int argc, char *argv[])
int
cmd_exec(int argc, char *argv[])
{
return cmd_create_proc(argc - 1,argv+1);
}
int cmd_create_proc(int argc,char *argv[])
int
cmd_create_proc(int argc,char *argv[])
{
bool must_wait=true;
team_id pid;
@ -41,7 +45,7 @@ int cmd_create_proc(int argc,char *argv[])
char *tmp;
char filename[SCAN_SIZE+1];
if(argc <1){
if (argc < 1) {
printf("not enough args to exec\n");
return 0;
}
@ -70,13 +74,10 @@ int cmd_create_proc(int argc,char *argv[])
}
}
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);
}
pid = _kern_create_team(filename,filename, argv, argc, NULL, 0, 5);
if (pid >= 0) {
if (must_wait)
_kern_wait_for_team(pid, NULL);
} else {
printf("Error: cannot execute '%s'\n", filename);
return 0; // should be -1, but the shell would exit
@ -85,7 +86,9 @@ int cmd_create_proc(int argc,char *argv[])
return 0;
}
int cmd_mkdir(int argc, char *argv[])
int
cmd_mkdir(int argc, char *argv[])
{
int rc;
@ -104,38 +107,42 @@ int cmd_mkdir(int argc, char *argv[])
return 0;
}
int cmd_cat(int argc, char *argv[])
int
cmd_cat(int argc, char *argv[])
{
int rc;
int fd;
char buf[257];
if(argc < 2) {
if (argc < 2) {
printf("not enough arguments to cat\n");
return 0;
}
fd = sys_open(argv[1], 0);
if(fd < 0) {
fd = 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)
rc = read_pos(fd, -1, buf, sizeof(buf) - 1);
if (rc <= 0)
break;
buf[rc] = '\0';
printf("%s", buf);
}
sys_close(fd);
close(fd);
done_cat:
return 0;
}
int cmd_cd(int argc, char *argv[])
int
cmd_cd(int argc, char *argv[])
{
int rc;
@ -151,7 +158,9 @@ int cmd_cd(int argc, char *argv[])
return 0;
}
int cmd_pwd(int argc, char *argv[])
int
cmd_pwd(int argc, char *argv[])
{
char buffer[SYS_MAX_PATH_LEN];
@ -165,7 +174,9 @@ int cmd_pwd(int argc, char *argv[])
return 0;
}
int cmd_stat(int argc, char *argv[])
int
cmd_stat(int argc, char *argv[])
{
int rc;
struct stat st;
@ -187,7 +198,9 @@ int cmd_stat(int argc, char *argv[])
return 0;
}
int cmd_kill(int argc, char *argv[])
int
cmd_kill(int argc, char *argv[])
{
int rc;
@ -195,13 +208,15 @@ int cmd_kill(int argc, char *argv[])
printf("not enough arguments to kill\n");
return 0;
}
rc = sys_send_signal(atoi(argv[2]), atoi(argv[1]));
rc = send_signal(atoi(argv[2]), atoi(argv[1]));
if (rc)
printf("kill failed\n");
return 0;
}
int cmd_help(int argc, char *argv[])
int
cmd_help(int argc, char *argv[])
{
printf("command list:\n\n");
printf("exit : quits this copy of the shell\n");
@ -219,4 +234,3 @@ int cmd_help(int argc, char *argv[])
return 0;
}

View File

@ -1,4 +1,3 @@
//#include <types.h>
#include <string.h>
#include <ctype.h>
#include <syscalls.h>
@ -6,12 +5,15 @@
#include <stdlib.h>
#include <Errors.h>
#include <fcntl.h>
#include <unistd.h>
#include "file_utils.h"
#include "statements.h"
#include "shell_defs.h"
bool combine_path(const char *path1,const char *path2,char *out,unsigned int max_len)
bool
combine_path(const char *path1,const char *path2,char *out,unsigned int max_len)
{
unsigned int cur_len = 0;
@ -27,61 +29,74 @@ bool combine_path(const char *path1,const char *path2,char *out,unsigned int max
cur_len++;
}
}
if(strlen(path2)+cur_len > max_len) return false;
if (strlen(path2)+cur_len > max_len)
return false;
strcat(out,path2);
return true;
}
bool exists_file(const char *file_name)
bool
exists_file(const char *file_name)
{
int handle = sys_open(file_name,0);
int handle = open(file_name, 0);
bool exists;
exists =( handle >= 0);
if(exists) sys_close(handle);
exists = (handle >= 0);
if (exists)
close(handle);
return exists;
}
bool find_file_in_path(const char *file_name,char *found_name,unsigned int max_size)
{
char path[SCAN_SIZE+1];
int cnt=0;
if(strchr(file_name,'/') != NULL){
bool
find_file_in_path(const char *file_name, char *found_name, unsigned int max_size)
{
char path[SCAN_SIZE + 1];
int cnt = 0;
if (strchr(file_name, '/') != NULL) {
strncpy(found_name,file_name,max_size);
found_name[max_size] = 0;
if(exists_file(found_name)) return true;
if (exists_file(found_name))
return true;
found_name[0] = 0;
return false;
}
while(get_path(cnt,path,SCAN_SIZE)){
if(combine_path(path,file_name,found_name,max_size)){
if(exists_file(found_name)) return true;
while (get_path(cnt, path, SCAN_SIZE)) {
if (combine_path(path, file_name, found_name, max_size)) {
if (exists_file(found_name))
return true;
}
cnt++;
}
found_name[0] =0;
return(false);
found_name[0] = 0;
return false;
}
int exec_file(int argc,char *argv[],int *retcode)
int
exec_file(int argc, char *argv[], int *retcode)
{
char filename[255];
int pid;
if( !find_file_in_path(argv[0],filename,SCAN_SIZE)) return SHE_FILE_NOT_FOUND;
if (!find_file_in_path(argv[0], filename, SCAN_SIZE))
return SHE_FILE_NOT_FOUND;
pid = sys_create_team(filename,filename, argv, argc, NULL, 0, 5);
pid = _kern_create_team(filename, filename, argv, argc, NULL, 0, 5);
if (pid < 0)
return SHE_CANT_EXECUTE;
if(pid < 0) return SHE_CANT_EXECUTE;
sys_wait_on_team(pid, retcode);
_kern_wait_for_team(pid, retcode);
return SHE_NO_ERROR;
}
int read_file_in_buffer(const char *filename,char **buffer)
int
read_file_in_buffer(const char *filename,char **buffer)
{
struct stat stat;
int file_no;
@ -102,9 +117,9 @@ int read_file_in_buffer(const char *filename,char **buffer)
if (*buffer == NULL)
return ENOMEM;
size = sys_read(file_no, 0, *buffer, stat.st_size);
size = read(file_no, *buffer, stat.st_size);
sys_close(file_no);
close(file_no);
if (size < 0)
free(*buffer);

View File

@ -19,7 +19,8 @@
#include "shell_history.h"
static int readline(char *buf, int len)
static int
readline(char *buf, int len)
{
int i = 0;
char ch;
@ -64,7 +65,8 @@ static int readline(char *buf, int len)
}
int main(int argc, char *argv[])
int
main(int argc, char *argv[])
{
char buf[1024];
@ -75,7 +77,7 @@ int main(int argc, char *argv[])
if (af_script_file_name) {
run_script(af_script_file_name);
if (af_exit_after_script)
sys_exit(0);
exit(0);
}
printf("Welcome to the OpenBeOS shell\n");
@ -86,9 +88,8 @@ int main(int argc, char *argv[])
printf("$ ");
chars_read = readline(buf, sizeof(buf));
if (chars_read > 0) {
if (chars_read > 0)
parse_string(buf);
}
}
printf("shell exiting\n");

View File

@ -24,109 +24,96 @@ typedef struct _oper_level oper_level;
#define MAX_LEVEL 3
oper_level oper_levels[]=
{{SVO_EQUAL,3}
,{SVO_LESS,3}
,{SVO_LESS_E,3}
,{SVO_BIGGER,3}
,{SVO_BIGGER_E,3}
,{SVO_NOT_EQUAL,3}
,{SVO_ADD,2}
,{SVO_SUB,2}
,{SVO_MUL,1}
,{SVO_DIV,1}
,{0,-1}
oper_level oper_levels[] = {
{SVO_EQUAL,3},
{SVO_LESS,3},
{SVO_LESS_E,3},
{SVO_BIGGER,3},
{SVO_BIGGER_E,3},
{SVO_NOT_EQUAL,3},
{SVO_ADD,2},
{SVO_SUB,2},
{SVO_MUL,1},
{SVO_DIV,1},
{0,-1}
};
static int get_oper_level(int oper)
static int
get_oper_level(int oper)
{
int cnt = 0;
while((oper_levels[cnt].level != 0) && (oper_levels[cnt].sym_code != oper)) cnt++;
while ((oper_levels[cnt].level != 0) && (oper_levels[cnt].sym_code != oper))
cnt++;
return oper_levels[cnt].level;
}
static int parse_neg(scan_info *info,shell_value **out)
static int
parse_neg(scan_info *info,shell_value **out)
{
int err;
bool do_neg = false;
if(info->sym_code == SVO_SUB){
if (info->sym_code == SVO_SUB){
do_neg = true;
if(scan(info)) return SHE_SCAN_ERROR;
if (scan(info))
return SHE_SCAN_ERROR;
}
err = parse_value(info,out);
if(err != SHE_NO_ERROR) return err;
if(do_neg){
if (err != SHE_NO_ERROR)
return err;
if (do_neg) {
err = shell_value_neg(*out);
if(err != SHE_NO_ERROR) {
if (err != SHE_NO_ERROR) {
shell_value_free(*out);
*out = NULL;
}
}
return err;
}
static int parse_oper(scan_info *info,shell_value **out,int level)
static int
parse_oper(scan_info *info,shell_value **out,int level)
{
int err;
int oper_code;
shell_value *other;
if (level > 1)
err = parse_oper(info, out, level - 1);
else
err = parse_neg(info, out);
if(level > 1){
err = parse_oper(info,out,level - 1);
} else {
err = parse_neg(info,out);
}
if(err != SHE_NO_ERROR) return err;
if (err != SHE_NO_ERROR)
return err;
oper_code = info->sym_code;
while(get_oper_level(info->sym_code) == level){
if(scan(info)){
while (get_oper_level(info->sym_code) == level) {
if (scan(info)) {
err = SHE_SCAN_ERROR;
goto err;
}
if(level > 1){
if (level > 1)
err = parse_oper(info,&other,level - 1);
} else {
else
err = parse_neg(info,&other);
}
if (err != SHE_NO_ERROR)
goto err;
if(err != SHE_NO_ERROR) goto err;
err = shell_value_do_operation(*out,other,oper_code);
if(err != SHE_NO_ERROR) goto err_2;
err = shell_value_do_operation(*out,other,oper_code);
if (err != SHE_NO_ERROR)
goto err_2;
shell_value_free(other);
}
return SHE_NO_ERROR;
@ -142,56 +129,57 @@ err:
}
static int parse_expr(scan_info *info,shell_value **out)
static int
parse_expr(scan_info *info,shell_value **out)
{
(*out) = NULL;
return parse_oper(info,out,MAX_LEVEL);
}
static int parse_cast(scan_info * info,shell_value **out)
static int
parse_cast(scan_info * info,shell_value **out)
{
int err;
long int dummy;
char *text;
bool to_number = info->sym_code == SVO_NUMBER_CAST;
if(scan(info)) return SHE_SCAN_ERROR;
if (scan(info))
return SHE_SCAN_ERROR;
err = parse_rvl_expr(info,out);
if(err != SHE_NO_ERROR) return err;
if (err != SHE_NO_ERROR)
return err;
//place cast in shell_vars=>change type direct
if(to_number){
// place cast in shell_vars=>change type direct
if (to_number) {
err = shell_value_to_number(*out,&dummy);
if(err != SHE_NO_ERROR) goto err;
if (err != SHE_NO_ERROR)
goto err;
err = shell_value_set_number(*out,dummy);
if(err != SHE_NO_ERROR) goto err;
if (err != SHE_NO_ERROR)
goto err;
} else {
text = shell_value_to_char(*out);
err = shell_value_set_text(*out,text);
free(text);
}
return SHE_NO_ERROR;
return SHE_NO_ERROR;
err:
shell_value_free(*out);
*out = NULL;
return err;
}
static int parse_value(scan_info *info,shell_value **out)
static int
parse_value(scan_info *info,shell_value **out)
{
char buf2[SCAN_SIZE+1];
int err = SHE_NO_ERROR;
@ -200,10 +188,8 @@ static int parse_value(scan_info *info,shell_value **out)
*out = NULL;
switch(info->sym_code){
switch (info->sym_code){
case SVO_DQ_STRING:
parse_vars_in_string(info->token,buf2,SCAN_SIZE);
*out = shell_value_init_text(buf2);
break;
@ -214,7 +200,6 @@ static int parse_value(scan_info *info,shell_value **out)
break;
case SVO_SQ_STRING:
*out = shell_value_init_text(info->token);
break;
@ -229,118 +214,110 @@ static int parse_value(scan_info *info,shell_value **out)
case SVO_PARENL:
err = parse_rvl_expr(info,out);
if(err) return err;
if (err)
return err;
break;
case SVO_DOLLAR:
if(scan(info)) return SHE_SCAN_ERROR;
if(info->sym_code == SVO_IDENT){
value =get_value_by_name(info->token);
if(value != NULL){
if (scan(info))
return SHE_SCAN_ERROR;
if (info->sym_code == SVO_IDENT) {
value = get_value_by_name(info->token);
if (value != NULL)
*out = shell_value_clone(value);
} else {
else
*out = shell_value_init_text("");
}
} else {
} else
err = SVO_IDENT;
}
break;
default:
return SHE_PARSE_ERROR;
}
if(err == SHE_NO_ERROR){
if(scan(info)){
if(*out != NULL) shell_value_free(*out);
return SHE_SCAN_ERROR;
if (err == SHE_NO_ERROR) {
if (scan(info)) {
if (*out != NULL)
shell_value_free(*out);
return SHE_SCAN_ERROR;
}
if(*out == NULL) err = SHE_NO_MEMORY;
if (*out == NULL)
err = SHE_NO_MEMORY;
}
return err;
}
static int handle_exit(scan_info *info)
static int
handle_exit(scan_info *info)
{
long int exit_value = 0;
int err = SHE_NO_ERROR;
shell_value *expr;
if(info->sym_code == SVO_PARENL){
if (info->sym_code == SVO_PARENL) {
if (scan(info))
return SHE_SCAN_ERROR;
if(scan(info)) return SHE_SCAN_ERROR;
err = parse_expr(info, &expr);
if (err != SHE_NO_ERROR)
return err;
err = parse_expr(info,&expr);
if(err != SHE_NO_ERROR) return err;
if(!(expr->isnumber)){
if (!(expr->isnumber)) {
err = SHE_INVALID_TYPE;
goto err;
}
err = shell_value_get_number(expr,&exit_value);
if(err != SHE_NO_ERROR) goto err;
err = shell_value_get_number(expr, &exit_value);
if (err != SHE_NO_ERROR)
goto err;
if(expect(info,SVO_PARENR)){
if (expect(info, SVO_PARENR)) {
err = SVO_PARENR;
goto err;
}
}
sys_exit(exit_value);
exit(exit_value);
err:
shell_value_free(expr);
return err;
}
static int parse_rvl_expr(scan_info *info,shell_value **out)
static int
parse_rvl_expr(scan_info *info,shell_value **out)
{
int err = SHE_NO_ERROR;
*out = NULL;
if(expect(info,SVO_PARENL)) return SVO_PARENL;
if (expect(info, SVO_PARENL))
return SVO_PARENL;
err = parse_expr(info,out);
if(err != SHE_NO_ERROR) return err;
if(expect(info,SVO_PARENR)) {
err = parse_expr(info, out);
if (err != SHE_NO_ERROR)
return err;
if (expect(info, SVO_PARENR)) {
err = SVO_PARENR;
goto err;
}
return SHE_NO_ERROR;
err:
shell_value_free(*out);
return err;
}
static int handle_if(scan_info *info)
static int
handle_if(scan_info *info)
{
int err = SHE_NO_ERROR;
long int value;
@ -348,19 +325,20 @@ static int handle_if(scan_info *info)
shell_value *expr;
err = parse_rvl_expr(info,&expr);
if(err != SHE_NO_ERROR) return err;
if(!expr->isnumber){
if (err != SHE_NO_ERROR)
return err;
if (!expr->isnumber) {
err = SHE_INVALID_TYPE;
goto err;
}
err = shell_value_get_number(expr,&value);
if(err != SHE_NO_ERROR) goto err;
if (err != SHE_NO_ERROR)
goto err;
if(value != 0) err = parse_info(info);
if (value != 0)
err = parse_info(info);
err:
shell_value_free(expr);
@ -372,7 +350,8 @@ err:
// Parse exec function
//
static int handle_exec(scan_info *info,shell_value **out)
static int
handle_exec(scan_info *info,shell_value **out)
{
shell_value *state;
int argc;
@ -385,19 +364,22 @@ static int handle_exec(scan_info *info,shell_value **out)
*out = NULL;
if(scan(info)) return SHE_SCAN_ERROR;
if (scan(info))
return SHE_SCAN_ERROR;
err = parse_rvl_expr(info,&state);
if(err != SHE_NO_ERROR) return err;
err = parse_rvl_expr(info, &state);
if (err != SHE_NO_ERROR)
return err;
err = shell_value_get_text(state,&statement);
if(err != SHE_NO_ERROR) return err;
err = shell_value_get_text(state, &statement);
if (err != SHE_NO_ERROR)
return err;
argc = parse_line(statement,argv,64,redirect_in,redirect_out);
argc = parse_line(statement, argv, 64, redirect_in, redirect_out);
err = exec_file(argc, argv, &retcode);
err = exec_file(argc,argv,&retcode);
if(err != SHE_NO_ERROR) goto err;
if (err != SHE_NO_ERROR)
goto err;
*out = shell_value_init_number(retcode);
@ -406,11 +388,13 @@ err:
return err;
}
//
// Parse load statement
//
static int handle_load(scan_info *info)
static int
handle_load(scan_info *info)
{
char var_name[SCAN_SIZE+1];
shell_value *value;