diff options
author | Peter Stephenson <pws@zsh.org> | 2015-02-11 12:52:22 +0000 |
---|---|---|
committer | Peter Stephenson <pws@zsh.org> | 2015-02-11 12:52:22 +0000 |
commit | 638bccb1c5e85da44f0dd551cc97bd522e633b4b (patch) | |
tree | 12854215893d51eb6e5d5164852d9452460d9e62 /Src/watch.c | |
parent | 0209635832f519401ce9c45b675ef871be105cfc (diff) | |
download | zsh-638bccb1c5e85da44f0dd551cc97bd522e633b4b.tar.gz zsh-638bccb1c5e85da44f0dd551cc97bd522e633b4b.tar.xz zsh-638bccb1c5e85da44f0dd551cc97bd522e633b4b.zip |
users/19850: add pattern support to watch variable
Diffstat (limited to 'Src/watch.c')
-rw-r--r-- | Src/watch.c | 27 |
1 files changed, 24 insertions, 3 deletions
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; |