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