/* match the DNS name pattern from the peer certificate against our configured peer hostname */ static bool match_dns_pattern( const char *hostname, const char *pattern, int plen ) { int slen = (int) strlen(hostname); if (memchr( pattern, '*', plen ) == NULL) return (plen == slen && pn_strncasecmp( pattern, hostname, plen ) == 0); /* dns wildcarded pattern - RFC2818 */ char plabel[64]; /* max label length < 63 - RFC1034 */ char slabel[64]; while (plen > 0 && slen > 0) { const char *cptr; int len; cptr = (const char *) memchr( pattern, '.', plen ); len = (cptr) ? cptr - pattern : plen; if (len > (int) sizeof(plabel) - 1) return false; memcpy( plabel, pattern, len ); plabel[len] = 0; if (cptr) ++len; // skip matching '.' pattern += len; plen -= len; cptr = (const char *) memchr( hostname, '.', slen ); len = (cptr) ? cptr - hostname : slen; if (len > (int) sizeof(slabel) - 1) return false; memcpy( slabel, hostname, len ); slabel[len] = 0; if (cptr) ++len; // skip matching '.' hostname += len; slen -= len; char *star = strchr( plabel, '*' ); if (!star) { if (pn_strcasecmp( plabel, slabel )) return false; } else { *star = '\0'; char *prefix = plabel; int prefix_len = strlen(prefix); char *suffix = star + 1; int suffix_len = strlen(suffix); if (prefix_len && pn_strncasecmp( prefix, slabel, prefix_len )) return false; if (suffix_len && pn_strncasecmp( suffix, slabel + (strlen(slabel) - suffix_len), suffix_len )) return false; } } return plen == slen; }
bool pn_env_bool(const char *name) { char *v = getenv(name); return v && (!pn_strcasecmp(v, "true") || !pn_strcasecmp(v, "1") || !pn_strcasecmp(v, "yes") || !pn_strcasecmp(v, "on")); }