diff options
author | Keir Fraser <keir@xensource.com> | 2007-10-08 10:55:50 +0100 |
---|---|---|
committer | Keir Fraser <keir@xensource.com> | 2007-10-08 10:55:50 +0100 |
commit | b2ac1c4e5053c53e128e74bd0de178e1857a0d5d (patch) | |
tree | 1d027bc4bd8915c7ddcf3e5f5038b533d964b2a4 /tools/console/daemon | |
parent | f94f6e258de82f13747c7b00e2569c12b96c7011 (diff) | |
download | xen-b2ac1c4e5053c53e128e74bd0de178e1857a0d5d.tar.gz xen-b2ac1c4e5053c53e128e74bd0de178e1857a0d5d.tar.bz2 xen-b2ac1c4e5053c53e128e74bd0de178e1857a0d5d.zip |
xenconsoled: 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>
Diffstat (limited to 'tools/console/daemon')
-rw-r--r-- | tools/console/daemon/io.c | 142 | ||||
-rw-r--r-- | tools/console/daemon/utils.c | 2 |
2 files changed, 97 insertions, 47 deletions
diff --git a/tools/console/daemon/io.c b/tools/console/daemon/io.c index 42015ebc29..dbc9a8326c 100644 --- a/tools/console/daemon/io.c +++ b/tools/console/daemon/io.c @@ -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 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) { diff --git a/tools/console/daemon/utils.c b/tools/console/daemon/utils.c index 657bfa0cde..7b3cd19d5c 100644 --- a/tools/console/daemon/utils.c +++ b/tools/console/daemon/utils.c @@ -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); |