xref: /freebsd/contrib/tcp_wrappers/update.c (revision 14f102ea)
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.
148053080cSYoshinobu Inoue   *
158053080cSYoshinobu Inoue   * $FreeBSD$
162aef6930SMark Murray   */
172aef6930SMark Murray 
182aef6930SMark Murray #ifndef lint
192aef6930SMark Murray static char sccsid[] = "@(#) update.c 1.1 94/12/28 17:42:56";
202aef6930SMark Murray #endif
212aef6930SMark Murray 
222aef6930SMark Murray /* System libraries */
232aef6930SMark Murray 
242aef6930SMark Murray #include <stdio.h>
252aef6930SMark Murray #include <syslog.h>
262aef6930SMark Murray #include <string.h>
2746bcf11dSSean Bruno #include <unistd.h>
282aef6930SMark Murray 
292aef6930SMark Murray /* Local stuff. */
302aef6930SMark Murray 
312aef6930SMark Murray #include "mystdarg.h"
322aef6930SMark Murray #include "tcpd.h"
332aef6930SMark Murray 
342aef6930SMark Murray /* request_fill - request update engine */
352aef6930SMark Murray 
request_fill(struct request_info * request,va_list ap)3614f102eaSEd Maste static struct request_info *request_fill(struct request_info *request,
3714f102eaSEd Maste     va_list ap)
382aef6930SMark Murray {
392aef6930SMark Murray     int     key;
402aef6930SMark Murray     char   *ptr;
412aef6930SMark Murray 
422aef6930SMark Murray     while ((key = va_arg(ap, int)) > 0) {
432aef6930SMark Murray 	switch (key) {
442aef6930SMark Murray 	default:
452aef6930SMark Murray 	    tcpd_warn("request_fill: invalid key: %d", key);
462aef6930SMark Murray 	    return (request);
472aef6930SMark Murray 	case RQ_FILE:
482aef6930SMark Murray 	    request->fd = va_arg(ap, int);
492aef6930SMark Murray 	    continue;
502aef6930SMark Murray 	case RQ_CLIENT_SIN:
518053080cSYoshinobu Inoue #ifdef INET6
528053080cSYoshinobu Inoue 	    request->client->sin = va_arg(ap, struct sockaddr *);
538053080cSYoshinobu Inoue #else
542aef6930SMark Murray 	    request->client->sin = va_arg(ap, struct sockaddr_in *);
558053080cSYoshinobu Inoue #endif
562aef6930SMark Murray 	    continue;
572aef6930SMark Murray 	case RQ_SERVER_SIN:
588053080cSYoshinobu Inoue #ifdef INET6
598053080cSYoshinobu Inoue 	    request->server->sin = va_arg(ap, struct sockaddr *);
608053080cSYoshinobu Inoue #else
612aef6930SMark Murray 	    request->server->sin = va_arg(ap, struct sockaddr_in *);
628053080cSYoshinobu Inoue #endif
632aef6930SMark Murray 	    continue;
642aef6930SMark Murray 
652aef6930SMark Murray 	    /*
662aef6930SMark Murray 	     * All other fields are strings with the same maximal length.
672aef6930SMark Murray 	     */
682aef6930SMark Murray 
692aef6930SMark Murray 	case RQ_DAEMON:
702aef6930SMark Murray 	    ptr = request->daemon;
712aef6930SMark Murray 	    break;
722aef6930SMark Murray 	case RQ_USER:
732aef6930SMark Murray 	    ptr = request->user;
742aef6930SMark Murray 	    break;
752aef6930SMark Murray 	case RQ_CLIENT_NAME:
762aef6930SMark Murray 	    ptr = request->client->name;
772aef6930SMark Murray 	    break;
782aef6930SMark Murray 	case RQ_CLIENT_ADDR:
792aef6930SMark Murray 	    ptr = request->client->addr;
802aef6930SMark Murray 	    break;
812aef6930SMark Murray 	case RQ_SERVER_NAME:
822aef6930SMark Murray 	    ptr = request->server->name;
832aef6930SMark Murray 	    break;
842aef6930SMark Murray 	case RQ_SERVER_ADDR:
852aef6930SMark Murray 	    ptr = request->server->addr;
862aef6930SMark Murray 	    break;
872aef6930SMark Murray 	}
882aef6930SMark Murray 	STRN_CPY(ptr, va_arg(ap, char *), STRING_LENGTH);
892aef6930SMark Murray     }
902aef6930SMark Murray     return (request);
912aef6930SMark Murray }
922aef6930SMark Murray 
932aef6930SMark Murray /* request_init - initialize request structure */
942aef6930SMark Murray 
VARARGS(request_init,struct request_info *,request)952aef6930SMark Murray struct request_info *VARARGS(request_init, struct request_info *, request)
962aef6930SMark Murray {
972aef6930SMark Murray     static struct request_info default_info;
982aef6930SMark Murray     struct request_info *r;
992aef6930SMark Murray     va_list ap;
1002aef6930SMark Murray 
1012aef6930SMark Murray     /*
1022aef6930SMark Murray      * Initialize data members. We do not assign default function pointer
1032aef6930SMark Murray      * members, to avoid pulling in the whole socket module when it is not
1042aef6930SMark Murray      * really needed.
1052aef6930SMark Murray      */
1062aef6930SMark Murray     VASTART(ap, struct request_info *, request);
1072aef6930SMark Murray     *request = default_info;
1082aef6930SMark Murray     request->fd = -1;
1092aef6930SMark Murray     strcpy(request->daemon, unknown);
1102aef6930SMark Murray     sprintf(request->pid, "%d", getpid());
1112aef6930SMark Murray     request->client->request = request;
1122aef6930SMark Murray     request->server->request = request;
1132aef6930SMark Murray     r = request_fill(request, ap);
1142aef6930SMark Murray     VAEND(ap);
1152aef6930SMark Murray     return (r);
1162aef6930SMark Murray }
1172aef6930SMark Murray 
1182aef6930SMark Murray /* request_set - update request structure */
1192aef6930SMark Murray 
VARARGS(request_set,struct request_info *,request)1202aef6930SMark Murray struct request_info *VARARGS(request_set, struct request_info *, request)
1212aef6930SMark Murray {
1222aef6930SMark Murray     struct request_info *r;
1232aef6930SMark Murray     va_list ap;
1242aef6930SMark Murray 
1252aef6930SMark Murray     VASTART(ap, struct request_info *, request);
1262aef6930SMark Murray     r = request_fill(request, ap);
1272aef6930SMark Murray     VAEND(ap);
1282aef6930SMark Murray     return (r);
1292aef6930SMark Murray }
130