summaryrefslogtreecommitdiffstats
path: root/usr.sbin/mountd
diff options
context:
space:
mode:
authoralfred <alfred@FreeBSD.org>2002-07-15 18:34:27 +0000
committeralfred <alfred@FreeBSD.org>2002-07-15 18:34:27 +0000
commitb53eff381dcf8067f1d12b0735cc8599466af870 (patch)
treecbaa0ec57466a538d1db3c53f5e89cd31be4ccd8 /usr.sbin/mountd
parent1495816eb148b002d9c007c7412219120d7f4277 (diff)
downloadFreeBSD-src-b53eff381dcf8067f1d12b0735cc8599466af870.zip
FreeBSD-src-b53eff381dcf8067f1d12b0735cc8599466af870.tar.gz
If an RPC fails, try a shorter reply in case the fault lies with the
size of the response. PR: misc/26320 MFC After: 2 weeks
Diffstat (limited to 'usr.sbin/mountd')
-rw-r--r--usr.sbin/mountd/mountd.c49
1 files changed, 39 insertions, 10 deletions
diff --git a/usr.sbin/mountd/mountd.c b/usr.sbin/mountd/mountd.c
index 5940c4d..3d0df88 100644
--- a/usr.sbin/mountd/mountd.c
+++ b/usr.sbin/mountd/mountd.c
@@ -196,7 +196,7 @@ void mntsrv(struct svc_req *, SVCXPRT *);
void nextfield(char **, char **);
void out_of_mem(void);
void parsecred(char *, struct xucred *);
-int put_exlist(struct dirlist *, XDR *, struct dirlist *, int *);
+int put_exlist(struct dirlist *, XDR *, struct dirlist *, int *, int);
void *sa_rawaddr(struct sockaddr *sa, int *nbytes);
int sacmp(struct sockaddr *sa1, struct sockaddr *sa2,
struct sockaddr *samask);
@@ -204,6 +204,7 @@ int scan_tree(struct dirlist *, struct sockaddr *);
static void usage(void);
int xdr_dir(XDR *, char *);
int xdr_explist(XDR *, caddr_t);
+int xdr_explist_brief(XDR *, caddr_t);
int xdr_fhs(XDR *, caddr_t);
int xdr_mlist(XDR *, caddr_t);
void terminate(int);
@@ -540,7 +541,7 @@ mntsrv(rqstp, transp)
ai = NULL;
switch (rqstp->rq_proc) {
case NULLPROC:
- if (!svc_sendreply(transp, xdr_void, (caddr_t)NULL))
+ if (!svc_sendreply(transp, xdr_void, NULL))
syslog(LOG_ERR, "can't send reply");
return;
case RPCMNT_MOUNT:
@@ -689,7 +690,8 @@ mntsrv(rqstp, transp)
return;
case RPCMNT_EXPORT:
if (!svc_sendreply(transp, xdr_explist, (caddr_t)NULL))
- syslog(LOG_ERR, "can't send reply");
+ if (!svc_sendreply(transp, xdr_explist_brief, (caddr_t)NULL))
+ syslog(LOG_ERR, "can't send reply");
if (log)
syslog(LOG_NOTICE,
"export request succeeded from %s",
@@ -774,9 +776,10 @@ xdr_mlist(xdrsp, cp)
* Xdr conversion for export list
*/
int
-xdr_explist(xdrsp, cp)
+xdr_explist_common(xdrsp, cp, brief)
XDR *xdrsp;
caddr_t cp;
+ int brief;
{
struct exportlist *ep;
int false = 0;
@@ -789,11 +792,12 @@ xdr_explist(xdrsp, cp)
ep = exphead;
while (ep) {
putdef = 0;
- if (put_exlist(ep->ex_dirl, xdrsp, ep->ex_defdir, &putdef))
+ if (put_exlist(ep->ex_dirl, xdrsp, ep->ex_defdir,
+ &putdef, brief))
goto errout;
if (ep->ex_defdir && putdef == 0 &&
put_exlist(ep->ex_defdir, xdrsp, (struct dirlist *)NULL,
- &putdef))
+ &putdef, brief))
goto errout;
ep = ep->ex_next;
}
@@ -811,11 +815,12 @@ errout:
* directory paths.
*/
int
-put_exlist(dp, xdrsp, adp, putdefp)
+put_exlist(dp, xdrsp, adp, putdefp, brief)
struct dirlist *dp;
XDR *xdrsp;
struct dirlist *adp;
int *putdefp;
+ int brief;
{
struct grouplist *grp;
struct hostlist *hp;
@@ -825,7 +830,7 @@ put_exlist(dp, xdrsp, adp, putdefp)
char *strp;
if (dp) {
- if (put_exlist(dp->dp_left, xdrsp, adp, putdefp))
+ if (put_exlist(dp->dp_left, xdrsp, adp, putdefp, brief))
return (1);
if (!xdr_bool(xdrsp, &true))
return (1);
@@ -836,7 +841,13 @@ put_exlist(dp, xdrsp, adp, putdefp)
gotalldir = 1;
*putdefp = 1;
}
- if ((dp->dp_flag & DP_DEFSET) == 0 &&
+ if (brief) {
+ if (!xdr_bool(xdrsp, &true))
+ return (1);
+ strp = "(...)";
+ if (!xdr_string(xdrsp, &strp, RPCMNT_PATHLEN))
+ return (1);
+ } else if ((dp->dp_flag & DP_DEFSET) == 0 &&
(gotalldir == 0 || (adp->dp_flag & DP_DEFSET) == 0)) {
hp = dp->dp_hosts;
while (hp) {
@@ -865,12 +876,30 @@ put_exlist(dp, xdrsp, adp, putdefp)
}
if (!xdr_bool(xdrsp, &false))
return (1);
- if (put_exlist(dp->dp_right, xdrsp, adp, putdefp))
+ if (put_exlist(dp->dp_right, xdrsp, adp, putdefp, brief))
return (1);
}
return (0);
}
+int
+xdr_explist(xdrsp, cp)
+ XDR *xdrsp;
+ caddr_t cp;
+{
+
+ return xdr_explist_common(xdrsp, cp, 0);
+}
+
+int
+xdr_explist_brief(xdrsp, cp)
+ XDR *xdrsp;
+ caddr_t cp;
+{
+
+ return xdr_explist_common(xdrsp, cp, 1);
+}
+
char *line;
int linesize;
FILE *exp_file;
OpenPOWER on IntegriCloud