+static submesh_t *submesh_new(meshlink_handle_t *mesh, const char *submesh) {
+ submesh_t *s = NULL;
+
+ s = new_submesh();
+ s->name = xstrdup(submesh);
+
+ submesh_add(mesh, (submesh_t *)s);
+ return s;
+}
+
+submesh_t *create_submesh(meshlink_handle_t *mesh, const char *submesh) {
+ submesh_t *s = NULL;
+
+ if(0 == strcmp(submesh, CORE_MESH)) {
+ logger(NULL, MESHLINK_ERROR, "Cannot create submesh handle for core mesh!\n");
+ meshlink_errno = MESHLINK_EINVAL;
+ return NULL;
+ }
+
+ if(!check_id(submesh)) {
+ logger(NULL, MESHLINK_ERROR, "Invalid SubMesh Id!\n");
+ meshlink_errno = MESHLINK_EINVAL;
+ return NULL;
+ }
+
+ s = lookup_submesh(mesh, submesh);
+
+ if(s) {
+ logger(NULL, MESHLINK_ERROR, "SubMesh Already exists!\n");
+ meshlink_errno = MESHLINK_EEXIST;
+ return NULL;
+ }
+
+ s = submesh_new(mesh, submesh);
+
+ meshlink_errno = MESHLINK_OK;
+ return s;
+}
+
+submesh_t *lookup_or_create_submesh(meshlink_handle_t *mesh, const char *submesh) {
+ submesh_t *s = NULL;
+
+ if(0 == strcmp(submesh, CORE_MESH)) {
+ logger(NULL, MESHLINK_ERROR, "Cannot create submesh handle for core mesh!\n");
+ meshlink_errno = MESHLINK_EINVAL;
+ return NULL;
+ }
+
+ if(!check_id(submesh)) {
+ logger(NULL, MESHLINK_ERROR, "Invalid SubMesh Id!\n");
+ meshlink_errno = MESHLINK_EINVAL;
+ return NULL;
+ }
+
+ s = lookup_submesh(mesh, submesh);
+
+ if(s) {
+ meshlink_errno = MESHLINK_OK;
+ return s;
+ }
+
+ s = submesh_new(mesh, submesh);
+
+ meshlink_errno = MESHLINK_OK;
+ return s;
+}
+