144 lines
3.6 KiB
C
144 lines
3.6 KiB
C
/*
|
|
* NeoIRCd: NeoStats Group. Based on Hybird7
|
|
* fdlist.h: The file descriptor list header.
|
|
*
|
|
* Copyright (C) 2002 by the past and present ircd coders, and others.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
|
* USA
|
|
*
|
|
* $Id: fdlist.h,v 1.3 2002/09/13 06:50:06 fishwaldo Exp $
|
|
*/
|
|
|
|
#ifndef INCLUDED_fdlist_h
|
|
#define INCLUDED_fdlist_h
|
|
|
|
#include "config.h"
|
|
#include "ircd_defs.h"
|
|
#include "res.h"
|
|
#define FD_DESC_SZ 128 /* hostlen + comment */
|
|
|
|
/*
|
|
* priority values used in fdlist code
|
|
*/
|
|
#define FDL_SERVER 0x01
|
|
#define FDL_BUSY 0x02
|
|
#define FDL_OPER 0x04
|
|
#define FDL_DEFAULT 0x08
|
|
#define FDL_ALL 0xFF
|
|
|
|
/* FD type values */
|
|
enum {
|
|
FD_NONE,
|
|
FD_LOG,
|
|
FD_FILE,
|
|
FD_FILECLOSE,
|
|
FD_SOCKET,
|
|
FD_PIPE,
|
|
FD_UNKNOWN
|
|
};
|
|
|
|
enum {
|
|
COMM_OK,
|
|
COMM_ERR_BIND,
|
|
COMM_ERR_DNS,
|
|
COMM_ERR_TIMEOUT,
|
|
COMM_ERR_CONNECT,
|
|
COMM_ERROR,
|
|
COMM_ERR_MAX
|
|
};
|
|
|
|
typedef enum fdlist_t {
|
|
FDLIST_NONE,
|
|
FDLIST_SERVICE,
|
|
FDLIST_SERVER,
|
|
FDLIST_IDLECLIENT,
|
|
FDLIST_BUSYCLIENT,
|
|
FDLIST_MAX
|
|
} fdlist_t;
|
|
|
|
typedef struct _fde fde_t;
|
|
|
|
/* Callback for completed IO events */
|
|
typedef void PF(int, void *);
|
|
|
|
/* Callback for completed connections */
|
|
/* int fd, int status, void * */
|
|
typedef void CNCB(int, int, void *);
|
|
|
|
extern int highest_fd;
|
|
extern int number_fd;
|
|
|
|
struct Client;
|
|
|
|
struct _fde {
|
|
/* New-school stuff, again pretty much ripped from squid */
|
|
/*
|
|
* Yes, this gives us only one pending read and one pending write per
|
|
* filedescriptor. Think though: when do you think we'll need more?
|
|
*/
|
|
int fd; /* So we can use the fde_t as a callback ptr */
|
|
int type;
|
|
fdlist_t list; /* Which list this FD should sit on */
|
|
int comm_index; /* where in the poll list we live */
|
|
char desc[FD_DESC_SZ];
|
|
PF *read_handler;
|
|
void *read_data;
|
|
PF *write_handler;
|
|
void *write_data;
|
|
PF *timeout_handler;
|
|
void *timeout_data;
|
|
time_t timeout;
|
|
PF *flush_handler;
|
|
void *flush_data;
|
|
time_t flush_timeout;
|
|
struct DNSQuery *dns_query;
|
|
struct {
|
|
unsigned int open:1;
|
|
unsigned int close_request:1;
|
|
unsigned int write_daemon:1;
|
|
unsigned int closing:1;
|
|
unsigned int socket_eof:1;
|
|
unsigned int nolinger:1;
|
|
unsigned int nonblocking:1;
|
|
unsigned int ipc:1;
|
|
unsigned int called_connect:1;
|
|
} flags;
|
|
struct {
|
|
/* We don't need the host here ? */
|
|
struct irc_sockaddr S;
|
|
struct irc_sockaddr hostaddr;
|
|
CNCB *callback;
|
|
void *data;
|
|
/* We'd also add the retry count here when we get to that -- adrian */
|
|
} connect;
|
|
};
|
|
|
|
|
|
extern fde_t *fd_table;
|
|
|
|
void fdlist_init(void);
|
|
|
|
extern void fd_open(int, unsigned int, const char *);
|
|
extern void fd_close(int);
|
|
extern void fd_dump(struct Client *source_p);
|
|
#ifndef __GNUC__
|
|
extern void fd_note(int fd, const char *format, ...);
|
|
#else
|
|
extern void fd_note(int fd, const char *format, ...)
|
|
__attribute__((format (printf, 2, 3)));
|
|
#endif
|
|
#endif /* INCLUDED_fdlist_h */
|
|
|