diff options
| author | Alexander Barton <alex@barton.de> | 2013-02-05 13:04:11 +0100 |
|---|---|---|
| committer | Alexander Barton <alex@barton.de> | 2013-02-05 13:06:08 +0100 |
| commit | 0ad0fe207ab1705a2b042e7f47f1e0d8ce46e2a9 (patch) | |
| tree | 3e2dffdb2248069f4ffbc331f3d324d5701f8526 /src | |
| parent | 999c11ad49ea1e9c2615e4668f23aae483e549dc (diff) | |
| download | ngircd-0ad0fe207ab1705a2b042e7f47f1e0d8ce46e2a9.tar.gz ngircd-0ad0fe207ab1705a2b042e7f47f1e0d8ce46e2a9.zip | |
Implement new function Client_SearchServer()
This function returns the server structure of a client or a given "mask"; it is useful for implemention handlers for commands like "COMMAND *.net", which should work on a server matching "*.net". Please note that the local server is always returned when it matches the mask, but besides that, the order is completely arbitrary.
Diffstat (limited to 'src')
| -rw-r--r-- | src/ngircd/client.c | 44 | ||||
| -rw-r--r-- | src/ngircd/client.h | 1 |
2 files changed, 40 insertions, 5 deletions
diff --git a/src/ngircd/client.c b/src/ngircd/client.c index d10775a8..37b168ff 100644 --- a/src/ngircd/client.c +++ b/src/ngircd/client.c @@ -41,6 +41,7 @@ #include "hash.h" #include "irc-write.h" #include "log.h" +#include "match.h" #include "messages.h" #include <exp.h> @@ -556,13 +557,14 @@ Client_ModeDel( CLIENT *Client, char Mode ) } /* Client_ModeDel */ +/** + * Search CLIENT structure of a given nick name. + * + * @return Pointer to CLIENT structure or NULL if not found. + */ GLOBAL CLIENT * Client_Search( const char *Nick ) { - /* return Client-Structure that has the corresponding Nick. - * If none is found, return NULL. - */ - char search_id[CLIENT_ID_LEN], *ptr; CLIENT *c = NULL; UINT32 search_hash; @@ -583,7 +585,39 @@ Client_Search( const char *Nick ) c = (CLIENT *)c->next; } return NULL; -} /* Client_Search */ +} + + +/** + * Serach first CLIENT structure matching a given mask of a server. + * + * The order of servers is arbitrary, but this function makes sure that the + * local server is always returned if the mask matches it. + * + * @return Pointer to CLIENT structure or NULL if no server could be found. + */ +GLOBAL CLIENT * +Client_SearchServer(const char *Mask) +{ + CLIENT *c; + + assert(Mask != NULL); + + /* First check if mask matches the local server */ + if (MatchCaseInsensitive(Mask, Client_ID(Client_ThisServer()))) + return Client_ThisServer(); + + c = My_Clients; + while (c) { + if (Client_Type(c) == CLIENT_SERVER) { + /* This is a server: check if Mask matches */ + if (MatchCaseInsensitive(Mask, c->id)) + return c; + } + c = (CLIENT *)c->next; + } + return NULL; +} /** diff --git a/src/ngircd/client.h b/src/ngircd/client.h index ebbd06cb..c248d1ba 100644 --- a/src/ngircd/client.h +++ b/src/ngircd/client.h @@ -94,6 +94,7 @@ GLOBAL CLIENT *Client_ThisServer PARAMS(( void )); GLOBAL CLIENT *Client_GetFromToken PARAMS(( CLIENT *Client, int Token )); GLOBAL CLIENT *Client_Search PARAMS(( const char *ID )); +GLOBAL CLIENT *Client_SearchServer PARAMS(( const char *ID )); GLOBAL CLIENT *Client_First PARAMS(( void )); GLOBAL CLIENT *Client_Next PARAMS(( CLIENT *c )); |