#!/bin/sh
# This is a shell archive, meaning:
# 1. Remove everything above the #!/bin/sh line.
# 2. Save the resulting text in a file.
# 3. Execute the file with /bin/sh (not csh) to create the files:
#       xdr.c
#       ypstuff.c
# This archive created: Thu Apr 27 22:18:34 1995
export PATH; PATH=/bin:$PATH
echo shar: extracting "'xdr.c'" '(1389 characters)'
if test -f 'xdr.c'
then
       echo shar: over-writing existing file "'xdr.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'xdr.c'
X
X/*
XFile: xdr.c
XChange History:
X94/7/19 AnnKian created for xdr_yppasswd and xdr_passwd since xdr_yppasswd
X               is missing from /usr/lib/librpcsvc.a in Sol2.3.
X               A pointer to the struct "passwd" must be passed to
X               xdr_reference, so have to declare pw_ptr.
X               pw_age and pw_comment are not used by NIS, so commented out.
X*/
X#ifdef sol2
X
X#include <rpc/rpc.h>
X#include <stdio.h>
X#include <rpcsvc/yppasswd.h>
X
Xbool_t
Xxdr_passwd(xdrs, objp)
X       XDR *xdrs;
X       struct passwd *objp;
X{
X       if (!xdr_string(xdrs, &objp->pw_name, ~0)) { return (FALSE); }
X       if (!xdr_string(xdrs, &objp->pw_passwd, ~0)) { return (FALSE); }
X       if (!xdr_int(xdrs, &objp->pw_uid)) { return (FALSE); }
X       if (!xdr_int(xdrs, &objp->pw_gid)) { return (FALSE); }
X/*
X       if (!xdr_string(xdrs, &objp->pw_age, ~0)) { return (FALSE); }
X       if (!xdr_string(xdrs, &objp->pw_comment, ~0)) { return (FALSE); }
X*/
X       if (!xdr_string(xdrs, &objp->pw_gecos, ~0)) { return (FALSE); }
X       if (!xdr_string(xdrs, &objp->pw_dir, ~0)) { return (FALSE); }
X       if (!xdr_string(xdrs, &objp->pw_shell, ~0)) { return (FALSE); }
X       return (TRUE);
X}
X
X
X
Xbool_t
Xxdr_yppasswd(xdrs, objp)
X       XDR *xdrs;
X       struct yppasswd *objp;
X{
X       struct passwd *pw_ptr;
X       pw_ptr=&objp->newpw;
X
X       if (!xdr_string(xdrs, &objp->oldpass, ~0)) {
X               return (FALSE);
X       }
X       if (!xdr_reference(xdrs, (char **)&pw_ptr, sizeof(struct passwd), xdr_passwd)) {
X               return (FALSE);
X       }
X
X       return (TRUE);
X}
X
X#endif /* sol2 */
X
SHAR_EOF
if test 1389 -ne "`wc -c 'xdr.c'`"
then
       echo shar: error transmitting "'xdr.c'" '(should have been 1389 characters)'
fi
echo shar: extracting "'ypstuff.c'" '(3743 characters)'
if test -f 'ypstuff.c'
then
       echo shar: over-writing existing file "'ypstuff.c'"
fi
sed 's/^X//' << \SHAR_EOF > 'ypstuff.c'
X/* New for Sol2 */
X#include <stdio.h>
X#include <rpc/rpc.h>
X#include <rpcsvc/ypclnt.h>
X#include <pwd.h>
X#include <rpcsvc/yppasswd.h>
X#ifdef sol2
X#include <netdb.h>
X#include <netconfig.h>
X#include <sys/tiuser.h>
X#include <rpc/pmap_clnt.h>
X#define index (char *)strchr
X#endif
X/*
X * Invoke the rpc call to argv[1]. Stdin should be, on separate lines,
X * the cleartext passwd, followed by the elements of the new passwd
X * struct.
X */
X
X#define LINE_CLEAR     0
X#define LINE_NAME      1
X#define LINE_PASSWD    2
X#define LINE_UID       3
X#define LINE_GID       4
X#define LINE_AGE       5
X#define LINE_COMMENT   6
X#define LINE_GECOS     7
X#define LINE_DIR       8
X#define LINE_SHELL     9
X
Xtypedef char Line[100];
X
Xmain(argc, argv)
Xint argc;
Xchar **argv;
X{
X    int rc, why;
X    char *host, *s;
X    Line lines[10];
X    int i;
X    int ypport;
X    struct yppasswd ypp;
X#ifdef sol2
X       struct hostent *hostentry;
X       struct sockaddr_in hostaddr, *hostaddr_ptr;
X       struct netconfig *udp_netconf;
X       char *netid, portbuf[10];
X       struct netbuf *svcport_ptr, svcport;
X
X       svcport.buf=portbuf;
X       svcport.maxlen=10;
X       svcport_ptr=&svcport;
X#endif
X
X    if (argc != 2)
X    {
X       printf("ERROR: args\n");
X       exit(1);
X    }
X
X    host = argv[1];
X    for (i = 0; i < 10; i++)
X    {
X       if (fgets(lines[i], sizeof(lines[i]), stdin) == NULL)
X       {
X           printf("ERROR: Short input\n");
X           exit(1);
X       }
X       if ((s = index(lines[i], '\n')) != NULL)
X           *s = 0;
X    }
X
X    ypp.oldpass = lines[LINE_CLEAR];
X
X    ypp.newpw.pw_name = lines[LINE_NAME];
X    ypp.newpw.pw_passwd = lines[LINE_PASSWD];
X    ypp.newpw.pw_uid = atoi(lines[LINE_UID]);
X    ypp.newpw.pw_gid = atoi(lines[LINE_GID]);
X#ifdef sun
X    ypp.newpw.pw_age = lines[LINE_AGE];
X#else
X#ifndef AIX
X    ypp.newpw.pw_quota = atoi(lines[LINE_AGE]);
X#endif
X#endif
X#ifndef AIX
X    ypp.newpw.pw_comment = lines[LINE_COMMENT];
X#endif
X    ypp.newpw.pw_gecos = lines[LINE_GECOS];
X    ypp.newpw.pw_dir = lines[LINE_DIR];
X    ypp.newpw.pw_shell = lines[LINE_SHELL];
X
X#ifndef sol2
X    if ((ypport = getrpcport(host, YPPASSWDPROG,
X                            YPPASSWDPROC_UPDATE, IPPROTO_UDP)) == 0)
X    {
X       printf("ERROR: %s is not running ypassswdd.\n", host);
X       exit(1);
X    }
X#else
X/*
X **********************************************************************
X   Note: rpcb_getaddr is to replace pmap_getport, but it does not
X        seem to work. Still use pmap_getport. Worry about it when it
X        is not supported by Solaris.
X ***********************************************************************
X */
X/*
X    netid="udp";
X    udp_netconf=getnetconfigent(netid);
X       if (udp_netconf == NULL) printf("udp_netconfi is NULL\n");
X    if (TRUE==rpcb_getaddr(YPPASSWDPROG, YPPASSWDPROC_UPDATE, udp_netconf,
X                       svcport_ptr, host)) printf("true\n");
X       printf("svcprot_ptr=%s maxlen=%d len=%d\n",svcport_ptr->buf,svcport_ptr->maxlen,
X                       svcport_ptr->len);
X*/
X    hostentry = gethostbyname(host);
X    hostaddr.sin_family=AF_INET;
X    hostaddr.sin_port=0;
X    hostaddr.sin_addr.s_addr=inet_addr(inet_ntoa(hostentry->h_addr));
X    hostaddr_ptr=&hostaddr;
X
X    if ((ypport = pmap_getport(hostaddr_ptr, YPPASSWDPROG,
X                            YPPASSWDPROC_UPDATE, IPPROTO_UDP)) == 0)
X    {
X       printf("ERROR: %s is not running ypassswdd.\n", host);
X       exit(1);
X    }
X
X#endif
X
X    if (ypport >= IPPORT_RESERVED)
X    {
X       printf("ERROR: yppasswdd on %s not privleged.\n", host);
X       exit(1);
X    }
X
X    rc = callrpc(host, YPPASSWDPROG, YPPASSWDVERS,
X                YPPASSWDPROC_UPDATE,
X                xdr_yppasswd, &ypp, xdr_int, &why);
X
X    if (rc > 0)
X    {
X#ifdef dynix
X       printf("ERROR: callrpc failed: rc=%d Dynix won't decode\n", rc);
X#else
X       printf("ERROR: callrpc failed: rc=%d %s\n", rc,clnt_sperrno(rc));
X#endif
X       exit(1);
X    }
X
X    if (why > 0)
X    {
X       printf("ERROR: callrpc failed: why=%d\n", why);
X       exit(1);
X    }
X
X    printf("SUCCESS\n");
X
X    exit(0);
X}
X
SHAR_EOF
if test 3743 -ne "`wc -c 'ypstuff.c'`"
then
       echo shar: error transmitting "'ypstuff.c'" '(should have been 3743 characters)'
fi
#       End of shell archive
exit 0