Don't ask questions if we are not running interactively.
authorGuus Sliepen <guus@tinc-vpn.org>
Wed, 29 Jan 2014 16:17:59 +0000 (17:17 +0100)
committerGuus Sliepen <guus@tinc-vpn.org>
Wed, 29 Jan 2014 16:17:59 +0000 (17:17 +0100)
When creating invitations or using them to join a VPN, and the tinc command is
not run interactively (ie, when stdin and stdout are not connected or
redirected to/from a file), don't ask questions. If normally tinc would ask for
a confirmation, just assume the default answer instead. If tinc really needs
some input, just print an error message instead.

In case an invitation is used for a VPN which uses a netname that is already in
use on the local host, tinc will store the configuration in a temporary
directory. Normally it asks for an alternative netname and then renames the
temporary directory, but when not run interactively, it now just prints the
location of the unchanged temporary directory.

src/invitation.c
src/tincctl.c

index a94460e..110e395 100644 (file)
@@ -142,12 +142,19 @@ char *get_my_hostname() {
                }
        }
 
+       if(!tty) {
+               if(!hostname) {
+                       fprintf(stderr, "Could not determine the external address or hostname. Please set Address manually.\n");
+                       return NULL;
+               }
+               goto save;
+       }
+
 again:
-       printf("Please enter your host's external address or hostname");
+       fprintf(stderr, "Please enter your host's external address or hostname");
        if(hostname)
-               printf(" [%s]", hostname);
-       printf(": ");
-       fflush(stdout);
+               fprintf(stderr, " [%s]", hostname);
+       fprintf(stderr, ": ");
 
        if(!fgets(line, sizeof line, stdin)) {
                fprintf(stderr, "Error while reading stdin: %s\n", strerror(errno));
@@ -571,7 +578,7 @@ make_names:
 
        if(!access(tinc_conf, F_OK)) {
                fprintf(stderr, "Configuration file %s already exists!\n", tinc_conf);
-               if(!tty || confbasegiven)
+               if(confbasegiven)
                        return false;
 
                // Generate a random netname, ask for a better one later.
@@ -747,7 +754,7 @@ make_names:
        check_port(name);
 
 ask_netname:
-       if(ask_netname) {
+       if(ask_netname && tty) {
                fprintf(stderr, "Enter a new netname: ");
                if(!fgets(line, sizeof line, stdin)) {
                        fprintf(stderr, "Error while reading stdin: %s\n", strerror(errno));
@@ -771,6 +778,8 @@ ask_netname:
                make_names();
        }
 
+       fprintf(stderr, "Configuration stored in: %s\n", confbase);
+
        return true;
 }
 
@@ -854,10 +863,8 @@ int cmd_join(int argc, char *argv[]) {
        if(argc > 1) {
                invitation = argv[1];
        } else {
-               if(tty) {
-                       printf("Enter invitation URL: ");
-                       fflush(stdout);
-               }
+               if(tty)
+                       fprintf(stderr, "Enter invitation URL: ");
                errno = EPIPE;
                if(!fgets(line, sizeof line, stdin)) {
                        fprintf(stderr, "Error while reading stdin: %s\n", strerror(errno));
index c6d7582..5d37fda 100644 (file)
@@ -308,8 +308,7 @@ static FILE *ask_and_open(const char *filename, const char *what, const char *mo
        /* Check stdin and stdout */
        if(ask && tty) {
                /* Ask for a file and/or directory name. */
-               fprintf(stdout, "Please enter a file to save %s to [%s]: ", what, filename);
-               fflush(stdout);
+               fprintf(stderr, "Please enter a file to save %s to [%s]: ", what, filename);
 
                if(fgets(buf, sizeof buf, stdin) == NULL) {
                        fprintf(stderr, "Error while reading stdin: %s\n", strerror(errno));
@@ -1711,8 +1710,7 @@ static int cmd_init(int argc, char *argv[]) {
        } else if(argc < 2) {
                if(tty) {
                        char buf[1024];
-                       fprintf(stdout, "Enter the Name you want your tinc node to have: ");
-                       fflush(stdout);
+                       fprintf(stderr, "Enter the Name you want your tinc node to have: ");
                        if(!fgets(buf, sizeof buf, stdin)) {
                                fprintf(stderr, "Error while reading stdin: %s\n", strerror(errno));
                                return 1;