Home | History | Annotate | Line # | Download | only in libwrap
eval.c revision 1.2
      1  1.1  mrg  /*
      2  1.1  mrg   * Routines for controlled evaluation of host names, user names, and so on.
      3  1.1  mrg   * They are, in fact, wrappers around the functions that are specific for
      4  1.1  mrg   * the sockets or TLI programming interfaces. The request_info and host_info
      5  1.1  mrg   * structures are used for result cacheing.
      6  1.1  mrg   *
      7  1.1  mrg   * These routines allows us to postpone expensive operations until their
      8  1.1  mrg   * results are really needed. Examples are hostname lookups and double
      9  1.1  mrg   * checks, or username lookups. Information that cannot be retrieved is
     10  1.1  mrg   * given the value "unknown" ("paranoid" in case of hostname problems).
     11  1.1  mrg   *
     12  1.1  mrg   * When ALWAYS_HOSTNAME is off, hostname lookup is done only when required by
     13  1.1  mrg   * tcpd paranoid mode, by access control patterns, or by %letter expansions.
     14  1.1  mrg   *
     15  1.1  mrg   * When ALWAYS_RFC931 mode is off, user lookup is done only when required by
     16  1.1  mrg   * access control patterns or %letter expansions.
     17  1.1  mrg   *
     18  1.1  mrg   * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
     19  1.1  mrg   */
     20  1.1  mrg 
     21  1.1  mrg #ifndef lint
     22  1.1  mrg static char sccsid[] = "@(#) eval.c 1.3 95/01/30 19:51:45";
     23  1.1  mrg #endif
     24  1.1  mrg 
     25  1.1  mrg /* System libraries. */
     26  1.1  mrg 
     27  1.1  mrg #include <stdio.h>
     28  1.1  mrg #include <string.h>
     29  1.1  mrg 
     30  1.1  mrg /* Local stuff. */
     31  1.1  mrg 
     32  1.1  mrg #include "tcpd.h"
     33  1.1  mrg 
     34  1.1  mrg  /*
     35  1.1  mrg   * When a string has the value STRING_UNKNOWN, it means: don't bother, I
     36  1.1  mrg   * tried to look up the data but it was unavailable for some reason. When a
     37  1.1  mrg   * host name has the value STRING_PARANOID it means there was a name/address
     38  1.1  mrg   * conflict.
     39  1.1  mrg   */
     40  1.1  mrg char    unknown[] = STRING_UNKNOWN;
     41  1.1  mrg char    paranoid[] = STRING_PARANOID;
     42  1.1  mrg 
     43  1.1  mrg /* eval_user - look up user name */
     44  1.1  mrg 
     45  1.1  mrg char   *eval_user(request)
     46  1.1  mrg struct request_info *request;
     47  1.1  mrg {
     48  1.1  mrg     if (request->user[0] == 0) {
     49  1.2  mrg 	(void)strncpy(request->user, unknown, sizeof(request->user) - 1);
     50  1.1  mrg 	if (request->sink == 0 && request->client->sin && request->server->sin)
     51  1.1  mrg 	    rfc931(request->client->sin, request->server->sin, request->user);
     52  1.1  mrg     }
     53  1.1  mrg     return (request->user);
     54  1.1  mrg }
     55  1.1  mrg 
     56  1.1  mrg /* eval_hostaddr - look up printable address */
     57  1.1  mrg 
     58  1.1  mrg char   *eval_hostaddr(host)
     59  1.1  mrg struct host_info *host;
     60  1.1  mrg {
     61  1.1  mrg     if (host->addr[0] == 0) {
     62  1.2  mrg 	(void)strncpy(host->addr, unknown, sizeof(host->addr) - 1);
     63  1.1  mrg 	if (host->request->hostaddr != 0)
     64  1.1  mrg 	    host->request->hostaddr(host);
     65  1.1  mrg     }
     66  1.1  mrg     return (host->addr);
     67  1.1  mrg }
     68  1.1  mrg 
     69  1.1  mrg /* eval_hostname - look up host name */
     70  1.1  mrg 
     71  1.1  mrg char   *eval_hostname(host)
     72  1.1  mrg struct host_info *host;
     73  1.1  mrg {
     74  1.1  mrg     if (host->name[0] == 0) {
     75  1.2  mrg 	(void)strncpy(host->name, unknown, sizeof(host->name) - 1);
     76  1.1  mrg 	if (host->request->hostname != 0)
     77  1.1  mrg 	    host->request->hostname(host);
     78  1.1  mrg     }
     79  1.1  mrg     return (host->name);
     80  1.1  mrg }
     81  1.1  mrg 
     82  1.1  mrg /* eval_hostinfo - return string with host name (preferred) or address */
     83  1.1  mrg 
     84  1.1  mrg char   *eval_hostinfo(host)
     85  1.1  mrg struct host_info *host;
     86  1.1  mrg {
     87  1.1  mrg     char   *hostname;
     88  1.1  mrg 
     89  1.1  mrg #ifndef ALWAYS_HOSTNAME				/* no implicit host lookups */
     90  1.1  mrg     if (host->name[0] == 0)
     91  1.1  mrg 	return (eval_hostaddr(host));
     92  1.1  mrg #endif
     93  1.1  mrg     hostname = eval_hostname(host);
     94  1.1  mrg     if (HOSTNAME_KNOWN(hostname)) {
     95  1.1  mrg 	return (host->name);
     96  1.1  mrg     } else {
     97  1.1  mrg 	return (eval_hostaddr(host));
     98  1.1  mrg     }
     99  1.1  mrg }
    100  1.1  mrg 
    101  1.1  mrg /* eval_client - return string with as much about the client as we know */
    102  1.1  mrg 
    103  1.1  mrg char   *eval_client(request)
    104  1.1  mrg struct request_info *request;
    105  1.1  mrg {
    106  1.1  mrg     static char both[2 * STRING_LENGTH];
    107  1.1  mrg     char   *hostinfo = eval_hostinfo(request->client);
    108  1.1  mrg 
    109  1.1  mrg #ifndef ALWAYS_RFC931				/* no implicit user lookups */
    110  1.1  mrg     if (request->user[0] == 0)
    111  1.1  mrg 	return (hostinfo);
    112  1.1  mrg #endif
    113  1.1  mrg     if (STR_NE(eval_user(request), unknown)) {
    114  1.2  mrg 	(void)snprintf(both, sizeof both, "%s@%s", request->user, hostinfo);
    115  1.1  mrg 	return (both);
    116  1.1  mrg     } else {
    117  1.1  mrg 	return (hostinfo);
    118  1.1  mrg     }
    119  1.1  mrg }
    120  1.1  mrg 
    121  1.1  mrg /* eval_server - return string with as much about the server as we know */
    122  1.1  mrg 
    123  1.1  mrg char   *eval_server(request)
    124  1.1  mrg struct request_info *request;
    125  1.1  mrg {
    126  1.1  mrg     static char both[2 * STRING_LENGTH];
    127  1.1  mrg     char   *host = eval_hostinfo(request->server);
    128  1.1  mrg     char   *daemon = eval_daemon(request);
    129  1.1  mrg 
    130  1.1  mrg     if (STR_NE(host, unknown)) {
    131  1.2  mrg 	(void)snprintf(both, sizeof both, "%s@%s", daemon, host);
    132  1.1  mrg 	return (both);
    133  1.1  mrg     } else {
    134  1.1  mrg 	return (daemon);
    135  1.1  mrg     }
    136  1.1  mrg }
    137