From f42c0eaf28381940d963091f4f2296d349f6995f Mon Sep 17 00:00:00 2001 From: Leon van Kammen Date: Mon, 13 Jan 2025 14:45:38 +0100 Subject: [PATCH] stable startingpoint --- .../board/v86/rootfs_overlay/etc/profile | 14 +- buildroot-v86/configs/busybox.config | 10 +- buildroot-v86/package/fusescript/fusescript.c | 234 +++++++++++++++--- 3 files changed, 213 insertions(+), 45 deletions(-) diff --git a/buildroot-v86/board/v86/rootfs_overlay/etc/profile b/buildroot-v86/board/v86/rootfs_overlay/etc/profile index 518927a..b822737 100644 --- a/buildroot-v86/board/v86/rootfs_overlay/etc/profile +++ b/buildroot-v86/board/v86/rootfs_overlay/etc/profile @@ -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." & } diff --git a/buildroot-v86/configs/busybox.config b/buildroot-v86/configs/busybox.config index fcc325c..bf642d4 100644 --- a/buildroot-v86/configs/busybox.config +++ b/buildroot-v86/configs/busybox.config @@ -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 diff --git a/buildroot-v86/package/fusescript/fusescript.c b/buildroot-v86/package/fusescript/fusescript.c index efce91a..82dc609 100644 --- a/buildroot-v86/package/fusescript/fusescript.c +++ b/buildroot-v86/package/fusescript/fusescript.c @@ -1,3 +1,4 @@ +// SPDX: GPL-3.0-or-later #define FUSE_USE_VERSION 35 #include @@ -8,32 +9,86 @@ #include 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