X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=utils%2Fmount%2Fnetwork.c;h=63d5f5acdebfbd3a78ef5acbd5439a7bd3e35fcc;hp=16b802de56acddac4727a5195eb1c53345aa9786;hb=ea4a03e77794eb2d46756c2d44f334f6ca4d13d7;hpb=7be7916adf72d09170e86ffeabbf8288ff0063e6 diff --git a/utils/mount/network.c b/utils/mount/network.c index 16b802d..63d5f5a 100644 --- a/utils/mount/network.c +++ b/utils/mount/network.c @@ -139,6 +139,13 @@ static const unsigned long probe_mnt3_first[] = { 0, }; +/** + * nfs_gethostbyname - resolve a hostname to an IPv4 address + * @hostname: pointer to a C string containing a DNS hostname + * @saddr: returns an IPv4 address + * + * Returns 1 if successful, otherwise zero. + */ int nfs_gethostbyname(const char *hostname, struct sockaddr_in *saddr) { struct hostent *hp; @@ -401,7 +408,8 @@ static int probe_port(clnt_addr_t *server, const unsigned long *versions, goto out_bad; } } - if (rpc_createerr.cf_stat != RPC_PROGNOTREGISTERED) + if (rpc_createerr.cf_stat != RPC_PROGNOTREGISTERED && + rpc_createerr.cf_stat != RPC_PROGVERSMISMATCH) goto out_bad; if (!prot) { @@ -457,6 +465,16 @@ static int probe_mntport(clnt_addr_t *mnt_server) return probe_port(mnt_server, probe_mnt1_first, probe_udp_only); } +/** + * probe_bothports - discover the RPC endpoints of mountd and NFS server + * @mnt_server: pointer to address and pmap argument for mountd results + * @nfs_server: pointer to address and pmap argument for NFS server + * + * Returns 1 if successful, otherwise zero if some error occurred. + * Note that the arguments are both input and output arguments. + * + * A side effect of calling this function is that rpccreateerr is set. + */ int probe_bothports(clnt_addr_t *mnt_server, clnt_addr_t *nfs_server) { struct pmap *nfs_pmap = &nfs_server->pmap; @@ -524,8 +542,10 @@ static int probe_statd(void) return 1; } -/* - * Attempt to start rpc.statd +/** + * start_statd - attempt to start rpc.statd + * + * Returns 1 if statd is running; otherwise zero. */ int start_statd(void) { @@ -549,7 +569,7 @@ 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" @@ -566,33 +586,29 @@ int nfs_call_umount(clnt_addr_t *mnt_server, dirpath *argp) 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 (!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; return 0; } +/** + * mnt_openclnt - get a handle for a remote mountd service + * @mnt_server: address and pmap arguments of mountd service + * @msock: returns a file descriptor of the underlying transport socket + * + * Returns an active handle for the remote's mountd service + */ CLIENT *mnt_openclnt(clnt_addr_t *mnt_server, int *msock) { struct sockaddr_in *mnt_saddr = &mnt_server->saddr; @@ -634,6 +650,12 @@ CLIENT *mnt_openclnt(clnt_addr_t *mnt_server, int *msock) return NULL; } +/** + * mnt_closeclnt - terminate a handle for a remote mountd service + * @clnt: pointer to an active handle for a remote mountd service + * @msock: file descriptor of the underlying transport socket + * + */ void mnt_closeclnt(CLIENT *clnt, int msock) { auth_destroy(clnt->cl_auth); @@ -641,7 +663,7 @@ void mnt_closeclnt(CLIENT *clnt, int msock) close(msock); } -/* +/** * clnt_ping - send an RPC ping to the remote RPC service endpoint * @saddr: server's address * @prog: target RPC program number @@ -729,7 +751,7 @@ int clnt_ping(struct sockaddr_in *saddr, const unsigned long prog, return 0; } -/* +/** * get_client_address - acquire our local network address * @saddr: server's address * @caddr: filled in with our network address