[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] Rename console binaries to xenconsole and xenconsoled.
# HG changeset patch # User kaf24@xxxxxxxxxxxxxxxxxxxx # Node ID ec1878b6956ea9eab2349fde6dccb7d814585ff4 # Parent 6721c8cd1a3018b8dfdb3a2ecf049537185e3e54 Rename console binaries to xenconsole and xenconsoled. Signed-off-by: Keir Fraser <keir@xxxxxxxxxxxxx> diff -r 6721c8cd1a30 -r ec1878b6956e .hgignore --- a/.hgignore Sun Aug 7 08:56:57 2005 +++ b/.hgignore Sun Aug 7 09:12:55 2005 @@ -86,8 +86,8 @@ ^tools/check/\..*$ ^tools/cmdline/.*$ ^tools/cmdline/xen/.*$ -^tools/consoled/consoled$ -^tools/consoled/xc_console$ +^tools/console/xenconsoled$ +^tools/console/xenconsole$ ^tools/debugger/pdb/pdb$ ^tools/debugger/pdb/linux-[0-9.]*-module/.*\.ko$ ^tools/debugger/pdb/linux-[0-9.]*-module/.*\.mod.c$ diff -r 6721c8cd1a30 -r ec1878b6956e tools/Makefile --- a/tools/Makefile Sun Aug 7 08:56:57 2005 +++ b/tools/Makefile Sun Aug 7 09:12:55 2005 @@ -13,7 +13,7 @@ #SUBDIRS += pygrub SUBDIRS += firmware SUBDIRS += security -SUBDIRS += consoled +SUBDIRS += console .PHONY: all install clean check check_clean ioemu eioemuinstall ioemuclean diff -r 6721c8cd1a30 -r ec1878b6956e tools/misc/xend --- a/tools/misc/xend Sun Aug 7 08:56:57 2005 +++ b/tools/misc/xend Sun Aug 7 09:12:55 2005 @@ -121,7 +121,7 @@ def start_consoled(): if os.fork() == 0: - os.execvp('/usr/sbin/consoled', ['/usr/sbin/consoled']); + os.execvp('/usr/sbin/xenconsoled', ['/usr/sbin/xenconsoled']); def main(): try: diff -r 6721c8cd1a30 -r ec1878b6956e tools/python/xen/xm/create.py --- a/tools/python/xen/xm/create.py Sun Aug 7 08:56:57 2005 +++ b/tools/python/xen/xm/create.py Sun Aug 7 09:12:55 2005 @@ -698,8 +698,8 @@ dom = make_domain(opts, config) if opts.vals.console_autoconnect: - cmd = "/usr/libexec/xen/xc_console %d" % dom - os.execvp('/usr/libexec/xen/xc_console', cmd.split()) + cmd = "/usr/libexec/xen/xenconsole %d" % dom + os.execvp('/usr/libexec/xen/xenconsole', cmd.split()) if __name__ == '__main__': main(sys.argv) diff -r 6721c8cd1a30 -r ec1878b6956e tools/python/xen/xm/main.py --- a/tools/python/xen/xm/main.py Sun Aug 7 08:56:57 2005 +++ b/tools/python/xen/xm/main.py Sun Aug 7 09:12:55 2005 @@ -709,8 +709,8 @@ dom = args[1] info = server.xend_domain(dom) domid = int(sxp.child_value(info, 'id', '-1')) - cmd = "/usr/libexec/xen/xc_console %d" % domid - os.execvp('/usr/libexec/xen/xc_console', cmd.split()) + cmd = "/usr/libexec/xen/xenconsole %d" % domid + os.execvp('/usr/libexec/xen/xenconsole', cmd.split()) xm.prog(ProgConsole) diff -r 6721c8cd1a30 -r ec1878b6956e tools/consoled/Makefile --- a/tools/consoled/Makefile Sun Aug 7 08:56:57 2005 +++ /dev/null Sun Aug 7 09:12:55 2005 @@ -1,48 +0,0 @@ -# Makefile for consoled -# based on xcs Makefile -# Anthony Liguori 2005 - -XEN_ROOT=../.. -include $(XEN_ROOT)/tools/Rules.mk - -CONSOLED_INSTALL_DIR = /usr/sbin -XC_CONSOLE_INSTALL_DIR = /usr/libexec/xen - -INSTALL = install -INSTALL_PROG = $(INSTALL) -m0755 -INSTALL_DIR = $(INSTALL) -d -m0755 - -CC = gcc -CFLAGS = -Wall -Werror -g3 - -CFLAGS += -I $(XEN_XCS) -CFLAGS += -I $(XEN_LIBXC) -CFLAGS += -I $(XEN_XENSTORE) - -SRCS := -SRCS += main.c utils.c io.c - -HDRS = $(wildcard *.h) -OBJS = $(patsubst %.c,%.o,$(SRCS)) -BIN = consoled xc_console - -all: $(BIN) - -clean: - $(RM) *.a *.so *.o *.rpm $(BIN) - -consoled: $(OBJS) - $(CC) $(CFLAGS) $^ -o $@ -L$(XEN_LIBXC) -L$(XEN_XENSTORE) \ - -lxc -lxenstore - -xc_console: xc_console.o - $(CC) $(CFLAGS) $^ -o $@ -L$(XEN_LIBXC) -L$(XEN_XENSTORE) \ - -lxc -lxenstore - -$(OBJS): $(HDRS) - -install: $(BIN) - $(INSTALL_DIR) -p $(DESTDIR)/$(CONSOLED_INSTALL_DIR) - $(INSTALL_PROG) consoled $(DESTDIR)/$(CONSOLED_INSTALL_DIR) - $(INSTALL_DIR) -p $(DESTDIR)/$(XC_CONSOLE_INSTALL_DIR) - $(INSTALL_PROG) xc_console $(DESTDIR)/$(XC_CONSOLE_INSTALL_DIR) diff -r 6721c8cd1a30 -r ec1878b6956e tools/consoled/io.c --- a/tools/consoled/io.c Sun Aug 7 08:56:57 2005 +++ /dev/null Sun Aug 7 09:12:55 2005 @@ -1,343 +0,0 @@ -/*\ - * Copyright (C) International Business Machines Corp., 2005 - * Author(s): Anthony Liguori <aliguori@xxxxxxxxxx> - * - * Xen Console Daemon - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; under version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -\*/ - -#define _GNU_SOURCE - -#include "utils.h" -#include "io.h" - -#include "xc.h" -#include "xs.h" -#include "xen/io/domain_controller.h" -#include "xcs_proto.h" - -#include <malloc.h> -#include <stdlib.h> -#include <errno.h> -#include <string.h> -#include <sys/select.h> -#include <fcntl.h> -#include <unistd.h> -#include <termios.h> - -#define MAX(a, b) (((a) > (b)) ? (a) : (b)) -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) - -struct buffer -{ - char *data; - size_t size; - size_t capacity; - size_t max_capacity; -}; - -static void buffer_append(struct buffer *buffer, const void *data, size_t size) -{ - if ((buffer->capacity - buffer->size) < size) { - buffer->capacity += (size + 1024); - buffer->data = realloc(buffer->data, buffer->capacity); - if (buffer->data == NULL) { - dolog(LOG_ERR, "Memory allocation failed"); - exit(ENOMEM); - } - } - - memcpy(buffer->data + buffer->size, data, size); - buffer->size += size; - - if (buffer->max_capacity && - buffer->size > buffer->max_capacity) { - memmove(buffer->data + (buffer->size - buffer->max_capacity), - buffer->data, buffer->max_capacity); - buffer->data = realloc(buffer->data, buffer->max_capacity); - buffer->capacity = buffer->max_capacity; - } -} - -static bool buffer_empty(struct buffer *buffer) -{ - return buffer->size == 0; -} - -static void buffer_advance(struct buffer *buffer, size_t size) -{ - size = MIN(size, buffer->size); - memmove(buffer->data, buffer + size, buffer->size - size); - buffer->size -= size; -} - -struct domain -{ - int domid; - int tty_fd; - struct buffer buffer; - struct domain *next; -}; - -static struct domain *dom_head; - -static bool domain_is_valid(int domid) -{ - bool ret; - xc_dominfo_t info; - - ret = (xc_domain_getinfo(xc, domid, 1, &info) == 1 && - info.domid == domid); - - return ret; -} - -static int domain_create_tty(struct domain *dom) -{ - char path[1024]; - int master; - - if ((master = getpt()) == -1 || - grantpt(master) == -1 || unlockpt(master) == -1) { - dolog(LOG_ERR, "Failed to create tty for domain-%d", - dom->domid); - master = -1; - } else { - const char *slave = ptsname(master); - struct termios term; - char *data; - unsigned int len; - - if (tcgetattr(master, &term) != -1) { - cfmakeraw(&term); - tcsetattr(master, TCSAFLUSH, &term); - } - - xs_mkdir(xs, "/console"); - snprintf(path, sizeof(path), "/console/%d", dom->domid); - xs_mkdir(xs, path); - strcat(path, "/tty"); - - xs_write(xs, path, slave, strlen(slave), O_CREAT); - - snprintf(path, sizeof(path), "/console/%d/limit", dom->domid); - data = xs_read(xs, path, &len); - if (data) { - dom->buffer.max_capacity = strtoul(data, 0, 0); - free(data); - } - } - - return master; -} - -static struct domain *create_domain(int domid) -{ - struct domain *dom; - - dom = (struct domain *)malloc(sizeof(struct domain)); - if (dom == NULL) { - dolog(LOG_ERR, "Out of memory %s:%s():L%d", - __FILE__, __FUNCTION__, __LINE__); - exit(ENOMEM); - } - - dom->domid = domid; - dom->tty_fd = domain_create_tty(dom); - dom->buffer.data = 0; - dom->buffer.size = 0; - dom->buffer.capacity = 0; - dom->buffer.max_capacity = 0; - - dolog(LOG_DEBUG, "New domain %d", domid); - - return dom; -} - -static struct domain *lookup_domain(int domid) -{ - struct domain **pp; - - for (pp = &dom_head; *pp; pp = &(*pp)->next) { - struct domain *dom = *pp; - - if (dom->domid == domid) { - return dom; - } else if (dom->domid > domid) { - *pp = create_domain(domid); - (*pp)->next = dom; - return *pp; - } - } - - *pp = create_domain(domid); - return *pp; -} - -static void remove_domain(struct domain *dom) -{ - struct domain **pp; - - dolog(LOG_DEBUG, "Removing domain-%d", dom->domid); - - for (pp = &dom_head; *pp; pp = &(*pp)->next) { - struct domain *d = *pp; - - if (dom->domid == d->domid) { - *pp = d->next; - if (d->buffer.data) { - free(d->buffer.data); - } - free(d); - break; - } - } -} - -static void handle_tty_read(struct domain *dom) -{ - ssize_t len; - xcs_msg_t msg; - - msg.type = XCS_REQUEST; - msg.u.control.remote_dom = dom->domid; - msg.u.control.msg.type = CMSG_CONSOLE; - msg.u.control.msg.subtype = CMSG_CONSOLE_DATA; - msg.u.control.msg.id = 1; - - len = read(dom->tty_fd, msg.u.control.msg.msg, 60); - if (len < 1) { - close(dom->tty_fd); - - if (domain_is_valid(dom->domid)) { - dom->tty_fd = domain_create_tty(dom); - } else { - remove_domain(dom); - } - } else if (domain_is_valid(dom->domid)) { - msg.u.control.msg.length = len; - - if (!write_sync(xcs_data_fd, &msg, sizeof(msg))) { - dolog(LOG_ERR, "Write to xcs failed: %m"); - } - } else { - close(dom->tty_fd); - remove_domain(dom); - } -} - -static void handle_tty_write(struct domain *dom) -{ - ssize_t len; - - len = write(dom->tty_fd, dom->buffer.data, dom->buffer.size); - if (len < 1) { - close(dom->tty_fd); - - if (domain_is_valid(dom->domid)) { - dom->tty_fd = domain_create_tty(dom); - } else { - remove_domain(dom); - } - } else { - buffer_advance(&dom->buffer, len); - } -} - -static void handle_xcs_msg(int fd) -{ - xcs_msg_t msg; - - if (!read_sync(fd, &msg, sizeof(msg))) { - dolog(LOG_ERR, "read from xcs failed! %m"); - } else if (msg.type == XCS_REQUEST) { - struct domain *dom; - - dom = lookup_domain(msg.u.control.remote_dom); - buffer_append(&dom->buffer, - msg.u.control.msg.msg, - msg.u.control.msg.length); - } -} - -static void enum_domains(void) -{ - int domid = 0; - xc_dominfo_t dominfo; - - while (xc_domain_getinfo(xc, domid, 1, &dominfo) == 1) { - lookup_domain(dominfo.domid); - domid = dominfo.domid + 1; - } -} - -void handle_io(void) -{ - fd_set readfds, writefds; - int ret; - int max_fd = -1; - int num_of_writes = 0; - - do { - struct domain *d; - struct timeval tv = { 1, 0 }; - - FD_ZERO(&readfds); - FD_ZERO(&writefds); - - FD_SET(xcs_data_fd, &readfds); - max_fd = MAX(xcs_data_fd, max_fd); - - for (d = dom_head; d; d = d->next) { - if (d->tty_fd != -1) { - FD_SET(d->tty_fd, &readfds); - } - - if (d->tty_fd != -1 && !buffer_empty(&d->buffer)) { - FD_SET(d->tty_fd, &writefds); - } - - max_fd = MAX(d->tty_fd, max_fd); - } - - ret = select(max_fd + 1, &readfds, &writefds, 0, &tv); - if (tv.tv_sec == 1 && (++num_of_writes % 100) == 0) { - /* FIXME */ - /* This is a nasty hack. xcs does not handle the - control channels filling up well at all. We'll - throttle ourselves here since we do proper - queueing to give the domains a shot at pulling out - the data. Fixing xcs is not worth it as it's - going away */ - tv.tv_usec = 1000; - select(0, 0, 0, 0, &tv); - } - enum_domains(); - - if (FD_ISSET(xcs_data_fd, &readfds)) { - handle_xcs_msg(xcs_data_fd); - } - - for (d = dom_head; d; d = d->next) { - if (FD_ISSET(d->tty_fd, &readfds)) { - handle_tty_read(d); - } - - if (FD_ISSET(d->tty_fd, &writefds)) { - handle_tty_write(d); - } - } - } while (ret > -1); -} diff -r 6721c8cd1a30 -r ec1878b6956e tools/consoled/io.h --- a/tools/consoled/io.h Sun Aug 7 08:56:57 2005 +++ /dev/null Sun Aug 7 09:12:55 2005 @@ -1,26 +0,0 @@ -/*\ - * Copyright (C) International Business Machines Corp., 2005 - * Author(s): Anthony Liguori <aliguori@xxxxxxxxxx> - * - * Xen Console Daemon - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; under version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -\*/ - -#ifndef CONSOLED_IO_H -#define CONSOLED_IO_H - -void handle_io(void); - -#endif diff -r 6721c8cd1a30 -r ec1878b6956e tools/consoled/main.c --- a/tools/consoled/main.c Sun Aug 7 08:56:57 2005 +++ /dev/null Sun Aug 7 09:12:55 2005 @@ -1,93 +0,0 @@ -/*\ - * Copyright (C) International Business Machines Corp., 2005 - * Author(s): Anthony Liguori <aliguori@xxxxxxxxxx> - * - * Xen Console Daemon - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; under version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -\*/ - -#include <getopt.h> -#include <stdlib.h> -#include <stdio.h> -#include <errno.h> -#include <unistd.h> -#include <sys/types.h> - -#include "xc.h" -#include "xen/io/domain_controller.h" -#include "xcs_proto.h" - -#include "utils.h" -#include "io.h" - -int main(int argc, char **argv) -{ - const char *sopts = "hVvi"; - struct option lopts[] = { - { "help", 0, 0, 'h' }, - { "version", 0, 0, 'V' }, - { "verbose", 0, 0, 'v' }, - { "interactive", 0, 0, 'i' }, - { 0 }, - }; - bool is_interactive = false; - int ch; - int syslog_option = LOG_CONS; - int syslog_mask = LOG_WARNING; - int opt_ind = 0; - - while ((ch = getopt_long(argc, argv, sopts, lopts, &opt_ind)) != -1) { - switch (ch) { - case 'h': - //usage(argv[0]); - exit(0); - case 'V': - //version(argv[0]); - exit(0); - case 'v': - syslog_option |= LOG_PERROR; - syslog_mask = LOG_DEBUG; - break; - case 'i': - is_interactive = true; - break; - case '?': - fprintf(stderr, - "Try `%s --help' for more information\n", - argv[0]); - exit(EINVAL); - } - } - - if (geteuid() != 0) { - fprintf(stderr, "%s requires root to run.\n", argv[0]); - exit(EPERM); - } - - openlog("consoled", syslog_option, LOG_DAEMON); - setlogmask(syslog_mask); - - if (!is_interactive) { - daemonize("/var/run/consoled.pid"); - } - - xen_setup(); - - handle_io(); - - closelog(); - - return 0; -} diff -r 6721c8cd1a30 -r ec1878b6956e tools/consoled/testsuite/Makefile --- a/tools/consoled/testsuite/Makefile Sun Aug 7 08:56:57 2005 +++ /dev/null Sun Aug 7 09:12:55 2005 @@ -1,11 +0,0 @@ -CFLAGS=-g -Wall -CC=gcc -LDFLAGS=-static - -all: console-dom0 console-domU procpipe - -console-dom0: console-dom0.o -console-domU: console-domU.o -procpipe: procpipe.o - -clean:; $(RM) *.o console-domU console-dom0 procpipe diff -r 6721c8cd1a30 -r ec1878b6956e tools/consoled/testsuite/README --- a/tools/consoled/testsuite/README Sun Aug 7 08:56:57 2005 +++ /dev/null Sun Aug 7 09:12:55 2005 @@ -1,29 +0,0 @@ -ABOUT - -This tool uses two programs, one that lives in dom0 and one that lives in domU -to verify that no data is lost. dom0 and domU share a handshake with each -other that they use to exchange a random seed. - -Both programs then generate a series of random numbers and then writes and -reads the numbers via the console. Because each side starts with the same seed -they know what data the other side is generating and therefore what should be -expected. - -RUNNNING - -console-domU should be installed within the guest image. It must be launched -from the client automatically. I use a custom initrd image and put it in the -/linuxrc. - -console-dom0 and console-domU will communicate with each other and stress the -console code. You can verify it at various levels by invoking it in different -ways. procpipe is used to connect the two. I use the following command for -testing: - -./procpipe ./console-dom0 'xm create -c /etc/xen/xmexample1' - -xmexample1 has no devices and no root set (this is what triggers /linuxrc). - -If it freezes, it probably means that console-domU is expecting more data from -console-dom0 (which means that some data got dropped). I'd like to add -timeouts in the future to handle this more gracefully. diff -r 6721c8cd1a30 -r ec1878b6956e tools/consoled/testsuite/console-dom0.c --- a/tools/consoled/testsuite/console-dom0.c Sun Aug 7 08:56:57 2005 +++ /dev/null Sun Aug 7 09:12:55 2005 @@ -1,117 +0,0 @@ -/* Written by Anthony Liguori <aliguori@xxxxxxxxxx> */ - -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include <string.h> -#include <unistd.h> -#include <termios.h> - -#define MIN(a, b) (((a) < (b)) ? (a) : (b)) - -static void generate_random_buffer(char *buffer, size_t size) -{ - int i; - - for (i = 0; i < size; i++) { - buffer[i] = random() & 0xFF; - } -} - -static void canonicalize(char *buffer) -{ - char *reader, *writer; - - reader = writer = buffer; - - while (*reader) { - *writer = *reader; - if (*reader != '\r') writer++; - reader++; - } - *writer = *reader; -} - -int main(int argc, char **argv) -{ - char buffer[4096]; - char *line; - unsigned int seed; - size_t size; - int runs; - unsigned long long total_bytes = 0; - struct termios term; - - tcgetattr(STDIN_FILENO, &term); - cfmakeraw(&term); - tcsetattr(STDIN_FILENO, TCSAFLUSH, &term); - - tcgetattr(STDOUT_FILENO, &term); - cfmakeraw(&term); - tcsetattr(STDOUT_FILENO, TCSAFLUSH, &term); - - while ((line = fgets(buffer, sizeof(buffer), stdin))) { - canonicalize(line); - - if (strcmp(line, "!!!XEN Test Begin!!!\n") == 0) { - break; - } else { - fprintf(stderr, "%s", line); - } - } - - if (line == NULL) { - fprintf(stderr, "Client never sent start string.\n"); - return 1; - } - - seed = time(0); - - printf("%u\n", seed); fflush(stdout); - - fprintf(stderr, "Waiting for seed acknowledgement\n"); - line = fgets(buffer, sizeof(buffer), stdin); - if (line == NULL) { - fprintf(stderr, "Client never acknowledge seed.\n"); - return 1; - } - - canonicalize(line); - if (strcmp(line, "Seed Okay.\n") != 0) { - fprintf(stderr, "Incorrect seed acknowledgement.\n"); - fprintf(stderr, "[%s]", line); - return 1; - } else { - fprintf(stderr, "Processed seed.\n"); - } - - srandom(seed); - - for (runs = (random() % 100000) + 4096; runs > 0; runs--) { - - size = random() % 4096; - - fprintf(stderr, "Writing %d bytes.\n", size); - - generate_random_buffer(buffer, size); - fwrite(buffer, size, 1, stdout); - fflush(stdout); - - do { - line = fgets(buffer, sizeof(buffer), stdin); - if (line == NULL) { - fprintf(stderr, "Premature EOF from client.\n"); - return 1; - } - - canonicalize(line); - fprintf(stderr, "%s", line); - } while (strcmp(line, "Okay.\n") != 0); - - total_bytes += size; - } - - fprintf(stderr, "PASS: processed %llu byte(s).\n", total_bytes); - - return 0; -} diff -r 6721c8cd1a30 -r ec1878b6956e tools/consoled/testsuite/console-domU.c --- a/tools/consoled/testsuite/console-domU.c Sun Aug 7 08:56:57 2005 +++ /dev/null Sun Aug 7 09:12:55 2005 @@ -1,76 +0,0 @@ -/* Written by Anthony Liguori <aliguori@xxxxxxxxxx> */ - -#include <stdio.h> -#include <stdlib.h> -#include <time.h> -#include <termios.h> -#include <unistd.h> - -static void canonicalize(char *buffer) -{ - char *reader, *writer; - - reader = writer = buffer; - - while (*reader) { - *writer = *reader; - if (*reader != '\r') writer++; - reader++; - } - *writer = *reader; -} - -int main(int argc, char **argv) -{ - char buffer[4096]; - char *line; - unsigned int seed; - size_t size; - int i; - int runs; - struct termios term; - - tcgetattr(STDIN_FILENO, &term); - cfmakeraw(&term); - tcsetattr(STDIN_FILENO, TCSAFLUSH, &term); - - tcgetattr(STDOUT_FILENO, &term); - cfmakeraw(&term); - tcsetattr(STDOUT_FILENO, TCSAFLUSH, &term); - - printf("!!!XEN Test Begin!!!\n"); fflush(stdout); - line = fgets(buffer, sizeof(buffer), stdin); - if (line == NULL) { - printf("Failure\n"); fflush(stdout); - return 1; - } - - canonicalize(line); - seed = strtoul(line, 0, 0); - - printf("Seed Okay.\n"); fflush(stdout); - - srandom(seed); - - for (runs = (random() % 100000) + 4096; runs > 0; runs--) { - size = random() % 4096; - - for (i = 0; i < size; i++) { - int ch; - int exp; - - ch = fgetc(stdin); - exp = random() & 0xFF; - if (ch != exp) { - printf("Expected %d got %d\n", - exp, ch); - fflush(stdout); - } - printf("Got %d/%d good bytes\n", i, size); - } - - printf("Okay.\n"); fflush(stdout); - } - - return 0; -} diff -r 6721c8cd1a30 -r ec1878b6956e tools/consoled/testsuite/procpipe.c --- a/tools/consoled/testsuite/procpipe.c Sun Aug 7 08:56:57 2005 +++ /dev/null Sun Aug 7 09:12:55 2005 @@ -1,133 +0,0 @@ -/* Written by Anthony Liguori <aliguori@xxxxxxxxxx> */ - -#include <stdio.h> -#include <getopt.h> -#include <errno.h> -#include <stdlib.h> -#include <err.h> - -#include <sys/types.h> -#include <sys/wait.h> -#include <unistd.h> - -#define PACKAGE_NAME "procpipe" -#define PACKAGE_VERSION "0.0.1" - -#define GPL_SHORT \ -"This is free software; see the source for copying conditions. There is NO\n"\ -"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." - -#define PACKAGE_BUGS "aliguori@xxxxxxxxxx" -#define PACKAGE_AUTHOR "Anthony Liguori" -#define PACKAGE_OWNER "IBM, Corp." -#define PACKAGE_LICENSE GPL_SHORT - -static void usage(const char *name) -{ - printf("Usage: %s [OPTIONS]\n" - "\n" - " -h, --help display this help and exit\n" - " -V, --version output version information and exit\n" - "\n" - "Report bugs to <%s>.\n" - , name, PACKAGE_BUGS); -} - -static void version(const char *name) -{ - printf("%s (%s) %s\n" - "Written by %s.\n" - "\n" - "Copyright (C) 2005 %s.\n" - "%s\n" - , name, PACKAGE_NAME, PACKAGE_VERSION, - PACKAGE_AUTHOR, PACKAGE_OWNER, PACKAGE_LICENSE); -} - -static pid_t exec(int stdout, int stdin, const char *cmd) -{ - pid_t pid; - - pid = fork(); - if (pid == 0) { - close(STDOUT_FILENO); - dup2(stdout, STDOUT_FILENO); - close(STDIN_FILENO); - dup2(stdin, STDIN_FILENO); - - execlp("/bin/sh", "sh", "-c", cmd, NULL); - } - - return pid; -} - -int main(int argc, char **argv) -{ - int ch, opt_ind = 0; - const char *sopt = "hV"; - struct option lopt[] = { - { "help", 0, 0, 'h' }, - { "version", 0, 0, 'V' }, - { 0 } - }; - int host_stdout[2]; - int host_stdin[2]; - int res; - pid_t pid1, pid2; - int status; - - while ((ch = getopt_long(argc, argv, sopt, lopt, &opt_ind)) != -1) { - switch (ch) { - case 'h': - usage(argv[0]); - exit(0); - case 'V': - version(argv[0]); - exit(0); - case '?': - errx(EINVAL, "Try `%s --help' for more information.", - argv[0]); - } - } - - if ((argc - optind) != 2) { - errx(EINVAL, "Two commands are required.\n" - "Try `%s --help' for more information.", argv[0]); - } - - res = pipe(host_stdout); - if (res == -1) { - err(errno, "pipe() failed"); - } - - res = pipe(host_stdin); - if (res == -1) { - err(errno, "pipe() failed"); - } - - pid1 = exec(host_stdout[1], host_stdin[0], argv[optind]); - if (pid1 == -1) { - err(errno, "exec(%s)", argv[optind]); - } - - pid2 = exec(host_stdin[1], host_stdout[0], argv[optind + 1]); - if (pid2 == -1) { - err(errno, "exec(%s)", argv[optind + 1]); - } - - waitpid(pid1, &status, 0); - if (WIFEXITED(status)) status = WEXITSTATUS(status); - - if (status != 0) { - printf("Child exited with status %d\n", status); - } - - waitpid(pid2, &status, 0); - if (WIFEXITED(status)) status = WEXITSTATUS(status); - - if (status != 0) { - printf("Child2 exited with status %d\n", status); - } - - return 0; -} diff -r 6721c8cd1a30 -r ec1878b6956e tools/consoled/utils.c --- a/tools/consoled/utils.c Sun Aug 7 08:56:57 2005 +++ /dev/null Sun Aug 7 09:12:55 2005 @@ -1,251 +0,0 @@ -/*\ - * Copyright (C) International Business Machines Corp., 2005 - * Author(s): Anthony Liguori <aliguori@xxxxxxxxxx> - * - * Xen Console Daemon - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; under version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -\*/ - -#include <sys/types.h> -#include <sys/stat.h> -#include <sys/wait.h> -#include <unistd.h> -#include <stdlib.h> -#include <fcntl.h> -#include <err.h> -#include <errno.h> -#include <stdio.h> -#include <getopt.h> -#include <stdbool.h> -#include <sys/socket.h> -#include <sys/un.h> -#include <string.h> - -#include "xc.h" -#include "xen/io/domain_controller.h" -#include "xcs_proto.h" - -#include "utils.h" - -struct xs_handle *xs; -int xc; - -int xcs_ctrl_fd = -1; -int xcs_data_fd = -1; - -bool _read_write_sync(int fd, void *data, size_t size, bool do_read) -{ - size_t offset = 0; - ssize_t len; - - while (offset < size) { - if (do_read) { - len = read(fd, data + offset, size - offset); - } else { - len = write(fd, data + offset, size - offset); - } - - if (len < 1) { - if (len == -1 && (errno == EAGAIN || errno == EINTR)) { - return false; - } - } else { - offset += len; - } - } - - return true; -} - -static int open_domain_socket(const char *path) -{ - struct sockaddr_un addr; - int sock; - size_t addr_len; - - if ((sock = socket(PF_UNIX, SOCK_STREAM, 0)) == -1) { - goto out; - } - - addr.sun_family = AF_UNIX; - strcpy(addr.sun_path, path); - addr_len = sizeof(addr.sun_family) + strlen(XCS_SUN_PATH) + 1; - - if (connect(sock, (struct sockaddr *)&addr, addr_len) == -1) { - goto out_close_sock; - } - - return sock; - - out_close_sock: - close(sock); - out: - return -1; -} - -static void child_exit(int sig) -{ - while (waitpid(-1, NULL, WNOHANG) > 0); -} - -void daemonize(const char *pidfile) -{ - pid_t pid; - int fd; - int len; - int i; - char buf[100]; - - if (getppid() == 1) { - return; - } - - if ((pid = fork()) > 0) { - exit(0); - } else if (pid == -1) { - err(errno, "fork() failed"); - } - - setsid(); - - /* redirect fd 0,1,2 to /dev/null */ - if ((fd = open("/dev/null",O_RDWR)) == -1) { - exit(1); - } - - for (i = 0; i <= 2; i++) { - close(i); - dup2(fd, i); - } - - close(fd); - - umask(027); - chdir("/"); - - fd = open(pidfile, O_RDWR | O_CREAT); - if (fd == -1) { - exit(1); - } - - if (lockf(fd, F_TLOCK, 0) == -1) { - exit(1); - } - - len = sprintf(buf, "%d\n", getpid()); - write(fd, buf, len); - - signal(SIGCHLD, child_exit); - signal(SIGTSTP, SIG_IGN); - signal(SIGTTOU, SIG_IGN); - signal(SIGTTIN, SIG_IGN); -} - -/* synchronized send/recv strictly for setting up xcs */ -/* always use asychronize callbacks any other time */ -static bool xcs_send_recv(int fd, xcs_msg_t *msg) -{ - bool ret = false; - - if (!write_sync(fd, msg, sizeof(*msg))) { - dolog(LOG_ERR, "Write failed at %s:%s():L%d? Possible bug.", - __FILE__, __FUNCTION__, __LINE__); - goto out; - } - - if (!read_sync(fd, msg, sizeof(*msg))) { - dolog(LOG_ERR, "Read failed at %s:%s():L%d? Possible bug.", - __FILE__, __FUNCTION__, __LINE__); - goto out; - } - - ret = true; - - out: - return ret; -} - -bool xen_setup(void) -{ - int sock; - xcs_msg_t msg; - - xs = xs_daemon_open(); - if (xs == NULL) { - dolog(LOG_ERR, - "Failed to contact xenstore (%m). Is it running?"); - goto out; - } - - xc = xc_interface_open(); - if (xc == -1) { - dolog(LOG_ERR, "Failed to contact hypervisor (%m)"); - goto out; - } - - sock = open_domain_socket(XCS_SUN_PATH); - if (sock == -1) { - dolog(LOG_ERR, "Failed to contact xcs (%m). Is it running?"); - goto out_close_store; - } - - xcs_ctrl_fd = sock; - - sock = open_domain_socket(XCS_SUN_PATH); - if (sock == -1) { - dolog(LOG_ERR, "Failed to contact xcs (%m). Is it running?"); - goto out_close_ctrl; - } - - xcs_data_fd = sock; - - memset(&msg, 0, sizeof(msg)); - msg.type = XCS_CONNECT_CTRL; - if (!xcs_send_recv(xcs_ctrl_fd, &msg) || msg.result != XCS_RSLT_OK) { - dolog(LOG_ERR, "xcs control connect failed. Possible bug."); - goto out_close_data; - } - - msg.type = XCS_CONNECT_DATA; - if (!xcs_send_recv(xcs_data_fd, &msg) || msg.result != XCS_RSLT_OK) { - dolog(LOG_ERR, "xcs data connect failed. Possible bug."); - goto out_close_data; - } - - /* Since the vast majority of control messages are console messages - it's just easier to ignore other messages that try to bind to - a specific type. */ - msg.type = XCS_MSG_BIND; - msg.u.bind.port = PORT_WILDCARD; - msg.u.bind.type = TYPE_WILDCARD; - if (!xcs_send_recv(xcs_ctrl_fd, &msg) || msg.result != XCS_RSLT_OK) { - dolog(LOG_ERR, "xcs vind failed. Possible bug."); - goto out_close_data; - } - - return true; - - out_close_data: - close(xcs_ctrl_fd); - xcs_data_fd = -1; - out_close_ctrl: - close(xcs_ctrl_fd); - xcs_ctrl_fd = -1; - out_close_store: - xs_daemon_close(xs); - out: - return false; -} - diff -r 6721c8cd1a30 -r ec1878b6956e tools/consoled/utils.h --- a/tools/consoled/utils.h Sun Aug 7 08:56:57 2005 +++ /dev/null Sun Aug 7 09:12:55 2005 @@ -1,47 +0,0 @@ -/*\ - * Copyright (C) International Business Machines Corp., 2005 - * Author(s): Anthony Liguori <aliguori@xxxxxxxxxx> - * - * Xen Console Daemon - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; under version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -\*/ - -#ifndef CONSOLED_UTILS_H -#define CONSOLED_UTILS_H - -#include <stdbool.h> -#include <syslog.h> -#include <stdio.h> - -#include "xs.h" - -void daemonize(const char *pidfile); -bool xen_setup(void); -#define read_sync(fd, buffer, size) _read_write_sync(fd, buffer, size, true) -#define write_sync(fd, buffer, size) _read_write_sync(fd, buffer, size, false) -bool _read_write_sync(int fd, void *data, size_t size, bool do_read); - -extern int xcs_ctrl_fd; -extern int xcs_data_fd; -extern struct xs_handle *xs; -extern int xc; - -#if 1 -#define dolog(val, fmt, ...) syslog(val, fmt, ## __VA_ARGS__) -#else -#define dolog(val, fmt, ...) fprintf(stderr, fmt "\n", ## __VA_ARGS__) -#endif - -#endif diff -r 6721c8cd1a30 -r ec1878b6956e tools/consoled/xc_console.c --- a/tools/consoled/xc_console.c Sun Aug 7 08:56:57 2005 +++ /dev/null Sun Aug 7 09:12:55 2005 @@ -1,228 +0,0 @@ -/*\ - * Copyright (C) International Business Machines Corp., 2005 - * Author(s): Anthony Liguori <aliguori@xxxxxxxxxx> - * - * Xen Console Daemon - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; under version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA -\*/ - -#include <sys/types.h> -#include <sys/socket.h> -#include <sys/un.h> -#include <stdio.h> -#include <unistd.h> -#include <errno.h> -#include <stdlib.h> -#include <time.h> -#include <fcntl.h> -#include <sys/wait.h> -#include <termios.h> -#include <signal.h> -#include <getopt.h> -#include <sys/select.h> -#include <err.h> -#include <errno.h> -#include <pty.h> - -#include "xc.h" -#include "xs.h" - -#define ESCAPE_CHARACTER 0x1d - -static volatile sig_atomic_t received_signal = 0; - -static void sighandler(int signum) -{ - received_signal = 1; -} - -static bool write_sync(int fd, const void *data, size_t size) -{ - size_t offset = 0; - ssize_t len; - - while (offset < size) { - len = write(fd, data + offset, size - offset); - if (len < 1) { - return false; - } - offset += len; - } - - return true; -} - -static void usage(const char *program) { - printf("Usage: %s [OPTION] DOMID\n" - "Attaches to a virtual domain console\n" - "\n" - " -h, --help display this help and exit\n" - , program); -} - -/* don't worry too much if setting terminal attributes fail */ -static void init_term(int fd, struct termios *old) -{ - struct termios new_term; - - if (tcgetattr(fd, old) == -1) { - return; - } - - new_term = *old; - cfmakeraw(&new_term); - - tcsetattr(fd, TCSAFLUSH, &new_term); -} - -static void restore_term(int fd, struct termios *old) -{ - tcsetattr(fd, TCSAFLUSH, old); -} - -static int console_loop(int xc_handle, domid_t domid, int fd) -{ - int ret; - - do { - fd_set fds; - - FD_ZERO(&fds); - FD_SET(STDIN_FILENO, &fds); - FD_SET(fd, &fds); - - ret = select(fd + 1, &fds, NULL, NULL, NULL); - if (ret == -1) { - if (errno == EINTR || errno == EAGAIN) { - continue; - } - return -1; - } - - if (FD_ISSET(STDIN_FILENO, &fds)) { - ssize_t len; - char msg[60]; - - len = read(STDIN_FILENO, msg, sizeof(msg)); - if (len == 1 && msg[0] == ESCAPE_CHARACTER) { - return 0; - } - - if (len == 0 || len == -1) { - if (len == -1 && - (errno == EINTR || errno == EAGAIN)) { - continue; - } - return -1; - } - - if (!write_sync(fd, msg, len)) { - perror("write() failed"); - return -1; - } - } - - if (FD_ISSET(fd, &fds)) { - ssize_t len; - char msg[512]; - - len = read(fd, msg, sizeof(msg)); - if (len == 0 || len == -1) { - if (len == -1 && - (errno == EINTR || errno == EAGAIN)) { - continue; - } - return -1; - } - - if (!write_sync(STDOUT_FILENO, msg, len)) { - perror("write() failed"); - return -1; - } - } - } while (received_signal == 0); - - return 0; -} - -int main(int argc, char **argv) -{ - struct termios attr; - int domid; - int xc_handle; - char *sopt = "hf:pc"; - int ch; - int opt_ind=0; - struct option lopt[] = { - { "help", 0, 0, 'h' }, - { "file", 1, 0, 'f' }, - { "pty", 0, 0, 'p' }, - { "ctty", 0, 0, 'c' }, - { 0 }, - - }; - char *str_pty; - char path[1024]; - int spty; - unsigned int len = 0; - struct xs_handle *xs; - - while((ch = getopt_long(argc, argv, sopt, lopt, &opt_ind)) != -1) { - switch(ch) { - case 'h': - usage(argv[0]); - exit(0); - break; - } - } - - if ((argc - optind) != 1) { - fprintf(stderr, "Invalid number of arguments\n"); - fprintf(stderr, "Try `%s --help' for more information.\n", - argv[0]); - exit(EINVAL); - } - - domid = atoi(argv[optind]); - - xs = xs_daemon_open(); - if (xs == NULL) { - err(errno, "Could not contact XenStore"); - } - - xc_handle = xc_interface_open(); - if (xc_handle == -1) { - err(errno, "xc_interface_open()"); - } - - signal(SIGTERM, sighandler); - - snprintf(path, sizeof(path), "/console/%d/tty", domid); - str_pty = xs_read(xs, path, &len); - if (str_pty == NULL) { - err(errno, "Could not read tty from store"); - } - spty = open(str_pty, O_RDWR | O_NOCTTY); - if (spty == -1) { - err(errno, "Could not open tty `%s'", str_pty); - } - free(str_pty); - - init_term(STDIN_FILENO, &attr); - console_loop(xc_handle, domid, spty); - restore_term(STDIN_FILENO, &attr); - - return 0; - } _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |