source: trunk/athena/bin/xquota/nfs.c @ 7557

Revision 7557, 6.2 KB checked in by cfields, 30 years ago (diff)
Supply xdr routines for Solaris. Get netinet/in.h for Solaris. Don't declare index for Solaris. 7.7 checkin; changes by vrt
Line 
1/*
2 * Disk quota reporting program.
3 */
4#include <stdio.h>
5#ifdef SOLARIS
6#include <sys/mntent.h>
7#include <rpcsvc/rquota.h>
8#include <netinet/in.h>
9#else
10#include <mntent.h>
11#endif
12#include <strings.h>
13
14#include <sys/param.h>
15#include <sys/file.h>
16#include <sys/stat.h>
17#ifdef SOLARIS
18#include <sys/fs/ufs_quota.h>
19#else
20#include <ufs/quota.h>
21#endif
22
23#include <rpc/rpc.h>
24#include <rpc/pmap_prot.h>
25#include <sys/socket.h>
26#include <netdb.h>
27#include <rpcsvc/rquota.h>
28#include <sys/time.h>
29
30#include "xquota.h"
31
32static int callaurpc();
33
34/************************************************************
35 *
36 * stolen from ucb's quota. (Modified somewhat)
37 *
38 ************************************************************/
39
40int
41getnfsquota(host, path, uid, dqp)
42        char *host, *path;
43        int uid;
44        struct dqblk *dqp;
45{
46        struct getquota_args gq_args;
47        struct getquota_rslt gq_rslt;
48#ifndef sun
49        extern char *index();
50#endif
51
52        gq_args.gqa_pathp = path;
53        gq_args.gqa_uid = uid;
54        if (callaurpc(host, RQUOTAPROG, RQUOTAVERS, RQUOTAPROC_GETQUOTA,
55                      xdr_getquota_args, (char *) &gq_args, xdr_getquota_rslt,
56                      (char *) &gq_rslt) != 0) {
57                return (QUOTA_ERROR);
58        }
59#ifdef SOLARIS
60        switch (gq_rslt.status) {
61#else
62        switch (gq_rslt.gqr_status) {
63#endif
64        case Q_OK:
65                {
66                struct timeval tv;
67
68                gettimeofday(&tv, NULL);
69#ifdef SOLARIS
70                dqp->dqb_bhardlimit =
71                    gq_rslt.getquota_rslt_u.gqr_rquota.rq_bhardlimit *
72                    gq_rslt.getquota_rslt_u.gqr_rquota.rq_bsize / DEV_BSIZE;
73                dqp->dqb_bsoftlimit =
74                    gq_rslt.getquota_rslt_u.gqr_rquota.rq_bsoftlimit *
75                    gq_rslt.getquota_rslt_u.gqr_rquota.rq_bsize / DEV_BSIZE;
76                dqp->dqb_curblocks =
77                    gq_rslt.getquota_rslt_u.gqr_rquota.rq_curblocks *
78                    gq_rslt.getquota_rslt_u.gqr_rquota.rq_bsize / DEV_BSIZE;
79                dqp->dqb_fhardlimit = gq_rslt.getquota_rslt_u.gqr_rquota.rq_fhardlimit;
80                dqp->dqb_fsoftlimit = gq_rslt.getquota_rslt_u.gqr_rquota.rq_fsoftlimit;
81                dqp->dqb_curfiles = gq_rslt.getquota_rslt_u.gqr_rquota.rq_curfiles;
82                dqp->dqb_btimelimit =
83                    tv.tv_sec + gq_rslt.getquota_rslt_u.gqr_rquota.rq_btimeleft;
84                dqp->dqb_ftimelimit =
85                    tv.tv_sec + gq_rslt.getquota_rslt_u.gqr_rquota.rq_ftimeleft;
86#else
87                dqp->dqb_bhardlimit =
88                    gq_rslt.gqr_rquota.rq_bhardlimit *
89                    gq_rslt.gqr_rquota.rq_bsize / DEV_BSIZE;
90                dqp->dqb_bsoftlimit =
91                    gq_rslt.gqr_rquota.rq_bsoftlimit *
92                    gq_rslt.gqr_rquota.rq_bsize / DEV_BSIZE;
93                dqp->dqb_curblocks =
94                    gq_rslt.gqr_rquota.rq_curblocks *
95                    gq_rslt.gqr_rquota.rq_bsize / DEV_BSIZE;
96                dqp->dqb_fhardlimit = gq_rslt.gqr_rquota.rq_fhardlimit;
97                dqp->dqb_fsoftlimit = gq_rslt.gqr_rquota.rq_fsoftlimit;
98                dqp->dqb_curfiles = gq_rslt.gqr_rquota.rq_curfiles;
99                dqp->dqb_btimelimit =
100                    tv.tv_sec + gq_rslt.gqr_rquota.rq_btimeleft;
101                dqp->dqb_ftimelimit =
102                    tv.tv_sec + gq_rslt.gqr_rquota.rq_ftimeleft;
103#endif
104                return (QUOTA_OK);
105                }
106
107        case Q_NOQUOTA:
108                return(QUOTA_NONE);
109                break;
110
111        case Q_EPERM:
112                fprintf(stderr, "quota permission error, host: %s\n", host);
113                return(QUOTA_PERMISSION);
114                break;
115
116        default:
117                fprintf(stderr, "bad rpc result, host: %s\n",  host);
118                break;
119        }
120        return (QUOTA_ERROR);
121}
122
123static int
124callaurpc(host, prognum, versnum, procnum, inproc, in, outproc, out)
125        char *host;
126        xdrproc_t inproc, outproc;
127        char *in, *out;
128{
129        struct sockaddr_in server_addr;
130        enum clnt_stat clnt_stat;
131        struct hostent *hp;
132        struct timeval timeout, tottimeout;
133
134        static CLIENT *client = NULL;
135        static int socket = RPC_ANYSOCK;
136        static int valid = 0;
137        static int oldprognum, oldversnum;
138        static char oldhost[256];
139
140        if (valid && oldprognum == prognum && oldversnum == versnum
141                && strcmp(oldhost, host) == 0) {
142                /* reuse old client */         
143        }
144        else {
145                valid = 0;
146                close(socket);
147                socket = RPC_ANYSOCK;
148                if (client) {
149                        clnt_destroy(client);
150                        client = NULL;
151                }
152                if ((hp = gethostbyname(host)) == NULL)
153                        return ((int) RPC_UNKNOWNHOST);
154                timeout.tv_usec = 0;
155                timeout.tv_sec = 6;
156                bcopy(hp->h_addr, &server_addr.sin_addr, hp->h_length);
157                server_addr.sin_family = AF_INET;
158                /* ping the remote end via tcp to see if it is up */
159                server_addr.sin_port =  htons(PMAPPORT);
160                if ((client = clnttcp_create(&server_addr, PMAPPROG,
161                    PMAPVERS, &socket, 0, 0)) == NULL) {
162                        return ((int) rpc_createerr.cf_stat);
163                } else {
164                        /* the fact we succeeded means the machine is up */
165                        close(socket);
166                        socket = RPC_ANYSOCK;
167                        clnt_destroy(client);
168                        client = NULL;
169                }
170                /* now really create a udp client handle */
171                server_addr.sin_port =  0;
172                if ((client = clntudp_create(&server_addr, prognum,
173                    versnum, timeout, &socket)) == NULL)
174                        return ((int) rpc_createerr.cf_stat);
175                client->cl_auth = authunix_create_default();
176                valid = 1;
177                oldprognum = prognum;
178                oldversnum = versnum;
179                strcpy(oldhost, host);
180        }
181        tottimeout.tv_sec = 25;
182        tottimeout.tv_usec = 0;
183        clnt_stat = clnt_call(client, procnum, inproc, in,
184            outproc, out, tottimeout);
185        /*
186         * if call failed, empty cache
187         */
188        if (clnt_stat != RPC_SUCCESS)
189                valid = 0;
190        return ((int) clnt_stat);
191}
192
193#ifdef SOLARIS
194bool_t
195xdr_rquota(xdrs, rqp)
196        XDR *xdrs;
197        struct rquota *rqp;
198{
199 
200        return (xdr_int(xdrs, &rqp->rq_bsize) &&
201            xdr_bool(xdrs, &rqp->rq_active) &&
202            xdr_u_long(xdrs, &rqp->rq_bhardlimit) &&
203            xdr_u_long(xdrs, &rqp->rq_bsoftlimit) &&
204            xdr_u_long(xdrs, &rqp->rq_curblocks) &&
205            xdr_u_long(xdrs, &rqp->rq_fhardlimit) &&
206            xdr_u_long(xdrs, &rqp->rq_fsoftlimit) &&
207            xdr_u_long(xdrs, &rqp->rq_curfiles) &&
208            xdr_u_long(xdrs, &rqp->rq_btimeleft) &&
209            xdr_u_long(xdrs, &rqp->rq_ftimeleft) );
210}
211bool_t
212xdr_path(xdrs, pathp)
213        XDR *xdrs;
214        char **pathp;
215{
216        if (xdr_string(xdrs, pathp, 1024)) {
217                return(TRUE);
218        }
219        return(FALSE);
220}
221 
222
223struct xdr_discrim gqr_arms[2] = {
224        { (int)Q_OK, xdr_rquota },
225        { __dontcare__, NULL }
226};
227
228bool_t
229xdr_getquota_args(xdrs, gq_argsp)
230        XDR *xdrs;
231        struct getquota_args *gq_argsp;
232{
233        extern bool_t xdr_path();
234 
235        return (xdr_path(xdrs, &gq_argsp->gqa_pathp) &&
236            xdr_int(xdrs, &gq_argsp->gqa_uid));
237}
238 
239bool_t
240xdr_getquota_rslt(xdrs, gq_rsltp)
241        XDR *xdrs;
242        struct getquota_rslt *gq_rsltp;
243{
244 
245        return (xdr_union(xdrs,
246            &gq_rsltp->status, &gq_rsltp->getquota_rslt_u.gqr_rquota,
247            gqr_arms, xdr_void));
248}
249#endif
Note: See TracBrowser for help on using the repository browser.