]> git.meshlink.io Git - meshlink/blobdiff - src/meshlink.c
Reformat the code.
[meshlink] / src / meshlink.c
index a26c4181af4325193d2d59ba0268c52335f29c64..b407e5b53dca8e7a263be76d08c6a1e8511ac661 100644 (file)
@@ -349,10 +349,11 @@ char *meshlink_get_external_address_for_family(meshlink_handle_t *mesh, int fami
 
 // String comparison which handles NULL arguments
 static bool safe_streq(const char *a, const char *b) {
-       if (!a || !b)
+       if(!a || !b) {
                return a == b;
-       else
+       } else {
                return !strcmp(a, b);
+       }
 }
 
 // This gets the hostname part for use in invitation URLs
@@ -370,21 +371,22 @@ static char *get_my_hostname(meshlink_handle_t *mesh) {
        hostname[2] = meshlink_get_external_address_for_family(mesh, AF_INET6);
 
        // Concatenate all unique address to the hostport string
-       for (int i = 0; i < 3; i++) {
-               if (!hostname[i])
+       for(int i = 0; i < 3; i++) {
+               if(!hostname[i]) {
                        continue;
+               }
 
                // Ignore duplicate hostnames
                bool found = false;
 
-               for (int j = 0; i < j; j++) {
-                       if (safe_streq(hostname[i], hostname[j]) && safe_streq(port[i], port[j])) {
+               for(int j = 0; i < j; j++) {
+                       if(safe_streq(hostname[i], hostname[j]) && safe_streq(port[i], port[j])) {
                                found = true;
                                break;
                        }
                }
 
-               if (found) {
+               if(found) {
                        free(hostname[i]);
                        free(port[i]);
                        hostname[i] = NULL;
@@ -869,6 +871,8 @@ static const char *errstr[] = {
        [MESHLINK_ESTORAGE] = "Storage error",
        [MESHLINK_ENETWORK] = "Network error",
        [MESHLINK_EPEER] = "Error communicating with peer",
+       [MESHLINK_ENOTSUP] = "Operation not supported",
+       [MESHLINK_EBUSY] = "MeshLink instance already in use",
 };
 
 const char *meshlink_strerror(meshlink_errno_t err) {
@@ -1116,6 +1120,34 @@ meshlink_handle_t *meshlink_open(const char *confbase, const char *name, const c
                }
        }
 
+       // Open the configuration file and lock it
+
+       mesh->conffile = fopen(filename, "r");
+
+       if(!mesh->conffile) {
+               logger(NULL, MESHLINK_ERROR, "Cannot not open %s: %s\n", filename, strerror(errno));
+               meshlink_close(mesh);
+               meshlink_errno = MESHLINK_ESTORAGE;
+               return NULL;
+       }
+
+#ifdef FD_CLOEXEC
+       fcntl(fileno(mesh->conffile), F_SETFD, FD_CLOEXEC);
+#endif
+
+#ifdef HAVE_MINGW
+       // TODO: use _locking()?
+#else
+
+       if(flock(fileno(mesh->conffile), LOCK_EX | LOCK_NB) != 0) {
+               logger(NULL, MESHLINK_ERROR, "Cannot lock %s: %s\n", filename, strerror(errno));
+               meshlink_close(mesh);
+               meshlink_errno = MESHLINK_EBUSY;
+               return NULL;
+       }
+
+#endif
+
        // Read the configuration
 
        init_configuration(&mesh->config);
@@ -1325,6 +1357,10 @@ void meshlink_close(meshlink_handle_t *mesh) {
        free(mesh->confbase);
        pthread_mutex_destroy(&(mesh->mesh_mutex));
 
+       if(mesh->conffile) {
+               fclose(mesh->conffile);
+        }
+
        memset(mesh, 0, sizeof(*mesh));
 
        free(mesh);