int module_event_mcast (modhash_t *mh, const flux_msg_t *msg) { const char *topic; zlist_t *uuids; char *uuid; int rc = -1; if (flux_msg_get_topic (msg, &topic) < 0) goto done; if (!(uuids = zhash_keys (mh->zh_byuuid))) oom (); uuid = zlist_first (uuids); while (uuid) { module_t *p = zhash_lookup (mh->zh_byuuid, uuid); assert (p != NULL); if (match_sub (p, topic)) { if (module_sendmsg (p, msg) < 0) goto done; } uuid = zlist_next (uuids); } rc = 0; done: zlist_destroy (&uuids); return rc; }
static enum imap_match_result imap_match_pattern(struct imap_match_context *ctx, const char *data, const char *pattern) { enum imap_match_result ret, match; ctx->inboxcase_end = data; if (ctx->inboxcase && strncasecmp(data, inbox, INBOXLEN) == 0 && (data[INBOXLEN] == '\0' || data[INBOXLEN] == ctx->sep)) { /* data begins with INBOX/, use case-insensitive comparison for it */ ctx->inboxcase_end += INBOXLEN; } if (*pattern != '*') { /* handle the pattern up to the first '*' */ ret = match_sub(ctx, &data, &pattern); if (ret != IMAP_MATCH_YES || *pattern == '\0') return ret; } match = IMAP_MATCH_CHILDREN; while (*pattern == '*') { pattern++; if (*pattern == '\0') return IMAP_MATCH_YES; while (*data != '\0') { if (CMP_CUR_CHR(ctx, data, pattern)) { ret = match_sub(ctx, &data, &pattern); if (ret == IMAP_MATCH_YES) break; match |= ret; } data++; } } return *data == '\0' && *pattern == '\0' ? IMAP_MATCH_YES : match; }
static enum imap_match_result match_sub(struct imap_match_context *ctx, const char **data_p, const char **pattern_p) { enum imap_match_result ret, match; unsigned int i; const char *data = *data_p, *pattern = *pattern_p; /* match all non-wildcards */ i = 0; while (pattern[i] != '\0' && pattern[i] != '*' && pattern[i] != '%') { if (!CMP_CUR_CHR(ctx, data+i, pattern+i)) { if (data[i] != '\0') return IMAP_MATCH_NO; if (pattern[i] == ctx->sep) return IMAP_MATCH_CHILDREN; if (i > 0 && pattern[i-1] == ctx->sep) { /* data="foo/" pattern = "foo/bar/%" */ return IMAP_MATCH_CHILDREN; } return IMAP_MATCH_NO; } i++; } data += i; pattern += i; if (*data == '\0' && *data_p != data && data[-1] == ctx->sep && *pattern != '\0') { /* data="/" pattern="/%..." */ match = IMAP_MATCH_CHILDREN; } else { match = IMAP_MATCH_NO; } while (*pattern == '%') { pattern++; if (*pattern == '\0') { /* match, if this is the last hierarchy */ while (*data != '\0' && *data != ctx->sep) data++; break; } /* skip over this hierarchy */ while (*data != '\0') { if (CMP_CUR_CHR(ctx, data, pattern)) { ret = match_sub(ctx, &data, &pattern); if (ret == IMAP_MATCH_YES) break; match |= ret; } if (*data == ctx->sep) break; data++; } } if (*pattern != '*') { if (*data == '\0' && *pattern != '\0') { if (*pattern == ctx->sep) match |= IMAP_MATCH_CHILDREN; return match; } if (*data != '\0') { if (*pattern == '\0' && *data == ctx->sep) match |= IMAP_MATCH_PARENT; return match; } } *data_p = data; *pattern_p = pattern; return IMAP_MATCH_YES; }