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