Lines Matching refs:user
20 struct user *pos, *stop_after_tail;
24 /* unsigned int username_hash => user */
25 HASH_TABLE(void *, struct user *) hash;
27 struct user *head, *tail;
33 /* If user's expire time is less than this many seconds away,
42 static void user_move_iters(struct user_directory *dir, struct user *user)
47 if ((*iterp)->pos == user)
48 (*iterp)->pos = user->next;
49 if ((*iterp)->stop_after_tail == user) {
51 user->prev != NULL ? user->prev : user->next;
56 static void user_free(struct user_directory *dir, struct user *user)
58 i_assert(user->host->user_count > 0);
59 user->host->user_count--;
62 dir->user_free_hook(user);
63 user_move_iters(dir, user);
65 hash_table_remove(dir->hash, POINTER_CAST(user->username_hash));
66 DLLIST2_REMOVE(&dir->head, &dir->tail, user);
67 i_free(user);
71 struct user *user,
74 time_t expire_timestamp = user->timestamp + dir->timeout_secs;
81 if (USER_IS_BEING_KILLED(user)) {
82 /* don't free this user until the kill is finished */
88 if (user->weak) {
96 user->username_hash);
128 struct user *user_directory_lookup(struct user_directory *dir,
131 struct user *user;
135 user = hash_table_lookup(dir->hash, POINTER_CAST(username_hash));
136 if (user != NULL && !user_directory_user_has_connections(dir, user, &expire_timestamp)) {
137 user_free(dir, user);
138 user = NULL;
140 return user;
143 struct user *
147 struct user *user;
153 user = i_new(struct user, 1);
154 user->username_hash = username_hash;
155 user->host = host;
156 user->host->user_count++;
157 user->timestamp = timestamp;
158 DLLIST2_APPEND(&dir->head, &dir->tail, user);
165 hash_table_insert(dir->hash, POINTER_CAST(user->username_hash), user);
166 return user;
169 void user_directory_refresh(struct user_directory *dir, struct user *user)
171 user_move_iters(dir, user);
173 user->timestamp = ioloop_time;
174 DLLIST2_REMOVE(&dir->head, &dir->tail, user);
175 DLLIST2_APPEND(&dir->head, &dir->tail, user);
181 struct user *user, *next;
183 for (user = dir->head; user != NULL; user = next) {
184 next = user->next;
186 if (user->host == host)
187 user_free(dir, user);
191 static int user_timestamp_cmp(struct user *const *user1,
192 struct user *const *user2)
203 ARRAY(struct user *) users;
204 struct user *user, *const *userp;
224 user = dir->head;
225 for (i = 0; i < users_count; i++, user = user->next)
226 array_append(&users, &user, 1);
227 i_assert(user == NULL);
240 struct user *user)
242 return (time_t)(user->timestamp + dir->timeout_secs/2) >= ioloop_time;
246 struct user *user)
250 expire_timestamp = user->timestamp +
310 struct user *user_directory_iter_next(struct user_directory_iter *iter)
312 struct user *user;
314 user = iter->pos;
315 if (user == NULL)
318 iter->pos = user->next;
319 if (user == iter->stop_after_tail) {
320 /* this is the last user we want to iterate */
323 return user;