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