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 a94460e86ea23fa15ddbfdd10349028b21ced84d..110e3953be34be066c0add8ce0785db69d838f09 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 c6d75824498827229866a2fa10e9daa930acd080..5d37fda4463158986568461ec9be5edcd79b93c1 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;