Logo Search packages:      
Sourcecode: avahi version File versions  Download package

char* avahi_alternative_service_name ( const char *  s  ) 

Find an alternative for the specified service name. If called with an original service name, " #2" is appended. Afterwards the number is increased on each call (i.e. "foo" becomes "foo #2" becomes "foo #3" and so on.) avahi_free() the result.

Definition at line 117 of file alternative.c.

References AVAHI_LABEL_MAX.

                                                    {
    const char *e;
    char *r;

    assert(s);

    if (!avahi_is_valid_service_name(s))
        return NULL;

    if ((e = strstr(s, " #"))) {
        const char *n, *p;
        e += 2;

        while ((n = strstr(e, " #")))
            e = n + 2;

        for (p = e; *p; p++)
            if (!isdigit(*p)) {
                e = NULL;
                break;
            }

        if (e && (*e == '0' || *e == 0))
            e = NULL;
    }

    if (e) {
        char *c, *m;
        size_t l;
        int n;

        n = atoi(e)+1;
        if (!(m = avahi_strdup_printf("%i", n)))
            return NULL;

        l = e-s-2;

        if (l >= AVAHI_LABEL_MAX-1-strlen(m)-2)
            l = AVAHI_LABEL_MAX-1-strlen(m)-2;

        if (!(c = avahi_strndup(s, l))) {
            avahi_free(m);
            return NULL;
        }

        drop_incomplete_utf8(c);

        r = avahi_strdup_printf("%s #%s", c, m);
        avahi_free(c);
        avahi_free(m);
    } else {
        char *c;

        if (!(c = avahi_strndup(s, AVAHI_LABEL_MAX-1-3)))
            return NULL;

        drop_incomplete_utf8(c);

        r = avahi_strdup_printf("%s #2", c);
        avahi_free(c);
    }

    assert(avahi_is_valid_service_name(r));

    return r;
}


Generated by  Doxygen 1.6.0   Back to index