1*e1a2f47fSmatt /* $NetBSD: update.c,v 1.9 2012/03/21 10:10:37 matt Exp $ */
2d6ddaab4Schristos
3541be36cSmrg /*
4541be36cSmrg * Routines for controlled update/initialization of request structures.
5541be36cSmrg *
6541be36cSmrg * request_init() initializes its argument. Pointers and string-valued members
7541be36cSmrg * are initialized to zero, to indicate that no lookup has been attempted.
8541be36cSmrg *
9541be36cSmrg * request_set() adds information to an already initialized request structure.
10541be36cSmrg *
11541be36cSmrg * Both functions take a variable-length name-value list.
12541be36cSmrg *
13541be36cSmrg * Diagnostics are reported through syslog(3).
14541be36cSmrg *
15541be36cSmrg * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
16541be36cSmrg */
17541be36cSmrg
18d6ddaab4Schristos #include <sys/cdefs.h>
19541be36cSmrg #ifndef lint
20d6ddaab4Schristos #if 0
21541be36cSmrg static char sccsid[] = "@(#) update.c 1.1 94/12/28 17:42:56";
22d6ddaab4Schristos #else
23*e1a2f47fSmatt __RCSID("$NetBSD: update.c,v 1.9 2012/03/21 10:10:37 matt Exp $");
24d6ddaab4Schristos #endif
25541be36cSmrg #endif
26541be36cSmrg
27541be36cSmrg /* System libraries */
28541be36cSmrg
29541be36cSmrg #include <stdio.h>
30541be36cSmrg #include <syslog.h>
31541be36cSmrg #include <string.h>
32d6ddaab4Schristos #include <unistd.h>
33541be36cSmrg
34541be36cSmrg /* Local stuff. */
35541be36cSmrg
36541be36cSmrg #include "mystdarg.h"
37541be36cSmrg #include "tcpd.h"
38541be36cSmrg
39*e1a2f47fSmatt static struct request_info *request_fill(struct request_info *, va_list);
40d6ddaab4Schristos
41541be36cSmrg /* request_fill - request update engine */
42541be36cSmrg
43*e1a2f47fSmatt static struct request_info *
request_fill(struct request_info * request,va_list ap)44*e1a2f47fSmatt request_fill(struct request_info *request, va_list ap)
45541be36cSmrg {
46541be36cSmrg int key;
47541be36cSmrg char *ptr;
48541be36cSmrg
49541be36cSmrg while ((key = va_arg(ap, int)) > 0) {
50541be36cSmrg switch (key) {
51541be36cSmrg default:
52541be36cSmrg tcpd_warn("request_fill: invalid key: %d", key);
53541be36cSmrg return (request);
54541be36cSmrg case RQ_FILE:
55541be36cSmrg request->fd = va_arg(ap, int);
56541be36cSmrg continue;
57541be36cSmrg case RQ_CLIENT_SIN:
581e8c736aSitojun request->client->sin = va_arg(ap, struct sockaddr *);
59541be36cSmrg continue;
60541be36cSmrg case RQ_SERVER_SIN:
611e8c736aSitojun request->server->sin = va_arg(ap, struct sockaddr *);
62541be36cSmrg continue;
63541be36cSmrg
64541be36cSmrg /*
65541be36cSmrg * All other fields are strings with the same maximal length.
66541be36cSmrg */
67541be36cSmrg
68541be36cSmrg case RQ_DAEMON:
69541be36cSmrg ptr = request->daemon;
70541be36cSmrg break;
71541be36cSmrg case RQ_USER:
72541be36cSmrg ptr = request->user;
73541be36cSmrg break;
74541be36cSmrg case RQ_CLIENT_NAME:
75541be36cSmrg ptr = request->client->name;
76541be36cSmrg break;
77541be36cSmrg case RQ_CLIENT_ADDR:
78541be36cSmrg ptr = request->client->addr;
79541be36cSmrg break;
80541be36cSmrg case RQ_SERVER_NAME:
81541be36cSmrg ptr = request->server->name;
82541be36cSmrg break;
83541be36cSmrg case RQ_SERVER_ADDR:
84541be36cSmrg ptr = request->server->addr;
85541be36cSmrg break;
86541be36cSmrg }
878288fc93Sitojun strlcpy(ptr, va_arg(ap, char *), STRING_LENGTH);
88541be36cSmrg }
89541be36cSmrg return (request);
90541be36cSmrg }
91541be36cSmrg
92541be36cSmrg /* request_init - initialize request structure */
93541be36cSmrg
VARARGS(request_init,struct request_info *,request)94541be36cSmrg struct request_info *VARARGS(request_init, struct request_info *, request)
95541be36cSmrg {
96541be36cSmrg static struct request_info default_info;
97541be36cSmrg struct request_info *r;
98541be36cSmrg va_list ap;
99541be36cSmrg
100541be36cSmrg /*
101541be36cSmrg * Initialize data members. We do not assign default function pointer
102541be36cSmrg * members, to avoid pulling in the whole socket module when it is not
103541be36cSmrg * really needed.
104541be36cSmrg */
105541be36cSmrg VASTART(ap, struct request_info *, request);
106541be36cSmrg *request = default_info;
107541be36cSmrg request->fd = -1;
1083ba1803eSitojun (void)strlcpy(request->daemon, unknown, sizeof(request->daemon));
1099cd5492cSmrg (void)snprintf(request->pid, sizeof(request->pid), "%d", getpid());
110541be36cSmrg request->client->request = request;
111541be36cSmrg request->server->request = request;
112541be36cSmrg r = request_fill(request, ap);
113541be36cSmrg VAEND(ap);
114541be36cSmrg return (r);
115541be36cSmrg }
116541be36cSmrg
117541be36cSmrg /* request_set - update request structure */
118541be36cSmrg
VARARGS(request_set,struct request_info *,request)119541be36cSmrg struct request_info *VARARGS(request_set, struct request_info *, request)
120541be36cSmrg {
121541be36cSmrg struct request_info *r;
122541be36cSmrg va_list ap;
123541be36cSmrg
124541be36cSmrg VASTART(ap, struct request_info *, request);
125541be36cSmrg r = request_fill(request, ap);
126541be36cSmrg VAEND(ap);
127541be36cSmrg return (r);
128541be36cSmrg }
129