const char *cg_upnp_event_subscription_tosidheaderstring(const char *sid, char *buf, size_t bufSize)
{
    ssize_t colonIdx;

    cg_log_debug_l4("Entering...\n");

    colonIdx = cg_strstr(sid, CG_UPNP_SUBSCRIPTION_UUID);
    if (0 <= colonIdx) {
        cg_strncpy(buf, sid, bufSize);
        buf[bufSize-1] = '\0';
        return buf;
    }

#if defined(HAVE_SNPRINTF)
    snprintf(buf, bufSize,
#else
    sprintf(buf,
#endif
        "%s%s",
        CG_UPNP_SUBSCRIPTION_UUID,
        sid);
    return buf;

    cg_log_debug_l4("Leaving...\n");
}
char *cg_upnp_usn_getudn(char *usn, char *udnBuf, int udnBufLen)
{
	int idx;
	
	cg_log_debug_l4("Entering...\n");

	if (usn == NULL) {
		udnBuf[0] = '\0';
		return udnBuf;
	}
	
	idx = cg_strstr(usn, "::");
	if (idx < 0) {
		cg_strncpy(udnBuf, usn, udnBufLen);
		udnBuf[udnBufLen-1] = '\0';
		cg_strtrim(udnBuf, " ", 1);
		return udnBuf;
	}
	
	if ( idx < udnBufLen ) {
		cg_strncpy(udnBuf, usn, (idx));
		udnBuf[idx] = '\0';
	}
	else {
		cg_strncpy(udnBuf, usn, udnBufLen);
		udnBuf[udnBufLen-1] = '\0';
	}
	
	cg_strtrim(udnBuf, " ", 1);

	cg_log_debug("UDN: %s\n", udnBuf);
	
	return udnBuf;

	cg_log_debug_l4("Leaving...\n");
}
int cg_net_getipv6scopeid(const char *addr)
{
    size_t addrLen;
    ssize_t perIdx;
    char scopeIDBuf[8+1];

    cg_log_debug_l4("Entering...\n");

    if (cg_net_isipv6address(addr) == FALSE)
        return 0;
    addrLen = cg_strlen(addr);
    perIdx = cg_strchr(addr, "%", 1);
    if (perIdx < 0)
        return 0;
    cg_strncpy(scopeIDBuf, (addr+perIdx+1), sizeof(scopeIDBuf)-1);
    scopeIDBuf[sizeof(scopeIDBuf)-1] = '\0';

    cg_log_debug_l4("Leaving...\n");

    return atoi(scopeIDBuf);
}