xref: /netbsd-src/lib/libwrap/update.c (revision e1a2f47f1264dd9755e9e747d45ba016dff2334f)
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