ulib uprintf to pipe not termdev, ulib Add stringbuffer and linearlist, tb Capture subshell output
This commit is contained in:
@ -3,15 +3,27 @@
|
||||
|
||||
uint64_t PID;
|
||||
Dev_t ps2kbdev;
|
||||
Dev_t termdev;
|
||||
|
||||
void tb_runinitscript(void) {
|
||||
devctl(&termdev, DEVCTL_GET_HANDLE, (uint8_t *)DEV_TERMDEV, 0, 0);
|
||||
|
||||
char *tbargs[] = { "-m", "runfile", "-f", "base:/scripts/init.tb", "-logcmds", "yes" };
|
||||
int32_t tb = processctl(-1, PCTL_SPAWN, (uint64_t)"base:/bin/tb", (uint64_t)&tbargs, ARRLEN(tbargs));
|
||||
int32_t tb = processctl(-1, PCTL_SPAWN, (uint64_t)"base:/bin/tb", (uint64_t)(char **)tbargs, ARRLEN(tbargs));
|
||||
|
||||
processctl(tb, PCTL_RUN, 0, 0, 0);
|
||||
|
||||
while(processctl(tb, PCTL_POLLSTATE, 0, 0, 0) != 4) {
|
||||
int32_t r = devctl(&ps2kbdev, 0x00, NULL, 0, 0);
|
||||
int32_t r;
|
||||
|
||||
char buf[100];
|
||||
string_memset(buf, 0, sizeof(buf));
|
||||
r = ipcpipe(tb, IPCPIPE_OUT, IPCPIPE_READ, (uint8_t *)buf, sizeof(buf)-1);
|
||||
if (r > 0) {
|
||||
devctl(&termdev, 0x00, (uint8_t *)buf, string_len(buf), 0);
|
||||
}
|
||||
|
||||
r = devctl(&ps2kbdev, 0x00, NULL, 0, 0);
|
||||
if (r != E_NOTYET) {
|
||||
uint8_t b = r;
|
||||
ipcpipe(tb, IPCPIPE_IN, IPCPIPE_WRITE, &b, 1);
|
||||
|
@ -10,13 +10,19 @@ PID_t PID;
|
||||
|
||||
struct {
|
||||
char *modestr;
|
||||
enum { MODE_INTERACTIVE = 1, MODE_RUNFILE = 2 } mode;
|
||||
enum {
|
||||
MODE_INTERACTIVE = 1,
|
||||
MODE_RUNFILE = 2,
|
||||
MODE_RUNSTRING = 3,
|
||||
} mode;
|
||||
|
||||
char *filepath;
|
||||
|
||||
bool logcmds;
|
||||
|
||||
char *preloadpath;
|
||||
|
||||
char *runstring;
|
||||
} CONFIG;
|
||||
|
||||
static Arg ARGS[] = {
|
||||
@ -24,6 +30,7 @@ static Arg ARGS[] = {
|
||||
ARG("-f", ARG_STRING, &CONFIG.filepath),
|
||||
ARG("-logcmds", ARG_BOOL, &CONFIG.logcmds),
|
||||
ARG("-preload", ARG_STRING, &CONFIG.preloadpath),
|
||||
ARG("-rs", ARG_STRING, &CONFIG.runstring),
|
||||
ARG_END(),
|
||||
};
|
||||
|
||||
@ -40,6 +47,8 @@ void set_config(void) {
|
||||
CONFIG.mode = MODE_INTERACTIVE;
|
||||
} else if (string_strcmp(CONFIG.modestr, "runfile") == 0) {
|
||||
CONFIG.mode = MODE_RUNFILE;
|
||||
} else if (string_strcmp(CONFIG.modestr, "runstring") == 0) {
|
||||
CONFIG.mode = MODE_RUNSTRING;
|
||||
} else {
|
||||
LOG(LOG_ERR, "Unknown mode %s\n", CONFIG.modestr);
|
||||
}
|
||||
@ -142,7 +151,6 @@ void main(void) {
|
||||
set_config();
|
||||
|
||||
if (CONFIG.preloadpath != NULL) {
|
||||
LOG(LOG_INF, "Preloading script: %s\n", CONFIG.preloadpath);
|
||||
do_file(CONFIG.preloadpath);
|
||||
}
|
||||
|
||||
@ -154,5 +162,21 @@ void main(void) {
|
||||
return;
|
||||
}
|
||||
do_file(CONFIG.filepath);
|
||||
} else if (CONFIG.mode == MODE_RUNSTRING) {
|
||||
if (CONFIG.runstring == NULL) {
|
||||
uprintf("Run string is empty\n");
|
||||
return;
|
||||
}
|
||||
InterpResult *res;
|
||||
if (CONFIG.runstring[0] == '\'') {
|
||||
CONFIG.runstring[0] = ' ';
|
||||
}
|
||||
size_t len = string_len(CONFIG.runstring);
|
||||
if (CONFIG.runstring[len] == '\'') {
|
||||
CONFIG.runstring[len] = ' ';
|
||||
}
|
||||
if (!interp_runstring(CONFIG.runstring, &res, CONFIG.logcmds, false)) {
|
||||
LOG(LOG_ERR, "%s\n", res->errmsg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -52,8 +52,73 @@ bool rt_PID(Token *tks) {
|
||||
return true;
|
||||
}
|
||||
|
||||
bool rt_subsh(Token *tks) {
|
||||
bool ok = true;
|
||||
|
||||
char *prepended_args[] = { "-m", "runstring", "-preload", "base:/scripts/rc.tb", "-rs" };
|
||||
|
||||
#define SUBSH_MAX_STRING PROC_ARG_MAX
|
||||
char *s = umalloc(SUBSH_MAX_STRING);
|
||||
string_memset(s, 0, SUBSH_MAX_STRING);
|
||||
size_t cursor = 0;
|
||||
Token *argtk, *argtktmp;
|
||||
LL_FOREACH_SAFE(tks, argtk, argtktmp) {
|
||||
size_t len = string_len(argtk->str);
|
||||
string_memcpy(&s[cursor], argtk->str, len);
|
||||
cursor += len;
|
||||
s[cursor] = ' ';
|
||||
cursor++;
|
||||
}
|
||||
|
||||
char **args1 = umalloc(sizeof(char *) * (ARRLEN(prepended_args) + 1));
|
||||
for (size_t i = 0; i < ARRLEN(prepended_args); i++) {
|
||||
args1[i] = umalloc(PROC_ARG_MAX);
|
||||
string_memset(args1[i], 0, PROC_ARG_MAX);
|
||||
string_strcpy(args1[i], prepended_args[i]);
|
||||
}
|
||||
|
||||
args1[ARRLEN(prepended_args)] = umalloc(PROC_ARG_MAX);
|
||||
string_strcpy(args1[ARRLEN(prepended_args)], s);
|
||||
|
||||
int32_t app = processctl(-1, PCTL_SPAWN, (uint64_t)"base:/bin/tb", (uint64_t)args1, ARRLEN(prepended_args)+1);
|
||||
if (app < 0) {
|
||||
ok = false;
|
||||
goto done;
|
||||
}
|
||||
|
||||
StringBuffer outbuf;
|
||||
stringbuffer_init(&outbuf);
|
||||
|
||||
ipcpipe(PID, 10, IPCPIPE_MAKE, NULL, 0);
|
||||
ipcpipe(app, IPCPIPE_OUT, IPCPIPE_REPLACE, (uint8_t *)PID, 10);
|
||||
|
||||
processctl(app, PCTL_RUN, 0, 0, 0);
|
||||
|
||||
while (processctl(app, PCTL_POLLSTATE, 0, 0, 0) != 4) {
|
||||
int32_t r;
|
||||
char buf[100];
|
||||
string_memset(buf, 0, sizeof(buf));
|
||||
|
||||
r = ipcpipe(app, IPCPIPE_OUT, IPCPIPE_READ, (uint8_t *)buf, sizeof(buf)-1);
|
||||
stringbuffer_appendcstr(&outbuf, buf);
|
||||
}
|
||||
|
||||
ipcpipe(PID, 10, IPCPIPE_DELETE, NULL, 0);
|
||||
|
||||
stringbuffer_free(&outbuf);
|
||||
|
||||
done:
|
||||
for (size_t i = 0; i < ARRLEN(prepended_args)+1; i++) {
|
||||
ufree(args1[i]);
|
||||
}
|
||||
ufree(s);
|
||||
|
||||
return ok;
|
||||
}
|
||||
|
||||
void rt_init(void) {
|
||||
RTCMD("%print", &rt_print);
|
||||
RTCMD("%mkalias", &rt_mkalias);
|
||||
RTCMD("%PID", &rt_PID);
|
||||
RTCMD("%subsh", &rt_subsh);
|
||||
}
|
||||
|
Reference in New Issue
Block a user