diff options
Diffstat (limited to 'main/srv.c')
-rw-r--r-- | main/srv.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/main/srv.c b/main/srv.c index 3be8bbd00..c65065033 100644 --- a/main/srv.c +++ b/main/srv.c @@ -65,6 +65,7 @@ struct srv_entry { struct srv_context { unsigned int have_weights:1; struct srv_entry *prev; + unsigned int num_records; AST_LIST_HEAD_NOLOCK(srv_entries, srv_entry) entries; }; @@ -221,6 +222,9 @@ int ast_srv_lookup(struct srv_context **context, const char *service, const char (*context)->prev = AST_LIST_FIRST(&(*context)->entries); *host = (*context)->prev->host; *port = (*context)->prev->port; + AST_LIST_TRAVERSE(&(*context)->entries, cur, list) { + ++((*context)->num_records); + } return 0; } @@ -286,3 +290,34 @@ int ast_get_srv(struct ast_channel *chan, char *host, int hostlen, int *port, co return ret; } + +unsigned int ast_srv_get_record_count(struct srv_context *context) +{ + return context->num_records; +} + +int ast_srv_get_nth_record(struct srv_context *context, int record_num, const char **host, + unsigned short *port, unsigned short *priority, unsigned short *weight) +{ + int i = 1; + int res = -1; + struct srv_entry *entry; + + if (record_num < 1 || record_num > context->num_records) { + return res; + } + + AST_LIST_TRAVERSE(&context->entries, entry, list) { + if (i == record_num) { + *host = entry->host; + *port = entry->port; + *priority = entry->priority; + *weight = entry->weight; + res = 0; + break; + } + ++i; + } + + return res; +} |