+
+ if (!selected(type))
+ return (1);
+
+ hp = NULL;
+ if (type == MOUNT_NFS) {
+ if ((delimp = strchr(name, '@')) != NULL) {
+ hostp = delimp + 1;
+ *delimp = '\0';
+ hp = gethostbyname(hostp);
+ *delimp = '@';
+ } else if ((delimp = strchr(name, ':')) != NULL) {
+ *delimp = '\0';
+ hostp = name;
+ hp = gethostbyname(hostp);
+ name = delimp + 1;
+ *delimp = ':';
+ }
+ }
+
+ if (!namematch(hp))
+ return (1);
+
+ if (vflag)
+ (void)printf("%s: unmount from %s\n", name, mntpt);
+ if (fake)
+ return (0);
+
+ if (unmount(mntpt, fflag) < 0) {
+ warn("%s", mntpt);
+ return (1);
+ }
+
+ if ((hp != NULL) && !(fflag & MNT_FORCE)) {
+ *delimp = '\0';
+ memset(&saddr, 0, sizeof(saddr));
+ saddr.sin_family = AF_INET;
+ saddr.sin_port = 0;
+ memmove(&saddr.sin_addr, hp->h_addr, hp->h_length);
+ pertry.tv_sec = 3;
+ pertry.tv_usec = 0;
+ so = RPC_ANYSOCK;
+ if ((clp = clntudp_create(&saddr,
+ RPCPROG_MNT, RPCMNT_VER1, pertry, &so)) == NULL) {
+ clnt_pcreateerror("Cannot MNT PRC");
+ return (1);
+ }
+ clp->cl_auth = authunix_create_default();
+ try.tv_sec = 20;
+ try.tv_usec = 0;
+ clnt_stat = clnt_call(clp,
+ RPCMNT_UMOUNT, xdr_dir, name, xdr_void, (caddr_t)0, try);
+ if (clnt_stat != RPC_SUCCESS) {
+ clnt_perror(clp, "Bad MNT RPC");
+ return (1);
+ }
+ auth_destroy(clp->cl_auth);
+ clnt_destroy(clp);
+ }
+ return (0);