All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH][TOOLS] console: portability fixes
@ 2007-10-08  7:34 Christoph Egger
  0 siblings, 0 replies; only message in thread
From: Christoph Egger @ 2007-10-08  7:34 UTC (permalink / raw)
  To: xen-devel

[-- Attachment #1: Type: text/plain, Size: 962 bytes --]


Hi!

Attached patch adds portability fixes:
- 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>


-- 
AMD Saxony, Dresden, Germany
Operating System Research Center

Legal Information:
AMD Saxony Limited Liability Company & Co. KG
Sitz (Geschäftsanschrift):
   Wilschdorfer Landstr. 101, 01109 Dresden, Deutschland
Registergericht Dresden: HRA 4896
vertretungsberechtigter Komplementär:
   AMD Saxony LLC (Sitz Wilmington, Delaware, USA)
Geschäftsführer der AMD Saxony LLC:
   Dr. Hans-R. Deppe, Thomas McCoy

[-- Attachment #2: tools_console.diff --]
[-- Type: text/plain, Size: 6462 bytes --]

diff -r 61ef23e45e9c config/StdGNU.mk
--- a/config/StdGNU.mk	Fri Oct 05 14:11:36 2007 +0100
+++ b/config/StdGNU.mk	Fri Oct 05 15:54:21 2007 +0000
@@ -21,6 +21,7 @@ LIB64DIR = lib64
 
 SOCKET_LIBS =
 CURSES_LIBS = -lncurses
+UTIL_LIBS = -lutil
 SONAME_LDFLAG = -soname
 SHLIB_CFLAGS = -shared
 
diff -r 61ef23e45e9c config/SunOS.mk
--- a/config/SunOS.mk	Fri Oct 05 14:11:36 2007 +0100
+++ b/config/SunOS.mk	Fri Oct 05 15:54:21 2007 +0000
@@ -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 -r 61ef23e45e9c tools/console/Makefile
--- a/tools/console/Makefile	Fri Oct 05 14:11:36 2007 +0100
+++ b/tools/console/Makefile	Fri Oct 05 15:54:21 2007 +0000
@@ -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 -r 61ef23e45e9c tools/console/daemon/io.c
--- a/tools/console/daemon/io.c	Fri Oct 05 14:11:36 2007 +0100
+++ b/tools/console/daemon/io.c	Fri Oct 05 15:54:21 2007 +0000
@@ -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 doma
 	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;
-
-	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);
+	char *data;
+	unsigned int len;
+
+	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);
-		}
-
-		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;
+		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);
@@ -258,30 +300,38 @@ static int domain_create_tty(struct doma
 			free(data);
 		}
 		free(path);
-
-		success = asprintf(&path, "%s/tty", dom->serialpath) != -1;
+	}
+
+	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;
+	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:
@@ -410,7 +460,7 @@ static bool watch_domain(struct domain *
 	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 -r 61ef23e45e9c tools/console/daemon/utils.c
--- a/tools/console/daemon/utils.c	Fri Oct 05 14:11:36 2007 +0100
+++ b/tools/console/daemon/utils.c	Fri Oct 05 15:54:21 2007 +0000
@@ -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);
 

[-- Attachment #3: Type: text/plain, Size: 138 bytes --]

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xensource.com
http://lists.xensource.com/xen-devel

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2007-10-08  7:34 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-10-08  7:34 [PATCH][TOOLS] console: portability fixes Christoph Egger

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.