xref: /freebsd/contrib/tcp_wrappers/update.c (revision 2aef693010b252e8cff0ce46a6ebf15b74c82219)
12aef6930SMark Murray  /*
22aef6930SMark Murray   * Routines for controlled update/initialization of request structures.
32aef6930SMark Murray   *
42aef6930SMark Murray   * request_init() initializes its argument. Pointers and string-valued members
52aef6930SMark Murray   * are initialized to zero, to indicate that no lookup has been attempted.
62aef6930SMark Murray   *
72aef6930SMark Murray   * request_set() adds information to an already initialized request structure.
82aef6930SMark Murray   *
92aef6930SMark Murray   * Both functions take a variable-length name-value list.
102aef6930SMark Murray   *
112aef6930SMark Murray   * Diagnostics are reported through syslog(3).
122aef6930SMark Murray   *
132aef6930SMark Murray   * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
142aef6930SMark Murray   */
152aef6930SMark Murray 
162aef6930SMark Murray #ifndef lint
172aef6930SMark Murray static char sccsid[] = "@(#) update.c 1.1 94/12/28 17:42:56";
182aef6930SMark Murray #endif
192aef6930SMark Murray 
202aef6930SMark Murray /* System libraries */
212aef6930SMark Murray 
222aef6930SMark Murray #include <stdio.h>
232aef6930SMark Murray #include <syslog.h>
242aef6930SMark Murray #include <string.h>
252aef6930SMark Murray 
262aef6930SMark Murray /* Local stuff. */
272aef6930SMark Murray 
282aef6930SMark Murray #include "mystdarg.h"
292aef6930SMark Murray #include "tcpd.h"
302aef6930SMark Murray 
312aef6930SMark Murray /* request_fill - request update engine */
322aef6930SMark Murray 
332aef6930SMark Murray static struct request_info *request_fill(request, ap)
342aef6930SMark Murray struct request_info *request;
352aef6930SMark Murray va_list ap;
362aef6930SMark Murray {
372aef6930SMark Murray     int     key;
382aef6930SMark Murray     char   *ptr;
392aef6930SMark Murray 
402aef6930SMark Murray     while ((key = va_arg(ap, int)) > 0) {
412aef6930SMark Murray 	switch (key) {
422aef6930SMark Murray 	default:
432aef6930SMark Murray 	    tcpd_warn("request_fill: invalid key: %d", key);
442aef6930SMark Murray 	    return (request);
452aef6930SMark Murray 	case RQ_FILE:
462aef6930SMark Murray 	    request->fd = va_arg(ap, int);
472aef6930SMark Murray 	    continue;
482aef6930SMark Murray 	case RQ_CLIENT_SIN:
492aef6930SMark Murray 	    request->client->sin = va_arg(ap, struct sockaddr_in *);
502aef6930SMark Murray 	    continue;
512aef6930SMark Murray 	case RQ_SERVER_SIN:
522aef6930SMark Murray 	    request->server->sin = va_arg(ap, struct sockaddr_in *);
532aef6930SMark Murray 	    continue;
542aef6930SMark Murray 
552aef6930SMark Murray 	    /*
562aef6930SMark Murray 	     * All other fields are strings with the same maximal length.
572aef6930SMark Murray 	     */
582aef6930SMark Murray 
592aef6930SMark Murray 	case RQ_DAEMON:
602aef6930SMark Murray 	    ptr = request->daemon;
612aef6930SMark Murray 	    break;
622aef6930SMark Murray 	case RQ_USER:
632aef6930SMark Murray 	    ptr = request->user;
642aef6930SMark Murray 	    break;
652aef6930SMark Murray 	case RQ_CLIENT_NAME:
662aef6930SMark Murray 	    ptr = request->client->name;
672aef6930SMark Murray 	    break;
682aef6930SMark Murray 	case RQ_CLIENT_ADDR:
692aef6930SMark Murray 	    ptr = request->client->addr;
702aef6930SMark Murray 	    break;
712aef6930SMark Murray 	case RQ_SERVER_NAME:
722aef6930SMark Murray 	    ptr = request->server->name;
732aef6930SMark Murray 	    break;
742aef6930SMark Murray 	case RQ_SERVER_ADDR:
752aef6930SMark Murray 	    ptr = request->server->addr;
762aef6930SMark Murray 	    break;
772aef6930SMark Murray 	}
782aef6930SMark Murray 	STRN_CPY(ptr, va_arg(ap, char *), STRING_LENGTH);
792aef6930SMark Murray     }
802aef6930SMark Murray     return (request);
812aef6930SMark Murray }
822aef6930SMark Murray 
832aef6930SMark Murray /* request_init - initialize request structure */
842aef6930SMark Murray 
852aef6930SMark Murray struct request_info *VARARGS(request_init, struct request_info *, request)
862aef6930SMark Murray {
872aef6930SMark Murray     static struct request_info default_info;
882aef6930SMark Murray     struct request_info *r;
892aef6930SMark Murray     va_list ap;
902aef6930SMark Murray 
912aef6930SMark Murray     /*
922aef6930SMark Murray      * Initialize data members. We do not assign default function pointer
932aef6930SMark Murray      * members, to avoid pulling in the whole socket module when it is not
942aef6930SMark Murray      * really needed.
952aef6930SMark Murray      */
962aef6930SMark Murray     VASTART(ap, struct request_info *, request);
972aef6930SMark Murray     *request = default_info;
982aef6930SMark Murray     request->fd = -1;
992aef6930SMark Murray     strcpy(request->daemon, unknown);
1002aef6930SMark Murray     sprintf(request->pid, "%d", getpid());
1012aef6930SMark Murray     request->client->request = request;
1022aef6930SMark Murray     request->server->request = request;
1032aef6930SMark Murray     r = request_fill(request, ap);
1042aef6930SMark Murray     VAEND(ap);
1052aef6930SMark Murray     return (r);
1062aef6930SMark Murray }
1072aef6930SMark Murray 
1082aef6930SMark Murray /* request_set - update request structure */
1092aef6930SMark Murray 
1102aef6930SMark Murray struct request_info *VARARGS(request_set, struct request_info *, request)
1112aef6930SMark Murray {
1122aef6930SMark Murray     struct request_info *r;
1132aef6930SMark Murray     va_list ap;
1142aef6930SMark Murray 
1152aef6930SMark Murray     VASTART(ap, struct request_info *, request);
1162aef6930SMark Murray     r = request_fill(request, ap);
1172aef6930SMark Murray     VAEND(ap);
1182aef6930SMark Murray     return (r);
1192aef6930SMark Murray }
120