update.c revision 44743
1226048Sobrien /* 2159764Sobrien * Routines for controlled update/initialization of request structures. 3290152Sdelphij * 4159764Sobrien * request_init() initializes its argument. Pointers and string-valued members 5159764Sobrien * are initialized to zero, to indicate that no lookup has been attempted. 6159764Sobrien * 7159764Sobrien * request_set() adds information to an already initialized request structure. 8159764Sobrien * 9159764Sobrien * Both functions take a variable-length name-value list. 10159764Sobrien * 11159764Sobrien * Diagnostics are reported through syslog(3). 12159764Sobrien * 13159764Sobrien * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands. 14159764Sobrien */ 15159764Sobrien 16159764Sobrien#ifndef lint 17159764Sobrienstatic char sccsid[] = "@(#) update.c 1.1 94/12/28 17:42:56"; 18159764Sobrien#endif 19159764Sobrien 20159764Sobrien/* System libraries */ 21159764Sobrien 22159764Sobrien#include <stdio.h> 23159764Sobrien#include <syslog.h> 24159764Sobrien#include <string.h> 25159764Sobrien 26159764Sobrien/* Local stuff. */ 27159764Sobrien 28159764Sobrien#include "mystdarg.h" 29159764Sobrien#include "tcpd.h" 30159764Sobrien 31159764Sobrien/* request_fill - request update engine */ 32159764Sobrien 33159764Sobrienstatic struct request_info *request_fill(request, ap) 34159764Sobrienstruct request_info *request; 35159764Sobrienva_list ap; 36159764Sobrien{ 37159764Sobrien int key; 38159764Sobrien char *ptr; 39159764Sobrien 40159764Sobrien while ((key = va_arg(ap, int)) > 0) { 41159764Sobrien switch (key) { 42159764Sobrien default: 43159764Sobrien tcpd_warn("request_fill: invalid key: %d", key); 44159764Sobrien return (request); 45159764Sobrien case RQ_FILE: 46159764Sobrien request->fd = va_arg(ap, int); 47159764Sobrien continue; 48159764Sobrien case RQ_CLIENT_SIN: 49159764Sobrien request->client->sin = va_arg(ap, struct sockaddr_in *); 50159764Sobrien continue; 51159764Sobrien case RQ_SERVER_SIN: 52159764Sobrien request->server->sin = va_arg(ap, struct sockaddr_in *); 53159764Sobrien continue; 54159764Sobrien 55159764Sobrien /* 56159764Sobrien * All other fields are strings with the same maximal length. 57159764Sobrien */ 58159764Sobrien 59159764Sobrien case RQ_DAEMON: 60159764Sobrien ptr = request->daemon; 61159764Sobrien break; 62186690Sobrien case RQ_USER: 63186690Sobrien ptr = request->user; 64186690Sobrien break; 65186690Sobrien case RQ_CLIENT_NAME: 66186690Sobrien ptr = request->client->name; 67186690Sobrien break; 68267843Sdelphij case RQ_CLIENT_ADDR: 69186690Sobrien ptr = request->client->addr; 70186690Sobrien break; 71186690Sobrien case RQ_SERVER_NAME: 72186690Sobrien ptr = request->server->name; 73186690Sobrien break; 74226048Sobrien case RQ_SERVER_ADDR: 75226048Sobrien ptr = request->server->addr; 76226048Sobrien break; 77226048Sobrien } 78226048Sobrien STRN_CPY(ptr, va_arg(ap, char *), STRING_LENGTH); 79226048Sobrien } 80226048Sobrien return (request); 81226048Sobrien} 82226048Sobrien 83226048Sobrien/* request_init - initialize request structure */ 84226048Sobrien 85226048Sobrienstruct request_info *VARARGS(request_init, struct request_info *, request) 86226048Sobrien{ 87226048Sobrien static struct request_info default_info; 88226048Sobrien struct request_info *r; 89226048Sobrien va_list ap; 90226048Sobrien 91226048Sobrien /* 92226048Sobrien * Initialize data members. We do not assign default function pointer 93226048Sobrien * members, to avoid pulling in the whole socket module when it is not 94267843Sdelphij * really needed. 95267843Sdelphij */ 96267843Sdelphij VASTART(ap, struct request_info *, request); 97267843Sdelphij *request = default_info; 98226048Sobrien request->fd = -1; 99267843Sdelphij strcpy(request->daemon, unknown); 100226048Sobrien sprintf(request->pid, "%d", getpid()); 101226048Sobrien request->client->request = request; 102226048Sobrien request->server->request = request; 103226048Sobrien r = request_fill(request, ap); 104226048Sobrien VAEND(ap); 105226048Sobrien return (r); 106226048Sobrien} 107290152Sdelphij 108290152Sdelphij/* request_set - update request structure */ 109290152Sdelphij 110290152Sdelphijstruct request_info *VARARGS(request_set, struct request_info *, request) 111290152Sdelphij{ 112 struct request_info *r; 113 va_list ap; 114 115 VASTART(ap, struct request_info *, request); 116 r = request_fill(request, ap); 117 VAEND(ap); 118 return (r); 119} 120