/* dircproxy
 * Copyright (C) 2002 Scott James Remnant <scott@netsplit.com>.
 * All Rights Reserved.
 *
 * irc_net.h
 * --
 * @(#) $Id: irc_net.h,v 1.46 2002/02/06 10:07:42 scott Exp $
 *
 * This file is distributed according to the GNU General Public
 * License.  For full details, read the top of 'main.c' or the
 * file called COPYING that was distributed with this code.
 */

#ifndef __DIRCPROXY_IRC_NET_H
#define __DIRCPROXY_IRC_NET_H

/* required includes */
#include <stdio.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <time.h>

#include "irc_prot.h"
#include "stringex.h"

/* a log file - there are good reasons why this isn't defined in irc_log.h */
struct logfile {
  int open, made;
  char *filename;
  FILE *file;
  FILE *copy;
  char *program;

  unsigned long nlines, maxlines;

  int always;
  int timestamp;
  int relativetime;
};

/* a description of an authorised connction */
struct ircconnclass {
  char *server_port;
  long server_retry;
  long server_dnsretry;
  long server_maxattempts;
  long server_maxinitattempts;
  int server_keepalive;
  long server_pingtimeout;
  long *server_throttle;
  int server_autoconnect;

  long channel_rejoin;
  int channel_leave_on_detach;
  int channel_rejoin_on_attach;
  
  long idle_maxtime;

  int disconnect_existing;
  int disconnect_on_detach;

  char *initial_modes;
  char *drop_modes;
  char *refuse_modes;
  
  char *local_address;

  char *away_message;
  char *quit_message;
  char *attach_message;
  char *detach_message;
  char *detach_nickname;

  int nick_keep;

  int ctcp_replies;

  int chan_log_enabled;
  int chan_log_always;
  long chan_log_maxsize;
  long chan_log_recall;
  int chan_log_timestamp;
  int chan_log_relativetime;
  char *chan_log_copydir;
  char *chan_log_program;

  int other_log_enabled;
  int other_log_always;
  long other_log_maxsize;
  long other_log_recall;
  int other_log_timestamp;
  int other_log_relativetime;
  char *other_log_copydir;
  char *other_log_program;

  long log_timeoffset;
  int log_events;

  int dcc_proxy_incoming;
  int dcc_proxy_outgoing;
  int *dcc_proxy_ports;
  size_t dcc_proxy_ports_sz;
  long dcc_proxy_timeout;
  int dcc_proxy_sendreject;

  int dcc_send_fast;

  char *dcc_capture_directory;
  int dcc_capture_always;
  int dcc_capture_withnick;
  long dcc_capture_maxsize;

  char *dcc_tunnel_incoming;
  char *dcc_tunnel_outgoing;

  char *switch_user;

  int motd_logo;
  char *motd_file;
  int motd_stats;

  int allow_persist;
  int allow_jump;
  int allow_jump_new;
  int allow_host;
  int allow_die;
  int allow_users;
  int allow_kill;

  char *password;
  struct strlist *servers, *next_server;
  struct strlist *masklist;
  struct strlist *channels;

  /* Most config file options can be changed by editing the config file and
     HUP'ing dircproxy.  One or two can be done from the /DIRCPROXY command
     though.  Always keep the originals. */
  char *orig_local_address;

  struct ircconnclass *next;
};

/* a channel someone is on */
struct ircchannel {
  char *name;
  char *key;
  int inactive;
  int unjoined;
  struct logfile log;

  struct ircchannel *next;
};

/* a proxied connection */
struct ircproxy {
  int dead;
  struct ircconnclass *conn_class;
  int die_on_close;
  time_t start;

  int client_sock;
  int client_status;
  struct sockaddr_in client_addr;
  char *client_host;

  int server_sock;
  int server_status;
  struct sockaddr_in server_addr;
  long server_attempts;

  char *nickname;
  char *setnickname;
  char *oldnickname;

  char *username;
  char *hostname;
  char *realname;
  char *servername;
  char *serverver;
  char *serverumodes;
  char *servercmodes;
  char *serverpassword;

  char *password;

  int allow_motd;
  int allow_pong;
  int squelch_411;
  int expecting_nick;
  struct strlist *squelch_modes;

  char *ctcp_userinfo;
  char *ctcp_finger;
  char *awaymessage;
  char *modes;
  struct ircchannel *channels;

  char *temp_logdir;
  struct logfile other_log;

  struct ircproxy *next;
};

/* states a client can be in */
#define IRC_CLIENT_NONE        0x00
#define IRC_CLIENT_CONNECTED   0x01
#define IRC_CLIENT_GOTPASS     0x02
#define IRC_CLIENT_GOTNICK     0x04
#define IRC_CLIENT_GOTUSER     0x08
#define IRC_CLIENT_AUTHED      0x10
#define IRC_CLIENT_SENTWELCOME 0x20
#define IRC_CLIENT_ACTIVE      0x3d

/* Can we send data to the client? */
#define IS_CLIENT_READY(_c) (((_c)->client_status & 0x1d) == 0x1d)

/* states a server can be in */
#define IRC_SERVER_NONE        0x00
#define IRC_SERVER_CREATED     0x01
#define IRC_SERVER_SEEN        0x02
#define IRC_SERVER_CONNECTED   0x04
#define IRC_SERVER_INTRODUCED  0x08
#define IRC_SERVER_GOTWELCOME  0x10
#define IRC_SERVER_ACTIVE      0x1f

/* Can we send data to the server? */
#define IS_SERVER_READY(_c) (((_c)->server_status & 0x0c) == 0x0c)

/* types of event we can log */
#define IRC_LOG_TEXT   0x0001
#define IRC_LOG_ACTION 0x0002
#define IRC_LOG_CTCP   0x0004
#define IRC_LOG_JOIN   0x0008
#define IRC_LOG_PART   0x0010
#define IRC_LOG_KICK   0x0020
#define IRC_LOG_QUIT   0x0040
#define IRC_LOG_NICK   0x0080
#define IRC_LOG_MODE   0x0100
#define IRC_LOG_TOPIC  0x0200
#define IRC_LOG_CLIENT 0x0400
#define IRC_LOG_SERVER 0x0800
#define IRC_LOG_ERROR  0x1000

/* global variables */
extern struct ircconnclass *connclasses;

/* functions */
extern int ircnet_listen(const char *);
extern int ircnet_expunge_proxies(void);
extern void ircnet_flush(void);
extern void ircnet_flush_proxies(struct ircproxy **);
extern void ircnet_flush_connclasses(struct ircconnclass **);
extern void ircnet_freeconnclass(struct ircconnclass *);
extern int ircnet_hooksocket(int);
extern struct ircproxy *ircnet_fetchclass(struct ircconnclass *);
extern struct ircchannel *ircnet_fetchchannel(struct ircproxy *, const char *);
extern int ircnet_addchannel(struct ircproxy *, const char *);
extern int ircnet_delchannel(struct ircproxy *, const char *);
extern int ircnet_channel_mode(struct ircproxy *, struct ircchannel *,
                               struct ircmessage *, int);
extern struct ircchannel *ircnet_freechannel(struct ircchannel *);
extern int ircnet_rejoin(struct ircproxy *, const char *);
extern int ircnet_dedicate(struct ircproxy *);
extern int ircnet_announce_dedicated(struct ircproxy *);
extern int ircnet_announce_nolisten(struct ircproxy *);
extern int ircnet_announce_status(struct ircproxy *);

#endif /* __DIRCPROXY_IRC_NET_H */


syntax highlighted by Code2HTML, v. 0.9.1