Home | History | Annotate | Line # | Download | only in tcpdchk
      1 /*	$NetBSD: scaffold.c,v 1.12 2018/01/23 21:06:26 sevan Exp $	*/
      2 
      3  /*
      4   * Routines for testing only. Not really industrial strength.
      5   *
      6   * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
      7   */
      8 
      9 #include <sys/cdefs.h>
     10 #ifndef lint
     11 #if 0
     12 static char sccs_id[] = "@(#) scaffold.c 1.6 97/03/21 19:27:24";
     13 #else
     14 __RCSID("$NetBSD: scaffold.c,v 1.12 2018/01/23 21:06:26 sevan Exp $");
     15 #endif
     16 #endif
     17 
     18 /* System libraries. */
     19 
     20 #include <sys/types.h>
     21 #include <sys/stat.h>
     22 #include <sys/socket.h>
     23 #include <netinet/in.h>
     24 #include <arpa/inet.h>
     25 #include <netdb.h>
     26 #include <stdio.h>
     27 #include <syslog.h>
     28 #include <setjmp.h>
     29 #include <string.h>
     30 #include <stdlib.h>
     31 
     32 #ifndef INADDR_NONE
     33 #define	INADDR_NONE	(-1)		/* XXX should be 0xffffffff */
     34 #endif
     35 
     36 /* Application-specific. */
     37 
     38 #include "tcpd.h"
     39 #include "scaffold.h"
     40 
     41  /*
     42   * These are referenced by the options module and by rfc931.c.
     43   */
     44 int     allow_severity = SEVERITY;
     45 int     deny_severity = LOG_WARNING;
     46 extern int rfc931_timeout; /* = RFC931_TIMEOUT; */
     47 
     48 /* find_inet_addr - find all addresses for this host, result to free() */
     49 
     50 struct addrinfo *find_inet_addr(char *host, int flags)
     51 {
     52     struct addrinfo hints, *res;
     53     int error;
     54 
     55     memset(&hints, 0, sizeof(hints));
     56     hints.ai_socktype = SOCK_DGRAM;
     57     hints.ai_flags = AI_CANONNAME | flags;
     58     error = getaddrinfo(host, "0", &hints, &res);
     59     if (error) {
     60 	tcpd_warn("%s: %s", host, gai_strerror(error));
     61 	return (0);
     62     }
     63 
     64     if (res->ai_canonname && STR_NE(host, res->ai_canonname)) {
     65 	tcpd_warn("%s: hostname alias", host);
     66 	tcpd_warn("(official name: %.*s)", STRING_LENGTH, res->ai_canonname);
     67     }
     68     return (res);
     69 }
     70 
     71 /* check_dns - give each address thorough workout, return address count */
     72 
     73 int check_dns(char *host)
     74 {
     75     struct request_info request;
     76     struct sockaddr_storage ss;
     77     struct addrinfo *res0, *res;
     78     int     count;
     79 
     80     if ((res0 = find_inet_addr(host, 0)) == NULL)
     81 	return (0);
     82     memset(&ss, 0, sizeof(ss));
     83     request_init(&request, RQ_CLIENT_SIN, &ss, 0);
     84     sock_methods(&request);
     85 
     86     count = 0;
     87     for (res = res0; res; res = res->ai_next) {
     88 	count++;
     89 	if (res->ai_addrlen > sizeof(ss))
     90 	    continue;
     91 	memcpy(&ss, res->ai_addr, res->ai_addrlen);
     92 
     93 	/*
     94 	 * Force host name and address conversions. Use the request structure
     95 	 * as a cache. Detect hostname lookup problems. Any name/name or
     96 	 * name/address conflicts will be reported while eval_hostname() does
     97 	 * its job.
     98 	 */
     99 	request_set(&request, RQ_CLIENT_ADDR, "", RQ_CLIENT_NAME, "", 0);
    100 	if (STR_EQ(eval_hostname(request.client), unknown))
    101 	    tcpd_warn("host address %s->name lookup failed",
    102 		      eval_hostaddr(request.client));
    103     }
    104     freeaddrinfo(res0);
    105     return (count);
    106 }
    107 
    108 /* dummy function to intercept the real shell_cmd() */
    109 
    110 /* ARGSUSED */
    111 
    112 void shell_cmd(char *command)
    113 {
    114     if (hosts_access_verbose)
    115 	printf("command: %s", command);
    116 }
    117 
    118 /* dummy function  to intercept the real clean_exit() */
    119 
    120 /* ARGSUSED */
    121 
    122 void clean_exit(struct request_info *request)
    123 {
    124     exit(0);
    125 }
    126 
    127 #if 0
    128 /* dummy function  to intercept the real rfc931() */
    129 
    130 /* ARGSUSED */
    131 
    132 void
    133 rfc931(struct request_info *request)
    134 {
    135     strlcpy(request->user, unknown, sizeof(request->user));
    136 }
    137 #endif
    138 
    139 /* check_path - examine accessibility */
    140 
    141 int
    142 check_path(const char *path, struct stat *st)
    143 {
    144     struct stat stbuf;
    145     char    buf[BUFSIZ];
    146 
    147     if (stat(path, st) < 0)
    148 	return (-1);
    149 #ifdef notdef
    150     if (st->st_uid != 0)
    151 	tcpd_warn("%s: not owned by root", path);
    152     if (st->st_mode & 020)
    153 	tcpd_warn("%s: group writable", path);
    154 #endif
    155     if (st->st_mode & 002)
    156 	tcpd_warn("%s: world writable", path);
    157     if (path[0] == '/' && path[1] != 0) {
    158 	strlcpy(buf, path, sizeof(buf));
    159 	strrchr(buf, '/')[0] = 0;
    160 	(void) check_path(buf[0] ? buf : "/", &stbuf);
    161     }
    162     return (0);
    163 }
    164