All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Christoph Egger" <Christoph.Egger@amd.com>
To: xen-devel@lists.xensource.com
Subject: [PATCH][TOOLS] console: portability fixes
Date: Mon, 8 Oct 2007 09:34:00 +0200	[thread overview]
Message-ID: <200710080934.00694.Christoph.Egger@amd.com> (raw)

[-- 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

                 reply	other threads:[~2007-10-08  7:34 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200710080934.00694.Christoph.Egger@amd.com \
    --to=christoph.egger@amd.com \
    --cc=xen-devel@lists.xensource.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.