/* * irc.h: header file for all of ircII! * * Written By Michael Sandrof * * Copyright (c) 1990 Michael Sandrof. * Copyright (c) 1991, 1992 Troy Rollo. * Copyright (c) 1992-2004 Matthew R. Green. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * @(#)$eterna: irc.h,v 1.87 2005/09/21 20:17:38 mrg Exp $ */ #ifndef __irc_h #define __irc_h #define IRCII_COMMENT "this is a bug free client. honest" #ifdef __MSDOS__ #define IRCRC_NAME "/irc.rc" #else #define IRCRC_NAME "/.ircrc" #endif #ifdef __MSDOS__ #define IRCQUICK_NAME "/ircquick.rc" #else #define IRCQUICK_NAME "/.ircquick" #endif /* * Here you can set the in-line quote character, normally backslash, to * whatever you want. Note that we use two backslashes since a backslash is * also C's quote character. You do not need two of any other character. */ #define QUOTE_CHAR '\\' #if defined(ISC30) /* for some reason it doesn't get defined */ # define _POSIX_SOURCE #endif /* ISC30 */ #include "defs.h" #include "config.h" #ifdef NeXT # include #endif #include #include #ifdef _Windows #include #include #else #include #include #ifndef WINS #include #else #include #include #undef server #endif /* WINS */ #include #include #include #endif #ifdef TIME_WITH_SYS_TIME # include # include #else # ifdef HAVE_SYS_TIME_H # include # else # include # endif /* HAVE_SYS_TIME_H */ #endif /* TIME_WITH_SYS_TIME */ #ifdef HAVE_SYS_FCNTL_H # include #endif /* HAVE_SYS_FCNTL_H */ #ifdef HAVE_FCNTL_H # include #endif /* HAVE_FCNTL_H */ /* machines we don't want to use on 'cause its broken */ #if defined(pyr) || defined(_SEQUENT_) # undef HAVE_UNISTD_H #endif /* pyr || _SEQUENT_ */ #ifdef HAVE_UNISTD_H # include #endif /* HAVE_UNISTD_H */ #ifdef HAVE_SYS_FILE_H # include #endif /* HAVE_SYS_FILE_H */ #ifdef HAVE_NETDB_H # include #endif /* HAVE_NETDB_H */ #ifdef HAVE_PROCESS_H # include #endif /* HAVE_PROCESS_H */ #ifdef HAVE_TERMCAP_H # include #endif /* HAVE_TERMCAP_H */ #include #ifdef HAVE_SYS_SELECT_H # include #endif /* HAVE_SYS_SELECT_H */ #include "irc_std.h" #include "debug.h" /* these define what characters do, colour inverse, underline, bold and all off */ #define COLOUR_TAG '\003' /* ^C */ #define REV_TOG '\026' /* ^V */ #define UND_TOG '\037' /* ^_ */ #define BOLD_TOG '\002' /* ^B */ #define ALL_OFF '\017' /* ^O */ #define FULL_OFF '\004' /* internal, should be different than all others */ #define IRCD_BUFFER_SIZE 1024 #define BIG_BUFFER_SIZE (IRCD_BUFFER_SIZE * 4) #ifndef INPUT_BUFFER_SIZE #define INPUT_BUFFER_SIZE 1536 /* INPUT_BUFFER_SIZE: irc servers generally accept 512 bytes of input per line. Assuming the shortest considerable command begins with "PRIVMSG x :" and ends with a linefeed, this leaves 500 bytes of space for text. In dcc-chats, the line length is unlimited. In ircII, the input buffer is utf-8 encoded. This means that certain european characters take two bytes of space and most asian characters take three bytes of space. ( Reference: http://www.utf-8.com/ ) However, in some encodings that are used in IRC (such as ISO-8859-1 and SHIFT-JIS), some to most of those characters only take 1 byte of space. ( References: http://en.wikipedia.com/wiki/ISO_8859-1 http://en.wikipeda.com/wiki/SJIS ) Therefore, to be able to send a full 500-character line regardless of what characters it contains, we need 1500 bytes of free buffer space. We also need room for the command used to send the message - for example, "/msg bisqwit,#nipponfever,#gurb ". For that space, we use an arbitrarily chosen number that is bigger than 20. As a result, INPUT_BUFFER_SIZE is now set to 1536 (0x600). - Bisqwit */ #endif /* INPUT_BUFFER_SIZE */ #include "struct.h" #ifdef notdef # define DAEMON_UID 1 #endif #if 0 /* blundernet */ #define NICKNAME_LEN 9 #endif #define NAME_LEN 255 #define REALNAME_LEN 50 #define PATH_LEN 1024 #if defined(__hpux) || defined(hpux) || defined(_HPUX_SOURCE) # undef HPUX # define HPUX # ifndef HPUX7 # define killpg(pgrp,sig) kill(-pgrp,sig) # endif /* !HPUX7 */ #endif /* __hpux || hpux || _HPUX_SOURCE */ #if defined(__sgi) # define USE_TERMIO #endif /* __sgi */ #ifdef DGUX # define USE_TERMIO # define inet_addr(x) inet_network(x) /* dgux lossage */ #endif /* DGUX */ /* * Lame Linux doesn't define X_OK in a non-broken header file, so * we define it here.. */ #if !defined(X_OK) # define X_OK 1 #endif #ifdef __BORLANDC__ # define F_OK 0 # define W_OK 2 # define R_OK 4 #endif #ifdef __osf__ # if __osf__ # define _BSD # endif /* __osf__ */ #endif /* __osf__ */ #if defined(UNICOS) && !defined(USE_TERMIO) # define USE_TERMIO #endif /* UNICOS */ /* systems without getwd() can lose, if this dies */ #if defined(NEED_GETCWD) # define getcwd(b, c) getwd(b); #endif /* NEED_GETCWD */ #if defined(ISC22) || defined(ISC30) # define USE_TERMIO # define ISC #endif /* ISC22 || ISC30 */ #if defined(_AUX_SOURCE) && !defined(USE_TERMIO) # define USE_TERMIO #endif /* _AUX_SOURCE && !USE_TERMIO */ #ifdef MAIL_DIR # undef UNIX_MAIL # define UNIX_MAIL MAIL_DIR #endif /* MAIL_DIR */ #ifndef MIN # define MIN(a,b) ((a < b) ? (a) : (b)) #endif /* MIN */ #ifndef MAX # define MAX(a,b) ((a < b) ? (b) : (a)) #endif /* MAX */ /* flags used by who() and whoreply() for who_mask */ #define WHO_OPS 0x0001 #define WHO_NAME 0x0002 #define WHO_ZERO 0x0004 #define WHO_CHOPS 0x0008 #define WHO_FILE 0x0010 #define WHO_HOST 0x0020 #define WHO_SERVER 0x0040 #define WHO_HERE 0x0080 #define WHO_AWAY 0x0100 #define WHO_NICK 0x0200 #define WHO_LUSERS 0x0400 #define WHO_REAL 0x0800 #ifndef _Windows # define FAR #endif #ifdef ICONV_CONST_ARG2 #define iconv_const const #else #define iconv_const #endif /* * declared in irc.c */ extern u_char *cut_buffer; extern u_char oper_command; extern int irc_port; extern int send_text_flag; extern int irc_io_loop; extern int break_io_processing; extern int use_flow_control; extern u_char *joined_nick; extern u_char *public_nick; extern u_char empty_string[]; extern u_char *zero; extern u_char *one; extern u_char irc_version[]; extern u_char *nickname; extern u_char *ircrc_file; extern u_char *ircquick_file; extern u_char FAR hostname[]; extern u_char FAR realname[]; extern u_char FAR username[]; extern u_char *send_umode; extern u_char *last_notify_nick; extern int away_set; extern int background; extern u_char *my_path; extern u_char *irc_path; extern u_char *irc_lib; extern u_char *args_str; extern u_char *invite_channel; extern int who_mask; extern u_char *who_name; extern u_char *who_host; extern u_char *who_server; extern u_char *who_file; extern u_char *who_nick; extern u_char *who_real; extern u_char *cannot_open; extern int dumb; extern int use_input; extern time_t idle_time; extern int waiting; extern u_char wait_nick[]; extern u_char whois_nick[]; extern u_char lame_wait_nick[]; extern char **environ; extern int current_numeric; extern int qflag; extern int bflag; extern int tflag; extern int client_default_icb; extern u_char *source_host; extern u_char *dcc_source_host; /* * XXX some of these should move to a new notice.h */ int irc_io(u_char *, void (*)(u_int, u_char *), int, int); void set_irchost(u_char *); void set_dcchost(u_char *); int wild_match(u_char *, u_char *); RETSIGTYPE irc_exit(void); void beep_em(int); void got_initial_version(u_char *); void maybe_load_ircrc(void); void load_ircrc(void); void load_ircquick(void); void parse_notice(u_char *, u_char **); void irc_quit(u_int, u_char *); void on_signal_occurred(int); typedef struct WhoisStuffStru { u_char *nick; u_char *user; u_char *host; u_char *channel; u_char *channels; u_char *name; u_char *server; u_char *server_stuff; u_char *away; int oper; int chop; int not_on; } WhoisStuff; /* Moved into here, because some weird CC's can't do (void *) */ typedef struct WhoisQueueStru { u_char *nick; /* nickname of whois'ed person(s) */ u_char *text; /* additional text */ int type; /* Type of WHOIS queue entry */ /* * called with func((WhoisStuff *)stuff, nick, text) */ void (*func)(WhoisStuff *, u_char *, u_char *); struct WhoisQueueStru *next; /* next element in queue */ } WhoisQueue; char *getenv(const char *); #ifdef _Windows typedef long off_t; extern u_char *get_path(int iVal); #endif #ifdef _Windows #define define_big_buffer(x) u_char *x = (u_char *) new_malloc(BIG_BUFFER_SIZE + 1) #define free_big_buffer(x) new_free(&x) #else #define define_big_buffer(x) u_char x[BIG_BUFFER_SIZE + 1] #define free_big_buffer(x) (0) #endif #ifdef _Windows #define IS_FULL_PATH(x) (x[0] == '/' || x[0] == '\\' || (x[0] && x[1] == ':')) #else #define IS_FULL_PATH(x) (x[0] == '/') #endif #endif /* __irc_h */