--- /dev/null
+/*
+ * 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 int private_data;
+
+static void sock_notify(void *pvt_data,
+ int datafd,
+ int8_t channel,
+ uint8_t tx_rx,
+ int error,
+ int errorno)
+{
+ return;
+}
+
+static void test(void)
+{
+ knet_handle_t knet_h;
+ int logfds[2];
+ int datafd = 0, old_datafd;
+ int8_t channel = 0;
+
+ printf("Test knet_handle_get_datafd incorrect knet_h\n");
+
+ if ((!knet_handle_get_datafd(NULL, channel, &datafd)) || (errno != EINVAL)) {
+ printf("knet_handle_get_datafd 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_datafd with invalid channel (< 0)\n");
+
+ channel = 0;
+
+ if ((!knet_handle_get_datafd(knet_h, channel, &datafd)) || (errno != EINVAL)) {
+ printf("knet_handle_get_datafd accepted invalid channel 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_datafd with invalid channel (KNET_DATAFD_MAX)\n");
+
+ channel = KNET_DATAFD_MAX;
+
+ if ((!knet_handle_get_datafd(knet_h, channel, &datafd)) || (errno != EINVAL)) {
+ printf("knet_handle_get_datafd accepted invalid channel 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_datafd with unconfigured datafd/channel\n");
+
+ channel = 10;
+
+ if ((!knet_handle_get_datafd(knet_h, channel, &datafd)) || (errno != EINVAL)) {
+ printf("knet_handle_get_datafd accepted unconfigured channel 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_datafd with valid datafd\n");
+
+ if (knet_handle_enable_sock_notify(knet_h, &private_data, sock_notify) < 0) {
+ printf("knet_handle_enable_sock_notify failed: %s\n", strerror(errno));
+ knet_handle_free(knet_h);
+ flush_logs(logfds[0], stdout);
+ close_logpipes(logfds);
+ exit(FAIL);
+ }
+
+ old_datafd = 0;
+ channel = -1;
+
+ if (knet_handle_add_datafd(knet_h, &old_datafd, &channel) < 0) {
+ printf("knet_handle_add_datafd failed: %s\n", strerror(errno));
+ knet_handle_free(knet_h);
+ flush_logs(logfds[0], stdout);
+ close_logpipes(logfds);
+ exit(FAIL);
+ }
+
+ if (knet_handle_get_datafd(knet_h, channel, &datafd) < 0) {
+ printf("knet_handle_get_datafd failed: %s\n", strerror(errno));
+ knet_handle_free(knet_h);
+ flush_logs(logfds[0], stdout);
+ close_logpipes(logfds);
+ exit(FAIL);
+ }
+
+ if (old_datafd != datafd) {
+ printf("knet_handle_get_datafd got incorrect channel\n");
+ knet_handle_free(knet_h);
+ flush_logs(logfds[0], stdout);
+ close_logpipes(logfds);
+ exit(FAIL);
+ }
+
+ flush_logs(logfds[0], stdout);
+
+ knet_handle_free(knet_h);
+ flush_logs(logfds[0], stdout);
+ close_logpipes(logfds);
+}
+
+int main(int argc, char *argv[])
+{
+ need_root();
+
+ test();
+
+ return PASS;
+}