update.c revision 44743
1226048Sobrien /*
2159764Sobrien  * Routines for controlled update/initialization of request structures.
3290152Sdelphij  *
4159764Sobrien  * request_init() initializes its argument. Pointers and string-valued members
5159764Sobrien  * are initialized to zero, to indicate that no lookup has been attempted.
6159764Sobrien  *
7159764Sobrien  * request_set() adds information to an already initialized request structure.
8159764Sobrien  *
9159764Sobrien  * Both functions take a variable-length name-value list.
10159764Sobrien  *
11159764Sobrien  * Diagnostics are reported through syslog(3).
12159764Sobrien  *
13159764Sobrien  * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
14159764Sobrien  */
15159764Sobrien
16159764Sobrien#ifndef lint
17159764Sobrienstatic char sccsid[] = "@(#) update.c 1.1 94/12/28 17:42:56";
18159764Sobrien#endif
19159764Sobrien
20159764Sobrien/* System libraries */
21159764Sobrien
22159764Sobrien#include <stdio.h>
23159764Sobrien#include <syslog.h>
24159764Sobrien#include <string.h>
25159764Sobrien
26159764Sobrien/* Local stuff. */
27159764Sobrien
28159764Sobrien#include "mystdarg.h"
29159764Sobrien#include "tcpd.h"
30159764Sobrien
31159764Sobrien/* request_fill - request update engine */
32159764Sobrien
33159764Sobrienstatic struct request_info *request_fill(request, ap)
34159764Sobrienstruct request_info *request;
35159764Sobrienva_list ap;
36159764Sobrien{
37159764Sobrien    int     key;
38159764Sobrien    char   *ptr;
39159764Sobrien
40159764Sobrien    while ((key = va_arg(ap, int)) > 0) {
41159764Sobrien	switch (key) {
42159764Sobrien	default:
43159764Sobrien	    tcpd_warn("request_fill: invalid key: %d", key);
44159764Sobrien	    return (request);
45159764Sobrien	case RQ_FILE:
46159764Sobrien	    request->fd = va_arg(ap, int);
47159764Sobrien	    continue;
48159764Sobrien	case RQ_CLIENT_SIN:
49159764Sobrien	    request->client->sin = va_arg(ap, struct sockaddr_in *);
50159764Sobrien	    continue;
51159764Sobrien	case RQ_SERVER_SIN:
52159764Sobrien	    request->server->sin = va_arg(ap, struct sockaddr_in *);
53159764Sobrien	    continue;
54159764Sobrien
55159764Sobrien	    /*
56159764Sobrien	     * All other fields are strings with the same maximal length.
57159764Sobrien	     */
58159764Sobrien
59159764Sobrien	case RQ_DAEMON:
60159764Sobrien	    ptr = request->daemon;
61159764Sobrien	    break;
62186690Sobrien	case RQ_USER:
63186690Sobrien	    ptr = request->user;
64186690Sobrien	    break;
65186690Sobrien	case RQ_CLIENT_NAME:
66186690Sobrien	    ptr = request->client->name;
67186690Sobrien	    break;
68267843Sdelphij	case RQ_CLIENT_ADDR:
69186690Sobrien	    ptr = request->client->addr;
70186690Sobrien	    break;
71186690Sobrien	case RQ_SERVER_NAME:
72186690Sobrien	    ptr = request->server->name;
73186690Sobrien	    break;
74226048Sobrien	case RQ_SERVER_ADDR:
75226048Sobrien	    ptr = request->server->addr;
76226048Sobrien	    break;
77226048Sobrien	}
78226048Sobrien	STRN_CPY(ptr, va_arg(ap, char *), STRING_LENGTH);
79226048Sobrien    }
80226048Sobrien    return (request);
81226048Sobrien}
82226048Sobrien
83226048Sobrien/* request_init - initialize request structure */
84226048Sobrien
85226048Sobrienstruct request_info *VARARGS(request_init, struct request_info *, request)
86226048Sobrien{
87226048Sobrien    static struct request_info default_info;
88226048Sobrien    struct request_info *r;
89226048Sobrien    va_list ap;
90226048Sobrien
91226048Sobrien    /*
92226048Sobrien     * Initialize data members. We do not assign default function pointer
93226048Sobrien     * members, to avoid pulling in the whole socket module when it is not
94267843Sdelphij     * really needed.
95267843Sdelphij     */
96267843Sdelphij    VASTART(ap, struct request_info *, request);
97267843Sdelphij    *request = default_info;
98226048Sobrien    request->fd = -1;
99267843Sdelphij    strcpy(request->daemon, unknown);
100226048Sobrien    sprintf(request->pid, "%d", getpid());
101226048Sobrien    request->client->request = request;
102226048Sobrien    request->server->request = request;
103226048Sobrien    r = request_fill(request, ap);
104226048Sobrien    VAEND(ap);
105226048Sobrien    return (r);
106226048Sobrien}
107290152Sdelphij
108290152Sdelphij/* request_set - update request structure */
109290152Sdelphij
110290152Sdelphijstruct request_info *VARARGS(request_set, struct request_info *, request)
111290152Sdelphij{
112    struct request_info *r;
113    va_list ap;
114
115    VASTART(ap, struct request_info *, request);
116    r = request_fill(request, ap);
117    VAEND(ap);
118    return (r);
119}
120