source: trunk/third/tcp_wrappers/update.c @ 11717

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