From 7342404846f0413b32495fc8b523942944df1774 Mon Sep 17 00:00:00 2001 From: Rafal Wojtczuk Date: Thu, 10 Mar 2011 16:50:40 +0100 Subject: [PATCH] Added dvm_file_editor. It works with qrexec - reads/writes data from stdin/stdout. --- appvm/Makefile | 6 +- appvm/dvm2.h | 1 + appvm/dvm_file_editor.c | 126 +++++++++++++++++++++++++++++++++++++++ rpm_spec/core-appvm.spec | 2 + 4 files changed, 133 insertions(+), 2 deletions(-) create mode 100644 appvm/dvm2.h create mode 100644 appvm/dvm_file_editor.c diff --git a/appvm/Makefile b/appvm/Makefile index 6bb1dea..e247ce9 100644 --- a/appvm/Makefile +++ b/appvm/Makefile @@ -1,6 +1,8 @@ CC=gcc CFLAGS=-Wall -all: qubes_penctl qubes_add_pendrive_script qvm-open-in-dvm +all: qubes_penctl qubes_add_pendrive_script qvm-open-in-dvm dvm_file_editor +dvm_file_editor: dvm_file_editor.o + $(CC) -o dvm_file_editor dvm_file_editor.o qubes_penctl: qubes_penctl.o $(CC) -o qubes_penctl qubes_penctl.o -lxenstore qubes_add_pendrive_script: qubes_add_pendrive_script.o @@ -8,4 +10,4 @@ qubes_add_pendrive_script: qubes_add_pendrive_script.o qvm-open-in-dvm: qvm-open-in-dvm.o $(CC) -o qvm-open-in-dvm qvm-open-in-dvm.o -lxenstore clean: - rm -f qubes_penctl qubes_add_pendrive_script qvm-open-in-dvm *.o *~ + rm -f dvm_file_editor qubes_penctl qubes_add_pendrive_script qvm-open-in-dvm *.o *~ diff --git a/appvm/dvm2.h b/appvm/dvm2.h new file mode 100644 index 0000000..837999c --- /dev/null +++ b/appvm/dvm2.h @@ -0,0 +1 @@ +#define DVM_FILENAME_SIZE 256 diff --git a/appvm/dvm_file_editor.c b/appvm/dvm_file_editor.c new file mode 100644 index 0000000..cadb450 --- /dev/null +++ b/appvm/dvm_file_editor.c @@ -0,0 +1,126 @@ +#include +#include +#include +#include +#include +#include +#include "dvm2.h" + +int write_all(int fd, void *buf, int size) +{ + int written = 0; + int ret; + while (written < size) { + ret = write(fd, (char *) buf + written, size - written); + if (ret <= 0) { + perror("write"); + return 0; + } + written += ret; + } +// fprintf(stderr, "sent %d bytes\n", size); + return 1; +} + +int read_all(int fd, void *buf, int size) +{ + int got_read = 0; + int ret; + while (got_read < size) { + ret = read(fd, (char *) buf + got_read, size - got_read); + if (ret == 0) { + fprintf(stderr, "EOF\n"); + return 0; + } + if (ret < 0) { + perror("read"); + return 0; + } + got_read += ret; + } +// fprintf(stderr, "read %d bytes\n", size); + return 1; +} + +char *get_filename() +{ + char buf[DVM_FILENAME_SIZE]; + static char retname[sizeof(buf) + sizeof("/tmp/")]; + if (!read_all(0, buf, sizeof(buf))) + exit(1); + if (index(buf, '/')) { + fprintf(stderr, "filename contains /"); + exit(1); + } + snprintf(retname, sizeof(retname), "/tmp/%s", buf); + return retname; +} + +void copy_all(int fdout, int fdin) +{ + int ret; + char buf[4096]; + for (;;) { + ret = read(fdin, buf, sizeof(buf)); + if (!ret) + break; + if (ret < 0) { + perror("read"); + exit(1); + } + if (!write_all(fdout, buf, ret)) { + perror("write"); + exit(1); + } + } +} + + +void copy_file(char *filename) +{ + int fd = open(filename, O_WRONLY | O_CREAT, 0600); + if (fd < 0) { + perror("open file"); + exit(1); + } + copy_all(fd, 0); + close(fd); +} + +void send_file_back(char * filename) +{ + int fd = open(filename, O_RDONLY); + if (fd < 0) { + perror("open file"); + exit(1); + } + copy_all(1, fd); + close(fd); +} + +int +main() +{ + char cmdbuf[512]; + struct stat stat_pre, stat_post; + char *filename = get_filename(); + + copy_file(filename); + if (stat(filename, &stat_pre)) { + perror("stat pre"); + exit(1); + } + snprintf(cmdbuf, sizeof(cmdbuf), + "HOME=/home/user DISPLAY=:0 /usr/bin/mimeopen -n -M '%s' 2>&1 > /tmp/kde-open.log