summaryrefslogtreecommitdiffstats
path: root/usr.sbin/rpc.umntall
diff options
context:
space:
mode:
authoriedowse <iedowse@FreeBSD.org>2001-07-22 01:25:25 +0000
committeriedowse <iedowse@FreeBSD.org>2001-07-22 01:25:25 +0000
commitf561545d60b8675e48433a54e801fc9b94ccb773 (patch)
tree2692b1141cadbaa5721ca3fe2010cfa60673f9ef /usr.sbin/rpc.umntall
parent088f7e2128c168afd561139953bc5dcab91ab224 (diff)
downloadFreeBSD-src-f561545d60b8675e48433a54e801fc9b94ccb773.zip
FreeBSD-src-f561545d60b8675e48433a54e801fc9b94ccb773.tar.gz
Fix a selection of bugs, and improve code layout:
- Remove unnecessary and unused local variables. - Include useful information in error and warning messages. - Fix the logic for expiring mounttab entries. - Remove calls to getaddrinfo - the results were not used. - Simplify some string handling by using snprintf. - Fix usage.
Diffstat (limited to 'usr.sbin/rpc.umntall')
-rw-r--r--usr.sbin/rpc.umntall/rpc.umntall.c169
1 files changed, 74 insertions, 95 deletions
diff --git a/usr.sbin/rpc.umntall/rpc.umntall.c b/usr.sbin/rpc.umntall/rpc.umntall.c
index 4428bc0..cf570f5 100644
--- a/usr.sbin/rpc.umntall/rpc.umntall.c
+++ b/usr.sbin/rpc.umntall/rpc.umntall.c
@@ -59,14 +59,12 @@ struct mtablist *mtabhead;
int
main(int argc, char **argv) {
int ch, keep, success, pathlen;
- time_t expire, *now;
+ time_t expire, now;
char *host, *path;
struct mtablist *mtab;
- mtab = NULL;
- now = NULL;
expire = 0;
- host = path = '\0';
+ host = path = NULL;
success = keep = verbose = 0;
while ((ch = getopt(argc, argv, "h:kp:ve:")) != -1)
switch (ch) {
@@ -99,68 +97,74 @@ main(int argc, char **argv) {
/* Default expiretime is one day */
if (expire == 0)
expire = 86400;
- /*
- * Read PATH_MOUNTTAB and check each entry
- * and do finally the unmounts.
- */
+ time(&now);
+
+ /* Read PATH_MOUNTTAB. */
+ if (!read_mtab(NULL)) {
+ if (verbose)
+ warnx("no mounttab entries (%s does not exist)",
+ PATH_MOUNTTAB);
+ mtabhead = NULL;
+ }
+
if (host == NULL && path == NULL) {
- if (!read_mtab(mtab)) {
- if (verbose)
- warnx("nothing to do, %s does not exist",
- PATH_MOUNTTAB);
- }
+ /* Check each entry and do any necessary unmount RPCs. */
for (mtab = mtabhead; mtab != NULL; mtab = mtab->mtab_next) {
- if (*mtab->mtab_host != '\0' ||
- mtab->mtab_time <= (time(now) - expire)) {
- if (keep && is_mounted(mtab->mtab_host,
- mtab->mtab_dirp)) {
- if (verbose) {
- warnx("skip entry %s:%s",
- mtab->mtab_host,
- mtab->mtab_dirp);
- }
- } else if (do_umount(mtab->mtab_host,
- mtab->mtab_dirp) ||
- mtab->mtab_time <= (time(now) - expire)) {
- clean_mtab(mtab->mtab_host,
- mtab->mtab_dirp);
- }
+ if (*mtab->mtab_host == '\0')
+ continue;
+ if (mtab->mtab_time + expire < now) {
+ /* Clear expired entry. */
+ if (verbose)
+ warnx("remove expired entry %s:%s",
+ mtab->mtab_host, mtab->mtab_dirp);
+ bzero(mtab->mtab_host,
+ sizeof(mtab->mtab_host));
+ continue;
+ }
+ if (keep && is_mounted(mtab->mtab_host,
+ mtab->mtab_dirp)) {
+ if (verbose)
+ warnx("skip entry %s:%s",
+ mtab->mtab_host, mtab->mtab_dirp);
+ continue;
+ }
+ if (do_umount(mtab->mtab_host, mtab->mtab_dirp)) {
+ if (verbose)
+ warnx("umount RPC for %s:%s succeeded",
+ mtab->mtab_host, mtab->mtab_dirp);
+ /* Remove all entries for this host + path. */
+ clean_mtab(mtab->mtab_host, mtab->mtab_dirp);
}
}
- /* Only do a RPC UMNTALL for this specific host */
- } else if (host != NULL && path == NULL) {
- if (!do_umntall(host))
- exit(1);
- else
- success = 1;
- /* Someone forgot to enter a hostname */
- } else if (host == NULL && path != NULL)
- usage();
- /* Only do a RPC UMOUNT for this specific mount */
- else {
- for (pathlen = strlen(path);
- pathlen > 1 && path[pathlen - 1] == '/'; pathlen--)
- path[pathlen - 1] = '\0';
- if (!do_umount(host, path))
- exit(1);
- else
- success = 1;
- }
- /* Write and unlink PATH_MOUNTTAB if necessary */
- if (success) {
- if (verbose)
- warnx("UMOUNT RPC successfully sent to %s", host);
- if (read_mtab(mtab)) {
- mtab = mtabhead;
- clean_mtab(host, path);
+ success = 1;
+ } else {
+ if (host == NULL && path != NULL)
+ /* Missing hostname. */
+ usage();
+ if (path == NULL) {
+ /* Do a RPC UMNTALL for this specific host */
+ success = do_umntall(host);
+ if (verbose && success)
+ warnx("umntall RPC for %s succeeded", host);
+ } else {
+ /* Do a RPC UMNTALL for this specific mount */
+ for (pathlen = strlen(path);
+ pathlen > 1 && path[pathlen - 1] == '/'; pathlen--)
+ path[pathlen - 1] = '\0';
+ success = do_umount(host, path);
+ if (verbose && success)
+ warnx("umount RPC for %s:%s succeeded", host,
+ path);
}
+ /* If successful, remove any corresponding mounttab entries. */
+ if (success)
+ clean_mtab(host, path);
}
- if (!write_mtab()) {
- free_mtab();
- exit(1);
- }
+ /* Write and unlink PATH_MOUNTTAB if necessary */
+ if (success)
+ success = write_mtab();
free_mtab();
- exit(0);
+ exit (success ? 0 : 1);
}
/*
@@ -171,22 +175,12 @@ main(int argc, char **argv) {
int
do_umntall(char *hostname) {
enum clnt_stat clnt_stat;
- struct addrinfo *ai, hints;
struct timeval try;
- int so, ecode;
CLIENT *clp;
- memset(&hints, 0, sizeof hints);
- hints.ai_flags = AI_NUMERICHOST;
- ecode = getaddrinfo(hostname, NULL, &hints, &ai);
- if (ecode != 0) {
- warnx("can't get net id for host/nfs: %s",
- gai_strerror(ecode));
- return (1);
- }
clp = clnt_create(hostname, RPCPROG_MNT, RPCMNT_VER1, "udp");
- if (clp == NULL) {
- clnt_pcreateerror("Cannot MNT PRC");
+ if (clp == NULL) {
+ warnx("%s: %s", hostname, clnt_spcreateerror("RPCPROG_MNT"));
return (1);
}
clp->cl_auth = authunix_create_default();
@@ -194,8 +188,9 @@ do_umntall(char *hostname) {
try.tv_usec = 0;
clnt_stat = clnt_call(clp, RPCMNT_UMNTALL, xdr_void, (caddr_t)0,
xdr_void, (caddr_t)0, try);
+ clnt_destroy(clp);
if (clnt_stat != RPC_SUCCESS) {
- clnt_perror(clp, "Bad MNT RPC");
+ warnx("%s: %s", hostname, clnt_sperror(clp, "RPCMNT_UMNTALL"));
return (0);
} else
return (1);
@@ -207,22 +202,12 @@ do_umntall(char *hostname) {
int
do_umount(char *hostname, char *dirp) {
enum clnt_stat clnt_stat;
- struct addrinfo *ai, hints;
struct timeval try;
CLIENT *clp;
- int so, ecode;
- memset(&hints, 0, sizeof hints);
- hints.ai_flags = AI_NUMERICHOST;
- ecode = getaddrinfo(hostname, NULL, &hints, &ai);
- if (ecode != 0) {
- warnx("can't get net id for host/nfs: %s",
- gai_strerror(ecode));
- return (1);
- }
clp = clnt_create(hostname, RPCPROG_MNT, RPCMNT_VER1, "udp");
if (clp == NULL) {
- clnt_pcreateerror("Cannot MNT PRC");
+ warnx("%s: %s", hostname, clnt_spcreateerror("RPCPROG_MNT"));
return (1);
}
clp->cl_auth = authsys_create_default();
@@ -230,8 +215,9 @@ do_umount(char *hostname, char *dirp) {
try.tv_usec = 0;
clnt_stat = clnt_call(clp, RPCMNT_UMOUNT, xdr_dir, dirp,
xdr_void, (caddr_t)0, try);
+ clnt_destroy(clp);
if (clnt_stat != RPC_SUCCESS) {
- clnt_perror(clp, "Bad MNT RPC");
+ warnx("%s: %s", hostname, clnt_sperror(clp, "RPCMNT_UMOUNT"));
return (0);
}
return (1);
@@ -244,17 +230,12 @@ int
is_mounted(char *hostname, char *dirp) {
struct statfs *mntbuf;
char name[MNAMELEN + 1];
- size_t bufsize, hostlen, dirlen;
+ size_t bufsize;
int mntsize, i;
- hostlen = strlen(hostname);
- dirlen = strlen(dirp);
- if ((hostlen + dirlen) >= MNAMELEN)
+ if (strlen(hostname) + strlen(dirp) >= MNAMELEN)
return (0);
- memmove(name, hostname, hostlen);
- name[hostlen] = ':';
- memmove(name + hostlen + 1, dirp, dirlen);
- name[hostlen + dirlen + 1] = '\0';
+ snprintf(name, sizeof(name), "%s:%s", hostname, dirp);
mntsize = getfsstat(NULL, 0, MNT_NOWAIT);
if (mntsize <= 0)
return (0);
@@ -277,14 +258,12 @@ is_mounted(char *hostname, char *dirp) {
*/
int
xdr_dir(XDR *xdrsp, char *dirp) {
-
return (xdr_string(xdrsp, &dirp, RPCMNT_PATHLEN));
}
static void
usage() {
-
(void)fprintf(stderr, "%s\n",
- "usage: rpc.umntall [-h host] [-k] [-p path] [-t expire] [-v]");
+ "usage: rpc.umntall [-kv] [-e expire] [-h host] [-p path]");
exit(1);
}
OpenPOWER on IntegriCloud