1 /*
   2  * Copyright (c) 2008, 2014, Oracle and/or its affiliates. All rights reserved.
   3  * Copyright 2013 SAP AG. All rights reserved.
   4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   5  *
   6  * This code is free software; you can redistribute it and/or modify it
   7  * under the terms of the GNU General Public License version 2 only, as
   8  * published by the Free Software Foundation.  Oracle designates this
   9  * particular file as subject to the "Classpath" exception as provided
  10  * by Oracle in the LICENSE file that accompanied this code.
  11  *
  12  * This code is distributed in the hope that it will be useful, but WITHOUT
  13  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  14  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  15  * version 2 for more details (a copy is included in the LICENSE file that
  16  * accompanied this code).
  17  *
  18  * You should have received a copy of the GNU General Public License version
  19  * 2 along with this work; if not, write to the Free Software Foundation,
  20  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  21  *
  22  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  23  * or visit www.oracle.com if you need additional information or have any
  24  * questions.
  25  */
  26 
  27 /*
  28  * Portions Copyright (c) 2014 IBM Corporation
  29  */
  30 
  31 package sun.nio.fs;
  32 
  33 import java.security.AccessController;
  34 import java.security.PrivilegedAction;
  35 import java.util.List;
  36 
  37 /**
  38  * AIX specific system calls.
  39  */
  40 
  41 class AixNativeDispatcher extends UnixNativeDispatcher {
  42     private AixNativeDispatcher() { }
  43 
  44     // initialize
  45     private static native void init();
  46 
  47     /**
  48      * Special implementation of 'getextmntent' (see SolarisNativeDispatcher)
  49      * that returns all entries at once.
  50      */
  51     static native UnixMountEntry[] getmntctl() throws UnixException;
  52 
  53     static {
  54         AccessController.doPrivileged(new PrivilegedAction<Void>() {
  55             public Void run() {
  56                 System.loadLibrary("nio");
  57                 return null;
  58         }});
  59         init();
  60     }
  61 
  62 
  63     static void getAixMountEntries(List<UnixMountEntry> entries) {
  64         int size = queryMountEntrySize();
  65         if (size != 0) {
  66             NativeBuffer buffer = NativeBuffers.allocNativeBuffer(size);
  67             getAixMountEntries(entries, buffer.address(), size);
  68             buffer.release();
  69         }
  70     }
  71 
  72     private static native int queryMountEntrySize();
  73 
  74     private static native void getAixMountEntries(List<UnixMountEntry> entries, long bufferAddress, int size);
  75 
  76     /**
  77      * ssize_t fgetxattr(int filedes, const char *name, void *value, size_t size);
  78      */
  79     static int fgetxattr(int filedes, byte[] name, long valueAddress,
  80                          int valueLen) throws UnixException
  81     {
  82         NativeBuffer buffer = NativeBuffers.asNativeBuffer(name);
  83         try {
  84             return fgetxattr0(filedes, buffer.address(), valueAddress, valueLen);
  85         } finally {
  86             buffer.release();
  87         }
  88     }
  89 
  90     private static native int fgetxattr0(int filedes, long nameAddress,
  91         long valueAdddress, int valueLen) throws UnixException;
  92 
  93     /**
  94      *  fsetxattr(int filedes, const char *name, const void *value, size_t size, int flags);
  95      */
  96     static void fsetxattr(int filedes, byte[] name, long valueAddress,
  97         int valueLen) throws UnixException
  98     {
  99         NativeBuffer buffer = NativeBuffers.asNativeBuffer(name);
 100         try {
 101             fsetxattr0(filedes, buffer.address(), valueAddress, valueLen);
 102         } finally {
 103             buffer.release();
 104         }
 105     }
 106 
 107     private static native void fsetxattr0(int filedes, long nameAddress,
 108         long valueAdddress, int valueLen) throws UnixException;
 109 
 110 
 111     /**
 112      * fremovexattr(int filedes, const char *name);
 113      */
 114     static void fremovexattr(int filedes, byte[] name) throws UnixException {
 115         NativeBuffer buffer = NativeBuffers.asNativeBuffer(name);
 116         try {
 117             fremovexattr0(filedes, buffer.address());
 118         } finally {
 119             buffer.release();
 120         }
 121     }
 122 
 123     private static native void fremovexattr0(int filedes, long nameAddress)
 124         throws UnixException;
 125 
 126     /**
 127      * size_t flistxattr(int filedes, const char *list, size_t size)
 128      */
 129     static native int flistxattr(int filedes, long listAddress, int size)
 130         throws UnixException;
 131 
 132 }