Skip to content

Commit

Permalink
[transport] add knet_handle_get_transport_name_by_id api call
Browse files Browse the repository at this point in the history
also fix a counter in knet_handle_get_transport_name_by_id

Signed-off-by: Fabio M. Di Nitto <fdinitto@redhat.com>
  • Loading branch information
fabbione committed Jan 18, 2017
1 parent 2cc083d commit 1097ccf
Show file tree
Hide file tree
Showing 4 changed files with 146 additions and 2 deletions.
15 changes: 15 additions & 0 deletions libknet/libknet.h
Expand Up @@ -939,6 +939,21 @@ struct transport_info {
int knet_handle_get_transport_list(knet_handle_t knet_h,
struct transport_info *transport_list, size_t *transport_list_entries);

/*
* knet_handle_get_transport_name_by_id
*
* knet_h - pointer to knet_handle_t
*
* transport - one of the above KNET_TRANSPORT_xxx constants
*
* knet_handle_get_transport_name_by_id returns:
*
* pointer to the name on success or
* NULL on error and errno is set.
*/

const char *knet_handle_get_transport_name_by_id(knet_handle_t knet_h, uint8_t transport);

/*
* knet_link_set_config
*
Expand Down
4 changes: 4 additions & 0 deletions libknet/tests/api-check.mk
Expand Up @@ -18,6 +18,7 @@ api_checks = \
api_knet_handle_get_channel_test \
api_knet_handle_get_datafd_test \
api_knet_handle_get_transport_list_test \
api_knet_handle_get_transport_name_by_id_test \
api_knet_recv_test \
api_knet_send_test \
api_knet_send_sync_test \
Expand Down Expand Up @@ -90,6 +91,9 @@ api_knet_handle_get_datafd_test_SOURCES = api_knet_handle_get_datafd.c \
api_knet_handle_get_transport_list_test_SOURCES = api_knet_handle_get_transport_list.c \
test-common.c

api_knet_handle_get_transport_name_by_id_test_SOURCES = api_knet_handle_get_transport_name_by_id.c \
test-common.c

api_knet_recv_test_SOURCES = api_knet_recv.c \
test-common.c

Expand Down
91 changes: 91 additions & 0 deletions libknet/tests/api_knet_handle_get_transport_name_by_id.c
@@ -0,0 +1,91 @@
/*
* Copyright (C) 2016 Red Hat, Inc. All rights reserved.
*
* Authors: Fabio M. Di Nitto <fabbione@kronosnet.org>
*
* This software licensed under GPL-2.0+, LGPL-2.0+
*/

#include "config.h"

#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#include "libknet.h"

#include "internals.h"
#include "test-common.h"

static void test(void)
{
knet_handle_t knet_h;
int logfds[2];
const char *name = NULL;

printf("Test knet_handle_get_transport_name_by_id with incorrect knet_h\n");

if ((knet_handle_get_transport_name_by_id(NULL, KNET_TRANSPORT_UDP) != NULL) || (errno != EINVAL)) {
printf("knet_handle_get_transport_name_by_id accepted invalid knet_h or returned incorrect error: %s\n", strerror(errno));
exit(FAIL);
}

setup_logpipes(logfds);

knet_h = knet_handle_new(1, logfds[1], KNET_LOG_DEBUG);

if (!knet_h) {
printf("knet_handle_new failed: %s\n", strerror(errno));
flush_logs(logfds[0], stdout);
close_logpipes(logfds);
exit(FAIL);
}

printf("Test knet_handle_get_transport_name_by_id with incorrect transport\n");

if ((knet_handle_get_transport_name_by_id(knet_h, KNET_MAX_TRANSPORTS) != NULL) || (errno != EINVAL)) {
printf("knet_handle_get_transport_name_by_id accepted invalid transport or returned incorrect error: %s\n", strerror(errno));
knet_handle_free(knet_h);
flush_logs(logfds[0], stdout);
close_logpipes(logfds);
exit(FAIL);
}

flush_logs(logfds[0], stdout);

printf("Test knet_handle_get_transport_name_by_id with correct values\n");

name = knet_handle_get_transport_name_by_id(knet_h, KNET_TRANSPORT_UDP);
if (!name) {
printf("knet_handle_get_transport_name_by_id failed: %s\n", strerror(errno));
knet_handle_free(knet_h);
flush_logs(logfds[0], stdout);
close_logpipes(logfds);
exit(FAIL);
}

flush_logs(logfds[0], stdout);

if (strcmp(name, "UDP")) {
printf("knet_handle_get_transport_name_by_id failed to get UDP transport name\n");
knet_handle_free(knet_h);
flush_logs(logfds[0], stdout);
close_logpipes(logfds);
exit(FAIL);
}

knet_handle_free(knet_h);
flush_logs(logfds[0], stdout);
close_logpipes(logfds);
}

int main(int argc, char *argv[])
{
need_root();

test();

return PASS;
}
38 changes: 36 additions & 2 deletions libknet/transport_common.c
Expand Up @@ -330,8 +330,8 @@ int knet_handle_get_transport_list(knet_handle_t knet_h,

for (i=0; i<KNET_MAX_TRANSPORTS; i++) {
if (knet_h->transport_ops[i]) {
transport_list[i].name = knet_h->transport_ops[i]->transport_name;
transport_list[i].id = knet_h->transport_ops[i]->transport_id;
transport_list[count].name = knet_h->transport_ops[i]->transport_name;
transport_list[count].id = knet_h->transport_ops[i]->transport_id;
count++;
}
}
Expand All @@ -342,3 +342,37 @@ int knet_handle_get_transport_list(knet_handle_t knet_h,

return err;
}

const char *knet_handle_get_transport_name_by_id(knet_handle_t knet_h, uint8_t transport)
{
int savederrno = 0;
const char *name = NULL;

if (!knet_h) {
errno = EINVAL;
return name;
}

if (transport >= KNET_MAX_TRANSPORTS) {
errno = EINVAL;
return name;
}

savederrno = pthread_rwlock_rdlock(&knet_h->global_rwlock);
if (savederrno) {
log_err(knet_h, KNET_SUB_HANDLE, "Unable to get read lock: %s",
strerror(savederrno));
errno = savederrno;
return name;
}

if (knet_h->transport_ops[transport]) {
name = knet_h->transport_ops[transport]->transport_name;
} else {
savederrno = ENOENT;
}

pthread_rwlock_unlock(&knet_h->global_rwlock);
errno = savederrno;
return name;
}

0 comments on commit 1097ccf

Please sign in to comment.