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)36*14f102eaSEd Maste static struct request_info *request_fill(struct request_info *request,
37*14f102eaSEd 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