about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog5
-rw-r--r--Doc/Zsh/params.yo14
-rw-r--r--Src/watch.c27
3 files changed, 42 insertions, 4 deletions
diff --git a/ChangeLog b/ChangeLog
index cca917efe..7c52b4aee 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2015-02-11  Peter Stephenson  <p.stephenson@samsung.com>
+
+	* users/19850: Doc/Zsh/params.yo, Src/watch.c: watch variable
+	supports patterns for user, tty and host names.
+
 2015-02-10  Mikael Magnusson  <mikachu@gmail.com>
 
 	* 34488: Src/builtin.c: Fix use-after-free for print -zf and
diff --git a/Doc/Zsh/params.yo b/Doc/Zsh/params.yo
index ee7c05412..273be21e4 100644
--- a/Doc/Zsh/params.yo
+++ b/Doc/Zsh/params.yo
@@ -1472,15 +1472,27 @@ vindex(watch)
 vindex(WATCH)
 item(tt(watch) <S> <Z> (tt(WATCH) <S>))(
 An array (colon-separated list) of login/logout events to report.
+
 If it contains the single word `tt(all)', then all login/logout events
 are reported.  If it contains the single word `tt(notme)', then all
 events are reported as with `tt(all)' except tt($USERNAME).
+
 An entry in this list may consist of a username,
 an `tt(@)' followed by a remote hostname,
-and a `tt(%)' followed by a line (tty).
+and a `tt(%)' followed by a line (tty).  Any of these may
+be a pattern (be sure to quote this during the assignment to
+tt(watch) so that it does not immediately perform file generation);
+the setting of the tt(EXTENDED_GLOB) option is respected.
 Any or all of these components may be present in an entry;
 if a login/logout event matches all of them,
 it is reported.
+
+For example, with the tt(EXTENDED_GLOB) option set, the following:
+
+example(watch=('^(pws|barts)'))
+
+causes reports for activity assoicated with any user other than tt(pws)
+or tt(barts).
 )
 vindex(WATCHFMT)
 item(tt(WATCHFMT))(
diff --git a/Src/watch.c b/Src/watch.c
index 8dea0b495..fe409f91a 100644
--- a/Src/watch.c
+++ b/Src/watch.c
@@ -372,6 +372,27 @@ watchlog2(int inout, WATCH_STRUCT_UTMP *u, char *fmt, int prnt, int fini)
     return fmt;
 }
 
+/* See if the watch entry matches */
+
+static int
+watchlog_match(char *teststr, char *actual, int len)
+{
+    int ret = 0;
+    Patprog pprog;
+    char *str = dupstring(teststr);
+
+    tokenize(str);
+
+    if ((pprog = patcompile(str, PAT_STATIC, 0))) {
+	queue_signals();
+	if (pattry(pprog, actual))
+	    ret = 1;
+	unqueue_signals();
+    } else if (!strncmp(actual, teststr, len))
+	ret = 1;
+    return ret;
+}
+
 /* check the List for login/logouts */
 
 /**/
@@ -400,7 +421,7 @@ watchlog(int inout, WATCH_STRUCT_UTMP *u, char **w, char *fmt)
 	    for (vv = v; *vv && *vv != '@' && *vv != '%'; vv++);
 	    sav = *vv;
 	    *vv = '\0';
-	    if (strncmp(u->ut_name, v, sizeof(u->ut_name)))
+	    if (!watchlog_match(v, u->ut_name, sizeof(u->ut_name)))
 		bad = 1;
 	    *vv = sav;
 	    v = vv;
@@ -410,7 +431,7 @@ watchlog(int inout, WATCH_STRUCT_UTMP *u, char **w, char *fmt)
 		for (vv = ++v; *vv && *vv != '@'; vv++);
 		sav = *vv;
 		*vv = '\0';
-		if (strncmp(u->ut_line, v, sizeof(u->ut_line)))
+		if (!watchlog_match(v, u->ut_line, sizeof(u->ut_line)))
 		    bad = 1;
 		*vv = sav;
 		v = vv;
@@ -420,7 +441,7 @@ watchlog(int inout, WATCH_STRUCT_UTMP *u, char **w, char *fmt)
 		for (vv = ++v; *vv && *vv != '%'; vv++);
 		sav = *vv;
 		*vv = '\0';
-		if (strncmp(u->ut_host, v, strlen(v)))
+		if (!watchlog_match(v, u->ut_host, strlen(v)))
 		    bad = 1;
 		*vv = sav;
 		v = vv;