Date: Tue, 12 Jun 2001 23:15:49 -0700 From: Dima Dorfman <dima@unixfreak.org> To: audit@freebsd.org Subject: mountd/showmount/mountdtab patch Message-ID: <20010613061550.049B13E28@bazooka.unixfreak.org>
next in thread | raw e-mail | index | archive | help
The attached patch makes mountd write the numeric IP address instead of the hostname of the connecting machine to /var/db/mountdtab, and updates showmount to do the DNS lookup itself. It also adds an -n option to the latter which disables the DNS lookup. That's the real motivation behind this; it's very nice to be able to find the IP address of the connecting machine without having to do a lookup. Please review. Thanks in advance, Dima Dorfman dima@unixfreak.org Index: sbin/mountd/mountd.c =================================================================== RCS file: /stl/src/FreeBSD/src/sbin/mountd/mountd.c,v retrieving revision 1.55 diff -u -r1.55 mountd.c --- sbin/mountd/mountd.c 2001/06/01 10:57:24 1.55 +++ sbin/mountd/mountd.c 2001/06/13 05:53:29 @@ -522,8 +522,7 @@ struct stat stb; struct statfs fsb; struct addrinfo *ai; - char host[NI_MAXHOST], numerichost[NI_MAXHOST]; - int lookup_failed = 1; + char numerichost[NI_MAXHOST]; struct sockaddr *saddr; u_short sport; char rpcpath[RPCMNT_PATHLEN + 1], dirpath[MAXPATHLEN]; @@ -544,8 +543,6 @@ syslog(LOG_ERR, "request from unknown address family"); return; } - lookup_failed = getnameinfo(saddr, saddr->sa_len, host, sizeof host, - NULL, 0, 0); getnameinfo(saddr, saddr->sa_len, numerichost, sizeof numerichost, NULL, 0, NI_NUMERICHOST); ai = NULL; @@ -622,10 +619,7 @@ } if (!svc_sendreply(transp, xdr_fhs, (caddr_t)&fhr)) syslog(LOG_ERR, "can't send reply"); - if (!lookup_failed) - add_mlist(host, dirpath); - else - add_mlist(numerichost, dirpath); + add_mlist(numerichost, dirpath); if (debug) warnx("mount successful"); if (log) @@ -672,8 +666,6 @@ } if (!svc_sendreply(transp, xdr_void, (caddr_t)NULL)) syslog(LOG_ERR, "can't send reply"); - if (!lookup_failed) - del_mlist(host, dirpath); del_mlist(numerichost, dirpath); if (log) syslog(LOG_NOTICE, @@ -690,8 +682,6 @@ } if (!svc_sendreply(transp, xdr_void, (caddr_t)NULL)) syslog(LOG_ERR, "can't send reply"); - if (!lookup_failed) - del_mlist(host, NULL); del_mlist(numerichost, NULL); if (log) syslog(LOG_NOTICE, Index: usr.bin/showmount/showmount.c =================================================================== RCS file: /stl/src/FreeBSD/src/usr.bin/showmount/showmount.c,v retrieving revision 1.10 diff -u -r1.10 showmount.c --- usr.bin/showmount/showmount.c 2001/06/12 03:44:35 1.10 +++ usr.bin/showmount/showmount.c 2001/06/13 05:53:29 @@ -94,7 +94,9 @@ static struct mountlist *mntdump; static struct exportslist *exports; static int type = 0; +static int do_dns = 1; +void normalize_host __P((const char *, char **)); void print_dump __P((struct mountlist *)); static void usage __P((void)); int xdr_mntdump __P((XDR *, struct mountlist **)); @@ -123,7 +125,7 @@ char *host; int estat; - while ((ch = getopt(argc, argv, "ade3")) != -1) + while ((ch = getopt(argc, argv, "aden3")) != -1) switch((char)ch) { case 'a': if (type == 0) { @@ -142,6 +144,9 @@ case 'e': rpcs |= DOEXPORTS; break; + case 'n': + do_dns = 0; + break; case '3': mntvers = 3; break; @@ -375,7 +380,7 @@ static void usage() { - fprintf(stderr, "usage: showmount [-ade3] host\n"); + fprintf(stderr, "usage: showmount [-aden3] host\n"); exit(1); } @@ -386,22 +391,60 @@ print_dump(mp) struct mountlist *mp; { + char *host; if (mp == NULL) return; if (mp->ml_left) print_dump(mp->ml_left); + normalize_host(mp->ml_host, &host); switch (type) { case ALL: - printf("%s:%s\n", mp->ml_host, mp->ml_dirp); + printf("%s:%s\n", host, mp->ml_dirp); break; case DIRS: printf("%s\n", mp->ml_dirp); break; default: - printf("%s\n", mp->ml_host); + printf("%s\n", host); break; }; + free(host); if (mp->ml_right) print_dump(mp->ml_right); +} + +void +normalize_host(old, new) + const char *old; + char **new; +{ + struct addrinfo *ai; + char *newval; + int error, flags; + + if (!do_dns) + flags = NI_NUMERICHOST; + else + flags = 0; + error = getaddrinfo(old, NULL, NULL, &ai); + if (error != 0) { + *new = strdup(old); + return; + } + newval = malloc(NI_MAXHOST); + if (newval == NULL) { + freeaddrinfo(ai); + err(1, "malloc"); + } + error = getnameinfo(ai->ai_addr, ai->ai_addrlen, newval, NI_MAXHOST, + NULL, 0, flags); + if (error != 0) { + freeaddrinfo(ai); + free(newval); + *new = strdup(old); + return; + } + freeaddrinfo(ai); + *new = newval; } To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-audit" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20010613061550.049B13E28>