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