return true;
}
-static int check_port(meshlink_handle_t *mesh) {
+int check_port(meshlink_handle_t *mesh) {
for(int i = 0; i < 1000; i++) {
int port = 0x1000 + (rand() & 0x7fff);
FILE *f = fopen(filename, "a");
if(!f) {
- logger(mesh, MESHLINK_DEBUG, "Please change MeshLink's Port manually.\n");
+ meshlink_errno = MESHLINK_ESTORAGE;
+ logger(mesh, MESHLINK_DEBUG, "Could not store Port.\n");
return 0;
}
}
}
- logger(mesh, MESHLINK_DEBUG, "Please change MeshLink's Port manually.\n");
+ meshlink_errno = MESHLINK_ENETWORK;
+ logger(mesh, MESHLINK_DEBUG, "Could not find any available network port.\n");
return 0;
}
static bool invitation_send(void *handle, uint8_t type, const void *data, size_t len) {
(void)type;
meshlink_handle_t *mesh = handle;
+ const char *ptr = data;
while(len) {
- int result = send(mesh->sock, data, len, 0);
+ int result = send(mesh->sock, ptr, len, 0);
if(result == -1 && errno == EINTR) {
continue;
return false;
}
- data += result;
+ ptr += result;
len -= result;
}
logger(mesh, MESHLINK_DEBUG, "Done.\n");
}
- snprintf(privname, sizeof(privname), "%s" SLASH "ecdsa_key.priv", mesh->confbase);
+ if (snprintf(privname, sizeof(privname), "%s" SLASH "ecdsa_key.priv", mesh->confbase) >= PATH_MAX) {
+ logger(mesh, MESHLINK_DEBUG, "Filename too long: %s" SLASH "ecdsa_key.priv\n", mesh->confbase);
+ meshlink_errno = MESHLINK_ESTORAGE;
+ return false;
+ }
+
f = fopen(privname, "wb");
if(!f) {
if(!ecdsa_keygen(mesh)) {
meshlink_errno = MESHLINK_EINTERNAL;
+ unlink(filename);
return false;
}
- check_port(mesh);
+ if (check_port(mesh) == 0) {
+ meshlink_errno = MESHLINK_ENETWORK;
+ unlink(filename);
+ return false;
+ }
return true;
}
event_loop_init(&mesh->loop);
mesh->loop.data = mesh;
+ meshlink_queue_init(&mesh->outpacketqueue);
+
// Check whether meshlink.conf already exists
char filename[PATH_MAX];
char invname[PATH_MAX];
struct stat st;
- snprintf(invname, sizeof(invname), "%s" SLASH "%s", filename, ent->d_name);
+ if (snprintf(invname, sizeof(invname), "%s" SLASH "%s", filename, ent->d_name) >= PATH_MAX) {
+ logger(mesh, MESHLINK_DEBUG, "Filename too long: %s" SLASH "%s", filename, ent->d_name);
+ continue;
+ }
if(!stat(invname, &st)) {
if(mesh->invitation_key && deadline < st.st_mtime) {