//Before doing meshlink_join make sure we are not connected to another mesh
if(mesh->threadstarted) {
- logger(mesh, MESHLINK_DEBUG, "Already connected to a mesh\n");
+ logger(mesh, MESHLINK_ERROR, "Cannot join while started\n");
+ meshlink_errno = MESHLINK_EINVAL;
+ pthread_mutex_unlock(&(mesh->mesh_mutex));
+ return false;
+ }
+
+ // Refuse to join a mesh if we are already part of one. We are part of one if we know at least one other node.
+ if(mesh->nodes->count > 1) {
+ logger(mesh, MESHLINK_ERROR, "Already part of an existing mesh\n");
meshlink_errno = MESHLINK_EINVAL;
pthread_mutex_unlock(&(mesh->mesh_mutex));
return false;
return 1;
}
- free(baz_url);
-
if(!meshlink_start(mesh2)) {
fprintf(stderr, "Baz could not start\n");
return 1;
return 1;
}
+ // Check that an invitation cannot be used twice
+
+ if(meshlink_join(mesh3, baz_url)) {
+ fprintf(stderr, "Quux could join foo's mesh using an already used invitation\n");
+ return 1;
+ }
+
+ free(baz_url);
+
// Check that nodes cannot join with expired invitations
meshlink_set_invitation_timeout(mesh1, 0);
free(quux_url);
+ // Check that existing nodes cannot join another mesh
+
+ char *corge_url = meshlink_invite(mesh3, NULL, "corge");
+
+ if(!corge_url) {
+ fprintf(stderr, "Quux could not generate an invitation for corge\n");
+ return 1;
+ }
+
+ fprintf(stderr, "Invitation URL for corge: %s\n", corge_url);
+
+ if(!meshlink_start(mesh3)) {
+ fprintf(stderr, "Quux could not start\n");
+ return 1;
+ }
+
+ meshlink_stop(mesh2);
+
+ if(meshlink_join(mesh2, corge_url)) {
+ fprintf(stderr, "Bar could join twice\n");
+ return 1;
+ }
+
+ free(corge_url);
+
// Clean up.
meshlink_close(mesh3);