From 16dfe536b74d2c3d647eff0a6d2858b198707766 Mon Sep 17 00:00:00 2001 From: mdw Date: Sun, 10 Oct 1999 16:45:34 +0000 Subject: [PATCH] Modified to use new mLib resolver and ident client. --- identify.c | 109 +++++++++++++------------------------------------------------ 1 file changed, 23 insertions(+), 86 deletions(-) diff --git a/identify.c b/identify.c index 8f0bf4c..4b22043 100644 --- a/identify.c +++ b/identify.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: identify.c,v 1.4 1999/07/27 18:30:53 mdw Exp $ + * $Id: identify.c,v 1.5 1999/10/10 16:45:34 mdw Exp $ * * Identifies and logs the client of a connection * @@ -29,6 +29,9 @@ /*----- Revision history --------------------------------------------------* * * $Log: identify.c,v $ + * Revision 1.5 1999/10/10 16:45:34 mdw + * Modified to use new mLib resolver and ident client. + * * Revision 1.4 1999/07/27 18:30:53 mdw * Various minor portability fixes. * @@ -64,16 +67,16 @@ #include #include +#include #include #include +#include #include #include #include #include -#include "bres.h" #include "fw.h" -#include "ident.h" #include "identify.h" /*----- Magic numbers -----------------------------------------------------*/ @@ -89,17 +92,16 @@ typedef struct id { time_t when; /* When the connection occurred */ conn c; /* Connection selector */ unsigned state; /* Current state of the world */ + sel_timer t; /* Timeout selector */ bres_client r; /* Backgd resolver client block */ + ident_request i; /* Ident client block */ char host[64]; /* Resolved hostname */ char user[32]; /* Authenticated client user */ - sel_timer t; /* Timeout selector */ - selbuf id; /* Reader for the RFC931 client */ } id; #define S_HOST 1u /* Read the hostname from resolver */ #define S_USER 2u /* Read the username from RFC931 */ -#define S_UCONN 4u /* Connected to remote RFC931 */ -#define S_TIMER 8u /* Timeout has completed */ +#define S_TIMER 4u /* Timeout has completed */ /*----- Main code ---------------------------------------------------------*/ @@ -118,10 +120,8 @@ static void id_done(id *i) if (!(i->state & S_HOST)) bres_abort(&i->r); - if (!(i->state & S_UCONN)) - conn_kill(&i->c); - else if (!(i->state & S_USER)) - selbuf_disable(&i->id); + if (!(i->state & S_USER)) + ident_abort(&i->i); if (!(i->state & S_TIMER)) sel_rmtimer(&i->t); @@ -139,7 +139,7 @@ static void id_done(id *i) /* --- @id_res@ --- * * - * Arguments: @const char *host@ = name of the resolved host + * Arguments: @struct hostent *h@ = name of the resolved host * @void *vp@ = pointer to identification block * * Returns: --- @@ -147,10 +147,11 @@ static void id_done(id *i) * Use: Responds to a completed reverse name resolution. */ -static void id_res(const char *host, void *vp) +static void id_res(struct hostent *h, void *vp) { id *i = vp; - str_sanitize(i->host, host, sizeof(i->host)); + if (h) + str_sanitize(i->host, h->h_name, sizeof(i->host)); i->state |= S_HOST; if (i->state & S_USER) id_done(i); @@ -158,7 +159,7 @@ static void id_res(const char *host, void *vp) /* --- @id_ident@ --- * * - * Arguments: @char *p@ = pointer to string read from server + * Arguments: @ident_reply *i@ = pointer to string read from server * @void *vp@ = pointer to identification block * * Returns: --- @@ -166,61 +167,22 @@ static void id_res(const char *host, void *vp) * Use: Responds to a line read from the remote RFC931 server. */ -static void id_ident(char *p, void *vp) +static void id_ident(ident_reply *ir, void *vp) { id *i = vp; - /* --- Get rid of the connection --- */ - - i->state |= S_USER; - selbuf_disable(&i->id); - close(i->id.reader.fd); - - /* --- Read the information from the returned line --- */ + /* --- Read the information from the client --- */ - if (p) { - ident idbuf; - ident_parse(p, &idbuf); - if (idbuf.type == ident_userid) - str_sanitize(i->user, idbuf.u.userid.user, sizeof(i->user)); - } + if (ir && ir->type == IDENT_USERID) + str_sanitize(i->user, ir->u.userid.user, sizeof(i->user)); /* --- Maybe finish off this identification --- */ + i->state |= S_USER; if (i->state & S_HOST) id_done(i); } -/* --- @id_conn@ --- * - * - * Arguments: @int fd@ = file descriptor connected - * @void *vp@ = pointer to identification block - * - * Returns: --- - * - * Use: Responds to a completed connection to the remote RFC931 - * server. - */ - -static void id_conn(int fd, void *vp) -{ - id *i = vp; - - if (fd == -1) { - i->state |= S_USER | S_UCONN; - if (i->state & S_HOST) - id_done(i); - } else { - dstr d = DSTR_INIT; - dstr_putf(&d, "%u, %u\n", - ntohs(i->q.rsin.sin_port), ntohs(i->q.lsin.sin_port)); - write(fd, d.buf, d.len); - dstr_destroy(&d); - i->state |= S_UCONN; - selbuf_init(&i->id, sel, fd, id_ident, i); - } -} - /* --- @id_timer@ --- * * * Arguments: @struct timeval *tv@ = pointer to the current time @@ -264,36 +226,11 @@ void identify(const id_req *q) /* --- Set up the connection to the identity server --- */ - { - int fd; - struct sockaddr_in sin; - - if ((fd = socket(PF_INET, SOCK_STREAM, 0)) < 0) - id_conn(-1, i); - else { - memset(&sin, 0, sizeof(sin)); - sin.sin_family = AF_INET; - sin.sin_addr = q->lsin.sin_addr; - sin.sin_port = 0; - if (bind(fd, (struct sockaddr *)&sin, sizeof(sin))) { - close(fd); - id_conn(-1, i); - } else { - int opt = 1; - sin.sin_family = AF_INET; - sin.sin_addr = q->rsin.sin_addr; - sin.sin_port = htons(113); - setsockopt(fd, SOL_SOCKET, SO_OOBINLINE, &opt, sizeof(opt)); - conn_init(&i->c, sel, fd, - (struct sockaddr *)&sin, sizeof(sin), - id_conn, i); - } - } - } + ident(&i->i, sel, &q->lsin, &q->rsin, id_ident, i); /* --- Set up the name resolver --- */ - bres_resolve(&i->r, q->rsin.sin_addr, id_res, i); + bres_byaddr(&i->r, q->rsin.sin_addr, id_res, i); /* --- Set up the time limiter --- */ -- 2.11.0