This repository has been archived on 2025-02-12. You can view files and clone it, but cannot push or open issues or pull requests.
NeoStats-NeoIRCd/contrib/lmh.diff

2589 lines
75 KiB
Diff
Raw Permalink Normal View History

2002-08-13 14:34:25 +00:00
diff -urN --exclude=CVS ircd-hybrid-7/doc/Makefile.in ircd-hybrid-7+lmh/doc/Makefile.in
--- ircd-hybrid-7/doc/Makefile.in Tue Jul 9 20:05:48 2002
+++ ircd-hybrid-7+lmh/doc/Makefile.in Fri Jul 12 15:31:51 2002
@@ -30,7 +30,7 @@
MANPAGES = ircd.8
CONFS = example.conf example.efnet.conf
-DEFAULTCONFS = ircd.motd kline.conf dline.conf
+DEFAULTCONFS = ircd.motd kline.conf dline.conf xline.conf
SSL_LIBS = @SSL_LIBS@
SSL_INCLUDES = @SSL_INCLUDES@
@@ -62,6 +62,9 @@
done
@for i in $(DEFAULTCONFS); do \
+ if test ! -f $$i; then \
+ touch $$i; \
+ fi; \
if test ! -f $(sysconfdir)/$$i; then \
echo $(INSTALL_DATA) $$i $(sysconfdir); \
$(INSTALL_DATA) $$i $(sysconfdir); \
diff -urN --exclude=CVS ircd-hybrid-7/include/class.h ircd-hybrid-7+lmh/include/class.h
--- ircd-hybrid-7/include/class.h Sat Mar 9 16:48:35 2002
+++ ircd-hybrid-7+lmh/include/class.h Fri Jul 12 15:31:19 2002
@@ -28,38 +28,47 @@
struct ConfItem;
struct Client;
-struct Class {
- struct Class* next; /* list node pointer */
- char* className;
- int type;
- int conFreq;
- int pingFreq;
- int maxLinks;
- long maxSendq;
- char* servname;
- int servport;
- int links;
+struct Class
+{
+ struct Class *next;
+ char *class_name;
+ int max_total;
+ int max_local;
+ int max_global;
+ int max_ident;
+ int max_sendq;
+ int con_freq;
+ int ping_freq;
+ int total;
};
+struct Class *ClassList;
-#define ClassName(x) ((x)->className)
-#define ClassType(x) ((x)->type)
-#define ConFreq(x) ((x)->conFreq)
-#define PingFreq(x) ((x)->pingFreq)
-#define MaxLinks(x) ((x)->maxLinks)
-#define MaxSendq(x) ((x)->maxSendq)
-#define Links(x) ((x)->links)
+#define ClassName(x) ((x)->class_name)
+#define ConFreq(x) ((x)->con_freq)
+#define MaxLocal(x) ((x)->max_local)
+#define MaxGlobal(x) ((x)->max_global)
+#define MaxIdent(x) ((x)->max_ident)
+#define MaxUsers(x) ((x)->max_total)
+#define PingFreq(x) ((x)->ping_freq)
+#define MaxSendq(x) ((x)->max_sendq)
+#define CurrUsers(x) ((x)->total)
#define ClassPtr(x) ((x)->c_class)
-#define ConfLinks(x) (ClassPtr(x)->links)
-#define ConfMaxLinks(x) (ClassPtr(x)->maxLinks)
+
#define ConfClassName(x) (ClassPtr(x)->class_name)
-#define ConfClassType(x) (ClassPtr(x)->type)
-#define ConfConFreq(x) (ClassPtr(x)->conFreq)
-#define ConfPingFreq(x) (ClassPtr(x)->pingFreq)
-#define ConfSendq(x) (ClassPtr(x)->maxSendq)
+#define ConfConFreq(x) (ClassPtr(x)->con_freq)
+#define ConfMaxLocal(x) (ClassPtr(x)->max_local)
+#define ConfMaxGlobal(x) (ClassPtr(x)->max_global)
+#define ConfMaxIdent(x) (ClassPtr(x)->max_ident)
+#define ConfMaxUsers(x) (ClassPtr(x)->max_total)
+#define ConfPingFreq(x) (ClassPtr(x)->ping_freq)
+#define ConfMaxSendq(x) (ClassPtr(x)->max_sendq)
+#define ConfCurrUsers(x) (ClassPtr(x)->total)
+
+void add_class(struct Class *);
-extern struct Class* ClassList; /* GLOBAL - class list */
+struct Class *make_class(void);
extern long get_sendq(struct Client *);
extern int get_con_freq(struct Class* );
@@ -69,7 +78,6 @@
extern void check_class(void);
extern void initclass(void);
extern void free_class(struct Class* );
-extern void add_class (char *, int, int, int, long);
extern void fix_class (struct ConfItem *, struct ConfItem *);
extern void report_classes (struct Client *);
diff -urN --exclude=CVS ircd-hybrid-7/include/client.h ircd-hybrid-7+lmh/include/client.h
--- ircd-hybrid-7/include/client.h Thu Jul 11 20:43:19 2002
+++ ircd-hybrid-7+lmh/include/client.h Fri Jul 12 15:31:19 2002
@@ -127,6 +127,7 @@
struct Client* prev;
struct Client* hnext;
struct Client* idhnext;
+ struct Client* hostnext;
struct Client* lnext; /* Used for Server->servers/users */
struct Client* lprev; /* Used for Server->servers/users */
@@ -438,6 +439,8 @@
#define FLAGS2_OPER_DIE 0x0800 /* oper can die */
#define FLAGS2_OPER_REHASH 0x1000 /* oper can rehash */
#define FLAGS2_OPER_ADMIN 0x2000 /* oper can set umode +a */
+#define FLAGS2_OPER_XLINE 0x4000 /* oper can xline */
+#define FLAGS2_OPER_FLOOD_EXEMPT 0x8000 /* oper can flood freely */
#define FLAGS2_OPER_FLAGS (FLAGS2_OPER_GLOBAL_KILL | \
FLAGS2_OPER_REMOTE | \
FLAGS2_OPER_UNKLINE | \
@@ -446,6 +449,8 @@
FLAGS2_OPER_K | \
FLAGS2_OPER_DIE | \
FLAGS2_OPER_REHASH| \
+ FLAGS2_OPER_XLINE | \
+ FLAGS2_OPER_FLOOD_EXEMPT | \
FLAGS2_OPER_ADMIN)
#define FLAGS2_CBURST 0x10000 /* connection burst being sent */
@@ -563,12 +568,16 @@
#define SetOperN(x) ((x)->flags2 |= FLAGS2_OPER_N)
#define IsOperK(x) ((x)->flags2 & FLAGS2_OPER_K)
#define SetOperK(x) ((x)->flags2 |= FLAGS2_OPER_K)
+#define IsOperXline(x) ((x)->flags2 & FLAGS2_OPER_XLINE)
+#define SetOperXline(x) ((x)->flags2 |= FLAGS2_OPER_XLINE)
#define IsOperDie(x) ((x)->flags2 & FLAGS2_OPER_DIE)
#define SetOperDie(x) ((x)->flags2 |= FLAGS2_OPER_DIE)
#define IsOperRehash(x) ((x)->flags2 & FLAGS2_OPER_REHASH)
#define SetOperRehash(x) ((x)->flags2 |= FLAGS2_OPER_REHASH)
#define IsOperAdmin(x) ((x)->flags2 & FLAGS2_OPER_ADMIN)
#define SetOperAdmin(x) ((x)->flags2 |= FLAGS2_OPER_ADMIN)
+#define IsOperFloodExempt(x) ((x)->flags2 & FLAGS2_OPER_FLOOD_EXEMPT)
+#define SetOperFloodExempt(x) ((x)->flags2 |= FLAGS2_OPER_FLOOD_EXEMPT)
#define IsFloodDone(x) ((x)->flags2 & FLAGS2_FLOODDONE)
#define SetFloodDone(x) ((x)->flags2 |= FLAGS2_FLOODDONE)
diff -urN --exclude=CVS ircd-hybrid-7/include/config.h ircd-hybrid-7+lmh/include/config.h
--- ircd-hybrid-7/include/config.h Tue Jul 9 20:05:51 2002
+++ ircd-hybrid-7+lmh/include/config.h Fri Jul 12 15:31:19 2002
@@ -102,6 +102,7 @@
#define CPATH ETCPATH "IRCD.CONF" /* config file */
#define KPATH ETCPATH "KLINE.CONF" /* kline file */
#define DLPATH ETCPATH "DLINE.CONF" /* dline file */
+#define XPATH ETCPATH "XLINE.CONF" /* xline file */
#define GPATH LOGPATH "GLINE.LOG" /* gline logfile */
#define RPATH ETCPATH "IRCD.RSA" /* RSA private key file */
#define MPATH ETCPATH "IRCD.MOTD" /* MOTD filename */
@@ -148,6 +149,7 @@
#define CPATH ETCPATH "/ircd.conf" /* ircd.conf file */
#define KPATH ETCPATH "/kline.conf" /* kline file */
#define DLPATH ETCPATH "/dline.conf" /* dline file */
+#define XPATH ETCPATH "/xline.conf" /* xline file */
#define GPATH LOGPATH "/gline.log" /* gline logfile */
#define RPATH ETCPATH "/ircd.rsa" /* ircd rsa private keyfile */
#define MPATH ETCPATH "/ircd.motd" /* MOTD file */
@@ -197,6 +199,18 @@
*/
#undef TS5_ONLY
+/* USE_ASCII_CASEMAP
+ *
+ * Under rfc1459, the characters {}|~ are the lowercase of []\^ so a
+ * nick of [foo] is the same as {foo} and a channel #[] is the same as
+ * #{}. If this is defined they will no longer be treated as lowercase
+ * of each other, so [foo] and {foo} could be two seperate people.
+ *
+ * Note: this must be the same network wide or you will have problems.
+ * Your locale(1) must also be set to "C".
+ */
+#undef USE_ASCII_CASEMAP
+
/* USE_LOGFILE - log errors and such to LPATH
* If you wish to have the server send 'vital' messages about server
* to a logfile, define USE_LOGFILE.
@@ -353,6 +367,9 @@
* these disabled, who knows. keep this enabled during development.
*/
#define INVARIANTS
+
+#define RELNAME "+lmh4"
+#define IRCDNAME PATCHLEVEL RELNAME
#define CONFIG_H_LEVEL_7
diff -urN --exclude=CVS ircd-hybrid-7/include/config.h.dist ircd-hybrid-7+lmh/include/config.h.dist
--- ircd-hybrid-7/include/config.h.dist Wed Jun 19 16:17:44 2002
+++ ircd-hybrid-7+lmh/include/config.h.dist Fri Jul 12 15:31:19 2002
@@ -187,6 +187,18 @@
*/
#undef HIDE_SPOOF_IPS
+/* USE_ASCII_CASEMAP
+ *
+ * Under rfc1459, the characters {}|~ are the lowercase of []\^ so a
+ * nick of [foo] is the same as {foo} and a channel #[] is the same as
+ * #{}. If this is defined they will no longer be treated as lowercase
+ * of each other, so [foo] and {foo} could be two seperate people.
+ *
+ * Note: this must be the same network wide or you will have problems.
+ * Your locale(1) must also be set to "C".
+ */
+#undef USE_ASCII_CASEMAP
+
/* USE_LOGFILE - log errors and such to LPATH
* If you wish to have the server send 'vital' messages about server
* to a logfile, define USE_LOGFILE.
diff -urN --exclude=CVS ircd-hybrid-7/include/handlers.h ircd-hybrid-7+lmh/include/handlers.h
--- ircd-hybrid-7/include/handlers.h Sat Jan 5 04:14:28 2002
+++ ircd-hybrid-7+lmh/include/handlers.h Fri Jul 12 15:31:19 2002
@@ -95,5 +95,9 @@
extern void m_unregistered(struct Client*, struct Client*, int, char**);
extern void m_unsupported(struct Client*, struct Client*, int, char**);
+#ifdef FL_DEBUG
+extern void mo_hash(struct Client*, struct Client*, int, char**);
+#endif
+
#endif /* INCLUDED_handlers_h */
diff -urN --exclude=CVS ircd-hybrid-7/include/hash.h ircd-hybrid-7+lmh/include/hash.h
--- ircd-hybrid-7/include/hash.h Fri May 24 19:34:07 2002
+++ ircd-hybrid-7+lmh/include/hash.h Fri Jul 12 15:31:19 2002
@@ -39,6 +39,9 @@
*/
#define CH_MAX 16384
+/* hostname hash table size */
+#define HOST_MAX 131072
+
/*
* RESV hash table size
*
@@ -79,6 +82,10 @@
extern struct Client* find_client(const char* name);
extern struct Client* find_server(const char* name);
extern struct Client* hash_find_server(const char* name);
+
+struct Client *find_hostname(const char *);
+void del_from_hostname_hash_table(const char *, struct Client *);
+void add_to_hostname_hash_table(const char *, struct Client *);
extern void add_to_resv_hash_table(const char *name,
struct ResvChannel *resv_p);
diff -urN --exclude=CVS ircd-hybrid-7/include/irc_string.h ircd-hybrid-7+lmh/include/irc_string.h
--- ircd-hybrid-7/include/irc_string.h Fri May 24 19:34:07 2002
+++ ircd-hybrid-7+lmh/include/irc_string.h Fri Jul 12 15:31:19 2002
@@ -115,11 +115,16 @@
/*
* character macros
*/
+#ifndef USE_ASCII_CASEMAP
extern const unsigned char ToLowerTab[];
#define ToLower(c) (ToLowerTab[(unsigned char)(c)])
extern const unsigned char ToUpperTab[];
#define ToUpper(c) (ToUpperTab[(unsigned char)(c)])
+#else
+#define ToLower(c) tolower(c)
+#define ToUpper(c) toupper(c)
+#endif
extern const unsigned int CharAttrs[];
diff -urN --exclude=CVS ircd-hybrid-7/include/modules.h ircd-hybrid-7+lmh/include/modules.h
--- ircd-hybrid-7/include/modules.h Fri May 24 21:38:09 2002
+++ ircd-hybrid-7+lmh/include/modules.h Fri Jul 12 15:31:19 2002
@@ -97,6 +97,9 @@
extern struct Message eob_msgtab;
extern struct Message error_msgtab;
extern struct Message gline_msgtab;
+#ifdef FL_DEBUG
+extern struct Message hash_msgtab;
+#endif
extern struct Message help_msgtab;
extern struct Message info_msgtab;
extern struct Message invite_msgtab;
diff -urN --exclude=CVS ircd-hybrid-7/include/s_conf.h ircd-hybrid-7+lmh/include/s_conf.h
--- ircd-hybrid-7/include/s_conf.h Thu Jul 11 20:51:05 2002
+++ ircd-hybrid-7+lmh/include/s_conf.h Fri Jul 12 15:32:42 2002
@@ -161,6 +161,8 @@
#define CONF_OPER_REHASH 0x0040
#define CONF_OPER_DIE 0x0080
#define CONF_OPER_ADMIN 0x0100
+#define CONF_OPER_XLINE 0x0200
+#define CONF_OPER_FLOOD_EXEMPT 0x0400
struct config_file_entry
{
@@ -168,6 +170,7 @@
char *configfile;
char *klinefile;
char *dlinefile;
+ char *xlinefile;
char *glinefile;
@@ -230,6 +233,7 @@
int throttle_time;
int use_egd;
int ping_cookie;
+ int use_global_limits;
int use_help;
#ifdef HAVE_LIBCRYPTO
struct EncCapability *default_cipher_preference;
@@ -317,8 +321,15 @@
extern struct admin_info AdminInfo; /* defined in ircd.c */
/* End GLOBAL section */
-dlink_list temporary_klines;
-dlink_list temporary_ip_klines;
+#define TEMP_MIN 1
+#define TEMP_HOUR 2
+#define TEMP_DAY 3
+#define TEMP_WEEK 4
+
+dlink_list temporary_min;
+dlink_list temporary_hour;
+dlink_list temporary_day;
+dlink_list temporary_week;
extern void clear_ip_hash_table(void);
extern void iphash_stats(struct Client *,struct Client *,int,char **,FBFILE*);
@@ -352,7 +363,7 @@
extern char *oper_flags_as_string(int);
extern char *oper_privs_as_string(struct Client *, int);
-extern int find_u_conf(char*, char*, char *);
+extern int find_u_conf(char*, char*, char *, int);
extern struct ConfItem *find_x_conf(char*);
extern struct ConfItem* find_tkline(const char*, const char*, struct irc_inaddr *);
@@ -378,9 +389,15 @@
const char *oper_reason,
const char *current_date, time_t cur_time );
extern void add_temp_kline(struct ConfItem *);
+extern void add_temp_dline(struct ConfItem *);
extern void report_temp_klines(struct Client *);
extern void show_temp_klines(struct Client *, dlink_list *);
-extern void cleanup_tklines(void *notused);
+
+extern void cleanup_temps_min(void *);
+extern void cleanup_temps_hour(void *);
+extern void cleanup_temps_day(void *);
+extern void cleanup_temps_week(void *);
+
extern const char *get_conf_name(KlineType);
extern int rehash (int);
@@ -399,6 +416,7 @@
/* XXX consider moving these into kdparse.h */
extern void parse_k_file(FBFILE *fb);
extern void parse_d_file(FBFILE *fb);
+extern void parse_x_file(FBFILE *fb);
extern char *getfield(char *newline);
extern char *get_oper_name(struct Client *client_p);
@@ -410,11 +428,11 @@
#define NOT_AUTHORIZED (-1)
#define SOCKET_ERROR (-2)
#define I_LINE_FULL (-3)
-#define TOO_MANY (-4)
-#define BANNED_CLIENT (-5)
-#define TOO_FAST (-6)
-
-#define CLEANUP_TKLINES_TIME 60
+#define BANNED_CLIENT (-4)
+#define TOO_FAST (-5)
+#define TOO_MANY_LOCAL (-6)
+#define TOO_MANY_GLOBAL (-7)
+#define TOO_MANY_IDENT (-8)
#endif /* INCLUDED_s_conf_h */
diff -urN --exclude=CVS ircd-hybrid-7/include/s_serv.h ircd-hybrid-7+lmh/include/s_serv.h
--- ircd-hybrid-7/include/s_serv.h Fri May 24 19:34:08 2002
+++ ircd-hybrid-7+lmh/include/s_serv.h Fri Jul 12 15:31:19 2002
@@ -74,12 +74,13 @@
#define CAP_TBURST 0x00040000 /* supports TBURST */
#define CAP_PARA 0x00080000 /* supports invite broadcasting for +p */
+#define CAP_UNKLN 0x00100000 /* supports remote unkline */
#define CAP_MASK (CAP_QS | CAP_EX | CAP_CHW | \
CAP_IE | CAP_EOB | CAP_KLN | \
CAP_GLN | CAP_HOPS | CAP_AOPS | \
CAP_UID | CAP_ZIP | CAP_ENC | \
- CAP_KNOCK | CAP_PARA)
+ CAP_KNOCK | CAP_PARA | CAP_UNKLN)
#ifdef HAVE_LIBZ
#define CAP_ZIP_SUPPORTED CAP_ZIP
diff -urN --exclude=CVS ircd-hybrid-7/include/supported.h ircd-hybrid-7+lmh/include/supported.h
--- ircd-hybrid-7/include/supported.h Sun Apr 28 12:38:22 2002
+++ ircd-hybrid-7+lmh/include/supported.h Fri Jul 12 15:31:19 2002
@@ -29,6 +29,12 @@
#include "channel.h"
#include "ircd_defs.h"
+#ifndef USE_ASCII_CASEMAP
+#define CASEMAP "rfc1459"
+#else
+#define CASEMAP "ascii"
+#endif
+
#define FEATURES "WALLCHOPS"\
"%s%s%s%s" \
" MODES=%i" \
@@ -51,14 +57,13 @@
" PREFIX=%s" \
" CHANMODES=%s" \
" NETWORK=%s" \
- " CHARSET=rfc1459" \
- " CASEMAPPING=rfc1459" \
+ " CASEMAPPING=%s" \
" CALLERID"
#define FEATURES2VALUES ConfigServerHide.disable_local_channels ? "#" : "#&", \
"(ohv)@%+", "beI,k,l,imnpsta", \
- ServerInfo.network_name
-
+ ServerInfo.network_name, CASEMAP
+
/*
* - from mirc's versions.txt
*
diff -urN --exclude=CVS ircd-hybrid-7/modules/Makefile.in ircd-hybrid-7+lmh/modules/Makefile.in
--- ircd-hybrid-7/modules/Makefile.in Sun Jun 16 12:31:25 2002
+++ ircd-hybrid-7+lmh/modules/Makefile.in Fri Jul 12 15:31:19 2002
@@ -103,7 +103,8 @@
m_wallops.c \
m_who.c \
m_whois.c \
- m_whowas.c
+ m_whowas.c \
+ m_xline.c
ALL_SRCS = $(CORE_SRCS) \
$(SRCS)
diff -urN --exclude=CVS ircd-hybrid-7/modules/m_kline.c ircd-hybrid-7+lmh/modules/m_kline.c
--- ircd-hybrid-7/modules/m_kline.c Thu Jul 11 23:29:55 2002
+++ ircd-hybrid-7+lmh/modules/m_kline.c Fri Jul 12 15:31:19 2002
@@ -90,12 +90,17 @@
static int valid_user_host(struct Client *source_p, char *user, char *host);
static int valid_wild_card(char *user, char *host);
static int already_placed_kline(struct Client*, char*, char*);
+
static void apply_kline(struct Client *source_p, struct ConfItem *aconf,
const char *reason, const char *oper_reason,
const char *current_date, time_t cur_time);
-
+static void apply_dline(struct Client *source_p, struct ConfItem *aconf,
+ const char *reason, const char *oper_reason,
+ const char *current_date, time_t cur_time);
static void apply_tkline(struct Client *source_p, struct ConfItem *aconf,
const char *current_date, int temporary_kline_time);
+static void apply_tdline(struct Client *source_p, struct ConfItem *aconf,
+ const char *current_date, int temporary_kline_time);
char buffer[IRCD_BUFSIZE];
@@ -315,7 +320,7 @@
tkline_time = atoi(parv[2]);
if (find_u_conf((char *)source_p->user->server,
- source_p->username, source_p->host))
+ source_p->username, source_p->host, CONF_OPER_K))
{
sendto_realops_flags(FLAGS_ALL, L_ALL,
"*** Received K-Line for [%s@%s] [%s], from %s!%s@%s on %s",
@@ -395,6 +400,43 @@
check_klines();
}
+/* apply_dline
+ *
+ * input - dline info
+ * output - none
+ * side effects - dline is added to hashtable
+ */
+static void apply_dline(struct Client *source_p, struct ConfItem *aconf,
+ const char *reason, const char *oper_reason,
+ const char *current_date, time_t cur_time)
+{
+ add_conf_by_address(aconf->host, CONF_DLINE, NULL, aconf);
+ WriteKlineOrDline(DLINE_TYPE, source_p, NULL, aconf->host, reason,
+ oper_reason, current_date, cur_time);
+}
+
+/* apply_tdline
+ *
+ * input - dline info
+ * output - none
+ * side effects - tdline is added
+ */
+static void apply_tdline(struct Client *source_p, struct ConfItem *aconf,
+ const char *current_date, int tdline_time)
+{
+ aconf->hold = CurrentTime + tdline_time;
+ add_temp_dline(aconf);
+ sendto_realops_flags(FLAGS_ALL, L_ALL,
+ "%s added temporary %d min. D-Line for [%s] [%s]",
+ source_p->name, tdline_time/60,
+ aconf->host, aconf->passwd);
+
+ sendto_one(source_p, ":%s NOTICE %s :Added temporary %d min. D-Line for [%s]",
+ me.name, source_p->name, tdline_time/60, aconf->host);
+ ilog(L_TRACE, "%s added temporary %d min. D-Line for [%s] [%s]",
+ source_p->name, tdline_time/60, aconf->host, aconf->passwd);
+}
+
/*
* valid_tkline()
*
@@ -429,8 +471,8 @@
if(result == 0)
result = 1;
- if(result > (24*60))
- result = (24*60); /* Max it at 24 hours */
+ if(result > (24*60*7*4))
+ result = (24*60*7*4); /* Max it at 4 weeks */
result = (time_t)result * (time_t)60; /* turn it into seconds */
@@ -575,6 +617,8 @@
char dlbuffer[1024];
const char* current_date;
time_t cur_time;
+ time_t tdline_time = 0;
+ int loc = 0;
if (!IsOperK(source_p))
{
@@ -583,7 +627,23 @@
return;
}
- dlhost = parv[1];
+ loc++;
+
+ tdline_time = valid_tkline(source_p, parv[loc]);
+
+ if(tdline_time == -1)
+ return;
+ else if(tdline_time)
+ loc++;
+
+ if(parc < loc+1)
+ {
+ sendto_one(source_p, form_str(ERR_NEEDMOREPARAMS),
+ me.name, source_p->name, "DLINE");
+ return;
+ }
+
+ dlhost = parv[loc];
strlcpy(cidr_form_host, dlhost, HOSTLEN);
cidr_form_host[HOSTLEN] = '\0';
@@ -594,7 +654,7 @@
me.name, parv[0]);
return;
#else
- if (!(target_p = find_chasing(source_p, parv[1], NULL)))
+ if (!(target_p = find_chasing(source_p, parv[loc], NULL)))
return;
if(!target_p->user)
@@ -660,14 +720,15 @@
#endif
}
+ loc++;
- if (parc > 2) /* host :reason */
+ if (parc >= loc+1) /* host :reason */
{
- if (valid_comment(source_p,parv[2]) == 0)
+ if (valid_comment(source_p,parv[loc]) == 0)
return;
- if(*parv[2])
- reason = parv[2];
+ if(*parv[loc])
+ reason = parv[loc];
else
reason = "No reason";
}
@@ -735,18 +796,23 @@
oper_reason++;
}
- ircsprintf(dlbuffer, "%s (%s)",reason, current_date);
-
aconf->status = CONF_DLINE;
DupString(aconf->host, dlhost);
- DupString(aconf->passwd, dlbuffer);
+
+ if(tdline_time)
+ {
+ ircsprintf(dlbuffer, "Temporary D-line %d min. - %s (%s)",
+ (int)(tdline_time/60), reason, current_date);
+ DupString(aconf->passwd, dlbuffer);
+ apply_tdline(source_p, aconf, current_date, tdline_time);
+ }
+ else
+ {
+ ircsprintf(dlbuffer, "%s (%s)",reason, current_date);
+ DupString(aconf->passwd, dlbuffer);
+ apply_dline(source_p, aconf, reason, oper_reason, current_date, cur_time);
+ }
- add_conf_by_address(aconf->host, CONF_DLINE, NULL, aconf);
- /*
- * Write dline to configuration file
- */
- WriteKlineOrDline(DLINE_TYPE, source_p, NULL, dlhost, reason,
- oper_reason, current_date, cur_time);
check_klines();
} /* m_dline() */
diff -urN --exclude=CVS ircd-hybrid-7/modules/m_trace.c ircd-hybrid-7+lmh/modules/m_trace.c
--- ircd-hybrid-7/modules/m_trace.c Sun Jul 7 01:45:08 2002
+++ ircd-hybrid-7+lmh/modules/m_trace.c Fri Jul 12 15:31:19 2002
@@ -278,9 +278,9 @@
}
for (cltmp = ClassList; doall && cltmp; cltmp = cltmp->next)
- if (Links(cltmp) > 0)
+ if (CurrUsers(cltmp) > 0)
sendto_one(source_p, form_str(RPL_TRACECLASS), me.name,
- parv[0], ClassName(cltmp), Links(cltmp));
+ parv[0], ClassName(cltmp), CurrUsers(cltmp));
sendto_one(source_p, form_str(RPL_ENDOFTRACE),me.name, parv[0],tname);
}
diff -urN --exclude=CVS ircd-hybrid-7/modules/m_unkline.c ircd-hybrid-7+lmh/modules/m_unkline.c
--- ircd-hybrid-7/modules/m_unkline.c Wed Jun 26 19:38:57 2002
+++ ircd-hybrid-7+lmh/modules/m_unkline.c Fri Jul 12 15:31:19 2002
@@ -42,15 +42,17 @@
#include "s_gline.h"
#include "parse.h"
#include "modules.h"
+#include "s_serv.h"
static void mo_unkline(struct Client*, struct Client*, int, char**);
+static void ms_unkline(struct Client*, struct Client*, int, char**);
static void mo_undline(struct Client*, struct Client*, int, char**);
static void mo_ungline(struct Client*, struct Client*, int, char**);
struct Message msgtabs[] = {
{"UNKLINE", 0, 0, 2, 0, MFLG_SLOW, 0,
- {m_unregistered, m_not_oper, m_error, mo_unkline}},
+ {m_unregistered, m_not_oper, ms_unkline, mo_unkline}},
{"UNDLINE", 0, 0, 2, 0, MFLG_SLOW, 0,
{m_unregistered, m_not_oper, m_error, mo_undline}},
{"UNGLINE", 0, 0, 2, 0, MFLG_SLOW, 0,
@@ -76,8 +78,10 @@
2002-08-13 14:45:13 +00:00
const char *_version = "$Revision: 1.2 $";
2002-08-13 14:34:25 +00:00
#endif
+static void remove_permkline_match(struct Client *, char *, char *);
static int flush_write(struct Client *, FBFILE* , char *, char *);
-static int remove_tkline_match(char *,char *);
+static int remove_temp_match(char *,char *);
+static int remove_temp_match_list(char *, char *, dlink_list *);
/*
@@ -93,19 +97,14 @@
static void mo_unkline (struct Client *client_p,struct Client *source_p,
int parc,char *parv[])
{
- FBFILE *in, *out;
- int pairme=0,error_on_write = NO;
- char buf[BUFSIZE], buff[BUFSIZE], temppath[BUFSIZE], *user, *host, *p;
- const char *filename; /* filename to use for unkline */
- mode_t oldumask;
+ char *user, *host;
- ircsprintf(temppath, "%s.tmp", ConfigFileEntry.klinefile);
-
if (!IsOperUnkline(source_p))
{
sendto_one(source_p,":%s NOTICE %s :You need unkline = yes;",me.name,parv[0]);
return;
}
+
if (parc < 2)
{
sendto_one(source_p, form_str(ERR_NEEDMOREPARAMS),
@@ -135,7 +134,21 @@
return;
}
- if (remove_tkline_match(host, user))
+ /* possible remote kline.. */
+ if(parc > 3)
+ {
+ if(irccmp(parv[2], "ON") == 0)
+ {
+ sendto_server(NULL, source_p, NULL, CAP_UNKLN, NOCAPS, LL_ICLIENT,
+ ":%s UNKLINE %s %s %s",
+ source_p->name, parv[3], user, host);
+
+ if(match(parv[3], me.name) == 0)
+ return;
+ }
+ }
+
+ if(remove_temp_match(host, user))
{
sendto_one(source_p,
":%s NOTICE %s :Un-klined [%s@%s] from temporary k-lines",
@@ -148,10 +161,92 @@
return;
}
+ remove_permkline_match(source_p, host, user);
+}
+
+/* ms_unkline()
+ *
+ * input - pointer to servere
+ * - pointer to client
+ * - parm count
+ * - params
+ * output - none
+ * side effects - kline is removed if matching shared {} is found.
+ */
+static void ms_unkline(struct Client *client_p, struct Client *source_p,
+ int parc, char *parv[])
+{
+ char *kuser;
+ char *khost;
+
+ if(parc != 4)
+ return;
+
+ /* parv[0] parv[1] parv[2] parv[3]
+ * oper target server user host */
+ sendto_server(client_p, source_p, NULL, CAP_UNKLN, NOCAPS, LL_ICLIENT,
+ ":%s UNKLINE %s %s %s",
+ parv[0], parv[1], parv[2], parv[3]);
+
+ kuser = parv[2];
+ khost = parv[3];
+
+ if(!match(parv[1], me.name))
+ return;
+
+ if(!IsPerson(source_p))
+ return;
+
+ if(find_u_conf((char *)source_p->user->server, source_p->username,
+ source_p->host, CONF_OPER_UNKLINE))
+ {
+ sendto_realops_flags(FLAGS_ALL, L_ALL,
+ "*** Received Un-kline for [%s@%s], from %s",
+ kuser, khost, get_oper_name(source_p));
+
+ if(remove_temp_match(khost, kuser))
+ {
+ sendto_one(source_p,
+ ":%s NOTICE %s :Un-klined [%s@%s] from temporary k-lines",
+ me.name, parv[0],kuser, khost);
+
+ sendto_realops_flags(FLAGS_ALL, L_ALL,
+ "%s has removed the temporary K-Line for: [%s@%s]",
+ get_oper_name(source_p), kuser, khost);
+
+ ilog(L_NOTICE, "%s removed temporary K-Line for [%s@%s]",
+ source_p->name, kuser, khost);
+ return;
+ }
+
+ remove_permkline_match(source_p, khost, kuser);
+ }
+}
+
+/* remove_permkline_match()
+ *
+ * hunts for a permanent kline, and removes it.
+ */
+static void remove_permkline_match(struct Client *source_p,
+ char *host, char *user)
+{
+ FBFILE *in, *out;
+ int pairme = 0;
+ int error_on_write = NO;
+ char buf[BUFSIZE];
+ char buff[BUFSIZE];
+ char temppath[BUFSIZE];
+ const char *filename;
+ mode_t oldumask;
+ char *p;
+
+ ircsprintf(temppath, "%s.tmp", ConfigFileEntry.klinefile);
+
filename = get_conf_name(KLINE_TYPE);
+
if ((in = fbopen(filename, "r")) == 0)
{
- sendto_one(source_p, ":%s NOTICE %s :Cannot open %s", me.name, parv[0],
+ sendto_one(source_p, ":%s NOTICE %s :Cannot open %s", me.name, source_p->name,
filename);
return;
}
@@ -159,8 +254,8 @@
oldumask = umask(0);
if ((out = fbopen(temppath, "w")) == 0)
{
- sendto_one(source_p, ":%s NOTICE %s :Cannot open %s", me.name, parv[0],
- temppath);
+ sendto_one(source_p, ":%s NOTICE %s :Cannot open %s",
+ me.name, source_p->name, temppath);
fbclose(in);
umask(oldumask);
return;
@@ -231,6 +326,11 @@
{
sendto_one(source_p, ":%s NOTICE %s :No K-Line for %s@%s",
me.name, source_p->name,user,host);
+
+ if(!MyClient(source_p))
+ sendto_realops_flags(FLAGS_ALL, L_ALL,
+ "*** Remote Un-Kline for [%s@%s] is not K-Lined.",
+ user, host);
return;
}
@@ -245,6 +345,8 @@
return;
}
+
+
/*
* flush_write()
*
@@ -287,30 +389,45 @@
* Side effects: Any matching tklines are removed.
*/
static int
-remove_tkline_match(char *host, char *user)
+remove_temp_match(char *host, char *user)
{
- struct ConfItem *tk_c;
- dlink_node *tk_n;
+ if(remove_temp_match_list(host, user, &temporary_hour) ||
+ remove_temp_match_list(host, user, &temporary_day) ||
+ remove_temp_match_list(host, user, &temporary_min) ||
+ remove_temp_match_list(host, user, &temporary_week))
+ return YES;
+
+ return NO;
+}
+
+static int
+remove_temp_match_list(char *host, char *user, dlink_list *temp_list)
+{
+ struct ConfItem *aconf;
+ dlink_node *ptr;
struct irc_inaddr addr, caddr;
int nm_t, cnm_t, bits, cbits;
nm_t = parse_netmask(host, &addr, &bits);
- for (tk_n=temporary_klines.head; tk_n; tk_n=tk_n->next)
+ for(ptr = temp_list->head; ptr; ptr = ptr->next)
{
- tk_c = (struct ConfItem*)tk_n->data;
- cnm_t = parse_netmask(tk_c->host, &caddr, &cbits);
- if (cnm_t != nm_t || irccmp(user, tk_c->user))
+ aconf = (struct ConfItem*)ptr->data;
+
+ cnm_t = parse_netmask(aconf->host, &caddr, &cbits);
+
+ if (cnm_t != nm_t || (user && irccmp(user, aconf->user)))
continue;
- if ((nm_t==HM_HOST && !irccmp(tk_c->host, host)) ||
+
+ if ((nm_t==HM_HOST && !irccmp(aconf->host, host)) ||
(nm_t==HM_IPV4 && bits==cbits && match_ipv4(&addr, &caddr, bits))
#ifdef IPV6
|| (nm_t==HM_IPV6 && bits==cbits && match_ipv6(&addr, &caddr, bits))
#endif
)
{
- dlinkDelete(tk_n, &temporary_klines);
- free_dlink_node(tk_n);
- delete_one_address_conf(tk_c->host, tk_c);
+ dlinkDelete(ptr, temp_list);
+ free_dlink_node(ptr);
+ delete_one_address_conf(aconf->host, aconf);
return YES;
}
}
@@ -333,7 +450,8 @@
FBFILE* in;
FBFILE* out;
char buf[BUFSIZE], buff[BUFSIZE], temppath[BUFSIZE], *p;
- const char *filename,*cidr, *found_cidr;
+ const char *filename, *found_cidr;
+ char *cidr;
int pairme = NO, error_on_write = NO;
mode_t oldumask;
@@ -356,6 +474,18 @@
return;
}
#endif
+
+ if(remove_temp_match(cidr, NULL))
+ {
+ sendto_one(source_p,
+ ":%s NOTICE %s :Un-dlined [%s] from temporary D-lines",
+ me.name, parv[0], cidr);
+ sendto_realops_flags(FLAGS_ALL, L_ALL,
+ "%s has removed the temporary D-Line for: [%s]",
+ get_oper_name(source_p), cidr);
+ ilog(L_NOTICE, "%s removed temporary D-Line for [%s]", parv[0], cidr);
+ return;
+ }
filename = get_conf_name(DLINE_TYPE);
diff -urN --exclude=CVS ircd-hybrid-7/modules/m_xline.c ircd-hybrid-7+lmh/modules/m_xline.c
--- ircd-hybrid-7/modules/m_xline.c Wed Dec 31 19:00:00 1969
+++ ircd-hybrid-7+lmh/modules/m_xline.c Fri Jul 12 15:31:19 2002
@@ -0,0 +1,146 @@
+/* modules/m_xline.c
+ * Copyright (C) 2002 Hybrid Development Team
+ *
+ * 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 AUTHOR ``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 AUTHOR 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.
+ *
2002-08-13 14:45:13 +00:00
+ * $Id: lmh.diff,v 1.2 2002/08/13 14:45:00 fishwaldo Exp $
2002-08-13 14:34:25 +00:00
+ */
+
+#include "stdinc.h"
+#include "tools.h"
+#include "handlers.h"
+#include "send.h"
+#include "channel.h"
+#include "client.h"
+#include "common.h"
+#include "config.h"
+#include "class.h"
+#include "ircd.h"
+#include "numeric.h"
+#include "memory.h"
+#include "s_log.h"
+#include "s_serv.h"
+#include "whowas.h"
+#include "irc_string.h"
+#include "hash.h"
+#include "msg.h"
+#include "parse.h"
+#include "modules.h"
+#include "s_conf.h"
+
+static void mo_xline(struct Client *client_p, struct Client *source_p,
+ int parc, char *parv[]);
+
+struct Message xline_msgtab = {
+ "XLINE", 0, 0, 3, 0, MFLG_SLOW, 0,
+ {m_unregistered, m_not_oper, m_ignore, mo_xline}
+};
+
+void
+_modinit(void)
+{
+ mod_add_cmd(&xline_msgtab);
+}
+
+void
+_moddeinit(void)
+{
+ mod_del_cmd(&xline_msgtab);
+}
+
2002-08-13 14:45:13 +00:00
+char *_version = "$Revision: 1.2 $";
2002-08-13 14:34:25 +00:00
+
+/* m_xline()
+ *
+ * parv[1] - thing to xline
+ * parv[2] - optional type/reason
+ * parv[3] - reason
+ */
+void
+mo_xline(struct Client *client_p, struct Client *source_p,
+ int parc, char *parv[])
+{
+ char buffer[BUFSIZE*2];
+ FBFILE *out;
+ struct ConfItem *aconf;
+ char *reason;
+ int xtype = 1;
+
+ if(!IsOperXline(source_p))
+ {
+ sendto_one(source_p, ":%s NOTICE %s :You need xline = yes;",
+ me.name, source_p->name);
+ return;
+ }
+
+ if(parc > 3)
+ {
+ xtype = atoi(parv[2]);
+ reason = parv[3];
+ }
+ else
+ {
+ if(IsDigit(*parv[2]))
+ {
+ xtype = atoi(parv[2]);
+ reason = "No Reason";
+ }
+ else
+ reason = parv[2];
+ }
+
+ sendto_realops_flags(FLAGS_ALL, L_ALL,
+ "%s added X-line for [%s] [%s]",
+ get_oper_name(source_p), parv[1], reason);
+ sendto_one(source_p, ":%s NOTICE %s :Added X-line for [%s] [%s]",
+ me.name, source_p->name, parv[1], reason);
+ ilog(L_TRACE, "%s added X-line for [%s] [%s]",
+ source_p->name, parv[1], reason);
+
+ aconf = make_conf();
+ aconf->status = CONF_XLINE;
+ DupString(aconf->host, parv[1]);
+ DupString(aconf->passwd, reason);
+ aconf->port = xtype;
+
+ collapse(aconf->host);
+ conf_add_x_conf(aconf);
+
+ if((out = fbopen(ConfigFileEntry.xlinefile, "a")) == NULL)
+ {
+ sendto_realops_flags(FLAGS_ALL, L_ALL,
+ "*** Problem opening %s", ConfigFileEntry.xlinefile);
+ return;
+ }
+
+ ircsprintf(buffer, "\"%s\",\"%d\",\"%s\",\"%s\",%lu\n",
+ parv[1], xtype, reason, get_oper_name(source_p), CurrentTime);
+
+ if(fbputs(buffer, out) == -1)
+ sendto_realops_flags(FLAGS_ALL, L_ALL,
+ "*** Problem writing to %s", ConfigFileEntry.xlinefile);
+
+ fbclose(out);
+}
diff -urN --exclude=CVS ircd-hybrid-7/src/class.c ircd-hybrid-7+lmh/src/class.c
--- ircd-hybrid-7/src/class.c Fri May 24 19:34:45 2002
+++ ircd-hybrid-7+lmh/src/class.c Fri Jul 12 15:31:19 2002
@@ -45,19 +45,19 @@
struct Class* ClassList;
-static struct Class *make_class()
+struct Class *
+make_class(void)
{
struct Class *tmp;
tmp = (struct Class *)MyMalloc(sizeof(struct Class));
- tmp->className = NULL;
- tmp->servname = NULL;
+ memset(tmp, 0, sizeof(struct Class));
return tmp;
}
void free_class(struct Class *tmp)
{
- MyFree(tmp->className);
+ MyFree(tmp->class_name);
MyFree((char *)tmp);
}
@@ -161,57 +161,40 @@
return (DEFAULT_CONNECTFREQUENCY);
}
-/*
- * add_class
+/* add_class()
*
- * inputs - classname to use
- * - ping frequency
- * - connection frequency
- * - maximum links
- * - max sendq
- * output - NONE
- * side effects -
- * When adding a class, check to see if it is already present first.
- * if so, then update the information for that class, rather than create
- * a new entry for it and later delete the old entry.
- * if no present entry is found, then create a new one and add it in
- * immediately after the first one (class 0).
+ * input - class to add
+ * output -
+ * side effects - class is added to ClassList if new, else old class
+ * is updated with new values.
*/
-void add_class(char *classname,
- int ping,
- int confreq,
- int maxli,
- long sendq)
+void
+add_class(struct Class *classptr)
{
- struct Class *t, *p;
+ struct Class *tmpptr;
- if(!classname)
- return;
+ tmpptr = find_class(classptr->class_name);
- t = find_class(classname);
- if (t == ClassList)
- {
- p = make_class();
- p->next = t->next;
- t->next = p;
- }
+ if(tmpptr == ClassList)
+ {
+ classptr->next = tmpptr->next;
+ tmpptr->next = classptr;
+ CurrUsers(classptr) = 0;
+ }
else
- p = t;
- Debug((DEBUG_DEBUG,
- "Add Class %s: p %x t %x - cf: %d pf: %d ml: %d sq: %l",
- classname, p, t, confreq, ping, maxli, sendq));
-
- /* classname already known to be non NULL */
- MyFree(ClassName(p));
- DupString(ClassName(p),classname);
- ConFreq(p) = confreq;
- PingFreq(p) = ping;
- MaxLinks(p) = maxli;
- MaxSendq(p) = (sendq > 0) ? sendq : DEFAULT_SENDQ;
- if (p != t)
- Links(p) = 0;
+ {
+ MaxUsers(tmpptr) = MaxUsers(classptr);
+ MaxLocal(tmpptr) = MaxLocal(classptr);
+ MaxGlobal(tmpptr) = MaxGlobal(classptr);
+ MaxIdent(tmpptr) = MaxIdent(classptr);
+ PingFreq(tmpptr) = PingFreq(classptr);
+ MaxSendq(tmpptr) = MaxSendq(classptr);
+
+ free_class(classptr);
+ }
}
+
/*
* find_class
*
@@ -249,14 +232,10 @@
for (cltmp2 = cltmp = ClassList; cltmp; cltmp = cltmp2->next)
{
- Debug((DEBUG_DEBUG,
- "ClassName %s Class %d : CF: %d PF: %d ML: %d LI: %d SQ: %ld",
- ClassName(cltmp),ClassType(cltmp), ConFreq(cltmp), PingFreq(cltmp),
- MaxLinks(cltmp), Links(cltmp), MaxSendq(cltmp)));
- if (MaxLinks(cltmp) < 0)
+ if (MaxUsers(cltmp) < 0)
{
cltmp2->next = cltmp->next;
- if (Links(cltmp) <= 0)
+ if (CurrUsers(cltmp) <= 0)
free_class(cltmp);
}
else
@@ -275,14 +254,11 @@
{
ClassList = make_class();
- ClassType(ClassList) = 0;
DupString(ClassName(ClassList),"default");
ConFreq(ClassList) = DEFAULT_CONNECTFREQUENCY;
PingFreq(ClassList) = DEFAULT_PINGFREQUENCY;
- MaxLinks(ClassList) = ConfigFileEntry.maximum_links;
+ MaxUsers(ClassList) = 1;
MaxSendq(ClassList) = DEFAULT_SENDQ;
- Links(ClassList) = 0;
- ClassList->next = NULL;
}
/*
@@ -299,7 +275,8 @@
for (cltmp = ClassList; cltmp; cltmp = cltmp->next)
sendto_one(source_p, form_str(RPL_STATSYLINE), me.name, source_p->name,
'Y', ClassName(cltmp), PingFreq(cltmp), ConFreq(cltmp),
- MaxLinks(cltmp), MaxSendq(cltmp));
+ MaxUsers(cltmp), MaxSendq(cltmp),
+ MaxLocal(cltmp), MaxIdent(cltmp), MaxGlobal(cltmp), MaxIdent(cltmp));
}
/*
@@ -311,7 +288,7 @@
*/
long get_sendq(struct Client *client_p)
{
- int sendq = DEFAULT_SENDQ, retc = BAD_CLIENT_CLASS;
+ int sendq = DEFAULT_SENDQ;
dlink_node *ptr;
struct Class *cl;
struct ConfItem *aconf;
@@ -326,7 +303,7 @@
if ( !(cl = aconf->c_class))
continue;
- if (ClassType(cl) > retc)
+ if(ClassName(cl))
sendq = MaxSendq(cl);
}
return sendq;
diff -urN --exclude=CVS ircd-hybrid-7/src/client.c ircd-hybrid-7+lmh/src/client.c
--- ircd-hybrid-7/src/client.c Thu Jul 11 20:43:24 2002
+++ ircd-hybrid-7+lmh/src/client.c Fri Jul 12 15:31:19 2002
@@ -998,6 +998,9 @@
if (HasID(source_p))
del_from_id_hash_table(source_p->user->id, source_p);
+
+ if(ConfigFileEntry.use_global_limits)
+ del_from_hostname_hash_table(source_p->host, source_p);
/* again, this is all that is needed */
}
diff -urN --exclude=CVS ircd-hybrid-7/src/hash.c ircd-hybrid-7+lmh/src/hash.c
--- ircd-hybrid-7/src/hash.c Fri Jun 7 17:59:17 2002
+++ ircd-hybrid-7+lmh/src/hash.c Fri Jul 12 15:31:19 2002
@@ -39,6 +39,8 @@
#include "fdlist.h"
#include "fileio.h"
#include "memory.h"
+#include "msg.h"
+#include "handlers.h"
/* New hash code */
/*
@@ -47,11 +49,19 @@
static unsigned int hash_channel_name(const char* name);
+#ifdef FL_DEBUG
+struct Message hash_msgtab = {
+ "HASH", 0, 0, 1, 0, MFLG_SLOW, 0,
+ {m_ignore, m_ignore, m_ignore, mo_hash}
+};
+#endif
+
#ifdef DEBUGMODE
static struct HashEntry* clientTable = NULL;
static struct HashEntry* channelTable = NULL;
static struct HashEntry* idTable = NULL;
static struct HashEntry* resvTable = NULL;
+static struct HashEntry *hostTable = NULL;
static int clhits;
static int clmiss;
static int chhits;
@@ -64,6 +74,7 @@
static struct HashEntry channelTable[CH_MAX];
static struct HashEntry idTable[U_MAX];
static struct HashEntry resvTable[R_MAX];
+static struct HashEntry hostTable[HOST_MAX];
#endif
@@ -93,7 +104,6 @@
}
/*
- *
* look in whowas.c for the missing ...[WW_MAX]; entry
*/
@@ -175,6 +185,17 @@
return (h & (CH_MAX - 1));
}
+static unsigned int
+hash_hostname(const char *name)
+{
+ int i = 30;
+ unsigned int h = 0;
+
+ while(*name && --i)
+ h = (h << 4) - (h + (unsigned char)ToLower(*name++));
+
+ return (h & (HOST_MAX - 1));
+}
/*
* hash_resv_channel()
@@ -232,7 +253,7 @@
}
static void
-clear_channel_hash_table()
+clear_channel_hash_table(void)
{
#ifdef DEBUGMODE
chmiss = 0;
@@ -245,6 +266,16 @@
}
static void
+clear_hostname_hash_table(void)
+{
+#ifdef DEBUGMODE
+ if(!hostTable)
+ hostTable = (struct HashEntry *)MyMalloc(HOST_MAX * sizeof(struct HashEntry));
+#endif
+ memset(hostTable, 0, sizeof(struct HashEntry) * HOST_MAX);
+}
+
+static void
clear_resv_hash_table()
{
#ifdef DEBUGMODE
@@ -263,6 +294,7 @@
clear_client_hash_table();
clear_channel_hash_table();
clear_id_hash_table();
+ clear_hostname_hash_table();
clear_resv_hash_table();
}
@@ -301,6 +333,24 @@
++clientTable[hashv].hits;
}
+void
+add_to_hostname_hash_table(const char *hostname, struct Client *client_p)
+{
+ unsigned int hashv;
+
+ assert(hostname != NULL);
+ assert(client_p != NULL);
+
+ if(hostname == NULL || client_p == NULL)
+ return;
+
+ hashv = hash_hostname(hostname);
+ client_p->hostnext = (struct Client *)hostTable[hashv].list;
+ hostTable[hashv].list = (void *)client_p;
+ hostTable[hashv].links++;
+ hostTable[hashv].hits++;
+}
+
/*
* add_to_resv_hash_table
*/
@@ -445,6 +495,37 @@
}
}
+void
+del_from_hostname_hash_table(const char *hostname, struct Client *client_p)
+{
+ struct Client *target_p;
+ struct Client *last_p = NULL;
+ unsigned int hashv;
+
+ if(hostname == NULL || client_p == NULL)
+ return;
+
+ hashv = hash_hostname(hostname);
+ for(target_p = (struct Client *)hostTable[hashv].list; target_p;
+ target_p = target_p->hostnext)
+ {
+ if(target_p == client_p)
+ {
+ if(last_p)
+ last_p->hostnext = client_p->hostnext;
+ else
+ hostTable[hashv].list = (void *)client_p->hostnext;
+
+ if(hostTable[hashv].links > 0)
+ hostTable[hashv].links--;
+
+ return;
+ }
+
+ last_p = target_p;
+ }
+}
+
/*
* del_from_resv_hash_table()
*/
@@ -552,6 +633,25 @@
return (NULL);
}
+struct Client *
+find_hostname(const char *hostname)
+{
+ struct Client *target_p;
+ unsigned int hashv;
+
+ if(hostname == NULL)
+ return NULL;
+
+ hashv = hash_hostname(hostname);
+ for(target_p = (struct Client *)hostTable[hashv].list; target_p;
+ target_p = target_p->hostnext)
+ {
+ if(irccmp(target_p->host, hostname) == 0)
+ return target_p;
+ }
+
+ return NULL;
+}
/*
* Whats happening in this next loop ? Well, it takes a name like
@@ -784,8 +884,72 @@
return(NULL);
}
+#ifdef FL_DEBUG
+void
+mo_hash(struct Client *source_p, struct Client *client_p,
+ int argc,char *argv[])
+{
+ int i;
+ struct Client *target_p;
+ u_long used_count;
+ int deepest_link;
+ u_long average_link;
+ int this_link;
+ int node[11];
+
+ for(i = 0; i < 11; i++)
+ node[i] = 0;
+
+ deepest_link = used_count = this_link = average_link = 0;
+
+ sendto_one(source_p, ":%s %d %s :Hostname hash statistics",
+ me.name, RPL_STATSDEBUG, source_p->name);
+
+ for(i = 0; i < HOST_MAX; i++)
+ {
+ this_link = 0;
+
+ for(target_p = hostTable[i].list; target_p; target_p = target_p->hostnext)
+ {
+ used_count++;
+ this_link++;
+ }
+ if(this_link > deepest_link)
+ deepest_link = this_link;
+ if(this_link >= 10)
+ {
+ int j = 0;
+ for(target_p = hostTable[i].list; target_p; target_p = target_p->hostnext)
+ {
+ sendto_one(source_p, ":%s %d %s :Node[%d][%d] %s",
+ me.name, RPL_STATSDEBUG, source_p->name, i, j,
+ target_p->host);
+ j++;
+ }
+ this_link = 10;
+ }
+ node[this_link]++;
+ }
+ for(i = 1; i < 11; i++)
+ average_link += node[i] * i;
+
+ sendto_one(source_p, ":%s %d %s :Hash Size: %d - Used %lu %f%% - Free %lu %f%%",
+ me.name, RPL_STATSDEBUG, source_p->name, HOST_MAX,
+ used_count, (float)((used_count / HOST_MAX) * 100),
+ HOST_MAX - used_count,
+ (float)((float)((float)(HOST_MAX - used_count) / HOST_MAX) * 100));
+
+ sendto_one(source_p, ":%s %d %s :Deepest Link: %d - Average %f",
+ me.name, RPL_STATSDEBUG, source_p->name, deepest_link,
+ (float)(average_link / used_count));
+
+ for(i = 0; i < 11; i++)
+ sendto_one(source_p, ":%s %d %s :Nodes with %d entries: %d",
+ me.name, RPL_STATSDEBUG, source_p->name, i, node[i]);
+}
+#endif
diff -urN --exclude=CVS ircd-hybrid-7/src/ircd.c ircd-hybrid-7+lmh/src/ircd.c
--- ircd-hybrid-7/src/ircd.c Thu Jul 11 20:51:08 2002
+++ ircd-hybrid-7+lmh/src/ircd.c Fri Jul 12 15:31:19 2002
@@ -261,6 +261,8 @@
STRING, "File to use for ircd.conf"},
{"klinefile", &ConfigFileEntry.klinefile,
STRING, "File to use for klines.conf"},
+ {"xlinefile", &ConfigFileEntry.xlinefile,
+ STRING, "File to use for xlines.conf"},
{"logfile", &logFileName,
STRING, "File to use for ircd.log"},
{"pidfile", &pidFileName,
@@ -568,10 +570,12 @@
memset(&oper_list, 0, sizeof(oper_list));
memset(&lazylink_channels, 0, sizeof(lazylink_channels));
+#if 0
lclient_list.head = lclient_list.tail = NULL;
oper_list.head = oper_list.tail = NULL;
serv_list.head = serv_list.tail = NULL;
global_serv_list.head = global_serv_list.tail = NULL;
+#endif
GlobalClientList = &me; /* Pointer to beginning of Client list */
@@ -590,6 +594,7 @@
ConfigFileEntry.klinefile = KPATH; /* Server kline file */
ConfigFileEntry.dlinefile = DLPATH; /* dline file */
ConfigFileEntry.glinefile = GPATH; /* gline log file */
+ ConfigFileEntry.xlinefile = XPATH;
myargv = argv;
umask(077); /* better safe than sorry --SRB */
@@ -740,7 +745,10 @@
eventAddIsh("cleanup_glines", cleanup_glines, NULL, CLEANUP_GLINES_TIME);
- eventAddIsh("cleanup_tklines", cleanup_tklines, NULL, CLEANUP_TKLINES_TIME);
+ eventAddIsh("cleanup_temps_min", cleanup_temps_min, NULL, 60);
+ eventAddIsh("cleanup_temps_hour", cleanup_temps_hour, NULL, 3600);
+ eventAddIsh("cleanup_temps_day", cleanup_temps_day, NULL, 86400);
+ eventAddIsh("cleanup_temps_week", cleanup_temps_week, NULL, 604800);
/* We want try_connections to be called as soon as possible now! -- adrian */
/* No, 'cause after a restart it would cause all sorts of nick collides */
diff -urN --exclude=CVS ircd-hybrid-7/src/ircd_lexer.l ircd-hybrid-7+lmh/src/ircd_lexer.l
--- ircd-hybrid-7/src/ircd_lexer.l Thu Jul 11 19:40:22 2002
+++ ircd-hybrid-7+lmh/src/ircd_lexer.l Fri Jul 12 15:31:19 2002
@@ -127,6 +127,7 @@
exempt { return EXEMPT; }
fakename { return FAKENAME; }
flatten_links { return FLATTEN_LINKS; }
+flood_exempt { return FLOOD_EXEMPT; }
fname_foperlog { return FNAME_FOPERLOG; }
fname_operlog { return FNAME_OPERLOG; }
fname_userlog { return FNAME_USERLOG; }
@@ -181,7 +182,9 @@
no_join_on_split { return NO_JOIN_ON_SPLIT; }
no_oper_flood { return NO_OPER_FLOOD; }
no_tilde { return NO_TILDE; }
-number_per_ip { return NUMBER_PER_IP; }
+number_per_ident { return NUMBER_PER_IDENT; }
+number_per_ip { return NUMBER_PER_IP; }
+number_per_ip_global { return NUMBER_PER_IP_GLOBAL; }
oper { return OPERATOR; }
oper_log { return OPER_LOG; }
operator { return OPERATOR; }
@@ -216,6 +219,7 @@
use_anonops { return USE_ANONOPS; }
use_egd { return USE_EGD; }
use_except { return USE_EXCEPT; }
+use_global_limits { return USE_GLOBAL_LIMITS; }
use_halfops { return USE_HALFOPS; }
use_help { return USE_HELP; }
use_invex { return USE_INVEX; }
@@ -227,6 +231,7 @@
vhost { return VHOST; }
vhost6 { return VHOST6; }
warn { return WARN; }
+xline { return XLINE; }
yes { return TYES; }
failed_oper_notice { return FAILED_OPER_NOTICE; }
diff -urN --exclude=CVS ircd-hybrid-7/src/ircd_parser.y ircd-hybrid-7+lmh/src/ircd_parser.y
--- ircd-hybrid-7/src/ircd_parser.y Thu Jul 11 19:40:22 2002
+++ ircd-hybrid-7+lmh/src/ircd_parser.y Fri Jul 12 15:33:17 2002
@@ -37,6 +37,7 @@
#include "event.h"
#include "s_log.h"
#include "client.h" /* for FLAGS_ALL only */
+#include "class.h"
#include "irc_string.h"
#include "ircdauth.h"
#include "memory.h"
@@ -57,6 +58,8 @@
int yyparse();
+static struct Class *yy_class = NULL;
+
static struct ConfItem *yy_achead = NULL;
static struct ConfItem *yy_aconf = NULL;
static struct ConfItem *yy_aprev = NULL;
@@ -70,12 +73,6 @@
static dlink_node *node;
-char *class_name_var;
-int class_ping_time_var;
-int class_number_per_ip_var;
-int class_max_number_var;
-int class_sendq_var;
-
static char *listener_address;
char *resv_reason;
@@ -130,6 +127,7 @@
%token FAILED_OPER_NOTICE
%token FAKENAME
%token FLATTEN_LINKS
+%token FLOOD_EXEMPT
%token FNAME_FOPERLOG
%token FNAME_OPERLOG
%token FNAME_USERLOG
@@ -188,7 +186,9 @@
%token NO_OPER_FLOOD
%token NO_TILDE
%token NUMBER
+%token NUMBER_PER_IDENT
%token NUMBER_PER_IP
+%token NUMBER_PER_IP_GLOBAL
%token OPERATOR
%token OPER_LOG
%token OPER_ONLY_UMODES
@@ -270,6 +270,7 @@
%token USE_ANONOPS
%token USE_EGD
%token USE_EXCEPT
+%token USE_GLOBAL_LIMITS
%token USE_HALFOPS
%token USE_HELP
%token USE_INVEX
@@ -280,6 +281,7 @@
%token VHOST6
%token WARN
%token WARN_NO_NLINE
+%token XLINE
%type <string> QSTRING
%type <number> NUMBER
@@ -749,8 +751,8 @@
oper_items: oper_items oper_item |
oper_item;
-oper_item: oper_name | oper_user | oper_password |
- oper_class | oper_global_kill | oper_remote |
+oper_item: oper_name | oper_user | oper_password | oper_flood_exempt |
+ oper_class | oper_global_kill | oper_remote | oper_xline |
oper_kline | oper_unkline | oper_gline | oper_nick_changes |
oper_die | oper_rehash | oper_admin | oper_rsa_public_key_file | error;
@@ -875,6 +877,10 @@
|
UNKLINE '=' TNO ';' { yy_achead->port &= ~CONF_OPER_UNKLINE; } ;
+oper_xline: XLINE '=' TYES ';' { yy_achead->port |= CONF_OPER_XLINE; }
+ |
+ XLINE '=' TNO ';' { yy_achead->port &= ~CONF_OPER_XLINE; };
+
oper_gline: GLINE '=' TYES ';' { yy_achead->port |= CONF_OPER_GLINE;}
|
GLINE '=' TNO ';' { yy_achead->port &= ~CONF_OPER_GLINE; };
@@ -895,28 +901,24 @@
|
ADMIN '=' TNO ';' { yy_achead->port &= ~CONF_OPER_ADMIN;} ;
+oper_flood_exempt: FLOOD_EXEMPT '=' TYES ';' { yy_achead->port |= CONF_OPER_FLOOD_EXEMPT; }
+ |
+ FLOOD_EXEMPT '=' TNO ';' { yy_achead->port &= ~CONF_OPER_FLOOD_EXEMPT; };
+
/***************************************************************************
* section class
***************************************************************************/
class_entry: CLASS
{
- MyFree(class_name_var);
- class_name_var = NULL;
- class_ping_time_var = 0;
- class_number_per_ip_var = 0;
- class_max_number_var = 0;
- class_sendq_var = 0;
+ yy_class = make_class();
}
'{' class_items '}' ';'
{
-
- add_class(class_name_var,class_ping_time_var,
- class_number_per_ip_var, class_max_number_var,
- class_sendq_var );
-
- MyFree(class_name_var);
- class_name_var = NULL;
+ if(yy_class->class_name)
+ add_class(yy_class);
+ else
+ free_class(yy_class);
};
class_items: class_items class_item |
@@ -925,6 +927,8 @@
class_item: class_name |
class_ping_time |
class_number_per_ip |
+ class_number_per_ip_global |
+ class_number_per_ident |
class_connectfreq |
class_max_number |
class_sendq |
@@ -932,33 +936,42 @@
class_name: NAME '=' QSTRING ';'
{
- MyFree(class_name_var);
- DupString(class_name_var, yylval.string);
+ DupString(yy_class->class_name, yylval.string);
};
class_ping_time: PING_TIME '=' timespec ';'
{
- class_ping_time_var = $3;
+ yy_class->ping_freq = $3;
};
class_number_per_ip: NUMBER_PER_IP '=' NUMBER ';'
{
- class_number_per_ip_var = $3;
+ yy_class->max_local = $3;
+ };
+
+class_number_per_ip_global: NUMBER_PER_IP_GLOBAL '=' NUMBER ';'
+ {
+ yy_class->max_global = $3;
+ };
+
+class_number_per_ident: NUMBER_PER_IDENT '=' NUMBER ';'
+ {
+ yy_class->max_ident = $3;
};
class_connectfreq: CONNECTFREQ '=' timespec ';'
{
- class_number_per_ip_var = $3;
+ yy_class->con_freq = $3;
};
class_max_number: MAX_NUMBER '=' NUMBER ';'
{
- class_max_number_var = $3;
+ yy_class->max_total = $3;
};
class_sendq: SENDQ '=' sizespec ';'
{
- class_sendq_var = $3;
+ yy_class->max_sendq = $3;
};
@@ -1303,6 +1316,7 @@
yy_aconf->name = NULL;
yy_aconf->user = NULL;
yy_aconf->host = NULL;
+ yy_aconf->port = CONF_OPER_K;
}
'{' shared_items '}' ';'
{
@@ -1313,7 +1327,8 @@
shared_items: shared_items shared_item |
shared_item;
-shared_item: shared_name | shared_user | error;
+shared_item: shared_name | shared_user | shared_kline |
+ shared_unkline | error;
shared_name: NAME '=' QSTRING ';'
{
@@ -1341,6 +1356,14 @@
}
};
+shared_kline: KLINE '=' TYES ';' { yy_aconf->port |= CONF_OPER_K; };
+ |
+ KLINE '=' TNO ';' { yy_aconf->port &= ~CONF_OPER_K; };
+
+shared_unkline: UNKLINE '=' TYES ';' { yy_aconf->port |= CONF_OPER_UNKLINE; };
+ |
+ UNKLINE '=' TNO ';' { yy_aconf->port &= ~CONF_OPER_UNKLINE; };
+
/***************************************************************************
* section connect
***************************************************************************/
@@ -1970,7 +1993,7 @@
general_oper_umodes |
general_caller_id_wait | general_default_floodcount |
general_min_nonwildcard |
- general_servlink_path | general_use_help |
+ general_servlink_path | general_use_global_limits | general_use_help |
general_default_cipher_preference |
general_compression_level | general_client_flood |
general_throttle_time | general_havent_read_conf |
@@ -2332,6 +2355,23 @@
{
ConfigFileEntry.ping_cookie = 0;
} ;
+
+general_use_global_limits: USE_GLOBAL_LIMITS '=' TYES ';'
+ {
+ if(ConfigFileEntry.use_global_limits == 0)
+ ilog(L_ERROR, "Ignoring config file entry 'use_global_limits = yes' "
+ "-- can only be changed on boot");
+ else
+ ConfigFileEntry.use_global_limits = 1;
+ }
+ | USE_GLOBAL_LIMITS '=' TNO ';'
+ {
+ if(ConfigFileEntry.use_global_limits == 1)
+ ilog(L_ERROR, "Ignoring config file entry 'use_global_limits = no' "
+ "-- can only be changed on boot");
+ else
+ ConfigFileEntry.use_global_limits = 0;
+ };
general_use_help: USE_HELP '=' TYES ';'
{
diff -urN --exclude=CVS ircd-hybrid-7/src/kdparse.c ircd-hybrid-7+lmh/src/kdparse.c
--- ircd-hybrid-7/src/kdparse.c Sat Jul 6 12:58:57 2002
+++ ircd-hybrid-7+lmh/src/kdparse.c Fri Jul 12 15:31:19 2002
@@ -110,6 +110,40 @@
}
}
+void
+parse_x_file(FBFILE *file)
+{
+ struct ConfItem *aconf;
+ char *reason_field = NULL;
+ char *host_field = NULL;
+ char *port_field = NULL;
+ char line[BUFSIZE];
+ char *p;
+
+ while(fbgets(line, sizeof(line), file))
+ {
+ if((p = strchr(line, '\n')))
+ *p = '\0';
+
+ if((*line == '\0') || (line[0] == '#'))
+ continue;
+
+ if((host_field = getfield(line)) == NULL)
+ continue;
+
+ if((port_field = getfield(NULL)) == NULL)
+ continue;
+
+ if((reason_field = getfield(NULL)) == NULL)
+ continue;
+
+ aconf = make_conf();
+ aconf->status = CONF_XLINE;
+ conf_add_fields(aconf, host_field, reason_field, "", port_field, NULL);
+ conf_add_x_conf(aconf);
+ }
+}
+
/*
* getfield
*
diff -urN --exclude=CVS ircd-hybrid-7/src/messages.tab ircd-hybrid-7+lmh/src/messages.tab
--- ircd-hybrid-7/src/messages.tab Fri Jun 28 14:18:49 2002
+++ ircd-hybrid-7+lmh/src/messages.tab Fri Jul 12 15:31:19 2002
@@ -238,7 +238,7 @@
/* 215 RPL_STATSILINE, */ ":%s 215 %s %c %s * %s@%s %d %s",
/* 216 RPL_STATSKLINE, */ ":%s 216 %s %c %s * %s :%s",
/* 217 RPL_STATSQLINE, */ ":%s 217 %s %c %s :%s",
-/* 218 RPL_STATSYLINE, */ ":%s 218 %s %c %s %d %d %d %lu",
+/* 218 RPL_STATSYLINE, */ ":%s 218 %s %c %s %d %d %d %lu %d.%d %d.%d",
/* 219 RPL_ENDOFSTATS, */ ":%s 219 %s %s :End of /STATS report",
/* 220 RPL_STATSPLINE, */ ":%s 220 %s %c %d %s %d :%s",
/* 221 RPL_UMODEIS, */ ":%s 221 %s %s",
diff -urN --exclude=CVS ircd-hybrid-7/src/modules.c ircd-hybrid-7+lmh/src/modules.c
--- ircd-hybrid-7/src/modules.c Tue Jun 4 01:30:16 2002
+++ ircd-hybrid-7+lmh/src/modules.c Fri Jul 12 15:31:19 2002
@@ -110,6 +110,10 @@
extern struct Message error_msgtab;
+#ifdef FL_DEBUG
+extern struct Message hash_msgtab;
+#endif
+
void
modules_init(void)
{
@@ -119,6 +123,9 @@
mod_add_cmd(&modlist_msgtab);
mod_add_cmd(&modrestart_msgtab);
mod_add_cmd(&error_msgtab);
+#ifdef FL_DEBUG
+ mod_add_cmd(&hash_msgtab);
+#endif
}
/* mod_find_path()
diff -urN --exclude=CVS ircd-hybrid-7/src/packet.c ircd-hybrid-7+lmh/src/packet.c
--- ircd-hybrid-7/src/packet.c Thu May 30 22:21:04 2002
+++ ircd-hybrid-7+lmh/src/packet.c Fri Jul 12 15:31:19 2002
@@ -74,7 +74,8 @@
else
{
- if (ConfigFileEntry.no_oper_flood && IsOper(client_p))
+ if(IsOper(client_p) && (ConfigFileEntry.no_oper_flood ||
+ IsOperFloodExempt(client_p)))
checkflood = 0;
/*
* Handle flood protection here - if we exceed our flood limit on
@@ -101,6 +102,10 @@
if(lclient_p->sent_parsed >= lclient_p->allow_read)
break;
}
+
+ /* can flood as much as they want until they sendq off. */
+ else if(IsOperFloodExempt(client_p))
+ ;
/* allow opers 4 times the amount of messages as users. why 4?
* why not. :) --fl_
diff -urN --exclude=CVS ircd-hybrid-7/src/s_conf.c ircd-hybrid-7+lmh/src/s_conf.c
--- ircd-hybrid-7/src/s_conf.c Thu Jul 11 20:51:08 2002
+++ ircd-hybrid-7+lmh/src/s_conf.c Fri Jul 12 15:31:19 2002
@@ -73,7 +73,8 @@
static void read_conf(FBFILE*);
static void clear_out_old_conf(void);
static void flush_deleted_I_P(void);
-static void expire_tklines(dlink_list *);
+static void add_temp_line(struct ConfItem *);
+static void expire_temps(dlink_list *, int);
static int is_attached(struct Client *client_p, struct ConfItem *aconf);
FBFILE* conf_fbfile_in;
@@ -433,18 +434,40 @@
(void)exit_client(client_p, source_p, &me, "Socket Error");
break;
- case TOO_MANY:
+ case TOO_MANY_LOCAL:
sendto_realops_flags(FLAGS_FULL, L_ALL,
- "Too many on IP for %s (%s).",
- get_client_name(source_p, SHOW_IP),
- source_p->localClient->sockhost);
+ "Too many local connections for %s",
+ get_client_name(source_p, SHOW_IP));
- ilog(L_INFO,"Too many connections on IP from %s.",
- get_client_name(source_p, SHOW_IP));
+ ilog(L_INFO,"Too many local connections from %s",
+ get_client_name(source_p, SHOW_IP));
ServerStats->is_ref++;
- (void)exit_client(client_p, source_p, &me,
- "No more connections allowed on that IP" );
+ exit_client(client_p, source_p, &me, "Too many host connections (local)");
+ break;
+
+ case TOO_MANY_GLOBAL:
+ sendto_realops_flags(FLAGS_FULL, L_ALL,
+ "Too many global connections for %s",
+ get_client_name(source_p, SHOW_IP));
+ ilog(L_INFO, "Too many global connections from %s",
+ get_client_name(source_p, SHOW_IP));
+
+ ServerStats->is_ref++;
+ exit_client(client_p, source_p, &me,
+ "Too many host connections (global)");
+ break;
+
+ case TOO_MANY_IDENT:
+ sendto_realops_flags(FLAGS_FULL, L_ALL,
+ "Too many user connections for %s",
+ get_client_name(source_p, SHOW_IP));
+ ilog(L_INFO, "Too many user connections from %s",
+ get_client_name(source_p, SHOW_IP));
+
+ ServerStats->is_ref++;
+ exit_client(client_p, source_p, &me,
+ "Too many user connections (global)");
break;
case I_LINE_FULL:
@@ -607,12 +630,55 @@
SetIpHash(client_p);
ip_found->count++;
- /* only check it if its non zero */
- if ( aconf->c_class /* This should never non NULL *grin* */ &&
- ConfConFreq(aconf) && ip_found->count > ConfConFreq(aconf))
+ if(ConfigFileEntry.use_global_limits)
+ {
+ struct Client *target_p;
+ int local_count = 0;
+ int global_count = 0;
+ int ident_count = 0;
+ int unidented = 0;
+
+ if(IsConfExemptLimits(aconf))
+ return(attach_conf(client_p, aconf));
+
+ if(*client_p->username == '~')
+ unidented = 1;
+
+ for(target_p = find_hostname(client_p->host); target_p;
+ target_p = target_p->hostnext)
+ {
+ if(irccmp(client_p->host, target_p->host) != 0)
+ continue;
+
+ if(MyConnect(target_p))
+ local_count++;
+
+ global_count++;
+
+ if(unidented)
+ {
+ if(*target_p->username == '~')
+ ident_count++;
+ }
+ else if(irccmp(target_p->username, client_p->username) == 0)
+ ident_count++;
+
+ if(ConfMaxLocal(aconf) && local_count >= ConfMaxLocal(aconf))
+ return TOO_MANY_LOCAL;
+ else if(ConfMaxGlobal(aconf) && global_count >= ConfMaxGlobal(aconf))
+ return TOO_MANY_GLOBAL;
+ else if(ConfMaxIdent(aconf) && ident_count >= ConfMaxIdent(aconf))
+ return TOO_MANY_IDENT;
+ }
+ }
+ else
+ {
+ /* only check it if its non zero */
+ if(aconf->c_class &&
+ ConfMaxLocal(aconf) && ip_found->count > ConfMaxLocal(aconf))
{
if(!IsConfExemptLimits(aconf))
- return TOO_MANY; /* Already at maximum allowed ip#'s */
+ return TOO_MANY_LOCAL; /* Already at maximum allowed ip#'s */
else
{
sendto_one(client_p,
@@ -620,6 +686,7 @@
me.name,client_p->name);
}
}
+ }
return (attach_conf(client_p, aconf) );
}
@@ -689,12 +756,11 @@
for(ptr = ip_hash_table[hash_index = hash_ip(ip_in)]; ptr;
ptr = ptr->next)
{
- if(!memcmp(&ptr->ip, ip_in, sizeof(struct irc_inaddr)))
- {
- return(ptr);
- }
+ if(memcmp(&ptr->ip, ip_in, sizeof(struct irc_inaddr)) == 0)
+ return(ptr);
}
- if ( (ptr = ip_hash_table[hash_index]) != (IP_ENTRY *)NULL )
+
+ if((ptr = ip_hash_table[hash_index]) != NULL)
{
if( free_ip_entries == (IP_ENTRY *)NULL)
outofmemory();
@@ -709,14 +775,14 @@
return(newptr);
}
- if( free_ip_entries == (IP_ENTRY *)NULL)
+ if( free_ip_entries == NULL)
outofmemory();
ptr = ip_hash_table[hash_index] = free_ip_entries;
free_ip_entries = ptr->next;
memcpy(&ptr->ip, ip_in, sizeof(struct irc_inaddr));
ptr->count = 0;
- ptr->next = (IP_ENTRY *)NULL;
+ ptr->next = NULL;
return (ptr);
}
@@ -904,10 +970,10 @@
{
if (aconf->status & CONF_CLIENT_MASK)
{
- if (ConfLinks(aconf) > 0)
- --ConfLinks(aconf);
+ if (ConfCurrUsers(aconf) > 0)
+ --ConfCurrUsers(aconf);
}
- if (ConfMaxLinks(aconf) == -1 && ConfLinks(aconf) == 0)
+ if (ConfMaxUsers(aconf) == -1 && ConfCurrUsers(aconf) == 0)
{
free_class(ClassPtr(aconf));
ClassPtr(aconf) = NULL;
@@ -973,7 +1039,7 @@
if ( (aconf->status & CONF_OPERATOR) == 0 )
{
if ((aconf->status & CONF_CLIENT) &&
- ConfLinks(aconf) >= ConfMaxLinks(aconf) && ConfMaxLinks(aconf) > 0)
+ ConfCurrUsers(aconf) >= ConfMaxUsers(aconf) && ConfMaxUsers(aconf) > 0)
{
if (!IsConfExemptLimits(aconf))
{
@@ -999,7 +1065,7 @@
aconf->clients++;
if (aconf->status & CONF_CLIENT_MASK)
- ConfLinks(aconf)++;
+ ConfCurrUsers(aconf)++;
return 0;
}
@@ -1104,7 +1170,7 @@
continue;
if (tmp->status & CONF_OPERATOR)
{
- if (tmp->clients < ConfMaxLinks(tmp))
+ if (tmp->clients < ConfMaxUsers(tmp))
return tmp;
else
continue;
@@ -1228,7 +1294,7 @@
* side effects - looks for a matches on all fields
*/
int
-find_u_conf(char *server,char *user,char *host)
+find_u_conf(char *server,char *user,char *host, int flag)
{
struct ConfItem *aconf;
@@ -1240,8 +1306,15 @@
if(match(aconf->name,server))
{
if (BadPtr(aconf->user) || BadPtr(aconf->host))
- return YES;
- if(match(aconf->user,user) && match(aconf->host,host))
+ {
+ if(aconf->port & flag)
+ return YES;
+ else
+ return NO;
+ }
+
+ if(match(aconf->user,user) && match(aconf->host,host) &&
+ aconf->port & flag)
return YES;
}
@@ -1385,7 +1458,7 @@
ConfigFileEntry.max_targets = MAX_TARGETS_DEFAULT;
DupString(ConfigFileEntry.servlink_path, SLPATH);
ConfigFileEntry.egdpool_path = NULL;
-
+
#ifdef HAVE_LIBCRYPTO
/* jdc -- This is our default value for a cipher. According to the
* CRYPTLINK document (doc/cryptlink.txt), BF/128 must be supported
@@ -1499,6 +1572,9 @@
if(ConfigChannel.use_anonops == -1)
ConfigChannel.use_anonops = 0;
+ if(ConfigFileEntry.use_global_limits == -1)
+ ConfigFileEntry.use_global_limits = 1;
+
GlobalSetOptions.idletime = (ConfigFileEntry.idletime * 60);
}
@@ -1513,14 +1589,6 @@
{
(void)collapse(aconf->host);
(void)collapse(aconf->user);
- Debug((DEBUG_NOTICE,
- "Read Init: (%d) (%s) (%s) (%s) (%d) (%d)",
- aconf->status,
- aconf->host ? aconf->host : "<NULL>",
- aconf->passwd ? aconf->passwd : "<NULL>",
- aconf->user ? aconf->user : "<NULL>",
- aconf->port,
- aconf->c_class ? ConfClassType(aconf): 0 ));
aconf->next = ConfigItemList;
ConfigItemList = aconf;
@@ -1649,40 +1717,80 @@
void
add_temp_kline(struct ConfItem *aconf)
{
- dlink_node *kill_node;
- kill_node = make_dlink_node();
- dlinkAdd(aconf, kill_node, &temporary_klines);
+ add_temp_line(aconf);
aconf->flags |= CONF_FLAGS_TEMPORARY;
add_conf_by_address(aconf->host, CONF_KILL, aconf->user, aconf);
}
-/*
- * cleanup_tklines
+/* add_temp_dline
*
- * inputs - NONE
- * output - NONE
- * side effects - call function to expire tklines
- * This is an event started off in ircd.c
+ * input - pointer to struct ConfItem
+ * output - none
+ * side effects - added to tkline link list and address hash
*/
+void add_temp_dline(struct ConfItem *aconf)
+{
+ add_temp_line(aconf);
+ aconf->flags |= CONF_FLAGS_TEMPORARY;
+ add_conf_by_address(aconf->host, CONF_DLINE, aconf->user, aconf);
+}
+
+void
+cleanup_temps_min(void *notused)
+{
+ expire_temps(&temporary_min, TEMP_MIN);
+}
+
void
-cleanup_tklines(void *notused)
+cleanup_temps_hour(void *notused)
{
- expire_tklines(&temporary_klines);
+ expire_temps(&temporary_hour, TEMP_HOUR);
+}
+
+void
+cleanup_temps_day(void *notused)
+{
+ expire_temps(&temporary_day, TEMP_DAY);
+}
+
+void
+cleanup_temps_week(void *notused)
+{
+ expire_temps(&temporary_week, TEMP_WEEK);
+}
+
+static void
+add_temp_line(struct ConfItem *aconf)
+{
+ dlink_node *m;
+
+ m = make_dlink_node();
+
+ if(aconf->hold > CurrentTime + (10080*60))
+ dlinkAdd(aconf, m, &temporary_week);
+ else if(aconf->hold > CurrentTime + (1440*60))
+ dlinkAdd(aconf, m, &temporary_day);
+ else if(aconf->hold > CurrentTime + (60*60))
+ dlinkAdd(aconf, m, &temporary_hour);
+ else
+ dlinkAdd(aconf, m, &temporary_min);
}
/*
- * expire_tklines
+ * expire_temps
*
- * inputs - tkline list pointer
+ * inputs - list pointer
+ * - type
* output - NONE
* side effects - expire tklines
*/
static void
-expire_tklines(dlink_list *tklist)
+expire_temps(dlink_list *tklist, int type)
{
dlink_node *kill_node;
dlink_node *next_node;
struct ConfItem *kill_ptr;
+
for (kill_node = tklist->head; kill_node; kill_node = next_node)
{
kill_ptr = kill_node->data;
@@ -1691,15 +1799,48 @@
if (kill_ptr->hold <= CurrentTime)
{
/* Alert opers that a TKline expired - Hwy */
- sendto_realops_flags(FLAGS_ALL, L_ALL,
+ if(kill_ptr->status & CONF_KILL)
+ sendto_realops_flags(FLAGS_ALL, L_ALL,
"Temporary K-line for [%s@%s] expired",
(kill_ptr->user) ? kill_ptr->user : "*",
(kill_ptr->host) ? kill_ptr->host : "*");
+ /* temp dline */
+ else
+ sendto_realops_flags(FLAGS_ALL, L_ALL,
+ "Temporary D-line for [%s] expired",
+ kill_ptr->host);
+
delete_one_address_conf(kill_ptr->host, kill_ptr);
dlinkDelete(kill_node, tklist);
free_dlink_node(kill_node);
}
+
+ else if((type == TEMP_WEEK && kill_ptr->hold < CurrentTime + 10080) ||
+ (type == TEMP_DAY && kill_ptr->hold < CurrentTime + 1440) ||
+ (type == TEMP_HOUR && kill_ptr->hold < CurrentTime + 60))
+ {
+ /* expires within the hour.. */
+ if(kill_ptr->hold < CurrentTime + (60*60))
+ {
+ dlinkDelete(kill_node, tklist);
+ dlinkAdd(kill_ptr, kill_node, &temporary_min);
+ }
+
+ /* expires within the day */
+ else if(kill_ptr->hold < CurrentTime + (1440*60))
+ {
+ dlinkDelete(kill_node, tklist);
+ dlinkAdd(kill_ptr, kill_node, &temporary_hour);
+ }
+
+ /* expires within the week */
+ else if(kill_ptr->hold < CurrentTime + (10080*60))
+ {
+ dlinkDelete(kill_node, tklist);
+ dlinkAdd(kill_ptr, kill_node, &temporary_day);
+ }
+ }
}
}
@@ -1740,6 +1881,15 @@
else
*privs_ptr++ = 'k';
+ if(port & CONF_OPER_XLINE)
+ {
+ if(client_p)
+ SetOperXline(client_p);
+ *privs_ptr++ = 'X';
+ }
+ else
+ *privs_ptr++ = 'x';
+
if(port & CONF_OPER_N)
{
if(client_p)
@@ -1800,7 +1950,13 @@
}
else
*privs_ptr++ = 'a';
-
+
+ if(port & CONF_OPER_FLOOD_EXEMPT)
+ {
+ if(client_p)
+ SetOperFloodExempt(client_p);
+ }
+
*privs_ptr = '\0';
return(privs_out);
@@ -1940,6 +2096,7 @@
{
FBFILE *file;
const char *filename, *kfilename, *dfilename; /* kline or conf filename */
+ const char *xfilename;
conf_fbfile_in = NULL;
@@ -1966,6 +2123,7 @@
/* set to 'undefined' */
ConfigChannel.use_halfops = -1;
ConfigChannel.use_anonops = -1;
+ ConfigFileEntry.use_global_limits = -1;
}
else
{
@@ -2012,6 +2170,25 @@
fbclose(file);
}
}
+
+ xfilename = ConfigFileEntry.xlinefile;
+ if(irccmp(filename, xfilename) && irccmp(kfilename, xfilename))
+ {
+ if((file = fbopen(xfilename, "r")) == NULL)
+ {
+ if(cold)
+ ilog(L_ERROR, "Failed reading xline file %s", xfilename);
+ else
+ sendto_realops_flags(FLAGS_ALL, L_ALL,
+ "Can't open %s file xlines could be missing!",
+ xfilename);
+ }
+ else
+ {
+ parse_x_file(file);
+ fbclose(file);
+ }
+ }
}
/*
@@ -2065,7 +2242,7 @@
assert(ClassList != NULL);
for (cltmp = ClassList->next; cltmp; cltmp = cltmp->next)
- MaxLinks(cltmp) = -1;
+ MaxUsers(cltmp) = -1;
clear_out_address_conf();
clear_special_conf(&x_conf);
@@ -2305,7 +2482,7 @@
return;
}
- if (ConfMaxLinks(aconf) < 0)
+ if (ConfMaxUsers(aconf) < 0)
{
ClassPtr(aconf) = find_class(0);
MyFree(aconf->className);
diff -urN --exclude=CVS ircd-hybrid-7/src/s_debug.c ircd-hybrid-7+lmh/src/s_debug.c
--- ircd-hybrid-7/src/s_debug.c Fri May 24 19:34:51 2002
+++ ircd-hybrid-7+lmh/src/s_debug.c Fri Jul 12 15:31:20 2002
@@ -44,7 +44,6 @@
#include "linebuf.h"
#include "memory.h"
-
/*
* Option string. Must be before #ifdef DEBUGMODE.
*/
@@ -393,11 +392,20 @@
number_servers_cached,
(int)mem_servers_cached);
- count_ip_hash(&number_ips_stored,&mem_ips_stored);
- sendto_one(source_p, ":%s %d %s :iphash %u(%d)",
- me.name, RPL_STATSDEBUG, source_p->name,
- number_ips_stored,
- (int)mem_ips_stored);
+ if(ConfigFileEntry.use_global_limits)
+ {
+ sendto_one(source_p, ":%s %d %s :hostname hash %d(%u)",
+ me.name, RPL_STATSDEBUG, source_p->name,
+ HOST_MAX, HOST_MAX * sizeof(struct HashEntry));
+ }
+ else
+ {
+ count_ip_hash(&number_ips_stored,&mem_ips_stored);
+ sendto_one(source_p, ":%s %d %s :iphash %u(%d)",
+ me.name, RPL_STATSDEBUG, source_p->name,
+ number_ips_stored,
+ (int)mem_ips_stored);
+ }
total_memory = totww + total_channel_memory + conf_memory +
class_count * sizeof(struct Class);
diff -urN --exclude=CVS ircd-hybrid-7/src/s_serv.c ircd-hybrid-7+lmh/src/s_serv.c
--- ircd-hybrid-7/src/s_serv.c Thu Jul 11 23:30:04 2002
+++ ircd-hybrid-7+lmh/src/s_serv.c Fri Jul 12 15:31:20 2002
@@ -104,6 +104,7 @@
{ "ZIP", CAP_ZIP },
{ "TBURST", CAP_TBURST },
{ "PARA", CAP_PARA },
+ { "UNKLN", CAP_UNKLN },
{ 0, 0 }
};
@@ -549,7 +550,6 @@
time_t next = 0;
struct Class* cltmp;
struct ConfItem* con_conf = NULL;
- int con_class = 0;
Debug((DEBUG_NOTICE,"Connection check at: %s", myctime(CurrentTime)));
@@ -586,10 +586,8 @@
*/
client_p = find_server(aconf->name);
- if (!client_p && (Links(cltmp) < MaxLinks(cltmp)) &&
- (!connecting || (ClassType(cltmp) > con_class)))
+ if (!client_p && (CurrUsers(cltmp) < MaxUsers(cltmp)) && !connecting)
{
- con_class = ClassType(cltmp);
con_conf = aconf;
/* We connect only one at time... */
connecting = TRUE;
diff -urN --exclude=CVS ircd-hybrid-7/src/s_user.c ircd-hybrid-7+lmh/src/s_user.c
--- ircd-hybrid-7/src/s_user.c Tue Jun 11 21:40:21 2002
+++ ircd-hybrid-7+lmh/src/s_user.c Fri Jul 12 15:31:20 2002
@@ -449,6 +449,9 @@
if (IsDead(source_p))
return CLIENT_EXITED;
+ if(ConfigFileEntry.use_global_limits)
+ add_to_hostname_hash_table(source_p->host, source_p);
+
source_p->umodes |= FLAGS_INVISIBLE;
Count.invisi++;
@@ -522,6 +525,9 @@
/* Increment our total user count here */
if (++Count.total > Count.max_tot)
Count.max_tot = Count.total;
+
+ if(ConfigFileEntry.use_global_limits)
+ add_to_hostname_hash_table(source_p->host, source_p);
source_p->servptr = find_server(user->server);
diff -urN --exclude=CVS ircd-hybrid-7/src/version.c.SH ircd-hybrid-7+lmh/src/version.c.SH
--- ircd-hybrid-7/src/version.c.SH Tue Nov 13 03:59:01 2001
+++ ircd-hybrid-7+lmh/src/version.c.SH Fri Jul 12 15:31:20 2002
@@ -51,11 +51,12 @@
#include "patchlevel.h"
#include "serno.h"
+#include "config.h"
char *generation = "$generation";
char *creation = "$creation";
char *platform = "$uname";
-char *ircd_version = PATCHLEVEL;
+char *ircd_version = IRCDNAME;
char *serno = SERIALNUM;
char *infotext[] =