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.