1 /*
   2  * Copyright (c) 2018, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 #include <Rsocket.h>
  27 #include <dlfcn.h>
  28 #include "jni_util.h"
  29 
  30 static const char* nativeRdmaLib = "librdmacm.so";
  31  
  32 jboolean loadRdmaFuncs(JNIEnv* env) {
  33     if (dlopen(nativeRdmaLib, RTLD_GLOBAL | RTLD_LAZY) == NULL) {
  34         JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
  35               dlerror());
  36         return JNI_FALSE;
  37     }
  38 
  39     if ((rs_socket = (rs_rsocket_func*)
  40             dlsym(RTLD_DEFAULT, "rsocket")) == NULL) {
  41         JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
  42               dlerror());
  43         return JNI_FALSE;
  44     }
  45 
  46     if ((rs_fcntl = (rs_rfcntl_func*)
  47             dlsym(RTLD_DEFAULT, "rfcntl")) == NULL) {
  48         JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
  49               dlerror());
  50         return JNI_FALSE;
  51     }
  52 
  53     if ((rs_listen = (rs_rlisten_func*)
  54             dlsym(RTLD_DEFAULT, "rlisten")) == NULL) {
  55         JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
  56               dlerror());
  57         return JNI_FALSE;
  58     }
  59 
  60     if ((rs_bind = (rs_rbind_func*)
  61             dlsym(RTLD_DEFAULT, "rbind")) == NULL) {
  62         JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
  63               dlerror());
  64         return JNI_FALSE;
  65     }
  66 
  67     if ((rs_connect = (rs_rconnect_func*)
  68             dlsym(RTLD_DEFAULT, "rconnect")) == NULL) {
  69         JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
  70               dlerror());
  71         return JNI_FALSE;
  72     }
  73 
  74     if ((rs_getsockname = (rs_rgetsockname_func*)
  75             dlsym(RTLD_DEFAULT, "rgetsockname")) == NULL) {
  76         JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
  77               dlerror());
  78         return JNI_FALSE;
  79     }
  80 
  81     if ((rs_getsockopt = (rs_rgetsockopt_func*)
  82             dlsym(RTLD_DEFAULT, "rgetsockopt")) == NULL) {
  83         JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
  84               dlerror());
  85         return JNI_FALSE;
  86     }
  87 
  88     if ((rs_setsockopt = (rs_rsetsockopt_func*)
  89             dlsym(RTLD_DEFAULT, "rsetsockopt")) == NULL) {
  90         JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
  91               dlerror());
  92         return JNI_FALSE;
  93     }
  94 
  95     if ((rs_shutdown = (rs_rshutdown_func*)
  96             dlsym(RTLD_DEFAULT, "rshutdown")) == NULL) {
  97         JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
  98               dlerror());
  99         return JNI_FALSE;
 100     }
 101 
 102     if ((rs_poll = (rs_rpoll_func*)
 103             dlsym(RTLD_DEFAULT, "rpoll")) == NULL) {
 104         JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
 105               dlerror());
 106         return JNI_FALSE;
 107     }
 108 
 109     if ((rs_send = (rs_rsend_func*)
 110             dlsym(RTLD_DEFAULT, "rsend")) == NULL) {
 111         JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
 112               dlerror());
 113         return JNI_FALSE;
 114     }
 115 
 116     if ((rs_accept = (rs_raccept_func*)
 117             dlsym(RTLD_DEFAULT, "raccept")) == NULL) {
 118         JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
 119               dlerror());
 120         return JNI_FALSE;
 121     }
 122 
 123     if ((rs_close = (rs_rclose_func*)
 124             dlsym(RTLD_DEFAULT, "rclose")) == NULL) {
 125         JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
 126               dlerror());
 127         return JNI_FALSE;
 128     }
 129 
 130     if ((rs_read = (rs_rread_func*)
 131             dlsym(RTLD_DEFAULT, "rread")) == NULL) {
 132         JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
 133               dlerror());
 134         return JNI_FALSE;
 135     }
 136 
 137     if ((rs_readv = (rs_rreadv_func*)
 138             dlsym(RTLD_DEFAULT, "rreadv")) == NULL) {
 139         JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
 140               dlerror());
 141         return JNI_FALSE;
 142     }
 143 
 144     if ((rs_write = (rs_rwrite_func*)
 145             dlsym(RTLD_DEFAULT, "rwrite")) == NULL) {
 146         JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
 147               dlerror());
 148         return JNI_FALSE;
 149     }
 150 
 151     if ((rs_writev = (rs_rwritev_func*)
 152             dlsym(RTLD_DEFAULT, "rwritev")) == NULL) {
 153         JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
 154               dlerror());
 155         return JNI_FALSE;
 156     }
 157 
 158     if ((rs_recv = (rs_rrecv_func*)
 159             dlsym(RTLD_DEFAULT, "rrecv")) == NULL) {
 160         JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
 161               dlerror());
 162         return JNI_FALSE;
 163     }
 164 
 165     if ((rs_recvfrom = (rs_rrecvfrom_func*)
 166             dlsym(RTLD_DEFAULT, "rrecvfrom")) == NULL) {
 167         JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
 168               dlerror());
 169         return JNI_FALSE;
 170     }
 171 
 172     if ((rs_sendto = (rs_rsendto_func*)
 173             dlsym(RTLD_DEFAULT, "rsendto")) == NULL) {
 174         JNU_ThrowByName(env, "java/lang/UnsupportedOperationException",
 175               dlerror());
 176         return JNI_FALSE;
 177     }
 178 
 179     return JNI_TRUE;
 180 }