]> git.cameronkatri.com Git - pw-darwin.git/blobdiff - chpass/pw_yp.c
MF22: Remove confusing comma
[pw-darwin.git] / chpass / pw_yp.c
index 9493db83b89ce9801dafc029a42e00ea9ad4d5d1..777ec54d4633a88251c544a87b244a84d957bdcb 100644 (file)
@@ -35,7 +35,7 @@
  * Center for Telecommunications Research
  * Columbia University, New York City
  *
- *     $Id: pw_yp.c,v 1.9 1996/02/23 04:20:19 wpaul Exp $
+ *     $Id: pw_yp.c,v 1.11 1997/07/29 15:45:36 wpaul Exp $
  */
 
 #ifdef YP
@@ -65,7 +65,6 @@ struct dom_binding {};
 #include <pw_util.h>
 #include "pw_yp.h"
 #include "ypxfr_extern.h"
-#include "yppasswd_comm.h"
 #include "yppasswd_private.h"
 
 #define PERM_SECURE (S_IRUSR|S_IWUSR)
@@ -81,6 +80,7 @@ static HASHINFO openinfo = {
 int force_old = 0;
 int _use_yp = 0;
 int suser_override = 0;
+int yp_in_pw_file = 0;
 char *yp_domain = NULL;
 char *yp_server = NULL;
 
@@ -196,7 +196,8 @@ static int my_yp_match(server, domain, map, key, keylen, result, resultlen)
        bzero((char *)buf, sizeof(buf));
 
        if ((clnt = clnt_create(server, YPPROG,YPVERS,"udp")) == NULL) {
-               warnx("%s", clnt_spcreateerror("failed to create handle"));
+               warnx("failed to create UDP handle: %s",
+                                       clnt_spcreateerror(server));
                pw_error(tempname, 0, 1);
        }
 
@@ -277,7 +278,8 @@ int use_yp (user, uid, which)
        bf[0] = _PW_KEYYPENABLED;
        key.data = (u_char *)bf;
        key.size = 1;
-       if (!(dbp->get)(dbp,&key,&data,0) || (yp_domain && yp_server)) {
+       yp_in_pw_file = !(dbp->get)(dbp,&key,&data,0);
+       if (_yp_check(NULL) || (yp_domain && yp_server)) {
                server = get_yp_master(0);
 
                /* Is the user in the NIS passwd map */
@@ -322,6 +324,7 @@ int use_yp (user, uid, which)
                return(USER_LOCAL_ONLY);
        else if (!user_exists)
                return(USER_UNKNOWN);
+
        return(-1);
 }
 
@@ -335,6 +338,19 @@ char *get_yp_master(getserver)
        char *mastername;
        int rval, localport;
        struct stat st;
+       char                    *sockname = YP_SOCKNAME;
+
+       /*
+        * Sometimes we are called just to probe for rpc.yppasswdd and
+        * set the suser_override flag. Just return NULL and leave
+        * suser_override at 0 if _use_yp doesn't indicate that NIS is
+        * in use and we weren't called from use_yp() itself.
+        * Without this check, we might try probing and fail with an NIS
+        * error in non-NIS environments.
+        */
+       if ((_use_yp == USER_UNKNOWN || _use_yp == USER_LOCAL_ONLY) &&
+                                                               getserver)
+               return(NULL);
 
        /* Get default NIS domain. */
 
@@ -405,6 +421,7 @@ void yp_submit(pw)
        char *master, *password;
        int *status = NULL;
        struct rpc_err err;
+       char                    *sockname = YP_SOCKNAME;
 
        _use_yp = 1;
 
@@ -425,7 +442,8 @@ void yp_submit(pw)
                master_yppasswd.newpw.pw_gecos = strdup(pw->pw_gecos);
                master_yppasswd.newpw.pw_dir = strdup(pw->pw_dir);
                master_yppasswd.newpw.pw_shell = strdup(pw->pw_shell);
-               master_yppasswd.newpw.pw_class = strdup(pw->pw_class);
+               master_yppasswd.newpw.pw_class = pw->pw_class != NULL ?
+                                               strdup(pw->pw_class) : "";
                master_yppasswd.oldpass = ""; /* not really needed */
                master_yppasswd.domain = yp_domain;
        } else {
@@ -456,38 +474,40 @@ void yp_submit(pw)
 
        if (suser_override) {
                /* Talk to server via AF_UNIX socket. */
-               if (senddat(&master_yppasswd)) {
-                       warnx("failed to contact local rpc.yppasswdd");
+               clnt = clnt_create(sockname, MASTER_YPPASSWDPROG,
+                                       MASTER_YPPASSWDVERS, "unix");
+               if (clnt == NULL) {
+                       warnx("failed to contact rpc.yppasswdd: %s",
+                               clnt_spcreateerror(master));
                        pw_error(tempname, 0, 1);
                }
-               /* Get return code. */
-               status = getresp();
        } else {
                /* Create a handle to yppasswdd. */
 
                if ((clnt = clnt_create(master, YPPASSWDPROG,
                                        YPPASSWDVERS, "udp")) == NULL) {
-                       warnx("failed to contact rpc.yppasswdd on %s: %s",
-                               master, clnt_spcreateerror(""));
+                       warnx("failed to contact rpc.yppasswdd: %s",
+                               clnt_spcreateerror(master));
                        pw_error(tempname, 0, 1);
                }
+       }
 
-               clnt->cl_auth = authunix_create_default();
+       clnt->cl_auth = authunix_create_default();
 
+       if (suser_override)
+               status = yppasswdproc_update_master_1(&master_yppasswd, clnt);
+       else
                status = yppasswdproc_update_1(&yppasswd, clnt);
 
-               clnt_geterr(clnt, &err);
+       clnt_geterr(clnt, &err);
 
-               auth_destroy(clnt->cl_auth);
-               clnt_destroy(clnt);
-       }
+       auth_destroy(clnt->cl_auth);
+       clnt_destroy(clnt);
 
        /* Call failed: signal the error. */
 
-       if ((!suser_override && err.re_status) != RPC_SUCCESS || status == NULL || *status) {
-               warnx("NIS update failed: %s", (err.re_status != RPC_SUCCESS &&
-                       !suser_override) ? clnt_sperrno(err.re_status) : 
-                                       "rpc.yppasswdd returned error status");
+       if (err.re_status != RPC_SUCCESS || status == NULL || *status) {
+               warnx("NIS update failed: %s", clnt_sperrno(err.re_status));
                pw_error(NULL, 0, 1);
        }