1
0
Fork 0
src/Wip/nutshell/nutshell_builtins.c

105 lines
1.8 KiB
C
Raw Normal View History

2022-07-08 00:50:19 +00:00
#define NETHACK_NAME "nethack"
int builtin_builtin (int, char **);
2022-06-06 20:06:56 +00:00
int builtin_escape (int, char **);
int builtin_init (int, char **);
int builtin_jail (int, char **);
int builtin_nethack (int, char **);
int builtin_reassure (int, char **);
int builtin_status (int, char **);
struct {
char *name;
int (*f)(int, char **);
}builtins[] = {
2022-07-08 00:50:19 +00:00
/* guaranteed to exist */
{"builtin", builtin_builtin},
2022-06-06 20:06:56 +00:00
{"init", builtin_init},
2022-07-08 00:50:19 +00:00
/* optional additions */
{"escape", builtin_escape},
2022-06-06 20:06:56 +00:00
{"jail", builtin_jail},
{"nethack", builtin_nethack},
{"status", builtin_status}
};
2022-07-08 00:50:19 +00:00
int
isbuiltin(char *s){
int i;
2023-12-13 03:59:09 +00:00
for(i = 0; i < (sizeof builtins) / (sizeof *builtins); ++i)
2022-07-08 00:50:19 +00:00
if(strcmp(builtins[i].name, s) == 0)
return i + 1;
return 0;
}
int
builtin_builtin(int argc, char **argv){
int i;
if(argc < 2){
2023-12-13 03:59:09 +00:00
fprintf(stderr, "needs argument(s)\n");
2022-07-08 00:50:19 +00:00
return 1;
}
++argv;
while(*argv != NULL)
if(!isbuiltin(*argv))
return 1;
return 0;
}
2022-06-06 20:06:56 +00:00
int
builtin_escape(int argc, char **argv){
char *s;
if((s = getenv("SHELL")) == NULL){
2023-12-13 03:59:09 +00:00
fprintf(stdout, "$SHELL seems to be empty. This is an OS error.\n");
2022-06-06 20:06:56 +00:00
}else if(fork() == 0)
execl(s, s, NULL);
else
wait(NULL);
return 0;
}
int
builtin_init(int argc, char **argv){
2022-07-08 00:50:19 +00:00
srand(time(NULL));
2022-06-06 20:06:56 +00:00
return 0;
}
int
builtin_jail(int argc, char **argv){
printf("%s\n", argv[1]);
if(argv[1] == NULL)
2023-12-13 03:59:09 +00:00
fprintf(stdout, "%d", state.jailed);
2022-06-06 20:06:56 +00:00
else if(strcmp(argv[1], "break") == 0 || strcmp(argv[1], "build") == 0)
state.jailed = (argv[1][1] - 'r') / ('u' - 'r'); /* cheap */
else
return 1;
return 0;
}
int
builtin_nethack(int argc, char **argv){
2022-07-08 00:50:19 +00:00
static char *nethack_name = NETHACK_NAME;
2022-06-06 20:06:56 +00:00
char *a[2];
2022-07-08 00:50:19 +00:00
2022-06-06 20:06:56 +00:00
if(fork() == 0){
a[0] = nethack_name;
a[1] = NULL;
execvp("nethack", a);
}else
wait(NULL);
return 0;
}
int
builtin_status(int argc, char **argv){
2023-12-13 03:59:09 +00:00
fprintf(stdout, "%d", state.status);
2022-06-06 20:06:56 +00:00
return 0;
}