summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libexec/getty/gettytab.527
-rw-r--r--libexec/getty/subr.c73
2 files changed, 48 insertions, 52 deletions
diff --git a/libexec/getty/gettytab.5 b/libexec/getty/gettytab.5
index 16cd15a..89c51c5 100644
--- a/libexec/getty/gettytab.5
+++ b/libexec/getty/gettytab.5
@@ -28,7 +28,7 @@
.\" from: @(#)gettytab.5 8.4 (Berkeley) 4/19/94
.\" $FreeBSD$
.\" "
-.Dd April 19, 1994
+.Dd February 2, 2017
.Dt GETTYTAB 5
.Os
.Sh NAME
@@ -118,7 +118,7 @@ character
.Em NOT
hangup line on last close
.It "he str" Ta Dv NULL Ta
-.No "hostname editing string"
+.No "hostname editing regular expression"
.It "hn str hostname hostname"
.It "ht bool false terminal has real tabs"
.It "hw bool false do cts/rts hardware flow control"
@@ -302,18 +302,13 @@ but may also be overridden by the
table entry.
In either case it may be edited with the
.Va \&he
-string.
-A '@' in the
-.Va \&he
-string causes one character from the real hostname to
-be copied to the final hostname.
-A '#' in the
-.Va \&he
-string causes the next character of the real hostname
-to be skipped.
-Each character that
-is neither '@' nor '#' is copied into the final hostname.
-Surplus '@' and '#' characters are ignored.
+POSIX
+.Dq extended
+regular expression, which is matched against the hostname.
+If there are no parenthesized subexpressions in the pattern,
+the entire matched string is used as the final hostname;
+otherwise, the first matched subexpression is used instead.
+If the pattern does not match, the original hostname is not modified.
.It \&%t
The tty name.
.It "\&%m, \&%r, \&%s, \&%v"
@@ -528,10 +523,6 @@ of the delay algorithms are not implemented.
The terminal driver should support sane delay settings.
.Pp
The
-.Va \&he
-capability is stupid.
-.Pp
-The
.Xr termcap 5
format is horrid, something more rational should
have been chosen.
diff --git a/libexec/getty/subr.c b/libexec/getty/subr.c
index 4716e97..2496b4c 100644
--- a/libexec/getty/subr.c
+++ b/libexec/getty/subr.c
@@ -43,6 +43,7 @@ static const char rcsid[] =
#include <sys/time.h>
#include <poll.h>
+#include <regex.h>
#include <stdlib.h>
#include <string.h>
#include <syslog.h>
@@ -53,8 +54,6 @@ static const char rcsid[] =
#include "pathnames.h"
#include "extern.h"
-
-
/*
* Get a table entry.
*/
@@ -469,42 +468,48 @@ adelay(int ms, struct delayval *dp)
char editedhost[MAXHOSTNAMELEN];
void
-edithost(const char *pat)
+edithost(const char *pattern)
{
- const char *host = HN;
- char *res = editedhost;
-
- if (!pat)
- pat = "";
- while (*pat) {
- switch (*pat) {
-
- case '#':
- if (*host)
- host++;
- break;
-
- case '@':
- if (*host)
- *res++ = *host++;
- break;
+ regex_t regex;
+ regmatch_t *match;
+ int found;
+
+ if (pattern == NULL || *pattern == '\0')
+ goto copyasis;
+ if (regcomp(&regex, pattern, REG_EXTENDED) != 0)
+ goto copyasis;
+
+ match = calloc(regex.re_nsub + 1, sizeof(*match));
+ if (match == NULL) {
+ regfree(&regex);
+ goto copyasis;
+ }
- default:
- *res++ = *pat;
- break;
+ found = !regexec(&regex, HN, regex.re_nsub + 1, match, 0);
+ if (found) {
+ size_t subex, totalsize;
- }
- if (res == &editedhost[sizeof editedhost - 1]) {
- *res = '\0';
- return;
- }
- pat++;
+ /*
+ * We found a match. If there were no parenthesized
+ * subexpressions in the pattern, use entire matched
+ * string as ``editedhost''; otherwise use the first
+ * matched subexpression.
+ */
+ subex = !!regex.re_nsub;
+ totalsize = match[subex].rm_eo - match[subex].rm_so + 1;
+ strlcpy(editedhost, HN + match[subex].rm_so, totalsize >
+ sizeof(editedhost) ? sizeof(editedhost) : totalsize);
}
- if (*host)
- strncpy(res, host, sizeof editedhost - (res - editedhost) - 1);
- else
- *res = '\0';
- editedhost[sizeof editedhost - 1] = '\0';
+ free(match);
+ regfree(&regex);
+ if (found)
+ return;
+ /*
+ * In case of any errors, or if the pattern did not match, pass
+ * the original hostname as is.
+ */
+ copyasis:
+ strlcpy(editedhost, HN, sizeof(editedhost));
}
static struct speedtab {
OpenPOWER on IntegriCloud