]> git.meshlink.io Git - meshlink/blobdiff - src/discovery.c
Ensure Catta gets a valid service name.
[meshlink] / src / discovery.c
index 9064523c9c603222cd2e55bd8736a56c1f712ec5..72ff8bc5b5c6b57adae057e4c6db0fdb8d12d7f2 100644 (file)
@@ -341,6 +341,7 @@ static void discovery_log_cb(CattaLogLevel level, const char *txt) {
 }
 
 static void *discovery_loop(void *userdata) {
+       bool status = false;
        meshlink_handle_t *mesh = userdata;
        assert(mesh != NULL);
 
@@ -348,7 +349,21 @@ static void *discovery_loop(void *userdata) {
        catta_set_log_function(discovery_log_cb);
 
        // create service type string
-       size_t servicetype_strlen = sizeof(MESHLINK_MDNS_SERVICE_TYPE) + strlen(mesh->appname) + 1;
+       char appname[strlen(mesh->appname) + 2];
+       strcpy(appname, mesh->appname);
+
+       for(char *p = appname; *p; p++) {
+               if(!isalnum(*p) && *p != '_' && *p != '-') {
+                       *p = '_';
+               }
+       }
+
+       if(!appname[1]) {
+               appname[1] = '_';
+               appname[2] = '\0';
+       }
+
+       size_t servicetype_strlen = sizeof(MESHLINK_MDNS_SERVICE_TYPE) + strlen(appname) + 1;
        mesh->catta_servicetype = malloc(servicetype_strlen);
 
        if(mesh->catta_servicetype == NULL) {
@@ -356,7 +371,7 @@ static void *discovery_loop(void *userdata) {
                goto fail;
        }
 
-       snprintf(mesh->catta_servicetype, servicetype_strlen, MESHLINK_MDNS_SERVICE_TYPE, mesh->appname);
+       snprintf(mesh->catta_servicetype, servicetype_strlen, MESHLINK_MDNS_SERVICE_TYPE, appname);
 
        // Allocate discovery loop object
        if(!(mesh->catta_poll = catta_simple_poll_new())) {
@@ -397,13 +412,17 @@ static void *discovery_loop(void *userdata) {
                goto fail;
        }
 
+       status = true;
+
+fail:
+
        pthread_mutex_lock(&mesh->discovery_mutex);
        pthread_cond_broadcast(&mesh->discovery_cond);
        pthread_mutex_unlock(&mesh->discovery_mutex);
 
-       catta_simple_poll_loop(mesh->catta_poll);
-
-fail:
+       if(status) {
+               catta_simple_poll_loop(mesh->catta_poll);
+       }
 
        if(mesh->catta_browser != NULL) {
                catta_s_service_browser_free(mesh->catta_browser);