doveadm-who.c revision d4c6c0412c6835f3dffb4e023992a08743e306e5
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/* Copyright (c) 2009-2014 Dovecot authors, see the included COPYING file */
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainenstatic unsigned int who_user_hash(const struct who_user *user)
bd63b5b860658b01b1f46f26d406e1e4a9dc019aTimo Sirainen return str_hash(user->username) + str_hash(user->service);
70ac869db925653b57f721cd045c467612fd5ee9Timo Sirainenstatic int who_user_cmp(const struct who_user *user1,
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainen if (strcmp(user1->username, user2->username) != 0)
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainen if (strcmp(user1->service, user2->service) != 0)
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainenwho_user_has_ip(const struct who_user *user, const struct ip_addr *ip)
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainenstatic int who_parse_line(const char *line, struct who_line *line_r)
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainen const char *const *args = t_strsplit_tab(line);
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainen const char *ident = args[0];
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainen const char *p, *ip_str;
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainen ip_str = t_strdup_until(p, line_r->username++);
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainenstatic bool who_user_has_pid(struct who_user *user, pid_t pid)
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainenstatic void who_aggregate_line(struct who_context *ctx,
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainen user = hash_table_lookup(ctx->users, &lookup_user);
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainen user->username = p_strdup(ctx->pool, line->username);
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainen user->service = p_strdup(ctx->pool, line->service);
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainen if (line->ip.family != 0 && !who_user_has_ip(user, &line->ip))
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainenvoid who_parse_args(struct who_context *ctx, char **args)
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainen if (net_parse_range(args[1], &net_ip, &net_bits) == 0) {
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainenvoid who_lookup(struct who_context *ctx, who_callback_t *callback)
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainen#define ANVIL_HANDSHAKE "VERSION\tanvil\t1\t0\n"
1c633f71ec2060e5bfa500a97f34cd881a958ecdTimo Sirainen#define ANVIL_CMD ANVIL_HANDSHAKE"CONNECT-DUMP\n"
T_BEGIN {
} T_END;
return FALSE;
if (!ret)
return FALSE;
return TRUE;
} T_END;
return FALSE;
return FALSE;
return TRUE;
} T_END;
if (!separate_connections) {