/* -*-c-*-
*
- * $Id: acl.c,v 1.1 1999/07/01 08:56:23 mdw Exp $
+ * $Id: acl.c,v 1.2 1999/07/26 23:28:15 mdw Exp $
*
* Access control list handling
*
- * (c) 1999 Mark Wooding
+ * (c) 1999 Straylight/Edgeware
*/
/*----- Licensing notice --------------------------------------------------*
/*----- Revision history --------------------------------------------------*
*
* $Log: acl.c,v $
- * Revision 1.1 1999/07/01 08:56:23 mdw
- * Initial revision
+ * Revision 1.2 1999/07/26 23:28:15 mdw
+ * Minor modifications for new design.
+ *
+ * Revision 1.1.1.1 1999/07/01 08:56:23 mdw
+ * Initial revision.
*
*/
}
}
+/* --- @acl_free@ --- *
+ *
+ * Arguments: @acl_entry *a@ = pointer to a list of ACLs
+ *
+ * Returns: ---
+ *
+ * Use: Frees all of the memory used by an ACL.
+ */
+
+void acl_free(acl_entry *a)
+{
+ while (a) {
+ acl_entry *aa = a;
+ a = a->next;
+ DESTROY(aa);
+ }
+}
+
/* --- @acl_add@ --- *
*
* Arguments: @acl_entry ***a@ = address of pointer to list tail
/* -*-c-*-
*
- * $Id: acl.h,v 1.1 1999/07/01 08:56:23 mdw Exp $
+ * $Id: acl.h,v 1.2 1999/07/26 23:28:16 mdw Exp $
*
* Access control list handling
*
- * (c) 1999 Mark Wooding
+ * (c) 1999 Straylight/Edgeware
*/
/*----- Licensing notice --------------------------------------------------*
/*----- Revision history --------------------------------------------------*
*
* $Log: acl.h,v $
- * Revision 1.1 1999/07/01 08:56:23 mdw
- * Initial revision
+ * Revision 1.2 1999/07/26 23:28:16 mdw
+ * Minor modifications for new design.
+ *
+ * Revision 1.1.1.1 1999/07/01 08:56:23 mdw
+ * Initial revision.
*
*/
extern void acl_dump(acl_entry */*a*/, FILE */*fp*/);
+/* --- @acl_free@ --- *
+ *
+ * Arguments: @acl_entry *a@ = pointer to a list of ACLs
+ *
+ * Returns: ---
+ *
+ * Use: Frees all of the memory used by an ACL.
+ */
+
+extern void acl_free(acl_entry */*a*/);
+
/* --- @acl_add@ --- *
*
* Arguments: @acl_entry ***a@ = address of pointer to list tail
/* -*-c-*-
*
- * $Id: chan.c,v 1.1 1999/07/01 08:56:23 mdw Exp $
+ * $Id: chan.c,v 1.2 1999/07/26 23:27:52 mdw Exp $
*
* Channel management
*
- * (c) 1999 Mark Wooding
+ * (c) 1999 Straylight/Edgeware
*/
/*----- Licensing notice --------------------------------------------------*
/*----- Revision history --------------------------------------------------*
*
* $Log: chan.c,v $
- * Revision 1.1 1999/07/01 08:56:23 mdw
- * Initial revision
+ * Revision 1.2 1999/07/26 23:27:52 mdw
+ * Minor modifications for new design.
+ *
+ * Revision 1.1.1.1 1999/07/01 08:56:23 mdw
+ * Initial revision.
*
*/
/* --- Close the output end if necessary --- */
- if (c->len == 0 && (c->f & CHANF_CLOSE)) {
- shutdown(fd, 1);
+ if (c->len == 0 && (c->f & CHANF_CLOSE))
c->func(c->p);
- }
return;
/* --- Force a close if an error occurred --- */
}
else if (r == 0)
goto close;
- else if (c->len == 0 && !(c->f & CHANF_READY))
+ else if (c->len == 0 && (c->f & CHANF_READY))
sel_addfile(&c->w);
c->len += r;
if (c->len == CHAN_BUFSZ)
close:
c->f |= CHANF_CLOSE;
- if (!c->len)
+ if (!c->len && (c->f & CHANF_READY))
sel_addfile(&c->w);
sel_rmfile(&c->r);
}
if (c->f & CHANF_READY)
return;
sel_initfile(sel, &c->w, fd, SEL_WRITE, writechan, c);
- if (c->len)
+ if (c->len || (c->f & CHANF_CLOSE))
sel_addfile(&c->w);
+ c->f |= CHANF_READY;
}
/* --- @chan_open@ --- *
/* -*-c-*-
*
- * $Id: identify.c,v 1.2 1999/07/03 13:56:59 mdw Exp $
+ * $Id: identify.c,v 1.3 1999/07/26 23:26:21 mdw Exp $
*
* Identifies and logs the client of a connection
*
- * (c) 1999 Mark Wooding
+ * (c) 1999 Straylight/Edgeware
*/
/*----- Licensing notice --------------------------------------------------*
/*----- Revision history --------------------------------------------------*
*
* $Log: identify.c,v $
+ * Revision 1.3 1999/07/26 23:26:21 mdw
+ * Minor modifications for new design.
+ *
* Revision 1.2 1999/07/03 13:56:59 mdw
* Log connections to syslog or stderr as appropriate.
*
typedef struct id {
id_req q; /* Copy of client's request block */
- void (*func)(void */*p*/); /* Function to call when done */
- void *p; /* Argument to pass to function */
time_t when; /* When the connection occurred */
conn c; /* Connection selector */
unsigned state; /* Current state of the world */
static void id_done(id *i)
{
- char buf[64];
- struct tm *tm;
-
/* --- Close down the various dependent bits --- */
if (!(i->state & S_HOST))
/* --- Report the final result --- */
- tm = localtime(&i->when);
- strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", tm);
- if (flags & FW_SYSLOG) {
- syslog(LOG_NOTICE, "%s %s %s from %s@%s [%s]\n",
- buf, i->q.desc, i->q.act,
- i->user, i->host, inet_ntoa(i->q.rsin.sin_addr));
- } else {
- fprintf(stderr, "%s %s %s from %s@%s [%s]\n",
- buf, i->q.desc, i->q.act,
- i->user, i->host, inet_ntoa(i->q.rsin.sin_addr));
- }
+ fw_log(i->when, "[%s] %s from %s@%s [%s]",
+ i->q.desc, i->q.act,
+ i->user, i->host, inet_ntoa(i->q.rsin.sin_addr));
/* --- Dispose of the block --- */
- i->func(i->p);
+ REFFD_DEC(i->q.r);
free(i);
}
/* --- @identify@ --- *
*
* Arguments: @const id_req *q@ = pointer to request block
- * @void (*func)(void *p)@ = function to call when done
- * @void *p@ = argument to pass to function
*
* Returns: ---
*
* which will, eventually, report a message to the system log.
*/
-void identify(const id_req *q,
- void (*func)(void */*p*/), void *p)
+void identify(const id_req *q)
{
id *i;
i = xmalloc(sizeof(*i));
i->q = *q;
- i->func = func;
- i->p = p;
+ REFFD_INC(i->q.r);
str_sanitize(i->host, inet_ntoa(q->rsin.sin_addr), sizeof(i->host));
strcpy(i->user, "<ANONYMOUS>");
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);
/* -*-c-*-
*
- * $Id: identify.h,v 1.1 1999/07/01 08:56:23 mdw Exp $
+ * $Id: identify.h,v 1.2 1999/07/26 23:26:21 mdw Exp $
*
* Identifies and logs the client of a connection
*
- * (c) 1999 Mark Wooding
+ * (c) 1999 Straylight/Edgeware
*/
/*----- Licensing notice --------------------------------------------------*
/*----- Revision history --------------------------------------------------*
*
* $Log: identify.h,v $
- * Revision 1.1 1999/07/01 08:56:23 mdw
- * Initial revision
+ * Revision 1.2 1999/07/26 23:26:21 mdw
+ * Minor modifications for new design.
+ *
+ * Revision 1.1.1.1 1999/07/01 08:56:23 mdw
+ * Initial revision.
*
*/
#include <sys/socket.h>
#include <netinet/in.h>
+#ifndef REFFD_H
+# include "reffd.h"
+#endif
+
/*----- Data structures ---------------------------------------------------*/
typedef struct id_req {
struct sockaddr_in rsin; /* Remote address of connection */
const char *desc; /* Description of connection */
const char *act; /* Action taken by server */
+ reffd *r; /* Pointer to file descriptor */
} id_req;
/*----- Functions provided ------------------------------------------------*/
/* --- @identify@ --- *
*
* Arguments: @const id_req *q@ = pointer to request block
- * @void (*func)(void *p)@ = function to call when done
- * @void *p@ = argument to pass to function
*
* Returns: ---
*
* which will, eventually, report a message to the system log.
*/
-extern void identify(const id_req */*q*/,
- void (*/*func*/)(void */*p*/), void */*p*/);
+extern void identify(const id_req */*q*/);
/*----- That's all, folks -------------------------------------------------*/