update.c revision 1.9 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