From: Lennart Poettering Date: Mon, 14 Mar 2011 01:33:23 +0000 (+0100) Subject: util: properly identify pty devices by their major X-Git-Tag: v21~110 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=46824d0e6b2aae8f503464368d02c1da992f56f1 util: properly identify pty devices by their major --- diff --git a/src/util.c b/src/util.c index c9366c4a3..ee6217d64 100644 --- a/src/util.c +++ b/src/util.c @@ -2865,7 +2865,7 @@ int getttyname_harder(int fd, char **r) { if (streq(s, "tty")) { free(s); - return get_ctty(r); + return get_ctty(r, NULL); } *r = s; @@ -2907,7 +2907,7 @@ int get_ctty_devnr(dev_t *d) { return 0; } -int get_ctty(char **r) { +int get_ctty(char **r, dev_t *_devnr) { int k; char fn[128], *s, *b, *p; dev_t devnr; @@ -2925,6 +2925,18 @@ int get_ctty(char **r) { if (k != -ENOENT) return k; + /* This is an ugly hack */ + if (major(devnr) == 136) { + if (asprintf(&b, "pts/%lu", (unsigned long) minor(devnr)) < 0) + return -ENOMEM; + + *r = b; + if (_devnr) + *_devnr = devnr; + + return 0; + } + /* Probably something like the ptys which have no * symlink in /dev/char. Let's return something * vaguely useful. */ @@ -2933,6 +2945,9 @@ int get_ctty(char **r) { return -ENOMEM; *r = b; + if (_devnr) + *_devnr = devnr; + return 0; } @@ -2950,6 +2965,9 @@ int get_ctty(char **r) { return -ENOMEM; *r = b; + if (_devnr) + *_devnr = devnr; + return 0; } diff --git a/src/util.h b/src/util.h index 13e5f6203..320bcd7c3 100644 --- a/src/util.h +++ b/src/util.h @@ -337,7 +337,7 @@ int getttyname_malloc(int fd, char **r); int getttyname_harder(int fd, char **r); int get_ctty_devnr(dev_t *d); -int get_ctty(char **r); +int get_ctty(char **r, dev_t *_devnr); int chmod_and_chown(const char *path, mode_t mode, uid_t uid, gid_t gid);