X-Git-Url: https://git.decadent.org.uk/gitweb/?a=blobdiff_plain;f=utils%2Fmount%2Fnetwork.c;h=565330281c940f94a5ab03bd7c945778934d1398;hb=897f581874255d363e00ef94534f6fced8dd2ba2;hp=ab8cfb751a021989721074486f8c87791415e280;hpb=a574c7558e33f172b6dfee53ee8df9e59c84c7b5;p=nfs-utils.git diff --git a/utils/mount/network.c b/utils/mount/network.c index ab8cfb7..5653302 100644 --- a/utils/mount/network.c +++ b/utils/mount/network.c @@ -38,7 +38,6 @@ #include "xcommon.h" #include "mount.h" #include "nls.h" -#include "nfsumount.h" #include "nfs_mount.h" #include "mount_constants.h" #include "network.h" @@ -136,8 +135,23 @@ unsigned short getport(struct sockaddr_in *saddr, unsigned long prog, struct pmap parms; enum clnt_stat stat; - saddr->sin_port = htons (PMAPPORT); - socket = get_socket(saddr, prot, FALSE, FALSE); + saddr->sin_port = htons(PMAPPORT); + + /* + * Try to get a socket with a non-privileged port. + * clnt*create() will create one anyway if this + * fails. + */ + socket = get_socket(saddr, proto, FALSE, FALSE); + if (socket == RPC_ANYSOCK) { + if (proto == IPPROTO_TCP && errno == ETIMEDOUT) { + /* + * TCP SYN timed out, so exit now. + */ + rpc_createerr.cf_stat = RPC_TIMEDOUT; + } + return 0; + } switch (prot) { case IPPROTO_UDP: @@ -245,7 +259,7 @@ out_ok: return 1; } -int probe_nfsport(clnt_addr_t *nfs_server) +static int probe_nfsport(clnt_addr_t *nfs_server) { struct pmap *pmap = &nfs_server->pmap; @@ -258,7 +272,7 @@ int probe_nfsport(clnt_addr_t *nfs_server) return probe_port(nfs_server, probe_nfs2_only, probe_udp_only); } -int probe_mntport(clnt_addr_t *mnt_server) +static int probe_mntport(clnt_addr_t *mnt_server) { struct pmap *pmap = &mnt_server->pmap; @@ -362,3 +376,47 @@ int start_statd(void) return 0; } + +/* + * nfs_call_umount - ask the server to remove a share from it's rmtab + * @mnt_server: address of RPC MNT program server + * @argp: directory path of share to "unmount" + * + * Returns one if the unmount call succeeded; zero if the unmount + * failed for any reason. + * + * Note that a side effect of calling this function is that rpccreateerr + * is set. + */ +int nfs_call_umount(clnt_addr_t *mnt_server, dirpath *argp) +{ + CLIENT *clnt; + enum clnt_stat res = 0; + int msock; + + switch (mnt_server->pmap.pm_vers) { + case 3: + case 2: + case 1: + if (!probe_mntport(mnt_server)) + return 0; + clnt = mnt_openclnt(mnt_server, &msock); + if (!clnt) + return 0; + res = clnt_call(clnt, MOUNTPROC_UMNT, + (xdrproc_t)xdr_dirpath, (caddr_t)argp, + (xdrproc_t)xdr_void, NULL, + TIMEOUT); + mnt_closeclnt(clnt, msock); + if (res == RPC_SUCCESS) + return 1; + break; + default: + res = RPC_SUCCESS; + break; + } + + if (res == RPC_SUCCESS) + return 1; + return 0; +}