update.c revision 1.5 1 1.4 simonb /* $NetBSD: update.c,v 1.5 1999/07/03 12:30:42 simonb 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.4 simonb __RCSID("$NetBSD: update.c,v 1.5 1999/07/03 12:30:42 simonb 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.3 christos static struct request_info *request_fill __P((struct request_info *, va_list));
40 1.1 mrg
41 1.1 mrg /* request_fill - request update engine */
42 1.1 mrg
43 1.1 mrg static struct request_info *request_fill(request, ap)
44 1.1 mrg struct request_info *request;
45 1.1 mrg va_list ap;
46 1.1 mrg {
47 1.1 mrg int key;
48 1.1 mrg char *ptr;
49 1.1 mrg
50 1.1 mrg while ((key = va_arg(ap, int)) > 0) {
51 1.1 mrg switch (key) {
52 1.1 mrg default:
53 1.1 mrg tcpd_warn("request_fill: invalid key: %d", key);
54 1.1 mrg return (request);
55 1.1 mrg case RQ_FILE:
56 1.1 mrg request->fd = va_arg(ap, int);
57 1.1 mrg continue;
58 1.1 mrg case RQ_CLIENT_SIN:
59 1.1 mrg request->client->sin = va_arg(ap, struct sockaddr_in *);
60 1.1 mrg continue;
61 1.1 mrg case RQ_SERVER_SIN:
62 1.1 mrg request->server->sin = va_arg(ap, struct sockaddr_in *);
63 1.1 mrg continue;
64 1.1 mrg
65 1.1 mrg /*
66 1.1 mrg * All other fields are strings with the same maximal length.
67 1.1 mrg */
68 1.1 mrg
69 1.1 mrg case RQ_DAEMON:
70 1.1 mrg ptr = request->daemon;
71 1.1 mrg break;
72 1.1 mrg case RQ_USER:
73 1.1 mrg ptr = request->user;
74 1.1 mrg break;
75 1.1 mrg case RQ_CLIENT_NAME:
76 1.1 mrg ptr = request->client->name;
77 1.1 mrg break;
78 1.1 mrg case RQ_CLIENT_ADDR:
79 1.1 mrg ptr = request->client->addr;
80 1.1 mrg break;
81 1.1 mrg case RQ_SERVER_NAME:
82 1.1 mrg ptr = request->server->name;
83 1.1 mrg break;
84 1.1 mrg case RQ_SERVER_ADDR:
85 1.1 mrg ptr = request->server->addr;
86 1.1 mrg break;
87 1.1 mrg }
88 1.1 mrg STRN_CPY(ptr, va_arg(ap, char *), STRING_LENGTH);
89 1.1 mrg }
90 1.1 mrg return (request);
91 1.1 mrg }
92 1.1 mrg
93 1.1 mrg /* request_init - initialize request structure */
94 1.1 mrg
95 1.1 mrg struct request_info *VARARGS(request_init, struct request_info *, request)
96 1.1 mrg {
97 1.1 mrg static struct request_info default_info;
98 1.1 mrg struct request_info *r;
99 1.1 mrg va_list ap;
100 1.1 mrg
101 1.1 mrg /*
102 1.1 mrg * Initialize data members. We do not assign default function pointer
103 1.1 mrg * members, to avoid pulling in the whole socket module when it is not
104 1.1 mrg * really needed.
105 1.1 mrg */
106 1.1 mrg VASTART(ap, struct request_info *, request);
107 1.1 mrg *request = default_info;
108 1.1 mrg request->fd = -1;
109 1.2 mrg (void)strncpy(request->daemon, unknown, sizeof(request->daemon) - 1);
110 1.2 mrg (void)snprintf(request->pid, sizeof(request->pid), "%d", getpid());
111 1.1 mrg request->client->request = request;
112 1.1 mrg request->server->request = request;
113 1.1 mrg r = request_fill(request, ap);
114 1.1 mrg VAEND(ap);
115 1.1 mrg return (r);
116 1.1 mrg }
117 1.1 mrg
118 1.1 mrg /* request_set - update request structure */
119 1.1 mrg
120 1.1 mrg struct request_info *VARARGS(request_set, struct request_info *, request)
121 1.1 mrg {
122 1.1 mrg struct request_info *r;
123 1.1 mrg va_list ap;
124 1.1 mrg
125 1.1 mrg VASTART(ap, struct request_info *, request);
126 1.1 mrg r = request_fill(request, ap);
127 1.1 mrg VAEND(ap);
128 1.1 mrg return (r);
129 1.1 mrg }
130