1 1.9 matt /* $NetBSD: update.c,v 1.9 2012/03/21 10:10:37 matt Exp $ */ 2 1.3 christos 3 1.1 mrg /* 4 1.1 mrg * Routines for controlled update/initialization of request structures. 5 1.5 simonb * 6 1.1 mrg * request_init() initializes its argument. Pointers and string-valued members 7 1.1 mrg * are initialized to zero, to indicate that no lookup has been attempted. 8 1.5 simonb * 9 1.1 mrg * request_set() adds information to an already initialized request structure. 10 1.5 simonb * 11 1.1 mrg * Both functions take a variable-length name-value list. 12 1.5 simonb * 13 1.1 mrg * Diagnostics are reported through syslog(3). 14 1.5 simonb * 15 1.1 mrg * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands. 16 1.1 mrg */ 17 1.1 mrg 18 1.3 christos #include <sys/cdefs.h> 19 1.1 mrg #ifndef lint 20 1.3 christos #if 0 21 1.1 mrg static char sccsid[] = "@(#) update.c 1.1 94/12/28 17:42:56"; 22 1.3 christos #else 23 1.9 matt __RCSID("$NetBSD: update.c,v 1.9 2012/03/21 10:10:37 matt Exp $"); 24 1.3 christos #endif 25 1.1 mrg #endif 26 1.1 mrg 27 1.1 mrg /* System libraries */ 28 1.1 mrg 29 1.1 mrg #include <stdio.h> 30 1.1 mrg #include <syslog.h> 31 1.1 mrg #include <string.h> 32 1.3 christos #include <unistd.h> 33 1.1 mrg 34 1.1 mrg /* Local stuff. */ 35 1.1 mrg 36 1.1 mrg #include "mystdarg.h" 37 1.1 mrg #include "tcpd.h" 38 1.3 christos 39 1.9 matt static struct request_info *request_fill(struct request_info *, va_list); 40 1.1 mrg 41 1.1 mrg /* request_fill - request update engine */ 42 1.1 mrg 43 1.9 matt static struct request_info * 44 1.9 matt request_fill(struct request_info *request, va_list ap) 45 1.1 mrg { 46 1.1 mrg int key; 47 1.1 mrg char *ptr; 48 1.1 mrg 49 1.1 mrg while ((key = va_arg(ap, int)) > 0) { 50 1.1 mrg switch (key) { 51 1.1 mrg default: 52 1.1 mrg tcpd_warn("request_fill: invalid key: %d", key); 53 1.1 mrg return (request); 54 1.1 mrg case RQ_FILE: 55 1.1 mrg request->fd = va_arg(ap, int); 56 1.1 mrg continue; 57 1.1 mrg case RQ_CLIENT_SIN: 58 1.6 itojun request->client->sin = va_arg(ap, struct sockaddr *); 59 1.1 mrg continue; 60 1.1 mrg case RQ_SERVER_SIN: 61 1.6 itojun request->server->sin = va_arg(ap, struct sockaddr *); 62 1.1 mrg continue; 63 1.1 mrg 64 1.1 mrg /* 65 1.1 mrg * All other fields are strings with the same maximal length. 66 1.1 mrg */ 67 1.1 mrg 68 1.1 mrg case RQ_DAEMON: 69 1.1 mrg ptr = request->daemon; 70 1.1 mrg break; 71 1.1 mrg case RQ_USER: 72 1.1 mrg ptr = request->user; 73 1.1 mrg break; 74 1.1 mrg case RQ_CLIENT_NAME: 75 1.1 mrg ptr = request->client->name; 76 1.1 mrg break; 77 1.1 mrg case RQ_CLIENT_ADDR: 78 1.1 mrg ptr = request->client->addr; 79 1.1 mrg break; 80 1.1 mrg case RQ_SERVER_NAME: 81 1.1 mrg ptr = request->server->name; 82 1.1 mrg break; 83 1.1 mrg case RQ_SERVER_ADDR: 84 1.1 mrg ptr = request->server->addr; 85 1.1 mrg break; 86 1.1 mrg } 87 1.8 itojun strlcpy(ptr, va_arg(ap, char *), STRING_LENGTH); 88 1.1 mrg } 89 1.1 mrg return (request); 90 1.1 mrg } 91 1.1 mrg 92 1.1 mrg /* request_init - initialize request structure */ 93 1.1 mrg 94 1.1 mrg struct request_info *VARARGS(request_init, struct request_info *, request) 95 1.1 mrg { 96 1.1 mrg static struct request_info default_info; 97 1.1 mrg struct request_info *r; 98 1.1 mrg va_list ap; 99 1.1 mrg 100 1.1 mrg /* 101 1.1 mrg * Initialize data members. We do not assign default function pointer 102 1.1 mrg * members, to avoid pulling in the whole socket module when it is not 103 1.1 mrg * really needed. 104 1.1 mrg */ 105 1.1 mrg VASTART(ap, struct request_info *, request); 106 1.1 mrg *request = default_info; 107 1.1 mrg request->fd = -1; 108 1.7 itojun (void)strlcpy(request->daemon, unknown, sizeof(request->daemon)); 109 1.2 mrg (void)snprintf(request->pid, sizeof(request->pid), "%d", getpid()); 110 1.1 mrg request->client->request = request; 111 1.1 mrg request->server->request = request; 112 1.1 mrg r = request_fill(request, ap); 113 1.1 mrg VAEND(ap); 114 1.1 mrg return (r); 115 1.1 mrg } 116 1.1 mrg 117 1.1 mrg /* request_set - update request structure */ 118 1.1 mrg 119 1.1 mrg struct request_info *VARARGS(request_set, struct request_info *, request) 120 1.1 mrg { 121 1.1 mrg struct request_info *r; 122 1.1 mrg va_list ap; 123 1.1 mrg 124 1.1 mrg VASTART(ap, struct request_info *, request); 125 1.1 mrg r = request_fill(request, ap); 126 1.1 mrg VAEND(ap); 127 1.1 mrg return (r); 128 1.1 mrg } 129