X-Git-Url: http://git.pk910.de/?a=blobdiff_plain;f=ircd%2Fclass.c;h=216960534d2df75d48bd0e3e55173f4e7a40771a;hb=refs%2Fheads%2Fupstream;hp=53fd65edd1cb00a713add3bc7a43a2894b3134e5;hpb=ed9de9e9dd8a8b224147e97a85c0641a9c7e690a;p=ircu2.10.12-pk.git diff --git a/ircd/class.c b/ircd/class.c index 53fd65e..2169605 100644 --- a/ircd/class.c +++ b/ircd/class.c @@ -27,6 +27,7 @@ #include "ircd.h" #include "ircd_alloc.h" #include "ircd_features.h" +#include "ircd_log.h" #include "ircd_reply.h" #include "ircd_string.h" #include "list.h" @@ -35,7 +36,7 @@ #include "s_debug.h" #include "send.h" -#include +/* #include -- Now using assert in ircd_log.h */ /** List of all connection classes. */ static struct ConnectionClass* connClassList; @@ -76,8 +77,8 @@ void free_class(struct ConnectionClass* p) if (p) { assert(0 == p->valid); - if (p->cc_name) - MyFree(p->cc_name); + MyFree(p->cc_name); + MyFree(p->default_umode); MyFree(p); --connClassAllocCount; } @@ -90,8 +91,10 @@ void free_class(struct ConnectionClass* p) */ void init_class(void) { - if (!connClassList) + if (!connClassList) { connClassList = (struct ConnectionClass*) make_class(); + connClassList->next = 0; + } /* We had better not try and free this... */ ConClass(connClassList) = "default"; @@ -100,8 +103,7 @@ void init_class(void) MaxLinks(connClassList) = feature_int(FEAT_MAXIMUM_LINKS); MaxSendq(connClassList) = feature_int(FEAT_DEFAULTMAXSENDQLENGTH); connClassList->valid = 1; - Links(connClassList) = 0; - connClassList->next = 0; + Links(connClassList) = 1; } /** Mark current connection classes as invalid. @@ -134,13 +136,12 @@ void class_delete_marked(void) /* * unlink marked classes, delete unreferenced ones */ - if (cl->valid) + if (cl->valid || Links(cl) > 1) prev = cl; else { prev->next = cl->next; - if (0 == --cl->ref_count) - free_class(cl); + free_class(cl); } } } @@ -195,19 +196,6 @@ get_client_class(struct Client *acptr) return "(null-class)"; } -/** Get connection interval for a connection class. - * @param[in] clptr Connection class to check (or NULL). - * @return If \a clptr != NULL, its connection frequency; else default - * connection frequency. - */ -unsigned int get_con_freq(struct ConnectionClass * clptr) -{ - if (clptr) - return (ConFreq(clptr)); - else - return feature_int(FEAT_CONNECTFREQUENCY); -} - /** Make sure we have a connection class named \a name. * If one does not exist, create it. Then set its ping frequency, * connection frequency, maximum link count, and max SendQ according @@ -226,7 +214,7 @@ void add_class(char *name, unsigned int ping, unsigned int confreq, Debug((DEBUG_DEBUG, "Add Class %s: cf: %u pf: %u ml: %u sq: %d", name, confreq, ping, maxli, sendq)); assert(name != NULL); - p = find_class(name); + p = do_find_class(name, 1); if (!p) p = make_class(); else @@ -242,13 +230,16 @@ void add_class(char *name, unsigned int ping, unsigned int confreq, /** Find a connection class by name. * @param[in] name Name of connection class to search for. + * @param[in] extras If non-zero, include unreferenced classes. * @return Pointer to connection class structure (or NULL if none match). */ -struct ConnectionClass* find_class(const char *name) +struct ConnectionClass* do_find_class(const char *name, int extras) { struct ConnectionClass *cltmp; for (cltmp = connClassList; cltmp; cltmp = cltmp->next) { + if (!cltmp->valid && !extras) + continue; if (!ircd_strcmp(ConClass(cltmp), name)) return cltmp; } @@ -267,9 +258,9 @@ report_classes(struct Client *sptr, const struct StatDesc *sd, struct ConnectionClass *cltmp; for (cltmp = connClassList; cltmp; cltmp = cltmp->next) - send_reply(sptr, RPL_STATSYLINE, 'Y', ConClass(cltmp), PingFreq(cltmp), - ConFreq(cltmp), MaxLinks(cltmp), MaxSendq(cltmp), - Links(cltmp)); + send_reply(sptr, RPL_STATSYLINE, (cltmp->valid ? 'Y' : 'y'), + ConClass(cltmp), PingFreq(cltmp), ConFreq(cltmp), + MaxLinks(cltmp), MaxSendq(cltmp), Links(cltmp) - 1); } /** Return maximum SendQ length for a client.