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> 272aef6930SMark Murray 282aef6930SMark Murray /* Local stuff. */ 292aef6930SMark Murray 302aef6930SMark Murray #include "mystdarg.h" 312aef6930SMark Murray #include "tcpd.h" 322aef6930SMark Murray 332aef6930SMark Murray /* request_fill - request update engine */ 342aef6930SMark Murray 352aef6930SMark Murray static struct request_info *request_fill(request, ap) 362aef6930SMark Murray struct request_info *request; 372aef6930SMark Murray 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 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 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