]> git.meshlink.io Git - meshlink/commitdiff
Don't interactively ask for an Address when generating an invitation URL.
authorGuus Sliepen <guus@meshlink.io>
Mon, 26 May 2014 12:57:38 +0000 (14:57 +0200)
committerGuus Sliepen <guus@meshlink.io>
Mon, 26 May 2014 12:57:38 +0000 (14:57 +0200)
This also adds a function to allow the application to set an Address.

src/meshlink.c
src/meshlink.h

index cd5b5642538a97ef441995bba9dca5c26e634e99..130994d8a30491fff582fe1da83754fa2b38157f 100644 (file)
@@ -236,44 +236,9 @@ static char *get_my_hostname(meshlink_handle_t* mesh) {
                }
        }
 
-       //if(!tty) {
-       //      if(!hostname) {
-       //              fprintf(stderr, "Could not determine the external address or hostname. Please set Address manually.\n");
-       //              return NULL;
-       //      }
-       //      goto save;
-       //}
-
-again:
-       fprintf(stderr, "Please enter your host's external address or hostname");
-       if(hostname)
-               fprintf(stderr, " [%s]", hostname);
-       fprintf(stderr, ": ");
-
-       if(!fgets(line, sizeof line, stdin)) {
-               fprintf(stderr, "Error while reading stdin: %s\n", strerror(errno));
-               free(hostname);
+       if(!hostname)
                return NULL;
-       }
-
-       if(!rstrip(line)) {
-               if(hostname)
-                       goto save;
-               else
-                       goto again;
-       }
-
-       for(char *p = line; *p; p++) {
-               if(isalnum(*p) || *p == '-' || *p == '.')
-                       continue;
-               fprintf(stderr, "Invalid address or hostname.\n");
-               goto again;
-       }
-
-       free(hostname);
-       hostname = xstrdup(line);
 
-save:
        f = fopen(filename, "a");
        if(f) {
                fprintf(f, "\nAddress = %s\n", hostname);
@@ -928,14 +893,14 @@ static bool refresh_invitation_key(meshlink_handle_t *mesh) {
        snprintf(filename, sizeof filename, "%s" SLASH "invitations", mesh->confbase);
        if(mkdir(filename, 0700) && errno != EEXIST) {
                fprintf(stderr, "Could not create directory %s: %s\n", filename, strerror(errno));
-               return NULL;
+               return false;
        }
 
        // Count the number of valid invitations, clean up old ones
        DIR *dir = opendir(filename);
        if(!dir) {
                fprintf(stderr, "Could not read directory %s: %s\n", filename, strerror(errno));
-               return NULL;
+               return false;
        }
 
        errno = 0;
@@ -987,18 +952,18 @@ static bool refresh_invitation_key(meshlink_handle_t *mesh) {
        if(!f) {
                if(errno != ENOENT) {
                        fprintf(stderr, "Could not read %s: %s\n", filename, strerror(errno));
-                       return NULL;
+                       return false;
                }
 
                mesh->invitation_key = ecdsa_generate();
                if(!mesh->invitation_key) {
                        fprintf(stderr, "Could not generate a new key!\n");
-                       return NULL;
+                       return false;
                }
                f = fopen(filename, "w");
                if(!f) {
                        fprintf(stderr, "Could not write %s: %s\n", filename, strerror(errno));
-                       return NULL;
+                       return false;
                }
                chmod(filename, 0600);
                ecdsa_write_pem_private_key(mesh->invitation_key, f);
@@ -1013,6 +978,17 @@ static bool refresh_invitation_key(meshlink_handle_t *mesh) {
        return mesh->invitation_key;
 }
 
+bool meshlink_add_address(meshlink_handle_t *mesh, const char *address) {
+       for(const char *p = address; *p; p++) {
+               if(isalnum(*p) || *p == '-' || *p == '.' || *p == ':')
+                       continue;
+               fprintf(stderr, "Invalid character in address: %s\n", address);
+               return false;
+       }
+
+       return append_config_file(mesh, mesh->self->name, "Address", address);
+}
+
 char *meshlink_invite(meshlink_handle_t *mesh, const char *name) {
        // Check validity of the new node's name
        if(!check_id(name)) {
@@ -1034,6 +1010,13 @@ char *meshlink_invite(meshlink_handle_t *mesh, const char *name) {
                return NULL;
        }
 
+       // Get the local address
+       char *address = get_my_hostname(mesh);
+       if(!address) {
+               fprintf(stderr, "No Address known for ourselves!\n");
+               return NULL;
+       }
+
        if(!refresh_invitation_key(mesh))
                return NULL;
 
@@ -1069,9 +1052,6 @@ char *meshlink_invite(meshlink_handle_t *mesh, const char *name) {
        if(!f)
                abort();
 
-       // Get the local address
-       char *address = get_my_hostname(mesh);
-
        // Fill in the details.
        fprintf(f, "Name = %s\n", name);
        //if(netname)
index fdf0896e3e51786612ff47b5f61529786bc8c981..36c784c9ed9b7a52c7a7421254694856d888b5a6 100644 (file)
@@ -239,6 +239,16 @@ extern char *meshlink_sign(meshlink_handle_t *mesh, const char *data, size_t len
  */
 extern bool meshlink_verify(meshlink_handle_t *mesh, meshlink_node_t *source, const char *data, size_t len, const char *signature);
 
+/// Add an Address for the local node.
+/** This function adds an Address for the local node, which will be used for invitation URLs.
+ *
+ *  @param mesh         A handle which represents an instance of MeshLink.
+ *  @param address      A string containing the address, which can be either in numeric format or a hostname.
+ *
+ *  @return             This function returns true if the address was added, false otherwise.
+ */
+extern bool meshlink_add_address(meshlink_handle_t *mesh, const char *address);
+
 /// Invite another node into the mesh.
 /** This function generates an invitation that can be used by another node to join the same mesh as the local node.
  *  The generated invitation is a string containing a URL.