* docs/MAIL.FILTERING: added note on removing procmail -f or
[mmh] / sbr / ruserpass.c
index 68809df..5ed6fde 100644 (file)
@@ -1,4 +1,5 @@
 /*
+ * Portions of this code are
  * Copyright (c) 1985 Regents of the University of California.
  * All rights reserved.
  *
@@ -18,6 +19,7 @@
  */
 
 #include <h/mh.h>
+#include <h/utils.h>
 #include <pwd.h>
 #include <errno.h>
 
@@ -59,13 +61,12 @@ static struct toktab toktabs[] = {
 static int token(void);
 
 
-int
+void
 ruserpass(char *host, char **aname, char **apass)
 {
     char *hdir, buf[BUFSIZ];
     int t, usedefault = 0;
     struct stat stb;
-    extern int errno;
 
     hdir = getenv("HOME");
     if (hdir == NULL)
@@ -91,7 +92,7 @@ ruserpass(char *host, char **aname, char **apass)
                /*
                 * Allow match either for user's host name.
                 */
-               if (strcasecmp(host, tokval) == 0)
+               if (mh_strcasecmp(host, tokval) == 0)
                    goto match;
                continue;
            }
@@ -100,19 +101,19 @@ match:
                switch(t) {
                case LOGIN:
                    if (token() && *aname == 0) {
-                       *aname = malloc((size_t) strlen(tokval) + 1);
+                       *aname = mh_xmalloc((size_t) strlen(tokval) + 1);
                        strcpy(*aname, tokval);
                    }
                    break;
                case PASSWD:
                    if (fstat(fileno(cfile), &stb) >= 0 &&
                        (stb.st_mode & 077) != 0) {
-                       fprintf(stderr, "Error - .netrc file not correct mode.\n");
-                       fprintf(stderr, "Remove password or correct mode.\n");
-                       goto bad;
+                       /* We make this a fatal error to force the user to correct it */
+                       advise(NULL, "Error - ~/.netrc file must not be world or group readable.");
+                       adios(NULL, "Remove password or correct file permissions.");
                    }
                    if (token() && *apass == 0) {
-                       *apass = malloc((size_t) strlen(tokval) + 1);
+                       *apass = mh_xmalloc((size_t) strlen(tokval) + 1);
                        strcpy(*apass, tokval);
                    }
                    break;
@@ -153,7 +154,7 @@ done:
            myname = tmp;
        }
 
-       *aname = malloc((size_t) strlen(myname) + 1);
+       *aname = mh_xmalloc((size_t) strlen(myname) + 1);
        strcpy (*aname, myname);
     }
 
@@ -162,20 +163,16 @@ done:
        char *mypass;
 
        snprintf(prompt, sizeof(prompt), "Password (%s:%s): ", host, *aname);
-       mypass = getpass (prompt);
+       mypass = nmh_getpass(prompt);
        
        if (*mypass == '\0') {
            mypass = *aname;
        }
 
-       *apass = malloc((size_t) strlen(mypass) + 1);
+       *apass = mh_xmalloc((size_t) strlen(mypass) + 1);
        strcpy (*apass, mypass);
     }
 
-    return(0);
-bad:
-    fclose(cfile);
-    return(-1);
 }
 
 static int