2 * ircd-ratbox: A slightly useful ircd.
3 * whowas.c: WHOWAS user cache.
5 * Copyright (C) 1990 Jarkko Oikarinen and University of Oulu, Co Center
6 * Copyright (C) 1996-2002 Hybrid Development Team
7 * Copyright (C) 2002-2005 ircd-ratbox development team
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
24 * $Id: whowas.c 21128 2005-11-08 20:41:20Z leeh $
33 #include "irc_string.h"
35 #include "ircd_defs.h"
43 /* internally defined function */
44 static void add_whowas_to_clist(struct Whowas
**, struct Whowas
*);
45 static void del_whowas_from_clist(struct Whowas
**, struct Whowas
*);
46 static void add_whowas_to_list(struct Whowas
**, struct Whowas
*);
47 static void del_whowas_from_list(struct Whowas
**, struct Whowas
*);
49 struct Whowas WHOWAS
[NICKNAMEHISTORYLENGTH
];
50 struct Whowas
*WHOWASHASH
[WW_MAX
];
52 static int whowas_next
= 0;
55 hash_whowas_name(const char *name
)
57 return fnv_hash_upper((const unsigned char *) name
, WW_MAX_BITS
);
61 add_history(struct Client
*client_p
, int online
)
63 struct Whowas
*who
= &WHOWAS
[whowas_next
];
65 s_assert(NULL
!= client_p
);
73 del_whowas_from_clist(&(who
->online
->whowas
), who
);
74 del_whowas_from_list(&WHOWASHASH
[who
->hashv
], who
);
76 who
->hashv
= hash_whowas_name(client_p
->name
);
77 who
->logoff
= CurrentTime
;
79 * NOTE: strcpy ok here, the sizes in the client struct MUST
80 * match the sizes in the whowas struct
82 strlcpy(who
->name
, client_p
->name
, sizeof(who
->name
));
83 strcpy(who
->username
, client_p
->username
);
84 strcpy(who
->hostname
, client_p
->host
);
85 strcpy(who
->realname
, client_p
->info
);
87 who
->servername
= client_p
->servptr
->name
;
91 who
->online
= client_p
;
92 add_whowas_to_clist(&(client_p
->whowas
), who
);
96 add_whowas_to_list(&WHOWASHASH
[who
->hashv
], who
);
98 if(whowas_next
== NICKNAMEHISTORYLENGTH
)
103 off_history(struct Client
*client_p
)
105 struct Whowas
*temp
, *next
;
107 for (temp
= client_p
->whowas
; temp
; temp
= next
)
111 del_whowas_from_clist(&(client_p
->whowas
), temp
);
116 get_history(const char *nick
, time_t timelimit
)
121 timelimit
= CurrentTime
- timelimit
;
122 blah
= hash_whowas_name(nick
);
123 temp
= WHOWASHASH
[blah
];
124 for (; temp
; temp
= temp
->next
)
126 if(irccmp(nick
, temp
->name
))
128 if(temp
->logoff
< timelimit
)
136 count_whowas_memory(size_t * wwu
, size_t * wwum
)
143 /* count the number of used whowas structs in 'u' */
144 /* count up the memory used of whowas structs in um */
146 for (i
= 0, tmp
= &WHOWAS
[0]; i
< NICKNAMEHISTORYLENGTH
; i
++, tmp
++)
150 um
+= sizeof(struct Whowas
);
162 for (i
= 0; i
< NICKNAMEHISTORYLENGTH
; i
++)
164 memset((void *) &WHOWAS
[i
], 0, sizeof(struct Whowas
));
165 WHOWAS
[i
].hashv
= -1;
167 for (i
= 0; i
< WW_MAX
; i
++)
168 WHOWASHASH
[i
] = NULL
;
173 add_whowas_to_clist(struct Whowas
**bucket
, struct Whowas
*whowas
)
175 whowas
->cprev
= NULL
;
176 if((whowas
->cnext
= *bucket
) != NULL
)
177 whowas
->cnext
->cprev
= whowas
;
182 del_whowas_from_clist(struct Whowas
**bucket
, struct Whowas
*whowas
)
185 whowas
->cprev
->cnext
= whowas
->cnext
;
187 *bucket
= whowas
->cnext
;
189 whowas
->cnext
->cprev
= whowas
->cprev
;
193 add_whowas_to_list(struct Whowas
**bucket
, struct Whowas
*whowas
)
196 if((whowas
->next
= *bucket
) != NULL
)
197 whowas
->next
->prev
= whowas
;
202 del_whowas_from_list(struct Whowas
**bucket
, struct Whowas
*whowas
)
205 whowas
->prev
->next
= whowas
->next
;
207 *bucket
= whowas
->next
;
209 whowas
->next
->prev
= whowas
->prev
;