86 lines
2.1 KiB
Diff
86 lines
2.1 KiB
Diff
Some cleanup for my last patch.
|
|
|
|
|
|
--
|
|
H.J. Lu (hjl@gnu.org)
|
|
--
|
|
--- portmap_4/pmap_check.c.hostname Wed May 10 10:23:35 2000
|
|
+++ portmap_4/pmap_check.c Wed May 10 11:03:22 2000
|
|
@@ -35,6 +35,7 @@
|
|
static char sccsid[] = "@(#) pmap_check.c 1.6 93/11/21 20:58:59";
|
|
#endif
|
|
#include <unistd.h>
|
|
+#include <string.h>
|
|
#include <rpc/rpc.h>
|
|
#include <rpc/pmap_prot.h>
|
|
#include <syslog.h>
|
|
@@ -69,8 +70,6 @@ int deny_severity = LOG_WARNING;
|
|
/* coming from libwrap.a (tcp_wrappers) */
|
|
extern int hosts_ctl(char *daemon, char *name, char *addr, char *user);
|
|
|
|
-#define good_client(a) hosts_ctl("portmap", "", inet_ntoa(a->sin_addr), "")
|
|
-
|
|
#define reserved_port(p) (IPPORT_RESERVED/2 < (p) && (p) < IPPORT_RESERVED)
|
|
|
|
#define unreserved_port(p) (IPPORT_RESERVED <= (p) && (p) != NFS_PORT)
|
|
@@ -88,6 +87,59 @@ extern int hosts_ctl(char *daemon, char
|
|
|
|
#define log_client(addr, proc, prog) \
|
|
logit(allow_severity, addr, proc, prog, "")
|
|
+
|
|
+#ifdef HOSTS_ACCESS
|
|
+static int
|
|
+good_client(addr)
|
|
+struct sockaddr_in *addr;
|
|
+{
|
|
+ struct hostent *hp;
|
|
+ char **sp;
|
|
+ char *tmpname;
|
|
+
|
|
+ /* Check the IP address first. */
|
|
+ if (hosts_ctl("portmap", "", inet_ntoa(addr->sin_addr), ""))
|
|
+ return 1;
|
|
+
|
|
+ /* Check the hostname. */
|
|
+ hp = gethostbyaddr ((const char *) &(addr->sin_addr),
|
|
+ sizeof (addr->sin_addr), AF_INET);
|
|
+
|
|
+ if (!hp)
|
|
+ return 0;
|
|
+
|
|
+ /* must make sure the hostent is authorative. */
|
|
+ tmpname = alloca (strlen (hp->h_name) + 1);
|
|
+ strcpy (tmpname, hp->h_name);
|
|
+ hp = gethostbyname(tmpname);
|
|
+ if (hp) {
|
|
+ /* now make sure the "addr->sin_addr" is on the list */
|
|
+ for (sp = hp->h_addr_list ; *sp ; sp++) {
|
|
+ if (memcmp(*sp, &(addr->sin_addr), hp->h_length)==0)
|
|
+ break;
|
|
+ }
|
|
+ if (!*sp)
|
|
+ /* it was a FAKE. */
|
|
+ return 0;
|
|
+ }
|
|
+ else
|
|
+ /* never heard of it. misconfigured DNS? */
|
|
+ return 0;
|
|
+
|
|
+ /* Check the official name first. */
|
|
+ if (hosts_ctl("portmap", "", hp->h_name, ""))
|
|
+ return 1;
|
|
+
|
|
+ /* Check aliases. */
|
|
+ for (sp = hp->h_aliases; *sp ; sp++) {
|
|
+ if (hosts_ctl("portmap", "", *sp, ""))
|
|
+ return 1;
|
|
+ }
|
|
+
|
|
+ /* No match */
|
|
+ return 0;
|
|
+}
|
|
+#endif
|
|
|
|
/* check_startup - additional startup code */
|
|
|