144743Smarkm /*
244743Smarkm  * Routines for controlled update/initialization of request structures.
344743Smarkm  *
444743Smarkm  * request_init() initializes its argument. Pointers and string-valued members
544743Smarkm  * are initialized to zero, to indicate that no lookup has been attempted.
644743Smarkm  *
744743Smarkm  * request_set() adds information to an already initialized request structure.
844743Smarkm  *
944743Smarkm  * Both functions take a variable-length name-value list.
1044743Smarkm  *
1144743Smarkm  * Diagnostics are reported through syslog(3).
1244743Smarkm  *
1344743Smarkm  * Author: Wietse Venema, Eindhoven University of Technology, The Netherlands.
1456977Sshin  *
1556977Sshin  * $FreeBSD$
1644743Smarkm  */
1744743Smarkm
1844743Smarkm#ifndef lint
1944743Smarkmstatic char sccsid[] = "@(#) update.c 1.1 94/12/28 17:42:56";
2044743Smarkm#endif
2144743Smarkm
2244743Smarkm/* System libraries */
2344743Smarkm
2444743Smarkm#include <stdio.h>
2544743Smarkm#include <syslog.h>
2644743Smarkm#include <string.h>
27257398Ssbruno#include <unistd.h>
2844743Smarkm
2944743Smarkm/* Local stuff. */
3044743Smarkm
3144743Smarkm#include "mystdarg.h"
3244743Smarkm#include "tcpd.h"
3344743Smarkm
3444743Smarkm/* request_fill - request update engine */
3544743Smarkm
3644743Smarkmstatic struct request_info *request_fill(request, ap)
3744743Smarkmstruct request_info *request;
3844743Smarkmva_list ap;
3944743Smarkm{
4044743Smarkm    int     key;
4144743Smarkm    char   *ptr;
4244743Smarkm
4344743Smarkm    while ((key = va_arg(ap, int)) > 0) {
4444743Smarkm	switch (key) {
4544743Smarkm	default:
4644743Smarkm	    tcpd_warn("request_fill: invalid key: %d", key);
4744743Smarkm	    return (request);
4844743Smarkm	case RQ_FILE:
4944743Smarkm	    request->fd = va_arg(ap, int);
5044743Smarkm	    continue;
5144743Smarkm	case RQ_CLIENT_SIN:
5256977Sshin#ifdef INET6
5356977Sshin	    request->client->sin = va_arg(ap, struct sockaddr *);
5456977Sshin#else
5544743Smarkm	    request->client->sin = va_arg(ap, struct sockaddr_in *);
5656977Sshin#endif
5744743Smarkm	    continue;
5844743Smarkm	case RQ_SERVER_SIN:
5956977Sshin#ifdef INET6
6056977Sshin	    request->server->sin = va_arg(ap, struct sockaddr *);
6156977Sshin#else
6244743Smarkm	    request->server->sin = va_arg(ap, struct sockaddr_in *);
6356977Sshin#endif
6444743Smarkm	    continue;
6544743Smarkm
6644743Smarkm	    /*
6744743Smarkm	     * All other fields are strings with the same maximal length.
6844743Smarkm	     */
6944743Smarkm
7044743Smarkm	case RQ_DAEMON:
7144743Smarkm	    ptr = request->daemon;
7244743Smarkm	    break;
7344743Smarkm	case RQ_USER:
7444743Smarkm	    ptr = request->user;
7544743Smarkm	    break;
7644743Smarkm	case RQ_CLIENT_NAME:
7744743Smarkm	    ptr = request->client->name;
7844743Smarkm	    break;
7944743Smarkm	case RQ_CLIENT_ADDR:
8044743Smarkm	    ptr = request->client->addr;
8144743Smarkm	    break;
8244743Smarkm	case RQ_SERVER_NAME:
8344743Smarkm	    ptr = request->server->name;
8444743Smarkm	    break;
8544743Smarkm	case RQ_SERVER_ADDR:
8644743Smarkm	    ptr = request->server->addr;
8744743Smarkm	    break;
8844743Smarkm	}
8944743Smarkm	STRN_CPY(ptr, va_arg(ap, char *), STRING_LENGTH);
9044743Smarkm    }
9144743Smarkm    return (request);
9244743Smarkm}
9344743Smarkm
9444743Smarkm/* request_init - initialize request structure */
9544743Smarkm
9644743Smarkmstruct request_info *VARARGS(request_init, struct request_info *, request)
9744743Smarkm{
9844743Smarkm    static struct request_info default_info;
9944743Smarkm    struct request_info *r;
10044743Smarkm    va_list ap;
10144743Smarkm
10244743Smarkm    /*
10344743Smarkm     * Initialize data members. We do not assign default function pointer
10444743Smarkm     * members, to avoid pulling in the whole socket module when it is not
10544743Smarkm     * really needed.
10644743Smarkm     */
10744743Smarkm    VASTART(ap, struct request_info *, request);
10844743Smarkm    *request = default_info;
10944743Smarkm    request->fd = -1;
11044743Smarkm    strcpy(request->daemon, unknown);
11144743Smarkm    sprintf(request->pid, "%d", getpid());
11244743Smarkm    request->client->request = request;
11344743Smarkm    request->server->request = request;
11444743Smarkm    r = request_fill(request, ap);
11544743Smarkm    VAEND(ap);
11644743Smarkm    return (r);
11744743Smarkm}
11844743Smarkm
11944743Smarkm/* request_set - update request structure */
12044743Smarkm
12144743Smarkmstruct request_info *VARARGS(request_set, struct request_info *, request)
12244743Smarkm{
12344743Smarkm    struct request_info *r;
12444743Smarkm    va_list ap;
12544743Smarkm
12644743Smarkm    VASTART(ap, struct request_info *, request);
12744743Smarkm    r = request_fill(request, ap);
12844743Smarkm    VAEND(ap);
12944743Smarkm    return (r);
13044743Smarkm}
131