meshlink_handle_t *meshlink_open(const char *confbase, const char *name) {
// Validate arguments provided by the application
+ bool usingname = false;
if(!confbase || !*confbase) {
fprintf(stderr, "No confbase given!\n");
if(!name || !*name) {
fprintf(stderr, "No name given!\n");
- return NULL;
+ //return NULL;
}
+ else { //check name only if there is a name != NULL
- if(!check_id(name)) {
- fprintf(stderr, "Invalid name given!\n");
- return NULL;
+ if(!check_id(name)) {
+ fprintf(stderr, "Invalid name given!\n");
+ return NULL;
+ } else { usingname = true;}
}
meshlink_handle_t *mesh = xzalloc(sizeof *mesh);
mesh->confbase = xstrdup(confbase);
- mesh->name = xstrdup(name);
+ if (usingname) mesh->name = xstrdup(name);
pthread_mutex_init ( &(mesh->outpacketqueue_mutex), NULL);
pthread_mutex_init ( &(mesh->nodes_mutex), NULL);
+ mesh->threadstarted = false;
event_loop_init(&mesh->loop);
mesh->loop.data = mesh;
bool meshlink_start(meshlink_handle_t *mesh) {
// TODO: open listening sockets first
+ //Check that a valid name is set
+ if(!mesh->name ) {
+ fprintf(stderr, "No name given!\n");
+ return false;
+ }
+
// Start the main thread
if(pthread_create(&mesh->thread, NULL, meshlink_main_loop, mesh) != 0) {
return false;
}
+ mesh->threadstarted=true;
+
return true;
}
exit_configuration(&mesh->config);
event_loop_exit(&mesh->loop);
+ free(mesh);
+
#ifdef HAVE_MINGW
WSACleanup();
#endif
char *b64key = ecdsa_get_base64_public_key(key);
//Before doing meshlink_join make sure we are not connected to another mesh
- if ( pthread_kill(mesh->thread,0) == 0){
- printf("HELLO\n");
+ if ( mesh->threadstarted ){
goto invalid;
}
}
+meshlink_connection_t* meshlink_open_rchannel(meshlink_handle_t *mesh, meshlink_node_t *destination, uint16_t dport) {
+
+//TODO: check in mesh->socketsbitmap for a free descriptor and allocate a source port for this connection
+
+ int descriptor=-1;
+
+ for (int i=0; i < 1024 ;i++) {
+ if (mesh->socketsbitmap.bitValues[i].bit == 0) {
+ mesh->socketsbitmap.bitValues[i].bit=1;
+ descriptor=i;
+ break;
+ }
+ }
+
+ if (descriptor == -1 ) return NULL;
+
+//TODO: register a callback for the data that will be received from this connection
+
+//TODO: return a description value that the user will use to write on this channel
+return NULL;
+}
+
static void __attribute__((constructor)) meshlink_init(void) {
crypto_init();
}