aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config/StdGNU.mk1
-rw-r--r--config/SunOS.mk1
-rw-r--r--tools/console/Makefile4
-rw-r--r--tools/console/daemon/io.c142
-rw-r--r--tools/console/daemon/utils.c2
5 files changed, 101 insertions, 49 deletions
diff --git a/config/StdGNU.mk b/config/StdGNU.mk
index 4f08ea9a30..87225f180e 100644
--- a/config/StdGNU.mk
+++ b/config/StdGNU.mk
@@ -21,6 +21,7 @@ LIB64DIR = lib64
SOCKET_LIBS =
CURSES_LIBS = -lncurses
+UTIL_LIBS = -lutil
SONAME_LDFLAG = -soname
SHLIB_CFLAGS = -shared
diff --git a/config/SunOS.mk b/config/SunOS.mk
index 5c12fd4c23..ec290346f2 100644
--- a/config/SunOS.mk
+++ b/config/SunOS.mk
@@ -22,6 +22,7 @@ LIB64DIR = lib/amd64
SOCKET_LIBS = -lsocket
CURSES_LIBS = -lcurses
+UTIL_LIBS =
SONAME_LDFLAG = -h
SHLIB_CFLAGS = -R /usr/sfw/$(LIBDIR) -shared
diff --git a/tools/console/Makefile b/tools/console/Makefile
index 7a8e15c0a8..445819ee8c 100644
--- a/tools/console/Makefile
+++ b/tools/console/Makefile
@@ -22,11 +22,11 @@ clean:
xenconsoled: $(patsubst %.c,%.o,$(wildcard daemon/*.c))
$(CC) $(CFLAGS) $^ -o $@ -L$(XEN_LIBXC) -L$(XEN_XENSTORE) \
- $(SOCKET_LIBS) -lxenctrl -lxenstore
+ $(UTIL_LIBS) $(SOCKET_LIBS) -lxenctrl -lxenstore
xenconsole: $(patsubst %.c,%.o,$(wildcard client/*.c))
$(CC) $(CFLAGS) $^ -o $@ -L$(XEN_LIBXC) -L$(XEN_XENSTORE) \
- $(SOCKET_LIBS) -lxenctrl -lxenstore
+ $(UTIL_LIBS) $(SOCKET_LIBS) -lxenctrl -lxenstore
.PHONY: install
install: $(BIN)
diff --git a/tools/console/daemon/io.c b/tools/console/daemon/io.c
index 42015ebc29..dbc9a8326c 100644
--- a/tools/console/daemon/io.c
+++ b/tools/console/daemon/io.c
@@ -26,7 +26,6 @@
#include <xen/io/console.h>
#include <xenctrl.h>
-#include <malloc.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
@@ -36,6 +35,11 @@
#include <termios.h>
#include <stdarg.h>
#include <sys/mman.h>
+#if defined(__NetBSD__) || defined(__OpenBSD__)
+#include <util.h>
+#elif defined(__linux__) || defined(__Linux__)
+#include <pty.h>
+#endif
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
@@ -213,43 +217,81 @@ static int create_domain_log(struct domain *dom)
return fd;
}
+#ifdef __sun__
+/* Once Solaris has openpty(), this is going to be removed. */
+int openpty(int *amaster, int *aslave, char *name,
+ struct termios *termp, struct winsize *winp)
+{
+ int mfd, sfd;
+
+ *amaster = *aslave = -1;
+ mfd = sfd = -1;
+
+ mfd = open("/dev/ptmx", O_RDWR | O_NOCTTY);
+ if (mfd < 0)
+ goto err0;
+
+ if (grantpt(mfd) == -1 || unlockpt(mfd) == -1)
+ goto err1;
+
+ /* This does not match openpty specification,
+ * but as long as this does not hurt, this is acceptable.
+ */
+ mfd = sfd;
+
+ if (termp != NULL && tcgetattr(sfd, termp) < 0)
+ goto err1;
+
+ if (amaster)
+ *amaster = mfd;
+ if (aslave)
+ *aslave = sfd;
+ if (name)
+ strlcpy(name, ptsname(mfd), sizeof(slave));
+ if (winp)
+ ioctl(sfd, TIOCSWINSZ, winp);
+
+ return 0;
+
+err1:
+ close(mfd);
+err0:
+ return -1;
+}
+#endif
+
static int domain_create_tty(struct domain *dom)
{
+ char slave[80];
+ struct termios term;
char *path;
- int master;
+ int master, slavefd;
+ int err;
bool success;
+ char *data;
+ unsigned int len;
- if ((master = open("/dev/ptmx",O_RDWR|O_NOCTTY)) == -1 ||
- grantpt(master) == -1 || unlockpt(master) == -1) {
- dolog(LOG_ERR, "Failed to create tty for domain-%d",
- dom->domid);
+ if (openpty(&master, &slavefd, slave, &term, NULL) < 0) {
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);
- }
+ err = errno;
+ dolog(LOG_ERR, "Failed to create tty for domain-%d (errno = %i, %s)",
+ dom->domid, err, strerror(err));
+ return master;
+ }
+
+ cfmakeraw(&term);
+ if (tcsetattr(master, TCSAFLUSH, &term) < 0) {
+ err = errno;
+ dolog(LOG_ERR, "Failed to set tty attribute for domain-%d (errno = %i, %s)",
+ dom->domid, err, strerror(err));
+ goto out;
+ }
- if (dom->use_consolepath) {
- success = asprintf(&path, "%s/limit", dom->conspath) !=
- -1;
- if (!success)
- goto out;
- data = xs_read(xs, XBT_NULL, path, &len);
- if (data) {
- dom->buffer.max_capacity = strtoul(data, 0, 0);
- free(data);
- }
- free(path);
- }
- success = asprintf(&path, "%s/limit", dom->serialpath) != -1;
+ if (dom->use_consolepath) {
+ success = asprintf(&path, "%s/limit", dom->conspath) !=
+ -1;
if (!success)
goto out;
data = xs_read(xs, XBT_NULL, path, &len);
@@ -258,31 +300,39 @@ static int domain_create_tty(struct domain *dom)
free(data);
}
free(path);
+ }
+
+ success = asprintf(&path, "%s/limit", dom->serialpath) != -1;
+ if (!success)
+ goto out;
+ data = xs_read(xs, XBT_NULL, path, &len);
+ if (data) {
+ dom->buffer.max_capacity = strtoul(data, 0, 0);
+ free(data);
+ }
+ free(path);
- success = asprintf(&path, "%s/tty", dom->serialpath) != -1;
+ success = asprintf(&path, "%s/tty", dom->serialpath) != -1;
+ if (!success)
+ goto out;
+ success = xs_write(xs, XBT_NULL, path, slave, strlen(slave));
+ free(path);
+ if (!success)
+ goto out;
+
+ if (dom->use_consolepath) {
+ success = (asprintf(&path, "%s/tty", dom->conspath) != -1);
if (!success)
goto out;
success = xs_write(xs, XBT_NULL, path, slave, strlen(slave));
free(path);
if (!success)
goto out;
-
- if (dom->use_consolepath) {
- success = asprintf(&path, "%s/tty", dom->conspath) !=
- -1;
- if (!success)
- goto out;
- success = xs_write(xs, XBT_NULL, path, slave,
- strlen(slave));
- free(path);
- if (!success)
- goto out;
- }
-
- if (fcntl(master, F_SETFL, O_NONBLOCK) == -1)
- goto out;
}
+ if (fcntl(master, F_SETFL, O_NONBLOCK) == -1)
+ goto out;
+
return master;
out:
close(master);
@@ -410,7 +460,7 @@ static bool watch_domain(struct domain *dom, bool watch)
char domid_str[3 + MAX_STRLEN(dom->domid)];
bool success;
- sprintf(domid_str, "dom%u", dom->domid);
+ snprintf(domid_str, sizeof(domid_str), "dom%u", dom->domid);
if (watch) {
success = xs_watch(xs, dom->serialpath, domid_str);
if (success) {
diff --git a/tools/console/daemon/utils.c b/tools/console/daemon/utils.c
index 657bfa0cde..7b3cd19d5c 100644
--- a/tools/console/daemon/utils.c
+++ b/tools/console/daemon/utils.c
@@ -96,7 +96,7 @@ void daemonize(const char *pidfile)
exit(1);
}
- len = sprintf(buf, "%ld\n", (long)getpid());
+ len = snprintf(buf, sizeof(buf), "%ld\n", (long)getpid());
if (write(fd, buf, len) < 0)
exit(1);