If the mount requests are "from" cifstab, then just asking for "Password:" would be unclear, this asks it as: "Password for user@.. :" I'm not subscribed to the mailing list. --- mount.cifs: Use systemd's mechanism for getting password, if present. If systemd is running, then use /bin/systemd-ask-password to get the password instead of get_pass(..) . Reference: bug: https://bugzilla.novell.com/show_bug.cgi?id=767894 diff --git a/mount.cifs.c b/mount.cifs.c index 6f3f382..d721de6 100644 --- a/mount.cifs.c +++ b/mount.cifs.c @@ -1687,6 +1687,58 @@ drop_child_privs(void) return 0; } +/* + * If systemd is present, then try to get password via + * /bin/systemd-ask-password, else just use getpass(..) + */ +static char* +get_password(const char *prompt, char *input, int capacity) +{ + int is_systemd_running; + struct stat a, b; + + /* We simply test whether the systemd cgroup hierarchy is + * mounted */ + is_systemd_running = (lstat("/sys/fs/cgroup", &a) == 0) + && (lstat("/sys/fs/cgroup/systemd", &b) == 0) + && (a.st_dev != b.st_dev); + + if (is_systemd_running) { + /* systemd */ + char *cmd; + FILE *fp = NULL; + + if (asprintf(&cmd, "/bin/systemd-ask-password \"%s\"", prompt) >= 0) { + fp = popen (cmd, "re"); + free (cmd); + } + + if (!fp) + return NULL; + + if (fgets(input, capacity, fp)) { + int len = strlen(input); + if (input[len - 1] == '\n') + input[len - 1] = '\0'; + } + + fclose(fp); + } else { + /* getpass is obsolete, but there's apparently nothing that replaces it */ + char *tmp_pass = getpass(prompt); + if (!tmp_pass) + return NULL; + + strncpy(input, tmp_pass, capacity - 1); + input[capacity - 1] = '\0'; + + /* zero-out the static buffer */ + memset(tmp_pass, 0, strlen(tmp_pass)); + } + + return input; +} + static int assemble_mountinfo(struct parsed_mount_info *parsed_info, const char *thisprogram, const char *mountpoint, @@ -1768,14 +1820,20 @@ assemble_mountinfo(struct parsed_mount_info *parsed_info, } if (!parsed_info->got_password) { - /* getpass is obsolete, but there's apparently nothing that replaces it */ - char *tmp_pass = getpass("Password: "); - if (!tmp_pass) { + char tmp_pass[MOUNT_PASSWD_SIZE + 1]; + char *prompt = NULL; + + if(asprintf(&prompt, "Password for %s@%s: ", parsed_info->username, orig_dev) < 0) + prompt = NULL; + + if (get_password(prompt ? prompt : "Password: ", tmp_pass, MOUNT_PASSWD_SIZE + 1)) { + rc = set_password(parsed_info, tmp_pass); + } else { fprintf(stderr, "Error reading password, exiting\n"); rc = EX_SYSERR; - goto assemble_exit; } - rc = set_password(parsed_info, tmp_pass); + + free(prompt); if (rc) goto assemble_exit; } -- Ankit Jain SUSE Labs -- To unsubscribe from this list: send the line "unsubscribe linux-cifs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html