static void create_services(AvahiServer *s) {
    char r[128];
    int ret;
    assert(s);

    /* If this is the first time we're called, let's create a new entry group */
    if (!group)
        if (!(group = avahi_s_entry_group_new(s, entry_group_callback, NULL))) {
            fprintf(stderr, "avahi_entry_group_new() failed: %s\n", avahi_strerror(avahi_server_errno(s)));
            goto fail;
        }

    fprintf(stderr, "Adding service '%s'\n", name);

    /* Create some random TXT data */
    snprintf(r, sizeof(r), "random=%i", rand());

    /* Add the service for IPP */
    if ((ret = avahi_server_add_service(s, group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, name, "_ipp._tcp", NULL, NULL, 651, "test=blah", r, NULL)) < 0) {
        fprintf(stderr, "Failed to add _ipp._tcp service: %s\n", avahi_strerror(ret));
        goto fail;
    }

    /* Add the same service for BSD LPR */
    if ((ret = avahi_server_add_service(s, group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, name, "_printer._tcp", NULL, NULL, 515, NULL)) < 0) {
        fprintf(stderr, "Failed to add _printer._tcp service: %s\n", avahi_strerror(ret));
        goto fail;
    }

    /* Add an additional (hypothetic) subtype */
    if ((ret = avahi_server_add_service_subtype(s, group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC, 0, name, "_printer._tcp", NULL, "_magic._sub._printer._tcp") < 0)) {
        fprintf(stderr, "Failed to add subtype _magic._sub._printer._tcp: %s\n", avahi_strerror(ret));
        goto fail;
    }

    /* Tell the server to register the service */
    if ((ret = avahi_s_entry_group_commit(group)) < 0) {
        fprintf(stderr, "Failed to commit entry_group: %s\n", avahi_strerror(ret));
        goto fail;
    }

    return;

fail:
    avahi_simple_poll_quit(simple_poll);
}
void ControllerDiscoveryMDNS::create_service( AvahiServer * server )
{
    if ( !group )
    {
        group = avahi_s_entry_group_new( server, avahi_entry_group_callback, this );

        if ( !group )
        {
            g_warning( "FAILED TO CREATE AVAHI ENTRY GROUP : %s", avahi_strerror( avahi_server_errno( server ) ) );
        }
    }

    if ( group )
    {
        if ( avahi_s_entry_group_is_empty( group ) )
        {
            int ret = AVAHI_OK;

            while ( true )
            {
                // TODO: this could loop forever...maybe we should bail at some stage

                ret = avahi_server_add_service( server, group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
                                                AvahiPublishFlags( 0 ), name.c_str(), TP_REMOTE_MDNS_SERVICE, NULL, NULL, port, NULL );

                if ( ret == AVAHI_ERR_COLLISION )
                {
                    rename();
                }
                else
                {
                    break;
                }
            }

            if ( ret != AVAHI_OK )
            {
                g_warning( "FAILED TO ADD AVAHI SERVICE : %s", avahi_strerror( ret ) );
            }
            else
            {
                while ( true )
                {
                    // TODO: this could loop forever...maybe we should bail at some stage

                    ret = avahi_server_add_service( server, group, AVAHI_IF_UNSPEC, AVAHI_PROTO_UNSPEC,
                                                    AvahiPublishFlags( 0 ), name.c_str(), TP_HTTP_MDNS_SERVICE, NULL, NULL, http_port, NULL );

                    if ( ret == AVAHI_ERR_COLLISION )
                    {
                        rename();
                    }
                    else
                    {
                        break;
                    }
                }


                if ( ret != AVAHI_OK )
                {
                    g_warning( "FAILED TO ADD AVAHI SERVICE : %s", avahi_strerror( ret ) );
                }
                else
                {
					ret = avahi_s_entry_group_commit( group );

					if ( ret != AVAHI_OK )
					{
						g_warning( "FAILED TO COMMIT AVAHI SERVICE : %s", avahi_strerror( ret ) );
					}
                }
            }
        }
    }
}