X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmountd%2Fmountd.c;h=982b06ea143facc7937cbbd7489a25934aad09c1;hp=dc84404aa1e81ad18d03cf811bacaa439a5dd840;hb=ffe8c9a084fec4fdd3acfcf4b36fbe434d297b82;hpb=1e472b3476cc6d7b95573b7d630d0fc51bebadf3 diff --git a/utils/mountd/mountd.c b/utils/mountd/mountd.c index dc84404..982b06e 100644 --- a/utils/mountd/mountd.c +++ b/utils/mountd/mountd.c @@ -28,10 +28,6 @@ #include "rpcmisc.h" #include "pseudoflavors.h" -extern void cache_open(void); -extern struct nfs_fh_len *cache_get_filehandle(nfs_export *exp, int len, char *p); -extern int cache_export(nfs_export *exp, char *path); - extern void my_svc_run(void); static void usage(const char *, int exitcode); @@ -192,18 +188,28 @@ sig_hup (int sig) } bool_t -mount_null_1_svc(struct svc_req *UNUSED(rqstp), void *UNUSED(argp), +mount_null_1_svc(struct svc_req *rqstp, void *UNUSED(argp), void *UNUSED(resp)) { + struct sockaddr *sap = nfs_getrpccaller(rqstp->rq_xprt); + char buf[INET6_ADDRSTRLEN]; + + xlog(D_CALL, "Received NULL request from %s", + host_ntop(sap, buf, sizeof(buf))); + return 1; } bool_t mount_mnt_1_svc(struct svc_req *rqstp, dirpath *path, fhstatus *res) { + struct sockaddr *sap = nfs_getrpccaller(rqstp->rq_xprt); + char buf[INET6_ADDRSTRLEN]; struct nfs_fh_len *fh; - xlog(D_CALL, "MNT1(%s) called", *path); + xlog(D_CALL, "Received MNT1(%s) request from %s", *path, + host_ntop(sap, buf, sizeof(buf))); + fh = get_rootfh(rqstp, path, NULL, &res->fhs_status, 0); if (fh) memcpy(&res->fhstatus_u.fhs_fhandle, fh->fh_handle, 32); @@ -213,9 +219,12 @@ mount_mnt_1_svc(struct svc_req *rqstp, dirpath *path, fhstatus *res) bool_t mount_dump_1_svc(struct svc_req *rqstp, void *UNUSED(argp), mountlist *res) { - struct sockaddr_in *addr = nfs_getrpccaller_in(rqstp->rq_xprt); + struct sockaddr *sap = nfs_getrpccaller(rqstp->rq_xprt); + char buf[INET6_ADDRSTRLEN]; + + xlog(D_CALL, "Received DUMP request from %s", + host_ntop(sap, buf, sizeof(buf))); - xlog(D_CALL, "dump request from %s.", inet_ntoa(addr->sin_addr)); *res = mountlist_list(); return 1; @@ -224,10 +233,11 @@ mount_dump_1_svc(struct svc_req *rqstp, void *UNUSED(argp), mountlist *res) bool_t mount_umnt_1_svc(struct svc_req *rqstp, dirpath *argp, void *UNUSED(resp)) { - struct sockaddr_in *sin = nfs_getrpccaller_in(rqstp->rq_xprt); + struct sockaddr *sap = nfs_getrpccaller(rqstp->rq_xprt); nfs_export *exp; char *p = *argp; char rpath[MAXPATHLEN+1]; + char buf[INET6_ADDRSTRLEN]; if (*p == '\0') p = "/"; @@ -237,11 +247,14 @@ mount_umnt_1_svc(struct svc_req *rqstp, dirpath *argp, void *UNUSED(resp)) p = rpath; } - if (!(exp = auth_authenticate("unmount", sin, p))) { + xlog(D_CALL, "Received UMNT(%s) request from %s", p, + host_ntop(sap, buf, sizeof(buf))); + + exp = auth_authenticate("unmount", sap, p); + if (exp == NULL) return 1; - } - mountlist_del(inet_ntoa(sin->sin_addr), p); + mountlist_del(host_ntop(sap, buf, sizeof(buf)), p); return 1; } @@ -249,19 +262,28 @@ bool_t mount_umntall_1_svc(struct svc_req *rqstp, void *UNUSED(argp), void *UNUSED(resp)) { + struct sockaddr *sap = nfs_getrpccaller(rqstp->rq_xprt); + char buf[INET6_ADDRSTRLEN]; + + xlog(D_CALL, "Received UMNTALL request from %s", + host_ntop(sap, buf, sizeof(buf))); + /* Reload /etc/xtab if necessary */ auth_reload(); - mountlist_del_all(nfs_getrpccaller_in(rqstp->rq_xprt)); + mountlist_del_all(nfs_getrpccaller(rqstp->rq_xprt)); return 1; } bool_t mount_export_1_svc(struct svc_req *rqstp, void *UNUSED(argp), exports *resp) { - struct sockaddr_in *addr = nfs_getrpccaller_in(rqstp->rq_xprt); + struct sockaddr *sap = nfs_getrpccaller(rqstp->rq_xprt); + char buf[INET6_ADDRSTRLEN]; + + xlog(D_CALL, "Received EXPORT request from %s.", + host_ntop(sap, buf, sizeof(buf))); - xlog(D_CALL, "export request from %s.", inet_ntoa(addr->sin_addr)); *resp = get_exportlist(); return 1; @@ -270,9 +292,12 @@ mount_export_1_svc(struct svc_req *rqstp, void *UNUSED(argp), exports *resp) bool_t mount_exportall_1_svc(struct svc_req *rqstp, void *UNUSED(argp), exports *resp) { - struct sockaddr_in *addr = nfs_getrpccaller_in(rqstp->rq_xprt); + struct sockaddr *sap = nfs_getrpccaller(rqstp->rq_xprt); + char buf[INET6_ADDRSTRLEN]; + + xlog(D_CALL, "Received EXPORTALL request from %s.", + host_ntop(sap, buf, sizeof(buf))); - xlog(D_CALL, "exportall request from %s.", inet_ntoa(addr->sin_addr)); *resp = get_exportlist(); return 1; @@ -292,11 +317,12 @@ mount_exportall_1_svc(struct svc_req *rqstp, void *UNUSED(argp), exports *resp) bool_t mount_pathconf_2_svc(struct svc_req *rqstp, dirpath *path, ppathcnf *res) { - struct sockaddr_in *sin = nfs_getrpccaller_in(rqstp->rq_xprt); + struct sockaddr *sap = nfs_getrpccaller(rqstp->rq_xprt); struct stat stb; nfs_export *exp; char rpath[MAXPATHLEN+1]; char *p = *path; + char buf[INET6_ADDRSTRLEN]; memset(res, 0, sizeof(*res)); @@ -312,11 +338,14 @@ mount_pathconf_2_svc(struct svc_req *rqstp, dirpath *path, ppathcnf *res) p = rpath; } + xlog(D_CALL, "Received PATHCONF(%s) request from %s", p, + host_ntop(sap, buf, sizeof(buf))); + /* Now authenticate the intruder... */ - exp = auth_authenticate("pathconf", sin, p); - if (!exp) { + exp = auth_authenticate("pathconf", sap, p); + if (exp == NULL) return 1; - } else if (stat(p, &stb) < 0) { + else if (stat(p, &stb) < 0) { xlog(L_WARNING, "can't stat exported dir %s: %s", p, strerror(errno)); return 1; @@ -376,11 +405,15 @@ static void set_authflavors(struct mountres3_ok *ok, nfs_export *exp) bool_t mount_mnt_3_svc(struct svc_req *rqstp, dirpath *path, mountres3 *res) { + struct sockaddr *sap = nfs_getrpccaller(rqstp->rq_xprt); struct mountres3_ok *ok = &res->mountres3_u.mountinfo; + char buf[INET6_ADDRSTRLEN]; nfs_export *exp; struct nfs_fh_len *fh; - xlog(D_CALL, "MNT3(%s) called", *path); + xlog(D_CALL, "Received MNT3(%s) request from %s", *path, + host_ntop(sap, buf, sizeof(buf))); + fh = get_rootfh(rqstp, path, &exp, &res->fhs_status, 1); if (!fh) return 1; @@ -395,12 +428,13 @@ static struct nfs_fh_len * get_rootfh(struct svc_req *rqstp, dirpath *path, nfs_export **expret, mountstat3 *error, int v3) { - struct sockaddr_in *sin = nfs_getrpccaller_in(rqstp->rq_xprt); + struct sockaddr *sap = nfs_getrpccaller(rqstp->rq_xprt); struct stat stb, estb; nfs_export *exp; struct nfs_fh_len *fh; char rpath[MAXPATHLEN+1]; char *p = *path; + char buf[INET6_ADDRSTRLEN]; if (*p == '\0') p = "/"; @@ -415,8 +449,8 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, nfs_export **expret, } /* Now authenticate the intruder... */ - exp = auth_authenticate("mount", sin, p); - if (!exp) { + exp = auth_authenticate("mount", sap, p); + if (exp == NULL) { *error = NFSERR_ACCES; return NULL; } @@ -484,13 +518,13 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, nfs_export **expret, xtab_append(exp); if (v3) - fh = getfh_size ((struct sockaddr *) sin, p, 64); + fh = getfh_size((struct sockaddr_in *)sap, p, 64); if (!v3 || (fh == NULL && errno == EINVAL)) { /* We first try the new nfs syscall. */ - fh = getfh ((struct sockaddr *) sin, p); + fh = getfh((struct sockaddr_in *)sap, p); if (fh == NULL && errno == EINVAL) /* Let's try the old one. */ - fh = getfh_old ((struct sockaddr *) sin, + fh = getfh_old((struct sockaddr_in *)sap, stb.st_dev, stb.st_ino); } if (fh == NULL && !did_export) { @@ -505,7 +539,7 @@ get_rootfh(struct svc_req *rqstp, dirpath *path, nfs_export **expret, } } *error = NFS_OK; - mountlist_add(inet_ntoa(sin->sin_addr), p); + mountlist_add(host_ntop(sap, buf, sizeof(buf)), p); if (expret) *expret = exp; return fh;