Compare commits
3 commits
18b32f088e
...
34c54640a5
| Author | SHA1 | Date | |
|---|---|---|---|
| 34c54640a5 | |||
| d968c87dc5 | |||
| f42c0eaf28 |
9 changed files with 228 additions and 51 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -0,0 +1 @@
|
|||
*.swp
|
||||
9
build.sh
9
build.sh
|
|
@ -1,4 +1,5 @@
|
|||
#!/usr/bin/env bash
|
||||
set -x
|
||||
|
||||
test "$1" = "--edit" && {
|
||||
EDIT="-ti -v $PWD/edit.sh:/root/edit.sh --entrypoint bash"
|
||||
|
|
@ -10,10 +11,12 @@ test -d dist || mkdir dist
|
|||
test -d cache || mkdir cache
|
||||
rm -rf cache/*
|
||||
|
||||
docker images | grep buildroot || docker build -t buildroot .
|
||||
OCI=$(which podman || which docker)
|
||||
|
||||
docker run \
|
||||
--rm \
|
||||
$OCI images | grep buildroot || $OCI build -t buildroot .
|
||||
|
||||
#$OCI --conmon /usr/bin/false run \
|
||||
$OCI run \
|
||||
--name build-v86 \
|
||||
-v $PWD/dist:/build \
|
||||
-v $PWD/buildroot-v86/:/buildroot-v86 ${EDIT} \
|
||||
|
|
|
|||
|
|
@ -1,3 +1,2 @@
|
|||
source "$BR2_EXTERNAL_v86_PATH/package/nled/Config.in"
|
||||
source "$BR2_EXTERNAL_v86_PATH/package/execfuse/Config.in"
|
||||
source "$BR2_EXTERNAL_v86_PATH/package/fusescript/Config.in"
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ help_tips(){
|
|||
echo 'paste text ' "ctrl/cmd+shift+v'"
|
||||
echo 'paste text to file ' "ctrl/cmd+v'"
|
||||
echo 'import file to scene ' "drag-drop file or ctrl/cmd+v or type 'upload'"
|
||||
echo 'import remote URL ' "type 'require <https://foo.org/scene.glb>'"
|
||||
echo 'import remote URL ' "type 'require <https://xrfragment.org/index.glb>'"
|
||||
echo 'reset scene & shell ' "type 'reset'"
|
||||
echo 'js run ' "type 'js 'alert(\"hello\")'"
|
||||
echo 'js console.log: ' "type 'console document.baseURI"
|
||||
|
|
@ -63,24 +63,14 @@ alias ls='ls -ha -w100'
|
|||
# interactive login
|
||||
which screen &> /dev/null && {
|
||||
[[ -t 0 ]] && {
|
||||
eval $(resize) # important
|
||||
printf "\r" # weird but needed
|
||||
test -n "$STY" || {
|
||||
resize # call twice
|
||||
resize # otherwise COLUMNS/ROWS is 0
|
||||
# resize # call twice
|
||||
# resize # otherwise COLUMNS/ROWS is 0
|
||||
# # add URL-hash as extra screen session
|
||||
# test -z "$HASH" || {
|
||||
# grep 'screen -t #' /root/.screenrc || {
|
||||
# echo "screen -t xrsh+URL 3 /bin/sh -c 'source /etc/profile.sh; ${HASH}; sh'" | sed "s/'#/'/g" >> /root/.screenrc
|
||||
# }
|
||||
# }
|
||||
# execute URL hash or GNU screen
|
||||
test -n "$HASH" && hook URI/fragment "${HASH:1}"
|
||||
test -z "$HASH" && screen -Aa -R -T screen-256color -c /root/.screenrc
|
||||
}
|
||||
test -n "$STY" && {
|
||||
resize # call twice
|
||||
resize # otherwise COLUMNS/ROWS is 0
|
||||
test -f /root/motd && cat /root/motd || cat /etc/motd;
|
||||
say "welcome to eex r, shell. For an optimal user experience, connect a Bluetooth keyboard." &
|
||||
}
|
||||
|
|
|
|||
|
|
@ -47,7 +47,7 @@ test -d /dev/browser || {
|
|||
stty raw < /dev/ttyS1
|
||||
mkfifo /var/run/ttyS1
|
||||
cat /dev/ttyS1 > /var/run/ttyS1 &
|
||||
/bin/sh < /var/run/ttyS1
|
||||
/bin/sh < /var/run/ttyS1 > /var/run/ttyS1
|
||||
}
|
||||
|
||||
setup_listen_homedir(){
|
||||
|
|
|
|||
|
|
@ -1,6 +1,12 @@
|
|||
#!/bin/sh
|
||||
source /etc/profile.sh # expose xrsh cmds like require etc
|
||||
|
||||
if [[ "$1" =~ pos=|t= ]] then
|
||||
# we are dealing with XR or Media Fragments
|
||||
exit # ignore for now
|
||||
fi
|
||||
|
||||
# otherwise execute
|
||||
echo "" # clear line
|
||||
$* # simply execute
|
||||
echo "$*" >> /tmp/frag.log
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# JOA
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Busybox version: 1.36.1
|
||||
# Mon Dec 30 10:23:26 2024
|
||||
# Thu Jan 9 11:13:11 2025
|
||||
#
|
||||
CONFIG_HAVE_DOT_CONFIG=y
|
||||
|
||||
|
|
@ -1210,14 +1210,14 @@ CONFIG_FEATURE_SH_EMBEDDED_SCRIPTS=y
|
|||
#
|
||||
# System Logging Utilities
|
||||
#
|
||||
CONFIG_KLOGD=y
|
||||
CONFIG_FEATURE_KLOGD_KLOGCTL=y
|
||||
# CONFIG_KLOGD is not set
|
||||
# CONFIG_FEATURE_KLOGD_KLOGCTL is not set
|
||||
CONFIG_LOGGER=y
|
||||
# CONFIG_LOGREAD is not set
|
||||
# CONFIG_FEATURE_LOGREAD_REDUCED_LOCKING is not set
|
||||
CONFIG_SYSLOGD=y
|
||||
CONFIG_FEATURE_ROTATE_LOGFILE=y
|
||||
CONFIG_FEATURE_REMOTE_LOG=y
|
||||
# CONFIG_FEATURE_REMOTE_LOG is not set
|
||||
# CONFIG_FEATURE_SYSLOGD_DUP is not set
|
||||
# CONFIG_FEATURE_SYSLOGD_CFG is not set
|
||||
# CONFIG_FEATURE_SYSLOGD_PRECISE_TIMESTAMPS is not set
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
// SPDX: GPL-3.0-or-later
|
||||
#define FUSE_USE_VERSION 35
|
||||
|
||||
#include <fuse3/fuse.h>
|
||||
|
|
@ -8,32 +9,86 @@
|
|||
#include <unistd.h>
|
||||
|
||||
static const char *script_path;
|
||||
static int use_serial = 0;
|
||||
static char serial_device[256];
|
||||
static const char *END_TOKEN = "\0\0\0";
|
||||
|
||||
static int call_script(const char *action, const char *path, char **output) {
|
||||
char command[4096];
|
||||
FILE *fp;
|
||||
|
||||
snprintf(command, sizeof(command), "%s %s '%s'", script_path, action, path);
|
||||
fp = popen(command, "r");
|
||||
if (!fp) {
|
||||
static int call_script_serial(const char *command, char **output) {
|
||||
int fd = open(serial_device, O_RDWR | O_NOCTTY);
|
||||
if (fd < 0) {
|
||||
perror("open serial device");
|
||||
return -errno;
|
||||
}
|
||||
|
||||
// Write the command to the serial device
|
||||
size_t command_len = strlen(command);
|
||||
if (write(fd, command, command_len) != command_len) {
|
||||
perror("write to serial");
|
||||
close(fd);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
// Read the response
|
||||
size_t size = 0;
|
||||
*output = NULL;
|
||||
char line[1024];
|
||||
while (fgets(line, sizeof(line), fp)) {
|
||||
size_t len = strlen(line);
|
||||
*output = realloc(*output, size + len + 1);
|
||||
memcpy(*output + size, line, len);
|
||||
size += len;
|
||||
char buffer[1024];
|
||||
ssize_t bytes_read;
|
||||
|
||||
while ((bytes_read = read(fd, buffer, sizeof(buffer))) > 0) {
|
||||
*output = realloc(*output, size + bytes_read + 1);
|
||||
memcpy(*output + size, buffer, bytes_read);
|
||||
size += bytes_read;
|
||||
|
||||
if (size >= 3 && memcmp(*output + size - 3, END_TOKEN, 3) == 0) {
|
||||
size -= 3; // Remove the END_TOKEN
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (bytes_read < 0) {
|
||||
perror("read from serial");
|
||||
free(*output);
|
||||
close(fd);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (*output) {
|
||||
(*output)[size] = '\0';
|
||||
}
|
||||
|
||||
return pclose(fp);
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int call_script(const char *action, const char *path, char **output) {
|
||||
char command[4096];
|
||||
|
||||
snprintf(command, sizeof(command), "%s %s '%s'", script_path, action, path);
|
||||
|
||||
if (use_serial) {
|
||||
return call_script_serial(command, output);
|
||||
} else {
|
||||
FILE *fp = popen(command, "r");
|
||||
if (!fp) {
|
||||
return -errno;
|
||||
}
|
||||
|
||||
size_t size = 0;
|
||||
*output = NULL;
|
||||
char line[1024];
|
||||
while (fgets(line, sizeof(line), fp)) {
|
||||
size_t len = strlen(line);
|
||||
*output = realloc(*output, size + len + 1);
|
||||
memcpy(*output + size, line, len);
|
||||
size += len;
|
||||
}
|
||||
|
||||
if (*output) {
|
||||
(*output)[size] = '\0';
|
||||
}
|
||||
|
||||
return pclose(fp);
|
||||
}
|
||||
}
|
||||
|
||||
static int fusescript_getattr(const char *path, struct stat *stbuf, struct fuse_file_info *fi) {
|
||||
|
|
@ -103,11 +158,6 @@ static int fusescript_readdir(const char *path, void *buf, fuse_fill_dir_t fille
|
|||
(void) fi;
|
||||
(void) flags;
|
||||
|
||||
if (strcmp(path, "/") != 0) {
|
||||
// If the path is not the root, return an error
|
||||
return -ENOENT;
|
||||
}
|
||||
|
||||
// Add default entries for directories
|
||||
filler(buf, ".", NULL, 0, 0); // Current directory
|
||||
filler(buf, "..", NULL, 0, 0); // Parent directory
|
||||
|
|
@ -188,6 +238,112 @@ static int fusescript_rmdir(const char *path) {
|
|||
return ret == 0 ? 0 : -EIO;
|
||||
}
|
||||
|
||||
// Add getxattr function
|
||||
static int fusescript_getxattr(const char *path, const char *name, char *value, size_t size) {
|
||||
char command[4096];
|
||||
snprintf(command, sizeof(command), "%s getxattr '%s' '%s'", script_path, path, name);
|
||||
|
||||
FILE *fp = popen(command, "r");
|
||||
if (!fp) {
|
||||
return -errno;
|
||||
}
|
||||
|
||||
char *output = NULL;
|
||||
size_t output_len = 0;
|
||||
char line[1024];
|
||||
while (fgets(line, sizeof(line), fp)) {
|
||||
size_t len = strlen(line);
|
||||
output = realloc(output, output_len + len + 1);
|
||||
memcpy(output + output_len, line, len);
|
||||
output_len += len;
|
||||
}
|
||||
|
||||
if (output) {
|
||||
output[output_len] = '\0';
|
||||
}
|
||||
|
||||
int ret = pclose(fp);
|
||||
if (ret != 0 || !output) {
|
||||
free(output);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (size == 0) {
|
||||
// Return the size of the required buffer
|
||||
free(output);
|
||||
return output_len;
|
||||
} else if (size < output_len) {
|
||||
// Buffer too small
|
||||
free(output);
|
||||
return -ERANGE;
|
||||
}
|
||||
|
||||
// Copy the attribute value
|
||||
memcpy(value, output, output_len);
|
||||
free(output);
|
||||
return output_len;
|
||||
}
|
||||
|
||||
// Add setxattr function
|
||||
static int fusescript_setxattr(const char *path, const char *name, const char *value, size_t size, int flags) {
|
||||
char value_str[4096];
|
||||
snprintf(value_str, sizeof(value_str), "%.*s", (int)size, value);
|
||||
|
||||
char command[4096];
|
||||
snprintf(command, sizeof(command), "%s setxattr '%s' '%s' '%s'", script_path, path, name, value_str);
|
||||
|
||||
int ret = system(command);
|
||||
return ret == 0 ? 0 : -EIO;
|
||||
}
|
||||
|
||||
// Add listxattr function
|
||||
static int fusescript_listxattr(const char *path, char *list, size_t size) {
|
||||
char command[4096];
|
||||
snprintf(command, sizeof(command), "%s listxattr '%s'", script_path, path);
|
||||
|
||||
FILE *fp = popen(command, "r");
|
||||
if (!fp) {
|
||||
return -errno;
|
||||
}
|
||||
|
||||
char *output = NULL;
|
||||
size_t output_len = 0;
|
||||
char line[1024];
|
||||
while (fgets(line, sizeof(line), fp)) {
|
||||
size_t len = strlen(line);
|
||||
output = realloc(output, output_len + len + 1);
|
||||
memcpy(output + output_len, line, len);
|
||||
output_len += len;
|
||||
}
|
||||
fprintf(stderr, "listxattr script output: %s\n", output);
|
||||
fprintf(stderr, "listxattr output length: %zu\n", output_len);
|
||||
|
||||
if (output) {
|
||||
output[output_len] = '\0';
|
||||
}
|
||||
|
||||
int ret = pclose(fp);
|
||||
if (ret != 0 || !output) {
|
||||
free(output);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
if (size == 0) {
|
||||
// Return the size of the required buffer
|
||||
free(output);
|
||||
return output_len;
|
||||
} else if (size < output_len) {
|
||||
// Buffer too small
|
||||
free(output);
|
||||
return -ERANGE;
|
||||
}
|
||||
|
||||
// Copy the attribute list
|
||||
memcpy(list, output, output_len);
|
||||
free(output);
|
||||
return output_len;
|
||||
}
|
||||
|
||||
static const struct fuse_operations fusescript_ops = {
|
||||
.getattr = fusescript_getattr,
|
||||
.readdir = fusescript_readdir,
|
||||
|
|
@ -198,21 +354,43 @@ static const struct fuse_operations fusescript_ops = {
|
|||
.mkdir = fusescript_mkdir,
|
||||
.unlink = fusescript_unlink,
|
||||
.rmdir = fusescript_rmdir,
|
||||
.getxattr = fusescript_getxattr,
|
||||
.setxattr = fusescript_setxattr,
|
||||
.listxattr = fusescript_listxattr,
|
||||
};
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
if (argc < 3) {
|
||||
fprintf(stderr, "Usage: %s <script> <mountpoint>\n", argv[0]);
|
||||
fprintf(stderr, "Usage: %s <script_or_serialdevice> <mountpoint>\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
script_path = realpath(argv[1], NULL);
|
||||
if (!script_path) {
|
||||
perror("realpath");
|
||||
return 1;
|
||||
}
|
||||
if (strncmp(argv[2], "/dev/", 5) == 0) {
|
||||
use_serial = 1;
|
||||
strncpy(serial_device, argv[2], sizeof(serial_device) - 1);
|
||||
serial_device[sizeof(serial_device) - 1] = '\0';
|
||||
|
||||
argv[1] = argv[2];
|
||||
return fuse_main(argc - 1, argv + 1, &fusescript_ops, NULL);
|
||||
if (argc < 4) {
|
||||
fprintf(stderr, "Missing mountpoint for serial device\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
script_path = realpath(argv[1], NULL);
|
||||
if (!script_path) {
|
||||
perror("realpath");
|
||||
return 1;
|
||||
}
|
||||
|
||||
argv[1] = argv[3];
|
||||
return fuse_main(argc - 2, argv + 1, &fusescript_ops, NULL);
|
||||
} else {
|
||||
script_path = realpath(argv[1], NULL);
|
||||
if (!script_path) {
|
||||
perror("realpath");
|
||||
return 1;
|
||||
}
|
||||
|
||||
argv[1] = argv[2];
|
||||
return fuse_main(argc - 1, argv + 1, &fusescript_ops, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
BIN
dist/v86-linux.iso
vendored
BIN
dist/v86-linux.iso
vendored
Binary file not shown.
Loading…
Add table
Reference in a new issue