]> xenbits.xensource.com Git - xen.git/commitdiff
xenconsoled: portability fixes:
authorKeir Fraser <keir@xensource.com>
Mon, 8 Oct 2007 09:55:50 +0000 (10:55 +0100)
committerKeir Fraser <keir@xensource.com>
Mon, 8 Oct 2007 09:55:50 +0000 (10:55 +0100)
 - Use openpty(), which does the same as the sequence
   of open(), grantpt(), unlockpt(), ptsname(), tcgetattr()
   simplifies code
 - Check return code from tcsetattr()
 - sprintf() -> snprintf()
 - OpenBSD lacks POSIX grantpt() and unlockpt()
   requires use of openpty()
 - Solaris lacks POSIX openpty() via feedback from SUN (John Levon)
   implement openpty() for Solaris, tested and ok'd by SUN (John
   Levon)

Signed-off-by: Christoph Egger <Christoph.Egger@amd.com>
config/StdGNU.mk
config/SunOS.mk
tools/console/Makefile
tools/console/daemon/io.c
tools/console/daemon/utils.c

index 4f08ea9a3088473122c12d37f8aee0c20eea46f4..87225f180e9d7d3378f32de518e99debcb8593b8 100644 (file)
@@ -21,6 +21,7 @@ LIB64DIR = lib64
 
 SOCKET_LIBS =
 CURSES_LIBS = -lncurses
+UTIL_LIBS = -lutil
 SONAME_LDFLAG = -soname
 SHLIB_CFLAGS = -shared
 
index 5c12fd4c23a7161902b03f98d169fd7b047f5205..ec290346f2cc819c10951d24e38f4e727f9639a2 100644 (file)
@@ -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
 
index 7a8e15c0a8c9cfa173e1501719c8518ae4fb38aa..445819ee8cefc803e772f5aa81e24d5a8ee60bbd 100644 (file)
@@ -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)
index 42015ebc290893af7767fe48e6b6106e985a90bd..dbc9a8326ce490037f3d3bbc5a3bd2cce2a46960 100644 (file)
@@ -26,7 +26,6 @@
 #include <xen/io/console.h>
 #include <xenctrl.h>
 
-#include <malloc.h>
 #include <stdlib.h>
 #include <errno.h>
 #include <string.h>
 #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) {
index 657bfa0cdede712f926ba7ca25ffb6037949d61d..7b3cd19d5cc25abc8d86343819074d122a913d56 100644 (file)
@@ -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);