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