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 /*
  27  * Test if rsocket is available
  28  */
  29 #include <stdlib.h>
  30 #ifdef __linux__
  31 #include <dlfcn.h>
  32 #include <sys/socket.h>
  33 #include <stdio.h>
  34 #include <string.h>
  35 #endif
  36 #include "jni.h"
  37 
  38 jfieldID fid;
  39 
  40 /*
  41  * Class:     RsocketTest
  42  * Method:    isRsocketAvailable0
  43  * Signature: ()Z
  44  */
  45 JNIEXPORT jboolean
  46 Java_RsocketTest_isRsocketAvailable0(JNIEnv *env, jclass cls) {
  47     jboolean result = JNI_FALSE;
  48 #ifdef __linux__
  49     void *handle;
  50     int (*rs)(int, int, int);
  51     char str[74];
  52     strcpy(str, "librdmacm.so.1: cannot open shared object file: No such file or directory");
  53     fid = (*env)->GetStaticFieldID(env, cls , "libInstalled", "Z");
  54 
  55     handle = dlopen("librdmacm.so.1", RTLD_NOW);
  56     if (!handle) {
  57         int ret = strncmp(str, dlerror(), 74);
  58         if (ret == 0) {
  59             (*env)->SetStaticBooleanField(env, cls, fid, JNI_FALSE);
  60         }
  61         return JNI_FALSE;
  62     } else {
  63         (*env)->SetStaticBooleanField(env, cls, fid, JNI_TRUE);
  64     }
  65  
  66     rs = dlsym(handle, "rsocket");
  67     if (!rs)
  68         return JNI_FALSE;
  69   
  70     if ((*rs)(AF_INET, SOCK_STREAM, 0) > 0)
  71         result = JNI_TRUE;
  72 
  73     dlclose(handle);
  74 #endif
  75     return result;
  76 }