Home | History | Annotate | Download | only in native
      1 /*
      2  * Copyright (c) 2005, 2006, 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 "jni.h"
     27 #include "jni_util.h"
     28 #include "jvm.h"
     29 
     30 #include <stdlib.h>
     31 #include <unistd.h>
     32 #include <termios.h>
     33 
     34 #include <nativehelper/JNIHelp.h>
     35 
     36 #define NATIVE_METHOD(className, functionName, signature) \
     37 { #functionName, signature, (void*)(Java_java_io_ ## className ## _ ## functionName) }
     38 
     39 JNIEXPORT jboolean JNICALL
     40 Java_java_io_Console_istty(JNIEnv *env, jclass cls)
     41 {
     42     return isatty(fileno(stdin)) && isatty(fileno(stdout));
     43 }
     44 
     45 JNIEXPORT jstring JNICALL
     46 Java_java_io_Console_encoding(JNIEnv *env, jclass cls)
     47 {
     48     return NULL;
     49 }
     50 
     51 JNIEXPORT jboolean JNICALL
     52 Java_java_io_Console_echo(JNIEnv *env,
     53                           jclass cls,
     54                           jboolean on)
     55 {
     56     struct termios tio;
     57     jboolean old;
     58     int tty = fileno(stdin);
     59     if (tcgetattr(tty, &tio) == -1) {
     60         JNU_ThrowIOExceptionWithLastError(env, "tcgetattr failed");
     61         return !on;
     62     }
     63     old = (tio.c_lflag & ECHO);
     64     if (on) {
     65         tio.c_lflag |= ECHO;
     66     } else {
     67         tio.c_lflag &= ~ECHO;
     68     }
     69     if (tcsetattr(tty, TCSANOW, &tio) == -1) {
     70         JNU_ThrowIOExceptionWithLastError(env, "tcsetattr failed");
     71     }
     72     return old;
     73 }
     74 
     75 static JNINativeMethod gMethods[] = {
     76     NATIVE_METHOD(Console, istty, "()Z"),
     77     NATIVE_METHOD(Console, encoding, "()Ljava/lang/String;"),
     78     NATIVE_METHOD(Console, echo, "(Z)Z"),
     79 };
     80 
     81 void register_java_io_Console(JNIEnv* env) {
     82     jniRegisterNativeMethods(env, "java/io/Console", gMethods, NELEM(gMethods));
     83 }
     84