changeset 2173:cf08c3b630af

Tweak the previous change...
author Mikael Berthe <mikael@lilotux.net>
date Sun, 28 Jun 2015 15:39:24 +0200
parents 06669fc1810c
children b3742d9ad961
files mcabber/mcabber/main.c
diffstat 1 files changed, 49 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/mcabber/mcabber/main.c	Sun Jun 28 12:58:10 2015 +0200
+++ b/mcabber/mcabber/main.c	Sun Jun 28 15:39:24 2015 +0200
@@ -166,6 +166,45 @@
   return password;
 }
 
+//  password_eval(command, *status)
+// Get password from a system command.
+// The string must be freed after use.
+static char *password_eval(const char *command, int *status)
+{
+#define MAX_PWD 100
+  char *pwd;
+  FILE *outfp = popen(command, "r");
+  if (outfp == NULL) {
+    scr_log_print(LPRINT_NORMAL, "** ERROR: Failed to execute password_eval command.");
+    *status = -1;
+    return NULL;
+  }
+
+  pwd = g_new0(char, MAX_PWD);
+  if (fgets(pwd, MAX_PWD, outfp) == NULL) {
+    scr_log_print(LPRINT_NORMAL, "** ERROR: Failed to read from password_eval command.");
+    g_free(pwd);
+    *status = -1;
+    return NULL;
+  }
+
+  int res = pclose(outfp);
+  if (res != 0) {
+    scr_log_print(LPRINT_NORMAL, "** ERROR: Password evaluation command exited with error %d.", res);
+    g_free(pwd);
+    *status = res;
+    return NULL;
+  }
+
+  // Strip trailing whitespaces and newlines
+  size_t i = strlen(pwd);
+  while (i && isspace(pwd[i-1])) {
+    i--;
+  }
+  pwd[i] = '\0';
+  return pwd;
+}
+
 static void credits(void)
 {
   const char *v_fmt = "MCabber %s -- Email: mcabber [at] lilotux [dot] net\n";
@@ -403,34 +442,17 @@
   /* If no password is stored, we ask for it before entering
      ncurses mode -- unless the username is unknown. */
   if (settings_opt_get("jid") && !settings_opt_get("password")) {
-    if (settings_opt_get("password_eval")) {
-      FILE *outfp = popen(settings_opt_get("password_eval"), "r");
-      if (outfp == NULL) {
-        scr_log_print(LPRINT_NORMAL, "** ERROR: Failed to execute password_eval command.");
-        exit(EXIT_FAILURE);
-      }
-#define MAX_PWD 100
-      char pwd[MAX_PWD+1];
-      char *read_pwd = fgets(pwd, MAX_PWD, outfp);
-      if (read_pwd == NULL) {
-        scr_log_print(LPRINT_NORMAL, "** ERROR: Failed to read from password_eval command.");
-        exit(EXIT_FAILURE);
+    const char *pass_eval = settings_opt_get("password_eval");
+    if (pass_eval) {
+      int status = 0;
+      char *pwd = password_eval(pass_eval, &status);
+      if (status == 0 && pwd) {
+        settings_set(SETTINGS_TYPE_OPTION, "password", pwd);
       }
-      int res = pclose(outfp);
-      if (res != 0) {
-        scr_log_print(LPRINT_NORMAL, "** ERROR: Password evaluation command exited with error %d.", res);
-        exit(EXIT_FAILURE);
-      }
-
-      // strip trailing whitespaces and newlines
-      size_t i = 0;
-      while (i < MAX_PWD && !isspace(pwd[i])) {
-        i++;
-      }
-      pwd[i] = '\0';
-
-      settings_set(SETTINGS_TYPE_OPTION, "password", pwd);
-    } else {
+      g_free(pwd);
+    }
+    // If the password is still unset, ask the user...
+    if (!settings_opt_get("password")) {
       char *pwd = ask_password("your Jabber password");
       settings_set(SETTINGS_TYPE_OPTION, "password", pwd);
       g_free(pwd);