144743Smarkm /* 244743Smarkm * Routines for controlled update/initialization of request structures. 344743Smarkm * 444743Smarkm * request_init() initializes its argument. Pointers and string-valued members 544743Smarkm * are initialized to zero, to indicate that no lookup has been attempted. 644743Smarkm * 744743Smarkm * request_set() adds information to an already initialized request structure. 844743Smarkm * 944743Smarkm * Both functions take a variable-length name-value list. 1044743Smarkm * 1144743Smarkm * Diagnostics are reported through syslog(3). 1244743Smarkm * 1344743Smarkm * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands. 1456977Sshin * 1556977Sshin * $FreeBSD$ 1644743Smarkm */ 1744743Smarkm 1844743Smarkm#ifndef lint 1944743Smarkmstatic char sccsid[] = "@(#) update.c 1.1 94/12/28 17:42:56"; 2044743Smarkm#endif 2144743Smarkm 2244743Smarkm/* System libraries */ 2344743Smarkm 2444743Smarkm#include <stdio.h> 2544743Smarkm#include <syslog.h> 2644743Smarkm#include <string.h> 27257398Ssbruno#include <unistd.h> 2844743Smarkm 2944743Smarkm/* Local stuff. */ 3044743Smarkm 3144743Smarkm#include "mystdarg.h" 3244743Smarkm#include "tcpd.h" 3344743Smarkm 3444743Smarkm/* request_fill - request update engine */ 3544743Smarkm 3644743Smarkmstatic struct request_info *request_fill(request, ap) 3744743Smarkmstruct request_info *request; 3844743Smarkmva_list ap; 3944743Smarkm{ 4044743Smarkm int key; 4144743Smarkm char *ptr; 4244743Smarkm 4344743Smarkm while ((key = va_arg(ap, int)) > 0) { 4444743Smarkm switch (key) { 4544743Smarkm default: 4644743Smarkm tcpd_warn("request_fill: invalid key: %d", key); 4744743Smarkm return (request); 4844743Smarkm case RQ_FILE: 4944743Smarkm request->fd = va_arg(ap, int); 5044743Smarkm continue; 5144743Smarkm case RQ_CLIENT_SIN: 5256977Sshin#ifdef INET6 5356977Sshin request->client->sin = va_arg(ap, struct sockaddr *); 5456977Sshin#else 5544743Smarkm request->client->sin = va_arg(ap, struct sockaddr_in *); 5656977Sshin#endif 5744743Smarkm continue; 5844743Smarkm case RQ_SERVER_SIN: 5956977Sshin#ifdef INET6 6056977Sshin request->server->sin = va_arg(ap, struct sockaddr *); 6156977Sshin#else 6244743Smarkm request->server->sin = va_arg(ap, struct sockaddr_in *); 6356977Sshin#endif 6444743Smarkm continue; 6544743Smarkm 6644743Smarkm /* 6744743Smarkm * All other fields are strings with the same maximal length. 6844743Smarkm */ 6944743Smarkm 7044743Smarkm case RQ_DAEMON: 7144743Smarkm ptr = request->daemon; 7244743Smarkm break; 7344743Smarkm case RQ_USER: 7444743Smarkm ptr = request->user; 7544743Smarkm break; 7644743Smarkm case RQ_CLIENT_NAME: 7744743Smarkm ptr = request->client->name; 7844743Smarkm break; 7944743Smarkm case RQ_CLIENT_ADDR: 8044743Smarkm ptr = request->client->addr; 8144743Smarkm break; 8244743Smarkm case RQ_SERVER_NAME: 8344743Smarkm ptr = request->server->name; 8444743Smarkm break; 8544743Smarkm case RQ_SERVER_ADDR: 8644743Smarkm ptr = request->server->addr; 8744743Smarkm break; 8844743Smarkm } 8944743Smarkm STRN_CPY(ptr, va_arg(ap, char *), STRING_LENGTH); 9044743Smarkm } 9144743Smarkm return (request); 9244743Smarkm} 9344743Smarkm 9444743Smarkm/* request_init - initialize request structure */ 9544743Smarkm 9644743Smarkmstruct request_info *VARARGS(request_init, struct request_info *, request) 9744743Smarkm{ 9844743Smarkm static struct request_info default_info; 9944743Smarkm struct request_info *r; 10044743Smarkm va_list ap; 10144743Smarkm 10244743Smarkm /* 10344743Smarkm * Initialize data members. We do not assign default function pointer 10444743Smarkm * members, to avoid pulling in the whole socket module when it is not 10544743Smarkm * really needed. 10644743Smarkm */ 10744743Smarkm VASTART(ap, struct request_info *, request); 10844743Smarkm *request = default_info; 10944743Smarkm request->fd = -1; 11044743Smarkm strcpy(request->daemon, unknown); 11144743Smarkm sprintf(request->pid, "%d", getpid()); 11244743Smarkm request->client->request = request; 11344743Smarkm request->server->request = request; 11444743Smarkm r = request_fill(request, ap); 11544743Smarkm VAEND(ap); 11644743Smarkm return (r); 11744743Smarkm} 11844743Smarkm 11944743Smarkm/* request_set - update request structure */ 12044743Smarkm 12144743Smarkmstruct request_info *VARARGS(request_set, struct request_info *, request) 12244743Smarkm{ 12344743Smarkm struct request_info *r; 12444743Smarkm va_list ap; 12544743Smarkm 12644743Smarkm VASTART(ap, struct request_info *, request); 12744743Smarkm r = request_fill(request, ap); 12844743Smarkm VAEND(ap); 12944743Smarkm return (r); 13044743Smarkm} 131