static void mqtt_onConnect( struct mosquitto *client, void *data, int rc) { /* Subscribe to topic when connected to the broker */ mqtt_Connector this = data; if (rc != 0) { corto_error("mqtt: unable to connect to %s", this->host); } else { corto_id topic; strcpy(topic, this->topic); corto_ok("mqtt: connected to %s", this->host); /* Subscribe to subtree of mountpoint */ if (*topic && strcmp(topic, "/")) { strcat(topic, "/#"); } else { strcpy(topic, "#"); } corto_trace("mqtt: subscribing to %s", topic); if (mosquitto_subscribe(client, 0, topic, 1)) { corto_error("mqtt: failed to subscribe for topic"); } corto_ok("mqtt: subscribed to %s", topic); } }
char* corto_value_exprStr(corto_value* v, char* buffer, unsigned int length) { corto_member m; corto_value* parents[CORTO_MAX_INHERITANCE_DEPTH]; corto_int32 parentCount, i; corto_value* vptr; *buffer = '\0'; /* Collect parents */ parentCount = 0; vptr = v; do{ if (vptr->kind != CORTO_OBJECT) { parents[parentCount] = vptr; parentCount++; } }while((vptr = vptr->parent)); /* Put name of member or branch in buffer */ for(i=parentCount-1; i>=0; i--) { vptr = parents[i]; m = NULL; switch(vptr->kind) { case CORTO_LITERAL: case CORTO_VALUE: case CORTO_MEM: break; case CORTO_BASE: break; case CORTO_MEMBER: m = vptr->is.member.t; break; case CORTO_ELEMENT: sprintf(buffer, "%s[%d]", buffer, vptr->is.element.t.index); m = NULL; break; default: corto_trace("corto_value_exprStr: unhandled '%s'", corto_valueKindString[vptr->kind]); m = NULL; goto error; } if (m) { if ((strlen(buffer) + strlen(corto_idof(m)) + 1) >= length) { corto_error("buffer passed to corto_strving is too short for member name"); } else { strcat(buffer, "."); strcat(buffer, corto_idof(m)); } } } return buffer; error: return NULL; }
static corto_dl corto_load_validLibrary(corto_string fileName, corto_string *build_out) { corto_dl result = NULL; corto_string ___ (*build)(void); corto_string ___ (*library)(void); if (build_out) { *build_out = NULL; } if (!(result = corto_dlOpen(fileName))) { corto_seterr("%s", corto_dlError()); goto error; } /* Lookup build function */ build = (corto_string ___ (*)(void))corto_dlProc(result, "corto_getBuild"); library = (corto_string ___ (*)(void))corto_dlProc(result, "corto_getLibrary"); /* Validate version */ if (build && strcmp(build(), corto_getBuild())) { corto_seterr( "corto: library '%s' links with conflicting corto library\n" " links with: '%s' (%s)\n" " current: '%s' (%s)\n", fileName, library ? library() : "???", build(), corto_getLibrary(), corto_getBuild()); /* Library is linked with different Corto version */ if (build_out) { *build_out = corto_strdup(build()); } goto error; } else if (build) { corto_debug( "loader: '%s' links with correct corto library\n build: '%s'\n library: '%s'\n", fileName, build(), library()); } else { corto_trace("loader: found '%s' which doesn't link with corto", fileName); } /* If no build function is available, the library is not linked with * Corto, and probably represents a --nocorto package */ return result; error: if (result) corto_dlClose(result); return NULL; }