opendoas

my fork of doas with custom prompt
git clone git://git.kocotian.pl/opendoas.git
Log | Files | Refs | README | LICENSE

commit 619c319edfd6997dd321333c53a93329528f800d
parent c745626cdc84ce04ae3e9839a3f34d491b4985a3
Author: Duncaen <mail@duncano.de>
Date:   Tue, 12 Dec 2017 15:29:03 +0100

persist_timestamp: add session id to timestamps

Diffstat:
Mpersist_timestamp.c | 49+++++++++++++++++++++++--------------------------
1 file changed, 23 insertions(+), 26 deletions(-)

diff --git a/persist_timestamp.c b/persist_timestamp.c @@ -52,7 +52,7 @@ static int ttynr() { char buf[1024]; - char *p, *p1, *saveptr; + char *p, *saveptr; const char *errstr; int fd, n; @@ -65,14 +65,14 @@ ttynr() if (n == -1) { if (errno == EAGAIN || errno == EINTR) continue; - else - break; + break; } p += n; if (p >= buf + sizeof buf) break; } close(fd); + /* error if it contains NULL bytes */ if (n != 0 || memchr(buf, '\0', p - buf)) return -1; @@ -84,14 +84,13 @@ ttynr() */ if ((p = strrchr(buf, ')')) == NULL) return -1; - for ((p1 = strtok_r(p, " ", &saveptr)), n = 0; p1; - (p1 = strtok_r(NULL, " ", &saveptr)), n++) - if (n == 5) - break; - if (p1 == NULL || n != 5) + for ((p = strtok_r(p, " ", &saveptr)), n = 0; p && n < 5; + (p = strtok_r(NULL, " ", &saveptr)), n++) + ; + if (p == NULL || n != 5) return -1; - n = strtonum(p1, INT_MIN, INT_MAX, &errstr); + n = strtonum(p, INT_MIN, INT_MAX, &errstr); if (errstr) return -1; @@ -101,23 +100,21 @@ ttynr() #error "ttynr not implemented" #endif -static char pathbuf[PATH_MAX]; - -static int -tspath(const char **path) +static const char * +tspath() { + static char pathbuf[PATH_MAX]; int tty; - pid_t ppid; - if (*pathbuf == '\0') { - if ((tty = ttynr()) == -1) - errx(1, "failed to get tty number"); - ppid = getppid(); - if (snprintf(pathbuf, sizeof pathbuf, "%s/.%d_%d", - TIMESTAMP_DIR, tty, ppid) == -1) - return -1; - } - *path = pathbuf; - return 0; + pid_t ppid, sid; + if ((tty = ttynr()) == -1) + errx(1, "failed to get tty number"); + ppid = getppid(); + if ((sid = getsid(0)) == -1) + err(1, "getsid"); + if (snprintf(pathbuf, sizeof pathbuf, "%s/.%d_%d_%d", + TIMESTAMP_DIR, tty, ppid, sid) == -1) + return NULL; + return pathbuf; } static int @@ -228,7 +225,7 @@ persist_open(int *valid, int secs) gid_t gid; const char *path; - if (tspath(&path) == -1) + if ((path = tspath()) == NULL) errx(1, "failed to get timestamp path"); if (checktsdir(path)) errx(1, "checktsdir"); @@ -272,7 +269,7 @@ int persist_clear() { const char *path; - if (tspath(&path) == -1) + if ((path = tspath()) == NULL) errx(1, "failed to get timestamp path"); if (unlink(path) == -1 && errno != ENOENT) return -1;